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:
authorXhmikosR <xhmikosr@users.sourceforge.net>2012-06-13 13:05:30 +0400
committerXhmikosR <xhmikosr@users.sourceforge.net>2012-06-13 13:05:30 +0400
commit0b9ec9a361f62ce15fc58763ca8b533afe405973 (patch)
tree02fb318875748db7e28f0b303d9907e58d69ca8c /src/filters
parentd3b052fb035d8b242e4b328722f4ed7ac84ee20c (diff)
apply the new astyle command; use 4 spaces for indentation and k&r style
Note: if you have any local patches just run astyle.bat git-svn-id: https://mpc-hc.svn.sourceforge.net/svnroot/mpc-hc/trunk@5110 10f7b99b-c216-0410-bff0-8a66a9350fd8
Diffstat (limited to 'src/filters')
-rw-r--r--src/filters/FilterApp.cpp16
-rw-r--r--src/filters/FilterApp.h8
-rw-r--r--src/filters/InternalPropertyPage.cpp360
-rw-r--r--src/filters/InternalPropertyPage.h154
-rw-r--r--src/filters/PinInfoWnd.cpp328
-rw-r--r--src/filters/PinInfoWnd.h50
-rw-r--r--src/filters/muxer/BaseMuxer/BaseMuxer.cpp556
-rw-r--r--src/filters/muxer/BaseMuxer/BaseMuxer.h136
-rw-r--r--src/filters/muxer/BaseMuxer/BaseMuxerInputPin.cpp328
-rw-r--r--src/filters/muxer/BaseMuxer/BaseMuxerInputPin.h120
-rw-r--r--src/filters/muxer/BaseMuxer/BaseMuxerOutputPin.cpp774
-rw-r--r--src/filters/muxer/BaseMuxer/BaseMuxerOutputPin.h44
-rw-r--r--src/filters/muxer/BaseMuxer/BaseMuxerRelatedPin.cpp6
-rw-r--r--src/filters/muxer/BaseMuxer/BaseMuxerRelatedPin.h16
-rw-r--r--src/filters/muxer/BaseMuxer/BitStream.cpp152
-rw-r--r--src/filters/muxer/BaseMuxer/BitStream.h42
-rw-r--r--src/filters/muxer/BaseMuxer/stdafx.h8
-rw-r--r--src/filters/muxer/DSMMuxer/DSMMuxer.cpp652
-rw-r--r--src/filters/muxer/DSMMuxer/DSMMuxer.h54
-rw-r--r--src/filters/muxer/MatroskaMuxer/MatroskaFile.cpp1176
-rw-r--r--src/filters/muxer/MatroskaMuxer/MatroskaFile.h782
-rw-r--r--src/filters/muxer/MatroskaMuxer/MatroskaMuxer.cpp2164
-rw-r--r--src/filters/muxer/MatroskaMuxer/MatroskaMuxer.h162
-rw-r--r--src/filters/muxer/WavDest/WavDest.cpp320
-rw-r--r--src/filters/muxer/WavDest/WavDest.h40
-rw-r--r--src/filters/parser/AviSplitter/AviFile.cpp1126
-rw-r--r--src/filters/parser/AviSplitter/AviFile.h100
-rw-r--r--src/filters/parser/AviSplitter/AviReportWnd.cpp568
-rw-r--r--src/filters/parser/AviSplitter/AviReportWnd.h46
-rw-r--r--src/filters/parser/AviSplitter/AviSplitter.cpp1418
-rw-r--r--src/filters/parser/AviSplitter/AviSplitter.h66
-rw-r--r--src/filters/parser/BaseSplitter/AsyncReader.cpp290
-rw-r--r--src/filters/parser/BaseSplitter/AsyncReader.h128
-rw-r--r--src/filters/parser/BaseSplitter/BaseSplitter.cpp1937
-rw-r--r--src/filters/parser/BaseSplitter/BaseSplitter.h656
-rw-r--r--src/filters/parser/BaseSplitter/BaseSplitterFile.cpp304
-rw-r--r--src/filters/parser/BaseSplitter/BaseSplitterFile.h52
-rw-r--r--src/filters/parser/BaseSplitter/BaseSplitterFileEx.cpp3933
-rw-r--r--src/filters/parser/BaseSplitter/BaseSplitterFileEx.h802
-rw-r--r--src/filters/parser/BaseSplitter/MultiFiles.cpp238
-rw-r--r--src/filters/parser/BaseSplitter/MultiFiles.h108
-rw-r--r--src/filters/parser/DSMSplitter/DSMSplitter.cpp332
-rw-r--r--src/filters/parser/DSMSplitter/DSMSplitter.h30
-rw-r--r--src/filters/parser/DSMSplitter/DSMSplitterFile.cpp658
-rw-r--r--src/filters/parser/DSMSplitter/DSMSplitterFile.h54
-rw-r--r--src/filters/parser/FLVSplitter/FLVSplitter.cpp1472
-rw-r--r--src/filters/parser/FLVSplitter/FLVSplitter.h82
-rw-r--r--src/filters/parser/MP4Splitter/Ap4AsyncReaderStream.cpp74
-rw-r--r--src/filters/parser/MP4Splitter/Ap4AsyncReaderStream.h30
-rw-r--r--src/filters/parser/MP4Splitter/MP4Splitter.cpp3686
-rw-r--r--src/filters/parser/MP4Splitter/MP4Splitter.h76
-rw-r--r--src/filters/parser/MP4Splitter/MP4SplitterFile.cpp32
-rw-r--r--src/filters/parser/MP4Splitter/MP4SplitterFile.h10
-rw-r--r--src/filters/parser/MatroskaSplitter/MatroskaFile.cpp2026
-rw-r--r--src/filters/parser/MatroskaSplitter/MatroskaFile.h1146
-rw-r--r--src/filters/parser/MatroskaSplitter/MatroskaSplitter.cpp2856
-rw-r--r--src/filters/parser/MatroskaSplitter/MatroskaSplitter.h118
-rw-r--r--src/filters/parser/MpaSplitter/MpaSplitter.cpp236
-rw-r--r--src/filters/parser/MpaSplitter/MpaSplitter.h30
-rw-r--r--src/filters/parser/MpaSplitter/MpaSplitterFile.cpp745
-rw-r--r--src/filters/parser/MpaSplitter/MpaSplitterFile.h54
-rw-r--r--src/filters/parser/MpegSplitter/IMpegSplitterFilter.h36
-rw-r--r--src/filters/parser/MpegSplitter/MpegSplitter.cpp3578
-rw-r--r--src/filters/parser/MpegSplitter/MpegSplitter.h150
-rw-r--r--src/filters/parser/MpegSplitter/MpegSplitterFile.cpp1997
-rw-r--r--src/filters/parser/MpegSplitter/MpegSplitterFile.h276
-rw-r--r--src/filters/parser/MpegSplitter/MpegSplitterSettingsWnd.cpp182
-rw-r--r--src/filters/parser/MpegSplitter/MpegSplitterSettingsWnd.h84
-rw-r--r--src/filters/parser/OggSplitter/OggFile.cpp106
-rw-r--r--src/filters/parser/OggSplitter/OggFile.h86
-rw-r--r--src/filters/parser/OggSplitter/OggSplitter.cpp2012
-rw-r--r--src/filters/parser/OggSplitter/OggSplitter.h186
-rw-r--r--src/filters/parser/RealMediaSplitter/RealMediaSplitter.cpp4400
-rw-r--r--src/filters/parser/RealMediaSplitter/RealMediaSplitter.h470
-rw-r--r--src/filters/parser/StreamDriveThru/StreamDriveThru.cpp558
-rw-r--r--src/filters/parser/StreamDriveThru/StreamDriveThru.h132
-rw-r--r--src/filters/reader/CDDAReader/CDDAReader.cpp544
-rw-r--r--src/filters/reader/CDDAReader/CDDAReader.h130
-rw-r--r--src/filters/reader/CDXAReader/CDXAReader.cpp746
-rw-r--r--src/filters/reader/CDXAReader/CDXAReader.h76
-rw-r--r--src/filters/reader/UDPReader/UDPReader.cpp552
-rw-r--r--src/filters/reader/UDPReader/UDPReader.h92
-rw-r--r--src/filters/reader/VTSReader/VTSReader.cpp200
-rw-r--r--src/filters/reader/VTSReader/VTSReader.h80
-rw-r--r--src/filters/renderer/MpcAudioRenderer/IMpcAudioRendererFilter.h14
-rw-r--r--src/filters/renderer/MpcAudioRenderer/MpcAudioRenderer.cpp2098
-rw-r--r--src/filters/renderer/MpcAudioRenderer/MpcAudioRenderer.h196
-rw-r--r--src/filters/renderer/MpcAudioRenderer/MpcAudioRendererSettingsWnd.cpp155
-rw-r--r--src/filters/renderer/MpcAudioRenderer/MpcAudioRendererSettingsWnd.h54
-rw-r--r--src/filters/renderer/SyncClock/Interfaces.h8
-rw-r--r--src/filters/renderer/SyncClock/SyncClock.cpp100
-rw-r--r--src/filters/renderer/SyncClock/SyncClock.h60
-rw-r--r--src/filters/renderer/SyncClock/stdafx.h6
-rw-r--r--src/filters/renderer/VideoRenderers/AllocatorCommon.cpp518
-rw-r--r--src/filters/renderer/VideoRenderers/AllocatorCommon.h18
-rw-r--r--src/filters/renderer/VideoRenderers/AllocatorCommon7.cpp57
-rw-r--r--src/filters/renderer/VideoRenderers/AllocatorCommon7.h6
-rw-r--r--src/filters/renderer/VideoRenderers/D3DFont.cpp1394
-rw-r--r--src/filters/renderer/VideoRenderers/D3DFont.h66
-rw-r--r--src/filters/renderer/VideoRenderers/DX7AllocatorPresenter.cpp778
-rw-r--r--src/filters/renderer/VideoRenderers/DX7AllocatorPresenter.h50
-rw-r--r--src/filters/renderer/VideoRenderers/DX9AllocatorPresenter.cpp4366
-rw-r--r--src/filters/renderer/VideoRenderers/DX9AllocatorPresenter.h554
-rw-r--r--src/filters/renderer/VideoRenderers/DX9RenderingEngine.cpp2843
-rw-r--r--src/filters/renderer/VideoRenderers/DX9RenderingEngine.h292
-rw-r--r--src/filters/renderer/VideoRenderers/DXRAllocatorPresenter.cpp330
-rw-r--r--src/filters/renderer/VideoRenderers/DXRAllocatorPresenter.h138
-rw-r--r--src/filters/renderer/VideoRenderers/Dither.cpp128
-rw-r--r--src/filters/renderer/VideoRenderers/EVRAllocatorPresenter.cpp4120
-rw-r--r--src/filters/renderer/VideoRenderers/EVRAllocatorPresenter.h494
-rw-r--r--src/filters/renderer/VideoRenderers/IPinHook.cpp2328
-rw-r--r--src/filters/renderer/VideoRenderers/IPinHook.h238
-rw-r--r--src/filters/renderer/VideoRenderers/IQTVideoSurface.h4
-rw-r--r--src/filters/renderer/VideoRenderers/MacrovisionKicker.cpp54
-rw-r--r--src/filters/renderer/VideoRenderers/MacrovisionKicker.h24
-rw-r--r--src/filters/renderer/VideoRenderers/OuterEVR.cpp267
-rw-r--r--src/filters/renderer/VideoRenderers/OuterEVR.h124
-rw-r--r--src/filters/renderer/VideoRenderers/OuterVMR.cpp212
-rw-r--r--src/filters/renderer/VideoRenderers/OuterVMR.h630
-rw-r--r--src/filters/renderer/VideoRenderers/PixelShaderCompiler.cpp134
-rw-r--r--src/filters/renderer/VideoRenderers/PixelShaderCompiler.h58
-rw-r--r--src/filters/renderer/VideoRenderers/QT7AllocatorPresenter.cpp194
-rw-r--r--src/filters/renderer/VideoRenderers/QT7AllocatorPresenter.h40
-rw-r--r--src/filters/renderer/VideoRenderers/QT9AllocatorPresenter.cpp152
-rw-r--r--src/filters/renderer/VideoRenderers/QT9AllocatorPresenter.h32
-rw-r--r--src/filters/renderer/VideoRenderers/RM7AllocatorPresenter.cpp384
-rw-r--r--src/filters/renderer/VideoRenderers/RM7AllocatorPresenter.h46
-rw-r--r--src/filters/renderer/VideoRenderers/RM9AllocatorPresenter.cpp332
-rw-r--r--src/filters/renderer/VideoRenderers/RM9AllocatorPresenter.h56
-rw-r--r--src/filters/renderer/VideoRenderers/RenderersSettings.cpp168
-rw-r--r--src/filters/renderer/VideoRenderers/RenderersSettings.h202
-rw-r--r--src/filters/renderer/VideoRenderers/SyncAllocatorPresenter.h2
-rw-r--r--src/filters/renderer/VideoRenderers/SyncRenderer.cpp7551
-rw-r--r--src/filters/renderer/VideoRenderers/SyncRenderer.h1198
-rw-r--r--src/filters/renderer/VideoRenderers/VMR7AllocatorPresenter.cpp436
-rw-r--r--src/filters/renderer/VideoRenderers/VMR7AllocatorPresenter.h88
-rw-r--r--src/filters/renderer/VideoRenderers/VMR9AllocatorPresenter.cpp780
-rw-r--r--src/filters/renderer/VideoRenderers/VMR9AllocatorPresenter.h88
-rw-r--r--src/filters/renderer/VideoRenderers/madVRAllocatorPresenter.cpp347
-rw-r--r--src/filters/renderer/VideoRenderers/madVRAllocatorPresenter.h146
-rw-r--r--src/filters/renderer/VideoRenderers/stdafx.h2
-rw-r--r--src/filters/source/BaseSource/BaseSource.cpp178
-rw-r--r--src/filters/source/BaseSource/BaseSource.h172
-rw-r--r--src/filters/source/BaseSource/stdafx.h8
-rw-r--r--src/filters/source/D2VSource/D2VSource.cpp336
-rw-r--r--src/filters/source/D2VSource/D2VSource.h32
-rw-r--r--src/filters/source/DTSAC3Source/DTSAC3Source.cpp1006
-rw-r--r--src/filters/source/DTSAC3Source/DTSAC3Source.h58
-rw-r--r--src/filters/source/FLACSource/FLACSource.cpp408
-rw-r--r--src/filters/source/FLACSource/FLACSource.h52
-rw-r--r--src/filters/source/FLICSource/FLICSource.cpp1032
-rw-r--r--src/filters/source/FLICSource/FLICSource.h216
-rw-r--r--src/filters/source/ShoutcastSource/ShoutcastSource.cpp954
-rw-r--r--src/filters/source/ShoutcastSource/ShoutcastSource.h300
-rw-r--r--src/filters/source/SubtitleSource/SubtitleSource.cpp978
-rw-r--r--src/filters/source/SubtitleSource/SubtitleSource.h120
-rw-r--r--src/filters/switcher/AudioSwitcher/Audio.cpp424
-rw-r--r--src/filters/switcher/AudioSwitcher/Audio.h32
-rw-r--r--src/filters/switcher/AudioSwitcher/AudioSwitcher.cpp930
-rw-r--r--src/filters/switcher/AudioSwitcher/AudioSwitcher.h92
-rw-r--r--src/filters/switcher/AudioSwitcher/StreamSwitcher.cpp1636
-rw-r--r--src/filters/switcher/AudioSwitcher/StreamSwitcher.h368
-rw-r--r--src/filters/transform/AVI2AC3Filter/AVI2AC3Filter.cpp792
-rw-r--r--src/filters/transform/AVI2AC3Filter/AVI2AC3Filter.h36
-rw-r--r--src/filters/transform/BaseVideoFilter/BaseVideoFilter.cpp1162
-rw-r--r--src/filters/transform/BaseVideoFilter/BaseVideoFilter.h82
-rw-r--r--src/filters/transform/BufferFilter/BufferFilter.cpp384
-rw-r--r--src/filters/transform/BufferFilter/BufferFilter.h108
-rw-r--r--src/filters/transform/DeCSSFilter/DeCSSFilter.cpp308
-rw-r--r--src/filters/transform/DeCSSFilter/DeCSSFilter.h18
-rw-r--r--src/filters/transform/MPCVideoDec/CpuId.cpp303
-rw-r--r--src/filters/transform/MPCVideoDec/CpuId.h44
-rw-r--r--src/filters/transform/MPCVideoDec/DXVADecoder.cpp1152
-rw-r--r--src/filters/transform/MPCVideoDec/DXVADecoder.h220
-rw-r--r--src/filters/transform/MPCVideoDec/DXVADecoderH264.cpp587
-rw-r--r--src/filters/transform/MPCVideoDec/DXVADecoderH264.h56
-rw-r--r--src/filters/transform/MPCVideoDec/DXVADecoderMpeg2.cpp404
-rw-r--r--src/filters/transform/MPCVideoDec/DXVADecoderMpeg2.h50
-rw-r--r--src/filters/transform/MPCVideoDec/DXVADecoderVC1.cpp442
-rw-r--r--src/filters/transform/MPCVideoDec/DXVADecoderVC1.h134
-rw-r--r--src/filters/transform/MPCVideoDec/FfmpegContext.cpp1335
-rw-r--r--src/filters/transform/MPCVideoDec/FfmpegContext.h66
-rw-r--r--src/filters/transform/MPCVideoDec/IMPCVideoDecFilter.h80
-rw-r--r--src/filters/transform/MPCVideoDec/MPCFfmpegDec.cpp16
-rw-r--r--src/filters/transform/MPCVideoDec/MPCVideoDecFilter.cpp4107
-rw-r--r--src/filters/transform/MPCVideoDec/MPCVideoDecFilter.h498
-rw-r--r--src/filters/transform/MPCVideoDec/MPCVideoDecSettingsWnd.cpp542
-rw-r--r--src/filters/transform/MPCVideoDec/MPCVideoDecSettingsWnd.h144
-rw-r--r--src/filters/transform/MPCVideoDec/TlibavcodecExt.cpp40
-rw-r--r--src/filters/transform/MPCVideoDec/TlibavcodecExt.h28
-rw-r--r--src/filters/transform/MPCVideoDec/VideoDecDXVAAllocator.cpp262
-rw-r--r--src/filters/transform/MPCVideoDec/VideoDecDXVAAllocator.h66
-rw-r--r--src/filters/transform/MPCVideoDec/VideoDecOutputPin.cpp154
-rw-r--r--src/filters/transform/MPCVideoDec/VideoDecOutputPin.h30
-rw-r--r--src/filters/transform/MPCVideoDec/stdafx.cpp24
-rw-r--r--src/filters/transform/MpaDecFilter/IMpaDecFilter.h28
-rw-r--r--src/filters/transform/MpaDecFilter/MpaDecFilter.cpp3927
-rw-r--r--src/filters/transform/MpaDecFilter/MpaDecFilter.h196
-rw-r--r--src/filters/transform/MpaDecFilter/MpaDecSettingsWnd.cpp280
-rw-r--r--src/filters/transform/MpaDecFilter/MpaDecSettingsWnd.h94
-rw-r--r--src/filters/transform/Mpeg2DecFilter/IMpeg2DecFilter.h58
-rw-r--r--src/filters/transform/Mpeg2DecFilter/Mpeg2DecFilter.cpp3412
-rw-r--r--src/filters/transform/Mpeg2DecFilter/Mpeg2DecFilter.h468
-rw-r--r--src/filters/transform/Mpeg2DecFilter/Mpeg2DecSettingsWnd.cpp316
-rw-r--r--src/filters/transform/Mpeg2DecFilter/Mpeg2DecSettingsWnd.h102
-rw-r--r--src/filters/transform/Mpeg2DecFilter/idct_sse2.cpp512
-rw-r--r--src/filters/transform/Mpeg2DecFilter/mc_sse2.cpp758
-rw-r--r--src/filters/transform/VSFilter/AvgLines.cpp406
-rw-r--r--src/filters/transform/VSFilter/AvgLines.h26
-rw-r--r--src/filters/transform/VSFilter/Copy.cpp332
-rw-r--r--src/filters/transform/VSFilter/DirectVobSub.cpp860
-rw-r--r--src/filters/transform/VSFilter/DirectVobSub.h202
-rw-r--r--src/filters/transform/VSFilter/DirectVobSubFilter.cpp2684
-rw-r--r--src/filters/transform/VSFilter/DirectVobSubFilter.h250
-rw-r--r--src/filters/transform/VSFilter/DirectVobSubPropPage.cpp1744
-rw-r--r--src/filters/transform/VSFilter/DirectVobSubPropPage.h204
-rw-r--r--src/filters/transform/VSFilter/IDirectVobSub.h550
-rw-r--r--src/filters/transform/VSFilter/Scale2x.cpp632
-rw-r--r--src/filters/transform/VSFilter/StyleEditorDialog.cpp370
-rw-r--r--src/filters/transform/VSFilter/StyleEditorDialog.h122
-rw-r--r--src/filters/transform/VSFilter/Systray.cpp576
-rw-r--r--src/filters/transform/VSFilter/Systray.h70
-rw-r--r--src/filters/transform/VSFilter/TextInputPin.cpp10
-rw-r--r--src/filters/transform/VSFilter/TextInputPin.h10
-rw-r--r--src/filters/transform/VSFilter/VSFilter.cpp138
-rw-r--r--src/filters/transform/VSFilter/VSFilter.h12
-rw-r--r--src/filters/transform/VSFilter/csri.h544
-rw-r--r--src/filters/transform/VSFilter/csriapi.cpp312
-rw-r--r--src/filters/transform/VSFilter/plugins.cpp2021
-rw-r--r--src/filters/transform/VSFilter/vfr.cpp272
-rw-r--r--src/filters/transform/VSFilter/vfr.h4
231 files changed, 65660 insertions, 65648 deletions
diff --git a/src/filters/FilterApp.cpp b/src/filters/FilterApp.cpp
index 5d0228b46..d57f71d02 100644
--- a/src/filters/FilterApp.cpp
+++ b/src/filters/FilterApp.cpp
@@ -32,22 +32,22 @@ CFilterApp::CFilterApp()
BOOL CFilterApp::InitInstance()
{
- if (!__super::InitInstance()) {
- return FALSE;
- }
+ if (!__super::InitInstance()) {
+ return FALSE;
+ }
- SetRegistryKey(_T("Gabest"));
+ SetRegistryKey(_T("Gabest"));
- DllEntryPoint(AfxGetInstanceHandle(), DLL_PROCESS_ATTACH, 0);
+ DllEntryPoint(AfxGetInstanceHandle(), DLL_PROCESS_ATTACH, 0);
- return TRUE;
+ return TRUE;
}
BOOL CFilterApp::ExitInstance()
{
- DllEntryPoint(AfxGetInstanceHandle(), DLL_PROCESS_DETACH, 0);
+ DllEntryPoint(AfxGetInstanceHandle(), DLL_PROCESS_DETACH, 0);
- return __super::ExitInstance();
+ return __super::ExitInstance();
}
BEGIN_MESSAGE_MAP(CFilterApp, CWinApp)
diff --git a/src/filters/FilterApp.h b/src/filters/FilterApp.h
index 4999d7053..b21360e22 100644
--- a/src/filters/FilterApp.h
+++ b/src/filters/FilterApp.h
@@ -26,10 +26,10 @@
class CFilterApp : public CWinApp
{
public:
- CFilterApp();
+ CFilterApp();
- BOOL InitInstance();
- BOOL ExitInstance();
+ BOOL InitInstance();
+ BOOL ExitInstance();
- DECLARE_MESSAGE_MAP()
+ DECLARE_MESSAGE_MAP()
};
diff --git a/src/filters/InternalPropertyPage.cpp b/src/filters/InternalPropertyPage.cpp
index 51f91cf70..a7ef8c39a 100644
--- a/src/filters/InternalPropertyPage.cpp
+++ b/src/filters/InternalPropertyPage.cpp
@@ -30,75 +30,75 @@
//
CInternalPropertyPageWnd::CInternalPropertyPageWnd()
- : m_fDirty(false)
- , m_fontheight(13)
+ : m_fDirty(false)
+ , m_fontheight(13)
{
}
BOOL CInternalPropertyPageWnd::Create(IPropertyPageSite* pPageSite, LPCRECT pRect, CWnd* pParentWnd)
{
- if (!pPageSite || !pRect) {
- return FALSE;
- }
-
- m_pPageSite = pPageSite;
-
- if (!m_font.m_hObject) {
- CString face;
- WORD height;
- extern BOOL AFXAPI AfxGetPropSheetFont(CString& strFace, WORD& wSize, BOOL bWizard); // yay
- if (!AfxGetPropSheetFont(face, height, FALSE)) {
- return FALSE;
- }
-
- LOGFONT lf;
- memset(&lf, 0, sizeof(lf));
- _tcscpy_s(lf.lfFaceName, face);
- HDC hDC = ::GetDC(0);
- lf.lfHeight = -MulDiv(height, GetDeviceCaps(hDC, LOGPIXELSY), 72);
- ::ReleaseDC(0, hDC);
- lf.lfWeight = FW_NORMAL;
- lf.lfCharSet = DEFAULT_CHARSET;
- if (!m_font.CreateFontIndirect(&lf)) {
- return FALSE;
- }
-
- lf.lfHeight -= -1;
- _tcscpy_s(lf.lfFaceName, _T("Lucida Console"));
- if (!m_monospacefont.CreateFontIndirect(&lf)) {
- _tcscpy_s(lf.lfFaceName, _T("Courier New"));
- if (!m_monospacefont.CreateFontIndirect(&lf)) {
- return FALSE;
- }
- }
-
- hDC = ::GetDC(0);
- HFONT hFontOld = (HFONT)::SelectObject(hDC, m_font.m_hObject);
- CSize size;
- ::GetTextExtentPoint32(hDC, _T("x"), 1, &size);
- ::SelectObject(hDC, hFontOld);
- ::ReleaseDC(0, hDC);
-
- m_fontheight = size.cy;
- }
-
- LPCTSTR wc = AfxRegisterWndClass(CS_VREDRAW|CS_HREDRAW|CS_DBLCLKS, 0, (HBRUSH)(COLOR_BTNFACE + 1));
- if (!CreateEx(0, wc, _T("CInternalPropertyPageWnd"), WS_CHILDWINDOW, *pRect, pParentWnd, 0)) {
- return FALSE;
- }
-
- SetFont(&m_font);
-
- return TRUE;
+ if (!pPageSite || !pRect) {
+ return FALSE;
+ }
+
+ m_pPageSite = pPageSite;
+
+ if (!m_font.m_hObject) {
+ CString face;
+ WORD height;
+ extern BOOL AFXAPI AfxGetPropSheetFont(CString & strFace, WORD & wSize, BOOL bWizard); // yay
+ if (!AfxGetPropSheetFont(face, height, FALSE)) {
+ return FALSE;
+ }
+
+ LOGFONT lf;
+ memset(&lf, 0, sizeof(lf));
+ _tcscpy_s(lf.lfFaceName, face);
+ HDC hDC = ::GetDC(0);
+ lf.lfHeight = -MulDiv(height, GetDeviceCaps(hDC, LOGPIXELSY), 72);
+ ::ReleaseDC(0, hDC);
+ lf.lfWeight = FW_NORMAL;
+ lf.lfCharSet = DEFAULT_CHARSET;
+ if (!m_font.CreateFontIndirect(&lf)) {
+ return FALSE;
+ }
+
+ lf.lfHeight -= -1;
+ _tcscpy_s(lf.lfFaceName, _T("Lucida Console"));
+ if (!m_monospacefont.CreateFontIndirect(&lf)) {
+ _tcscpy_s(lf.lfFaceName, _T("Courier New"));
+ if (!m_monospacefont.CreateFontIndirect(&lf)) {
+ return FALSE;
+ }
+ }
+
+ hDC = ::GetDC(0);
+ HFONT hFontOld = (HFONT)::SelectObject(hDC, m_font.m_hObject);
+ CSize size;
+ ::GetTextExtentPoint32(hDC, _T("x"), 1, &size);
+ ::SelectObject(hDC, hFontOld);
+ ::ReleaseDC(0, hDC);
+
+ m_fontheight = size.cy;
+ }
+
+ LPCTSTR wc = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS, 0, (HBRUSH)(COLOR_BTNFACE + 1));
+ if (!CreateEx(0, wc, _T("CInternalPropertyPageWnd"), WS_CHILDWINDOW, *pRect, pParentWnd, 0)) {
+ return FALSE;
+ }
+
+ SetFont(&m_font);
+
+ return TRUE;
}
BOOL CInternalPropertyPageWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
- if (message == WM_COMMAND || message == WM_HSCROLL || message == WM_VSCROLL) {
- SetDirty(true);
- }
+ if (message == WM_COMMAND || message == WM_HSCROLL || message == WM_VSCROLL) {
+ SetDirty(true);
+ }
- return __super::OnWndMsg(message, wParam, lParam, pResult);
+ return __super::OnWndMsg(message, wParam, lParam, pResult);
}
BEGIN_MESSAGE_MAP(CInternalPropertyPageWnd, CWnd)
@@ -109,225 +109,225 @@ END_MESSAGE_MAP()
//
CInternalPropertyPage::CInternalPropertyPage(LPUNKNOWN lpunk, HRESULT* phr)
- : CUnknown(_T("CInternalPropertyPage"), lpunk)
- , m_pWnd(NULL)
+ : CUnknown(_T("CInternalPropertyPage"), lpunk)
+ , m_pWnd(NULL)
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
}
CInternalPropertyPage::~CInternalPropertyPage()
{
- if (m_pWnd) {
- if (m_pWnd->m_hWnd) {
- ASSERT(0);
- m_pWnd->DestroyWindow();
- }
- delete m_pWnd;
- m_pWnd = NULL;
- }
+ if (m_pWnd) {
+ if (m_pWnd->m_hWnd) {
+ ASSERT(0);
+ m_pWnd->DestroyWindow();
+ }
+ delete m_pWnd;
+ m_pWnd = NULL;
+ }
}
STDMETHODIMP CInternalPropertyPage::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- return
- QI2(IPropertyPage)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI2(IPropertyPage)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
// IPropertyPage
STDMETHODIMP CInternalPropertyPage::SetPageSite(IPropertyPageSite* pPageSite)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- if (pPageSite && m_pPageSite || !pPageSite && !m_pPageSite) {
- return E_UNEXPECTED;
- }
+ if (pPageSite && m_pPageSite || !pPageSite && !m_pPageSite) {
+ return E_UNEXPECTED;
+ }
- m_pPageSite = pPageSite;
+ m_pPageSite = pPageSite;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CInternalPropertyPage::Activate(HWND hwndParent, LPCRECT pRect, BOOL fModal)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- CheckPointer(pRect, E_POINTER);
+ CheckPointer(pRect, E_POINTER);
- if (!m_pWnd || m_pWnd->m_hWnd || m_pUnks.IsEmpty()) {
- return E_UNEXPECTED;
- }
+ if (!m_pWnd || m_pWnd->m_hWnd || m_pUnks.IsEmpty()) {
+ return E_UNEXPECTED;
+ }
- if (!m_pWnd->Create(m_pPageSite, pRect, CWnd::FromHandle(hwndParent))) {
- return E_OUTOFMEMORY;
- }
+ if (!m_pWnd->Create(m_pPageSite, pRect, CWnd::FromHandle(hwndParent))) {
+ return E_OUTOFMEMORY;
+ }
- if (!m_pWnd->OnActivate()) {
- m_pWnd->DestroyWindow();
- return E_FAIL;
- }
+ if (!m_pWnd->OnActivate()) {
+ m_pWnd->DestroyWindow();
+ return E_FAIL;
+ }
- m_pWnd->ModifyStyleEx(WS_EX_DLGMODALFRAME, WS_EX_CONTROLPARENT);
- m_pWnd->ShowWindow(SW_SHOWNORMAL);
+ m_pWnd->ModifyStyleEx(WS_EX_DLGMODALFRAME, WS_EX_CONTROLPARENT);
+ m_pWnd->ShowWindow(SW_SHOWNORMAL);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CInternalPropertyPage::Deactivate()
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- if (!m_pWnd || !m_pWnd->m_hWnd) {
- return E_UNEXPECTED;
- }
+ if (!m_pWnd || !m_pWnd->m_hWnd) {
+ return E_UNEXPECTED;
+ }
- m_pWnd->OnDeactivate();
+ m_pWnd->OnDeactivate();
- m_pWnd->ModifyStyleEx(WS_EX_CONTROLPARENT, 0);
- m_pWnd->DestroyWindow();
+ m_pWnd->ModifyStyleEx(WS_EX_CONTROLPARENT, 0);
+ m_pWnd->DestroyWindow();
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CInternalPropertyPage::GetPageInfo(PROPPAGEINFO* pPageInfo)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- CheckPointer(pPageInfo, E_POINTER);
+ CheckPointer(pPageInfo, E_POINTER);
- LPOLESTR pszTitle;
- HRESULT hr = AMGetWideString(CStringW(GetWindowTitle()), &pszTitle);
- if (FAILED(hr)) {
- return hr;
- }
+ LPOLESTR pszTitle;
+ HRESULT hr = AMGetWideString(CStringW(GetWindowTitle()), &pszTitle);
+ if (FAILED(hr)) {
+ return hr;
+ }
- pPageInfo->cb = sizeof(PROPPAGEINFO);
- pPageInfo->pszTitle = pszTitle;
- pPageInfo->pszDocString = NULL;
- pPageInfo->pszHelpFile = NULL;
- pPageInfo->dwHelpContext = 0;
- pPageInfo->size = GetWindowSize();
+ pPageInfo->cb = sizeof(PROPPAGEINFO);
+ pPageInfo->pszTitle = pszTitle;
+ pPageInfo->pszDocString = NULL;
+ pPageInfo->pszHelpFile = NULL;
+ pPageInfo->dwHelpContext = 0;
+ pPageInfo->size = GetWindowSize();
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CInternalPropertyPage::SetObjects(ULONG cObjects, LPUNKNOWN* ppUnk)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- if (cObjects && m_pWnd || !cObjects && !m_pWnd) {
- return E_UNEXPECTED;
- }
+ if (cObjects && m_pWnd || !cObjects && !m_pWnd) {
+ return E_UNEXPECTED;
+ }
- m_pUnks.RemoveAll();
+ m_pUnks.RemoveAll();
- if (cObjects > 0) {
- CheckPointer(ppUnk, E_POINTER);
+ if (cObjects > 0) {
+ CheckPointer(ppUnk, E_POINTER);
- for (ULONG i = 0; i < cObjects; i++) {
- m_pUnks.AddTail(ppUnk[i]);
- }
+ for (ULONG i = 0; i < cObjects; i++) {
+ m_pUnks.AddTail(ppUnk[i]);
+ }
- m_pWnd = GetWindow();
- if (!m_pWnd) {
- return E_OUTOFMEMORY;
- }
+ m_pWnd = GetWindow();
+ if (!m_pWnd) {
+ return E_OUTOFMEMORY;
+ }
- if (!m_pWnd->OnConnect(m_pUnks)) {
- delete m_pWnd;
- m_pWnd = NULL;
+ if (!m_pWnd->OnConnect(m_pUnks)) {
+ delete m_pWnd;
+ m_pWnd = NULL;
- return E_FAIL;
- }
- } else {
- m_pWnd->OnDisconnect();
+ return E_FAIL;
+ }
+ } else {
+ m_pWnd->OnDisconnect();
- m_pWnd->DestroyWindow();
- delete m_pWnd;
- m_pWnd = NULL;
- }
+ m_pWnd->DestroyWindow();
+ delete m_pWnd;
+ m_pWnd = NULL;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CInternalPropertyPage::Show(UINT nCmdShow)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- if (!m_pWnd) {
- return E_UNEXPECTED;
- }
+ if (!m_pWnd) {
+ return E_UNEXPECTED;
+ }
- if ((nCmdShow != SW_SHOW) && (nCmdShow != SW_SHOWNORMAL) && (nCmdShow != SW_HIDE)) {
- return E_INVALIDARG;
- }
+ if ((nCmdShow != SW_SHOW) && (nCmdShow != SW_SHOWNORMAL) && (nCmdShow != SW_HIDE)) {
+ return E_INVALIDARG;
+ }
- m_pWnd->ShowWindow(nCmdShow);
- m_pWnd->Invalidate();
+ m_pWnd->ShowWindow(nCmdShow);
+ m_pWnd->Invalidate();
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CInternalPropertyPage::Move(LPCRECT pRect)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- CheckPointer(pRect, E_POINTER);
+ CheckPointer(pRect, E_POINTER);
- if (!m_pWnd) {
- return E_UNEXPECTED;
- }
+ if (!m_pWnd) {
+ return E_UNEXPECTED;
+ }
- m_pWnd->MoveWindow(pRect, TRUE);
+ m_pWnd->MoveWindow(pRect, TRUE);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CInternalPropertyPage::IsPageDirty()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- return m_pWnd && m_pWnd->GetDirty() ? S_OK : S_FALSE;
+ return m_pWnd && m_pWnd->GetDirty() ? S_OK : S_FALSE;
}
STDMETHODIMP CInternalPropertyPage::Apply()
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- if (!m_pWnd || m_pUnks.IsEmpty() || !m_pPageSite) {
- return E_UNEXPECTED;
- }
+ if (!m_pWnd || m_pUnks.IsEmpty() || !m_pPageSite) {
+ return E_UNEXPECTED;
+ }
- if (m_pWnd->GetDirty() && m_pWnd->OnApply()) {
- m_pWnd->SetDirty(false);
- }
+ if (m_pWnd->GetDirty() && m_pWnd->OnApply()) {
+ m_pWnd->SetDirty(false);
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CInternalPropertyPage::Help(LPCWSTR lpszHelpDir)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CInternalPropertyPage::TranslateAccelerator(LPMSG lpMsg)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
diff --git a/src/filters/InternalPropertyPage.h b/src/filters/InternalPropertyPage.h
index b4a57ac3a..7f6798295 100644
--- a/src/filters/InternalPropertyPage.h
+++ b/src/filters/InternalPropertyPage.h
@@ -28,107 +28,107 @@
interface __declspec(uuid("03481710-D73E-4674-839F-03EDE2D60ED8"))
ISpecifyPropertyPages2 :
public ISpecifyPropertyPages {
- STDMETHOD (CreatePage) (const GUID& guid, IPropertyPage** ppPage) = 0;
+ STDMETHOD(CreatePage)(const GUID & guid, IPropertyPage** ppPage) = 0;
};
class CInternalPropertyPageWnd : public CWnd
{
- bool m_fDirty;
- CComPtr<IPropertyPageSite> m_pPageSite;
+ bool m_fDirty;
+ CComPtr<IPropertyPageSite> m_pPageSite;
protected:
- CFont m_font, m_monospacefont;
- int m_fontheight;
+ CFont m_font, m_monospacefont;
+ int m_fontheight;
- virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
+ virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
public:
- CInternalPropertyPageWnd();
-
- void SetDirty(bool fDirty = true) {
- m_fDirty = fDirty;
- if (m_pPageSite) {
- if (fDirty) {
- m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY);
- } else {
- m_pPageSite->OnStatusChange(PROPPAGESTATUS_CLEAN);
- }
- }
- }
- bool GetDirty() {
- return m_fDirty;
- }
-
- virtual BOOL Create(IPropertyPageSite* pPageSite, LPCRECT pRect, CWnd* pParentWnd);
-
- virtual bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks) {
- return true;
- }
- virtual void OnDisconnect() {}
- virtual bool OnActivate() {
- return true;
- }
- virtual void OnDeactivate() {}
- virtual bool OnApply() {
- return true;
- }
-
- DECLARE_MESSAGE_MAP()
+ CInternalPropertyPageWnd();
+
+ void SetDirty(bool fDirty = true) {
+ m_fDirty = fDirty;
+ if (m_pPageSite) {
+ if (fDirty) {
+ m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY);
+ } else {
+ m_pPageSite->OnStatusChange(PROPPAGESTATUS_CLEAN);
+ }
+ }
+ }
+ bool GetDirty() {
+ return m_fDirty;
+ }
+
+ virtual BOOL Create(IPropertyPageSite* pPageSite, LPCRECT pRect, CWnd* pParentWnd);
+
+ virtual bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks) {
+ return true;
+ }
+ virtual void OnDisconnect() {}
+ virtual bool OnActivate() {
+ return true;
+ }
+ virtual void OnDeactivate() {}
+ virtual bool OnApply() {
+ return true;
+ }
+
+ DECLARE_MESSAGE_MAP()
};
class CInternalPropertyPage
- : public CUnknown
- , public IPropertyPage
- , public CCritSec
+ : public CUnknown
+ , public IPropertyPage
+ , public CCritSec
{
- CComPtr<IPropertyPageSite> m_pPageSite;
- CInterfaceList<IUnknown, &IID_IUnknown> m_pUnks;
- CInternalPropertyPageWnd* m_pWnd;
+ CComPtr<IPropertyPageSite> m_pPageSite;
+ CInterfaceList<IUnknown, &IID_IUnknown> m_pUnks;
+ CInternalPropertyPageWnd* m_pWnd;
protected:
- virtual CInternalPropertyPageWnd* GetWindow() = 0;
- virtual LPCTSTR GetWindowTitle() = 0;
- virtual CSize GetWindowSize() = 0;
+ virtual CInternalPropertyPageWnd* GetWindow() = 0;
+ virtual LPCTSTR GetWindowTitle() = 0;
+ virtual CSize GetWindowSize() = 0;
public:
- CInternalPropertyPage(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CInternalPropertyPage();
-
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- // IPropertyPage
-
- STDMETHODIMP SetPageSite(IPropertyPageSite* pPageSite);
- STDMETHODIMP Activate(HWND hwndParent, LPCRECT pRect, BOOL fModal);
- STDMETHODIMP Deactivate();
- STDMETHODIMP GetPageInfo(PROPPAGEINFO* pPageInfo);
- STDMETHODIMP SetObjects(ULONG cObjects, LPUNKNOWN* ppUnk);
- STDMETHODIMP Show(UINT nCmdShow);
- STDMETHODIMP Move(LPCRECT prect);
- STDMETHODIMP IsPageDirty();
- STDMETHODIMP Apply();
- STDMETHODIMP Help(LPCWSTR lpszHelpDir);
- STDMETHODIMP TranslateAccelerator(LPMSG lpMsg);
+ CInternalPropertyPage(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CInternalPropertyPage();
+
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ // IPropertyPage
+
+ STDMETHODIMP SetPageSite(IPropertyPageSite* pPageSite);
+ STDMETHODIMP Activate(HWND hwndParent, LPCRECT pRect, BOOL fModal);
+ STDMETHODIMP Deactivate();
+ STDMETHODIMP GetPageInfo(PROPPAGEINFO* pPageInfo);
+ STDMETHODIMP SetObjects(ULONG cObjects, LPUNKNOWN* ppUnk);
+ STDMETHODIMP Show(UINT nCmdShow);
+ STDMETHODIMP Move(LPCRECT prect);
+ STDMETHODIMP IsPageDirty();
+ STDMETHODIMP Apply();
+ STDMETHODIMP Help(LPCWSTR lpszHelpDir);
+ STDMETHODIMP TranslateAccelerator(LPMSG lpMsg);
};
template<class WndClass>
class CInternalPropertyPageTempl : public CInternalPropertyPage
{
- virtual CInternalPropertyPageWnd* GetWindow() {
- return DNew WndClass();
- }
+ virtual CInternalPropertyPageWnd* GetWindow() {
+ return DNew WndClass();
+ }
- virtual LPCTSTR GetWindowTitle() {
- return WndClass::GetWindowTitle();
- }
+ virtual LPCTSTR GetWindowTitle() {
+ return WndClass::GetWindowTitle();
+ }
- virtual CSize GetWindowSize() {
- return WndClass::GetWindowSize();
- }
+ virtual CSize GetWindowSize() {
+ return WndClass::GetWindowSize();
+ }
public:
- CInternalPropertyPageTempl(LPUNKNOWN lpunk, HRESULT* phr)
- : CInternalPropertyPage(lpunk, phr) {
- }
+ CInternalPropertyPageTempl(LPUNKNOWN lpunk, HRESULT* phr)
+ : CInternalPropertyPage(lpunk, phr) {
+ }
};
diff --git a/src/filters/PinInfoWnd.cpp b/src/filters/PinInfoWnd.cpp
index 3d174defc..06b17dbae 100644
--- a/src/filters/PinInfoWnd.cpp
+++ b/src/filters/PinInfoWnd.cpp
@@ -35,90 +35,90 @@ CPinInfoWnd::CPinInfoWnd()
bool CPinInfoWnd::OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks)
{
- ASSERT(!m_pBF);
+ ASSERT(!m_pBF);
- m_pBF.Release();
+ m_pBF.Release();
- POSITION pos = pUnks.GetHeadPosition();
- while (pos && !(m_pBF = pUnks.GetNext(pos))) {
- ;
- }
+ POSITION pos = pUnks.GetHeadPosition();
+ while (pos && !(m_pBF = pUnks.GetNext(pos))) {
+ ;
+ }
- if (!m_pBF) {
- return false;
- }
+ if (!m_pBF) {
+ return false;
+ }
- return true;
+ return true;
}
void CPinInfoWnd::OnDisconnect()
{
- m_pBF.Release();
+ m_pBF.Release();
}
static WNDPROC OldControlProc;
static LRESULT CALLBACK ControlProc(HWND control, UINT message, WPARAM wParam, LPARAM lParam)
{
- if (message == WM_KEYDOWN) {
- if (LOWORD(wParam)==VK_ESCAPE) {
- return 0; // just ignore ESCAPE in edit control
- }
- if ((LOWORD(wParam)== 'A' || LOWORD(wParam) == 'a')
- &&(GetKeyState(VK_CONTROL) < 0)) {
- CEdit *pEdit = (CEdit*)CWnd::FromHandle(control);
- pEdit->SetSel(0, pEdit->GetWindowTextLength(),TRUE);
- return 0;
- }
- }
-
- return CallWindowProc(OldControlProc, control, message, wParam, lParam); // call edit control's own windowproc
+ if (message == WM_KEYDOWN) {
+ if (LOWORD(wParam) == VK_ESCAPE) {
+ return 0; // just ignore ESCAPE in edit control
+ }
+ if ((LOWORD(wParam) == 'A' || LOWORD(wParam) == 'a')
+ && (GetKeyState(VK_CONTROL) < 0)) {
+ CEdit* pEdit = (CEdit*)CWnd::FromHandle(control);
+ pEdit->SetSel(0, pEdit->GetWindowTextLength(), TRUE);
+ return 0;
+ }
+ }
+
+ return CallWindowProc(OldControlProc, control, message, wParam, lParam); // call edit control's own windowproc
}
bool CPinInfoWnd::OnActivate()
{
- DWORD dwStyle = WS_VISIBLE|WS_CHILD|WS_TABSTOP;
-
- CPoint p(10, 10);
-
- m_pin_static.Create(_T("Pin:"), dwStyle, CRect(p + CPoint(0, 3), CSize(30, m_fontheight)), this);
- m_pin_combo.Create(dwStyle|CBS_DROPDOWNLIST, CRect(p + CPoint(30, 0), CSize(450, 200)), this, IDC_PP_COMBO1);
- BeginEnumPins(m_pBF, pEP, pPin) {
- CPinInfo pi;
- if (FAILED(pPin->QueryPinInfo(&pi))) {
- continue;
- }
- CString str = CString(pi.achName);
- if (!str.Find(_T("Apple"))) {
- str.Delete(0,1);
- }
- CString dir = _T("[?] ");
- if (pi.dir == PINDIR_INPUT) {
- dir = _T("[IN] ");
- } else if (pi.dir == PINDIR_OUTPUT) {
- dir = _T("[OUT] ");
- }
- m_pin_combo.SetItemDataPtr(m_pin_combo.AddString(dir + str), pPin);
- }
- EndEnumPins
- m_pin_combo.SetCurSel(0);
-
- p.y += m_fontheight + 20;
-
- m_info_edit.CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""), dwStyle|WS_BORDER|WS_VSCROLL|WS_HSCROLL|ES_MULTILINE|ES_AUTOHSCROLL|ES_READONLY, CRect(p, CSize(480, m_fontheight*20)), this, IDC_PP_EDIT1);
- m_info_edit.SetLimitText(60000);
-
- OnCbnSelchangeCombo1();
-
- for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
- pWnd->SetFont(&m_font, FALSE);
- }
-
- m_info_edit.SetFont(&m_monospacefont);
-
- // subclass the edit control
- OldControlProc = (WNDPROC) SetWindowLongPtr(m_info_edit.m_hWnd, GWLP_WNDPROC, (LONG_PTR) ControlProc);
-
- return true;
+ DWORD dwStyle = WS_VISIBLE | WS_CHILD | WS_TABSTOP;
+
+ CPoint p(10, 10);
+
+ m_pin_static.Create(_T("Pin:"), dwStyle, CRect(p + CPoint(0, 3), CSize(30, m_fontheight)), this);
+ m_pin_combo.Create(dwStyle | CBS_DROPDOWNLIST, CRect(p + CPoint(30, 0), CSize(450, 200)), this, IDC_PP_COMBO1);
+ BeginEnumPins(m_pBF, pEP, pPin) {
+ CPinInfo pi;
+ if (FAILED(pPin->QueryPinInfo(&pi))) {
+ continue;
+ }
+ CString str = CString(pi.achName);
+ if (!str.Find(_T("Apple"))) {
+ str.Delete(0, 1);
+ }
+ CString dir = _T("[?] ");
+ if (pi.dir == PINDIR_INPUT) {
+ dir = _T("[IN] ");
+ } else if (pi.dir == PINDIR_OUTPUT) {
+ dir = _T("[OUT] ");
+ }
+ m_pin_combo.SetItemDataPtr(m_pin_combo.AddString(dir + str), pPin);
+ }
+ EndEnumPins
+ m_pin_combo.SetCurSel(0);
+
+ p.y += m_fontheight + 20;
+
+ m_info_edit.CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""), dwStyle | WS_BORDER | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY, CRect(p, CSize(480, m_fontheight * 20)), this, IDC_PP_EDIT1);
+ m_info_edit.SetLimitText(60000);
+
+ OnCbnSelchangeCombo1();
+
+ for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
+ pWnd->SetFont(&m_font, FALSE);
+ }
+
+ m_info_edit.SetFont(&m_monospacefont);
+
+ // subclass the edit control
+ OldControlProc = (WNDPROC) SetWindowLongPtr(m_info_edit.m_hWnd, GWLP_WNDPROC, (LONG_PTR) ControlProc);
+
+ return true;
}
void CPinInfoWnd::OnDeactivate()
@@ -127,118 +127,118 @@ void CPinInfoWnd::OnDeactivate()
bool CPinInfoWnd::OnApply()
{
- OnDeactivate();
+ OnDeactivate();
- if (m_pBF) {
- }
+ if (m_pBF) {
+ }
- return true;
+ return true;
}
BOOL CPinInfoWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
- SetDirty(false);
- return __super::OnWndMsg(message, wParam, lParam, pResult);
+ SetDirty(false);
+ return __super::OnWndMsg(message, wParam, lParam, pResult);
}
BEGIN_MESSAGE_MAP(CPinInfoWnd, CInternalPropertyPageWnd)
- ON_CBN_SELCHANGE(IDC_PP_COMBO1, OnCbnSelchangeCombo1)
+ ON_CBN_SELCHANGE(IDC_PP_COMBO1, OnCbnSelchangeCombo1)
END_MESSAGE_MAP()
void CPinInfoWnd::AddLine(CString str)
{
- str.Replace(_T("\n"), _T("\r\n"));
- int len = m_info_edit.GetWindowTextLength();
- m_info_edit.SetSel(len, len, TRUE);
- m_info_edit.ReplaceSel(str);
+ str.Replace(_T("\n"), _T("\r\n"));
+ int len = m_info_edit.GetWindowTextLength();
+ m_info_edit.SetSel(len, len, TRUE);
+ m_info_edit.ReplaceSel(str);
}
void CPinInfoWnd::OnCbnSelchangeCombo1()
{
- m_info_edit.SetWindowText(_T(""));
-
- int i = m_pin_combo.GetCurSel();
- if (i < 0) {
- return;
- }
-
- CComPtr<IPin> pPin = (IPin*)m_pin_combo.GetItemDataPtr(i);
- if (!pPin) {
- return;
- }
-
- CString str;
-
- PIN_INFO PinInfo;
- if (SUCCEEDED (pPin->QueryPinInfo(&PinInfo))) {
- CString strName;
- CLSID FilterClsid;
- FILTER_INFO FilterInfo;
-
- if (SUCCEEDED (PinInfo.pFilter->QueryFilterInfo (&FilterInfo))) {
- CRegKey key;
- PinInfo.pFilter->GetClassID(&FilterClsid);
- if (ERROR_SUCCESS == key.Open (HKEY_CLASSES_ROOT, _T("CLSID\\{083863F1-70DE-11D0-BD40-00A0C911CE86}\\Instance\\") + CStringFromGUID(FilterClsid), KEY_READ)) {
- ULONG len;
- TCHAR buff[128];
- len = _countof(buff);
- key.QueryStringValue(_T("FriendlyName"), buff, &len);
- strName = CString (buff);
- } else {
- strName = FilterInfo.achName;
- }
- str.Format (_T("Filter : %s - CLSID : %s\n\n"), strName, CStringFromGUID(FilterClsid));
- AddLine(str);
- FilterInfo.pGraph->Release();
- }
- PinInfo.pFilter->Release();
- }
-
- CMediaTypeEx cmt;
-
- CComPtr<IPin> pPinTo;
- if (SUCCEEDED(pPin->ConnectedTo(&pPinTo)) && pPinTo) {
- str.Format(_T("- Connected to:\n\nCLSID: %s\nFilter: %s\nPin: %s\n\n"),
- CString(CStringFromGUID(GetCLSID(pPinTo))),
- CString(GetFilterName(GetFilterFromPin(pPinTo))),
- CString(GetPinName(pPinTo)));
-
- AddLine(str);
-
- AddLine(_T("- Connection media type:\n\n"));
-
- if (SUCCEEDED(pPin->ConnectionMediaType(&cmt))) {
- CAtlList<CString> sl;
- cmt.Dump(sl);
- POSITION pos = sl.GetHeadPosition();
- while (pos) {
- AddLine(sl.GetNext(pos) + '\n');
- }
- }
- } else {
- str = _T("- Not connected\n\n");
- }
-
- int iMT = 0;
-
- BeginEnumMediaTypes(pPin, pEMT, pmt) {
- CMediaTypeEx mt(*pmt);
-
- str.Format(_T("- Enumerated media type %d:\n\n"), iMT++);
- AddLine(str);
-
- if (cmt.majortype != GUID_NULL && mt == cmt) {
- AddLine(_T("Set as the current media type\n\n"));
- } else {
- CAtlList<CString> sl;
- mt.Dump(sl);
- POSITION pos = sl.GetHeadPosition();
- while (pos) {
- AddLine(sl.GetNext(pos) + '\n');
- }
- }
- }
- EndEnumMediaTypes(pmt)
-
- m_info_edit.SetSel(0, 0);
+ m_info_edit.SetWindowText(_T(""));
+
+ int i = m_pin_combo.GetCurSel();
+ if (i < 0) {
+ return;
+ }
+
+ CComPtr<IPin> pPin = (IPin*)m_pin_combo.GetItemDataPtr(i);
+ if (!pPin) {
+ return;
+ }
+
+ CString str;
+
+ PIN_INFO PinInfo;
+ if (SUCCEEDED(pPin->QueryPinInfo(&PinInfo))) {
+ CString strName;
+ CLSID FilterClsid;
+ FILTER_INFO FilterInfo;
+
+ if (SUCCEEDED(PinInfo.pFilter->QueryFilterInfo(&FilterInfo))) {
+ CRegKey key;
+ PinInfo.pFilter->GetClassID(&FilterClsid);
+ if (ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, _T("CLSID\\{083863F1-70DE-11D0-BD40-00A0C911CE86}\\Instance\\") + CStringFromGUID(FilterClsid), KEY_READ)) {
+ ULONG len;
+ TCHAR buff[128];
+ len = _countof(buff);
+ key.QueryStringValue(_T("FriendlyName"), buff, &len);
+ strName = CString(buff);
+ } else {
+ strName = FilterInfo.achName;
+ }
+ str.Format(_T("Filter : %s - CLSID : %s\n\n"), strName, CStringFromGUID(FilterClsid));
+ AddLine(str);
+ FilterInfo.pGraph->Release();
+ }
+ PinInfo.pFilter->Release();
+ }
+
+ CMediaTypeEx cmt;
+
+ CComPtr<IPin> pPinTo;
+ if (SUCCEEDED(pPin->ConnectedTo(&pPinTo)) && pPinTo) {
+ str.Format(_T("- Connected to:\n\nCLSID: %s\nFilter: %s\nPin: %s\n\n"),
+ CString(CStringFromGUID(GetCLSID(pPinTo))),
+ CString(GetFilterName(GetFilterFromPin(pPinTo))),
+ CString(GetPinName(pPinTo)));
+
+ AddLine(str);
+
+ AddLine(_T("- Connection media type:\n\n"));
+
+ if (SUCCEEDED(pPin->ConnectionMediaType(&cmt))) {
+ CAtlList<CString> sl;
+ cmt.Dump(sl);
+ POSITION pos = sl.GetHeadPosition();
+ while (pos) {
+ AddLine(sl.GetNext(pos) + '\n');
+ }
+ }
+ } else {
+ str = _T("- Not connected\n\n");
+ }
+
+ int iMT = 0;
+
+ BeginEnumMediaTypes(pPin, pEMT, pmt) {
+ CMediaTypeEx mt(*pmt);
+
+ str.Format(_T("- Enumerated media type %d:\n\n"), iMT++);
+ AddLine(str);
+
+ if (cmt.majortype != GUID_NULL && mt == cmt) {
+ AddLine(_T("Set as the current media type\n\n"));
+ } else {
+ CAtlList<CString> sl;
+ mt.Dump(sl);
+ POSITION pos = sl.GetHeadPosition();
+ while (pos) {
+ AddLine(sl.GetNext(pos) + '\n');
+ }
+ }
+ }
+ EndEnumMediaTypes(pmt)
+
+ m_info_edit.SetSel(0, 0);
} \ No newline at end of file
diff --git a/src/filters/PinInfoWnd.h b/src/filters/PinInfoWnd.h
index 29bef9f15..76595a8ae 100644
--- a/src/filters/PinInfoWnd.h
+++ b/src/filters/PinInfoWnd.h
@@ -27,41 +27,41 @@
#include <afxcmn.h>
class __declspec(uuid("A1EB391C-6089-4A87-9988-BE50872317D4"))
- CPinInfoWnd : public CInternalPropertyPageWnd
+ CPinInfoWnd : public CInternalPropertyPageWnd
{
- CComQIPtr<IBaseFilter> m_pBF;
+ CComQIPtr<IBaseFilter> m_pBF;
- enum {
- IDC_PP_COMBO1 = 10000,
- IDC_PP_EDIT1,
- };
+ enum {
+ IDC_PP_COMBO1 = 10000,
+ IDC_PP_EDIT1,
+ };
- CStatic m_pin_static;
- CComboBox m_pin_combo;
- CEdit m_info_edit;
+ CStatic m_pin_static;
+ CComboBox m_pin_combo;
+ CEdit m_info_edit;
- void AddLine(CString str);
+ void AddLine(CString str);
public:
- CPinInfoWnd();
+ CPinInfoWnd();
- bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
- void OnDisconnect();
- bool OnActivate();
- void OnDeactivate();
- bool OnApply();
+ bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
+ void OnDisconnect();
+ bool OnActivate();
+ void OnDeactivate();
+ bool OnApply();
- static LPCTSTR GetWindowTitle() {
- return _T("Pin Info");
- }
- static CSize GetWindowSize() {
- return CSize(500, 300);
- }
+ static LPCTSTR GetWindowTitle() {
+ return _T("Pin Info");
+ }
+ static CSize GetWindowSize() {
+ return CSize(500, 300);
+ }
- DECLARE_MESSAGE_MAP()
+ DECLARE_MESSAGE_MAP()
- void OnCbnSelchangeCombo1();
+ void OnCbnSelchangeCombo1();
protected:
- virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
+ virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
};
diff --git a/src/filters/muxer/BaseMuxer/BaseMuxer.cpp b/src/filters/muxer/BaseMuxer/BaseMuxer.cpp
index 49f702e1a..53236560a 100644
--- a/src/filters/muxer/BaseMuxer/BaseMuxer.cpp
+++ b/src/filters/muxer/BaseMuxer/BaseMuxer.cpp
@@ -29,14 +29,14 @@
//
CBaseMuxerFilter::CBaseMuxerFilter(LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid)
- : CBaseFilter(NAME("CBaseMuxerFilter"), pUnk, this, clsid)
- , m_rtCurrent(0)
+ : CBaseFilter(NAME("CBaseMuxerFilter"), pUnk, this, clsid)
+ , m_rtCurrent(0)
{
- if (phr) {
- *phr = S_OK;
- }
- m_pOutput.Attach(DNew CBaseMuxerOutputPin(L"Output", this, this, phr));
- AddInput();
+ if (phr) {
+ *phr = S_OK;
+ }
+ m_pOutput.Attach(DNew CBaseMuxerOutputPin(L"Output", this, this, phr));
+ AddInput();
}
CBaseMuxerFilter::~CBaseMuxerFilter()
@@ -45,472 +45,472 @@ CBaseMuxerFilter::~CBaseMuxerFilter()
STDMETHODIMP CBaseMuxerFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- *ppv = NULL;
+ *ppv = NULL;
- return
- QI(IMediaSeeking)
- QI(IPropertyBag)
- QI(IPropertyBag2)
- QI(IDSMPropertyBag)
- QI(IDSMResourceBag)
- QI(IDSMChapterBag)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IMediaSeeking)
+ QI(IPropertyBag)
+ QI(IPropertyBag2)
+ QI(IDSMPropertyBag)
+ QI(IDSMResourceBag)
+ QI(IDSMChapterBag)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
//
void CBaseMuxerFilter::AddInput()
{
- POSITION pos = m_pInputs.GetHeadPosition();
- while (pos) {
- CBasePin* pPin = m_pInputs.GetNext(pos);
- if (!pPin->IsConnected()) {
- return;
- }
- }
+ POSITION pos = m_pInputs.GetHeadPosition();
+ while (pos) {
+ CBasePin* pPin = m_pInputs.GetNext(pos);
+ if (!pPin->IsConnected()) {
+ return;
+ }
+ }
- CStringW name;
+ CStringW name;
- name.Format(L"Input %d", m_pInputs.GetCount()+1);
+ name.Format(L"Input %d", m_pInputs.GetCount() + 1);
- CBaseMuxerInputPin* pInputPin = NULL;
- if (FAILED(CreateInput(name, &pInputPin)) || !pInputPin) {
- ASSERT(0);
- return;
- }
- CAutoPtr<CBaseMuxerInputPin> pAutoPtrInputPin(pInputPin);
+ CBaseMuxerInputPin* pInputPin = NULL;
+ if (FAILED(CreateInput(name, &pInputPin)) || !pInputPin) {
+ ASSERT(0);
+ return;
+ }
+ CAutoPtr<CBaseMuxerInputPin> pAutoPtrInputPin(pInputPin);
- name.Format(L"~Output %d", m_pRawOutputs.GetCount()+1);
+ name.Format(L"~Output %d", m_pRawOutputs.GetCount() + 1);
- CBaseMuxerRawOutputPin* pRawOutputPin = NULL;
- if (FAILED(CreateRawOutput(name, &pRawOutputPin)) || !pRawOutputPin) {
- ASSERT(0);
- return;
- }
- CAutoPtr<CBaseMuxerRawOutputPin> pAutoPtrRawOutputPin(pRawOutputPin);
+ CBaseMuxerRawOutputPin* pRawOutputPin = NULL;
+ if (FAILED(CreateRawOutput(name, &pRawOutputPin)) || !pRawOutputPin) {
+ ASSERT(0);
+ return;
+ }
+ CAutoPtr<CBaseMuxerRawOutputPin> pAutoPtrRawOutputPin(pRawOutputPin);
- pInputPin->SetRelatedPin(pRawOutputPin);
- pRawOutputPin->SetRelatedPin(pInputPin);
+ pInputPin->SetRelatedPin(pRawOutputPin);
+ pRawOutputPin->SetRelatedPin(pInputPin);
- m_pInputs.AddTail(pAutoPtrInputPin);
- m_pRawOutputs.AddTail(pAutoPtrRawOutputPin);
+ m_pInputs.AddTail(pAutoPtrInputPin);
+ m_pRawOutputs.AddTail(pAutoPtrRawOutputPin);
}
HRESULT CBaseMuxerFilter::CreateInput(CStringW name, CBaseMuxerInputPin** ppPin)
{
- CheckPointer(ppPin, E_POINTER);
- HRESULT hr = S_OK;
- *ppPin = DNew CBaseMuxerInputPin(name, this, this, &hr);
- return hr;
+ CheckPointer(ppPin, E_POINTER);
+ HRESULT hr = S_OK;
+ *ppPin = DNew CBaseMuxerInputPin(name, this, this, &hr);
+ return hr;
}
HRESULT CBaseMuxerFilter::CreateRawOutput(CStringW name, CBaseMuxerRawOutputPin** ppPin)
{
- CheckPointer(ppPin, E_POINTER);
- HRESULT hr = S_OK;
- *ppPin = DNew CBaseMuxerRawOutputPin(name, this, this, &hr);
- return hr;
+ CheckPointer(ppPin, E_POINTER);
+ HRESULT hr = S_OK;
+ *ppPin = DNew CBaseMuxerRawOutputPin(name, this, this, &hr);
+ return hr;
}
//
DWORD CBaseMuxerFilter::ThreadProc()
{
- SetThreadPriority(m_hThread, THREAD_PRIORITY_ABOVE_NORMAL);
+ SetThreadPriority(m_hThread, THREAD_PRIORITY_ABOVE_NORMAL);
- POSITION pos;
+ POSITION pos;
- for (;;) {
- DWORD cmd = GetRequest();
+ for (;;) {
+ DWORD cmd = GetRequest();
- switch (cmd) {
- default:
- case CMD_EXIT:
- CAMThread::m_hThread = NULL;
- Reply(S_OK);
- return 0;
+ switch (cmd) {
+ default:
+ case CMD_EXIT:
+ CAMThread::m_hThread = NULL;
+ Reply(S_OK);
+ return 0;
- case CMD_RUN:
- m_pActivePins.RemoveAll();
- m_pPins.RemoveAll();
+ case CMD_RUN:
+ m_pActivePins.RemoveAll();
+ m_pPins.RemoveAll();
- pos = m_pInputs.GetHeadPosition();
- while (pos) {
- CBaseMuxerInputPin* pPin = m_pInputs.GetNext(pos);
- if (pPin->IsConnected()) {
- m_pActivePins.AddTail(pPin);
- m_pPins.AddTail(pPin);
- }
- }
+ pos = m_pInputs.GetHeadPosition();
+ while (pos) {
+ CBaseMuxerInputPin* pPin = m_pInputs.GetNext(pos);
+ if (pPin->IsConnected()) {
+ m_pActivePins.AddTail(pPin);
+ m_pPins.AddTail(pPin);
+ }
+ }
- m_rtCurrent = 0;
+ m_rtCurrent = 0;
- Reply(S_OK);
+ Reply(S_OK);
- MuxInit();
+ MuxInit();
- try {
- MuxHeaderInternal();
+ try {
+ MuxHeaderInternal();
- while (!CheckRequest(NULL) && m_pActivePins.GetCount()) {
- if (m_State == State_Paused) {
- Sleep(10);
- continue;
- }
+ while (!CheckRequest(NULL) && m_pActivePins.GetCount()) {
+ if (m_State == State_Paused) {
+ Sleep(10);
+ continue;
+ }
- CAutoPtr<MuxerPacket> pPacket = GetPacket();
- if (!pPacket) {
- Sleep(1);
- continue;
- }
+ CAutoPtr<MuxerPacket> pPacket = GetPacket();
+ if (!pPacket) {
+ Sleep(1);
+ continue;
+ }
- if (pPacket->IsTimeValid()) {
- m_rtCurrent = pPacket->rtStart;
- }
+ if (pPacket->IsTimeValid()) {
+ m_rtCurrent = pPacket->rtStart;
+ }
- if (pPacket->IsEOS()) {
- m_pActivePins.RemoveAt(m_pActivePins.Find(pPacket->pPin));
- }
+ if (pPacket->IsEOS()) {
+ m_pActivePins.RemoveAt(m_pActivePins.Find(pPacket->pPin));
+ }
- MuxPacketInternal(pPacket);
- }
+ MuxPacketInternal(pPacket);
+ }
- MuxFooterInternal();
- } catch (HRESULT hr) {
- CComQIPtr<IMediaEventSink>(m_pGraph)->Notify(EC_ERRORABORT, hr, 0);
- }
+ MuxFooterInternal();
+ } catch (HRESULT hr) {
+ CComQIPtr<IMediaEventSink>(m_pGraph)->Notify(EC_ERRORABORT, hr, 0);
+ }
- m_pOutput->DeliverEndOfStream();
+ m_pOutput->DeliverEndOfStream();
- pos = m_pRawOutputs.GetHeadPosition();
- while (pos) {
- m_pRawOutputs.GetNext(pos)->DeliverEndOfStream();
- }
+ pos = m_pRawOutputs.GetHeadPosition();
+ while (pos) {
+ m_pRawOutputs.GetNext(pos)->DeliverEndOfStream();
+ }
- m_pActivePins.RemoveAll();
- m_pPins.RemoveAll();
+ m_pActivePins.RemoveAll();
+ m_pPins.RemoveAll();
- break;
- }
- }
+ break;
+ }
+ }
- ASSERT(0); // this function should only return via CMD_EXIT
+ ASSERT(0); // this function should only return via CMD_EXIT
- CAMThread::m_hThread = NULL;
- return 0;
+ CAMThread::m_hThread = NULL;
+ return 0;
}
void CBaseMuxerFilter::MuxHeaderInternal()
{
- TRACE(_T("MuxHeader\n"));
+ TRACE(_T("MuxHeader\n"));
- if (CComQIPtr<IBitStream> pBitStream = m_pOutput->GetBitStream()) {
- MuxHeader(pBitStream);
- }
+ if (CComQIPtr<IBitStream> pBitStream = m_pOutput->GetBitStream()) {
+ MuxHeader(pBitStream);
+ }
- MuxHeader();
+ MuxHeader();
- //
+ //
- POSITION pos = m_pPins.GetHeadPosition();
- while (pos) {
- if (CBaseMuxerInputPin* pInput = m_pPins.GetNext(pos))
- if (CBaseMuxerRawOutputPin* pOutput = dynamic_cast<CBaseMuxerRawOutputPin*>(pInput->GetRelatedPin())) {
- pOutput->MuxHeader(pInput->CurrentMediaType());
- }
- }
+ POSITION pos = m_pPins.GetHeadPosition();
+ while (pos) {
+ if (CBaseMuxerInputPin* pInput = m_pPins.GetNext(pos))
+ if (CBaseMuxerRawOutputPin* pOutput = dynamic_cast<CBaseMuxerRawOutputPin*>(pInput->GetRelatedPin())) {
+ pOutput->MuxHeader(pInput->CurrentMediaType());
+ }
+ }
}
void CBaseMuxerFilter::MuxPacketInternal(const MuxerPacket* pPacket)
{
- TRACE(_T("MuxPacket pPin=%x, size=%d, s%d e%d b%d, rt=(%I64d-%I64d)\n"),
- pPacket->pPin->GetID(),
- pPacket->pData.GetCount(),
- !!(pPacket->flags & MuxerPacket::syncpoint),
- !!(pPacket->flags & MuxerPacket::eos),
- !!(pPacket->flags & MuxerPacket::bogus),
- pPacket->rtStart/10000, pPacket->rtStop/10000);
+ TRACE(_T("MuxPacket pPin=%x, size=%d, s%d e%d b%d, rt=(%I64d-%I64d)\n"),
+ pPacket->pPin->GetID(),
+ pPacket->pData.GetCount(),
+ !!(pPacket->flags & MuxerPacket::syncpoint),
+ !!(pPacket->flags & MuxerPacket::eos),
+ !!(pPacket->flags & MuxerPacket::bogus),
+ pPacket->rtStart / 10000, pPacket->rtStop / 10000);
- if (CComQIPtr<IBitStream> pBitStream = m_pOutput->GetBitStream()) {
- MuxPacket(pBitStream, pPacket);
- }
+ if (CComQIPtr<IBitStream> pBitStream = m_pOutput->GetBitStream()) {
+ MuxPacket(pBitStream, pPacket);
+ }
- MuxPacket(pPacket);
+ MuxPacket(pPacket);
- if (CBaseMuxerInputPin* pInput = pPacket->pPin)
- if (CBaseMuxerRawOutputPin* pOutput = dynamic_cast<CBaseMuxerRawOutputPin*>(pInput->GetRelatedPin())) {
- pOutput->MuxPacket(pInput->CurrentMediaType(), pPacket);
- }
+ if (CBaseMuxerInputPin* pInput = pPacket->pPin)
+ if (CBaseMuxerRawOutputPin* pOutput = dynamic_cast<CBaseMuxerRawOutputPin*>(pInput->GetRelatedPin())) {
+ pOutput->MuxPacket(pInput->CurrentMediaType(), pPacket);
+ }
}
void CBaseMuxerFilter::MuxFooterInternal()
{
- TRACE(_T("MuxFooter\n"));
+ TRACE(_T("MuxFooter\n"));
- if (CComQIPtr<IBitStream> pBitStream = m_pOutput->GetBitStream()) {
- MuxFooter(pBitStream);
- }
+ if (CComQIPtr<IBitStream> pBitStream = m_pOutput->GetBitStream()) {
+ MuxFooter(pBitStream);
+ }
- MuxFooter();
+ MuxFooter();
- //
+ //
- POSITION pos = m_pPins.GetHeadPosition();
- while (pos) {
- if (CBaseMuxerInputPin* pInput = m_pPins.GetNext(pos))
- if (CBaseMuxerRawOutputPin* pOutput = dynamic_cast<CBaseMuxerRawOutputPin*>(pInput->GetRelatedPin())) {
- pOutput->MuxFooter(pInput->CurrentMediaType());
- }
- }
+ POSITION pos = m_pPins.GetHeadPosition();
+ while (pos) {
+ if (CBaseMuxerInputPin* pInput = m_pPins.GetNext(pos))
+ if (CBaseMuxerRawOutputPin* pOutput = dynamic_cast<CBaseMuxerRawOutputPin*>(pInput->GetRelatedPin())) {
+ pOutput->MuxFooter(pInput->CurrentMediaType());
+ }
+ }
}
CAutoPtr<MuxerPacket> CBaseMuxerFilter::GetPacket()
{
- REFERENCE_TIME rtMin = _I64_MAX;
- CBaseMuxerInputPin* pPinMin = NULL;
- int i = int(m_pActivePins.GetCount());
+ REFERENCE_TIME rtMin = _I64_MAX;
+ CBaseMuxerInputPin* pPinMin = NULL;
+ int i = int(m_pActivePins.GetCount());
- POSITION pos = m_pActivePins.GetHeadPosition();
- while (pos) {
- CBaseMuxerInputPin* pPin = m_pActivePins.GetNext(pos);
+ POSITION pos = m_pActivePins.GetHeadPosition();
+ while (pos) {
+ CBaseMuxerInputPin* pPin = m_pActivePins.GetNext(pos);
- CAutoLock cAutoLock(&pPin->m_csQueue);
- if (!pPin->m_queue.GetCount()) {
- continue;
- }
+ CAutoLock cAutoLock(&pPin->m_csQueue);
+ if (!pPin->m_queue.GetCount()) {
+ continue;
+ }
- MuxerPacket* p = pPin->m_queue.GetHead();
+ MuxerPacket* p = pPin->m_queue.GetHead();
- if (p->IsBogus() || !p->IsTimeValid() || p->IsEOS()) {
- pPinMin = pPin;
- i = 0;
- break;
- }
+ if (p->IsBogus() || !p->IsTimeValid() || p->IsEOS()) {
+ pPinMin = pPin;
+ i = 0;
+ break;
+ }
- if (p->rtStart < rtMin) {
- rtMin = p->rtStart;
- pPinMin = pPin;
- }
+ if (p->rtStart < rtMin) {
+ rtMin = p->rtStart;
+ pPinMin = pPin;
+ }
- i--;
- }
+ i--;
+ }
- CAutoPtr<MuxerPacket> pPacket;
+ CAutoPtr<MuxerPacket> pPacket;
- if (pPinMin && i == 0) {
- pPacket = pPinMin->PopPacket();
- } else {
- pos = m_pActivePins.GetHeadPosition();
- while (pos) {
- m_pActivePins.GetNext(pos)->m_evAcceptPacket.Set();
- }
- }
+ if (pPinMin && i == 0) {
+ pPacket = pPinMin->PopPacket();
+ } else {
+ pos = m_pActivePins.GetHeadPosition();
+ while (pos) {
+ m_pActivePins.GetNext(pos)->m_evAcceptPacket.Set();
+ }
+ }
- return pPacket;
+ return pPacket;
}
//
int CBaseMuxerFilter::GetPinCount()
{
- return int(m_pInputs.GetCount()) + (m_pOutput ? 1 : 0) + int(m_pRawOutputs.GetCount());
+ return int(m_pInputs.GetCount()) + (m_pOutput ? 1 : 0) + int(m_pRawOutputs.GetCount());
}
CBasePin* CBaseMuxerFilter::GetPin(int n)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- if (n >= 0 && n < (int)m_pInputs.GetCount()) {
- if (POSITION pos = m_pInputs.FindIndex(n)) {
- return m_pInputs.GetAt(pos);
- }
- }
+ if (n >= 0 && n < (int)m_pInputs.GetCount()) {
+ if (POSITION pos = m_pInputs.FindIndex(n)) {
+ return m_pInputs.GetAt(pos);
+ }
+ }
- n -= int(m_pInputs.GetCount());
+ n -= int(m_pInputs.GetCount());
- if (n == 0 && m_pOutput) {
- return m_pOutput;
- }
+ if (n == 0 && m_pOutput) {
+ return m_pOutput;
+ }
- n--;
+ n--;
- if (n >= 0 && n < (int)m_pRawOutputs.GetCount()) {
- if (POSITION pos = m_pRawOutputs.FindIndex(n)) {
- return m_pRawOutputs.GetAt(pos);
- }
- }
+ if (n >= 0 && n < (int)m_pRawOutputs.GetCount()) {
+ if (POSITION pos = m_pRawOutputs.FindIndex(n)) {
+ return m_pRawOutputs.GetAt(pos);
+ }
+ }
- n -= int(m_pRawOutputs.GetCount());
+ n -= int(m_pRawOutputs.GetCount());
- return NULL;
+ return NULL;
}
STDMETHODIMP CBaseMuxerFilter::Stop()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- HRESULT hr = __super::Stop();
- if (FAILED(hr)) {
- return hr;
- }
+ HRESULT hr = __super::Stop();
+ if (FAILED(hr)) {
+ return hr;
+ }
- CallWorker(CMD_EXIT);
+ CallWorker(CMD_EXIT);
- return hr;
+ return hr;
}
STDMETHODIMP CBaseMuxerFilter::Pause()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- FILTER_STATE fs = m_State;
+ FILTER_STATE fs = m_State;
- HRESULT hr = __super::Pause();
- if (FAILED(hr)) {
- return hr;
- }
+ HRESULT hr = __super::Pause();
+ if (FAILED(hr)) {
+ return hr;
+ }
- if (fs == State_Stopped && m_pOutput) {
- CAMThread::Create();
- CallWorker(CMD_RUN);
- }
+ if (fs == State_Stopped && m_pOutput) {
+ CAMThread::Create();
+ CallWorker(CMD_RUN);
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CBaseMuxerFilter::Run(REFERENCE_TIME tStart)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- HRESULT hr = __super::Run(tStart);
- if (FAILED(hr)) {
- return hr;
- }
+ HRESULT hr = __super::Run(tStart);
+ if (FAILED(hr)) {
+ return hr;
+ }
- return hr;
+ return hr;
}
// IMediaSeeking
STDMETHODIMP CBaseMuxerFilter::GetCapabilities(DWORD* pCapabilities)
{
- return pCapabilities ? *pCapabilities = AM_SEEKING_CanGetDuration|AM_SEEKING_CanGetCurrentPos, S_OK : E_POINTER;
+ return pCapabilities ? *pCapabilities = AM_SEEKING_CanGetDuration | AM_SEEKING_CanGetCurrentPos, S_OK : E_POINTER;
}
STDMETHODIMP CBaseMuxerFilter::CheckCapabilities(DWORD* pCapabilities)
{
- CheckPointer(pCapabilities, E_POINTER);
- if (*pCapabilities == 0) {
- return S_OK;
- }
- DWORD caps;
- GetCapabilities(&caps);
- caps &= *pCapabilities;
- return caps == 0 ? E_FAIL : caps == *pCapabilities ? S_OK : S_FALSE;
+ CheckPointer(pCapabilities, E_POINTER);
+ if (*pCapabilities == 0) {
+ return S_OK;
+ }
+ DWORD caps;
+ GetCapabilities(&caps);
+ caps &= *pCapabilities;
+ return caps == 0 ? E_FAIL : caps == *pCapabilities ? S_OK : S_FALSE;
}
STDMETHODIMP CBaseMuxerFilter::IsFormatSupported(const GUID* pFormat)
{
- return !pFormat ? E_POINTER : *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : S_FALSE;
+ return !pFormat ? E_POINTER : *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : S_FALSE;
}
STDMETHODIMP CBaseMuxerFilter::QueryPreferredFormat(GUID* pFormat)
{
- return GetTimeFormat(pFormat);
+ return GetTimeFormat(pFormat);
}
STDMETHODIMP CBaseMuxerFilter::GetTimeFormat(GUID* pFormat)
{
- return pFormat ? *pFormat = TIME_FORMAT_MEDIA_TIME, S_OK : E_POINTER;
+ return pFormat ? *pFormat = TIME_FORMAT_MEDIA_TIME, S_OK : E_POINTER;
}
STDMETHODIMP CBaseMuxerFilter::IsUsingTimeFormat(const GUID* pFormat)
{
- return IsFormatSupported(pFormat);
+ return IsFormatSupported(pFormat);
}
STDMETHODIMP CBaseMuxerFilter::SetTimeFormat(const GUID* pFormat)
{
- return S_OK == IsFormatSupported(pFormat) ? S_OK : E_INVALIDARG;
+ return S_OK == IsFormatSupported(pFormat) ? S_OK : E_INVALIDARG;
}
STDMETHODIMP CBaseMuxerFilter::GetDuration(LONGLONG* pDuration)
{
- CheckPointer(pDuration, E_POINTER);
- *pDuration = 0;
- POSITION pos = m_pInputs.GetHeadPosition();
- while (pos) {
- REFERENCE_TIME rt = m_pInputs.GetNext(pos)->GetDuration();
- if (rt > *pDuration) {
- *pDuration = rt;
- }
- }
- return S_OK;
+ CheckPointer(pDuration, E_POINTER);
+ *pDuration = 0;
+ POSITION pos = m_pInputs.GetHeadPosition();
+ while (pos) {
+ REFERENCE_TIME rt = m_pInputs.GetNext(pos)->GetDuration();
+ if (rt > *pDuration) {
+ *pDuration = rt;
+ }
+ }
+ return S_OK;
}
STDMETHODIMP CBaseMuxerFilter::GetStopPosition(LONGLONG* pStop)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CBaseMuxerFilter::GetCurrentPosition(LONGLONG* pCurrent)
{
- CheckPointer(pCurrent, E_POINTER);
- *pCurrent = m_rtCurrent;
- return S_OK;
+ CheckPointer(pCurrent, E_POINTER);
+ *pCurrent = m_rtCurrent;
+ return S_OK;
}
STDMETHODIMP CBaseMuxerFilter::ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CBaseMuxerFilter::SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags)
{
- FILTER_STATE fs;
+ FILTER_STATE fs;
- if (SUCCEEDED(GetState(0, &fs)) && fs == State_Stopped) {
- POSITION pos = m_pInputs.GetHeadPosition();
- while (pos) {
- CBasePin* pPin = m_pInputs.GetNext(pos);
- CComQIPtr<IMediaSeeking> pMS = pPin->GetConnected();
- if (!pMS) {
- pMS = GetFilterFromPin(pPin->GetConnected());
- }
- if (pMS) {
- pMS->SetPositions(pCurrent, dwCurrentFlags, pStop, dwStopFlags);
- }
- }
+ if (SUCCEEDED(GetState(0, &fs)) && fs == State_Stopped) {
+ POSITION pos = m_pInputs.GetHeadPosition();
+ while (pos) {
+ CBasePin* pPin = m_pInputs.GetNext(pos);
+ CComQIPtr<IMediaSeeking> pMS = pPin->GetConnected();
+ if (!pMS) {
+ pMS = GetFilterFromPin(pPin->GetConnected());
+ }
+ if (pMS) {
+ pMS->SetPositions(pCurrent, dwCurrentFlags, pStop, dwStopFlags);
+ }
+ }
- return S_OK;
- }
+ return S_OK;
+ }
- return VFW_E_WRONG_STATE;
+ return VFW_E_WRONG_STATE;
}
STDMETHODIMP CBaseMuxerFilter::GetPositions(LONGLONG* pCurrent, LONGLONG* pStop)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CBaseMuxerFilter::GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CBaseMuxerFilter::SetRate(double dRate)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CBaseMuxerFilter::GetRate(double* pdRate)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CBaseMuxerFilter::GetPreroll(LONGLONG* pllPreroll)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
diff --git a/src/filters/muxer/BaseMuxer/BaseMuxer.h b/src/filters/muxer/BaseMuxer/BaseMuxer.h
index 2fd0b927d..6f204ed0a 100644
--- a/src/filters/muxer/BaseMuxer/BaseMuxer.h
+++ b/src/filters/muxer/BaseMuxer/BaseMuxer.h
@@ -27,86 +27,86 @@
#include "BaseMuxerOutputPin.h"
class CBaseMuxerFilter
- : public CBaseFilter
- , public CCritSec
- , public CAMThread
- , public IMediaSeeking
- , public IDSMPropertyBagImpl
- , public IDSMResourceBagImpl
- , public IDSMChapterBagImpl
+ : public CBaseFilter
+ , public CCritSec
+ , public CAMThread
+ , public IMediaSeeking
+ , public IDSMPropertyBagImpl
+ , public IDSMResourceBagImpl
+ , public IDSMChapterBagImpl
{
private:
- CAutoPtrList<CBaseMuxerInputPin> m_pInputs;
- CAutoPtr<CBaseMuxerOutputPin> m_pOutput;
- CAutoPtrList<CBaseMuxerRawOutputPin> m_pRawOutputs;
+ CAutoPtrList<CBaseMuxerInputPin> m_pInputs;
+ CAutoPtr<CBaseMuxerOutputPin> m_pOutput;
+ CAutoPtrList<CBaseMuxerRawOutputPin> m_pRawOutputs;
- enum {CMD_EXIT, CMD_RUN};
- DWORD ThreadProc();
+ enum {CMD_EXIT, CMD_RUN};
+ DWORD ThreadProc();
- REFERENCE_TIME m_rtCurrent;
- CAtlList<CBaseMuxerInputPin*> m_pActivePins;
+ REFERENCE_TIME m_rtCurrent;
+ CAtlList<CBaseMuxerInputPin*> m_pActivePins;
- CAutoPtr<MuxerPacket> GetPacket();
+ CAutoPtr<MuxerPacket> GetPacket();
- void MuxHeaderInternal();
- void MuxPacketInternal(const MuxerPacket* pPacket);
- void MuxFooterInternal();
+ void MuxHeaderInternal();
+ void MuxPacketInternal(const MuxerPacket* pPacket);
+ void MuxFooterInternal();
protected:
- CAtlList<CBaseMuxerInputPin*> m_pPins;
- CBaseMuxerOutputPin* GetOutputPin() {
- return m_pOutput;
- }
+ CAtlList<CBaseMuxerInputPin*> m_pPins;
+ CBaseMuxerOutputPin* GetOutputPin() {
+ return m_pOutput;
+ }
- virtual void MuxInit() = 0;
+ virtual void MuxInit() = 0;
- // only called when the output pin is connected
- virtual void MuxHeader(IBitStream* pBS) {}
- virtual void MuxPacket(IBitStream* pBS, const MuxerPacket* pPacket) {}
- virtual void MuxFooter(IBitStream* pBS) {}
+ // only called when the output pin is connected
+ virtual void MuxHeader(IBitStream* pBS) {}
+ virtual void MuxPacket(IBitStream* pBS, const MuxerPacket* pPacket) {}
+ virtual void MuxFooter(IBitStream* pBS) {}
- // always called (useful if the derived class wants to write somewhere else than downstream)
- virtual void MuxHeader() {}
- virtual void MuxPacket(const MuxerPacket* pPacket) {}
- virtual void MuxFooter() {}
+ // always called (useful if the derived class wants to write somewhere else than downstream)
+ virtual void MuxHeader() {}
+ virtual void MuxPacket(const MuxerPacket* pPacket) {}
+ virtual void MuxFooter() {}
- // allows customized pins in derived classes
- virtual HRESULT CreateInput(CStringW name, CBaseMuxerInputPin** ppPin);
- virtual HRESULT CreateRawOutput(CStringW name, CBaseMuxerRawOutputPin** ppPin);
+ // allows customized pins in derived classes
+ virtual HRESULT CreateInput(CStringW name, CBaseMuxerInputPin** ppPin);
+ virtual HRESULT CreateRawOutput(CStringW name, CBaseMuxerRawOutputPin** ppPin);
public:
- CBaseMuxerFilter(LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid);
- virtual ~CBaseMuxerFilter();
-
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- void AddInput();
-
- int GetPinCount();
- CBasePin* GetPin(int n);
-
- STDMETHODIMP Stop();
- STDMETHODIMP Pause();
- STDMETHODIMP Run(REFERENCE_TIME tStart);
-
- // IMediaSeeking
-
- STDMETHODIMP GetCapabilities(DWORD* pCapabilities);
- STDMETHODIMP CheckCapabilities(DWORD* pCapabilities);
- STDMETHODIMP IsFormatSupported(const GUID* pFormat);
- STDMETHODIMP QueryPreferredFormat(GUID* pFormat);
- STDMETHODIMP GetTimeFormat(GUID* pFormat);
- STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
- STDMETHODIMP SetTimeFormat(const GUID* pFormat);
- STDMETHODIMP GetDuration(LONGLONG* pDuration);
- STDMETHODIMP GetStopPosition(LONGLONG* pStop);
- STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent);
- STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
- STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
- STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
- STDMETHODIMP GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest);
- STDMETHODIMP SetRate(double dRate);
- STDMETHODIMP GetRate(double* pdRate);
- STDMETHODIMP GetPreroll(LONGLONG* pllPreroll);
+ CBaseMuxerFilter(LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid);
+ virtual ~CBaseMuxerFilter();
+
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ void AddInput();
+
+ int GetPinCount();
+ CBasePin* GetPin(int n);
+
+ STDMETHODIMP Stop();
+ STDMETHODIMP Pause();
+ STDMETHODIMP Run(REFERENCE_TIME tStart);
+
+ // IMediaSeeking
+
+ STDMETHODIMP GetCapabilities(DWORD* pCapabilities);
+ STDMETHODIMP CheckCapabilities(DWORD* pCapabilities);
+ STDMETHODIMP IsFormatSupported(const GUID* pFormat);
+ STDMETHODIMP QueryPreferredFormat(GUID* pFormat);
+ STDMETHODIMP GetTimeFormat(GUID* pFormat);
+ STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
+ STDMETHODIMP SetTimeFormat(const GUID* pFormat);
+ STDMETHODIMP GetDuration(LONGLONG* pDuration);
+ STDMETHODIMP GetStopPosition(LONGLONG* pStop);
+ STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent);
+ STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
+ STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
+ STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
+ STDMETHODIMP GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest);
+ STDMETHODIMP SetRate(double dRate);
+ STDMETHODIMP GetRate(double* pdRate);
+ STDMETHODIMP GetPreroll(LONGLONG* pllPreroll);
};
diff --git a/src/filters/muxer/BaseMuxer/BaseMuxerInputPin.cpp b/src/filters/muxer/BaseMuxer/BaseMuxerInputPin.cpp
index 82e5d6936..ad2ad9767 100644
--- a/src/filters/muxer/BaseMuxer/BaseMuxerInputPin.cpp
+++ b/src/filters/muxer/BaseMuxer/BaseMuxerInputPin.cpp
@@ -35,13 +35,13 @@
//
CBaseMuxerInputPin::CBaseMuxerInputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBaseInputPin(NAME("CBaseMuxerInputPin"), pFilter, pLock, phr, pName)
- , m_rtDuration(0)
- , m_evAcceptPacket(TRUE)
- , m_iPacketIndex(0)
+ : CBaseInputPin(NAME("CBaseMuxerInputPin"), pFilter, pLock, phr, pName)
+ , m_rtDuration(0)
+ , m_evAcceptPacket(TRUE)
+ , m_iPacketIndex(0)
{
- static int s_iID = 0;
- m_iID = s_iID++;
+ static int s_iID = 0;
+ m_iID = s_iID++;
}
CBaseMuxerInputPin::~CBaseMuxerInputPin()
@@ -50,237 +50,237 @@ CBaseMuxerInputPin::~CBaseMuxerInputPin()
STDMETHODIMP CBaseMuxerInputPin::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
-
- return
- QI(IBaseMuxerRelatedPin)
- QI(IPropertyBag)
- QI(IPropertyBag2)
- QI(IDSMPropertyBag)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ CheckPointer(ppv, E_POINTER);
+
+ return
+ QI(IBaseMuxerRelatedPin)
+ QI(IPropertyBag)
+ QI(IPropertyBag2)
+ QI(IDSMPropertyBag)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
bool CBaseMuxerInputPin::IsSubtitleStream()
{
- return m_mt.majortype == MEDIATYPE_Subtitle || m_mt.majortype == MEDIATYPE_Text;
+ return m_mt.majortype == MEDIATYPE_Subtitle || m_mt.majortype == MEDIATYPE_Text;
}
void CBaseMuxerInputPin::PushPacket(CAutoPtr<MuxerPacket> pPacket)
{
- for (int i = 0; m_pFilter->IsActive() && !m_bFlushing
- && !m_evAcceptPacket.Wait(1)
- && i < 1000;
- i++) {
- ;
- }
+ for (int i = 0; m_pFilter->IsActive() && !m_bFlushing
+ && !m_evAcceptPacket.Wait(1)
+ && i < 1000;
+ i++) {
+ ;
+ }
- if (!m_pFilter->IsActive() || m_bFlushing) {
- return;
- }
+ if (!m_pFilter->IsActive() || m_bFlushing) {
+ return;
+ }
- CAutoLock cAutoLock(&m_csQueue);
+ CAutoLock cAutoLock(&m_csQueue);
- m_queue.AddTail(pPacket);
+ m_queue.AddTail(pPacket);
- if (m_queue.GetCount() >= MAXQUEUESIZE) {
- m_evAcceptPacket.Reset();
- }
+ if (m_queue.GetCount() >= MAXQUEUESIZE) {
+ m_evAcceptPacket.Reset();
+ }
}
CAutoPtr<MuxerPacket> CBaseMuxerInputPin::PopPacket()
{
- CAutoPtr<MuxerPacket> pPacket;
+ CAutoPtr<MuxerPacket> pPacket;
- CAutoLock cAutoLock(&m_csQueue);
+ CAutoLock cAutoLock(&m_csQueue);
- if (m_queue.GetCount()) {
- pPacket = m_queue.RemoveHead();
- }
+ if (m_queue.GetCount()) {
+ pPacket = m_queue.RemoveHead();
+ }
- if (m_queue.GetCount() < MAXQUEUESIZE) {
- m_evAcceptPacket.Set();
- }
+ if (m_queue.GetCount() < MAXQUEUESIZE) {
+ m_evAcceptPacket.Set();
+ }
- return pPacket;
+ return pPacket;
}
HRESULT CBaseMuxerInputPin::CheckMediaType(const CMediaType* pmt)
{
- if (pmt->formattype == FORMAT_WaveFormatEx) {
- WORD wFormatTag = ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag;
- if ((wFormatTag == WAVE_FORMAT_PCM
- || wFormatTag == WAVE_FORMAT_EXTENSIBLE
- || wFormatTag == WAVE_FORMAT_IEEE_FLOAT)
- && pmt->subtype != FOURCCMap(wFormatTag)
- && !(pmt->subtype == MEDIASUBTYPE_PCM && wFormatTag == WAVE_FORMAT_EXTENSIBLE)
- && !(pmt->subtype == MEDIASUBTYPE_PCM && wFormatTag == WAVE_FORMAT_IEEE_FLOAT)
- && pmt->subtype != MEDIASUBTYPE_DVD_LPCM_AUDIO
- && pmt->subtype != MEDIASUBTYPE_DOLBY_AC3
- && pmt->subtype != MEDIASUBTYPE_DTS) {
- return E_INVALIDARG;
- }
- }
-
- return pmt->majortype == MEDIATYPE_Video
- || pmt->majortype == MEDIATYPE_Audio && pmt->formattype != FORMAT_VorbisFormat
- || pmt->majortype == MEDIATYPE_Text && pmt->subtype == MEDIASUBTYPE_NULL && pmt->formattype == FORMAT_None
- || pmt->majortype == MEDIATYPE_Subtitle
- ? S_OK
- : E_INVALIDARG;
+ if (pmt->formattype == FORMAT_WaveFormatEx) {
+ WORD wFormatTag = ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag;
+ if ((wFormatTag == WAVE_FORMAT_PCM
+ || wFormatTag == WAVE_FORMAT_EXTENSIBLE
+ || wFormatTag == WAVE_FORMAT_IEEE_FLOAT)
+ && pmt->subtype != FOURCCMap(wFormatTag)
+ && !(pmt->subtype == MEDIASUBTYPE_PCM && wFormatTag == WAVE_FORMAT_EXTENSIBLE)
+ && !(pmt->subtype == MEDIASUBTYPE_PCM && wFormatTag == WAVE_FORMAT_IEEE_FLOAT)
+ && pmt->subtype != MEDIASUBTYPE_DVD_LPCM_AUDIO
+ && pmt->subtype != MEDIASUBTYPE_DOLBY_AC3
+ && pmt->subtype != MEDIASUBTYPE_DTS) {
+ return E_INVALIDARG;
+ }
+ }
+
+ return pmt->majortype == MEDIATYPE_Video
+ || pmt->majortype == MEDIATYPE_Audio && pmt->formattype != FORMAT_VorbisFormat
+ || pmt->majortype == MEDIATYPE_Text && pmt->subtype == MEDIASUBTYPE_NULL && pmt->formattype == FORMAT_None
+ || pmt->majortype == MEDIATYPE_Subtitle
+ ? S_OK
+ : E_INVALIDARG;
}
HRESULT CBaseMuxerInputPin::BreakConnect()
{
- HRESULT hr = __super::BreakConnect();
- if (FAILED(hr)) {
- return hr;
- }
+ HRESULT hr = __super::BreakConnect();
+ if (FAILED(hr)) {
+ return hr;
+ }
- RemoveAll();
+ RemoveAll();
- // TODO: remove extra disconnected pins, leave one
+ // TODO: remove extra disconnected pins, leave one
- return hr;
+ return hr;
}
HRESULT CBaseMuxerInputPin::CompleteConnect(IPin* pReceivePin)
{
- HRESULT hr = __super::CompleteConnect(pReceivePin);
- if (FAILED(hr)) {
- return hr;
- }
-
- // duration
-
- m_rtDuration = 0;
- CComQIPtr<IMediaSeeking> pMS;
- if ((pMS = GetFilterFromPin(pReceivePin)) || (pMS = pReceivePin)) {
- pMS->GetDuration(&m_rtDuration);
- }
-
- // properties
-
- for (CComPtr<IPin> pPin = pReceivePin; pPin; pPin = GetUpStreamPin(GetFilterFromPin(pPin))) {
- if (CComQIPtr<IDSMPropertyBag> pPB = pPin) {
- ULONG cProperties = 0;
- if (SUCCEEDED(pPB->CountProperties(&cProperties)) && cProperties > 0) {
- for (ULONG iProperty = 0; iProperty < cProperties; iProperty++) {
- PROPBAG2 PropBag;
- memset(&PropBag, 0, sizeof(PropBag));
- ULONG cPropertiesReturned = 0;
- if (FAILED(pPB->GetPropertyInfo(iProperty, 1, &PropBag, &cPropertiesReturned))) {
- continue;
- }
-
- HRESULT hr;
- CComVariant var;
- if (SUCCEEDED(pPB->Read(1, &PropBag, NULL, &var, &hr)) && SUCCEEDED(hr)) {
- SetProperty(PropBag.pstrName, &var);
- }
-
- CoTaskMemFree(PropBag.pstrName);
- }
- }
- }
- }
-
- (static_cast<CBaseMuxerFilter*>(m_pFilter))->AddInput();
-
- return S_OK;
+ HRESULT hr = __super::CompleteConnect(pReceivePin);
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ // duration
+
+ m_rtDuration = 0;
+ CComQIPtr<IMediaSeeking> pMS;
+ if ((pMS = GetFilterFromPin(pReceivePin)) || (pMS = pReceivePin)) {
+ pMS->GetDuration(&m_rtDuration);
+ }
+
+ // properties
+
+ for (CComPtr<IPin> pPin = pReceivePin; pPin; pPin = GetUpStreamPin(GetFilterFromPin(pPin))) {
+ if (CComQIPtr<IDSMPropertyBag> pPB = pPin) {
+ ULONG cProperties = 0;
+ if (SUCCEEDED(pPB->CountProperties(&cProperties)) && cProperties > 0) {
+ for (ULONG iProperty = 0; iProperty < cProperties; iProperty++) {
+ PROPBAG2 PropBag;
+ memset(&PropBag, 0, sizeof(PropBag));
+ ULONG cPropertiesReturned = 0;
+ if (FAILED(pPB->GetPropertyInfo(iProperty, 1, &PropBag, &cPropertiesReturned))) {
+ continue;
+ }
+
+ HRESULT hr;
+ CComVariant var;
+ if (SUCCEEDED(pPB->Read(1, &PropBag, NULL, &var, &hr)) && SUCCEEDED(hr)) {
+ SetProperty(PropBag.pstrName, &var);
+ }
+
+ CoTaskMemFree(PropBag.pstrName);
+ }
+ }
+ }
+ }
+
+ (static_cast<CBaseMuxerFilter*>(m_pFilter))->AddInput();
+
+ return S_OK;
}
HRESULT CBaseMuxerInputPin::Active()
{
- m_rtMaxStart = _I64_MIN;
- m_fEOS = false;
- m_iPacketIndex = 0;
- m_evAcceptPacket.Set();
- return __super::Active();
+ m_rtMaxStart = _I64_MIN;
+ m_fEOS = false;
+ m_iPacketIndex = 0;
+ m_evAcceptPacket.Set();
+ return __super::Active();
}
HRESULT CBaseMuxerInputPin::Inactive()
{
- CAutoLock cAutoLock(&m_csQueue);
- m_queue.RemoveAll();
- return __super::Inactive();
+ CAutoLock cAutoLock(&m_csQueue);
+ m_queue.RemoveAll();
+ return __super::Inactive();
}
STDMETHODIMP CBaseMuxerInputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- return __super::NewSegment(tStart, tStop, dRate);
+ return __super::NewSegment(tStart, tStop, dRate);
}
STDMETHODIMP CBaseMuxerInputPin::Receive(IMediaSample* pSample)
{
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- HRESULT hr = __super::Receive(pSample);
- if (FAILED(hr)) {
- return hr;
- }
+ HRESULT hr = __super::Receive(pSample);
+ if (FAILED(hr)) {
+ return hr;
+ }
- CAutoPtr<MuxerPacket> pPacket(DNew MuxerPacket(this));
+ CAutoPtr<MuxerPacket> pPacket(DNew MuxerPacket(this));
- long len = pSample->GetActualDataLength();
+ long len = pSample->GetActualDataLength();
- BYTE* pData = NULL;
- if (FAILED(pSample->GetPointer(&pData)) || !pData) {
- return S_OK;
- }
+ BYTE* pData = NULL;
+ if (FAILED(pSample->GetPointer(&pData)) || !pData) {
+ return S_OK;
+ }
- pPacket->pData.SetCount(len);
- memcpy(pPacket->pData.GetData(), pData, len);
+ pPacket->pData.SetCount(len);
+ memcpy(pPacket->pData.GetData(), pData, len);
- if (S_OK == pSample->IsSyncPoint() || m_mt.majortype == MEDIATYPE_Audio && !m_mt.bTemporalCompression) {
- pPacket->flags |= MuxerPacket::syncpoint;
- }
+ if (S_OK == pSample->IsSyncPoint() || m_mt.majortype == MEDIATYPE_Audio && !m_mt.bTemporalCompression) {
+ pPacket->flags |= MuxerPacket::syncpoint;
+ }
- if (S_OK == pSample->GetTime(&pPacket->rtStart, &pPacket->rtStop)) {
- pPacket->flags |= MuxerPacket::timevalid;
+ if (S_OK == pSample->GetTime(&pPacket->rtStart, &pPacket->rtStop)) {
+ pPacket->flags |= MuxerPacket::timevalid;
- pPacket->rtStart += m_tStart;
- pPacket->rtStop += m_tStart;
+ pPacket->rtStart += m_tStart;
+ pPacket->rtStop += m_tStart;
- if ((pPacket->flags & MuxerPacket::syncpoint) && pPacket->rtStart < m_rtMaxStart) {
- pPacket->flags &= ~MuxerPacket::syncpoint;
- pPacket->flags |= MuxerPacket::bogus;
- }
+ if ((pPacket->flags & MuxerPacket::syncpoint) && pPacket->rtStart < m_rtMaxStart) {
+ pPacket->flags &= ~MuxerPacket::syncpoint;
+ pPacket->flags |= MuxerPacket::bogus;
+ }
- m_rtMaxStart = max(m_rtMaxStart, pPacket->rtStart);
- } else if (pPacket->flags & MuxerPacket::syncpoint) {
- pPacket->flags &= ~MuxerPacket::syncpoint;
- pPacket->flags |= MuxerPacket::bogus;
- }
+ m_rtMaxStart = max(m_rtMaxStart, pPacket->rtStart);
+ } else if (pPacket->flags & MuxerPacket::syncpoint) {
+ pPacket->flags &= ~MuxerPacket::syncpoint;
+ pPacket->flags |= MuxerPacket::bogus;
+ }
- if (S_OK == pSample->IsDiscontinuity()) {
- pPacket->flags |= MuxerPacket::discontinuity;
- }
+ if (S_OK == pSample->IsDiscontinuity()) {
+ pPacket->flags |= MuxerPacket::discontinuity;
+ }
- pPacket->index = m_iPacketIndex++;
+ pPacket->index = m_iPacketIndex++;
- PushPacket(pPacket);
+ PushPacket(pPacket);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CBaseMuxerInputPin::EndOfStream()
{
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- HRESULT hr = __super::EndOfStream();
- if (FAILED(hr)) {
- return hr;
- }
+ HRESULT hr = __super::EndOfStream();
+ if (FAILED(hr)) {
+ return hr;
+ }
- ASSERT(!m_fEOS);
+ ASSERT(!m_fEOS);
- CAutoPtr<MuxerPacket> pPacket(DNew MuxerPacket(this));
- pPacket->flags |= MuxerPacket::eos;
- PushPacket(pPacket);
+ CAutoPtr<MuxerPacket> pPacket(DNew MuxerPacket(this));
+ pPacket->flags |= MuxerPacket::eos;
+ PushPacket(pPacket);
- m_fEOS = true;
+ m_fEOS = true;
- return hr;
+ return hr;
}
diff --git a/src/filters/muxer/BaseMuxer/BaseMuxerInputPin.h b/src/filters/muxer/BaseMuxer/BaseMuxerInputPin.h
index 6c2670fdf..fefd58439 100644
--- a/src/filters/muxer/BaseMuxer/BaseMuxerInputPin.h
+++ b/src/filters/muxer/BaseMuxer/BaseMuxerInputPin.h
@@ -29,79 +29,79 @@
class CBaseMuxerInputPin;
struct MuxerPacket {
- CBaseMuxerInputPin* pPin;
- REFERENCE_TIME rtStart, rtStop;
- CAtlArray<BYTE> pData;
- enum flag_t {empty = 0, timevalid = 1, syncpoint = 2, discontinuity = 4, eos = 8, bogus = 16};
- DWORD flags;
- int index;
- struct MuxerPacket(CBaseMuxerInputPin* pPin) {
- this->pPin = pPin;
- rtStart = rtStop = _I64_MIN;
- flags = empty;
- index = -1;
- }
- bool IsTimeValid() const {
- return !!(flags & timevalid);
- }
- bool IsSyncPoint() const {
- return !!(flags & syncpoint);
- }
- bool IsDiscontinuity() const {
- return !!(flags & discontinuity);
- }
- bool IsEOS() const {
- return !!(flags & eos);
- }
- bool IsBogus() const {
- return !!(flags & bogus);
- }
+ CBaseMuxerInputPin* pPin;
+ REFERENCE_TIME rtStart, rtStop;
+ CAtlArray<BYTE> pData;
+ enum flag_t {empty = 0, timevalid = 1, syncpoint = 2, discontinuity = 4, eos = 8, bogus = 16};
+ DWORD flags;
+ int index;
+ struct MuxerPacket(CBaseMuxerInputPin* pPin) {
+ this->pPin = pPin;
+ rtStart = rtStop = _I64_MIN;
+ flags = empty;
+ index = -1;
+ }
+ bool IsTimeValid() const {
+ return !!(flags & timevalid);
+ }
+ bool IsSyncPoint() const {
+ return !!(flags & syncpoint);
+ }
+ bool IsDiscontinuity() const {
+ return !!(flags & discontinuity);
+ }
+ bool IsEOS() const {
+ return !!(flags & eos);
+ }
+ bool IsBogus() const {
+ return !!(flags & bogus);
+ }
};
class CBaseMuxerInputPin : public CBaseInputPin, public CBaseMuxerRelatedPin, public IDSMPropertyBagImpl
{
private:
- int m_iID;
+ int m_iID;
- CCritSec m_csReceive;
- REFERENCE_TIME m_rtMaxStart, m_rtDuration;
- bool m_fEOS;
- int m_iPacketIndex;
+ CCritSec m_csReceive;
+ REFERENCE_TIME m_rtMaxStart, m_rtDuration;
+ bool m_fEOS;
+ int m_iPacketIndex;
- CCritSec m_csQueue;
- CAutoPtrList<MuxerPacket> m_queue;
- void PushPacket(CAutoPtr<MuxerPacket> pPacket);
- CAutoPtr<MuxerPacket> PopPacket();
- CAMEvent m_evAcceptPacket;
+ CCritSec m_csQueue;
+ CAutoPtrList<MuxerPacket> m_queue;
+ void PushPacket(CAutoPtr<MuxerPacket> pPacket);
+ CAutoPtr<MuxerPacket> PopPacket();
+ CAMEvent m_evAcceptPacket;
- friend class CBaseMuxerFilter;
+ friend class CBaseMuxerFilter;
public:
- CBaseMuxerInputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- virtual ~CBaseMuxerInputPin();
+ CBaseMuxerInputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ virtual ~CBaseMuxerInputPin();
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- REFERENCE_TIME GetDuration() {
- return m_rtDuration;
- }
- int GetID() {
- return m_iID;
- }
- CMediaType& CurrentMediaType() {
- return m_mt;
- }
- bool IsSubtitleStream();
+ REFERENCE_TIME GetDuration() {
+ return m_rtDuration;
+ }
+ int GetID() {
+ return m_iID;
+ }
+ CMediaType& CurrentMediaType() {
+ return m_mt;
+ }
+ bool IsSubtitleStream();
- HRESULT CheckMediaType(const CMediaType* pmt);
- HRESULT BreakConnect();
- HRESULT CompleteConnect(IPin* pReceivePin);
+ HRESULT CheckMediaType(const CMediaType* pmt);
+ HRESULT BreakConnect();
+ HRESULT CompleteConnect(IPin* pReceivePin);
- HRESULT Active();
- HRESULT Inactive();
+ HRESULT Active();
+ HRESULT Inactive();
- STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
- STDMETHODIMP Receive(IMediaSample* pSample);
- STDMETHODIMP EndOfStream();
+ STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ STDMETHODIMP Receive(IMediaSample* pSample);
+ STDMETHODIMP EndOfStream();
};
diff --git a/src/filters/muxer/BaseMuxer/BaseMuxerOutputPin.cpp b/src/filters/muxer/BaseMuxer/BaseMuxerOutputPin.cpp
index ec5abf339..baae85b9c 100644
--- a/src/filters/muxer/BaseMuxer/BaseMuxerOutputPin.cpp
+++ b/src/filters/muxer/BaseMuxer/BaseMuxerOutputPin.cpp
@@ -36,88 +36,88 @@
//
CBaseMuxerOutputPin::CBaseMuxerOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBaseOutputPin(_T("CBaseMuxerOutputPin"), pFilter, pLock, phr, pName)
+ : CBaseOutputPin(_T("CBaseMuxerOutputPin"), pFilter, pLock, phr, pName)
{
}
IBitStream* CBaseMuxerOutputPin::GetBitStream()
{
- if (!m_pBitStream) {
- if (CComQIPtr<IStream> pStream = GetConnected()) {
- m_pBitStream = DNew CBitStream(pStream, true);
- }
- }
+ if (!m_pBitStream) {
+ if (CComQIPtr<IStream> pStream = GetConnected()) {
+ m_pBitStream = DNew CBitStream(pStream, true);
+ }
+ }
- return m_pBitStream;
+ return m_pBitStream;
}
HRESULT CBaseMuxerOutputPin::BreakConnect()
{
- m_pBitStream = NULL;
+ m_pBitStream = NULL;
- return __super::BreakConnect();
+ return __super::BreakConnect();
}
HRESULT CBaseMuxerOutputPin::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties)
{
- ASSERT(pAlloc);
- ASSERT(pProperties);
+ ASSERT(pAlloc);
+ ASSERT(pProperties);
- HRESULT hr = NOERROR;
+ HRESULT hr = NOERROR;
- pProperties->cBuffers = 1;
- pProperties->cbBuffer = 1;
+ pProperties->cBuffers = 1;
+ pProperties->cbBuffer = 1;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- if (Actual.cbBuffer < pProperties->cbBuffer) {
- return E_FAIL;
- }
- ASSERT(Actual.cBuffers == pProperties->cBuffers);
+ if (Actual.cbBuffer < pProperties->cbBuffer) {
+ return E_FAIL;
+ }
+ ASSERT(Actual.cBuffers == pProperties->cBuffers);
- return NOERROR;
+ return NOERROR;
}
HRESULT CBaseMuxerOutputPin::CheckMediaType(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Stream && pmt->subtype == MEDIASUBTYPE_NULL
- ? S_OK
- : E_INVALIDARG;
+ return pmt->majortype == MEDIATYPE_Stream && pmt->subtype == MEDIASUBTYPE_NULL
+ ? S_OK
+ : E_INVALIDARG;
}
HRESULT CBaseMuxerOutputPin::GetMediaType(int iPosition, CMediaType* pmt)
{
- CAutoLock cAutoLock(m_pLock);
-
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > 0) {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- pmt->ResetFormatBuffer();
- pmt->InitMediaType();
- pmt->majortype = MEDIATYPE_Stream;
- pmt->subtype = MEDIASUBTYPE_NULL;
- pmt->formattype = FORMAT_None;
-
- return S_OK;
+ CAutoLock cAutoLock(m_pLock);
+
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > 0) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ pmt->ResetFormatBuffer();
+ pmt->InitMediaType();
+ pmt->majortype = MEDIATYPE_Stream;
+ pmt->subtype = MEDIASUBTYPE_NULL;
+ pmt->formattype = FORMAT_None;
+
+ return S_OK;
}
HRESULT CBaseMuxerOutputPin::DeliverEndOfStream()
{
- m_pBitStream = NULL;
+ m_pBitStream = NULL;
- return __super::DeliverEndOfStream();
+ return __super::DeliverEndOfStream();
}
STDMETHODIMP CBaseMuxerOutputPin::Notify(IBaseFilter* pSender, Quality q)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
//
@@ -125,364 +125,364 @@ STDMETHODIMP CBaseMuxerOutputPin::Notify(IBaseFilter* pSender, Quality q)
//
CBaseMuxerRawOutputPin::CBaseMuxerRawOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBaseMuxerOutputPin(pName, pFilter, pLock, phr)
+ : CBaseMuxerOutputPin(pName, pFilter, pLock, phr)
{
}
STDMETHODIMP CBaseMuxerRawOutputPin::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(IBaseMuxerRelatedPin)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IBaseMuxerRelatedPin)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
void CBaseMuxerRawOutputPin::MuxHeader(const CMediaType& mt)
{
- CComQIPtr<IBitStream> pBitStream = GetBitStream();
- if (!pBitStream) {
- return;
- }
-
- const BYTE utf8bom[3] = {0xef, 0xbb, 0xbf};
-
- if ((mt.subtype == FOURCCMap('1CVA') || mt.subtype == FOURCCMap('1cva')) && mt.formattype == FORMAT_MPEG2_VIDEO) {
- MPEG2VIDEOINFO* vih = (MPEG2VIDEOINFO*)mt.Format();
-
- for (DWORD i = 0; i < vih->cbSequenceHeader-2; i += 2) {
- pBitStream->BitWrite(0x00000001, 32);
- WORD size = (((BYTE*)vih->dwSequenceHeader)[i+0]<<8) | ((BYTE*)vih->dwSequenceHeader)[i+1];
- pBitStream->ByteWrite(&((BYTE*)vih->dwSequenceHeader)[i+2], size);
- i += size;
- }
- } else if (mt.subtype == MEDIASUBTYPE_UTF8) {
- pBitStream->ByteWrite(utf8bom, sizeof(utf8bom));
- } else if (mt.subtype == MEDIASUBTYPE_SSA || mt.subtype == MEDIASUBTYPE_ASS || mt.subtype == MEDIASUBTYPE_ASS2) {
- SUBTITLEINFO* si = (SUBTITLEINFO*)mt.Format();
- BYTE* p = (BYTE*)si + si->dwOffset;
-
- if (memcmp(utf8bom, p, 3) != 0) {
- pBitStream->ByteWrite(utf8bom, sizeof(utf8bom));
- }
-
- CStringA str((char*)p, mt.FormatLength() - (p - mt.Format()));
- pBitStream->StrWrite(str + '\n', true);
-
- if (str.Find("[Events]") < 0) {
- pBitStream->StrWrite("\n\n[Events]\n", true);
- }
- } else if (mt.subtype == MEDIASUBTYPE_VOBSUB) {
- m_idx.RemoveAll();
- } else if (mt.majortype == MEDIATYPE_Audio
- && (mt.subtype == MEDIASUBTYPE_PCM
- || mt.subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO
- || mt.subtype == FOURCCMap(WAVE_FORMAT_EXTENSIBLE)
- || mt.subtype == FOURCCMap(WAVE_FORMAT_IEEE_FLOAT))
- && mt.formattype == FORMAT_WaveFormatEx) {
- pBitStream->BitWrite('RIFF', 32);
- pBitStream->BitWrite(0, 32); // file length - 8, set later
- pBitStream->BitWrite('WAVE', 32);
-
- pBitStream->BitWrite('fmt ', 32);
- pBitStream->ByteWrite(&mt.cbFormat, 4);
- pBitStream->ByteWrite(mt.pbFormat, mt.cbFormat);
-
- pBitStream->BitWrite('data', 32);
- pBitStream->BitWrite(0, 32); // data length, set later
- }
+ CComQIPtr<IBitStream> pBitStream = GetBitStream();
+ if (!pBitStream) {
+ return;
+ }
+
+ const BYTE utf8bom[3] = {0xef, 0xbb, 0xbf};
+
+ if ((mt.subtype == FOURCCMap('1CVA') || mt.subtype == FOURCCMap('1cva')) && mt.formattype == FORMAT_MPEG2_VIDEO) {
+ MPEG2VIDEOINFO* vih = (MPEG2VIDEOINFO*)mt.Format();
+
+ for (DWORD i = 0; i < vih->cbSequenceHeader - 2; i += 2) {
+ pBitStream->BitWrite(0x00000001, 32);
+ WORD size = (((BYTE*)vih->dwSequenceHeader)[i + 0] << 8) | ((BYTE*)vih->dwSequenceHeader)[i + 1];
+ pBitStream->ByteWrite(&((BYTE*)vih->dwSequenceHeader)[i + 2], size);
+ i += size;
+ }
+ } else if (mt.subtype == MEDIASUBTYPE_UTF8) {
+ pBitStream->ByteWrite(utf8bom, sizeof(utf8bom));
+ } else if (mt.subtype == MEDIASUBTYPE_SSA || mt.subtype == MEDIASUBTYPE_ASS || mt.subtype == MEDIASUBTYPE_ASS2) {
+ SUBTITLEINFO* si = (SUBTITLEINFO*)mt.Format();
+ BYTE* p = (BYTE*)si + si->dwOffset;
+
+ if (memcmp(utf8bom, p, 3) != 0) {
+ pBitStream->ByteWrite(utf8bom, sizeof(utf8bom));
+ }
+
+ CStringA str((char*)p, mt.FormatLength() - (p - mt.Format()));
+ pBitStream->StrWrite(str + '\n', true);
+
+ if (str.Find("[Events]") < 0) {
+ pBitStream->StrWrite("\n\n[Events]\n", true);
+ }
+ } else if (mt.subtype == MEDIASUBTYPE_VOBSUB) {
+ m_idx.RemoveAll();
+ } else if (mt.majortype == MEDIATYPE_Audio
+ && (mt.subtype == MEDIASUBTYPE_PCM
+ || mt.subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO
+ || mt.subtype == FOURCCMap(WAVE_FORMAT_EXTENSIBLE)
+ || mt.subtype == FOURCCMap(WAVE_FORMAT_IEEE_FLOAT))
+ && mt.formattype == FORMAT_WaveFormatEx) {
+ pBitStream->BitWrite('RIFF', 32);
+ pBitStream->BitWrite(0, 32); // file length - 8, set later
+ pBitStream->BitWrite('WAVE', 32);
+
+ pBitStream->BitWrite('fmt ', 32);
+ pBitStream->ByteWrite(&mt.cbFormat, 4);
+ pBitStream->ByteWrite(mt.pbFormat, mt.cbFormat);
+
+ pBitStream->BitWrite('data', 32);
+ pBitStream->BitWrite(0, 32); // data length, set later
+ }
}
void CBaseMuxerRawOutputPin::MuxPacket(const CMediaType& mt, const MuxerPacket* pPacket)
{
- CComQIPtr<IBitStream> pBitStream = GetBitStream();
- if (!pBitStream) {
- return;
- }
-
- const BYTE* pData = pPacket->pData.GetData();
- const int DataSize = int(pPacket->pData.GetCount());
-
- if (mt.subtype == MEDIASUBTYPE_AAC && mt.formattype == FORMAT_WaveFormatEx) {
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
-
- int profile = 0;
-
- int srate_idx = 11;
- if (92017 <= wfe->nSamplesPerSec) {
- srate_idx = 0;
- } else if (75132 <= wfe->nSamplesPerSec) {
- srate_idx = 1;
- } else if (55426 <= wfe->nSamplesPerSec) {
- srate_idx = 2;
- } else if (46009 <= wfe->nSamplesPerSec) {
- srate_idx = 3;
- } else if (37566 <= wfe->nSamplesPerSec) {
- srate_idx = 4;
- } else if (27713 <= wfe->nSamplesPerSec) {
- srate_idx = 5;
- } else if (23004 <= wfe->nSamplesPerSec) {
- srate_idx = 6;
- } else if (18783 <= wfe->nSamplesPerSec) {
- srate_idx = 7;
- } else if (13856 <= wfe->nSamplesPerSec) {
- srate_idx = 8;
- } else if (11502 <= wfe->nSamplesPerSec) {
- srate_idx = 9;
- } else if (9391 <= wfe->nSamplesPerSec) {
- srate_idx = 10;
- }
-
- int channels = wfe->nChannels;
-
- if (wfe->cbSize >= 2) {
- BYTE* p = (BYTE*)(wfe+1);
- profile = (p[0]>>3)-1;
- srate_idx = ((p[0]&7)<<1)|((p[1]&0x80)>>7);
- channels = (p[1]>>3)&15;
- }
-
- int len = (DataSize + 7) & 0x1fff;
-
- BYTE hdr[7] = {0xff, 0xf9};
- hdr[2] = (profile<<6) | (srate_idx<<2) | ((channels&4)>>2);
- hdr[3] = ((channels&3)<<6) | (len>>11);
- hdr[4] = (len>>3)&0xff;
- hdr[5] = ((len&7)<<5) | 0x1f;
- hdr[6] = 0xfc;
-
- pBitStream->ByteWrite(hdr, sizeof(hdr));
- } else if ((mt.subtype == FOURCCMap('1CVA') || mt.subtype == FOURCCMap('1cva')) && mt.formattype == FORMAT_MPEG2_VIDEO) {
- const BYTE* p = pData;
- int i = DataSize;
-
- while (i >= 4) {
- DWORD len = (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
-
- i -= len + 4;
- p += len + 4;
- }
-
- if (i == 0) {
- p = pData;
- i = DataSize;
-
- while (i >= 4) {
- DWORD len = (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
-
- pBitStream->BitWrite(0x00000001, 32);
-
- p += 4;
- i -= 4;
-
- if (len > (DWORD)i || len == 1) {
- len = i;
- ASSERT(0);
- }
-
- pBitStream->ByteWrite(p, len);
-
- p += len;
- i -= len;
- }
-
- return;
- }
- } else if (mt.subtype == MEDIASUBTYPE_UTF8 || mt.majortype == MEDIATYPE_Text) {
- CStringA str((char*)pData, DataSize);
- str.Trim();
- if (str.IsEmpty()) {
- return;
- }
-
- DVD_HMSF_TIMECODE start = RT2HMSF(pPacket->rtStart, 25);
- DVD_HMSF_TIMECODE stop = RT2HMSF(pPacket->rtStop, 25);
-
- str.Format("%d\n%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n%s\n\n",
- pPacket->index+1,
- start.bHours, start.bMinutes, start.bSeconds, (int)((pPacket->rtStart/10000)%1000),
- stop.bHours, stop.bMinutes, stop.bSeconds, (int)((pPacket->rtStop/10000)%1000),
- CStringA(str));
-
- pBitStream->StrWrite(str, true);
-
- return;
- } else if (mt.subtype == MEDIASUBTYPE_SSA || mt.subtype == MEDIASUBTYPE_ASS || mt.subtype == MEDIASUBTYPE_ASS2) {
- CStringA str((char*)pData, DataSize);
- str.Trim();
- if (str.IsEmpty()) {
- return;
- }
-
- DVD_HMSF_TIMECODE start = RT2HMSF(pPacket->rtStart, 25);
- DVD_HMSF_TIMECODE stop = RT2HMSF(pPacket->rtStop, 25);
-
- size_t fields = mt.subtype == MEDIASUBTYPE_ASS2 ? 10 : 9;
-
- CAtlList<CStringA> sl;
- Explode(str, sl, ',', fields);
- if (sl.GetCount() < fields) {
- return;
- }
-
- CStringA readorder = sl.RemoveHead(); // TODO
- CStringA layer = sl.RemoveHead();
- CStringA style = sl.RemoveHead();
- CStringA actor = sl.RemoveHead();
- CStringA left = sl.RemoveHead();
- CStringA right = sl.RemoveHead();
- CStringA top = sl.RemoveHead();
- if (fields == 10) {
- top += ',' + sl.RemoveHead(); // bottom
- }
- CStringA effect = sl.RemoveHead();
- str = sl.RemoveHead();
-
- if (mt.subtype == MEDIASUBTYPE_SSA) {
- layer = "Marked=0";
- }
-
- str.Format("Dialogue: %s,%d:%02d:%02d.%02d,%d:%02d:%02d.%02d,%s,%s,%s,%s,%s,%s,%s\n",
- layer,
- start.bHours, start.bMinutes, start.bSeconds, (int)((pPacket->rtStart/100000)%100),
- stop.bHours, stop.bMinutes, stop.bSeconds, (int)((pPacket->rtStop/100000)%100),
- style, actor, left, right, top, effect,
- CStringA(str));
-
- pBitStream->StrWrite(str, true);
-
- return;
- } else if (mt.subtype == MEDIASUBTYPE_VOBSUB) {
- bool fTimeValid = pPacket->IsTimeValid();
-
- if (fTimeValid) {
- idx_t i;
- i.rt = pPacket->rtStart;
- i.fp = pBitStream->GetPos();
- m_idx.AddTail(i);
- }
-
- int DataSizeLeft = DataSize;
-
- while (DataSizeLeft > 0) {
- int BytesAvail = 0x7ec - (fTimeValid ? 9 : 4);
- int Size = min(BytesAvail, DataSizeLeft);
- int Padding = 0x800 - Size - 20 - (fTimeValid ? 9 : 4);
-
- pBitStream->BitWrite(0x000001ba, 32);
- pBitStream->BitWrite(0x440004000401ui64, 48);
- pBitStream->BitWrite(0x000003f8, 32);
- pBitStream->BitWrite(0x000001bd, 32);
-
- if (fTimeValid) {
- pBitStream->BitWrite(Size+9, 16);
- pBitStream->BitWrite(0x8180052100010001ui64, 64);
- } else {
- pBitStream->BitWrite(Size+4, 16);
- pBitStream->BitWrite(0x810000, 24);
- }
-
- pBitStream->BitWrite(0x20, 8);
-
- pBitStream->ByteWrite(pData, Size);
-
- pData += Size;
- DataSizeLeft -= Size;
-
- if (Padding > 0) {
- Padding -= 6;
- ASSERT(Padding >= 0);
- pBitStream->BitWrite(0x000001be, 32);
- pBitStream->BitWrite(Padding, 16);
- while (Padding-- > 0) {
- pBitStream->BitWrite(0xff, 8);
- }
- }
-
- fTimeValid = false;
- }
-
- return;
- } else if (mt.subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO) {
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
-
- // This code is probably totally broken for anything but 16 bits
- for (int i = 0, bps = wfe->wBitsPerSample/8; i < DataSize; i += bps)
- for (int j = bps-1; j >= 0; j--) {
- pBitStream->BitWrite(pData[i+j], 8);
- }
-
- return;
- }
- // else // TODO: restore more streams (vorbis to ogg)
-
- pBitStream->ByteWrite(pData, DataSize);
+ CComQIPtr<IBitStream> pBitStream = GetBitStream();
+ if (!pBitStream) {
+ return;
+ }
+
+ const BYTE* pData = pPacket->pData.GetData();
+ const int DataSize = int(pPacket->pData.GetCount());
+
+ if (mt.subtype == MEDIASUBTYPE_AAC && mt.formattype == FORMAT_WaveFormatEx) {
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
+
+ int profile = 0;
+
+ int srate_idx = 11;
+ if (92017 <= wfe->nSamplesPerSec) {
+ srate_idx = 0;
+ } else if (75132 <= wfe->nSamplesPerSec) {
+ srate_idx = 1;
+ } else if (55426 <= wfe->nSamplesPerSec) {
+ srate_idx = 2;
+ } else if (46009 <= wfe->nSamplesPerSec) {
+ srate_idx = 3;
+ } else if (37566 <= wfe->nSamplesPerSec) {
+ srate_idx = 4;
+ } else if (27713 <= wfe->nSamplesPerSec) {
+ srate_idx = 5;
+ } else if (23004 <= wfe->nSamplesPerSec) {
+ srate_idx = 6;
+ } else if (18783 <= wfe->nSamplesPerSec) {
+ srate_idx = 7;
+ } else if (13856 <= wfe->nSamplesPerSec) {
+ srate_idx = 8;
+ } else if (11502 <= wfe->nSamplesPerSec) {
+ srate_idx = 9;
+ } else if (9391 <= wfe->nSamplesPerSec) {
+ srate_idx = 10;
+ }
+
+ int channels = wfe->nChannels;
+
+ if (wfe->cbSize >= 2) {
+ BYTE* p = (BYTE*)(wfe + 1);
+ profile = (p[0] >> 3) - 1;
+ srate_idx = ((p[0] & 7) << 1) | ((p[1] & 0x80) >> 7);
+ channels = (p[1] >> 3) & 15;
+ }
+
+ int len = (DataSize + 7) & 0x1fff;
+
+ BYTE hdr[7] = {0xff, 0xf9};
+ hdr[2] = (profile << 6) | (srate_idx << 2) | ((channels & 4) >> 2);
+ hdr[3] = ((channels & 3) << 6) | (len >> 11);
+ hdr[4] = (len >> 3) & 0xff;
+ hdr[5] = ((len & 7) << 5) | 0x1f;
+ hdr[6] = 0xfc;
+
+ pBitStream->ByteWrite(hdr, sizeof(hdr));
+ } else if ((mt.subtype == FOURCCMap('1CVA') || mt.subtype == FOURCCMap('1cva')) && mt.formattype == FORMAT_MPEG2_VIDEO) {
+ const BYTE* p = pData;
+ int i = DataSize;
+
+ while (i >= 4) {
+ DWORD len = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
+
+ i -= len + 4;
+ p += len + 4;
+ }
+
+ if (i == 0) {
+ p = pData;
+ i = DataSize;
+
+ while (i >= 4) {
+ DWORD len = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
+
+ pBitStream->BitWrite(0x00000001, 32);
+
+ p += 4;
+ i -= 4;
+
+ if (len > (DWORD)i || len == 1) {
+ len = i;
+ ASSERT(0);
+ }
+
+ pBitStream->ByteWrite(p, len);
+
+ p += len;
+ i -= len;
+ }
+
+ return;
+ }
+ } else if (mt.subtype == MEDIASUBTYPE_UTF8 || mt.majortype == MEDIATYPE_Text) {
+ CStringA str((char*)pData, DataSize);
+ str.Trim();
+ if (str.IsEmpty()) {
+ return;
+ }
+
+ DVD_HMSF_TIMECODE start = RT2HMSF(pPacket->rtStart, 25);
+ DVD_HMSF_TIMECODE stop = RT2HMSF(pPacket->rtStop, 25);
+
+ str.Format("%d\n%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n%s\n\n",
+ pPacket->index + 1,
+ start.bHours, start.bMinutes, start.bSeconds, (int)((pPacket->rtStart / 10000) % 1000),
+ stop.bHours, stop.bMinutes, stop.bSeconds, (int)((pPacket->rtStop / 10000) % 1000),
+ CStringA(str));
+
+ pBitStream->StrWrite(str, true);
+
+ return;
+ } else if (mt.subtype == MEDIASUBTYPE_SSA || mt.subtype == MEDIASUBTYPE_ASS || mt.subtype == MEDIASUBTYPE_ASS2) {
+ CStringA str((char*)pData, DataSize);
+ str.Trim();
+ if (str.IsEmpty()) {
+ return;
+ }
+
+ DVD_HMSF_TIMECODE start = RT2HMSF(pPacket->rtStart, 25);
+ DVD_HMSF_TIMECODE stop = RT2HMSF(pPacket->rtStop, 25);
+
+ size_t fields = mt.subtype == MEDIASUBTYPE_ASS2 ? 10 : 9;
+
+ CAtlList<CStringA> sl;
+ Explode(str, sl, ',', fields);
+ if (sl.GetCount() < fields) {
+ return;
+ }
+
+ CStringA readorder = sl.RemoveHead(); // TODO
+ CStringA layer = sl.RemoveHead();
+ CStringA style = sl.RemoveHead();
+ CStringA actor = sl.RemoveHead();
+ CStringA left = sl.RemoveHead();
+ CStringA right = sl.RemoveHead();
+ CStringA top = sl.RemoveHead();
+ if (fields == 10) {
+ top += ',' + sl.RemoveHead(); // bottom
+ }
+ CStringA effect = sl.RemoveHead();
+ str = sl.RemoveHead();
+
+ if (mt.subtype == MEDIASUBTYPE_SSA) {
+ layer = "Marked=0";
+ }
+
+ str.Format("Dialogue: %s,%d:%02d:%02d.%02d,%d:%02d:%02d.%02d,%s,%s,%s,%s,%s,%s,%s\n",
+ layer,
+ start.bHours, start.bMinutes, start.bSeconds, (int)((pPacket->rtStart / 100000) % 100),
+ stop.bHours, stop.bMinutes, stop.bSeconds, (int)((pPacket->rtStop / 100000) % 100),
+ style, actor, left, right, top, effect,
+ CStringA(str));
+
+ pBitStream->StrWrite(str, true);
+
+ return;
+ } else if (mt.subtype == MEDIASUBTYPE_VOBSUB) {
+ bool fTimeValid = pPacket->IsTimeValid();
+
+ if (fTimeValid) {
+ idx_t i;
+ i.rt = pPacket->rtStart;
+ i.fp = pBitStream->GetPos();
+ m_idx.AddTail(i);
+ }
+
+ int DataSizeLeft = DataSize;
+
+ while (DataSizeLeft > 0) {
+ int BytesAvail = 0x7ec - (fTimeValid ? 9 : 4);
+ int Size = min(BytesAvail, DataSizeLeft);
+ int Padding = 0x800 - Size - 20 - (fTimeValid ? 9 : 4);
+
+ pBitStream->BitWrite(0x000001ba, 32);
+ pBitStream->BitWrite(0x440004000401ui64, 48);
+ pBitStream->BitWrite(0x000003f8, 32);
+ pBitStream->BitWrite(0x000001bd, 32);
+
+ if (fTimeValid) {
+ pBitStream->BitWrite(Size + 9, 16);
+ pBitStream->BitWrite(0x8180052100010001ui64, 64);
+ } else {
+ pBitStream->BitWrite(Size + 4, 16);
+ pBitStream->BitWrite(0x810000, 24);
+ }
+
+ pBitStream->BitWrite(0x20, 8);
+
+ pBitStream->ByteWrite(pData, Size);
+
+ pData += Size;
+ DataSizeLeft -= Size;
+
+ if (Padding > 0) {
+ Padding -= 6;
+ ASSERT(Padding >= 0);
+ pBitStream->BitWrite(0x000001be, 32);
+ pBitStream->BitWrite(Padding, 16);
+ while (Padding-- > 0) {
+ pBitStream->BitWrite(0xff, 8);
+ }
+ }
+
+ fTimeValid = false;
+ }
+
+ return;
+ } else if (mt.subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO) {
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
+
+ // This code is probably totally broken for anything but 16 bits
+ for (int i = 0, bps = wfe->wBitsPerSample / 8; i < DataSize; i += bps)
+ for (int j = bps - 1; j >= 0; j--) {
+ pBitStream->BitWrite(pData[i + j], 8);
+ }
+
+ return;
+ }
+ // else // TODO: restore more streams (vorbis to ogg)
+
+ pBitStream->ByteWrite(pData, DataSize);
}
void CBaseMuxerRawOutputPin::MuxFooter(const CMediaType& mt)
{
- CComQIPtr<IBitStream> pBitStream = GetBitStream();
- if (!pBitStream) {
- return;
- }
-
- if (mt.majortype == MEDIATYPE_Audio
- && (mt.subtype == MEDIASUBTYPE_PCM
- || mt.subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO
- || mt.subtype == FOURCCMap(WAVE_FORMAT_EXTENSIBLE)
- || mt.subtype == FOURCCMap(WAVE_FORMAT_IEEE_FLOAT))
- && mt.formattype == FORMAT_WaveFormatEx) {
- pBitStream->BitFlush();
-
- ASSERT(pBitStream->GetPos() <= 0xffffffff);
- UINT32 size = (UINT32)pBitStream->GetPos();
-
- size -= 8;
- pBitStream->Seek(4);
- pBitStream->ByteWrite(&size, 4);
-
- size -= sizeof(RIFFLIST) + sizeof(RIFFCHUNK) + mt.FormatLength();
- pBitStream->Seek(sizeof(RIFFLIST) + sizeof(RIFFCHUNK) + mt.FormatLength() + 4);
- pBitStream->ByteWrite(&size, 4);
- } else if (mt.subtype == MEDIASUBTYPE_VOBSUB) {
- if (CComQIPtr<IFileSinkFilter> pFSF = GetFilterFromPin(GetConnected())) {
- WCHAR* fn = NULL;
- if (SUCCEEDED(pFSF->GetCurFile(&fn, NULL))) {
- CPathW p(fn);
- p.RenameExtension(L".idx");
- CoTaskMemFree(fn);
-
- FILE* f;
- if (!_tfopen_s(&f, CString((LPCWSTR)p), _T("w"))) {
- SUBTITLEINFO* si = (SUBTITLEINFO*)mt.Format();
-
- _ftprintf_s(f, _T("%s\n"), _T("# VobSub index file, v7 (do not modify this line!)"));
-
- fwrite(mt.Format() + si->dwOffset, mt.FormatLength() - si->dwOffset, 1, f);
-
- CString iso6391 = ISO6392To6391(si->IsoLang);
- if (iso6391.IsEmpty()) {
- iso6391 = _T("--");
- }
- _ftprintf_s(f, _T("\nlangidx: 0\n\nid: %s, index: 0\n"), iso6391);
-
- CString alt = CString(CStringW(si->TrackName));
- if (!alt.IsEmpty()) {
- _ftprintf_s(f, _T("alt: %s\n"), alt);
- }
-
- POSITION pos = m_idx.GetHeadPosition();
- while (pos) {
- const idx_t& i = m_idx.GetNext(pos);
- DVD_HMSF_TIMECODE start = RT2HMSF(i.rt, 25);
- _ftprintf_s(f, _T("timestamp: %02d:%02d:%02d:%03d, filepos: %09I64x\n"),
- start.bHours, start.bMinutes, start.bSeconds, (int)((i.rt/10000)%1000),
- i.fp);
- }
-
- fclose(f);
- }
- }
- }
- }
+ CComQIPtr<IBitStream> pBitStream = GetBitStream();
+ if (!pBitStream) {
+ return;
+ }
+
+ if (mt.majortype == MEDIATYPE_Audio
+ && (mt.subtype == MEDIASUBTYPE_PCM
+ || mt.subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO
+ || mt.subtype == FOURCCMap(WAVE_FORMAT_EXTENSIBLE)
+ || mt.subtype == FOURCCMap(WAVE_FORMAT_IEEE_FLOAT))
+ && mt.formattype == FORMAT_WaveFormatEx) {
+ pBitStream->BitFlush();
+
+ ASSERT(pBitStream->GetPos() <= 0xffffffff);
+ UINT32 size = (UINT32)pBitStream->GetPos();
+
+ size -= 8;
+ pBitStream->Seek(4);
+ pBitStream->ByteWrite(&size, 4);
+
+ size -= sizeof(RIFFLIST) + sizeof(RIFFCHUNK) + mt.FormatLength();
+ pBitStream->Seek(sizeof(RIFFLIST) + sizeof(RIFFCHUNK) + mt.FormatLength() + 4);
+ pBitStream->ByteWrite(&size, 4);
+ } else if (mt.subtype == MEDIASUBTYPE_VOBSUB) {
+ if (CComQIPtr<IFileSinkFilter> pFSF = GetFilterFromPin(GetConnected())) {
+ WCHAR* fn = NULL;
+ if (SUCCEEDED(pFSF->GetCurFile(&fn, NULL))) {
+ CPathW p(fn);
+ p.RenameExtension(L".idx");
+ CoTaskMemFree(fn);
+
+ FILE* f;
+ if (!_tfopen_s(&f, CString((LPCWSTR)p), _T("w"))) {
+ SUBTITLEINFO* si = (SUBTITLEINFO*)mt.Format();
+
+ _ftprintf_s(f, _T("%s\n"), _T("# VobSub index file, v7 (do not modify this line!)"));
+
+ fwrite(mt.Format() + si->dwOffset, mt.FormatLength() - si->dwOffset, 1, f);
+
+ CString iso6391 = ISO6392To6391(si->IsoLang);
+ if (iso6391.IsEmpty()) {
+ iso6391 = _T("--");
+ }
+ _ftprintf_s(f, _T("\nlangidx: 0\n\nid: %s, index: 0\n"), iso6391);
+
+ CString alt = CString(CStringW(si->TrackName));
+ if (!alt.IsEmpty()) {
+ _ftprintf_s(f, _T("alt: %s\n"), alt);
+ }
+
+ POSITION pos = m_idx.GetHeadPosition();
+ while (pos) {
+ const idx_t& i = m_idx.GetNext(pos);
+ DVD_HMSF_TIMECODE start = RT2HMSF(i.rt, 25);
+ _ftprintf_s(f, _T("timestamp: %02d:%02d:%02d:%03d, filepos: %09I64x\n"),
+ start.bHours, start.bMinutes, start.bSeconds, (int)((i.rt / 10000) % 1000),
+ i.fp);
+ }
+
+ fclose(f);
+ }
+ }
+ }
+ }
}
diff --git a/src/filters/muxer/BaseMuxer/BaseMuxerOutputPin.h b/src/filters/muxer/BaseMuxer/BaseMuxerOutputPin.h
index 995ea6bc0..3a0d1c25f 100644
--- a/src/filters/muxer/BaseMuxer/BaseMuxerOutputPin.h
+++ b/src/filters/muxer/BaseMuxer/BaseMuxerOutputPin.h
@@ -29,42 +29,42 @@
class CBaseMuxerOutputPin : public CBaseOutputPin
{
- CComPtr<IBitStream> m_pBitStream;
+ CComPtr<IBitStream> m_pBitStream;
public:
- CBaseMuxerOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- virtual ~CBaseMuxerOutputPin() {}
+ CBaseMuxerOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ virtual ~CBaseMuxerOutputPin() {}
- IBitStream* GetBitStream();
+ IBitStream* GetBitStream();
- HRESULT BreakConnect();
+ HRESULT BreakConnect();
- HRESULT DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT CheckMediaType(const CMediaType* pmt);
- HRESULT GetMediaType(int iPosition, CMediaType* pmt);
+ HRESULT CheckMediaType(const CMediaType* pmt);
+ HRESULT GetMediaType(int iPosition, CMediaType* pmt);
- HRESULT DeliverEndOfStream();
+ HRESULT DeliverEndOfStream();
- STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
+ STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
};
class CBaseMuxerRawOutputPin : public CBaseMuxerOutputPin, public CBaseMuxerRelatedPin
{
- struct idx_t {
- REFERENCE_TIME rt;
- __int64 fp;
- };
- CAtlList<idx_t> m_idx;
+ struct idx_t {
+ REFERENCE_TIME rt;
+ __int64 fp;
+ };
+ CAtlList<idx_t> m_idx;
public:
- CBaseMuxerRawOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- virtual ~CBaseMuxerRawOutputPin() {}
+ CBaseMuxerRawOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ virtual ~CBaseMuxerRawOutputPin() {}
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- virtual void MuxHeader(const CMediaType& mt);
- virtual void MuxPacket(const CMediaType& mt, const MuxerPacket* pPacket);
- virtual void MuxFooter(const CMediaType& mt);
+ virtual void MuxHeader(const CMediaType& mt);
+ virtual void MuxPacket(const CMediaType& mt, const MuxerPacket* pPacket);
+ virtual void MuxFooter(const CMediaType& mt);
};
diff --git a/src/filters/muxer/BaseMuxer/BaseMuxerRelatedPin.cpp b/src/filters/muxer/BaseMuxer/BaseMuxerRelatedPin.cpp
index 3b216c1ca..8e82fd9ad 100644
--- a/src/filters/muxer/BaseMuxer/BaseMuxerRelatedPin.cpp
+++ b/src/filters/muxer/BaseMuxer/BaseMuxerRelatedPin.cpp
@@ -40,11 +40,11 @@ CBaseMuxerRelatedPin::~CBaseMuxerRelatedPin()
STDMETHODIMP CBaseMuxerRelatedPin::SetRelatedPin(CBasePin* pPin)
{
- m_pRelatedPin = pPin;
- return S_OK;
+ m_pRelatedPin = pPin;
+ return S_OK;
}
STDMETHODIMP_(CBasePin*) CBaseMuxerRelatedPin::GetRelatedPin()
{
- return m_pRelatedPin;
+ return m_pRelatedPin;
}
diff --git a/src/filters/muxer/BaseMuxer/BaseMuxerRelatedPin.h b/src/filters/muxer/BaseMuxer/BaseMuxerRelatedPin.h
index e9384a698..bd486f7ed 100644
--- a/src/filters/muxer/BaseMuxer/BaseMuxerRelatedPin.h
+++ b/src/filters/muxer/BaseMuxer/BaseMuxerRelatedPin.h
@@ -26,20 +26,20 @@
interface __declspec(uuid("EE6F2741-7DB4-4AAD-A3CB-545208EE4C0A"))
IBaseMuxerRelatedPin :
public IUnknown {
- STDMETHOD(SetRelatedPin) (CBasePin* pPin) = 0;
- STDMETHOD_(CBasePin*, GetRelatedPin) () = 0;
+ STDMETHOD(SetRelatedPin)(CBasePin * pPin) = 0;
+ STDMETHOD_(CBasePin*, GetRelatedPin)() = 0;
};
class CBaseMuxerRelatedPin : public IBaseMuxerRelatedPin
{
- CBasePin* m_pRelatedPin; // should not hold a reference because it would be circular
+ CBasePin* m_pRelatedPin; // should not hold a reference because it would be circular
public:
- CBaseMuxerRelatedPin();
- virtual ~CBaseMuxerRelatedPin();
+ CBaseMuxerRelatedPin();
+ virtual ~CBaseMuxerRelatedPin();
- // IBaseMuxerRelatedPin
+ // IBaseMuxerRelatedPin
- STDMETHODIMP SetRelatedPin(CBasePin* pPin);
- STDMETHODIMP_(CBasePin*) GetRelatedPin();
+ STDMETHODIMP SetRelatedPin(CBasePin* pPin);
+ STDMETHODIMP_(CBasePin*) GetRelatedPin();
};
diff --git a/src/filters/muxer/BaseMuxer/BitStream.cpp b/src/filters/muxer/BaseMuxer/BitStream.cpp
index bc0683ad0..a036f9c45 100644
--- a/src/filters/muxer/BaseMuxer/BitStream.cpp
+++ b/src/filters/muxer/BaseMuxer/BitStream.cpp
@@ -29,135 +29,135 @@
//
CBitStream::CBitStream(IStream* pStream, bool fThrowError)
- : CUnknown(_T("CBitStream"), NULL)
- , m_pStream(pStream)
- , m_fThrowError(fThrowError)
- , m_bitlen(0)
+ : CUnknown(_T("CBitStream"), NULL)
+ , m_pStream(pStream)
+ , m_fThrowError(fThrowError)
+ , m_bitlen(0)
{
- ASSERT(m_pStream);
+ ASSERT(m_pStream);
- LARGE_INTEGER li = {0};
- m_pStream->Seek(li, STREAM_SEEK_SET, NULL);
+ LARGE_INTEGER li = {0};
+ m_pStream->Seek(li, STREAM_SEEK_SET, NULL);
- ULARGE_INTEGER uli = {0};
- m_pStream->SetSize(uli); // not that it worked...
+ ULARGE_INTEGER uli = {0};
+ m_pStream->SetSize(uli); // not that it worked...
- m_pStream->Commit(S_OK); // also seems to have no effect, but maybe in the future...
+ m_pStream->Commit(S_OK); // also seems to have no effect, but maybe in the future...
}
CBitStream::~CBitStream()
{
- BitFlush();
+ BitFlush();
}
STDMETHODIMP CBitStream::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- *ppv = NULL;
+ *ppv = NULL;
- return
- QI(IBitStream)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IBitStream)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
// IBitStream
STDMETHODIMP_(UINT64) CBitStream::GetPos()
{
- ULARGE_INTEGER pos = {0, 0};
- m_pStream->Seek(*(LARGE_INTEGER*)&pos, STREAM_SEEK_CUR, &pos);
- return pos.QuadPart;
+ ULARGE_INTEGER pos = {0, 0};
+ m_pStream->Seek(*(LARGE_INTEGER*)&pos, STREAM_SEEK_CUR, &pos);
+ return pos.QuadPart;
}
STDMETHODIMP_(UINT64) CBitStream::Seek(UINT64 pos)
{
- BitFlush();
-
- LARGE_INTEGER li;
- li.QuadPart = pos;
- ULARGE_INTEGER linew;
- linew.QuadPart = (ULONGLONG)-1;
- m_pStream->Seek(li, STREAM_SEEK_SET, &linew);
- ASSERT(li.QuadPart == (LONGLONG)linew.QuadPart);
- return linew.QuadPart;
+ BitFlush();
+
+ LARGE_INTEGER li;
+ li.QuadPart = pos;
+ ULARGE_INTEGER linew;
+ linew.QuadPart = (ULONGLONG) - 1;
+ m_pStream->Seek(li, STREAM_SEEK_SET, &linew);
+ ASSERT(li.QuadPart == (LONGLONG)linew.QuadPart);
+ return linew.QuadPart;
}
STDMETHODIMP CBitStream::ByteWrite(const void* pData, int len)
{
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- BitFlush();
+ BitFlush();
- if (len > 0) {
- ULONG cbWritten = 0;
- hr = m_pStream->Write(pData, len, &cbWritten);
+ if (len > 0) {
+ ULONG cbWritten = 0;
+ hr = m_pStream->Write(pData, len, &cbWritten);
- ASSERT(SUCCEEDED(hr));
- if (m_fThrowError && FAILED(hr)) {
- throw hr;
- }
- }
+ ASSERT(SUCCEEDED(hr));
+ if (m_fThrowError && FAILED(hr)) {
+ throw hr;
+ }
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CBitStream::BitWrite(UINT64 data, int len)
{
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- ASSERT(len >= 0 && len <= 64);
+ ASSERT(len >= 0 && len <= 64);
- if (len > 56) {
- BitWrite(data >> 56, len - 56);
- len = 56;
- }
+ if (len > 56) {
+ BitWrite(data >> 56, len - 56);
+ len = 56;
+ }
- m_bitbuff <<= len;
- m_bitbuff |= data & ((1ui64 << len) - 1);
- m_bitlen += len;
+ m_bitbuff <<= len;
+ m_bitbuff |= data & ((1ui64 << len) - 1);
+ m_bitlen += len;
- while (m_bitlen >= 8) {
- BYTE b = (BYTE)(m_bitbuff >> (m_bitlen - 8));
- hr = m_pStream->Write(&b, 1, NULL);
- m_bitlen -= 8;
+ while (m_bitlen >= 8) {
+ BYTE b = (BYTE)(m_bitbuff >> (m_bitlen - 8));
+ hr = m_pStream->Write(&b, 1, NULL);
+ m_bitlen -= 8;
- ASSERT(SUCCEEDED(hr));
- if (m_fThrowError && FAILED(hr)) {
- throw E_FAIL;
- }
- }
+ ASSERT(SUCCEEDED(hr));
+ if (m_fThrowError && FAILED(hr)) {
+ throw E_FAIL;
+ }
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CBitStream::BitFlush()
{
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- if (m_bitlen > 0) {
- ASSERT(m_bitlen < 8);
- BYTE b = (BYTE)(m_bitbuff << (8 - m_bitlen));
- hr = m_pStream->Write(&b, 1, NULL);
- m_bitlen = 0;
+ if (m_bitlen > 0) {
+ ASSERT(m_bitlen < 8);
+ BYTE b = (BYTE)(m_bitbuff << (8 - m_bitlen));
+ hr = m_pStream->Write(&b, 1, NULL);
+ m_bitlen = 0;
- ASSERT(SUCCEEDED(hr));
- if (m_fThrowError && FAILED(hr)) {
- throw E_FAIL;
- }
- }
+ ASSERT(SUCCEEDED(hr));
+ if (m_fThrowError && FAILED(hr)) {
+ throw E_FAIL;
+ }
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CBitStream::StrWrite(LPCSTR pData, BOOL bFixNewLine)
{
- CStringA str = pData;
+ CStringA str = pData;
- if (bFixNewLine) {
- str.Replace("\r", "");
- str.Replace("\n", "\r\n");
- }
+ if (bFixNewLine) {
+ str.Replace("\r", "");
+ str.Replace("\n", "\r\n");
+ }
- return ByteWrite((LPCSTR)str, str.GetLength());
+ return ByteWrite((LPCSTR)str, str.GetLength());
}
diff --git a/src/filters/muxer/BaseMuxer/BitStream.h b/src/filters/muxer/BaseMuxer/BitStream.h
index 7e758aff2..26b542cfb 100644
--- a/src/filters/muxer/BaseMuxer/BitStream.h
+++ b/src/filters/muxer/BaseMuxer/BitStream.h
@@ -26,34 +26,34 @@
interface __declspec(uuid("30AB78C7-5259-4594-AEFE-9C0FC2F08A5E"))
IBitStream :
public IUnknown {
- STDMETHOD_(UINT64, GetPos) () = 0;
- STDMETHOD_(UINT64, Seek) (UINT64 pos) = 0; // it's a _stream_, please don't seek if you don't have to
- STDMETHOD(ByteWrite) (const void* pData, int len) = 0;
- STDMETHOD(BitWrite) (UINT64 data, int len) = 0;
- STDMETHOD(BitFlush) () = 0;
- STDMETHOD(StrWrite) (LPCSTR pData, BOOL bFixNewLine) = 0;
+ STDMETHOD_(UINT64, GetPos)() = 0;
+ STDMETHOD_(UINT64, Seek)(UINT64 pos) = 0; // it's a _stream_, please don't seek if you don't have to
+ STDMETHOD(ByteWrite)(const void * pData, int len) = 0;
+ STDMETHOD(BitWrite)(UINT64 data, int len) = 0;
+ STDMETHOD(BitFlush)() = 0;
+ STDMETHOD(StrWrite)(LPCSTR pData, BOOL bFixNewLine) = 0;
};
class CBitStream : public CUnknown, public IBitStream
{
- CComPtr<IStream> m_pStream;
- bool m_fThrowError;
- UINT64 m_bitbuff;
- int m_bitlen;
+ CComPtr<IStream> m_pStream;
+ bool m_fThrowError;
+ UINT64 m_bitbuff;
+ int m_bitlen;
public:
- CBitStream(IStream* pStream, bool m_fThrowError = false);
- virtual ~CBitStream();
+ CBitStream(IStream* pStream, bool m_fThrowError = false);
+ virtual ~CBitStream();
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // IBitStream
+ // IBitStream
- STDMETHODIMP_(UINT64) GetPos();
- STDMETHODIMP_(UINT64) Seek(UINT64 pos);
- STDMETHODIMP ByteWrite(const void* pData, int len);
- STDMETHODIMP BitWrite(UINT64 data, int len);
- STDMETHODIMP BitFlush();
- STDMETHODIMP StrWrite(LPCSTR pData, BOOL bFixNewLine);
+ STDMETHODIMP_(UINT64) GetPos();
+ STDMETHODIMP_(UINT64) Seek(UINT64 pos);
+ STDMETHODIMP ByteWrite(const void* pData, int len);
+ STDMETHODIMP BitWrite(UINT64 data, int len);
+ STDMETHODIMP BitFlush();
+ STDMETHODIMP StrWrite(LPCSTR pData, BOOL bFixNewLine);
};
diff --git a/src/filters/muxer/BaseMuxer/stdafx.h b/src/filters/muxer/BaseMuxer/stdafx.h
index da1b20add..789cc67f2 100644
--- a/src/filters/muxer/BaseMuxer/stdafx.h
+++ b/src/filters/muxer/BaseMuxer/stdafx.h
@@ -26,16 +26,16 @@
#include "../../../DSUtil/SharedInclude.h"
#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#endif
-#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
+#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
#ifndef VC_EXTRALEAN
-#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
+#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#endif
#include <afx.h>
-#include <afxwin.h> // MFC core and standard components
+#include <afxwin.h> // MFC core and standard components
#include <atlbase.h>
#include <atlcoll.h>
diff --git a/src/filters/muxer/DSMMuxer/DSMMuxer.cpp b/src/filters/muxer/DSMMuxer/DSMMuxer.cpp
index a8da28347..c542e1d70 100644
--- a/src/filters/muxer/DSMMuxer/DSMMuxer.cpp
+++ b/src/filters/muxer/DSMMuxer/DSMMuxer.cpp
@@ -35,32 +35,32 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_DirectShowMedia}
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_DirectShowMedia}
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, TRUE, &CLSID_NULL, NULL, 0, NULL},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Input", FALSE, FALSE, FALSE, TRUE, &CLSID_NULL, NULL, 0, NULL},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CDSMMuxerFilter), DSMMuxerName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CDSMMuxerFilter), DSMMuxerName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CDSMMuxerFilter>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CDSMMuxerFilter>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -71,16 +71,16 @@ CFilterApp theApp;
template<typename T> static T myabs(T n)
{
- return n >= 0 ? n : -n;
+ return n >= 0 ? n : -n;
}
static int GetByteLength(UINT64 data, int min = 0)
{
- int i = 7;
- while (i >= min && ((BYTE*)&data)[i] == 0) {
- i--;
- }
- return ++i;
+ int i = 7;
+ while (i >= min && ((BYTE*)&data)[i] == 0) {
+ i--;
+ }
+ return ++i;
}
//
@@ -88,13 +88,13 @@ static int GetByteLength(UINT64 data, int min = 0)
//
CDSMMuxerFilter::CDSMMuxerFilter(LPUNKNOWN pUnk, HRESULT* phr, bool fAutoChap, bool fAutoRes)
- : CBaseMuxerFilter(pUnk, phr, __uuidof(this))
- , m_fAutoChap(fAutoChap)
- , m_fAutoRes(fAutoRes)
+ : CBaseMuxerFilter(pUnk, phr, __uuidof(this))
+ , m_fAutoChap(fAutoChap)
+ , m_fAutoRes(fAutoRes)
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
}
CDSMMuxerFilter::~CDSMMuxerFilter()
@@ -103,348 +103,348 @@ CDSMMuxerFilter::~CDSMMuxerFilter()
STDMETHODIMP CDSMMuxerFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- *ppv = NULL;
+ *ppv = NULL;
- return
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
void CDSMMuxerFilter::MuxPacketHeader(IBitStream* pBS, dsmp_t type, UINT64 len)
{
- ASSERT(type < 32);
+ ASSERT(type < 32);
- int i = GetByteLength(len, 1);
+ int i = GetByteLength(len, 1);
- pBS->BitWrite(DSMSW, DSMSW_SIZE<<3);
- pBS->BitWrite(type, 5);
- pBS->BitWrite(i-1, 3);
- pBS->BitWrite(len, i<<3);
+ pBS->BitWrite(DSMSW, DSMSW_SIZE << 3);
+ pBS->BitWrite(type, 5);
+ pBS->BitWrite(i - 1, 3);
+ pBS->BitWrite(len, i << 3);
}
void CDSMMuxerFilter::MuxFileInfo(IBitStream* pBS)
{
- int len = 1;
- CSimpleMap<CStringA, CStringA> si;
-
- for (int i = 0; i < GetSize(); i++) {
- CStringA key = CStringA(CString(GetKeyAt(i))), value = UTF16To8(GetValueAt(i));
- if (key.GetLength() != 4) {
- continue;
- }
- si.Add(key, value);
- len += 4 + value.GetLength() + 1;
- }
-
- MuxPacketHeader(pBS, DSMP_FILEINFO, len);
- pBS->BitWrite(DSMF_VERSION, 8);
- for (int i = 0; i < si.GetSize(); i++) {
- CStringA key = si.GetKeyAt(i), value = si.GetValueAt(i);
- pBS->ByteWrite((LPCSTR)key, 4);
- pBS->ByteWrite((LPCSTR)value, value.GetLength()+1);
- }
+ int len = 1;
+ CSimpleMap<CStringA, CStringA> si;
+
+ for (int i = 0; i < GetSize(); i++) {
+ CStringA key = CStringA(CString(GetKeyAt(i))), value = UTF16To8(GetValueAt(i));
+ if (key.GetLength() != 4) {
+ continue;
+ }
+ si.Add(key, value);
+ len += 4 + value.GetLength() + 1;
+ }
+
+ MuxPacketHeader(pBS, DSMP_FILEINFO, len);
+ pBS->BitWrite(DSMF_VERSION, 8);
+ for (int i = 0; i < si.GetSize(); i++) {
+ CStringA key = si.GetKeyAt(i), value = si.GetValueAt(i);
+ pBS->ByteWrite((LPCSTR)key, 4);
+ pBS->ByteWrite((LPCSTR)value, value.GetLength() + 1);
+ }
}
void CDSMMuxerFilter::MuxStreamInfo(IBitStream* pBS, CBaseMuxerInputPin* pPin)
{
- int len = 1;
- CSimpleMap<CStringA, CStringA> si;
-
- for (int i = 0; i < pPin->GetSize(); i++) {
- CStringA key = CStringA(CString(pPin->GetKeyAt(i))), value = UTF16To8(pPin->GetValueAt(i));
- if (key.GetLength() != 4) {
- continue;
- }
- si.Add(key, value);
- len += 4 + value.GetLength() + 1;
- }
-
- if (len > 1) {
- MuxPacketHeader(pBS, DSMP_STREAMINFO, len);
- pBS->BitWrite(pPin->GetID(), 8);
- for (int i = 0; i < si.GetSize(); i++) {
- CStringA key = si.GetKeyAt(i), value = si.GetValueAt(i);
- pBS->ByteWrite((LPCSTR)key, 4);
- pBS->ByteWrite((LPCSTR)value, value.GetLength()+1);
- }
- }
+ int len = 1;
+ CSimpleMap<CStringA, CStringA> si;
+
+ for (int i = 0; i < pPin->GetSize(); i++) {
+ CStringA key = CStringA(CString(pPin->GetKeyAt(i))), value = UTF16To8(pPin->GetValueAt(i));
+ if (key.GetLength() != 4) {
+ continue;
+ }
+ si.Add(key, value);
+ len += 4 + value.GetLength() + 1;
+ }
+
+ if (len > 1) {
+ MuxPacketHeader(pBS, DSMP_STREAMINFO, len);
+ pBS->BitWrite(pPin->GetID(), 8);
+ for (int i = 0; i < si.GetSize(); i++) {
+ CStringA key = si.GetKeyAt(i), value = si.GetValueAt(i);
+ pBS->ByteWrite((LPCSTR)key, 4);
+ pBS->ByteWrite((LPCSTR)value, value.GetLength() + 1);
+ }
+ }
}
void CDSMMuxerFilter::MuxInit()
{
- m_sps.RemoveAll();
- m_isps.RemoveAll();
- m_rtPrevSyncPoint = _I64_MIN;
+ m_sps.RemoveAll();
+ m_isps.RemoveAll();
+ m_rtPrevSyncPoint = _I64_MIN;
}
void CDSMMuxerFilter::MuxHeader(IBitStream* pBS)
{
- CString muxer;
- muxer.Format(_T("DSM Muxer (%s)"), CString(__TIMESTAMP__));
-
- SetProperty(L"MUXR", CStringW(muxer));
- SetProperty(L"DATE", CStringW(CTime::GetCurrentTime().FormatGmt(_T("%Y-%m-%d %H:%M:%S"))));
-
- MuxFileInfo(pBS);
-
- POSITION pos = m_pPins.GetHeadPosition();
- while (pos) {
- CBaseMuxerInputPin* pPin = m_pPins.GetNext(pos);
- const CMediaType& mt = pPin->CurrentMediaType();
-
- ASSERT((mt.lSampleSize >> 30) == 0); // you don't need >1GB samples, do you?
-
- MuxPacketHeader(pBS, DSMP_MEDIATYPE, 5 + sizeof(GUID)*3 + mt.FormatLength());
- pBS->BitWrite(pPin->GetID(), 8);
- pBS->ByteWrite(&mt.majortype, sizeof(mt.majortype));
- pBS->ByteWrite(&mt.subtype, sizeof(mt.subtype));
- pBS->BitWrite(mt.bFixedSizeSamples, 1);
- pBS->BitWrite(mt.bTemporalCompression, 1);
- pBS->BitWrite(mt.lSampleSize, 30);
- pBS->ByteWrite(&mt.formattype, sizeof(mt.formattype));
- pBS->ByteWrite(mt.Format(), mt.FormatLength());
-
- MuxStreamInfo(pBS, pPin);
- }
-
- // resources & chapters
-
- CInterfaceList<IDSMResourceBag> pRBs;
- pRBs.AddTail(this);
-
- CComQIPtr<IDSMChapterBag> pCB = (IUnknown*)(INonDelegatingUnknown*)this;
-
- pos = m_pPins.GetHeadPosition();
- while (pos) {
- for (CComPtr<IPin> pPin = m_pPins.GetNext(pos)->GetConnected(); pPin; pPin = GetUpStreamPin(GetFilterFromPin(pPin))) {
- if (m_fAutoRes) {
- CComQIPtr<IDSMResourceBag> pPB = GetFilterFromPin(pPin);
- if (pPB && !pRBs.Find(pPB)) {
- pRBs.AddTail(pPB);
- }
- }
-
- if (m_fAutoChap) {
- if (!pCB || pCB->ChapGetCount() == 0) {
- pCB = GetFilterFromPin(pPin);
- }
- }
- }
- }
-
- // resources
-
- pos = pRBs.GetHeadPosition();
- while (pos) {
- IDSMResourceBag* pRB = pRBs.GetNext(pos);
-
- for (DWORD i = 0, j = pRB->ResGetCount(); i < j; i++) {
- CComBSTR name, desc, mime;
- BYTE* pData = NULL;
- DWORD len = 0;
- if (SUCCEEDED(pRB->ResGet(i, &name, &desc, &mime, &pData, &len, NULL))) {
- CStringA utf8_name = UTF16To8(name);
- CStringA utf8_desc = UTF16To8(desc);
- CStringA utf8_mime = UTF16To8(mime);
-
- MuxPacketHeader(pBS, DSMP_RESOURCE,
- 1 +
- utf8_name.GetLength()+1 +
- utf8_desc.GetLength()+1 +
- utf8_mime.GetLength()+1 +
- len);
-
- pBS->BitWrite(0, 2);
- pBS->BitWrite(0, 6); // reserved
- pBS->ByteWrite(utf8_name, utf8_name.GetLength()+1);
- pBS->ByteWrite(utf8_desc, utf8_desc.GetLength()+1);
- pBS->ByteWrite(utf8_mime, utf8_mime.GetLength()+1);
- pBS->ByteWrite(pData, len);
-
- CoTaskMemFree(pData);
- }
- }
- }
-
- // chapters
-
- if (pCB) {
- CAtlList<CDSMChapter> chapters;
- REFERENCE_TIME rtPrev = 0;
- int len = 0;
-
- pCB->ChapSort();
-
- for (DWORD i = 0; i < pCB->ChapGetCount(); i++) {
- CDSMChapter c;
- CComBSTR name;
- if (SUCCEEDED(pCB->ChapGet(i, &c.rt, &name))) {
- REFERENCE_TIME rtDiff = c.rt - rtPrev;
- rtPrev = c.rt;
- c.rt = rtDiff;
- c.name = name;
- len += 1 + GetByteLength(myabs(c.rt)) + UTF16To8(c.name).GetLength()+1;
- chapters.AddTail(c);
- }
- }
-
- if (chapters.GetCount()) {
- MuxPacketHeader(pBS, DSMP_CHAPTERS, len);
-
- pos = chapters.GetHeadPosition();
- while (pos) {
- CDSMChapter& c = chapters.GetNext(pos);
- CStringA name = UTF16To8(c.name);
- int irt = GetByteLength(myabs(c.rt));
- pBS->BitWrite(c.rt < 0, 1);
- pBS->BitWrite(irt, 3);
- pBS->BitWrite(0, 4);
- pBS->BitWrite(myabs(c.rt), irt<<3);
- pBS->ByteWrite((LPCSTR)name, name.GetLength()+1);
- }
- }
- }
+ CString muxer;
+ muxer.Format(_T("DSM Muxer (%s)"), CString(__TIMESTAMP__));
+
+ SetProperty(L"MUXR", CStringW(muxer));
+ SetProperty(L"DATE", CStringW(CTime::GetCurrentTime().FormatGmt(_T("%Y-%m-%d %H:%M:%S"))));
+
+ MuxFileInfo(pBS);
+
+ POSITION pos = m_pPins.GetHeadPosition();
+ while (pos) {
+ CBaseMuxerInputPin* pPin = m_pPins.GetNext(pos);
+ const CMediaType& mt = pPin->CurrentMediaType();
+
+ ASSERT((mt.lSampleSize >> 30) == 0); // you don't need >1GB samples, do you?
+
+ MuxPacketHeader(pBS, DSMP_MEDIATYPE, 5 + sizeof(GUID) * 3 + mt.FormatLength());
+ pBS->BitWrite(pPin->GetID(), 8);
+ pBS->ByteWrite(&mt.majortype, sizeof(mt.majortype));
+ pBS->ByteWrite(&mt.subtype, sizeof(mt.subtype));
+ pBS->BitWrite(mt.bFixedSizeSamples, 1);
+ pBS->BitWrite(mt.bTemporalCompression, 1);
+ pBS->BitWrite(mt.lSampleSize, 30);
+ pBS->ByteWrite(&mt.formattype, sizeof(mt.formattype));
+ pBS->ByteWrite(mt.Format(), mt.FormatLength());
+
+ MuxStreamInfo(pBS, pPin);
+ }
+
+ // resources & chapters
+
+ CInterfaceList<IDSMResourceBag> pRBs;
+ pRBs.AddTail(this);
+
+ CComQIPtr<IDSMChapterBag> pCB = (IUnknown*)(INonDelegatingUnknown*)this;
+
+ pos = m_pPins.GetHeadPosition();
+ while (pos) {
+ for (CComPtr<IPin> pPin = m_pPins.GetNext(pos)->GetConnected(); pPin; pPin = GetUpStreamPin(GetFilterFromPin(pPin))) {
+ if (m_fAutoRes) {
+ CComQIPtr<IDSMResourceBag> pPB = GetFilterFromPin(pPin);
+ if (pPB && !pRBs.Find(pPB)) {
+ pRBs.AddTail(pPB);
+ }
+ }
+
+ if (m_fAutoChap) {
+ if (!pCB || pCB->ChapGetCount() == 0) {
+ pCB = GetFilterFromPin(pPin);
+ }
+ }
+ }
+ }
+
+ // resources
+
+ pos = pRBs.GetHeadPosition();
+ while (pos) {
+ IDSMResourceBag* pRB = pRBs.GetNext(pos);
+
+ for (DWORD i = 0, j = pRB->ResGetCount(); i < j; i++) {
+ CComBSTR name, desc, mime;
+ BYTE* pData = NULL;
+ DWORD len = 0;
+ if (SUCCEEDED(pRB->ResGet(i, &name, &desc, &mime, &pData, &len, NULL))) {
+ CStringA utf8_name = UTF16To8(name);
+ CStringA utf8_desc = UTF16To8(desc);
+ CStringA utf8_mime = UTF16To8(mime);
+
+ MuxPacketHeader(pBS, DSMP_RESOURCE,
+ 1 +
+ utf8_name.GetLength() + 1 +
+ utf8_desc.GetLength() + 1 +
+ utf8_mime.GetLength() + 1 +
+ len);
+
+ pBS->BitWrite(0, 2);
+ pBS->BitWrite(0, 6); // reserved
+ pBS->ByteWrite(utf8_name, utf8_name.GetLength() + 1);
+ pBS->ByteWrite(utf8_desc, utf8_desc.GetLength() + 1);
+ pBS->ByteWrite(utf8_mime, utf8_mime.GetLength() + 1);
+ pBS->ByteWrite(pData, len);
+
+ CoTaskMemFree(pData);
+ }
+ }
+ }
+
+ // chapters
+
+ if (pCB) {
+ CAtlList<CDSMChapter> chapters;
+ REFERENCE_TIME rtPrev = 0;
+ int len = 0;
+
+ pCB->ChapSort();
+
+ for (DWORD i = 0; i < pCB->ChapGetCount(); i++) {
+ CDSMChapter c;
+ CComBSTR name;
+ if (SUCCEEDED(pCB->ChapGet(i, &c.rt, &name))) {
+ REFERENCE_TIME rtDiff = c.rt - rtPrev;
+ rtPrev = c.rt;
+ c.rt = rtDiff;
+ c.name = name;
+ len += 1 + GetByteLength(myabs(c.rt)) + UTF16To8(c.name).GetLength() + 1;
+ chapters.AddTail(c);
+ }
+ }
+
+ if (chapters.GetCount()) {
+ MuxPacketHeader(pBS, DSMP_CHAPTERS, len);
+
+ pos = chapters.GetHeadPosition();
+ while (pos) {
+ CDSMChapter& c = chapters.GetNext(pos);
+ CStringA name = UTF16To8(c.name);
+ int irt = GetByteLength(myabs(c.rt));
+ pBS->BitWrite(c.rt < 0, 1);
+ pBS->BitWrite(irt, 3);
+ pBS->BitWrite(0, 4);
+ pBS->BitWrite(myabs(c.rt), irt << 3);
+ pBS->ByteWrite((LPCSTR)name, name.GetLength() + 1);
+ }
+ }
+ }
}
void CDSMMuxerFilter::MuxPacket(IBitStream* pBS, const MuxerPacket* pPacket)
{
- if (pPacket->IsEOS()) {
- return;
- }
-
- if (pPacket->pPin->CurrentMediaType().majortype == MEDIATYPE_Text) {
- CStringA str((char*)pPacket->pData.GetData(), pPacket->pData.GetCount());
- str.Replace("\xff", " ");
- str.Replace("&nbsp;", " ");
- str.Replace("&nbsp", " ");
- str.Trim();
- if (str.IsEmpty()) {
- return;
- }
- }
-
- ASSERT(!pPacket->IsSyncPoint() || pPacket->IsTimeValid());
-
- REFERENCE_TIME rtTimeStamp = _I64_MIN, rtDuration = 0;
- int iTimeStamp = 0, iDuration = 0;
-
- if (pPacket->IsTimeValid()) {
- rtTimeStamp = pPacket->rtStart;
- rtDuration = max(pPacket->rtStop - pPacket->rtStart, 0);
-
- iTimeStamp = GetByteLength(myabs(rtTimeStamp));
- ASSERT(iTimeStamp <= 7);
-
- iDuration = GetByteLength(rtDuration);
- ASSERT(iDuration <= 7);
-
- IndexSyncPoint(pPacket, pBS->GetPos());
- }
-
- int len = 2 + iTimeStamp + iDuration + pPacket->pData.GetCount(); // id + flags + data
-
- MuxPacketHeader(pBS, DSMP_SAMPLE, len);
- pBS->BitWrite(pPacket->pPin->GetID(), 8);
- pBS->BitWrite(pPacket->IsSyncPoint(), 1);
- pBS->BitWrite(rtTimeStamp < 0, 1);
- pBS->BitWrite(iTimeStamp, 3);
- pBS->BitWrite(iDuration, 3);
- pBS->BitWrite(myabs(rtTimeStamp), iTimeStamp<<3);
- pBS->BitWrite(rtDuration, iDuration<<3);
- pBS->ByteWrite(pPacket->pData.GetData(), pPacket->pData.GetCount());
+ if (pPacket->IsEOS()) {
+ return;
+ }
+
+ if (pPacket->pPin->CurrentMediaType().majortype == MEDIATYPE_Text) {
+ CStringA str((char*)pPacket->pData.GetData(), pPacket->pData.GetCount());
+ str.Replace("\xff", " ");
+ str.Replace("&nbsp;", " ");
+ str.Replace("&nbsp", " ");
+ str.Trim();
+ if (str.IsEmpty()) {
+ return;
+ }
+ }
+
+ ASSERT(!pPacket->IsSyncPoint() || pPacket->IsTimeValid());
+
+ REFERENCE_TIME rtTimeStamp = _I64_MIN, rtDuration = 0;
+ int iTimeStamp = 0, iDuration = 0;
+
+ if (pPacket->IsTimeValid()) {
+ rtTimeStamp = pPacket->rtStart;
+ rtDuration = max(pPacket->rtStop - pPacket->rtStart, 0);
+
+ iTimeStamp = GetByteLength(myabs(rtTimeStamp));
+ ASSERT(iTimeStamp <= 7);
+
+ iDuration = GetByteLength(rtDuration);
+ ASSERT(iDuration <= 7);
+
+ IndexSyncPoint(pPacket, pBS->GetPos());
+ }
+
+ int len = 2 + iTimeStamp + iDuration + pPacket->pData.GetCount(); // id + flags + data
+
+ MuxPacketHeader(pBS, DSMP_SAMPLE, len);
+ pBS->BitWrite(pPacket->pPin->GetID(), 8);
+ pBS->BitWrite(pPacket->IsSyncPoint(), 1);
+ pBS->BitWrite(rtTimeStamp < 0, 1);
+ pBS->BitWrite(iTimeStamp, 3);
+ pBS->BitWrite(iDuration, 3);
+ pBS->BitWrite(myabs(rtTimeStamp), iTimeStamp << 3);
+ pBS->BitWrite(rtDuration, iDuration << 3);
+ pBS->ByteWrite(pPacket->pData.GetData(), pPacket->pData.GetCount());
}
void CDSMMuxerFilter::MuxFooter(IBitStream* pBS)
{
- // syncpoints
-
- int len = 0;
- CAtlList<IndexedSyncPoint> isps;
- REFERENCE_TIME rtPrev = 0, rt;
- UINT64 fpPrev = 0, fp;
-
- POSITION pos = m_isps.GetHeadPosition();
- while (pos) {
- IndexedSyncPoint& isp = m_isps.GetNext(pos);
- TRACE(_T("sp[%d]: %I64d %I64x\n"), isp.id, isp.rt, isp.fp);
-
- rt = isp.rt - rtPrev;
- rtPrev = isp.rt;
- fp = isp.fp - fpPrev;
- fpPrev = isp.fp;
-
- IndexedSyncPoint isp2;
- isp2.fp = fp;
- isp2.rt = rt;
- isps.AddTail(isp2);
-
- len += 1 + GetByteLength(myabs(rt)) + GetByteLength(fp); // flags + rt + fp
- }
-
- MuxPacketHeader(pBS, DSMP_SYNCPOINTS, len);
-
- pos = isps.GetHeadPosition();
- while (pos) {
- IndexedSyncPoint& isp = isps.GetNext(pos);
-
- int irt = GetByteLength(myabs(isp.rt));
- int ifp = GetByteLength(isp.fp);
-
- pBS->BitWrite(isp.rt < 0, 1);
- pBS->BitWrite(irt, 3);
- pBS->BitWrite(ifp, 3);
- pBS->BitWrite(0, 1); // reserved
- pBS->BitWrite(myabs(isp.rt), irt<<3);
- pBS->BitWrite(isp.fp, ifp<<3);
- }
+ // syncpoints
+
+ int len = 0;
+ CAtlList<IndexedSyncPoint> isps;
+ REFERENCE_TIME rtPrev = 0, rt;
+ UINT64 fpPrev = 0, fp;
+
+ POSITION pos = m_isps.GetHeadPosition();
+ while (pos) {
+ IndexedSyncPoint& isp = m_isps.GetNext(pos);
+ TRACE(_T("sp[%d]: %I64d %I64x\n"), isp.id, isp.rt, isp.fp);
+
+ rt = isp.rt - rtPrev;
+ rtPrev = isp.rt;
+ fp = isp.fp - fpPrev;
+ fpPrev = isp.fp;
+
+ IndexedSyncPoint isp2;
+ isp2.fp = fp;
+ isp2.rt = rt;
+ isps.AddTail(isp2);
+
+ len += 1 + GetByteLength(myabs(rt)) + GetByteLength(fp); // flags + rt + fp
+ }
+
+ MuxPacketHeader(pBS, DSMP_SYNCPOINTS, len);
+
+ pos = isps.GetHeadPosition();
+ while (pos) {
+ IndexedSyncPoint& isp = isps.GetNext(pos);
+
+ int irt = GetByteLength(myabs(isp.rt));
+ int ifp = GetByteLength(isp.fp);
+
+ pBS->BitWrite(isp.rt < 0, 1);
+ pBS->BitWrite(irt, 3);
+ pBS->BitWrite(ifp, 3);
+ pBS->BitWrite(0, 1); // reserved
+ pBS->BitWrite(myabs(isp.rt), irt << 3);
+ pBS->BitWrite(isp.fp, ifp << 3);
+ }
}
void CDSMMuxerFilter::IndexSyncPoint(const MuxerPacket* p, __int64 fp)
{
- // Yes, this is as complicated as it looks.
- // Rule #1: don't write this packet if you can't do it reliably.
- // (think about overlapped subtitles, line1: 0->10, line2: 1->9)
-
- // FIXME: the very last syncpoints won't get moved to m_isps because there are no more syncpoints to trigger it!
-
- if (fp < 0 || !p || !p->IsTimeValid() || !p->IsSyncPoint()) {
- return;
- }
-
- ASSERT(p->rtStart >= m_rtPrevSyncPoint);
- m_rtPrevSyncPoint = p->rtStart;
-
- SyncPoint sp;
- sp.id = p->pPin->GetID();
- sp.rtStart = p->rtStart;
- sp.rtStop = p->pPin->IsSubtitleStream() ? p->rtStop : _I64_MAX;
- sp.fp = fp;
-
- {
- SyncPoint& head = !m_sps.IsEmpty() ? m_sps.GetHead() : sp;
- SyncPoint& tail = !m_sps.IsEmpty() ? m_sps.GetTail() : sp;
- REFERENCE_TIME rtfp = !m_isps.IsEmpty() ? m_isps.GetTail().rtfp : _I64_MIN;
-
- if (head.rtStart > rtfp + 1000000) { // 100ms limit, just in case every stream had only keyframes, then sycnpoints would be too frequent
- IndexedSyncPoint isp;
- isp.id = head.id;
- isp.rt = tail.rtStart;
- isp.rtfp = head.rtStart;
- isp.fp = head.fp;
- m_isps.AddTail(isp);
- }
- }
-
- POSITION pos = m_sps.GetHeadPosition();
- while (pos) {
- POSITION cur = pos;
- SyncPoint& sp2 = m_sps.GetNext(pos);
- if (sp2.id == sp.id && sp2.rtStop <= sp.rtStop || sp2.rtStop <= sp.rtStart) {
- m_sps.RemoveAt(cur);
- }
- }
-
- m_sps.AddTail(sp);
+ // Yes, this is as complicated as it looks.
+ // Rule #1: don't write this packet if you can't do it reliably.
+ // (think about overlapped subtitles, line1: 0->10, line2: 1->9)
+
+ // FIXME: the very last syncpoints won't get moved to m_isps because there are no more syncpoints to trigger it!
+
+ if (fp < 0 || !p || !p->IsTimeValid() || !p->IsSyncPoint()) {
+ return;
+ }
+
+ ASSERT(p->rtStart >= m_rtPrevSyncPoint);
+ m_rtPrevSyncPoint = p->rtStart;
+
+ SyncPoint sp;
+ sp.id = p->pPin->GetID();
+ sp.rtStart = p->rtStart;
+ sp.rtStop = p->pPin->IsSubtitleStream() ? p->rtStop : _I64_MAX;
+ sp.fp = fp;
+
+ {
+ SyncPoint& head = !m_sps.IsEmpty() ? m_sps.GetHead() : sp;
+ SyncPoint& tail = !m_sps.IsEmpty() ? m_sps.GetTail() : sp;
+ REFERENCE_TIME rtfp = !m_isps.IsEmpty() ? m_isps.GetTail().rtfp : _I64_MIN;
+
+ if (head.rtStart > rtfp + 1000000) { // 100ms limit, just in case every stream had only keyframes, then sycnpoints would be too frequent
+ IndexedSyncPoint isp;
+ isp.id = head.id;
+ isp.rt = tail.rtStart;
+ isp.rtfp = head.rtStart;
+ isp.fp = head.fp;
+ m_isps.AddTail(isp);
+ }
+ }
+
+ POSITION pos = m_sps.GetHeadPosition();
+ while (pos) {
+ POSITION cur = pos;
+ SyncPoint& sp2 = m_sps.GetNext(pos);
+ if (sp2.id == sp.id && sp2.rtStop <= sp.rtStop || sp2.rtStop <= sp.rtStart) {
+ m_sps.RemoveAt(cur);
+ }
+ }
+
+ m_sps.AddTail(sp);
} \ No newline at end of file
diff --git a/src/filters/muxer/DSMMuxer/DSMMuxer.h b/src/filters/muxer/DSMMuxer/DSMMuxer.h
index a1dec87f1..8b5f00af6 100644
--- a/src/filters/muxer/DSMMuxer/DSMMuxer.h
+++ b/src/filters/muxer/DSMMuxer/DSMMuxer.h
@@ -29,40 +29,40 @@
#define DSMMuxerName L"MPC DSM Muxer"
class __declspec(uuid("C6590B76-587E-4082-9125-680D0693A97B"))
- CDSMMuxerFilter : public CBaseMuxerFilter
+ CDSMMuxerFilter : public CBaseMuxerFilter
{
- bool m_fAutoChap, m_fAutoRes;
+ bool m_fAutoChap, m_fAutoRes;
- struct SyncPoint {
- BYTE id;
- REFERENCE_TIME rtStart, rtStop;
- __int64 fp;
- };
- struct IndexedSyncPoint {
- BYTE id;
- REFERENCE_TIME rt, rtfp;
- __int64 fp;
- };
- CAtlList<SyncPoint> m_sps;
- CAtlList<IndexedSyncPoint> m_isps;
- REFERENCE_TIME m_rtPrevSyncPoint;
- void IndexSyncPoint(const MuxerPacket* p, __int64 fp);
+ struct SyncPoint {
+ BYTE id;
+ REFERENCE_TIME rtStart, rtStop;
+ __int64 fp;
+ };
+ struct IndexedSyncPoint {
+ BYTE id;
+ REFERENCE_TIME rt, rtfp;
+ __int64 fp;
+ };
+ CAtlList<SyncPoint> m_sps;
+ CAtlList<IndexedSyncPoint> m_isps;
+ REFERENCE_TIME m_rtPrevSyncPoint;
+ void IndexSyncPoint(const MuxerPacket* p, __int64 fp);
- void MuxPacketHeader(IBitStream* pBS, dsmp_t type, UINT64 len);
- void MuxFileInfo(IBitStream* pBS);
- void MuxStreamInfo(IBitStream* pBS, CBaseMuxerInputPin* pPin);
+ void MuxPacketHeader(IBitStream* pBS, dsmp_t type, UINT64 len);
+ void MuxFileInfo(IBitStream* pBS);
+ void MuxStreamInfo(IBitStream* pBS, CBaseMuxerInputPin* pPin);
protected:
- void MuxInit();
+ void MuxInit();
- void MuxHeader(IBitStream* pBS);
- void MuxPacket(IBitStream* pBS, const MuxerPacket* pPacket);
- void MuxFooter(IBitStream* pBS);
+ void MuxHeader(IBitStream* pBS);
+ void MuxPacket(IBitStream* pBS, const MuxerPacket* pPacket);
+ void MuxFooter(IBitStream* pBS);
public:
- CDSMMuxerFilter(LPUNKNOWN pUnk, HRESULT* phr, bool fAutoChap = true, bool fAutoRes = true);
- virtual ~CDSMMuxerFilter();
+ CDSMMuxerFilter(LPUNKNOWN pUnk, HRESULT* phr, bool fAutoChap = true, bool fAutoRes = true);
+ virtual ~CDSMMuxerFilter();
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
};
diff --git a/src/filters/muxer/MatroskaMuxer/MatroskaFile.cpp b/src/filters/muxer/MatroskaMuxer/MatroskaFile.cpp
index 3863bd825..5d6421eca 100644
--- a/src/filters/muxer/MatroskaMuxer/MatroskaFile.cpp
+++ b/src/filters/muxer/MatroskaMuxer/MatroskaFile.cpp
@@ -29,9 +29,9 @@ using namespace MatroskaWriter;
static void bswap(BYTE* s, int len)
{
- for (BYTE* d = s + len-1; s < d; s++, d--) {
- *s ^= *d, *d ^= *s, *s ^= *d;
- }
+ for (BYTE* d = s + len - 1; s < d; s++, d--) {
+ *s ^= *d, *d ^= *s, *s ^= *d;
+ }
}
//
@@ -42,889 +42,889 @@ CID::CID(DWORD id) : m_id(id)
MatroskaWriter::QWORD CID::Size(bool fWithHeader)
{
- return CUInt(0, m_id).Size(false);
+ return CUInt(0, m_id).Size(false);
}
HRESULT CID::Write(IStream* pStream)
{
- MatroskaWriter::QWORD len = CID::Size();
- DWORD id = m_id;
- bswap((BYTE*)&id, (int)len);
- *(BYTE*)&id = ((*(BYTE*)&id)&(1<<(8-len))-1)|(1<<(8-len));
- return pStream->Write(&id, (ULONG)len, NULL);
+ MatroskaWriter::QWORD len = CID::Size();
+ DWORD id = m_id;
+ bswap((BYTE*)&id, (int)len);
+ *(BYTE*)&id = ((*(BYTE*)&id) & (1 << (8 - len)) - 1) | (1 << (8 - len));
+ return pStream->Write(&id, (ULONG)len, NULL);
}
MatroskaWriter::QWORD CID::HeaderSize(MatroskaWriter::QWORD len)
{
- return CID::Size() + CLength(len).Size();
+ return CID::Size() + CLength(len).Size();
}
HRESULT CID::HeaderWrite(IStream* pStream)
{
- CID::Write(pStream);
- CLength(Size(false)).Write(pStream);
- return S_OK;
+ CID::Write(pStream);
+ CLength(Size(false)).Write(pStream);
+ return S_OK;
}
MatroskaWriter::QWORD CBinary::Size(bool fWithHeader)
{
- if (GetCount() == 0) {
- return 0;
- }
+ if (GetCount() == 0) {
+ return 0;
+ }
- MatroskaWriter::QWORD len = 0;
- len += GetCount();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += GetCount();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT CBinary::Write(IStream* pStream)
{
- if (GetCount() == 0) {
- return S_OK;
- }
+ if (GetCount() == 0) {
+ return S_OK;
+ }
- HeaderWrite(pStream);
- return pStream->Write(GetData(), GetCount(), NULL);
+ HeaderWrite(pStream);
+ return pStream->Write(GetData(), GetCount(), NULL);
}
MatroskaWriter::QWORD CANSI::Size(bool fWithHeader)
{
- if (GetLength() == 0) {
- return 0;
- }
+ if (GetLength() == 0) {
+ return 0;
+ }
- MatroskaWriter::QWORD len = 0;
- len += GetLength();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += GetLength();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT CANSI::Write(IStream* pStream)
{
- if (GetLength() == 0) {
- return S_OK;
- }
+ if (GetLength() == 0) {
+ return S_OK;
+ }
- HeaderWrite(pStream);
- return pStream->Write((LPCSTR)*this, GetLength(), NULL);
+ HeaderWrite(pStream);
+ return pStream->Write((LPCSTR) * this, GetLength(), NULL);
}
MatroskaWriter::QWORD CUTF8::Size(bool fWithHeader)
{
- if (GetLength() == 0) {
- return 0;
- }
+ if (GetLength() == 0) {
+ return 0;
+ }
- MatroskaWriter::QWORD len = 0;
- len += UTF16To8(*this).GetLength();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += UTF16To8(*this).GetLength();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT CUTF8::Write(IStream* pStream)
{
- if (GetLength() == 0) {
- return S_OK;
- }
+ if (GetLength() == 0) {
+ return S_OK;
+ }
- HeaderWrite(pStream);
- CStringA str = UTF16To8(*this);
- return pStream->Write((BYTE*)(LPCSTR)str, str.GetLength(), NULL);
+ HeaderWrite(pStream);
+ CStringA str = UTF16To8(*this);
+ return pStream->Write((BYTE*)(LPCSTR)str, str.GetLength(), NULL);
}
template<class T, class BASE>
MatroskaWriter::QWORD CSimpleVar<T, BASE>::Size(bool fWithHeader)
{
- if (!m_fSet) {
- return 0;
- }
+ if (!m_fSet) {
+ return 0;
+ }
- MatroskaWriter::QWORD len = 0;
- len += sizeof(T);
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += sizeof(T);
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
template<class T, class BASE>
HRESULT CSimpleVar<T, BASE>::Write(IStream* pStream)
{
- if (!m_fSet) {
- return S_OK;
- }
+ if (!m_fSet) {
+ return S_OK;
+ }
- HeaderWrite(pStream);
- T val = m_val;
- bswap((BYTE*)&val, sizeof(T));
- return pStream->Write(&val, sizeof(T), NULL);
+ HeaderWrite(pStream);
+ T val = m_val;
+ bswap((BYTE*)&val, sizeof(T));
+ return pStream->Write(&val, sizeof(T), NULL);
}
MatroskaWriter::QWORD CUInt::Size(bool fWithHeader)
{
- if (!m_fSet) {
- return 0;
- }
+ if (!m_fSet) {
+ return 0;
+ }
- MatroskaWriter::QWORD len = 0;
+ MatroskaWriter::QWORD len = 0;
- if (m_val == 0) {
- len++;
- } else {
- for (int i = 8; i > 0; i--) {
- if (((0xffi64<<((i-1)*8))&m_val)) {
- len += i;
- break;
- }
- }
- }
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ if (m_val == 0) {
+ len++;
+ } else {
+ for (int i = 8; i > 0; i--) {
+ if (((0xffi64 << ((i - 1) * 8))&m_val)) {
+ len += i;
+ break;
+ }
+ }
+ }
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT CUInt::Write(IStream* pStream)
{
- if (!m_fSet) {
- return S_OK;
- }
+ if (!m_fSet) {
+ return S_OK;
+ }
- CID::Write(pStream);
- CLength l(Size(false));
- l.Write(pStream);
- UINT64 val = m_val;
- bswap((BYTE*)&val, (int)l);
- return pStream->Write(&val, (ULONG)l, NULL);
+ CID::Write(pStream);
+ CLength l(Size(false));
+ l.Write(pStream);
+ UINT64 val = m_val;
+ bswap((BYTE*)&val, (int)l);
+ return pStream->Write(&val, (ULONG)l, NULL);
}
MatroskaWriter::QWORD CInt::Size(bool fWithHeader)
{
- if (!m_fSet) {
- return 0;
- }
-
- MatroskaWriter::QWORD len = 0;
-
- if (m_val == 0) {
- len++;
- } else {
- UINT64 val = m_val >= 0 ? m_val : -m_val;
- for (int i = 8; i > 0; i--) {
- if (((0xffi64<<((i-1)*8))&val)) {
- len += i;
- if (m_val < 0 && !(m_val&(0x80<<(i-1)))) {
- len++;
- }
- break;
- }
- }
- }
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ if (!m_fSet) {
+ return 0;
+ }
+
+ MatroskaWriter::QWORD len = 0;
+
+ if (m_val == 0) {
+ len++;
+ } else {
+ UINT64 val = m_val >= 0 ? m_val : -m_val;
+ for (int i = 8; i > 0; i--) {
+ if (((0xffi64 << ((i - 1) * 8))&val)) {
+ len += i;
+ if (m_val < 0 && !(m_val & (0x80 << (i - 1)))) {
+ len++;
+ }
+ break;
+ }
+ }
+ }
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT CInt::Write(IStream* pStream)
{
- if (!m_fSet) {
- return S_OK;
- }
+ if (!m_fSet) {
+ return S_OK;
+ }
- CID::Write(pStream);
- CLength l(Size(false));
- l.Write(pStream);
- UINT64 val = m_val;
- bswap((BYTE*)&val, (int)l);
- return pStream->Write(&val, (ULONG)l, NULL);
+ CID::Write(pStream);
+ CLength l(Size(false));
+ l.Write(pStream);
+ UINT64 val = m_val;
+ bswap((BYTE*)&val, (int)l);
+ return pStream->Write(&val, (ULONG)l, NULL);
}
MatroskaWriter::QWORD CLength::Size(bool fWithHeader)
{
- if (m_len == 0x00FFFFFFFFFFFFFFi64) {
- return 8;
- }
+ if (m_len == 0x00FFFFFFFFFFFFFFi64) {
+ return 8;
+ }
- MatroskaWriter::QWORD len = 0;
- for (int i = 1; i <= 8; i++) {
- if (!(m_len&(~((1i64<<(7*i))-1))) && (m_len&((1i64<<(7*i))-1)) != ((1i64<<(7*i))-1)) {
- len += i;
- break;
- }
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ for (int i = 1; i <= 8; i++) {
+ if (!(m_len & (~((1i64 << (7 * i)) - 1))) && (m_len & ((1i64 << (7 * i)) - 1)) != ((1i64 << (7 * i)) - 1)) {
+ len += i;
+ break;
+ }
+ }
+ return len;
}
HRESULT CLength::Write(IStream* pStream)
{
- MatroskaWriter::QWORD len = Size(false);
- UINT64 val = m_len;
- bswap((BYTE*)&val, (int)len);
- *(BYTE*)&val = ((*(BYTE*)&val)&(1<<(8-len))-1)|(1<<(8-len));
- return pStream->Write(&val, (ULONG)len, NULL);
+ MatroskaWriter::QWORD len = Size(false);
+ UINT64 val = m_len;
+ bswap((BYTE*)&val, (int)len);
+ *(BYTE*)&val = ((*(BYTE*)&val) & (1 << (8 - len)) - 1) | (1 << (8 - len));
+ return pStream->Write(&val, (ULONG)len, NULL);
}
//
EBML::EBML(DWORD id)
- : CID(id)
- , EBMLVersion(0x4286)
- , EBMLReadVersion(0x42F7)
- , EBMLMaxIDLength(0x42F2)
- , EBMLMaxSizeLength(0x42F3)
- , DocType(0x4282)
- , DocTypeVersion(0x4287)
- , DocTypeReadVersion(0x4285)
+ : CID(id)
+ , EBMLVersion(0x4286)
+ , EBMLReadVersion(0x42F7)
+ , EBMLMaxIDLength(0x42F2)
+ , EBMLMaxSizeLength(0x42F3)
+ , DocType(0x4282)
+ , DocTypeVersion(0x4287)
+ , DocTypeReadVersion(0x4285)
{
}
MatroskaWriter::QWORD EBML::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += EBMLVersion.Size();
- len += EBMLReadVersion.Size();
- len += EBMLMaxIDLength.Size();
- len += EBMLMaxSizeLength.Size();
- len += DocType.Size();
- len += DocTypeVersion.Size();
- len += DocTypeReadVersion.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += EBMLVersion.Size();
+ len += EBMLReadVersion.Size();
+ len += EBMLMaxIDLength.Size();
+ len += EBMLMaxSizeLength.Size();
+ len += DocType.Size();
+ len += DocTypeVersion.Size();
+ len += DocTypeReadVersion.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT EBML::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- EBMLVersion.Write(pStream);
- EBMLReadVersion.Write(pStream);
- EBMLMaxIDLength.Write(pStream);
- EBMLMaxSizeLength.Write(pStream);
- DocType.Write(pStream);
- DocTypeVersion.Write(pStream);
- DocTypeReadVersion.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ EBMLVersion.Write(pStream);
+ EBMLReadVersion.Write(pStream);
+ EBMLMaxIDLength.Write(pStream);
+ EBMLMaxSizeLength.Write(pStream);
+ DocType.Write(pStream);
+ DocTypeVersion.Write(pStream);
+ DocTypeReadVersion.Write(pStream);
+ return S_OK;
}
Info::Info(DWORD id)
- : CID(id)
- , SegmentUID(0x73A4)
- , SegmentFilename(0x7384)
- , PrevUID(0x3CB923)
- , PrevFilename(0x3C83AB)
- , NextUID(0x3EB923)
- , NextFilename(0x3E83BB)
- , TimeCodeScale(0x2AD7B1, 1000000ui64)
- , Duration(0x4489)
- , DateUTC(0x4461)
- , Title(0x7BA9)
- , MuxingApp(0x4D80)
- , WritingApp(0x5741)
+ : CID(id)
+ , SegmentUID(0x73A4)
+ , SegmentFilename(0x7384)
+ , PrevUID(0x3CB923)
+ , PrevFilename(0x3C83AB)
+ , NextUID(0x3EB923)
+ , NextFilename(0x3E83BB)
+ , TimeCodeScale(0x2AD7B1, 1000000ui64)
+ , Duration(0x4489)
+ , DateUTC(0x4461)
+ , Title(0x7BA9)
+ , MuxingApp(0x4D80)
+ , WritingApp(0x5741)
{
}
MatroskaWriter::QWORD Info::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += SegmentUID.Size();
- len += PrevUID.Size();
- len += NextUID.Size();
- len += SegmentFilename.Size();
- len += PrevFilename.Size();
- len += NextFilename.Size();
- len += TimeCodeScale.Size();
- len += Duration.Size();
- len += DateUTC.Size();
- len += Title.Size();
- len += MuxingApp.Size();
- len += WritingApp.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += SegmentUID.Size();
+ len += PrevUID.Size();
+ len += NextUID.Size();
+ len += SegmentFilename.Size();
+ len += PrevFilename.Size();
+ len += NextFilename.Size();
+ len += TimeCodeScale.Size();
+ len += Duration.Size();
+ len += DateUTC.Size();
+ len += Title.Size();
+ len += MuxingApp.Size();
+ len += WritingApp.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT Info::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- SegmentUID.Write(pStream);
- PrevUID.Write(pStream);
- NextUID.Write(pStream);
- SegmentFilename.Write(pStream);
- PrevFilename.Write(pStream);
- NextFilename.Write(pStream);
- TimeCodeScale.Write(pStream);
- Duration.Write(pStream);
- DateUTC.Write(pStream);
- Title.Write(pStream);
- MuxingApp.Write(pStream);
- WritingApp.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ SegmentUID.Write(pStream);
+ PrevUID.Write(pStream);
+ NextUID.Write(pStream);
+ SegmentFilename.Write(pStream);
+ PrevFilename.Write(pStream);
+ NextFilename.Write(pStream);
+ TimeCodeScale.Write(pStream);
+ Duration.Write(pStream);
+ DateUTC.Write(pStream);
+ Title.Write(pStream);
+ MuxingApp.Write(pStream);
+ WritingApp.Write(pStream);
+ return S_OK;
}
Segment::Segment(DWORD id)
- : CID(id)
+ : CID(id)
{
}
MatroskaWriter::QWORD Segment::Size(bool fWithHeader)
{
- return 0x00FFFFFFFFFFFFFFi64;
- /*
- MatroskaWriter::QWORD len = 0;
- if (fWithHeader) len += HeaderSize(len);
- return len;
- */
+ return 0x00FFFFFFFFFFFFFFi64;
+ /*
+ MatroskaWriter::QWORD len = 0;
+ if (fWithHeader) len += HeaderSize(len);
+ return len;
+ */
}
HRESULT Segment::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ return S_OK;
}
Track::Track(DWORD id)
- : CID(id)
+ : CID(id)
{
}
MatroskaWriter::QWORD Track::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += TrackEntries.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += TrackEntries.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT Track::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- TrackEntries.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ TrackEntries.Write(pStream);
+ return S_OK;
}
TrackEntry::TrackEntry(DWORD id)
- : CID(id)
- , TrackNumber(0xD7)
- , TrackUID(0x73C5)
- , TrackType(0x83)
- , FlagEnabled(0xB9)
- , FlagDefault(0x88)
- , FlagLacing(0x9C)
- , MinCache(0x6DE7)
- , MaxCache(0x6DF8)
- , Name(0x536E)
- , Language(0x22B59C)
- , CodecID(0x86)
- , CodecPrivate(0x63A2)
- , CodecName(0x258688)
- , CodecSettings(0x3A9697)
- , CodecInfoURL(0x3B4040)
- , CodecDownloadURL(0x26B240)
- , CodecDecodeAll(0xAA)
- , TrackOverlay(0x6FAB)
- , DefaultDuration(0x23E383)
- , v(0xE0)
- , a(0xE1)
-{
- DescType = NoDesc;
+ : CID(id)
+ , TrackNumber(0xD7)
+ , TrackUID(0x73C5)
+ , TrackType(0x83)
+ , FlagEnabled(0xB9)
+ , FlagDefault(0x88)
+ , FlagLacing(0x9C)
+ , MinCache(0x6DE7)
+ , MaxCache(0x6DF8)
+ , Name(0x536E)
+ , Language(0x22B59C)
+ , CodecID(0x86)
+ , CodecPrivate(0x63A2)
+ , CodecName(0x258688)
+ , CodecSettings(0x3A9697)
+ , CodecInfoURL(0x3B4040)
+ , CodecDownloadURL(0x26B240)
+ , CodecDecodeAll(0xAA)
+ , TrackOverlay(0x6FAB)
+ , DefaultDuration(0x23E383)
+ , v(0xE0)
+ , a(0xE1)
+{
+ DescType = NoDesc;
}
MatroskaWriter::QWORD TrackEntry::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += TrackNumber.Size();
- len += TrackUID.Size();
- len += TrackType.Size();
- len += FlagEnabled.Size();
- len += FlagDefault.Size();
- len += FlagLacing.Size();
- len += MinCache.Size();
- len += MaxCache.Size();
- len += Name.Size();
- len += Language.Size();
- len += CodecID.Size();
- len += CodecPrivate.Size();
- len += CodecName.Size();
- len += CodecSettings.Size();
- len += CodecInfoURL.Size();
- len += CodecDownloadURL.Size();
- len += CodecDecodeAll.Size();
- len += TrackOverlay.Size();
- len += DefaultDuration.Size();
- if (DescType == TypeVideo) {
- len += v.Size();
- }
- if (DescType == TypeAudio) {
- len += a.Size();
- }
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += TrackNumber.Size();
+ len += TrackUID.Size();
+ len += TrackType.Size();
+ len += FlagEnabled.Size();
+ len += FlagDefault.Size();
+ len += FlagLacing.Size();
+ len += MinCache.Size();
+ len += MaxCache.Size();
+ len += Name.Size();
+ len += Language.Size();
+ len += CodecID.Size();
+ len += CodecPrivate.Size();
+ len += CodecName.Size();
+ len += CodecSettings.Size();
+ len += CodecInfoURL.Size();
+ len += CodecDownloadURL.Size();
+ len += CodecDecodeAll.Size();
+ len += TrackOverlay.Size();
+ len += DefaultDuration.Size();
+ if (DescType == TypeVideo) {
+ len += v.Size();
+ }
+ if (DescType == TypeAudio) {
+ len += a.Size();
+ }
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT TrackEntry::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- TrackNumber.Write(pStream);
- TrackUID.Write(pStream);
- TrackType.Write(pStream);
- FlagEnabled.Write(pStream);
- FlagDefault.Write(pStream);
- FlagLacing.Write(pStream);
- MinCache.Write(pStream);
- MaxCache.Write(pStream);
- Name.Write(pStream);
- Language.Write(pStream);
- CodecID.Write(pStream);
- CodecPrivate.Write(pStream);
- CodecName.Write(pStream);
- CodecSettings.Write(pStream);
- CodecInfoURL.Write(pStream);
- CodecDownloadURL.Write(pStream);
- CodecDecodeAll.Write(pStream);
- TrackOverlay.Write(pStream);
- DefaultDuration.Write(pStream);
- if (DescType == TypeVideo) {
- v.Write(pStream);
- }
- if (DescType == TypeAudio) {
- a.Write(pStream);
- }
- return S_OK;
+ HeaderWrite(pStream);
+ TrackNumber.Write(pStream);
+ TrackUID.Write(pStream);
+ TrackType.Write(pStream);
+ FlagEnabled.Write(pStream);
+ FlagDefault.Write(pStream);
+ FlagLacing.Write(pStream);
+ MinCache.Write(pStream);
+ MaxCache.Write(pStream);
+ Name.Write(pStream);
+ Language.Write(pStream);
+ CodecID.Write(pStream);
+ CodecPrivate.Write(pStream);
+ CodecName.Write(pStream);
+ CodecSettings.Write(pStream);
+ CodecInfoURL.Write(pStream);
+ CodecDownloadURL.Write(pStream);
+ CodecDecodeAll.Write(pStream);
+ TrackOverlay.Write(pStream);
+ DefaultDuration.Write(pStream);
+ if (DescType == TypeVideo) {
+ v.Write(pStream);
+ }
+ if (DescType == TypeAudio) {
+ a.Write(pStream);
+ }
+ return S_OK;
}
Video::Video(DWORD id)
- : CID(id)
- , FlagInterlaced(0x9A)
- , StereoMode(0x53B8)
- , PixelWidth(0xB0)
- , PixelHeight(0xBA)
- , DisplayWidth(0x54B0)
- , DisplayHeight(0x54BA)
- , DisplayUnit(0x54B2)
- , AspectRatioType(0x54B3)
- , ColourSpace(0x2EB524)
- , GammaValue(0x2FB523)
- , FramePerSec(0x2383E3)
+ : CID(id)
+ , FlagInterlaced(0x9A)
+ , StereoMode(0x53B8)
+ , PixelWidth(0xB0)
+ , PixelHeight(0xBA)
+ , DisplayWidth(0x54B0)
+ , DisplayHeight(0x54BA)
+ , DisplayUnit(0x54B2)
+ , AspectRatioType(0x54B3)
+ , ColourSpace(0x2EB524)
+ , GammaValue(0x2FB523)
+ , FramePerSec(0x2383E3)
{
}
MatroskaWriter::QWORD Video::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += FlagInterlaced.Size();
- len += StereoMode.Size();
- len += PixelWidth.Size();
- len += PixelHeight.Size();
- len += DisplayWidth.Size();
- len += DisplayHeight.Size();
- len += DisplayUnit.Size();
- len += AspectRatioType.Size();
- len += ColourSpace.Size();
- len += GammaValue.Size();
- len += FramePerSec.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += FlagInterlaced.Size();
+ len += StereoMode.Size();
+ len += PixelWidth.Size();
+ len += PixelHeight.Size();
+ len += DisplayWidth.Size();
+ len += DisplayHeight.Size();
+ len += DisplayUnit.Size();
+ len += AspectRatioType.Size();
+ len += ColourSpace.Size();
+ len += GammaValue.Size();
+ len += FramePerSec.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT Video::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- FlagInterlaced.Write(pStream);
- StereoMode.Write(pStream);
- PixelWidth.Write(pStream);
- PixelHeight.Write(pStream);
- DisplayWidth.Write(pStream);
- DisplayHeight.Write(pStream);
- DisplayUnit.Write(pStream);
- AspectRatioType.Write(pStream);
- ColourSpace.Write(pStream);
- GammaValue.Write(pStream);
- FramePerSec.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ FlagInterlaced.Write(pStream);
+ StereoMode.Write(pStream);
+ PixelWidth.Write(pStream);
+ PixelHeight.Write(pStream);
+ DisplayWidth.Write(pStream);
+ DisplayHeight.Write(pStream);
+ DisplayUnit.Write(pStream);
+ AspectRatioType.Write(pStream);
+ ColourSpace.Write(pStream);
+ GammaValue.Write(pStream);
+ FramePerSec.Write(pStream);
+ return S_OK;
}
Audio::Audio(DWORD id)
- : CID(id)
- , SamplingFrequency(0xB5)
- , OutputSamplingFrequency(0x78B5)
- , Channels(0x9F)
- , ChannelPositions(0x7D7B)
- , BitDepth(0x6264)
+ : CID(id)
+ , SamplingFrequency(0xB5)
+ , OutputSamplingFrequency(0x78B5)
+ , Channels(0x9F)
+ , ChannelPositions(0x7D7B)
+ , BitDepth(0x6264)
{
}
MatroskaWriter::QWORD Audio::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += SamplingFrequency.Size();
- len += OutputSamplingFrequency.Size();
- len += Channels.Size();
- len += ChannelPositions.Size();
- len += BitDepth.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += SamplingFrequency.Size();
+ len += OutputSamplingFrequency.Size();
+ len += Channels.Size();
+ len += ChannelPositions.Size();
+ len += BitDepth.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT Audio::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- SamplingFrequency.Write(pStream);
- OutputSamplingFrequency.Write(pStream);
- Channels.Write(pStream);
- ChannelPositions.Write(pStream);
- BitDepth.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ SamplingFrequency.Write(pStream);
+ OutputSamplingFrequency.Write(pStream);
+ Channels.Write(pStream);
+ ChannelPositions.Write(pStream);
+ BitDepth.Write(pStream);
+ return S_OK;
}
Cluster::Cluster(DWORD id)
- : CID(id)
- , TimeCode(0xE7)
- , Position(0xA7)
- , PrevSize(0xAB)
+ : CID(id)
+ , TimeCode(0xE7)
+ , Position(0xA7)
+ , PrevSize(0xAB)
{
}
MatroskaWriter::QWORD Cluster::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += TimeCode.Size();
- len += Position.Size();
- len += PrevSize.Size();
- len += BlockGroups.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += TimeCode.Size();
+ len += Position.Size();
+ len += PrevSize.Size();
+ len += BlockGroups.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT Cluster::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- TimeCode.Write(pStream);
- Position.Write(pStream);
- PrevSize.Write(pStream);
- BlockGroups.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ TimeCode.Write(pStream);
+ Position.Write(pStream);
+ PrevSize.Write(pStream);
+ BlockGroups.Write(pStream);
+ return S_OK;
}
BlockGroup::BlockGroup(DWORD id)
- : CID(id)
- , BlockDuration(0x9B)
- , ReferencePriority(0xFA)
- , ReferenceBlock(0xFB)
- , ReferenceVirtual(0xFD)
- , CodecState(0xA4)
+ : CID(id)
+ , BlockDuration(0x9B)
+ , ReferencePriority(0xFA)
+ , ReferenceBlock(0xFB)
+ , ReferenceVirtual(0xFD)
+ , CodecState(0xA4)
{
}
MatroskaWriter::QWORD BlockGroup::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += BlockDuration.Size();
- len += ReferencePriority.Size();
- len += ReferenceBlock.Size();
- len += ReferenceVirtual.Size();
- len += CodecState.Size();
- len += Block.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += BlockDuration.Size();
+ len += ReferencePriority.Size();
+ len += ReferenceBlock.Size();
+ len += ReferenceVirtual.Size();
+ len += CodecState.Size();
+ len += Block.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT BlockGroup::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- BlockDuration.Write(pStream);
- ReferencePriority.Write(pStream);
- ReferenceBlock.Write(pStream);
- ReferenceVirtual.Write(pStream);
- CodecState.Write(pStream);
- Block.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ BlockDuration.Write(pStream);
+ ReferencePriority.Write(pStream);
+ ReferenceBlock.Write(pStream);
+ ReferenceVirtual.Write(pStream);
+ CodecState.Write(pStream);
+ Block.Write(pStream);
+ return S_OK;
}
CBlock::CBlock(DWORD id)
- : CID(id)
- , TimeCode(0)
+ : CID(id)
+ , TimeCode(0)
{
}
MatroskaWriter::QWORD CBlock::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += TrackNumber.Size() + 2 + 1; // TrackNumber + TimeCode + Lacing
- if (BlockData.GetCount() > 1) {
- len += 1; // nBlockData
- POSITION pos = BlockData.GetHeadPosition();
- while (pos) {
- CBinary* b = BlockData.GetNext(pos);
- if (pos) {
- len += b->GetCount()/255 + 1;
- }
- }
- }
- POSITION pos = BlockData.GetHeadPosition();
- while (pos) {
- CBinary* b = BlockData.GetNext(pos);
- len += b->GetCount();
- }
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += TrackNumber.Size() + 2 + 1; // TrackNumber + TimeCode + Lacing
+ if (BlockData.GetCount() > 1) {
+ len += 1; // nBlockData
+ POSITION pos = BlockData.GetHeadPosition();
+ while (pos) {
+ CBinary* b = BlockData.GetNext(pos);
+ if (pos) {
+ len += b->GetCount() / 255 + 1;
+ }
+ }
+ }
+ POSITION pos = BlockData.GetHeadPosition();
+ while (pos) {
+ CBinary* b = BlockData.GetNext(pos);
+ len += b->GetCount();
+ }
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT CBlock::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- TrackNumber.Write(pStream);
- short t = (short)TimeCode;
- bswap((BYTE*)&t, 2);
- pStream->Write(&t, 2, NULL);
- BYTE Lacing = 0;
- BYTE n = BlockData.GetCount();
- if (n > 1) {
- Lacing |= 2;
- }
- pStream->Write(&Lacing, 1, NULL);
- if (n > 1) {
- pStream->Write(&n, 1, NULL);
- POSITION pos = BlockData.GetHeadPosition();
- while (pos) {
- CBinary* b = BlockData.GetNext(pos);
- if (pos) {
- INT_PTR len = b->GetCount();
- while (len >= 0) {
- n = (BYTE)min(len, 255);
- pStream->Write(&n, 1, NULL);
- len -= 255;
- }
- }
- }
- }
- POSITION pos = BlockData.GetHeadPosition();
- while (pos) {
- CBinary* b = BlockData.GetNext(pos);
- pStream->Write(b->GetData(), b->GetCount(), NULL);
- }
- return S_OK;
+ HeaderWrite(pStream);
+ TrackNumber.Write(pStream);
+ short t = (short)TimeCode;
+ bswap((BYTE*)&t, 2);
+ pStream->Write(&t, 2, NULL);
+ BYTE Lacing = 0;
+ BYTE n = BlockData.GetCount();
+ if (n > 1) {
+ Lacing |= 2;
+ }
+ pStream->Write(&Lacing, 1, NULL);
+ if (n > 1) {
+ pStream->Write(&n, 1, NULL);
+ POSITION pos = BlockData.GetHeadPosition();
+ while (pos) {
+ CBinary* b = BlockData.GetNext(pos);
+ if (pos) {
+ INT_PTR len = b->GetCount();
+ while (len >= 0) {
+ n = (BYTE)min(len, 255);
+ pStream->Write(&n, 1, NULL);
+ len -= 255;
+ }
+ }
+ }
+ }
+ POSITION pos = BlockData.GetHeadPosition();
+ while (pos) {
+ CBinary* b = BlockData.GetNext(pos);
+ pStream->Write(b->GetData(), b->GetCount(), NULL);
+ }
+ return S_OK;
}
Cue::Cue(DWORD id)
- : CID(id)
+ : CID(id)
{
}
MatroskaWriter::QWORD Cue::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += CuePoints.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += CuePoints.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT Cue::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- CuePoints.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ CuePoints.Write(pStream);
+ return S_OK;
}
CuePoint::CuePoint(DWORD id)
- : CID(id)
- , CueTime(0xB3)
+ : CID(id)
+ , CueTime(0xB3)
{
}
MatroskaWriter::QWORD CuePoint::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += CueTime.Size();
- len += CueTrackPositions.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += CueTime.Size();
+ len += CueTrackPositions.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT CuePoint::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- CueTime.Write(pStream);
- CueTrackPositions.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ CueTime.Write(pStream);
+ CueTrackPositions.Write(pStream);
+ return S_OK;
}
CueTrackPosition::CueTrackPosition(DWORD id)
- : CID(id)
- , CueTrack(0xF7)
- , CueClusterPosition(0xF1)
- , CueBlockNumber(0x5387)
- , CueCodecState(0xEA)
+ : CID(id)
+ , CueTrack(0xF7)
+ , CueClusterPosition(0xF1)
+ , CueBlockNumber(0x5387)
+ , CueCodecState(0xEA)
{
}
MatroskaWriter::QWORD CueTrackPosition::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += CueTrack.Size();
- len += CueClusterPosition.Size();
- len += CueBlockNumber.Size();
- len += CueCodecState.Size();
- // len += CueReferences.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += CueTrack.Size();
+ len += CueClusterPosition.Size();
+ len += CueBlockNumber.Size();
+ len += CueCodecState.Size();
+ // len += CueReferences.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT CueTrackPosition::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- CueTrack.Write(pStream);
- CueClusterPosition.Write(pStream);
- CueBlockNumber.Write(pStream);
- CueCodecState.Write(pStream);
- // CueReferences.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ CueTrack.Write(pStream);
+ CueClusterPosition.Write(pStream);
+ CueBlockNumber.Write(pStream);
+ CueCodecState.Write(pStream);
+ // CueReferences.Write(pStream);
+ return S_OK;
}
Seek::Seek(DWORD id)
- : CID(id)
+ : CID(id)
{
}
MatroskaWriter::QWORD Seek::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += SeekHeads.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += SeekHeads.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT Seek::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- SeekHeads.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ SeekHeads.Write(pStream);
+ return S_OK;
}
SeekID::SeekID(DWORD id)
- : CID(id)
- , m_id(0)
+ : CID(id)
+ , m_id(0)
{
}
MatroskaWriter::QWORD SeekID::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += m_id.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += m_id.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT SeekID::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- m_id.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ m_id.Write(pStream);
+ return S_OK;
}
SeekHead::SeekHead(DWORD id)
- : CID(id)
- , Position(0x53AC)
+ : CID(id)
+ , Position(0x53AC)
{
}
MatroskaWriter::QWORD SeekHead::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += ID.Size();
- len += Position.Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += ID.Size();
+ len += Position.Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT SeekHead::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- ID.Write(pStream);
- Position.Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ ID.Write(pStream);
+ Position.Write(pStream);
+ return S_OK;
}
Tags::Tags(DWORD id)
- : CID(id)
+ : CID(id)
{
}
MatroskaWriter::QWORD Tags::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- // len += .Size();
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ // len += .Size();
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT Tags::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- // .Write(pStream);
- return S_OK;
+ HeaderWrite(pStream);
+ // .Write(pStream);
+ return S_OK;
}
Void::Void(MatroskaWriter::QWORD len, DWORD id)
- : CID(id)
- , m_len(len)
+ : CID(id)
+ , m_len(len)
{
}
MatroskaWriter::QWORD Void::Size(bool fWithHeader)
{
- MatroskaWriter::QWORD len = 0;
- len += m_len;
- if (fWithHeader) {
- len += HeaderSize(len);
- }
- return len;
+ MatroskaWriter::QWORD len = 0;
+ len += m_len;
+ if (fWithHeader) {
+ len += HeaderSize(len);
+ }
+ return len;
}
HRESULT Void::Write(IStream* pStream)
{
- HeaderWrite(pStream);
- BYTE buff[64];
- memset(buff, 0x80, sizeof(buff));
- for (int len = (int)m_len; len > 0; len -= sizeof(buff)) {
- pStream->Write(buff, (ULONG)min(sizeof(buff), len), NULL);
- }
- return S_OK;
+ HeaderWrite(pStream);
+ BYTE buff[64];
+ memset(buff, 0x80, sizeof(buff));
+ for (int len = (int)m_len; len > 0; len -= sizeof(buff)) {
+ pStream->Write(buff, (ULONG)min(sizeof(buff), len), NULL);
+ }
+ return S_OK;
}
diff --git a/src/filters/muxer/MatroskaMuxer/MatroskaFile.h b/src/filters/muxer/MatroskaMuxer/MatroskaFile.h
index 1da6ad4b4..5950861fd 100644
--- a/src/filters/muxer/MatroskaMuxer/MatroskaFile.h
+++ b/src/filters/muxer/MatroskaMuxer/MatroskaFile.h
@@ -28,395 +28,395 @@
namespace MatroskaWriter
{
- typedef unsigned __int64 QWORD;
-
- class CID
- {
- protected:
- DWORD m_id;
- QWORD HeaderSize(QWORD len);
- HRESULT HeaderWrite(IStream* pStream);
-
- public:
- CID(DWORD id);
- DWORD GetID() const {
- return m_id;
- }
- virtual QWORD Size(bool fWithHeader = true);
- virtual HRESULT Write(IStream* pStream);
- };
-
- class CLength : public CID
- {
- UINT64 m_len;
- public:
- CLength(UINT64 len = 0) : CID(0), m_len(len) {}
- operator UINT64() {
- return m_len;
- }
- QWORD Size(bool fWithHeader = false);
- HRESULT Write(IStream* pStream);
- };
-
- class CBinary : public CAtlArray<BYTE>, public CID
- {
- public:
- CBinary(DWORD id) : CID(id) {}
- CBinary& operator = (const CBinary& b) {
- Copy(b);
- return *this;
- }
- operator BYTE*() {
- return (BYTE*)GetData();
- }
- CBinary& Set(CStringA str) {
- SetCount(str.GetLength()+1);
- strcpy_s((char*)GetData(), str.GetLength() + 1, str);
- return *this;
- }
- // CBinary& Set(CStringA str) {SetCount(str.GetLength()); memcpy((char*)GetData(), str, str.GetLength()); return *this;}
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class CANSI : public CStringA, public CID
- {
- public:
- CANSI(DWORD id) : CID(id) {}
- CANSI& Set(CStringA str) {
- CStringA::operator = (str);
- return *this;
- }
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class CUTF8 : public CStringW, public CID
- {
- public:
- CUTF8(DWORD id) : CID(id) {}
- CUTF8& Set(CStringW str) {
- CStringW::operator = (str);
- return *this;
- }
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- template<class T, class BASE>
- class CSimpleVar : public CID
- {
- protected:
- T m_val;
- bool m_fSet;
- public:
- explicit CSimpleVar(DWORD id, T val = 0) : CID(id), m_val(val) {
- m_fSet = !!val;
- }
- operator T() {
- return m_val;
- }
- BASE& Set(T val) {
- m_val = val;
- m_fSet = true;
- return (*(BASE*)this);
- }
- void UnSet() {
- m_fSet = false;
- }
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class CUInt : public CSimpleVar<UINT64, CUInt>
- {
- public:
- explicit CUInt(DWORD id, UINT64 val = 0) : CSimpleVar<UINT64, CUInt>(id, val) {}
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class CInt : public CSimpleVar<INT64, CInt>
- {
- public:
- explicit CInt(DWORD id, INT64 val = 0) : CSimpleVar<INT64, CInt>(id, val) {}
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class CByte : public CSimpleVar<BYTE, CByte>
- {
- public:
- explicit CByte(DWORD id, BYTE val = 0) : CSimpleVar<BYTE, CByte>(id, val) {}
- };
-
- class CShort : public CSimpleVar<short, CShort>
- {
- public:
- explicit CShort(DWORD id, short val = 0) : CSimpleVar<short, CShort>(id, val) {}
- };
-
- class CFloat : public CSimpleVar<float, CFloat>
- {
- public:
- explicit CFloat(DWORD id, float val = 0) : CSimpleVar<float, CFloat>(id, val) {}
- };
-
- template<class T>
- class CNode : public CAutoPtrList<T>
- {
- public:
- QWORD Size(bool fWithHeader = true) {
- QWORD len = 0;
- POSITION pos = GetHeadPosition();
- while (pos) {
- len += GetNext(pos)->Size(fWithHeader);
- }
- return len;
- }
- HRESULT Write(IStream* pStream) {
- HRESULT hr;
- POSITION pos = GetHeadPosition();
- while (pos) if (FAILED(hr = GetNext(pos)->Write(pStream))) {
- return hr;
- }
- return S_OK;
- }
- };
-
- class EBML : public CID
- {
- public:
- CUInt EBMLVersion, EBMLReadVersion;
- CUInt EBMLMaxIDLength, EBMLMaxSizeLength;
- CANSI DocType;
- CUInt DocTypeVersion, DocTypeReadVersion;
-
- EBML(DWORD id = 0x1A45DFA3);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class Info : public CID
- {
- public:
- CBinary SegmentUID, PrevUID, NextUID;
- CUTF8 SegmentFilename, PrevFilename, NextFilename;
- CUInt TimeCodeScale; // [ns], default: 1.000.000
- CFloat Duration;
- CInt DateUTC;
- CUTF8 Title, MuxingApp, WritingApp;
-
- Info(DWORD id = 0x1549A966);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class Video : public CID
- {
- public:
- CUInt FlagInterlaced, StereoMode;
- CUInt PixelWidth, PixelHeight, DisplayWidth, DisplayHeight, DisplayUnit;
- CUInt AspectRatioType;
- CUInt ColourSpace;
- CFloat GammaValue;
- CFloat FramePerSec;
-
- Video(DWORD id = 0xE0);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class Audio : public CID
- {
- public:
- CFloat SamplingFrequency;
- CFloat OutputSamplingFrequency;
- CUInt Channels;
- CBinary ChannelPositions;
- CUInt BitDepth;
-
- Audio(DWORD id = 0xE1);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class TrackEntry : public CID
- {
- public:
- enum {TypeVideo = 1, TypeAudio = 2, TypeComplex = 3, TypeLogo = 0x10, TypeSubtitle = 0x11, TypeControl = 0x20};
- CUInt TrackNumber, TrackUID, TrackType;
- CUInt FlagEnabled, FlagDefault, FlagLacing;
- CUInt MinCache, MaxCache;
- CUTF8 Name;
- CANSI Language;
- CBinary CodecID;
- CBinary CodecPrivate;
- CUTF8 CodecName;
- CUTF8 CodecSettings;
- CANSI CodecInfoURL;
- CANSI CodecDownloadURL;
- CUInt CodecDecodeAll;
- CUInt TrackOverlay;
- CUInt DefaultDuration;
- enum {NoDesc = 0, DescVideo = 1, DescAudio = 2};
- int DescType;
- Video v;
- Audio a;
-
- TrackEntry(DWORD id = 0xAE);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class Track : public CID
- {
- public:
- CNode<TrackEntry> TrackEntries;
-
- Track(DWORD id = 0x1654AE6B);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class CBlock : public CID
- {
- public:
- CLength TrackNumber;
- REFERENCE_TIME TimeCode, TimeCodeStop;
- CNode<CBinary> BlockData;
-
- CBlock(DWORD id = 0xA1);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class BlockGroup : public CID
- {
- public:
- CUInt BlockDuration;
- CUInt ReferencePriority;
- CInt ReferenceBlock;
- CInt ReferenceVirtual;
- CBinary CodecState;
- CBlock Block;
- // CNode<TimeSlice> TimeSlices;
-
- BlockGroup(DWORD id = 0xA0);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class Cluster : public CID
- {
- public:
- CUInt TimeCode, Position, PrevSize;
- CNode<BlockGroup> BlockGroups;
-
- Cluster(DWORD id = 0x1F43B675);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- /* class CueReference : public CID
- {
- public:
- CUInt CueRefTime, CueRefCluster, CueRefNumber, CueRefCodecState;
-
- CueReference(DWORD id = 0xDB);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
- */
- class CueTrackPosition : public CID
- {
- public:
- CUInt CueTrack, CueClusterPosition, CueBlockNumber, CueCodecState;
- // CNode<CueReference> CueReferences;
-
- CueTrackPosition(DWORD id = 0xB7);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class CuePoint : public CID
- {
- public:
- CUInt CueTime;
- CNode<CueTrackPosition> CueTrackPositions;
-
- CuePoint(DWORD id = 0xBB);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class Cue : public CID
- {
- public:
- CNode<CuePoint> CuePoints;
-
- Cue(DWORD id = 0x1C53BB6B);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class SeekID : public CID
- {
- CID m_id;
- public:
- SeekID(DWORD id = 0x53AB);
- void Set(DWORD id) {
- m_id = id;
- }
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class SeekHead : public CID
- {
- public:
- SeekID ID;
- CUInt Position;
-
- SeekHead(DWORD id = 0x4DBB);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class Seek : public CID
- {
- public:
- CNode<SeekHead> SeekHeads;
-
- Seek(DWORD id = 0x114D9B74);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class Segment : public CID
- {
- public:
- Segment(DWORD id = 0x18538067);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class Tags : public CID
- {
- public:
- // TODO
-
- Tags(DWORD id = 0x1254C367);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
-
- class Void : public CID
- {
- QWORD m_len;
- public:
- Void(QWORD len, DWORD id = 0xEC);
- QWORD Size(bool fWithHeader = true);
- HRESULT Write(IStream* pStream);
- };
+ typedef unsigned __int64 QWORD;
+
+ class CID
+ {
+ protected:
+ DWORD m_id;
+ QWORD HeaderSize(QWORD len);
+ HRESULT HeaderWrite(IStream* pStream);
+
+ public:
+ CID(DWORD id);
+ DWORD GetID() const {
+ return m_id;
+ }
+ virtual QWORD Size(bool fWithHeader = true);
+ virtual HRESULT Write(IStream* pStream);
+ };
+
+ class CLength : public CID
+ {
+ UINT64 m_len;
+ public:
+ CLength(UINT64 len = 0) : CID(0), m_len(len) {}
+ operator UINT64() {
+ return m_len;
+ }
+ QWORD Size(bool fWithHeader = false);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class CBinary : public CAtlArray<BYTE>, public CID
+ {
+ public:
+ CBinary(DWORD id) : CID(id) {}
+ CBinary& operator = (const CBinary& b) {
+ Copy(b);
+ return *this;
+ }
+ operator BYTE* () {
+ return (BYTE*)GetData();
+ }
+ CBinary& Set(CStringA str) {
+ SetCount(str.GetLength() + 1);
+ strcpy_s((char*)GetData(), str.GetLength() + 1, str);
+ return *this;
+ }
+ // CBinary& Set(CStringA str) {SetCount(str.GetLength()); memcpy((char*)GetData(), str, str.GetLength()); return *this;}
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class CANSI : public CStringA, public CID
+ {
+ public:
+ CANSI(DWORD id) : CID(id) {}
+ CANSI& Set(CStringA str) {
+ CStringA::operator = (str);
+ return *this;
+ }
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class CUTF8 : public CStringW, public CID
+ {
+ public:
+ CUTF8(DWORD id) : CID(id) {}
+ CUTF8& Set(CStringW str) {
+ CStringW::operator = (str);
+ return *this;
+ }
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ template<class T, class BASE>
+ class CSimpleVar : public CID
+ {
+ protected:
+ T m_val;
+ bool m_fSet;
+ public:
+ explicit CSimpleVar(DWORD id, T val = 0) : CID(id), m_val(val) {
+ m_fSet = !!val;
+ }
+ operator T() {
+ return m_val;
+ }
+ BASE& Set(T val) {
+ m_val = val;
+ m_fSet = true;
+ return (*(BASE*)this);
+ }
+ void UnSet() {
+ m_fSet = false;
+ }
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class CUInt : public CSimpleVar<UINT64, CUInt>
+ {
+ public:
+ explicit CUInt(DWORD id, UINT64 val = 0) : CSimpleVar<UINT64, CUInt>(id, val) {}
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class CInt : public CSimpleVar<INT64, CInt>
+ {
+ public:
+ explicit CInt(DWORD id, INT64 val = 0) : CSimpleVar<INT64, CInt>(id, val) {}
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class CByte : public CSimpleVar<BYTE, CByte>
+ {
+ public:
+ explicit CByte(DWORD id, BYTE val = 0) : CSimpleVar<BYTE, CByte>(id, val) {}
+ };
+
+ class CShort : public CSimpleVar<short, CShort>
+ {
+ public:
+ explicit CShort(DWORD id, short val = 0) : CSimpleVar<short, CShort>(id, val) {}
+ };
+
+ class CFloat : public CSimpleVar<float, CFloat>
+ {
+ public:
+ explicit CFloat(DWORD id, float val = 0) : CSimpleVar<float, CFloat>(id, val) {}
+ };
+
+ template<class T>
+ class CNode : public CAutoPtrList<T>
+ {
+ public:
+ QWORD Size(bool fWithHeader = true) {
+ QWORD len = 0;
+ POSITION pos = GetHeadPosition();
+ while (pos) {
+ len += GetNext(pos)->Size(fWithHeader);
+ }
+ return len;
+ }
+ HRESULT Write(IStream* pStream) {
+ HRESULT hr;
+ POSITION pos = GetHeadPosition();
+ while (pos) if (FAILED(hr = GetNext(pos)->Write(pStream))) {
+ return hr;
+ }
+ return S_OK;
+ }
+ };
+
+ class EBML : public CID
+ {
+ public:
+ CUInt EBMLVersion, EBMLReadVersion;
+ CUInt EBMLMaxIDLength, EBMLMaxSizeLength;
+ CANSI DocType;
+ CUInt DocTypeVersion, DocTypeReadVersion;
+
+ EBML(DWORD id = 0x1A45DFA3);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class Info : public CID
+ {
+ public:
+ CBinary SegmentUID, PrevUID, NextUID;
+ CUTF8 SegmentFilename, PrevFilename, NextFilename;
+ CUInt TimeCodeScale; // [ns], default: 1.000.000
+ CFloat Duration;
+ CInt DateUTC;
+ CUTF8 Title, MuxingApp, WritingApp;
+
+ Info(DWORD id = 0x1549A966);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class Video : public CID
+ {
+ public:
+ CUInt FlagInterlaced, StereoMode;
+ CUInt PixelWidth, PixelHeight, DisplayWidth, DisplayHeight, DisplayUnit;
+ CUInt AspectRatioType;
+ CUInt ColourSpace;
+ CFloat GammaValue;
+ CFloat FramePerSec;
+
+ Video(DWORD id = 0xE0);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class Audio : public CID
+ {
+ public:
+ CFloat SamplingFrequency;
+ CFloat OutputSamplingFrequency;
+ CUInt Channels;
+ CBinary ChannelPositions;
+ CUInt BitDepth;
+
+ Audio(DWORD id = 0xE1);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class TrackEntry : public CID
+ {
+ public:
+ enum {TypeVideo = 1, TypeAudio = 2, TypeComplex = 3, TypeLogo = 0x10, TypeSubtitle = 0x11, TypeControl = 0x20};
+ CUInt TrackNumber, TrackUID, TrackType;
+ CUInt FlagEnabled, FlagDefault, FlagLacing;
+ CUInt MinCache, MaxCache;
+ CUTF8 Name;
+ CANSI Language;
+ CBinary CodecID;
+ CBinary CodecPrivate;
+ CUTF8 CodecName;
+ CUTF8 CodecSettings;
+ CANSI CodecInfoURL;
+ CANSI CodecDownloadURL;
+ CUInt CodecDecodeAll;
+ CUInt TrackOverlay;
+ CUInt DefaultDuration;
+ enum {NoDesc = 0, DescVideo = 1, DescAudio = 2};
+ int DescType;
+ Video v;
+ Audio a;
+
+ TrackEntry(DWORD id = 0xAE);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class Track : public CID
+ {
+ public:
+ CNode<TrackEntry> TrackEntries;
+
+ Track(DWORD id = 0x1654AE6B);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class CBlock : public CID
+ {
+ public:
+ CLength TrackNumber;
+ REFERENCE_TIME TimeCode, TimeCodeStop;
+ CNode<CBinary> BlockData;
+
+ CBlock(DWORD id = 0xA1);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class BlockGroup : public CID
+ {
+ public:
+ CUInt BlockDuration;
+ CUInt ReferencePriority;
+ CInt ReferenceBlock;
+ CInt ReferenceVirtual;
+ CBinary CodecState;
+ CBlock Block;
+ // CNode<TimeSlice> TimeSlices;
+
+ BlockGroup(DWORD id = 0xA0);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class Cluster : public CID
+ {
+ public:
+ CUInt TimeCode, Position, PrevSize;
+ CNode<BlockGroup> BlockGroups;
+
+ Cluster(DWORD id = 0x1F43B675);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ /* class CueReference : public CID
+ {
+ public:
+ CUInt CueRefTime, CueRefCluster, CueRefNumber, CueRefCodecState;
+
+ CueReference(DWORD id = 0xDB);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+ */
+ class CueTrackPosition : public CID
+ {
+ public:
+ CUInt CueTrack, CueClusterPosition, CueBlockNumber, CueCodecState;
+ // CNode<CueReference> CueReferences;
+
+ CueTrackPosition(DWORD id = 0xB7);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class CuePoint : public CID
+ {
+ public:
+ CUInt CueTime;
+ CNode<CueTrackPosition> CueTrackPositions;
+
+ CuePoint(DWORD id = 0xBB);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class Cue : public CID
+ {
+ public:
+ CNode<CuePoint> CuePoints;
+
+ Cue(DWORD id = 0x1C53BB6B);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class SeekID : public CID
+ {
+ CID m_id;
+ public:
+ SeekID(DWORD id = 0x53AB);
+ void Set(DWORD id) {
+ m_id = id;
+ }
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class SeekHead : public CID
+ {
+ public:
+ SeekID ID;
+ CUInt Position;
+
+ SeekHead(DWORD id = 0x4DBB);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class Seek : public CID
+ {
+ public:
+ CNode<SeekHead> SeekHeads;
+
+ Seek(DWORD id = 0x114D9B74);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class Segment : public CID
+ {
+ public:
+ Segment(DWORD id = 0x18538067);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class Tags : public CID
+ {
+ public:
+ // TODO
+
+ Tags(DWORD id = 0x1254C367);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
+
+ class Void : public CID
+ {
+ QWORD m_len;
+ public:
+ Void(QWORD len, DWORD id = 0xEC);
+ QWORD Size(bool fWithHeader = true);
+ HRESULT Write(IStream* pStream);
+ };
}
diff --git a/src/filters/muxer/MatroskaMuxer/MatroskaMuxer.cpp b/src/filters/muxer/MatroskaMuxer/MatroskaMuxer.cpp
index 63018f926..a936b7455 100644
--- a/src/filters/muxer/MatroskaMuxer/MatroskaMuxer.cpp
+++ b/src/filters/muxer/MatroskaMuxer/MatroskaMuxer.cpp
@@ -36,32 +36,32 @@ using namespace MatroskaWriter;
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_Matroska}
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_Matroska}
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, TRUE, &CLSID_NULL, NULL, 0, NULL},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Input", FALSE, FALSE, FALSE, TRUE, &CLSID_NULL, NULL, 0, NULL},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CMatroskaMuxerFilter), MatroskaMuxerName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CMatroskaMuxerFilter), MatroskaMuxerName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CMatroskaMuxerFilter>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CMatroskaMuxerFilter>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -75,634 +75,634 @@ CFilterApp theApp;
//
CMatroskaMuxerFilter::CMatroskaMuxerFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CBaseFilter(NAME("CMatroskaMuxerFilter"), pUnk, this, __uuidof(this))
- , m_rtCurrent(0)
- , m_fNegative(true), m_fPositive(false)
+ : CBaseFilter(NAME("CMatroskaMuxerFilter"), pUnk, this, __uuidof(this))
+ , m_rtCurrent(0)
+ , m_fNegative(true), m_fPositive(false)
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
- m_pOutput.Attach(DNew CMatroskaMuxerOutputPin(NAME("CMatroskaMuxerOutputPin"), this, this, phr));
+ m_pOutput.Attach(DNew CMatroskaMuxerOutputPin(NAME("CMatroskaMuxerOutputPin"), this, this, phr));
- AddInput();
+ AddInput();
- srand(clock());
+ srand(clock());
}
CMatroskaMuxerFilter::~CMatroskaMuxerFilter()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
}
STDMETHODIMP CMatroskaMuxerFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- *ppv = NULL;
+ *ppv = NULL;
- return
- // QI(IAMFilterMiscFlags)
- QI(IMediaSeeking)
- QI(IMatroskaMuxer)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ // QI(IAMFilterMiscFlags)
+ QI(IMediaSeeking)
+ QI(IMatroskaMuxer)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
UINT CMatroskaMuxerFilter::GetTrackNumber(CBasePin* pPin)
{
- UINT nTrackNumber = 0;
+ UINT nTrackNumber = 0;
- POSITION pos = m_pInputs.GetHeadPosition();
- while (pos) {
- nTrackNumber++;
- if (m_pInputs.GetNext(pos) == pPin) {
- return nTrackNumber;
- }
- }
+ POSITION pos = m_pInputs.GetHeadPosition();
+ while (pos) {
+ nTrackNumber++;
+ if (m_pInputs.GetNext(pos) == pPin) {
+ return nTrackNumber;
+ }
+ }
- return 0;
+ return 0;
}
void CMatroskaMuxerFilter::AddInput()
{
- POSITION pos = m_pInputs.GetHeadPosition();
- while (pos) {
- CBasePin* pPin = m_pInputs.GetNext(pos);
- if (!pPin->IsConnected()) {
- return;
- }
- }
-
- CStringW name;
- name.Format(L"Track %d", m_pInputs.GetCount()+1);
-
- HRESULT hr;
- CAutoPtr<CMatroskaMuxerInputPin> pPin(DNew CMatroskaMuxerInputPin(name, this, this, &hr));
- m_pInputs.AddTail(pPin);
+ POSITION pos = m_pInputs.GetHeadPosition();
+ while (pos) {
+ CBasePin* pPin = m_pInputs.GetNext(pos);
+ if (!pPin->IsConnected()) {
+ return;
+ }
+ }
+
+ CStringW name;
+ name.Format(L"Track %d", m_pInputs.GetCount() + 1);
+
+ HRESULT hr;
+ CAutoPtr<CMatroskaMuxerInputPin> pPin(DNew CMatroskaMuxerInputPin(name, this, this, &hr));
+ m_pInputs.AddTail(pPin);
}
int CMatroskaMuxerFilter::GetPinCount()
{
- return m_pInputs.GetCount() + (m_pOutput ? 1 : 0);
+ return m_pInputs.GetCount() + (m_pOutput ? 1 : 0);
}
CBasePin* CMatroskaMuxerFilter::GetPin(int n)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- if (n >= 0 && n < (int)m_pInputs.GetCount()) {
- if (POSITION pos = m_pInputs.FindIndex(n)) {
- return m_pInputs.GetAt(pos);
- }
- }
+ if (n >= 0 && n < (int)m_pInputs.GetCount()) {
+ if (POSITION pos = m_pInputs.FindIndex(n)) {
+ return m_pInputs.GetAt(pos);
+ }
+ }
- if (n == m_pInputs.GetCount() && m_pOutput) {
- return m_pOutput;
- }
+ if (n == m_pInputs.GetCount() && m_pOutput) {
+ return m_pOutput;
+ }
- return NULL;
+ return NULL;
}
STDMETHODIMP CMatroskaMuxerFilter::Stop()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::Stop())) {
- return hr;
- }
+ if (FAILED(hr = __super::Stop())) {
+ return hr;
+ }
- CallWorker(CMD_EXIT);
+ CallWorker(CMD_EXIT);
- return hr;
+ return hr;
}
STDMETHODIMP CMatroskaMuxerFilter::Pause()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- FILTER_STATE fs = m_State;
+ FILTER_STATE fs = m_State;
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::Pause())) {
- return hr;
- }
+ if (FAILED(hr = __super::Pause())) {
+ return hr;
+ }
- if (fs == State_Stopped && m_pOutput) {
- CAMThread::Create();
- CallWorker(CMD_RUN);
- }
+ if (fs == State_Stopped && m_pOutput) {
+ CAMThread::Create();
+ CallWorker(CMD_RUN);
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CMatroskaMuxerFilter::Run(REFERENCE_TIME tStart)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::Run(tStart))) {
- return hr;
- }
+ if (FAILED(hr = __super::Run(tStart))) {
+ return hr;
+ }
- return hr;
+ return hr;
}
// IAMFilterMiscFlags
STDMETHODIMP_(ULONG) CMatroskaMuxerFilter::GetMiscFlags()
{
- return AM_FILTER_MISC_FLAGS_IS_RENDERER;
+ return AM_FILTER_MISC_FLAGS_IS_RENDERER;
}
// IMediaSeeking
STDMETHODIMP CMatroskaMuxerFilter::GetCapabilities(DWORD* pCapabilities)
{
- return pCapabilities ? *pCapabilities =
- AM_SEEKING_CanGetDuration|
- AM_SEEKING_CanGetCurrentPos, S_OK : E_POINTER;
+ return pCapabilities ? *pCapabilities =
+ AM_SEEKING_CanGetDuration |
+ AM_SEEKING_CanGetCurrentPos, S_OK : E_POINTER;
}
STDMETHODIMP CMatroskaMuxerFilter::CheckCapabilities(DWORD* pCapabilities)
{
- CheckPointer(pCapabilities, E_POINTER);
- if (*pCapabilities == 0) {
- return S_OK;
- }
- DWORD caps;
- GetCapabilities(&caps);
- caps &= *pCapabilities;
- return caps == 0 ? E_FAIL : caps == *pCapabilities ? S_OK : S_FALSE;
+ CheckPointer(pCapabilities, E_POINTER);
+ if (*pCapabilities == 0) {
+ return S_OK;
+ }
+ DWORD caps;
+ GetCapabilities(&caps);
+ caps &= *pCapabilities;
+ return caps == 0 ? E_FAIL : caps == *pCapabilities ? S_OK : S_FALSE;
}
STDMETHODIMP CMatroskaMuxerFilter::IsFormatSupported(const GUID* pFormat)
{
- return !pFormat ? E_POINTER : *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : S_FALSE;
+ return !pFormat ? E_POINTER : *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : S_FALSE;
}
STDMETHODIMP CMatroskaMuxerFilter::QueryPreferredFormat(GUID* pFormat)
{
- return GetTimeFormat(pFormat);
+ return GetTimeFormat(pFormat);
}
STDMETHODIMP CMatroskaMuxerFilter::GetTimeFormat(GUID* pFormat)
{
- return pFormat ? *pFormat = TIME_FORMAT_MEDIA_TIME, S_OK : E_POINTER;
+ return pFormat ? *pFormat = TIME_FORMAT_MEDIA_TIME, S_OK : E_POINTER;
}
STDMETHODIMP CMatroskaMuxerFilter::IsUsingTimeFormat(const GUID* pFormat)
{
- return IsFormatSupported(pFormat);
+ return IsFormatSupported(pFormat);
}
STDMETHODIMP CMatroskaMuxerFilter::SetTimeFormat(const GUID* pFormat)
{
- return S_OK == IsFormatSupported(pFormat) ? S_OK : E_INVALIDARG;
+ return S_OK == IsFormatSupported(pFormat) ? S_OK : E_INVALIDARG;
}
STDMETHODIMP CMatroskaMuxerFilter::GetDuration(LONGLONG* pDuration)
{
- CheckPointer(pDuration, E_POINTER);
- *pDuration = 0;
- POSITION pos = m_pInputs.GetHeadPosition();
- while (pos) {
- REFERENCE_TIME rt = m_pInputs.GetNext(pos)->m_rtDur;
- if (rt > *pDuration) {
- *pDuration = rt;
- }
- }
- return S_OK;
+ CheckPointer(pDuration, E_POINTER);
+ *pDuration = 0;
+ POSITION pos = m_pInputs.GetHeadPosition();
+ while (pos) {
+ REFERENCE_TIME rt = m_pInputs.GetNext(pos)->m_rtDur;
+ if (rt > *pDuration) {
+ *pDuration = rt;
+ }
+ }
+ return S_OK;
}
STDMETHODIMP CMatroskaMuxerFilter::GetStopPosition(LONGLONG* pStop)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CMatroskaMuxerFilter::GetCurrentPosition(LONGLONG* pCurrent)
{
- CheckPointer(pCurrent, E_POINTER);
- *pCurrent = m_rtCurrent;
- return S_OK;
+ CheckPointer(pCurrent, E_POINTER);
+ *pCurrent = m_rtCurrent;
+ return S_OK;
}
STDMETHODIMP CMatroskaMuxerFilter::ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CMatroskaMuxerFilter::SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CMatroskaMuxerFilter::GetPositions(LONGLONG* pCurrent, LONGLONG* pStop)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CMatroskaMuxerFilter::GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CMatroskaMuxerFilter::SetRate(double dRate)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CMatroskaMuxerFilter::GetRate(double* pdRate)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CMatroskaMuxerFilter::GetPreroll(LONGLONG* pllPreroll)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// IMatroskaMuxer
STDMETHODIMP CMatroskaMuxerFilter::CorrectTimeOffset(bool fNegative, bool fPositive)
{
- m_fNegative = fNegative;
- m_fPositive = fPositive;
- return S_OK;
+ m_fNegative = fNegative;
+ m_fPositive = fPositive;
+ return S_OK;
}
//
ULONGLONG GetStreamPosition(IStream* pStream)
{
- ULARGE_INTEGER pos = {0, 0};
- pStream->Seek(*(LARGE_INTEGER*)&pos, STREAM_SEEK_CUR, &pos);
- return pos.QuadPart;
+ ULARGE_INTEGER pos = {0, 0};
+ pStream->Seek(*(LARGE_INTEGER*)&pos, STREAM_SEEK_CUR, &pos);
+ return pos.QuadPart;
}
ULONGLONG SetStreamPosition(IStream* pStream, ULONGLONG seekpos)
{
- LARGE_INTEGER pos;
- pos.QuadPart = seekpos;
- ULARGE_INTEGER posnew;
- posnew.QuadPart = GetStreamPosition(pStream);
- pStream->Seek(pos, STREAM_SEEK_SET, &posnew);
- return posnew.QuadPart;
+ LARGE_INTEGER pos;
+ pos.QuadPart = seekpos;
+ ULARGE_INTEGER posnew;
+ posnew.QuadPart = GetStreamPosition(pStream);
+ pStream->Seek(pos, STREAM_SEEK_SET, &posnew);
+ return posnew.QuadPart;
}
DWORD CMatroskaMuxerFilter::ThreadProc()
{
- CComQIPtr<IStream> pStream;
-
- if (!m_pOutput || !(pStream = m_pOutput->GetConnected())) {
- for (;;) {
- DWORD cmd = GetRequest();
- if (cmd == CMD_EXIT) {
- CAMThread::m_hThread = NULL;
- }
- Reply(S_OK);
- if (cmd == CMD_EXIT) {
- return 0;
- }
- }
- }
-
- REFERENCE_TIME rtDur = 0;
- GetDuration(&rtDur);
-
- SetStreamPosition(pStream, 0);
-
- ULARGE_INTEGER uli = {0};
- pStream->SetSize(uli);
-
- EBML hdr;
- hdr.DocType.Set("matroska");
- hdr.DocTypeVersion.Set(1);
- hdr.DocTypeReadVersion.Set(1);
- hdr.Write(pStream);
-
- Segment().Write(pStream);
- ULONGLONG segpos = GetStreamPosition(pStream);
-
- // TODO
- MatroskaWriter::QWORD voidlen = 100;
- if (rtDur > 0) {
- voidlen += int(1.0 * rtDur / MAXCLUSTERTIME / 10000 + 0.5) * 20;
- } else {
- voidlen += int(1.0 * 1000*60*60*24 / MAXCLUSTERTIME + 0.5) * 20; // when no duration is known, allocate for 24 hours (~340k)
- }
- ULONGLONG voidpos = GetStreamPosition(pStream);
- {
- Void v(voidlen);
- voidlen = v.Size();
- v.Write(pStream);
- }
-
- // Meta Seek
-
- Seek seek;
- CAutoPtr<SeekHead> sh;
-
- // Segment Info
-
- sh.Attach(DNew SeekHead());
- sh->ID.Set(0x1549A966);
- sh->Position.Set(GetStreamPosition(pStream) - segpos);
- seek.SeekHeads.AddTail(sh);
-
- ULONGLONG infopos = GetStreamPosition(pStream);
- Info info;
- info.MuxingApp.Set(L"DirectShow Matroska Muxer");
- info.TimeCodeScale.Set(1000000);
- info.Duration.Set((float)rtDur / 10000);
- struct tm _2001 = {0, 0, 0, 1, 0, 101, 0, 0, 1};
- info.DateUTC.Set((_time64(NULL) - _mktime64(&_2001)) * 1000000000);
- info.Write(pStream);
-
- // Tracks
-
- sh.Attach(DNew SeekHead());
- sh->ID.Set(0x1654AE6B);
- sh->Position.Set(GetStreamPosition(pStream) - segpos);
- seek.SeekHeads.AddTail(sh);
-
- UINT64 TrackNumber = 0;
- /*
- CNode<Track> Tracks;
- CAutoPtr<Track> pT(DNew Track());
- POSITION pos = m_pInputs.GetHeadPosition();
- for (int i = 1; pos; i++)
- {
- CMatroskaMuxerInputPin* pPin = m_pInputs.GetNext(pos);
- if (!pPin->IsConnected()) continue;
-
- CAutoPtr<TrackEntry> pTE(DNew TrackEntry());
- *pTE = *pPin->GetTrackEntry();
- if (TrackNumber == 0 && pTE->TrackType == TrackEntry::TypeVideo)
- TrackNumber = pTE->TrackNumber;
- pT->TrackEntries.AddTail(pTE);
- }
- Tracks.AddTail(pT);
- Tracks.Write(pStream);
-
- if (TrackNumber == 0) TrackNumber = 1;
- */
- bool fTracksWritten = false;
-
- //
-
- Cluster c;
- c.TimeCode.Set(0);
-
- bool fFirstBlock = true;
- INT64 firstTimeCode = 0;
-
- CAtlList<CMatroskaMuxerInputPin*> pActivePins;
-
- POSITION pos = m_pInputs.GetHeadPosition();
- while (pos) {
- CMatroskaMuxerInputPin* pPin = m_pInputs.GetNext(pos);
- if (pPin->IsConnected()) {
- pActivePins.AddTail(pPin);
- }
- }
-
- for (;;) {
- DWORD cmd = GetRequest();
-
- switch (cmd) {
- default:
- case CMD_EXIT:
- CAMThread::m_hThread = NULL;
- Reply(S_OK);
- return 0;
-
- case CMD_RUN:
- Reply(S_OK);
-
- Cue cue;
- ULONGLONG lastcueclusterpos = (ULONGLONG)-1;
- INT64 lastcuetimecode = (INT64)-1;
- UINT64 nBlocksInCueTrack = 0;
-
- while (!CheckRequest(NULL)) {
- if (m_State == State_Paused) {
- Sleep(10);
- continue;
- }
-
- int nPinsGotSomething = 0, nPinsNeeded = 0;
- CMatroskaMuxerInputPin* pPin = NULL;
- REFERENCE_TIME rtMin = _I64_MAX;
-
- pos = pActivePins.GetHeadPosition();
- while (pos) {
- CMatroskaMuxerInputPin* pTmp = pActivePins.GetNext(pos);
-
- CAutoLock cAutoLock(&pTmp->m_csQueue);
-
- if (pTmp->m_blocks.GetCount() == 0 && pTmp->m_fEndOfStreamReceived) {
- pActivePins.RemoveAt(pActivePins.Find(pTmp));
- continue;
- }
-
- if (pTmp->GetTrackEntry()->TrackType != TrackEntry::TypeSubtitle) {
- nPinsNeeded++;
- }
-
- if (pTmp->m_blocks.GetCount() > 0) {
- if (pTmp->GetTrackEntry()->TrackType != TrackEntry::TypeSubtitle) {
- nPinsGotSomething++;
- }
-
- if (pTmp->m_blocks.GetCount() > 0) {
- REFERENCE_TIME rt = pTmp->m_blocks.GetHead()->Block.TimeCode;
- if (rt < rtMin) {
- rtMin = rt;
- pPin = pTmp;
- }
- }
- }
- }
-
- if (pActivePins.GetCount() == 0) {
- break;
- }
-
- if (!pPin || nPinsNeeded > nPinsGotSomething || !pPin && nPinsGotSomething == 0) {
- Sleep(1);
- continue;
- }
-
- if (!fTracksWritten) {
- CNode<Track> Tracks;
- CAutoPtr<Track> pT(DNew Track());
- POSITION pos = pActivePins.GetHeadPosition();
- for (int i = 1; pos; i++) {
- CMatroskaMuxerInputPin* pPin = pActivePins.GetNext(pos);
-
- CAutoPtr<TrackEntry> pTE(DNew TrackEntry());
- *pTE = *pPin->GetTrackEntry();
- if (TrackNumber == 0 && pTE->TrackType == TrackEntry::TypeVideo) {
- TrackNumber = pTE->TrackNumber;
- }
- pT->TrackEntries.AddTail(pTE);
- }
- Tracks.AddTail(pT);
- Tracks.Write(pStream);
-
- if (TrackNumber == 0) {
- TrackNumber = 1;
- }
-
- fTracksWritten = true;
- }
-
- ASSERT(pPin);
-
- CAutoPtr<BlockGroup> b;
-
- {
- CAutoLock cAutoLock(&pPin->m_csQueue);
- b = pPin->m_blocks.RemoveHead();
- }
-
- if (b) {
- if (fFirstBlock) {
- if (b->Block.TimeCode < 0 && m_fNegative || b->Block.TimeCode > 0 && m_fPositive) {
- firstTimeCode = b->Block.TimeCode;
- }
- fFirstBlock = false;
- }
-
- b->Block.TimeCode -= firstTimeCode;
- b->Block.TimeCodeStop -= firstTimeCode;
-
- /*
- TRACE(_T("Muxing (%d): %I64d-%I64d dur=%I64d (c=%d, co=%dms), cnt=%d, ref=%d\n"),
- GetTrackNumber(pPin),
- (INT64)b->Block.TimeCode, (INT64)b->Block.TimeCodeStop, (UINT64)b->BlockDuration,
- (int)((b->Block.TimeCode)/MAXCLUSTERTIME), (int)(b->Block.TimeCode%MAXCLUSTERTIME),
- b->Block.BlockData.GetCount(), (int)b->ReferenceBlock);
- */
- if (b->Block.TimeCode < SHRT_MIN /*0*/) {
- ASSERT(0);
- continue;
- }
-
- while ((INT64)(c.TimeCode + MAXCLUSTERTIME) < b->Block.TimeCode) {
- if (!c.BlockGroups.IsEmpty()) {
- sh.Attach(DNew SeekHead());
- sh->ID.Set(c.GetID()/*0x1F43B675*/);
- sh->Position.Set(GetStreamPosition(pStream) - segpos);
- seek.SeekHeads.AddTail(sh);
-
- c.Write(pStream); // TODO: write blocks
- }
-
- c.TimeCode.Set(c.TimeCode + MAXCLUSTERTIME);
- c.BlockGroups.RemoveAll();
- nBlocksInCueTrack = 0;
- }
-
- if (b->Block.TrackNumber == TrackNumber) {
- nBlocksInCueTrack++;
- }
-
- if (b->ReferenceBlock == 0 && b->Block.TrackNumber == TrackNumber) {
- ULONGLONG clusterpos = GetStreamPosition(pStream) - segpos;
- if (lastcueclusterpos != clusterpos || lastcuetimecode + 1000 < b->Block.TimeCode) {
- CAutoPtr<CueTrackPosition> ctp(DNew CueTrackPosition());
- ctp->CueTrack.Set(b->Block.TrackNumber);
- ctp->CueClusterPosition.Set(clusterpos);
- if (c.BlockGroups.GetCount() > 0) {
- ctp->CueBlockNumber.Set(nBlocksInCueTrack);
- }
- CAutoPtr<CuePoint> cp(DNew CuePoint());
- cp->CueTime.Set(b->Block.TimeCode);
- cp->CueTrackPositions.AddTail(ctp);
- cue.CuePoints.AddTail(cp);
- lastcueclusterpos = clusterpos;
- lastcuetimecode = b->Block.TimeCode;
- }
- }
-
- info.Duration.Set(max(info.Duration, (float)b->Block.TimeCodeStop));
-
- m_rtCurrent = b->Block.TimeCode*10000;
-
- b->Block.TimeCode -= c.TimeCode;
- c.BlockGroups.AddTail(b);
- }
- }
-
- if (!c.BlockGroups.IsEmpty()) {
- sh.Attach(DNew SeekHead());
- sh->ID.Set(c.GetID()/*0x1F43B675*/);
- sh->Position.Set(GetStreamPosition(pStream) - segpos);
- seek.SeekHeads.AddTail(sh);
-
- c.Write(pStream);
- }
-
- if (!cue.CuePoints.IsEmpty()) {
- sh.Attach(DNew SeekHead());
- sh->ID.Set(cue.GetID()/*0x1C53BB6B*/);
- sh->Position.Set(GetStreamPosition(pStream) - segpos);
- seek.SeekHeads.AddTail(sh);
-
- cue.Write(pStream);
- }
-
- {
- Tags tags;
-
- sh.Attach(DNew SeekHead());
- sh->ID.Set(tags.GetID());
- sh->Position.Set(GetStreamPosition(pStream) - segpos);
- seek.SeekHeads.AddTail(sh);
-
- tags.Write(pStream);
- }
-
- SetStreamPosition(pStream, voidpos);
- int len = (int)(voidlen - seek.Size());
- ASSERT(len >= 0 && len != 1);
- seek.Write(pStream);
-
- if (len == 0) {
- // nothing to do
- } else if (len >= 2) {
- for (int i = 0; i < 8; i++) {
- if (len >= (1<<i*7)-2 && len <= (1<<(i+1)*7)-2) {
- Void(len-2-i).Write(pStream);
- break;
- }
- }
- }
-
- if (abs(m_rtCurrent - (REFERENCE_TIME)info.Duration*10000) > 10000000i64) {
- info.Duration.Set(m_rtCurrent / 10000 + 1);
- }
-
- SetStreamPosition(pStream, infopos);
- info.Write(pStream);
-
- // TODO: write some tags
-
- m_pOutput->DeliverEndOfStream();
-
- break;
- }
- }
-
- ASSERT(0); // we should only exit via CMD_EXIT
-
- CAMThread::m_hThread = NULL;
- return 0;
+ CComQIPtr<IStream> pStream;
+
+ if (!m_pOutput || !(pStream = m_pOutput->GetConnected())) {
+ for (;;) {
+ DWORD cmd = GetRequest();
+ if (cmd == CMD_EXIT) {
+ CAMThread::m_hThread = NULL;
+ }
+ Reply(S_OK);
+ if (cmd == CMD_EXIT) {
+ return 0;
+ }
+ }
+ }
+
+ REFERENCE_TIME rtDur = 0;
+ GetDuration(&rtDur);
+
+ SetStreamPosition(pStream, 0);
+
+ ULARGE_INTEGER uli = {0};
+ pStream->SetSize(uli);
+
+ EBML hdr;
+ hdr.DocType.Set("matroska");
+ hdr.DocTypeVersion.Set(1);
+ hdr.DocTypeReadVersion.Set(1);
+ hdr.Write(pStream);
+
+ Segment().Write(pStream);
+ ULONGLONG segpos = GetStreamPosition(pStream);
+
+ // TODO
+ MatroskaWriter::QWORD voidlen = 100;
+ if (rtDur > 0) {
+ voidlen += int(1.0 * rtDur / MAXCLUSTERTIME / 10000 + 0.5) * 20;
+ } else {
+ voidlen += int(1.0 * 1000 * 60 * 60 * 24 / MAXCLUSTERTIME + 0.5) * 20; // when no duration is known, allocate for 24 hours (~340k)
+ }
+ ULONGLONG voidpos = GetStreamPosition(pStream);
+ {
+ Void v(voidlen);
+ voidlen = v.Size();
+ v.Write(pStream);
+ }
+
+ // Meta Seek
+
+ Seek seek;
+ CAutoPtr<SeekHead> sh;
+
+ // Segment Info
+
+ sh.Attach(DNew SeekHead());
+ sh->ID.Set(0x1549A966);
+ sh->Position.Set(GetStreamPosition(pStream) - segpos);
+ seek.SeekHeads.AddTail(sh);
+
+ ULONGLONG infopos = GetStreamPosition(pStream);
+ Info info;
+ info.MuxingApp.Set(L"DirectShow Matroska Muxer");
+ info.TimeCodeScale.Set(1000000);
+ info.Duration.Set((float)rtDur / 10000);
+ struct tm _2001 = {0, 0, 0, 1, 0, 101, 0, 0, 1};
+ info.DateUTC.Set((_time64(NULL) - _mktime64(&_2001)) * 1000000000);
+ info.Write(pStream);
+
+ // Tracks
+
+ sh.Attach(DNew SeekHead());
+ sh->ID.Set(0x1654AE6B);
+ sh->Position.Set(GetStreamPosition(pStream) - segpos);
+ seek.SeekHeads.AddTail(sh);
+
+ UINT64 TrackNumber = 0;
+ /*
+ CNode<Track> Tracks;
+ CAutoPtr<Track> pT(DNew Track());
+ POSITION pos = m_pInputs.GetHeadPosition();
+ for (int i = 1; pos; i++)
+ {
+ CMatroskaMuxerInputPin* pPin = m_pInputs.GetNext(pos);
+ if (!pPin->IsConnected()) continue;
+
+ CAutoPtr<TrackEntry> pTE(DNew TrackEntry());
+ *pTE = *pPin->GetTrackEntry();
+ if (TrackNumber == 0 && pTE->TrackType == TrackEntry::TypeVideo)
+ TrackNumber = pTE->TrackNumber;
+ pT->TrackEntries.AddTail(pTE);
+ }
+ Tracks.AddTail(pT);
+ Tracks.Write(pStream);
+
+ if (TrackNumber == 0) TrackNumber = 1;
+ */
+ bool fTracksWritten = false;
+
+ //
+
+ Cluster c;
+ c.TimeCode.Set(0);
+
+ bool fFirstBlock = true;
+ INT64 firstTimeCode = 0;
+
+ CAtlList<CMatroskaMuxerInputPin*> pActivePins;
+
+ POSITION pos = m_pInputs.GetHeadPosition();
+ while (pos) {
+ CMatroskaMuxerInputPin* pPin = m_pInputs.GetNext(pos);
+ if (pPin->IsConnected()) {
+ pActivePins.AddTail(pPin);
+ }
+ }
+
+ for (;;) {
+ DWORD cmd = GetRequest();
+
+ switch (cmd) {
+ default:
+ case CMD_EXIT:
+ CAMThread::m_hThread = NULL;
+ Reply(S_OK);
+ return 0;
+
+ case CMD_RUN:
+ Reply(S_OK);
+
+ Cue cue;
+ ULONGLONG lastcueclusterpos = (ULONGLONG) - 1;
+ INT64 lastcuetimecode = (INT64) - 1;
+ UINT64 nBlocksInCueTrack = 0;
+
+ while (!CheckRequest(NULL)) {
+ if (m_State == State_Paused) {
+ Sleep(10);
+ continue;
+ }
+
+ int nPinsGotSomething = 0, nPinsNeeded = 0;
+ CMatroskaMuxerInputPin* pPin = NULL;
+ REFERENCE_TIME rtMin = _I64_MAX;
+
+ pos = pActivePins.GetHeadPosition();
+ while (pos) {
+ CMatroskaMuxerInputPin* pTmp = pActivePins.GetNext(pos);
+
+ CAutoLock cAutoLock(&pTmp->m_csQueue);
+
+ if (pTmp->m_blocks.GetCount() == 0 && pTmp->m_fEndOfStreamReceived) {
+ pActivePins.RemoveAt(pActivePins.Find(pTmp));
+ continue;
+ }
+
+ if (pTmp->GetTrackEntry()->TrackType != TrackEntry::TypeSubtitle) {
+ nPinsNeeded++;
+ }
+
+ if (pTmp->m_blocks.GetCount() > 0) {
+ if (pTmp->GetTrackEntry()->TrackType != TrackEntry::TypeSubtitle) {
+ nPinsGotSomething++;
+ }
+
+ if (pTmp->m_blocks.GetCount() > 0) {
+ REFERENCE_TIME rt = pTmp->m_blocks.GetHead()->Block.TimeCode;
+ if (rt < rtMin) {
+ rtMin = rt;
+ pPin = pTmp;
+ }
+ }
+ }
+ }
+
+ if (pActivePins.GetCount() == 0) {
+ break;
+ }
+
+ if (!pPin || nPinsNeeded > nPinsGotSomething || !pPin && nPinsGotSomething == 0) {
+ Sleep(1);
+ continue;
+ }
+
+ if (!fTracksWritten) {
+ CNode<Track> Tracks;
+ CAutoPtr<Track> pT(DNew Track());
+ POSITION pos = pActivePins.GetHeadPosition();
+ for (int i = 1; pos; i++) {
+ CMatroskaMuxerInputPin* pPin = pActivePins.GetNext(pos);
+
+ CAutoPtr<TrackEntry> pTE(DNew TrackEntry());
+ *pTE = *pPin->GetTrackEntry();
+ if (TrackNumber == 0 && pTE->TrackType == TrackEntry::TypeVideo) {
+ TrackNumber = pTE->TrackNumber;
+ }
+ pT->TrackEntries.AddTail(pTE);
+ }
+ Tracks.AddTail(pT);
+ Tracks.Write(pStream);
+
+ if (TrackNumber == 0) {
+ TrackNumber = 1;
+ }
+
+ fTracksWritten = true;
+ }
+
+ ASSERT(pPin);
+
+ CAutoPtr<BlockGroup> b;
+
+ {
+ CAutoLock cAutoLock(&pPin->m_csQueue);
+ b = pPin->m_blocks.RemoveHead();
+ }
+
+ if (b) {
+ if (fFirstBlock) {
+ if (b->Block.TimeCode < 0 && m_fNegative || b->Block.TimeCode > 0 && m_fPositive) {
+ firstTimeCode = b->Block.TimeCode;
+ }
+ fFirstBlock = false;
+ }
+
+ b->Block.TimeCode -= firstTimeCode;
+ b->Block.TimeCodeStop -= firstTimeCode;
+
+ /*
+ TRACE(_T("Muxing (%d): %I64d-%I64d dur=%I64d (c=%d, co=%dms), cnt=%d, ref=%d\n"),
+ GetTrackNumber(pPin),
+ (INT64)b->Block.TimeCode, (INT64)b->Block.TimeCodeStop, (UINT64)b->BlockDuration,
+ (int)((b->Block.TimeCode)/MAXCLUSTERTIME), (int)(b->Block.TimeCode%MAXCLUSTERTIME),
+ b->Block.BlockData.GetCount(), (int)b->ReferenceBlock);
+ */
+ if (b->Block.TimeCode < SHRT_MIN /*0*/) {
+ ASSERT(0);
+ continue;
+ }
+
+ while ((INT64)(c.TimeCode + MAXCLUSTERTIME) < b->Block.TimeCode) {
+ if (!c.BlockGroups.IsEmpty()) {
+ sh.Attach(DNew SeekHead());
+ sh->ID.Set(c.GetID()/*0x1F43B675*/);
+ sh->Position.Set(GetStreamPosition(pStream) - segpos);
+ seek.SeekHeads.AddTail(sh);
+
+ c.Write(pStream); // TODO: write blocks
+ }
+
+ c.TimeCode.Set(c.TimeCode + MAXCLUSTERTIME);
+ c.BlockGroups.RemoveAll();
+ nBlocksInCueTrack = 0;
+ }
+
+ if (b->Block.TrackNumber == TrackNumber) {
+ nBlocksInCueTrack++;
+ }
+
+ if (b->ReferenceBlock == 0 && b->Block.TrackNumber == TrackNumber) {
+ ULONGLONG clusterpos = GetStreamPosition(pStream) - segpos;
+ if (lastcueclusterpos != clusterpos || lastcuetimecode + 1000 < b->Block.TimeCode) {
+ CAutoPtr<CueTrackPosition> ctp(DNew CueTrackPosition());
+ ctp->CueTrack.Set(b->Block.TrackNumber);
+ ctp->CueClusterPosition.Set(clusterpos);
+ if (c.BlockGroups.GetCount() > 0) {
+ ctp->CueBlockNumber.Set(nBlocksInCueTrack);
+ }
+ CAutoPtr<CuePoint> cp(DNew CuePoint());
+ cp->CueTime.Set(b->Block.TimeCode);
+ cp->CueTrackPositions.AddTail(ctp);
+ cue.CuePoints.AddTail(cp);
+ lastcueclusterpos = clusterpos;
+ lastcuetimecode = b->Block.TimeCode;
+ }
+ }
+
+ info.Duration.Set(max(info.Duration, (float)b->Block.TimeCodeStop));
+
+ m_rtCurrent = b->Block.TimeCode * 10000;
+
+ b->Block.TimeCode -= c.TimeCode;
+ c.BlockGroups.AddTail(b);
+ }
+ }
+
+ if (!c.BlockGroups.IsEmpty()) {
+ sh.Attach(DNew SeekHead());
+ sh->ID.Set(c.GetID()/*0x1F43B675*/);
+ sh->Position.Set(GetStreamPosition(pStream) - segpos);
+ seek.SeekHeads.AddTail(sh);
+
+ c.Write(pStream);
+ }
+
+ if (!cue.CuePoints.IsEmpty()) {
+ sh.Attach(DNew SeekHead());
+ sh->ID.Set(cue.GetID()/*0x1C53BB6B*/);
+ sh->Position.Set(GetStreamPosition(pStream) - segpos);
+ seek.SeekHeads.AddTail(sh);
+
+ cue.Write(pStream);
+ }
+
+ {
+ Tags tags;
+
+ sh.Attach(DNew SeekHead());
+ sh->ID.Set(tags.GetID());
+ sh->Position.Set(GetStreamPosition(pStream) - segpos);
+ seek.SeekHeads.AddTail(sh);
+
+ tags.Write(pStream);
+ }
+
+ SetStreamPosition(pStream, voidpos);
+ int len = (int)(voidlen - seek.Size());
+ ASSERT(len >= 0 && len != 1);
+ seek.Write(pStream);
+
+ if (len == 0) {
+ // nothing to do
+ } else if (len >= 2) {
+ for (int i = 0; i < 8; i++) {
+ if (len >= (1 << i * 7) - 2 && len <= (1 << (i + 1) * 7) - 2) {
+ Void(len - 2 - i).Write(pStream);
+ break;
+ }
+ }
+ }
+
+ if (abs(m_rtCurrent - (REFERENCE_TIME)info.Duration * 10000) > 10000000i64) {
+ info.Duration.Set(m_rtCurrent / 10000 + 1);
+ }
+
+ SetStreamPosition(pStream, infopos);
+ info.Write(pStream);
+
+ // TODO: write some tags
+
+ m_pOutput->DeliverEndOfStream();
+
+ break;
+ }
+ }
+
+ ASSERT(0); // we should only exit via CMD_EXIT
+
+ CAMThread::m_hThread = NULL;
+ return 0;
}
//
@@ -710,10 +710,10 @@ DWORD CMatroskaMuxerFilter::ThreadProc()
//
CMatroskaMuxerInputPin::CMatroskaMuxerInputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBaseInputPin(NAME("CMatroskaMuxerInputPin"), pFilter, pLock, phr, pName)
- , m_fActive(false)
- , m_fEndOfStreamReceived(false)
- , m_rtDur(0)
+ : CBaseInputPin(NAME("CMatroskaMuxerInputPin"), pFilter, pLock, phr, pName)
+ , m_fActive(false)
+ , m_fEndOfStreamReceived(false)
+ , m_rtDur(0)
{
}
@@ -723,614 +723,614 @@ CMatroskaMuxerInputPin::~CMatroskaMuxerInputPin()
STDMETHODIMP CMatroskaMuxerInputPin::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CMatroskaMuxerInputPin::CheckMediaType(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Video && (pmt->formattype == FORMAT_VideoInfo
- || pmt->formattype == FORMAT_VideoInfo2)
- // || pmt->majortype == MEDIATYPE_Video && pmt->subtype == MEDIASUBTYPE_MPEG1Payload && pmt->formattype == FORMAT_MPEGVideo
- // || pmt->majortype == MEDIATYPE_Video && pmt->subtype == MEDIASUBTYPE_MPEG2_VIDEO && pmt->formattype == FORMAT_MPEG2_VIDEO
- || pmt->majortype == MEDIATYPE_Video && pmt->subtype == MEDIASUBTYPE_DiracVideo && pmt->formattype == FORMAT_DiracVideoInfo
- || pmt->majortype == MEDIATYPE_Audio && pmt->formattype == FORMAT_WaveFormatEx && pmt->subtype == FOURCCMap(((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag)
- || pmt->majortype == MEDIATYPE_Audio && pmt->subtype == MEDIASUBTYPE_Vorbis && pmt->formattype == FORMAT_VorbisFormat
- || pmt->majortype == MEDIATYPE_Audio && pmt->subtype == MEDIASUBTYPE_Vorbis2 && pmt->formattype == FORMAT_VorbisFormat2
- || pmt->majortype == MEDIATYPE_Audio && (pmt->subtype == MEDIASUBTYPE_14_4
- || pmt->subtype == MEDIASUBTYPE_28_8
- || pmt->subtype == MEDIASUBTYPE_ATRC
- || pmt->subtype == MEDIASUBTYPE_COOK
- || pmt->subtype == MEDIASUBTYPE_DNET
- || pmt->subtype == MEDIASUBTYPE_SIPR) && pmt->formattype == FORMAT_WaveFormatEx
- || pmt->majortype == MEDIATYPE_Text && pmt->subtype == MEDIASUBTYPE_NULL && pmt->formattype == FORMAT_None
- || pmt->majortype == MEDIATYPE_Subtitle && pmt->formattype == FORMAT_SubtitleInfo
- ? S_OK
- : E_INVALIDARG;
+ return pmt->majortype == MEDIATYPE_Video && (pmt->formattype == FORMAT_VideoInfo
+ || pmt->formattype == FORMAT_VideoInfo2)
+ // || pmt->majortype == MEDIATYPE_Video && pmt->subtype == MEDIASUBTYPE_MPEG1Payload && pmt->formattype == FORMAT_MPEGVideo
+ // || pmt->majortype == MEDIATYPE_Video && pmt->subtype == MEDIASUBTYPE_MPEG2_VIDEO && pmt->formattype == FORMAT_MPEG2_VIDEO
+ || pmt->majortype == MEDIATYPE_Video && pmt->subtype == MEDIASUBTYPE_DiracVideo && pmt->formattype == FORMAT_DiracVideoInfo
+ || pmt->majortype == MEDIATYPE_Audio && pmt->formattype == FORMAT_WaveFormatEx && pmt->subtype == FOURCCMap(((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag)
+ || pmt->majortype == MEDIATYPE_Audio && pmt->subtype == MEDIASUBTYPE_Vorbis && pmt->formattype == FORMAT_VorbisFormat
+ || pmt->majortype == MEDIATYPE_Audio && pmt->subtype == MEDIASUBTYPE_Vorbis2 && pmt->formattype == FORMAT_VorbisFormat2
+ || pmt->majortype == MEDIATYPE_Audio && (pmt->subtype == MEDIASUBTYPE_14_4
+ || pmt->subtype == MEDIASUBTYPE_28_8
+ || pmt->subtype == MEDIASUBTYPE_ATRC
+ || pmt->subtype == MEDIASUBTYPE_COOK
+ || pmt->subtype == MEDIASUBTYPE_DNET
+ || pmt->subtype == MEDIASUBTYPE_SIPR) && pmt->formattype == FORMAT_WaveFormatEx
+ || pmt->majortype == MEDIATYPE_Text && pmt->subtype == MEDIASUBTYPE_NULL && pmt->formattype == FORMAT_None
+ || pmt->majortype == MEDIATYPE_Subtitle && pmt->formattype == FORMAT_SubtitleInfo
+ ? S_OK
+ : E_INVALIDARG;
}
HRESULT CMatroskaMuxerInputPin::BreakConnect()
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::BreakConnect())) {
- return hr;
- }
+ if (FAILED(hr = __super::BreakConnect())) {
+ return hr;
+ }
- m_pTE.Free();
+ m_pTE.Free();
- return hr;
+ return hr;
}
HRESULT CMatroskaMuxerInputPin::CompleteConnect(IPin* pPin)
{
- HRESULT hr;
-
- if (FAILED(hr = __super::CompleteConnect(pPin))) {
- return hr;
- }
-
- m_rtDur = 0;
- CComQIPtr<IMediaSeeking> pMS;
- if ((pMS = GetFilterFromPin(pPin)) || (pMS = pPin)) {
- pMS->GetDuration(&m_rtDur);
- }
-
- m_pTE.Free();
- m_pTE.Attach(DNew TrackEntry());
-
- m_pTE->TrackUID.Set(rand());
- m_pTE->MinCache.Set(1);
- m_pTE->MaxCache.Set(1);
- m_pTE->TrackNumber.Set((static_cast<CMatroskaMuxerFilter*>(m_pFilter))->GetTrackNumber(this));
-
- hr = E_FAIL;
-
- if (m_mt.majortype == MEDIATYPE_Video) {
- m_pTE->TrackType.Set(TrackEntry::TypeVideo);
-
- if (m_mt.formattype == FORMAT_VideoInfo
- && m_mt.subtype == MEDIASUBTYPE_RV10 || m_mt.subtype == MEDIASUBTYPE_RV20
- || m_mt.subtype == MEDIASUBTYPE_RV30 || m_mt.subtype == MEDIASUBTYPE_RV40) {
- m_pTE->CodecID.Set("V_REAL/RV00");
- m_pTE->CodecID.SetAt(9, (BYTE)(m_mt.subtype.Data1>>16));
-
- if (m_mt.formattype == FORMAT_VideoInfo) {
- VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)m_mt.pbFormat;
- if (m_mt.cbFormat > sizeof(VIDEOINFOHEADER)) {
- m_pTE->CodecPrivate.SetCount(m_mt.cbFormat - sizeof(VIDEOINFOHEADER));
- memcpy(m_pTE->CodecPrivate, m_mt.pbFormat + sizeof(VIDEOINFOHEADER), m_pTE->CodecPrivate.GetCount());
- }
- m_pTE->DefaultDuration.Set(vih->AvgTimePerFrame*100);
- m_pTE->DescType = TrackEntry::DescVideo;
- m_pTE->v.PixelWidth.Set(vih->bmiHeader.biWidth);
- m_pTE->v.PixelHeight.Set(abs(vih->bmiHeader.biHeight));
- if (vih->AvgTimePerFrame > 0) {
- m_pTE->v.FramePerSec.Set((float)(10000000.0 / vih->AvgTimePerFrame));
- }
- } else if (m_mt.formattype == FORMAT_VideoInfo2) {
- VIDEOINFOHEADER2* vih = (VIDEOINFOHEADER2*)m_mt.pbFormat;
- if (m_mt.cbFormat > sizeof(VIDEOINFOHEADER2)) {
- m_pTE->CodecPrivate.SetCount(m_mt.cbFormat - sizeof(VIDEOINFOHEADER2));
- memcpy(m_pTE->CodecPrivate, m_mt.pbFormat + sizeof(VIDEOINFOHEADER2), m_pTE->CodecPrivate.GetCount());
- }
- m_pTE->DefaultDuration.Set(vih->AvgTimePerFrame*100);
- m_pTE->DescType = TrackEntry::DescVideo;
- m_pTE->v.PixelWidth.Set(vih->bmiHeader.biWidth);
- m_pTE->v.PixelHeight.Set(abs(vih->bmiHeader.biHeight));
- if (vih->AvgTimePerFrame > 0) {
- m_pTE->v.FramePerSec.Set((float)(10000000.0 / vih->AvgTimePerFrame));
- }
- m_pTE->v.DisplayWidth.Set(vih->dwPictAspectRatioX);
- m_pTE->v.DisplayHeight.Set(vih->dwPictAspectRatioY);
- } else {
- ASSERT(0);
- return hr;
- }
-
- hr = S_OK;
- } else if (m_mt.formattype == FORMAT_VideoInfo) {
- m_pTE->CodecID.Set("V_MS/VFW/FOURCC");
-
- VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)m_mt.pbFormat;
- m_pTE->CodecPrivate.SetCount(m_mt.cbFormat - FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader));
- memcpy(m_pTE->CodecPrivate, &vih->bmiHeader, m_pTE->CodecPrivate.GetCount());
- m_pTE->DefaultDuration.Set(vih->AvgTimePerFrame*100);
- m_pTE->DescType = TrackEntry::DescVideo;
- m_pTE->v.PixelWidth.Set(vih->bmiHeader.biWidth);
- m_pTE->v.PixelHeight.Set(abs(vih->bmiHeader.biHeight));
- if (vih->AvgTimePerFrame > 0) {
- m_pTE->v.FramePerSec.Set((float)(10000000.0 / vih->AvgTimePerFrame));
- }
-
- hr = S_OK;
- } else if (m_mt.formattype == FORMAT_VideoInfo2) {
- m_pTE->CodecID.Set("V_MS/VFW/FOURCC");
-
- VIDEOINFOHEADER2* vih = (VIDEOINFOHEADER2*)m_mt.pbFormat;
- m_pTE->CodecPrivate.SetCount(m_mt.cbFormat - FIELD_OFFSET(VIDEOINFOHEADER2, bmiHeader));
- memcpy(m_pTE->CodecPrivate, &vih->bmiHeader, m_pTE->CodecPrivate.GetCount());
- m_pTE->DefaultDuration.Set(vih->AvgTimePerFrame*100);
- m_pTE->DescType = TrackEntry::DescVideo;
- m_pTE->v.PixelWidth.Set(vih->bmiHeader.biWidth);
- m_pTE->v.PixelHeight.Set(abs(vih->bmiHeader.biHeight));
- m_pTE->v.DisplayWidth.Set(vih->dwPictAspectRatioX);
- m_pTE->v.DisplayHeight.Set(vih->dwPictAspectRatioY);
- if (vih->AvgTimePerFrame > 0) {
- m_pTE->v.FramePerSec.Set((float)(10000000.0 / vih->AvgTimePerFrame));
- }
-
- hr = S_OK;
- } else if (m_mt.formattype == FORMAT_DiracVideoInfo) {
- m_pTE->CodecID.Set("V_DIRAC");
-
- DIRACINFOHEADER* vih = (DIRACINFOHEADER*)m_mt.pbFormat;
- m_pTE->CodecPrivate.SetCount(vih->cbSequenceHeader);
- memcpy(m_pTE->CodecPrivate, (BYTE*)&vih->dwSequenceHeader[0], m_pTE->CodecPrivate.GetCount());
- m_pTE->DefaultDuration.Set(vih->hdr.AvgTimePerFrame*100);
- m_pTE->DescType = TrackEntry::DescVideo;
- m_pTE->v.PixelWidth.Set(vih->hdr.bmiHeader.biWidth);
- m_pTE->v.PixelHeight.Set(abs(vih->hdr.bmiHeader.biHeight));
- // m_pTE->v.DisplayWidth.Set(vih->dwPictAspectRatioX);
- // m_pTE->v.DisplayHeight.Set(vih->dwPictAspectRatioY);
- if (vih->hdr.AvgTimePerFrame > 0) {
- m_pTE->v.FramePerSec.Set((float)(10000000.0 / vih->hdr.AvgTimePerFrame));
- }
-
- hr = S_OK;
- }
- /*
- else if (m_mt.formattype == FORMAT_MPEGVideo)
- {
- m_pTE->CodecID.Set("V_DSHOW/MPEG1VIDEO"); // V_MPEG1
-
- MPEG1VIDEOINFO* pm1vi = (MPEG1VIDEOINFO*)m_mt.pbFormat;
- m_pTE->CodecPrivate.SetCount(m_mt.FormatLength());
- memcpy(m_pTE->CodecPrivate, m_mt.pbFormat, m_pTE->CodecPrivate.GetCount());
- m_pTE->DefaultDuration.Set(pm1vi->hdr.AvgTimePerFrame*100);
- m_pTE->DescType = TrackEntry::DescVideo;
- m_pTE->v.PixelWidth.Set(pm1vi->hdr.bmiHeader.biWidth);
- m_pTE->v.PixelHeight.Set(abs(pm1vi->hdr.bmiHeader.biHeight));
- if (pm1vi->hdr.AvgTimePerFrame > 0)
- m_pTE->v.FramePerSec.Set((float)(10000000.0 / pm1vi->hdr.AvgTimePerFrame));
-
- hr = S_OK;
- }
- else if (m_mt.formattype == FORMAT_MPEG2_VIDEO)
- {
- m_pTE->CodecID.Set("V_DSHOW/MPEG2VIDEO"); // V_MPEG2
-
- MPEG2VIDEOINFO* pm2vi = (MPEG2VIDEOINFO*)m_mt.pbFormat;
- m_pTE->CodecPrivate.SetCount(m_mt.FormatLength());
- memcpy(m_pTE->CodecPrivate, m_mt.pbFormat, m_pTE->CodecPrivate.GetCount());
- m_pTE->DefaultDuration.Set(pm2vi->hdr.AvgTimePerFrame*100);
- m_pTE->DescType = TrackEntry::DescVideo;
- m_pTE->v.PixelWidth.Set(pm2vi->hdr.bmiHeader.biWidth);
- m_pTE->v.PixelHeight.Set(abs(pm2vi->hdr.bmiHeader.biHeight));
- if (pm2vi->hdr.AvgTimePerFrame > 0)
- m_pTE->v.FramePerSec.Set((float)(10000000.0 / pm2vi->hdr.AvgTimePerFrame));
-
- hr = S_OK;
- }
- */
- } else if (m_mt.majortype == MEDIATYPE_Audio) {
- m_pTE->TrackType.Set(TrackEntry::TypeAudio);
-
- if (m_mt.formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_AAC
- && m_mt.cbFormat >= sizeof(WAVEFORMATEX)+2) {
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
- BYTE* p = (BYTE*)(wfe+1);
-
- DWORD nSamplesPerSec = wfe->nSamplesPerSec;
-
- int profile = (p[0]>>3)-1;
- int rate1 = ((p[0]&7)<<1)|(p[1]>>7);
- int channels = ((p[1]>>3)&15);
- int exttype = 0;
- int rate2 = rate1;
-
- if (wfe->cbSize >= 5) {
- profile = 4;
-
- exttype = (p[2]<<3)|(p[3]>>5);
- ASSERT(exttype == 0x2B7);
- ASSERT((p[3]&31) == 5);
- ASSERT((p[4]>>7) == 1);
- rate2 = ((p[4]>>3)&15);
-
- if (rate2 < rate1) {
- m_pTE->a.OutputSamplingFrequency.Set((float)nSamplesPerSec);
- nSamplesPerSec /= 2;
- }
- }
-
- switch (profile) {
- default:
- case 0:
- m_pTE->CodecID.Set("A_AAC/MPEG2/MAIN");
- break;
- case 1:
- m_pTE->CodecID.Set("A_AAC/MPEG2/LC");
- break;
- case 2:
- m_pTE->CodecID.Set("A_AAC/MPEG2/SSR");
- break;
- case 3:
- m_pTE->CodecID.Set("A_AAC/MPEG4/LTP");
- break;
- case 4:
- m_pTE->CodecID.Set("A_AAC/MPEG4/LC/SBR");
- break;
- }
-
- ASSERT(channels == wfe->nChannels);
-
- m_pTE->DescType = TrackEntry::DescAudio;
- m_pTE->a.SamplingFrequency.Set((float)nSamplesPerSec);
- m_pTE->a.Channels.Set(channels);
- m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
-
- hr = S_OK;
- } else if (m_mt.formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_DOLBY_AC3) {
- m_pTE->CodecID.Set("A_AC3");
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
- m_pTE->DescType = TrackEntry::DescAudio;
- m_pTE->a.SamplingFrequency.Set((float)wfe->nSamplesPerSec);
- m_pTE->a.Channels.Set(wfe->nChannels);
- m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
-
- hr = S_OK;
- } else if (m_mt.formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_DVD_DTS) {
- m_pTE->CodecID.Set("A_DTS");
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
- m_pTE->DescType = TrackEntry::DescAudio;
- m_pTE->a.SamplingFrequency.Set((float)wfe->nSamplesPerSec);
- m_pTE->a.Channels.Set(wfe->nChannels);
- m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
-
- hr = S_OK;
- } else if (m_mt.formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_FLAC) {
- m_pTE->CodecID.Set("A_FLAC");
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
- m_pTE->DescType = TrackEntry::DescAudio;
- m_pTE->a.SamplingFrequency.Set((float)wfe->nSamplesPerSec);
- m_pTE->a.Channels.Set(wfe->nChannels);
- m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
-
- if (wfe->cbSize) {
- m_pTE->CodecPrivate.SetCount(wfe->cbSize);
- memcpy(m_pTE->CodecPrivate, m_mt.pbFormat + sizeof(WAVEFORMATEX), wfe->cbSize);
- }
-
- hr = S_OK;
- } else if (m_mt.formattype == FORMAT_WaveFormatEx
- && (m_mt.subtype == MEDIASUBTYPE_14_4
- || m_mt.subtype == MEDIASUBTYPE_28_8
- || m_mt.subtype == MEDIASUBTYPE_ATRC
- || m_mt.subtype == MEDIASUBTYPE_COOK
- || m_mt.subtype == MEDIASUBTYPE_DNET
- || m_mt.subtype == MEDIASUBTYPE_SIPR)) {
- CStringA id;
- id.Format("A_REAL/%c%c%c%c",
- (char)((m_mt.subtype.Data1>>0)&0xff),
- (char)((m_mt.subtype.Data1>>8)&0xff),
- (char)((m_mt.subtype.Data1>>16)&0xff),
- (char)((m_mt.subtype.Data1>>24)&0xff));
-
- m_pTE->CodecID.Set(id);
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
- DWORD cbSize = sizeof(WAVEFORMATEX) + wfe->cbSize;
- if (m_mt.cbFormat > cbSize) {
- m_pTE->CodecPrivate.SetCount(m_mt.cbFormat - cbSize);
- memcpy(m_pTE->CodecPrivate, m_mt.pbFormat + cbSize, m_pTE->CodecPrivate.GetCount());
- }
- m_pTE->DescType = TrackEntry::DescAudio;
- m_pTE->a.SamplingFrequency.Set((float)wfe->nSamplesPerSec);
- m_pTE->a.Channels.Set(wfe->nChannels);
- m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
-
- hr = S_OK;
- } else if (m_mt.formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_PCM) {
- m_pTE->CodecID.Set("A_PCM/INT/LIT");
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
- m_pTE->DescType = TrackEntry::DescAudio;
- m_pTE->a.SamplingFrequency.Set((float)wfe->nSamplesPerSec);
- m_pTE->a.Channels.Set(wfe->nChannels);
- m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
-
- hr = S_OK;
- } else if (m_mt.formattype == FORMAT_WaveFormatEx) {
- m_pTE->CodecID.Set("A_MS/ACM");
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
- m_pTE->CodecPrivate.SetCount(m_mt.cbFormat);
- memcpy(m_pTE->CodecPrivate, wfe, m_pTE->CodecPrivate.GetCount());
- m_pTE->DescType = TrackEntry::DescAudio;
- m_pTE->a.SamplingFrequency.Set((float)wfe->nSamplesPerSec);
- m_pTE->a.Channels.Set(wfe->nChannels);
- m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
-
- hr = S_OK;
- } else if (m_mt.formattype == FORMAT_VorbisFormat) {
- m_pTE->CodecID.Set("A_VORBIS");
-
- VORBISFORMAT* pvf = (VORBISFORMAT*)m_mt.pbFormat;
- m_pTE->DescType = TrackEntry::DescAudio;
- m_pTE->a.SamplingFrequency.Set((float)pvf->nSamplesPerSec);
- m_pTE->a.Channels.Set(pvf->nChannels);
-
- // m_pTE->CodecPrivate will be filled later
-
- hr = S_OK;
- } else if (m_mt.formattype == FORMAT_VorbisFormat2) {
- m_pTE->CodecID.Set("A_VORBIS");
-
- VORBISFORMAT2* pvf2 = (VORBISFORMAT2*)m_mt.pbFormat;
- m_pTE->DescType = TrackEntry::DescAudio;
- m_pTE->a.SamplingFrequency.Set((float)pvf2->SamplesPerSec);
- m_pTE->a.Channels.Set(pvf2->Channels);
- m_pTE->a.BitDepth.Set(pvf2->BitsPerSample);
-
- int len = 1;
- for (int i = 0; i < 2; i++) {
- len += pvf2->HeaderSize[i]/255 + 1;
- }
- for (int i = 0; i < 3; i++) {
- len += pvf2->HeaderSize[i];
- }
- m_pTE->CodecPrivate.SetCount(len);
-
- BYTE* src = (BYTE*)m_mt.pbFormat + sizeof(VORBISFORMAT2);
- BYTE* dst = m_pTE->CodecPrivate.GetData();
-
- *dst++ = 2;
- for (int i = 0; i < 2; i++)
- for (int len = pvf2->HeaderSize[i]; len >= 0; len -= 255) {
- *dst++ = min(len, 255);
- }
-
- memcpy(dst, src, pvf2->HeaderSize[0]);
- dst += pvf2->HeaderSize[0];
- src += pvf2->HeaderSize[0];
- memcpy(dst, src, pvf2->HeaderSize[1]);
- dst += pvf2->HeaderSize[1];
- src += pvf2->HeaderSize[1];
- memcpy(dst, src, pvf2->HeaderSize[2]);
- dst += pvf2->HeaderSize[2];
- src += pvf2->HeaderSize[2];
-
- ASSERT(src <= m_mt.pbFormat + m_mt.cbFormat);
- ASSERT(dst <= m_pTE->CodecPrivate.GetData() + m_pTE->CodecPrivate.GetCount());
-
- hr = S_OK;
- }
- } else if (m_mt.majortype == MEDIATYPE_Text) {
- m_pTE->TrackType.Set(TrackEntry::TypeSubtitle);
-
- if (m_mt.formattype == FORMAT_None) {
- m_pTE->CodecID.Set("S_TEXT/ASCII");
- hr = S_OK;
- }
- } else if (m_mt.majortype == MEDIATYPE_Subtitle) {
- m_pTE->TrackType.Set(TrackEntry::TypeSubtitle);
-
- m_pTE->CodecID.Set(
- m_mt.subtype == MEDIASUBTYPE_UTF8 ? "S_TEXT/UTF8" :
- m_mt.subtype == MEDIASUBTYPE_SSA ? "S_TEXT/SSA" :
- m_mt.subtype == MEDIASUBTYPE_ASS ? "S_TEXT/ASS" :
- m_mt.subtype == MEDIASUBTYPE_USF ? "S_TEXT/USF" :
- m_mt.subtype == MEDIASUBTYPE_VOBSUB ? "S_VOBSUB" :
- "");
-
- if (!m_pTE->CodecID.IsEmpty()) {
- hr = S_OK;
-
- SUBTITLEINFO* psi = (SUBTITLEINFO*)m_mt.pbFormat;
- if (psi->dwOffset) {
- m_pTE->CodecPrivate.SetCount(m_mt.cbFormat - psi->dwOffset);
- memcpy(m_pTE->CodecPrivate, m_mt.pbFormat + psi->dwOffset, m_pTE->CodecPrivate.GetCount());
- }
- }
- }
-
- if (S_OK == hr) {
- (static_cast<CMatroskaMuxerFilter*>(m_pFilter))->AddInput();
- }
-
- return hr;
+ HRESULT hr;
+
+ if (FAILED(hr = __super::CompleteConnect(pPin))) {
+ return hr;
+ }
+
+ m_rtDur = 0;
+ CComQIPtr<IMediaSeeking> pMS;
+ if ((pMS = GetFilterFromPin(pPin)) || (pMS = pPin)) {
+ pMS->GetDuration(&m_rtDur);
+ }
+
+ m_pTE.Free();
+ m_pTE.Attach(DNew TrackEntry());
+
+ m_pTE->TrackUID.Set(rand());
+ m_pTE->MinCache.Set(1);
+ m_pTE->MaxCache.Set(1);
+ m_pTE->TrackNumber.Set((static_cast<CMatroskaMuxerFilter*>(m_pFilter))->GetTrackNumber(this));
+
+ hr = E_FAIL;
+
+ if (m_mt.majortype == MEDIATYPE_Video) {
+ m_pTE->TrackType.Set(TrackEntry::TypeVideo);
+
+ if (m_mt.formattype == FORMAT_VideoInfo
+ && m_mt.subtype == MEDIASUBTYPE_RV10 || m_mt.subtype == MEDIASUBTYPE_RV20
+ || m_mt.subtype == MEDIASUBTYPE_RV30 || m_mt.subtype == MEDIASUBTYPE_RV40) {
+ m_pTE->CodecID.Set("V_REAL/RV00");
+ m_pTE->CodecID.SetAt(9, (BYTE)(m_mt.subtype.Data1 >> 16));
+
+ if (m_mt.formattype == FORMAT_VideoInfo) {
+ VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)m_mt.pbFormat;
+ if (m_mt.cbFormat > sizeof(VIDEOINFOHEADER)) {
+ m_pTE->CodecPrivate.SetCount(m_mt.cbFormat - sizeof(VIDEOINFOHEADER));
+ memcpy(m_pTE->CodecPrivate, m_mt.pbFormat + sizeof(VIDEOINFOHEADER), m_pTE->CodecPrivate.GetCount());
+ }
+ m_pTE->DefaultDuration.Set(vih->AvgTimePerFrame * 100);
+ m_pTE->DescType = TrackEntry::DescVideo;
+ m_pTE->v.PixelWidth.Set(vih->bmiHeader.biWidth);
+ m_pTE->v.PixelHeight.Set(abs(vih->bmiHeader.biHeight));
+ if (vih->AvgTimePerFrame > 0) {
+ m_pTE->v.FramePerSec.Set((float)(10000000.0 / vih->AvgTimePerFrame));
+ }
+ } else if (m_mt.formattype == FORMAT_VideoInfo2) {
+ VIDEOINFOHEADER2* vih = (VIDEOINFOHEADER2*)m_mt.pbFormat;
+ if (m_mt.cbFormat > sizeof(VIDEOINFOHEADER2)) {
+ m_pTE->CodecPrivate.SetCount(m_mt.cbFormat - sizeof(VIDEOINFOHEADER2));
+ memcpy(m_pTE->CodecPrivate, m_mt.pbFormat + sizeof(VIDEOINFOHEADER2), m_pTE->CodecPrivate.GetCount());
+ }
+ m_pTE->DefaultDuration.Set(vih->AvgTimePerFrame * 100);
+ m_pTE->DescType = TrackEntry::DescVideo;
+ m_pTE->v.PixelWidth.Set(vih->bmiHeader.biWidth);
+ m_pTE->v.PixelHeight.Set(abs(vih->bmiHeader.biHeight));
+ if (vih->AvgTimePerFrame > 0) {
+ m_pTE->v.FramePerSec.Set((float)(10000000.0 / vih->AvgTimePerFrame));
+ }
+ m_pTE->v.DisplayWidth.Set(vih->dwPictAspectRatioX);
+ m_pTE->v.DisplayHeight.Set(vih->dwPictAspectRatioY);
+ } else {
+ ASSERT(0);
+ return hr;
+ }
+
+ hr = S_OK;
+ } else if (m_mt.formattype == FORMAT_VideoInfo) {
+ m_pTE->CodecID.Set("V_MS/VFW/FOURCC");
+
+ VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)m_mt.pbFormat;
+ m_pTE->CodecPrivate.SetCount(m_mt.cbFormat - FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader));
+ memcpy(m_pTE->CodecPrivate, &vih->bmiHeader, m_pTE->CodecPrivate.GetCount());
+ m_pTE->DefaultDuration.Set(vih->AvgTimePerFrame * 100);
+ m_pTE->DescType = TrackEntry::DescVideo;
+ m_pTE->v.PixelWidth.Set(vih->bmiHeader.biWidth);
+ m_pTE->v.PixelHeight.Set(abs(vih->bmiHeader.biHeight));
+ if (vih->AvgTimePerFrame > 0) {
+ m_pTE->v.FramePerSec.Set((float)(10000000.0 / vih->AvgTimePerFrame));
+ }
+
+ hr = S_OK;
+ } else if (m_mt.formattype == FORMAT_VideoInfo2) {
+ m_pTE->CodecID.Set("V_MS/VFW/FOURCC");
+
+ VIDEOINFOHEADER2* vih = (VIDEOINFOHEADER2*)m_mt.pbFormat;
+ m_pTE->CodecPrivate.SetCount(m_mt.cbFormat - FIELD_OFFSET(VIDEOINFOHEADER2, bmiHeader));
+ memcpy(m_pTE->CodecPrivate, &vih->bmiHeader, m_pTE->CodecPrivate.GetCount());
+ m_pTE->DefaultDuration.Set(vih->AvgTimePerFrame * 100);
+ m_pTE->DescType = TrackEntry::DescVideo;
+ m_pTE->v.PixelWidth.Set(vih->bmiHeader.biWidth);
+ m_pTE->v.PixelHeight.Set(abs(vih->bmiHeader.biHeight));
+ m_pTE->v.DisplayWidth.Set(vih->dwPictAspectRatioX);
+ m_pTE->v.DisplayHeight.Set(vih->dwPictAspectRatioY);
+ if (vih->AvgTimePerFrame > 0) {
+ m_pTE->v.FramePerSec.Set((float)(10000000.0 / vih->AvgTimePerFrame));
+ }
+
+ hr = S_OK;
+ } else if (m_mt.formattype == FORMAT_DiracVideoInfo) {
+ m_pTE->CodecID.Set("V_DIRAC");
+
+ DIRACINFOHEADER* vih = (DIRACINFOHEADER*)m_mt.pbFormat;
+ m_pTE->CodecPrivate.SetCount(vih->cbSequenceHeader);
+ memcpy(m_pTE->CodecPrivate, (BYTE*)&vih->dwSequenceHeader[0], m_pTE->CodecPrivate.GetCount());
+ m_pTE->DefaultDuration.Set(vih->hdr.AvgTimePerFrame * 100);
+ m_pTE->DescType = TrackEntry::DescVideo;
+ m_pTE->v.PixelWidth.Set(vih->hdr.bmiHeader.biWidth);
+ m_pTE->v.PixelHeight.Set(abs(vih->hdr.bmiHeader.biHeight));
+ // m_pTE->v.DisplayWidth.Set(vih->dwPictAspectRatioX);
+ // m_pTE->v.DisplayHeight.Set(vih->dwPictAspectRatioY);
+ if (vih->hdr.AvgTimePerFrame > 0) {
+ m_pTE->v.FramePerSec.Set((float)(10000000.0 / vih->hdr.AvgTimePerFrame));
+ }
+
+ hr = S_OK;
+ }
+ /*
+ else if (m_mt.formattype == FORMAT_MPEGVideo)
+ {
+ m_pTE->CodecID.Set("V_DSHOW/MPEG1VIDEO"); // V_MPEG1
+
+ MPEG1VIDEOINFO* pm1vi = (MPEG1VIDEOINFO*)m_mt.pbFormat;
+ m_pTE->CodecPrivate.SetCount(m_mt.FormatLength());
+ memcpy(m_pTE->CodecPrivate, m_mt.pbFormat, m_pTE->CodecPrivate.GetCount());
+ m_pTE->DefaultDuration.Set(pm1vi->hdr.AvgTimePerFrame*100);
+ m_pTE->DescType = TrackEntry::DescVideo;
+ m_pTE->v.PixelWidth.Set(pm1vi->hdr.bmiHeader.biWidth);
+ m_pTE->v.PixelHeight.Set(abs(pm1vi->hdr.bmiHeader.biHeight));
+ if (pm1vi->hdr.AvgTimePerFrame > 0)
+ m_pTE->v.FramePerSec.Set((float)(10000000.0 / pm1vi->hdr.AvgTimePerFrame));
+
+ hr = S_OK;
+ }
+ else if (m_mt.formattype == FORMAT_MPEG2_VIDEO)
+ {
+ m_pTE->CodecID.Set("V_DSHOW/MPEG2VIDEO"); // V_MPEG2
+
+ MPEG2VIDEOINFO* pm2vi = (MPEG2VIDEOINFO*)m_mt.pbFormat;
+ m_pTE->CodecPrivate.SetCount(m_mt.FormatLength());
+ memcpy(m_pTE->CodecPrivate, m_mt.pbFormat, m_pTE->CodecPrivate.GetCount());
+ m_pTE->DefaultDuration.Set(pm2vi->hdr.AvgTimePerFrame*100);
+ m_pTE->DescType = TrackEntry::DescVideo;
+ m_pTE->v.PixelWidth.Set(pm2vi->hdr.bmiHeader.biWidth);
+ m_pTE->v.PixelHeight.Set(abs(pm2vi->hdr.bmiHeader.biHeight));
+ if (pm2vi->hdr.AvgTimePerFrame > 0)
+ m_pTE->v.FramePerSec.Set((float)(10000000.0 / pm2vi->hdr.AvgTimePerFrame));
+
+ hr = S_OK;
+ }
+ */
+ } else if (m_mt.majortype == MEDIATYPE_Audio) {
+ m_pTE->TrackType.Set(TrackEntry::TypeAudio);
+
+ if (m_mt.formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_AAC
+ && m_mt.cbFormat >= sizeof(WAVEFORMATEX) + 2) {
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
+ BYTE* p = (BYTE*)(wfe + 1);
+
+ DWORD nSamplesPerSec = wfe->nSamplesPerSec;
+
+ int profile = (p[0] >> 3) - 1;
+ int rate1 = ((p[0] & 7) << 1) | (p[1] >> 7);
+ int channels = ((p[1] >> 3) & 15);
+ int exttype = 0;
+ int rate2 = rate1;
+
+ if (wfe->cbSize >= 5) {
+ profile = 4;
+
+ exttype = (p[2] << 3) | (p[3] >> 5);
+ ASSERT(exttype == 0x2B7);
+ ASSERT((p[3] & 31) == 5);
+ ASSERT((p[4] >> 7) == 1);
+ rate2 = ((p[4] >> 3) & 15);
+
+ if (rate2 < rate1) {
+ m_pTE->a.OutputSamplingFrequency.Set((float)nSamplesPerSec);
+ nSamplesPerSec /= 2;
+ }
+ }
+
+ switch (profile) {
+ default:
+ case 0:
+ m_pTE->CodecID.Set("A_AAC/MPEG2/MAIN");
+ break;
+ case 1:
+ m_pTE->CodecID.Set("A_AAC/MPEG2/LC");
+ break;
+ case 2:
+ m_pTE->CodecID.Set("A_AAC/MPEG2/SSR");
+ break;
+ case 3:
+ m_pTE->CodecID.Set("A_AAC/MPEG4/LTP");
+ break;
+ case 4:
+ m_pTE->CodecID.Set("A_AAC/MPEG4/LC/SBR");
+ break;
+ }
+
+ ASSERT(channels == wfe->nChannels);
+
+ m_pTE->DescType = TrackEntry::DescAudio;
+ m_pTE->a.SamplingFrequency.Set((float)nSamplesPerSec);
+ m_pTE->a.Channels.Set(channels);
+ m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
+
+ hr = S_OK;
+ } else if (m_mt.formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_DOLBY_AC3) {
+ m_pTE->CodecID.Set("A_AC3");
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
+ m_pTE->DescType = TrackEntry::DescAudio;
+ m_pTE->a.SamplingFrequency.Set((float)wfe->nSamplesPerSec);
+ m_pTE->a.Channels.Set(wfe->nChannels);
+ m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
+
+ hr = S_OK;
+ } else if (m_mt.formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_DVD_DTS) {
+ m_pTE->CodecID.Set("A_DTS");
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
+ m_pTE->DescType = TrackEntry::DescAudio;
+ m_pTE->a.SamplingFrequency.Set((float)wfe->nSamplesPerSec);
+ m_pTE->a.Channels.Set(wfe->nChannels);
+ m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
+
+ hr = S_OK;
+ } else if (m_mt.formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_FLAC) {
+ m_pTE->CodecID.Set("A_FLAC");
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
+ m_pTE->DescType = TrackEntry::DescAudio;
+ m_pTE->a.SamplingFrequency.Set((float)wfe->nSamplesPerSec);
+ m_pTE->a.Channels.Set(wfe->nChannels);
+ m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
+
+ if (wfe->cbSize) {
+ m_pTE->CodecPrivate.SetCount(wfe->cbSize);
+ memcpy(m_pTE->CodecPrivate, m_mt.pbFormat + sizeof(WAVEFORMATEX), wfe->cbSize);
+ }
+
+ hr = S_OK;
+ } else if (m_mt.formattype == FORMAT_WaveFormatEx
+ && (m_mt.subtype == MEDIASUBTYPE_14_4
+ || m_mt.subtype == MEDIASUBTYPE_28_8
+ || m_mt.subtype == MEDIASUBTYPE_ATRC
+ || m_mt.subtype == MEDIASUBTYPE_COOK
+ || m_mt.subtype == MEDIASUBTYPE_DNET
+ || m_mt.subtype == MEDIASUBTYPE_SIPR)) {
+ CStringA id;
+ id.Format("A_REAL/%c%c%c%c",
+ (char)((m_mt.subtype.Data1 >> 0) & 0xff),
+ (char)((m_mt.subtype.Data1 >> 8) & 0xff),
+ (char)((m_mt.subtype.Data1 >> 16) & 0xff),
+ (char)((m_mt.subtype.Data1 >> 24) & 0xff));
+
+ m_pTE->CodecID.Set(id);
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
+ DWORD cbSize = sizeof(WAVEFORMATEX) + wfe->cbSize;
+ if (m_mt.cbFormat > cbSize) {
+ m_pTE->CodecPrivate.SetCount(m_mt.cbFormat - cbSize);
+ memcpy(m_pTE->CodecPrivate, m_mt.pbFormat + cbSize, m_pTE->CodecPrivate.GetCount());
+ }
+ m_pTE->DescType = TrackEntry::DescAudio;
+ m_pTE->a.SamplingFrequency.Set((float)wfe->nSamplesPerSec);
+ m_pTE->a.Channels.Set(wfe->nChannels);
+ m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
+
+ hr = S_OK;
+ } else if (m_mt.formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_PCM) {
+ m_pTE->CodecID.Set("A_PCM/INT/LIT");
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
+ m_pTE->DescType = TrackEntry::DescAudio;
+ m_pTE->a.SamplingFrequency.Set((float)wfe->nSamplesPerSec);
+ m_pTE->a.Channels.Set(wfe->nChannels);
+ m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
+
+ hr = S_OK;
+ } else if (m_mt.formattype == FORMAT_WaveFormatEx) {
+ m_pTE->CodecID.Set("A_MS/ACM");
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
+ m_pTE->CodecPrivate.SetCount(m_mt.cbFormat);
+ memcpy(m_pTE->CodecPrivate, wfe, m_pTE->CodecPrivate.GetCount());
+ m_pTE->DescType = TrackEntry::DescAudio;
+ m_pTE->a.SamplingFrequency.Set((float)wfe->nSamplesPerSec);
+ m_pTE->a.Channels.Set(wfe->nChannels);
+ m_pTE->a.BitDepth.Set(wfe->wBitsPerSample);
+
+ hr = S_OK;
+ } else if (m_mt.formattype == FORMAT_VorbisFormat) {
+ m_pTE->CodecID.Set("A_VORBIS");
+
+ VORBISFORMAT* pvf = (VORBISFORMAT*)m_mt.pbFormat;
+ m_pTE->DescType = TrackEntry::DescAudio;
+ m_pTE->a.SamplingFrequency.Set((float)pvf->nSamplesPerSec);
+ m_pTE->a.Channels.Set(pvf->nChannels);
+
+ // m_pTE->CodecPrivate will be filled later
+
+ hr = S_OK;
+ } else if (m_mt.formattype == FORMAT_VorbisFormat2) {
+ m_pTE->CodecID.Set("A_VORBIS");
+
+ VORBISFORMAT2* pvf2 = (VORBISFORMAT2*)m_mt.pbFormat;
+ m_pTE->DescType = TrackEntry::DescAudio;
+ m_pTE->a.SamplingFrequency.Set((float)pvf2->SamplesPerSec);
+ m_pTE->a.Channels.Set(pvf2->Channels);
+ m_pTE->a.BitDepth.Set(pvf2->BitsPerSample);
+
+ int len = 1;
+ for (int i = 0; i < 2; i++) {
+ len += pvf2->HeaderSize[i] / 255 + 1;
+ }
+ for (int i = 0; i < 3; i++) {
+ len += pvf2->HeaderSize[i];
+ }
+ m_pTE->CodecPrivate.SetCount(len);
+
+ BYTE* src = (BYTE*)m_mt.pbFormat + sizeof(VORBISFORMAT2);
+ BYTE* dst = m_pTE->CodecPrivate.GetData();
+
+ *dst++ = 2;
+ for (int i = 0; i < 2; i++)
+ for (int len = pvf2->HeaderSize[i]; len >= 0; len -= 255) {
+ *dst++ = min(len, 255);
+ }
+
+ memcpy(dst, src, pvf2->HeaderSize[0]);
+ dst += pvf2->HeaderSize[0];
+ src += pvf2->HeaderSize[0];
+ memcpy(dst, src, pvf2->HeaderSize[1]);
+ dst += pvf2->HeaderSize[1];
+ src += pvf2->HeaderSize[1];
+ memcpy(dst, src, pvf2->HeaderSize[2]);
+ dst += pvf2->HeaderSize[2];
+ src += pvf2->HeaderSize[2];
+
+ ASSERT(src <= m_mt.pbFormat + m_mt.cbFormat);
+ ASSERT(dst <= m_pTE->CodecPrivate.GetData() + m_pTE->CodecPrivate.GetCount());
+
+ hr = S_OK;
+ }
+ } else if (m_mt.majortype == MEDIATYPE_Text) {
+ m_pTE->TrackType.Set(TrackEntry::TypeSubtitle);
+
+ if (m_mt.formattype == FORMAT_None) {
+ m_pTE->CodecID.Set("S_TEXT/ASCII");
+ hr = S_OK;
+ }
+ } else if (m_mt.majortype == MEDIATYPE_Subtitle) {
+ m_pTE->TrackType.Set(TrackEntry::TypeSubtitle);
+
+ m_pTE->CodecID.Set(
+ m_mt.subtype == MEDIASUBTYPE_UTF8 ? "S_TEXT/UTF8" :
+ m_mt.subtype == MEDIASUBTYPE_SSA ? "S_TEXT/SSA" :
+ m_mt.subtype == MEDIASUBTYPE_ASS ? "S_TEXT/ASS" :
+ m_mt.subtype == MEDIASUBTYPE_USF ? "S_TEXT/USF" :
+ m_mt.subtype == MEDIASUBTYPE_VOBSUB ? "S_VOBSUB" :
+ "");
+
+ if (!m_pTE->CodecID.IsEmpty()) {
+ hr = S_OK;
+
+ SUBTITLEINFO* psi = (SUBTITLEINFO*)m_mt.pbFormat;
+ if (psi->dwOffset) {
+ m_pTE->CodecPrivate.SetCount(m_mt.cbFormat - psi->dwOffset);
+ memcpy(m_pTE->CodecPrivate, m_mt.pbFormat + psi->dwOffset, m_pTE->CodecPrivate.GetCount());
+ }
+ }
+ }
+
+ if (S_OK == hr) {
+ (static_cast<CMatroskaMuxerFilter*>(m_pFilter))->AddInput();
+ }
+
+ return hr;
}
HRESULT CMatroskaMuxerInputPin::Active()
{
- m_fActive = true;
- m_rtLastStart = m_rtLastStop = -1;
- m_fEndOfStreamReceived = false;
- return __super::Active();
+ m_fActive = true;
+ m_rtLastStart = m_rtLastStop = -1;
+ m_fEndOfStreamReceived = false;
+ return __super::Active();
}
HRESULT CMatroskaMuxerInputPin::Inactive()
{
- m_fActive = false;
- CAutoLock cAutoLock(&m_csQueue);
- m_blocks.RemoveAll();
- m_pVorbisHdrs.RemoveAll();
- return __super::Inactive();
+ m_fActive = false;
+ CAutoLock cAutoLock(&m_csQueue);
+ m_blocks.RemoveAll();
+ m_pVorbisHdrs.RemoveAll();
+ return __super::Inactive();
}
STDMETHODIMP CMatroskaMuxerInputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- CAutoLock cAutoLock(&m_csReceive);
- return __super::NewSegment(tStart, tStop, dRate);
+ CAutoLock cAutoLock(&m_csReceive);
+ return __super::NewSegment(tStart, tStop, dRate);
}
STDMETHODIMP CMatroskaMuxerInputPin::BeginFlush()
{
- return __super::BeginFlush();
+ return __super::BeginFlush();
}
STDMETHODIMP CMatroskaMuxerInputPin::EndFlush()
{
- return __super::EndFlush();
+ return __super::EndFlush();
}
STDMETHODIMP CMatroskaMuxerInputPin::Receive(IMediaSample* pSample)
{
- if (m_fEndOfStreamReceived) {
- /*ASSERT(0);*/
- return S_FALSE;
- }
-
- CAutoLock cAutoLock(&m_csReceive);
-
- while (m_fActive) {
- {
- CAutoLock cAutoLock2(&m_csQueue);
- if (m_blocks.GetCount() < MAXBLOCKS) {
- break;
- }
- }
-
- Sleep(1);
- }
-
- if (!m_fActive) {
- return S_FALSE;
- }
-
- HRESULT hr;
-
- if (FAILED(hr = __super::Receive(pSample))) {
- return hr;
- }
-
- BYTE* pData = NULL;
- pSample->GetPointer(&pData);
-
- long len = pSample->GetActualDataLength();
-
- REFERENCE_TIME rtStart = -1, rtStop = -1;
- hr = pSample->GetTime(&rtStart, &rtStop);
-
- if (FAILED(hr) || rtStart == -1 || rtStop == -1) {
- TRACE(_T("No timestamp was set on the sample!!!"));
- m_pFilter->NotifyEvent(EC_ERRORABORT, VFW_E_SAMPLE_TIME_NOT_SET, 0);
- return VFW_E_SAMPLE_TIME_NOT_SET;
- }
-
- // rtStart += m_tStart;
- // rtStop += m_tStart;
-
- /**/
- TRACE(_T("Received (%d): %I64d-%I64d (c=%d, co=%dms), len=%d, d%d p%d s%d\n"),
- (static_cast<CMatroskaMuxerFilter*>(m_pFilter))->GetTrackNumber(this),
- rtStart, rtStop, (int)((rtStart/10000)/MAXCLUSTERTIME), (int)((rtStart/10000)%MAXCLUSTERTIME),
- len,
- pSample->IsDiscontinuity() == S_OK ? 1 : 0,
- pSample->IsPreroll() == S_OK ? 1 : 0,
- pSample->IsSyncPoint() == S_OK ? 1 : 0);
-
- if (m_mt.subtype == MEDIASUBTYPE_Vorbis && m_pVorbisHdrs.GetCount() < 3) {
- CAutoPtr<CBinary> data(DNew CBinary(0));
- data->SetCount(len);
- memcpy(data->GetData(), pData, len);
- m_pVorbisHdrs.Add(data);
-
- if (m_pVorbisHdrs.GetCount() == 3) {
- int len = 1;
- for (size_t i = 0; i < 2; i++) {
- len += m_pVorbisHdrs[i]->GetCount()/255 + 1;
- }
- for (size_t i = 0; i < 3; i++) {
- len += m_pVorbisHdrs[i]->GetCount();
- }
- m_pTE->CodecPrivate.SetCount(len);
-
- BYTE* dst = m_pTE->CodecPrivate.GetData();
-
- *dst++ = 2;
- for (size_t i = 0; i < 2; i++)
- for (INT_PTR len = m_pVorbisHdrs[i]->GetCount(); len >= 0; len -= 255) {
- *dst++ = (BYTE)min(len, 255);
- }
-
- for (size_t i = 0; i < 3; i++) {
- memcpy(dst, m_pVorbisHdrs[i]->GetData(), m_pVorbisHdrs[i]->GetCount());
- dst += m_pVorbisHdrs[i]->GetCount();
- }
- }
-
- return S_OK;
- }
-
- if (m_mt.formattype == FORMAT_WaveFormatEx
- && (((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_PCM
- || ((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_MPEGLAYER3)) {
- pSample->SetSyncPoint(TRUE); // HACK: some capture filters don't set this
- }
-
- CAutoPtr<BlockGroup> b(DNew BlockGroup());
- /*
- // TODO: test this with a longer capture (pcm, mp3)
- if (S_OK == pSample->IsSyncPoint() && rtStart < m_rtLastStart)
- {
- TRACE(_T("!!! timestamp went backwards, dropping this frame !!! rtStart (%I64) < m_rtLastStart (%I64)"), rtStart, m_rtLastStart);
- return S_OK;
- }
- */
- if ((S_OK != pSample->IsSyncPoint() || m_rtLastStart == rtStart) && m_rtLastStart >= 0 /*&& m_rtLastStart < rtStart*/) {
- ASSERT(m_rtLastStart - rtStart <= 0);
- REFERENCE_TIME rtDiff = m_rtLastStart - rtStart;
- b->ReferenceBlock.Set((rtDiff + (rtDiff >= 0 ? 5000 : -5000)) / 10000);
- }
-
- b->Block.TrackNumber = (static_cast<CMatroskaMuxerFilter*>(m_pFilter))->GetTrackNumber(this);
-
- b->Block.TimeCode = (rtStart + 5000) / 10000;
- b->Block.TimeCodeStop = (rtStop + 5000) / 10000;
-
- if (m_pTE->TrackType == TrackEntry::TypeSubtitle) {
- b->BlockDuration.Set((rtStop - rtStart + 5000) / 10000);
- }
-
- CAutoPtr<CBinary> data(DNew CBinary(0));
- data->SetCount(len);
- memcpy(data->GetData(), pData, len);
- b->Block.BlockData.AddTail(data);
-
- CAutoLock cAutoLock2(&m_csQueue);
- m_blocks.AddTail(b); // TODO: lacing for audio
-
- m_rtLastStart = rtStart;
- m_rtLastStop = rtStop;
-
- return S_OK;
+ if (m_fEndOfStreamReceived) {
+ /*ASSERT(0);*/
+ return S_FALSE;
+ }
+
+ CAutoLock cAutoLock(&m_csReceive);
+
+ while (m_fActive) {
+ {
+ CAutoLock cAutoLock2(&m_csQueue);
+ if (m_blocks.GetCount() < MAXBLOCKS) {
+ break;
+ }
+ }
+
+ Sleep(1);
+ }
+
+ if (!m_fActive) {
+ return S_FALSE;
+ }
+
+ HRESULT hr;
+
+ if (FAILED(hr = __super::Receive(pSample))) {
+ return hr;
+ }
+
+ BYTE* pData = NULL;
+ pSample->GetPointer(&pData);
+
+ long len = pSample->GetActualDataLength();
+
+ REFERENCE_TIME rtStart = -1, rtStop = -1;
+ hr = pSample->GetTime(&rtStart, &rtStop);
+
+ if (FAILED(hr) || rtStart == -1 || rtStop == -1) {
+ TRACE(_T("No timestamp was set on the sample!!!"));
+ m_pFilter->NotifyEvent(EC_ERRORABORT, VFW_E_SAMPLE_TIME_NOT_SET, 0);
+ return VFW_E_SAMPLE_TIME_NOT_SET;
+ }
+
+ // rtStart += m_tStart;
+ // rtStop += m_tStart;
+
+ /**/
+ TRACE(_T("Received (%d): %I64d-%I64d (c=%d, co=%dms), len=%d, d%d p%d s%d\n"),
+ (static_cast<CMatroskaMuxerFilter*>(m_pFilter))->GetTrackNumber(this),
+ rtStart, rtStop, (int)((rtStart / 10000) / MAXCLUSTERTIME), (int)((rtStart / 10000) % MAXCLUSTERTIME),
+ len,
+ pSample->IsDiscontinuity() == S_OK ? 1 : 0,
+ pSample->IsPreroll() == S_OK ? 1 : 0,
+ pSample->IsSyncPoint() == S_OK ? 1 : 0);
+
+ if (m_mt.subtype == MEDIASUBTYPE_Vorbis && m_pVorbisHdrs.GetCount() < 3) {
+ CAutoPtr<CBinary> data(DNew CBinary(0));
+ data->SetCount(len);
+ memcpy(data->GetData(), pData, len);
+ m_pVorbisHdrs.Add(data);
+
+ if (m_pVorbisHdrs.GetCount() == 3) {
+ int len = 1;
+ for (size_t i = 0; i < 2; i++) {
+ len += m_pVorbisHdrs[i]->GetCount() / 255 + 1;
+ }
+ for (size_t i = 0; i < 3; i++) {
+ len += m_pVorbisHdrs[i]->GetCount();
+ }
+ m_pTE->CodecPrivate.SetCount(len);
+
+ BYTE* dst = m_pTE->CodecPrivate.GetData();
+
+ *dst++ = 2;
+ for (size_t i = 0; i < 2; i++)
+ for (INT_PTR len = m_pVorbisHdrs[i]->GetCount(); len >= 0; len -= 255) {
+ *dst++ = (BYTE)min(len, 255);
+ }
+
+ for (size_t i = 0; i < 3; i++) {
+ memcpy(dst, m_pVorbisHdrs[i]->GetData(), m_pVorbisHdrs[i]->GetCount());
+ dst += m_pVorbisHdrs[i]->GetCount();
+ }
+ }
+
+ return S_OK;
+ }
+
+ if (m_mt.formattype == FORMAT_WaveFormatEx
+ && (((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_PCM
+ || ((WAVEFORMATEX*)m_mt.pbFormat)->wFormatTag == WAVE_FORMAT_MPEGLAYER3)) {
+ pSample->SetSyncPoint(TRUE); // HACK: some capture filters don't set this
+ }
+
+ CAutoPtr<BlockGroup> b(DNew BlockGroup());
+ /*
+ // TODO: test this with a longer capture (pcm, mp3)
+ if (S_OK == pSample->IsSyncPoint() && rtStart < m_rtLastStart)
+ {
+ TRACE(_T("!!! timestamp went backwards, dropping this frame !!! rtStart (%I64) < m_rtLastStart (%I64)"), rtStart, m_rtLastStart);
+ return S_OK;
+ }
+ */
+ if ((S_OK != pSample->IsSyncPoint() || m_rtLastStart == rtStart) && m_rtLastStart >= 0 /*&& m_rtLastStart < rtStart*/) {
+ ASSERT(m_rtLastStart - rtStart <= 0);
+ REFERENCE_TIME rtDiff = m_rtLastStart - rtStart;
+ b->ReferenceBlock.Set((rtDiff + (rtDiff >= 0 ? 5000 : -5000)) / 10000);
+ }
+
+ b->Block.TrackNumber = (static_cast<CMatroskaMuxerFilter*>(m_pFilter))->GetTrackNumber(this);
+
+ b->Block.TimeCode = (rtStart + 5000) / 10000;
+ b->Block.TimeCodeStop = (rtStop + 5000) / 10000;
+
+ if (m_pTE->TrackType == TrackEntry::TypeSubtitle) {
+ b->BlockDuration.Set((rtStop - rtStart + 5000) / 10000);
+ }
+
+ CAutoPtr<CBinary> data(DNew CBinary(0));
+ data->SetCount(len);
+ memcpy(data->GetData(), pData, len);
+ b->Block.BlockData.AddTail(data);
+
+ CAutoLock cAutoLock2(&m_csQueue);
+ m_blocks.AddTail(b); // TODO: lacing for audio
+
+ m_rtLastStart = rtStart;
+ m_rtLastStop = rtStop;
+
+ return S_OK;
}
STDMETHODIMP CMatroskaMuxerInputPin::EndOfStream()
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::EndOfStream())) {
- return hr;
- }
+ if (FAILED(hr = __super::EndOfStream())) {
+ return hr;
+ }
- CAutoLock cAutoLock(&m_csQueue);
+ CAutoLock cAutoLock(&m_csQueue);
- m_fEndOfStreamReceived = true;
+ m_fEndOfStreamReceived = true;
- return hr;
+ return hr;
}
//
@@ -1338,7 +1338,7 @@ STDMETHODIMP CMatroskaMuxerInputPin::EndOfStream()
//
CMatroskaMuxerOutputPin::CMatroskaMuxerOutputPin(TCHAR* pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBaseOutputPin(pName, pFilter, pLock, phr, L"Output")
+ : CBaseOutputPin(pName, pFilter, pLock, phr, L"Output")
{
}
@@ -1348,63 +1348,63 @@ CMatroskaMuxerOutputPin::~CMatroskaMuxerOutputPin()
STDMETHODIMP CMatroskaMuxerOutputPin::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CMatroskaMuxerOutputPin::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties)
{
- ASSERT(pAlloc);
- ASSERT(pProperties);
+ ASSERT(pAlloc);
+ ASSERT(pProperties);
- HRESULT hr = NOERROR;
+ HRESULT hr = NOERROR;
- pProperties->cBuffers = 1;
- pProperties->cbBuffer = 1;
+ pProperties->cBuffers = 1;
+ pProperties->cbBuffer = 1;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- if (Actual.cbBuffer < pProperties->cbBuffer) {
- return E_FAIL;
- }
- ASSERT(Actual.cBuffers == pProperties->cBuffers);
+ if (Actual.cbBuffer < pProperties->cbBuffer) {
+ return E_FAIL;
+ }
+ ASSERT(Actual.cBuffers == pProperties->cBuffers);
- return NOERROR;
+ return NOERROR;
}
HRESULT CMatroskaMuxerOutputPin::CheckMediaType(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Stream && pmt->subtype == MEDIASUBTYPE_Matroska
- ? S_OK
- : E_INVALIDARG;
+ return pmt->majortype == MEDIATYPE_Stream && pmt->subtype == MEDIASUBTYPE_Matroska
+ ? S_OK
+ : E_INVALIDARG;
}
HRESULT CMatroskaMuxerOutputPin::GetMediaType(int iPosition, CMediaType* pmt)
{
- CAutoLock cAutoLock(m_pLock);
-
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > 0) {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- pmt->ResetFormatBuffer();
- pmt->InitMediaType();
- pmt->majortype = MEDIATYPE_Stream;
- pmt->subtype = MEDIASUBTYPE_Matroska;
- pmt->formattype = FORMAT_None;
-
- return S_OK;
+ CAutoLock cAutoLock(m_pLock);
+
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > 0) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ pmt->ResetFormatBuffer();
+ pmt->InitMediaType();
+ pmt->majortype = MEDIATYPE_Stream;
+ pmt->subtype = MEDIASUBTYPE_Matroska;
+ pmt->formattype = FORMAT_None;
+
+ return S_OK;
}
STDMETHODIMP CMatroskaMuxerOutputPin::Notify(IBaseFilter* pSender, Quality q)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
diff --git a/src/filters/muxer/MatroskaMuxer/MatroskaMuxer.h b/src/filters/muxer/MatroskaMuxer/MatroskaMuxer.h
index 532157827..5dcf9d4d2 100644
--- a/src/filters/muxer/MatroskaMuxer/MatroskaMuxer.h
+++ b/src/filters/muxer/MatroskaMuxer/MatroskaMuxer.h
@@ -34,130 +34,130 @@
class CMatroskaMuxerInputPin : public CBaseInputPin
{
- CAutoPtr<MatroskaWriter::TrackEntry> m_pTE;
- CAutoPtrArray<MatroskaWriter::CBinary> m_pVorbisHdrs;
+ CAutoPtr<MatroskaWriter::TrackEntry> m_pTE;
+ CAutoPtrArray<MatroskaWriter::CBinary> m_pVorbisHdrs;
- bool m_fActive;
- CCritSec m_csReceive;
+ bool m_fActive;
+ CCritSec m_csReceive;
- REFERENCE_TIME m_rtLastStart, m_rtLastStop;
+ REFERENCE_TIME m_rtLastStart, m_rtLastStop;
public:
- CMatroskaMuxerInputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- virtual ~CMatroskaMuxerInputPin();
+ CMatroskaMuxerInputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ virtual ~CMatroskaMuxerInputPin();
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- MatroskaWriter::TrackEntry* GetTrackEntry() {
- return m_pTE;
- }
+ MatroskaWriter::TrackEntry* GetTrackEntry() {
+ return m_pTE;
+ }
- REFERENCE_TIME m_rtDur;
+ REFERENCE_TIME m_rtDur;
- CCritSec m_csQueue;
- CAutoPtrList<MatroskaWriter::BlockGroup> m_blocks;
- bool m_fEndOfStreamReceived;
+ CCritSec m_csQueue;
+ CAutoPtrList<MatroskaWriter::BlockGroup> m_blocks;
+ bool m_fEndOfStreamReceived;
- HRESULT CheckMediaType(const CMediaType* pmt);
- HRESULT BreakConnect();
- HRESULT CompleteConnect(IPin* pPin);
- HRESULT Active(), Inactive();
+ HRESULT CheckMediaType(const CMediaType* pmt);
+ HRESULT BreakConnect();
+ HRESULT CompleteConnect(IPin* pPin);
+ HRESULT Active(), Inactive();
- STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
- STDMETHODIMP BeginFlush();
- STDMETHODIMP EndFlush();
+ STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ STDMETHODIMP BeginFlush();
+ STDMETHODIMP EndFlush();
- STDMETHODIMP Receive(IMediaSample* pSample);
- STDMETHODIMP EndOfStream();
+ STDMETHODIMP Receive(IMediaSample* pSample);
+ STDMETHODIMP EndOfStream();
};
class CMatroskaMuxerOutputPin : public CBaseOutputPin
{
public:
- CMatroskaMuxerOutputPin(TCHAR* pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- virtual ~CMatroskaMuxerOutputPin();
+ CMatroskaMuxerOutputPin(TCHAR* pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ virtual ~CMatroskaMuxerOutputPin();
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- HRESULT DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT CheckMediaType(const CMediaType* pmt);
- HRESULT GetMediaType(int iPosition, CMediaType* pmt);
+ HRESULT CheckMediaType(const CMediaType* pmt);
+ HRESULT GetMediaType(int iPosition, CMediaType* pmt);
- STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
+ STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
};
interface __declspec(uuid("38E2D43D-915D-493C-B373-888DB16EE3DC"))
IMatroskaMuxer :
public IUnknown {
- STDMETHOD (CorrectTimeOffset) (bool fNegative, bool fPositive) = 0;
- // TODO: chapters
+ STDMETHOD(CorrectTimeOffset)(bool fNegative, bool fPositive) = 0;
+ // TODO: chapters
};
class __declspec(uuid("1E1299A2-9D42-4F12-8791-D79E376F4143"))
- CMatroskaMuxerFilter
- : public CBaseFilter
- , public CCritSec
- , public CAMThread
- , public IAMFilterMiscFlags
- , public IMediaSeeking
- , public IMatroskaMuxer
+ CMatroskaMuxerFilter
+ : public CBaseFilter
+ , public CCritSec
+ , public CAMThread
+ , public IAMFilterMiscFlags
+ , public IMediaSeeking
+ , public IMatroskaMuxer
{
protected:
- CAutoPtrList<CMatroskaMuxerInputPin> m_pInputs;
- CAutoPtr<CMatroskaMuxerOutputPin> m_pOutput;
+ CAutoPtrList<CMatroskaMuxerInputPin> m_pInputs;
+ CAutoPtr<CMatroskaMuxerOutputPin> m_pOutput;
- REFERENCE_TIME m_rtCurrent;
+ REFERENCE_TIME m_rtCurrent;
- bool m_fNegative, m_fPositive;
+ bool m_fNegative, m_fPositive;
- enum {CMD_EXIT, CMD_RUN};
- DWORD ThreadProc();
+ enum {CMD_EXIT, CMD_RUN};
+ DWORD ThreadProc();
public:
- CMatroskaMuxerFilter(LPUNKNOWN pUnk, HRESULT* phr);
- virtual ~CMatroskaMuxerFilter();
+ CMatroskaMuxerFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ virtual ~CMatroskaMuxerFilter();
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- void AddInput();
- UINT GetTrackNumber(CBasePin* pPin);
+ void AddInput();
+ UINT GetTrackNumber(CBasePin* pPin);
- int GetPinCount();
- CBasePin* GetPin(int n);
+ int GetPinCount();
+ CBasePin* GetPin(int n);
- STDMETHODIMP Stop();
- STDMETHODIMP Pause();
- STDMETHODIMP Run(REFERENCE_TIME tStart);
+ STDMETHODIMP Stop();
+ STDMETHODIMP Pause();
+ STDMETHODIMP Run(REFERENCE_TIME tStart);
- // IAMFilterMiscFlags
+ // IAMFilterMiscFlags
- STDMETHODIMP_(ULONG) GetMiscFlags();
+ STDMETHODIMP_(ULONG) GetMiscFlags();
- // IMediaSeeking
+ // IMediaSeeking
- STDMETHODIMP GetCapabilities(DWORD* pCapabilities);
- STDMETHODIMP CheckCapabilities(DWORD* pCapabilities);
- STDMETHODIMP IsFormatSupported(const GUID* pFormat);
- STDMETHODIMP QueryPreferredFormat(GUID* pFormat);
- STDMETHODIMP GetTimeFormat(GUID* pFormat);
- STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
- STDMETHODIMP SetTimeFormat(const GUID* pFormat);
- STDMETHODIMP GetDuration(LONGLONG* pDuration);
- STDMETHODIMP GetStopPosition(LONGLONG* pStop);
- STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent);
- STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
- STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
- STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
- STDMETHODIMP GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest);
- STDMETHODIMP SetRate(double dRate);
- STDMETHODIMP GetRate(double* pdRate);
- STDMETHODIMP GetPreroll(LONGLONG* pllPreroll);
+ STDMETHODIMP GetCapabilities(DWORD* pCapabilities);
+ STDMETHODIMP CheckCapabilities(DWORD* pCapabilities);
+ STDMETHODIMP IsFormatSupported(const GUID* pFormat);
+ STDMETHODIMP QueryPreferredFormat(GUID* pFormat);
+ STDMETHODIMP GetTimeFormat(GUID* pFormat);
+ STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
+ STDMETHODIMP SetTimeFormat(const GUID* pFormat);
+ STDMETHODIMP GetDuration(LONGLONG* pDuration);
+ STDMETHODIMP GetStopPosition(LONGLONG* pStop);
+ STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent);
+ STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
+ STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
+ STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
+ STDMETHODIMP GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest);
+ STDMETHODIMP SetRate(double dRate);
+ STDMETHODIMP GetRate(double* pdRate);
+ STDMETHODIMP GetPreroll(LONGLONG* pllPreroll);
- // IMatroskaMuxer
+ // IMatroskaMuxer
- STDMETHODIMP CorrectTimeOffset(bool fNegative, bool fPositive);
+ STDMETHODIMP CorrectTimeOffset(bool fNegative, bool fPositive);
};
diff --git a/src/filters/muxer/WavDest/WavDest.cpp b/src/filters/muxer/WavDest/WavDest.cpp
index 20aa32672..348b2bb43 100644
--- a/src/filters/muxer/WavDest/WavDest.cpp
+++ b/src/filters/muxer/WavDest/WavDest.cpp
@@ -30,36 +30,36 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_WAVE},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_WAVE},
};
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_WAVE},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_WAVE},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CWavDestFilter), WavDestName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CWavDestFilter), WavDestName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {L"WavDest", &__uuidof(CWavDestFilter), CreateInstance<CWavDestFilter>, NULL, &sudFilter[0]}
+ {L"WavDest", &__uuidof(CWavDestFilter), CreateInstance<CWavDestFilter>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -73,31 +73,31 @@ CFilterApp theApp;
//
CWavDestFilter::CWavDestFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CTransformFilter(NAME("WavDest filter"), pUnk, __uuidof(this))
+ : CTransformFilter(NAME("WavDest filter"), pUnk, __uuidof(this))
{
- if (SUCCEEDED(*phr)) {
- if (CWavDestOutputPin* pOut = DNew CWavDestOutputPin(this, phr)) {
- if (SUCCEEDED(*phr)) {
- m_pOutput = pOut;
- } else {
- delete pOut;
- }
- } else {
- *phr = E_OUTOFMEMORY;
- return;
- }
-
- if (CTransformInputPin* pIn = DNew CTransformInputPin(NAME("Transform input pin"), this, phr, L"In")) {
- if (SUCCEEDED(*phr)) {
- m_pInput = pIn;
- } else {
- delete pIn;
- }
- } else {
- *phr = E_OUTOFMEMORY;
- return;
- }
- }
+ if (SUCCEEDED(*phr)) {
+ if (CWavDestOutputPin* pOut = DNew CWavDestOutputPin(this, phr)) {
+ if (SUCCEEDED(*phr)) {
+ m_pOutput = pOut;
+ } else {
+ delete pOut;
+ }
+ } else {
+ *phr = E_OUTOFMEMORY;
+ return;
+ }
+
+ if (CTransformInputPin* pIn = DNew CTransformInputPin(NAME("Transform input pin"), this, phr, L"In")) {
+ if (SUCCEEDED(*phr)) {
+ m_pInput = pIn;
+ } else {
+ delete pIn;
+ }
+ } else {
+ *phr = E_OUTOFMEMORY;
+ return;
+ }
+ }
}
CWavDestFilter::~CWavDestFilter()
@@ -106,143 +106,143 @@ CWavDestFilter::~CWavDestFilter()
HRESULT CWavDestFilter::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut)
{
- return CheckInputType(mtIn);
+ return CheckInputType(mtIn);
}
HRESULT CWavDestFilter::Receive(IMediaSample* pSample)
{
- ULONG cbOld = m_cbWavData;
- HRESULT hr = CTransformFilter::Receive(pSample);
+ ULONG cbOld = m_cbWavData;
+ HRESULT hr = CTransformFilter::Receive(pSample);
- // don't update the count if Deliver() downstream fails.
- if (hr != S_OK) {
- m_cbWavData = cbOld;
- }
+ // don't update the count if Deliver() downstream fails.
+ if (hr != S_OK) {
+ m_cbWavData = cbOld;
+ }
- return hr;
+ return hr;
}
HRESULT CWavDestFilter::Transform(IMediaSample* pIn, IMediaSample* pOut)
{
- REFERENCE_TIME rtStart, rtEnd;
+ REFERENCE_TIME rtStart, rtEnd;
- HRESULT hr = Copy(pIn, pOut);
- if (FAILED(hr)) {
- return hr;
- }
+ HRESULT hr = Copy(pIn, pOut);
+ if (FAILED(hr)) {
+ return hr;
+ }
- // Prepare it for writing
- LONG lActual = pOut->GetActualDataLength();
+ // Prepare it for writing
+ LONG lActual = pOut->GetActualDataLength();
- if (m_cbWavData + m_cbHeader + lActual < m_cbWavData + m_cbHeader ) { // overflow
- return E_FAIL;
- }
+ if (m_cbWavData + m_cbHeader + lActual < m_cbWavData + m_cbHeader) { // overflow
+ return E_FAIL;
+ }
- rtStart = m_cbWavData + m_cbHeader;
- rtEnd = rtStart + lActual;
- m_cbWavData += lActual;
+ rtStart = m_cbWavData + m_cbHeader;
+ rtEnd = rtStart + lActual;
+ m_cbWavData += lActual;
- EXECUTE_ASSERT(pOut->SetTime(&rtStart, &rtEnd) == S_OK);
+ EXECUTE_ASSERT(pOut->SetTime(&rtStart, &rtEnd) == S_OK);
- return S_OK;
+ return S_OK;
}
HRESULT CWavDestFilter::Copy(IMediaSample* pSource, IMediaSample* pDest) const
{
- BYTE* pSourceBuffer, * pDestBuffer;
- long lSourceSize = pSource->GetActualDataLength();
+ BYTE* pSourceBuffer, * pDestBuffer;
+ long lSourceSize = pSource->GetActualDataLength();
#ifdef _DEBUG
- long lDestSize = pDest->GetSize();
- ASSERT(lDestSize >= lSourceSize);
+ long lDestSize = pDest->GetSize();
+ ASSERT(lDestSize >= lSourceSize);
#endif
- pSource->GetPointer(&pSourceBuffer);
- pDest->GetPointer(&pDestBuffer);
+ pSource->GetPointer(&pSourceBuffer);
+ pDest->GetPointer(&pDestBuffer);
- CopyMemory((PVOID)pDestBuffer, (PVOID)pSourceBuffer, lSourceSize);
+ CopyMemory((PVOID)pDestBuffer, (PVOID)pSourceBuffer, lSourceSize);
- // Copy the sample times
+ // Copy the sample times
- REFERENCE_TIME TimeStart, TimeEnd;
- if (NOERROR == pSource->GetTime(&TimeStart, &TimeEnd)) {
- pDest->SetTime(&TimeStart, &TimeEnd);
- }
+ REFERENCE_TIME TimeStart, TimeEnd;
+ if (NOERROR == pSource->GetTime(&TimeStart, &TimeEnd)) {
+ pDest->SetTime(&TimeStart, &TimeEnd);
+ }
- LONGLONG MediaStart, MediaEnd;
- if (pSource->GetMediaTime(&MediaStart, &MediaEnd) == NOERROR) {
- pDest->SetMediaTime(&MediaStart, &MediaEnd);
- }
+ LONGLONG MediaStart, MediaEnd;
+ if (pSource->GetMediaTime(&MediaStart, &MediaEnd) == NOERROR) {
+ pDest->SetMediaTime(&MediaStart, &MediaEnd);
+ }
- // Copy the media type
- AM_MEDIA_TYPE* pMediaType;
- pSource->GetMediaType(&pMediaType);
- pDest->SetMediaType(pMediaType);
- DeleteMediaType(pMediaType);
+ // Copy the media type
+ AM_MEDIA_TYPE* pMediaType;
+ pSource->GetMediaType(&pMediaType);
+ pDest->SetMediaType(pMediaType);
+ DeleteMediaType(pMediaType);
- // Copy the actual data length
- long lDataLength = pSource->GetActualDataLength();
- pDest->SetActualDataLength(lDataLength);
+ // Copy the actual data length
+ long lDataLength = pSource->GetActualDataLength();
+ pDest->SetActualDataLength(lDataLength);
- return NOERROR;
+ return NOERROR;
}
HRESULT CWavDestFilter::CheckInputType(const CMediaType* mtIn)
{
- return mtIn->formattype == FORMAT_WaveFormatEx ? S_OK : S_FALSE;
+ return mtIn->formattype == FORMAT_WaveFormatEx ? S_OK : S_FALSE;
}
HRESULT CWavDestFilter::GetMediaType(int iPosition, CMediaType* pMediaType)
{
- ASSERT(iPosition == 0 || iPosition == 1);
+ ASSERT(iPosition == 0 || iPosition == 1);
- if (iPosition == 0) {
- pMediaType->SetType(&MEDIATYPE_Stream);
- pMediaType->SetSubtype(&MEDIASUBTYPE_WAVE);
- return S_OK;
- }
+ if (iPosition == 0) {
+ pMediaType->SetType(&MEDIATYPE_Stream);
+ pMediaType->SetSubtype(&MEDIASUBTYPE_WAVE);
+ return S_OK;
+ }
- return VFW_S_NO_MORE_ITEMS;
+ return VFW_S_NO_MORE_ITEMS;
}
HRESULT CWavDestFilter::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties)
{
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
- ASSERT(pAlloc);
- ASSERT(pProperties);
+ ASSERT(pAlloc);
+ ASSERT(pProperties);
- HRESULT hr = NOERROR;
+ HRESULT hr = NOERROR;
- pProperties->cBuffers = 1;
- pProperties->cbAlign = 1;
+ pProperties->cBuffers = 1;
+ pProperties->cbAlign = 1;
- CComPtr<IMemAllocator> pInAlloc;
- ALLOCATOR_PROPERTIES InProps;
- if (SUCCEEDED(hr = m_pInput->GetAllocator(&pInAlloc))
- && SUCCEEDED(hr = pInAlloc->GetProperties(&InProps))) {
- pProperties->cbBuffer = InProps.cbBuffer;
- } else {
- return hr;
- }
+ CComPtr<IMemAllocator> pInAlloc;
+ ALLOCATOR_PROPERTIES InProps;
+ if (SUCCEEDED(hr = m_pInput->GetAllocator(&pInAlloc))
+ && SUCCEEDED(hr = pInAlloc->GetProperties(&InProps))) {
+ pProperties->cbBuffer = InProps.cbBuffer;
+ } else {
+ return hr;
+ }
- ASSERT(pProperties->cbBuffer);
+ ASSERT(pProperties->cbBuffer);
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAlloc->SetProperties(pProperties,&Actual))) {
- return hr;
- }
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- ASSERT(Actual.cBuffers == 1);
+ ASSERT(Actual.cBuffers == 1);
- if (pProperties->cBuffers > Actual.cBuffers
- || pProperties->cbBuffer > Actual.cbBuffer) {
- return E_FAIL;
- }
+ if (pProperties->cBuffers > Actual.cBuffers
+ || pProperties->cbBuffer > Actual.cbBuffer) {
+ return E_FAIL;
+ }
- return NOERROR;
+ return NOERROR;
}
// Compute the header size to allow space for us to write it at the end.
@@ -255,77 +255,77 @@ HRESULT CWavDestFilter::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPER
HRESULT CWavDestFilter::StartStreaming()
{
- // leave space for the header
- m_cbHeader = sizeof(RIFFLIST) +
- sizeof(RIFFCHUNK) +
- m_pInput->CurrentMediaType().FormatLength() +
- sizeof(RIFFCHUNK);
+ // leave space for the header
+ m_cbHeader = sizeof(RIFFLIST) +
+ sizeof(RIFFCHUNK) +
+ m_pInput->CurrentMediaType().FormatLength() +
+ sizeof(RIFFCHUNK);
- m_cbWavData = 0;
+ m_cbWavData = 0;
- return S_OK;
+ return S_OK;
}
HRESULT CWavDestFilter::StopStreaming()
{
- IStream* pStream;
- if (m_pOutput->IsConnected() == FALSE) {
- return E_FAIL;
- }
+ IStream* pStream;
+ if (m_pOutput->IsConnected() == FALSE) {
+ return E_FAIL;
+ }
- IPin* pDwnstrmInputPin = m_pOutput->GetConnected();
+ IPin* pDwnstrmInputPin = m_pOutput->GetConnected();
- if (!pDwnstrmInputPin) {
- return E_FAIL;
- }
+ if (!pDwnstrmInputPin) {
+ return E_FAIL;
+ }
- HRESULT hr = ((IMemInputPin *) pDwnstrmInputPin)->QueryInterface(IID_IStream, (void **)&pStream);
- if (SUCCEEDED(hr)) {
- BYTE *pb = (BYTE *)_alloca(m_cbHeader);
+ HRESULT hr = ((IMemInputPin*) pDwnstrmInputPin)->QueryInterface(IID_IStream, (void**)&pStream);
+ if (SUCCEEDED(hr)) {
+ BYTE* pb = (BYTE*)_alloca(m_cbHeader);
- RIFFLIST *pRiffWave = (RIFFLIST *)pb;
- RIFFCHUNK *pRiffFmt = (RIFFCHUNK *)(pRiffWave + 1);
- RIFFCHUNK *pRiffData = (RIFFCHUNK *)(((BYTE *)(pRiffFmt + 1)) + m_pInput->CurrentMediaType().FormatLength());
+ RIFFLIST* pRiffWave = (RIFFLIST*)pb;
+ RIFFCHUNK* pRiffFmt = (RIFFCHUNK*)(pRiffWave + 1);
+ RIFFCHUNK* pRiffData = (RIFFCHUNK*)(((BYTE*)(pRiffFmt + 1)) + m_pInput->CurrentMediaType().FormatLength());
- pRiffData->fcc = FCC('data');
- pRiffData->cb = m_cbWavData;
+ pRiffData->fcc = FCC('data');
+ pRiffData->cb = m_cbWavData;
- pRiffFmt->fcc = FCC('fmt ');
- pRiffFmt->cb = m_pInput->CurrentMediaType().FormatLength();
- CopyMemory(pRiffFmt + 1, m_pInput->CurrentMediaType().Format(), pRiffFmt->cb);
+ pRiffFmt->fcc = FCC('fmt ');
+ pRiffFmt->cb = m_pInput->CurrentMediaType().FormatLength();
+ CopyMemory(pRiffFmt + 1, m_pInput->CurrentMediaType().Format(), pRiffFmt->cb);
- pRiffWave->fcc = FCC('RIFF');
- pRiffWave->cb = m_cbWavData + m_cbHeader - sizeof(RIFFCHUNK);
- pRiffWave->fccListType = FCC('WAVE');
+ pRiffWave->fcc = FCC('RIFF');
+ pRiffWave->cb = m_cbWavData + m_cbHeader - sizeof(RIFFCHUNK);
+ pRiffWave->fccListType = FCC('WAVE');
- LARGE_INTEGER li;
- ZeroMemory(&li, sizeof(li));
+ LARGE_INTEGER li;
+ ZeroMemory(&li, sizeof(li));
- hr = pStream->Seek(li, STREAM_SEEK_SET, 0);
- if (SUCCEEDED(hr)) {
- hr = pStream->Write(pb, m_cbHeader, 0);
- }
- pStream->Release();
- }
+ hr = pStream->Seek(li, STREAM_SEEK_SET, 0);
+ if (SUCCEEDED(hr)) {
+ hr = pStream->Write(pb, m_cbHeader, 0);
+ }
+ pStream->Release();
+ }
- return hr;
+ return hr;
}
CWavDestOutputPin::CWavDestOutputPin(CTransformFilter* pFilter, HRESULT* phr)
- : CTransformOutputPin(NAME("WavDest output pin"), pFilter, phr, L"Out")
+ : CTransformOutputPin(NAME("WavDest output pin"), pFilter, phr, L"Out")
{
}
STDMETHODIMP CWavDestOutputPin::EnumMediaTypes(IEnumMediaTypes** ppEnum)
{
- return CBaseOutputPin::EnumMediaTypes(ppEnum);
+ return CBaseOutputPin::EnumMediaTypes(ppEnum);
}
HRESULT CWavDestOutputPin::CheckMediaType(const CMediaType* pmt)
{
- if (pmt->majortype == MEDIATYPE_Stream && pmt->subtype == MEDIASUBTYPE_WAVE) {
- return S_OK;
- } else {
- return S_FALSE;
- }
+ if (pmt->majortype == MEDIATYPE_Stream && pmt->subtype == MEDIASUBTYPE_WAVE) {
+ return S_OK;
+ } else {
+ return S_FALSE;
+ }
}
diff --git a/src/filters/muxer/WavDest/WavDest.h b/src/filters/muxer/WavDest/WavDest.h
index b5e58b413..e380c435a 100644
--- a/src/filters/muxer/WavDest/WavDest.h
+++ b/src/filters/muxer/WavDest/WavDest.h
@@ -30,39 +30,39 @@
class CWavDestOutputPin : public CTransformOutputPin
{
public:
- CWavDestOutputPin(CTransformFilter* pFilter, HRESULT* phr);
+ CWavDestOutputPin(CTransformFilter* pFilter, HRESULT* phr);
- STDMETHODIMP EnumMediaTypes(IEnumMediaTypes** ppEnum);
- HRESULT CheckMediaType(const CMediaType* pmt);
+ STDMETHODIMP EnumMediaTypes(IEnumMediaTypes** ppEnum);
+ HRESULT CheckMediaType(const CMediaType* pmt);
};
class __declspec(uuid("8685214E-4D32-4058-BE04-D01104F00B0C"))
- CWavDestFilter : public CTransformFilter
+ CWavDestFilter : public CTransformFilter
{
public:
- CWavDestFilter(LPUNKNOWN pUnk, HRESULT* pHr);
- ~CWavDestFilter();
+ CWavDestFilter(LPUNKNOWN pUnk, HRESULT* pHr);
+ ~CWavDestFilter();
- DECLARE_IUNKNOWN;
+ DECLARE_IUNKNOWN;
- HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
- HRESULT Receive(IMediaSample* pSample);
+ HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
+ HRESULT Receive(IMediaSample* pSample);
- HRESULT CheckInputType(const CMediaType* mtIn);
- HRESULT CheckTransform(const CMediaType*mtIn, const CMediaType* mtOut);
- HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
+ HRESULT CheckInputType(const CMediaType* mtIn);
+ HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
+ HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
- HRESULT DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT StartStreaming();
- HRESULT StopStreaming();
+ HRESULT StartStreaming();
+ HRESULT StopStreaming();
private:
- HRESULT Copy(IMediaSample* pSource, IMediaSample* pDest) const;
- HRESULT Transform(IMediaSample* pMediaSample);
- HRESULT Transform(AM_MEDIA_TYPE* pType, const signed char ContrastLevel) const;
+ HRESULT Copy(IMediaSample* pSource, IMediaSample* pDest) const;
+ HRESULT Transform(IMediaSample* pMediaSample);
+ HRESULT Transform(AM_MEDIA_TYPE* pType, const signed char ContrastLevel) const;
- ULONG m_cbWavData;
- ULONG m_cbHeader;
+ ULONG m_cbWavData;
+ ULONG m_cbHeader;
};
diff --git a/src/filters/parser/AviSplitter/AviFile.cpp b/src/filters/parser/AviSplitter/AviFile.cpp
index 2143705eb..92ceaa6bc 100644
--- a/src/filters/parser/AviSplitter/AviFile.cpp
+++ b/src/filters/parser/AviSplitter/AviFile.cpp
@@ -30,620 +30,620 @@
//
CAviFile::CAviFile(IAsyncReader* pAsyncReader, HRESULT& hr)
- : CBaseSplitterFile(pAsyncReader, hr)
+ : CBaseSplitterFile(pAsyncReader, hr)
{
- if (FAILED(hr)) {
- return;
- }
- m_isamv = false;
- hr = Init();
+ if (FAILED(hr)) {
+ return;
+ }
+ m_isamv = false;
+ hr = Init();
}
HRESULT CAviFile::Init()
{
- Seek(0);
- DWORD dw[3];
- if (S_OK != Read(dw) || dw[0] != FCC('RIFF') || (dw[2] != FCC('AVI ') && dw[2] != FCC('AVIX') && dw[2] != FCC('AMV '))) {
- return E_FAIL;
- }
-
- m_isamv = (dw[2] == FCC('AMV '));
- Seek(0);
- HRESULT hr = Parse(0, GetLength());
- UNREFERENCED_PARAMETER(hr);
- if (m_movis.GetCount() == 0) { // FAILED(hr) is allowed as long as there was a movi chunk found
- return E_FAIL;
- }
-
- if (m_avih.dwStreams == 0 && m_strms.GetCount() > 0) {
- m_avih.dwStreams = (DWORD)m_strms.GetCount();
- }
-
- if (m_avih.dwStreams != m_strms.GetCount()) {
- return E_FAIL;
- }
-
- for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
- strm_t* s = m_strms[i];
- if (s->strh.fccType != FCC('auds')) {
- continue;
- }
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)s->strf.GetData();
- if (wfe->wFormatTag == 0x55 && wfe->nBlockAlign == 1152
- && s->strh.dwScale == 1 && s->strh.dwRate != wfe->nSamplesPerSec) {
- // correcting encoder bugs...
- s->strh.dwScale = 1152;
- s->strh.dwRate = wfe->nSamplesPerSec;
- }
- }
-
- if (!m_isamv && (FAILED(BuildIndex()))) {
- EmptyIndex();
- }
-
- return S_OK;
+ Seek(0);
+ DWORD dw[3];
+ if (S_OK != Read(dw) || dw[0] != FCC('RIFF') || (dw[2] != FCC('AVI ') && dw[2] != FCC('AVIX') && dw[2] != FCC('AMV '))) {
+ return E_FAIL;
+ }
+
+ m_isamv = (dw[2] == FCC('AMV '));
+ Seek(0);
+ HRESULT hr = Parse(0, GetLength());
+ UNREFERENCED_PARAMETER(hr);
+ if (m_movis.GetCount() == 0) { // FAILED(hr) is allowed as long as there was a movi chunk found
+ return E_FAIL;
+ }
+
+ if (m_avih.dwStreams == 0 && m_strms.GetCount() > 0) {
+ m_avih.dwStreams = (DWORD)m_strms.GetCount();
+ }
+
+ if (m_avih.dwStreams != m_strms.GetCount()) {
+ return E_FAIL;
+ }
+
+ for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
+ strm_t* s = m_strms[i];
+ if (s->strh.fccType != FCC('auds')) {
+ continue;
+ }
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)s->strf.GetData();
+ if (wfe->wFormatTag == 0x55 && wfe->nBlockAlign == 1152
+ && s->strh.dwScale == 1 && s->strh.dwRate != wfe->nSamplesPerSec) {
+ // correcting encoder bugs...
+ s->strh.dwScale = 1152;
+ s->strh.dwRate = wfe->nSamplesPerSec;
+ }
+ }
+
+ if (!m_isamv && (FAILED(BuildIndex()))) {
+ EmptyIndex();
+ }
+
+ return S_OK;
}
HRESULT CAviFile::BuildAMVIndex()
{
- strm_t::chunk NewChunk;
- DWORD ulType;
- DWORD ulSize;
-
- memset (&NewChunk, 0, sizeof(strm_t::chunk));
- while ((Read(ulType) == S_OK) && (Read(ulSize) == S_OK)) {
- switch (ulType) {
- case FCC('00dc'): // 01bw : JPeg
- NewChunk.size = ulSize;
- NewChunk.filepos = GetPos();
- NewChunk.orgsize = ulSize;
- NewChunk.fKeyFrame = true;
- m_strms[0]->cs.Add (NewChunk);
- break;
- case FCC('01wb'): // 00dc : Audio
- NewChunk.size = ulSize;
- NewChunk.orgsize = ulSize;
- NewChunk.fKeyFrame = true;
- NewChunk.filepos = GetPos();
- m_strms[1]->cs.Add (NewChunk);
- break;
- }
- Seek(GetPos() + ulSize);
- }
-
- TRACE ("Video packet : %d Audio packet :%d\n", m_strms[0]->cs.GetCount(), m_strms[1]->cs.GetCount());
- return S_OK;
+ strm_t::chunk NewChunk;
+ DWORD ulType;
+ DWORD ulSize;
+
+ memset(&NewChunk, 0, sizeof(strm_t::chunk));
+ while ((Read(ulType) == S_OK) && (Read(ulSize) == S_OK)) {
+ switch (ulType) {
+ case FCC('00dc'): // 01bw : JPeg
+ NewChunk.size = ulSize;
+ NewChunk.filepos = GetPos();
+ NewChunk.orgsize = ulSize;
+ NewChunk.fKeyFrame = true;
+ m_strms[0]->cs.Add(NewChunk);
+ break;
+ case FCC('01wb'): // 00dc : Audio
+ NewChunk.size = ulSize;
+ NewChunk.orgsize = ulSize;
+ NewChunk.fKeyFrame = true;
+ NewChunk.filepos = GetPos();
+ m_strms[1]->cs.Add(NewChunk);
+ break;
+ }
+ Seek(GetPos() + ulSize);
+ }
+
+ TRACE("Video packet : %d Audio packet :%d\n", m_strms[0]->cs.GetCount(), m_strms[1]->cs.GetCount());
+ return S_OK;
}
HRESULT CAviFile::Parse(DWORD parentid, __int64 end)
{
- HRESULT hr = S_OK;
-
- CAutoPtr<strm_t> strm;
-
- while (S_OK == hr && GetPos() < end) {
- UINT64 pos = GetPos();
-
- DWORD id = 0, size;
- if (S_OK != Read(id) || id == 0) {
- return E_FAIL;
- }
-
- if (id == FCC('RIFF') || id == FCC('LIST')) {
- if (S_OK != Read(size) || S_OK != Read(id)) {
- return E_FAIL;
- }
-
- if (m_isamv) {
- size = (DWORD)(min(end, DWORD_MAX) - GetPos() - 8); // No size set in AVM : guess end of file...
- }
- size += (size&1) + 8;
-
- TRACE(_T("CAviFile::Parse(..): LIST '%c%c%c%c'\n"),
- TCHAR((id>>0)&0xff),
- TCHAR((id>>8)&0xff),
- TCHAR((id>>16)&0xff),
- TCHAR((id>>24)&0xff));
-
- if (id == FCC('movi')) {
- m_movis.AddTail(pos);
- if (m_isamv) {
- BuildAMVIndex();
- }
- } else {
- hr = Parse(id, pos + size);
- }
- } else {
- if (S_OK != Read(size)) {
- return E_FAIL;
- }
-
- TRACE(_T("CAviFile::Parse(..): '%c%c%c%c'\n"),
- TCHAR((id>>0)&0xff),
- TCHAR((id>>8)&0xff),
- TCHAR((id>>16)&0xff),
- TCHAR((id>>24)&0xff));
-
- if (parentid == FCC('INFO') && size > 0) {
- switch (id) {
- case FCC('IARL'): // Archival Location. Indicates where the subject of the file is archived.
- case FCC('IART'): // Artist. Lists the artist of the original subject of the file; for example, "Michaelangelo."
- case FCC('ICMS'): // Commissioned. Lists the name of the person or organization that commissioned the subject of the file; for example, "Pope Julian II."
- case FCC('ICMT'): // Comments. Provides general comments about the file or the subject of the file. If the comment is several sentences long, end each sentence with a period. Do not include new-line characters.
- case FCC('ICOP'): // Copyright. Records the copyright information for the file; for example, "Copyright Encyclopedia International 1991." If there are multiple copyrights, separate them by a semicolon followed by a space.
- case FCC('ICRD'): // Creation date. Specifies the date the subject of the file was created. List dates in year-month-day format, padding one-digit months and days with a zero on the left; for example, "1553-05-03" for May 3, 1553.
- case FCC('ICRP'): // Cropped. Describes whether an image has been cropped and, if so, how it was cropped; for example, "lower-right corner."
- case FCC('IDIM'): // Dimensions. Specifies the size of the original subject of the file; for example, "8.5 in h, 11 in w."
- case FCC('IDPI'): // Dots Per Inch. Stores dots per inch setting of the digitizer used to produce the file, such as "300."
- case FCC('IENG'): // Engineer. Stores the name of the engineer who worked on the file. If there are multiple engineers, separate the names by a semicolon and a blank; for example, "Smith, John; Adams, Joe."
- case FCC('IGNR'): // Genre. Describes the original work, such as "landscape," "portrait," "still life," etc.
- case FCC('IKEY'): // Keywords. Provides a list of keywords that refer to the file or subject of the file. Separate multiple keywords with a semicolon and a blank; for example, "Seattle; aerial view; scenery."
- case FCC('ILGT'): // Lightness. Describes the changes in lightness settings on the digitizer required to produce the file. Note that the format of this information depends on hardware used.
- case FCC('IMED'): // Medium. Describes the original subject of the file, such as "computer image," "drawing," "lithograph," and so on.
- case FCC('INAM'): // Name. Stores the title of the subject of the file, such as "Seattle From Above."
- case FCC('IPLT'): // Palette Setting. Specifies the number of colors requested when digitizing an image, such as "256."
- case FCC('IPRD'): // Product. Specifies the name of the title the file was originally intended for, such as "Encyclopedia of Pacific Northwest Geography."
- case FCC('ISBJ'): // Subject. Describes the contents of the file, such as "Aerial view of Seattle."
- case FCC('ISFT'): // Software. Identifies the name of the software package used to create the file, such as "Microsoft WaveEdit."
- case FCC('ISHP'): // Sharpness. Identifies the changes in sharpness for the digitizer required to produce the file (the format depends on the hardware used).
- case FCC('ISRC'): // Source. Identifies the name of the person or organization who supplied the original subject of the file; for example, "Trey Research."
- case FCC('ISRF'): // Source Form. Identifies the original form of the material that was digitized, such as "slide," "paper," "map," and so on. This is not necessarily the same as IMED.
- case FCC('ITCH'): { // Technician. Identifies the technician who digitized the subject file; for example, "Smith, John."
- CStringA str;
- if (S_OK != ByteRead((BYTE*)str.GetBufferSetLength(size), size)) {
- return E_FAIL;
- }
- m_info[id] = str;
- break;
- }
- }
- }
-
- switch (id) {
- case FCC('amvh'):
- case FCC('avih'):
- m_avih.fcc = id;
- m_avih.cb = size;
- if (S_OK != Read(m_avih, 8)) {
- return E_FAIL;
- }
- break;
- case FCC('strh'):
- if (!strm) {
- strm.Attach(DNew strm_t());
- }
- strm->strh.fcc = FCC('strh');
- strm->strh.cb = size;
- if (S_OK != Read(strm->strh, 8)) {
- return E_FAIL;
- }
- if (m_isamv) {
- // First alway video, second always audio
- strm->strh.fccType = m_strms.GetCount() == 0 ? FCC('vids') : FCC('amva');
- strm->strh.dwRate = m_avih.dwReserved[0]*1000; // dwReserved[0] = fps!
- strm->strh.dwScale = 1000;
- }
- break;
- case FCC('strn'):
- if (S_OK != ByteRead((BYTE*)strm->strn.GetBufferSetLength(size), size)) {
- return E_FAIL;
- }
- break;
- case FCC('strf'):
- if (!strm) {
- strm.Attach(DNew strm_t());
- }
- strm->strf.SetCount(size);
- if (S_OK != ByteRead(strm->strf.GetData(), size)) {
- return E_FAIL;
- }
- if (m_isamv) {
- if (strm->strh.fccType == FCC('vids')) {
- strm->strf.SetCount(sizeof(BITMAPINFOHEADER));
- BITMAPINFOHEADER* pbmi = &((BITMAPINFO*)strm->strf.GetData())->bmiHeader;
- pbmi->biSize = sizeof(BITMAPINFOHEADER);
- pbmi->biHeight = m_avih.dwHeight;
- pbmi->biWidth = m_avih.dwWidth;
- pbmi->biCompression = FCC('AMVV');
- pbmi->biPlanes = 1;
- pbmi->biBitCount = 24;
- pbmi->biSizeImage = pbmi->biHeight * pbmi->biWidth * (pbmi->biBitCount/8);
- }
- m_strms.Add(strm);
- }
-
- break;
- case FCC('indx'):
- if (!strm) {
- strm.Attach(DNew strm_t());
- }
- ASSERT(strm->indx == NULL);
- AVISUPERINDEX* pSuperIndex;
- if (size < MAXDWORD-8) {
- // Fix buffer overrun vulnerability : http://www.vulnhunt.com/advisories/CAL-20070912-1_Multiple_vendor_produce_handling_AVI_file_vulnerabilities.txt
- TRY {
- pSuperIndex = (AVISUPERINDEX*)DNew unsigned char [(size_t)(size + 8)];
- }
- CATCH (CMemoryException, e) {
- pSuperIndex = NULL;
- }
- END_CATCH
- if (pSuperIndex) {
- strm->indx.Attach(pSuperIndex);
- strm->indx->fcc = FCC('indx');
- strm->indx->cb = size;
- if (S_OK != ByteRead((BYTE*)(AVISUPERINDEX*)strm->indx + 8, size)) {
- return E_FAIL;
- }
- ASSERT(strm->indx->wLongsPerEntry == 4 && strm->indx->bIndexType == AVI_INDEX_OF_INDEXES);
- }
- }
- break;
- case FCC('dmlh'):
- if (S_OK != Read(m_dmlh)) {
- return E_FAIL;
- }
- break;
- case FCC('vprp'):
- //if (S_OK != Read(m_vprp)) return E_FAIL;
- break;
- case FCC('idx1'):
- ASSERT(m_idx1 == NULL);
- m_idx1.Attach((AVIOLDINDEX*)DNew BYTE[size + 8]);
- m_idx1->fcc = FCC('idx1');
- m_idx1->cb = size;
- if (S_OK != ByteRead((BYTE*)(AVIOLDINDEX*)m_idx1 + 8, size)) {
- return E_FAIL;
- }
- break;
- default :
- TRACE(_T("CAviFile::Parse(..): unknown tag '%c%c%c%c'\n"),
- TCHAR((id>>0)&0xff),
- TCHAR((id>>8)&0xff),
- TCHAR((id>>16)&0xff),
- TCHAR((id>>24)&0xff));
- break;
- }
-
- size += (size&1) + 8;
- }
-
- Seek(pos + size);
- }
-
- if (strm) {
- m_strms.Add(strm);
- }
-
- return hr;
+ HRESULT hr = S_OK;
+
+ CAutoPtr<strm_t> strm;
+
+ while (S_OK == hr && GetPos() < end) {
+ UINT64 pos = GetPos();
+
+ DWORD id = 0, size;
+ if (S_OK != Read(id) || id == 0) {
+ return E_FAIL;
+ }
+
+ if (id == FCC('RIFF') || id == FCC('LIST')) {
+ if (S_OK != Read(size) || S_OK != Read(id)) {
+ return E_FAIL;
+ }
+
+ if (m_isamv) {
+ size = (DWORD)(min(end, DWORD_MAX) - GetPos() - 8); // No size set in AVM : guess end of file...
+ }
+ size += (size & 1) + 8;
+
+ TRACE(_T("CAviFile::Parse(..): LIST '%c%c%c%c'\n"),
+ TCHAR((id >> 0) & 0xff),
+ TCHAR((id >> 8) & 0xff),
+ TCHAR((id >> 16) & 0xff),
+ TCHAR((id >> 24) & 0xff));
+
+ if (id == FCC('movi')) {
+ m_movis.AddTail(pos);
+ if (m_isamv) {
+ BuildAMVIndex();
+ }
+ } else {
+ hr = Parse(id, pos + size);
+ }
+ } else {
+ if (S_OK != Read(size)) {
+ return E_FAIL;
+ }
+
+ TRACE(_T("CAviFile::Parse(..): '%c%c%c%c'\n"),
+ TCHAR((id >> 0) & 0xff),
+ TCHAR((id >> 8) & 0xff),
+ TCHAR((id >> 16) & 0xff),
+ TCHAR((id >> 24) & 0xff));
+
+ if (parentid == FCC('INFO') && size > 0) {
+ switch (id) {
+ case FCC('IARL'): // Archival Location. Indicates where the subject of the file is archived.
+ case FCC('IART'): // Artist. Lists the artist of the original subject of the file; for example, "Michaelangelo."
+ case FCC('ICMS'): // Commissioned. Lists the name of the person or organization that commissioned the subject of the file; for example, "Pope Julian II."
+ case FCC('ICMT'): // Comments. Provides general comments about the file or the subject of the file. If the comment is several sentences long, end each sentence with a period. Do not include new-line characters.
+ case FCC('ICOP'): // Copyright. Records the copyright information for the file; for example, "Copyright Encyclopedia International 1991." If there are multiple copyrights, separate them by a semicolon followed by a space.
+ case FCC('ICRD'): // Creation date. Specifies the date the subject of the file was created. List dates in year-month-day format, padding one-digit months and days with a zero on the left; for example, "1553-05-03" for May 3, 1553.
+ case FCC('ICRP'): // Cropped. Describes whether an image has been cropped and, if so, how it was cropped; for example, "lower-right corner."
+ case FCC('IDIM'): // Dimensions. Specifies the size of the original subject of the file; for example, "8.5 in h, 11 in w."
+ case FCC('IDPI'): // Dots Per Inch. Stores dots per inch setting of the digitizer used to produce the file, such as "300."
+ case FCC('IENG'): // Engineer. Stores the name of the engineer who worked on the file. If there are multiple engineers, separate the names by a semicolon and a blank; for example, "Smith, John; Adams, Joe."
+ case FCC('IGNR'): // Genre. Describes the original work, such as "landscape," "portrait," "still life," etc.
+ case FCC('IKEY'): // Keywords. Provides a list of keywords that refer to the file or subject of the file. Separate multiple keywords with a semicolon and a blank; for example, "Seattle; aerial view; scenery."
+ case FCC('ILGT'): // Lightness. Describes the changes in lightness settings on the digitizer required to produce the file. Note that the format of this information depends on hardware used.
+ case FCC('IMED'): // Medium. Describes the original subject of the file, such as "computer image," "drawing," "lithograph," and so on.
+ case FCC('INAM'): // Name. Stores the title of the subject of the file, such as "Seattle From Above."
+ case FCC('IPLT'): // Palette Setting. Specifies the number of colors requested when digitizing an image, such as "256."
+ case FCC('IPRD'): // Product. Specifies the name of the title the file was originally intended for, such as "Encyclopedia of Pacific Northwest Geography."
+ case FCC('ISBJ'): // Subject. Describes the contents of the file, such as "Aerial view of Seattle."
+ case FCC('ISFT'): // Software. Identifies the name of the software package used to create the file, such as "Microsoft WaveEdit."
+ case FCC('ISHP'): // Sharpness. Identifies the changes in sharpness for the digitizer required to produce the file (the format depends on the hardware used).
+ case FCC('ISRC'): // Source. Identifies the name of the person or organization who supplied the original subject of the file; for example, "Trey Research."
+ case FCC('ISRF'): // Source Form. Identifies the original form of the material that was digitized, such as "slide," "paper," "map," and so on. This is not necessarily the same as IMED.
+ case FCC('ITCH'): { // Technician. Identifies the technician who digitized the subject file; for example, "Smith, John."
+ CStringA str;
+ if (S_OK != ByteRead((BYTE*)str.GetBufferSetLength(size), size)) {
+ return E_FAIL;
+ }
+ m_info[id] = str;
+ break;
+ }
+ }
+ }
+
+ switch (id) {
+ case FCC('amvh'):
+ case FCC('avih'):
+ m_avih.fcc = id;
+ m_avih.cb = size;
+ if (S_OK != Read(m_avih, 8)) {
+ return E_FAIL;
+ }
+ break;
+ case FCC('strh'):
+ if (!strm) {
+ strm.Attach(DNew strm_t());
+ }
+ strm->strh.fcc = FCC('strh');
+ strm->strh.cb = size;
+ if (S_OK != Read(strm->strh, 8)) {
+ return E_FAIL;
+ }
+ if (m_isamv) {
+ // First alway video, second always audio
+ strm->strh.fccType = m_strms.GetCount() == 0 ? FCC('vids') : FCC('amva');
+ strm->strh.dwRate = m_avih.dwReserved[0] * 1000; // dwReserved[0] = fps!
+ strm->strh.dwScale = 1000;
+ }
+ break;
+ case FCC('strn'):
+ if (S_OK != ByteRead((BYTE*)strm->strn.GetBufferSetLength(size), size)) {
+ return E_FAIL;
+ }
+ break;
+ case FCC('strf'):
+ if (!strm) {
+ strm.Attach(DNew strm_t());
+ }
+ strm->strf.SetCount(size);
+ if (S_OK != ByteRead(strm->strf.GetData(), size)) {
+ return E_FAIL;
+ }
+ if (m_isamv) {
+ if (strm->strh.fccType == FCC('vids')) {
+ strm->strf.SetCount(sizeof(BITMAPINFOHEADER));
+ BITMAPINFOHEADER* pbmi = &((BITMAPINFO*)strm->strf.GetData())->bmiHeader;
+ pbmi->biSize = sizeof(BITMAPINFOHEADER);
+ pbmi->biHeight = m_avih.dwHeight;
+ pbmi->biWidth = m_avih.dwWidth;
+ pbmi->biCompression = FCC('AMVV');
+ pbmi->biPlanes = 1;
+ pbmi->biBitCount = 24;
+ pbmi->biSizeImage = pbmi->biHeight * pbmi->biWidth * (pbmi->biBitCount / 8);
+ }
+ m_strms.Add(strm);
+ }
+
+ break;
+ case FCC('indx'):
+ if (!strm) {
+ strm.Attach(DNew strm_t());
+ }
+ ASSERT(strm->indx == NULL);
+ AVISUPERINDEX* pSuperIndex;
+ if (size < MAXDWORD - 8) {
+ // Fix buffer overrun vulnerability : http://www.vulnhunt.com/advisories/CAL-20070912-1_Multiple_vendor_produce_handling_AVI_file_vulnerabilities.txt
+ TRY {
+ pSuperIndex = (AVISUPERINDEX*)DNew unsigned char [(size_t)(size + 8)];
+ }
+ CATCH(CMemoryException, e) {
+ pSuperIndex = NULL;
+ }
+ END_CATCH
+ if (pSuperIndex) {
+ strm->indx.Attach(pSuperIndex);
+ strm->indx->fcc = FCC('indx');
+ strm->indx->cb = size;
+ if (S_OK != ByteRead((BYTE*)(AVISUPERINDEX*)strm->indx + 8, size)) {
+ return E_FAIL;
+ }
+ ASSERT(strm->indx->wLongsPerEntry == 4 && strm->indx->bIndexType == AVI_INDEX_OF_INDEXES);
+ }
+ }
+ break;
+ case FCC('dmlh'):
+ if (S_OK != Read(m_dmlh)) {
+ return E_FAIL;
+ }
+ break;
+ case FCC('vprp'):
+ //if (S_OK != Read(m_vprp)) return E_FAIL;
+ break;
+ case FCC('idx1'):
+ ASSERT(m_idx1 == NULL);
+ m_idx1.Attach((AVIOLDINDEX*)DNew BYTE[size + 8]);
+ m_idx1->fcc = FCC('idx1');
+ m_idx1->cb = size;
+ if (S_OK != ByteRead((BYTE*)(AVIOLDINDEX*)m_idx1 + 8, size)) {
+ return E_FAIL;
+ }
+ break;
+ default :
+ TRACE(_T("CAviFile::Parse(..): unknown tag '%c%c%c%c'\n"),
+ TCHAR((id >> 0) & 0xff),
+ TCHAR((id >> 8) & 0xff),
+ TCHAR((id >> 16) & 0xff),
+ TCHAR((id >> 24) & 0xff));
+ break;
+ }
+
+ size += (size & 1) + 8;
+ }
+
+ Seek(pos + size);
+ }
+
+ if (strm) {
+ m_strms.Add(strm);
+ }
+
+ return hr;
}
REFERENCE_TIME CAviFile::GetTotalTime()
{
- REFERENCE_TIME t = 0/*10i64*m_avih.dwMicroSecPerFrame*m_avih.dwTotalFrames*/;
+ REFERENCE_TIME t = 0/*10i64*m_avih.dwMicroSecPerFrame*m_avih.dwTotalFrames*/;
- for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
- strm_t* s = m_strms[i];
- REFERENCE_TIME t2 = s->GetRefTime((DWORD)s->cs.GetCount(), s->totalsize);
- t = max(t, t2);
- }
+ for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
+ strm_t* s = m_strms[i];
+ REFERENCE_TIME t2 = s->GetRefTime((DWORD)s->cs.GetCount(), s->totalsize);
+ t = max(t, t2);
+ }
- if (t == 0) {
- t = 10i64*m_avih.dwMicroSecPerFrame*m_avih.dwTotalFrames;
- }
+ if (t == 0) {
+ t = 10i64 * m_avih.dwMicroSecPerFrame * m_avih.dwTotalFrames;
+ }
- return t;
+ return t;
}
HRESULT CAviFile::BuildIndex()
{
- EmptyIndex();
-
- DWORD nSuperIndexes = 0;
-
- for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
- strm_t* s = m_strms[i];
- if (s->indx && s->indx->nEntriesInUse > 0) {
- ++nSuperIndexes;
- }
- }
-
- if (nSuperIndexes == m_avih.dwStreams) {
- for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
- strm_t* s = m_strms[i];
-
- AVISUPERINDEX* idx = (AVISUPERINDEX*)s->indx;
-
- DWORD nEntriesInUse = 0;
-
- for (DWORD j = 0; j < idx->nEntriesInUse; ++j) {
- Seek(idx->aIndex[j].qwOffset);
-
- AVISTDINDEX stdidx;
- if (S_OK != ByteRead((BYTE*)&stdidx, FIELD_OFFSET(AVISTDINDEX, aIndex))) {
- EmptyIndex();
- return E_FAIL;
- }
-
- nEntriesInUse += stdidx.nEntriesInUse;
- }
-
- s->cs.SetCount(nEntriesInUse);
-
- DWORD frame = 0;
- UINT64 size = 0;
-
- for (DWORD j = 0; j < idx->nEntriesInUse; ++j) {
- Seek(idx->aIndex[j].qwOffset);
-
- CAutoPtr<AVISTDINDEX> p((AVISTDINDEX*)DNew BYTE[idx->aIndex[j].dwSize]);
- if (!p || S_OK != ByteRead((BYTE*)(AVISTDINDEX*)p, idx->aIndex[j].dwSize) || p->qwBaseOffset >= (DWORDLONG)GetLength()) {
- EmptyIndex();
- return E_FAIL;
- }
-
- for (DWORD k = 0; k < p->nEntriesInUse; ++k) {
- s->cs[frame].size = size;
- s->cs[frame].filepos = p->qwBaseOffset + p->aIndex[k].dwOffset;
- s->cs[frame].fKeyFrame = !(p->aIndex[k].dwSize&AVISTDINDEX_DELTAFRAME)
- || s->strh.fccType == FCC('auds');
- s->cs[frame].fChunkHdr = false;
- s->cs[frame].orgsize = p->aIndex[k].dwSize&AVISTDINDEX_SIZEMASK;
-
- if (m_idx1) {
- s->cs[frame].filepos -= 8;
- s->cs[frame].fChunkHdr = true;
- }
-
- ++frame;
- size += s->GetChunkSize(p->aIndex[k].dwSize&AVISTDINDEX_SIZEMASK);
- }
- }
-
- s->totalsize = size;
- }
- } else if (AVIOLDINDEX* idx = m_idx1) {
- DWORD len = idx->cb / sizeof(idx->aIndex[0]);
-
- UINT64 offset = m_movis.GetHead() + 8;
-
- //detect absolute chunk addressing (TODO: read AVI specification and make it better)
- if (idx->aIndex[0].dwOffset > offset) {
- DWORD id;
- Seek(offset + idx->aIndex[0].dwOffset);
- Read(id);
- if (id != idx->aIndex[0].dwChunkId) {
- TRACE(_T("WARNING: CAviFile::Init() detected absolute chunk addressing in \'idx1\'"));
- offset = 0;
- }
- }
-
- for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
- strm_t* s = m_strms[i];
-
- // calculate the number of frames and set index size before using it
- DWORD nFrames = 0;
- for (DWORD j = 0; j < len; ++j) {
- if (TRACKNUM(idx->aIndex[j].dwChunkId) == i) {
- ++nFrames;
- }
- }
- s->cs.SetCount(nFrames);
-
- //read index
- DWORD frame = 0;
- UINT64 size = 0;
- for (DWORD j = 0; j < len; ++j) {
- DWORD TrackNumber = TRACKNUM(idx->aIndex[j].dwChunkId);
-
- if (TrackNumber == i) {
- s->cs[frame].size = size;
- s->cs[frame].filepos = offset + idx->aIndex[j].dwOffset;
- s->cs[frame].fKeyFrame = !!(idx->aIndex[j].dwFlags&AVIIF_KEYFRAME)
- || s->strh.fccType == FCC('auds') // FIXME: some audio index is without any kf flag
- || frame == 0; // grrr
- s->cs[frame].fChunkHdr = j == len-1 || idx->aIndex[j].dwOffset != idx->aIndex[j+1].dwOffset;
- s->cs[frame].orgsize = idx->aIndex[j].dwSize;
-
- ++frame;
- size += s->GetChunkSize(idx->aIndex[j].dwSize);
- }
- }
-
- s->totalsize = size;
- }
- }
-
- m_idx1.Free();
- for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
- m_strms[i]->indx.Free();
- }
-
- return S_OK;
+ EmptyIndex();
+
+ DWORD nSuperIndexes = 0;
+
+ for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
+ strm_t* s = m_strms[i];
+ if (s->indx && s->indx->nEntriesInUse > 0) {
+ ++nSuperIndexes;
+ }
+ }
+
+ if (nSuperIndexes == m_avih.dwStreams) {
+ for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
+ strm_t* s = m_strms[i];
+
+ AVISUPERINDEX* idx = (AVISUPERINDEX*)s->indx;
+
+ DWORD nEntriesInUse = 0;
+
+ for (DWORD j = 0; j < idx->nEntriesInUse; ++j) {
+ Seek(idx->aIndex[j].qwOffset);
+
+ AVISTDINDEX stdidx;
+ if (S_OK != ByteRead((BYTE*)&stdidx, FIELD_OFFSET(AVISTDINDEX, aIndex))) {
+ EmptyIndex();
+ return E_FAIL;
+ }
+
+ nEntriesInUse += stdidx.nEntriesInUse;
+ }
+
+ s->cs.SetCount(nEntriesInUse);
+
+ DWORD frame = 0;
+ UINT64 size = 0;
+
+ for (DWORD j = 0; j < idx->nEntriesInUse; ++j) {
+ Seek(idx->aIndex[j].qwOffset);
+
+ CAutoPtr<AVISTDINDEX> p((AVISTDINDEX*)DNew BYTE[idx->aIndex[j].dwSize]);
+ if (!p || S_OK != ByteRead((BYTE*)(AVISTDINDEX*)p, idx->aIndex[j].dwSize) || p->qwBaseOffset >= (DWORDLONG)GetLength()) {
+ EmptyIndex();
+ return E_FAIL;
+ }
+
+ for (DWORD k = 0; k < p->nEntriesInUse; ++k) {
+ s->cs[frame].size = size;
+ s->cs[frame].filepos = p->qwBaseOffset + p->aIndex[k].dwOffset;
+ s->cs[frame].fKeyFrame = !(p->aIndex[k].dwSize & AVISTDINDEX_DELTAFRAME)
+ || s->strh.fccType == FCC('auds');
+ s->cs[frame].fChunkHdr = false;
+ s->cs[frame].orgsize = p->aIndex[k].dwSize & AVISTDINDEX_SIZEMASK;
+
+ if (m_idx1) {
+ s->cs[frame].filepos -= 8;
+ s->cs[frame].fChunkHdr = true;
+ }
+
+ ++frame;
+ size += s->GetChunkSize(p->aIndex[k].dwSize & AVISTDINDEX_SIZEMASK);
+ }
+ }
+
+ s->totalsize = size;
+ }
+ } else if (AVIOLDINDEX* idx = m_idx1) {
+ DWORD len = idx->cb / sizeof(idx->aIndex[0]);
+
+ UINT64 offset = m_movis.GetHead() + 8;
+
+ //detect absolute chunk addressing (TODO: read AVI specification and make it better)
+ if (idx->aIndex[0].dwOffset > offset) {
+ DWORD id;
+ Seek(offset + idx->aIndex[0].dwOffset);
+ Read(id);
+ if (id != idx->aIndex[0].dwChunkId) {
+ TRACE(_T("WARNING: CAviFile::Init() detected absolute chunk addressing in \'idx1\'"));
+ offset = 0;
+ }
+ }
+
+ for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
+ strm_t* s = m_strms[i];
+
+ // calculate the number of frames and set index size before using it
+ DWORD nFrames = 0;
+ for (DWORD j = 0; j < len; ++j) {
+ if (TRACKNUM(idx->aIndex[j].dwChunkId) == i) {
+ ++nFrames;
+ }
+ }
+ s->cs.SetCount(nFrames);
+
+ //read index
+ DWORD frame = 0;
+ UINT64 size = 0;
+ for (DWORD j = 0; j < len; ++j) {
+ DWORD TrackNumber = TRACKNUM(idx->aIndex[j].dwChunkId);
+
+ if (TrackNumber == i) {
+ s->cs[frame].size = size;
+ s->cs[frame].filepos = offset + idx->aIndex[j].dwOffset;
+ s->cs[frame].fKeyFrame = !!(idx->aIndex[j].dwFlags & AVIIF_KEYFRAME)
+ || s->strh.fccType == FCC('auds') // FIXME: some audio index is without any kf flag
+ || frame == 0; // grrr
+ s->cs[frame].fChunkHdr = j == len - 1 || idx->aIndex[j].dwOffset != idx->aIndex[j + 1].dwOffset;
+ s->cs[frame].orgsize = idx->aIndex[j].dwSize;
+
+ ++frame;
+ size += s->GetChunkSize(idx->aIndex[j].dwSize);
+ }
+ }
+
+ s->totalsize = size;
+ }
+ }
+
+ m_idx1.Free();
+ for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
+ m_strms[i]->indx.Free();
+ }
+
+ return S_OK;
}
void CAviFile::EmptyIndex()
{
- for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
- strm_t* s = m_strms[i];
- s->cs.RemoveAll();
- s->totalsize = 0;
- }
+ for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
+ strm_t* s = m_strms[i];
+ s->cs.RemoveAll();
+ s->totalsize = 0;
+ }
}
bool CAviFile::IsInterleaved(bool fKeepInfo)
{
- if (m_strms.GetCount() < 2) {
- return true;
- }
- /*
- if (m_avih.dwFlags&AVIF_ISINTERLEAVED) // not reliable, nandub can write f*cked up files and still sets it
- return true;
- */
- for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
- m_strms[i]->cs2.SetCount(m_strms[i]->cs.GetCount());
- }
-
- DWORD* curchunks = DNew DWORD[m_avih.dwStreams];
- UINT64* cursizes = DNew UINT64[m_avih.dwStreams];
-
- memset(curchunks, 0, sizeof(DWORD)*m_avih.dwStreams);
- memset(cursizes, 0, sizeof(UINT64)*m_avih.dwStreams);
-
- int end = 0;
-
- for (;;) {
- UINT64 fpmin = _I64_MAX;
-
- DWORD n = (DWORD)-1;
- for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
- DWORD curchunk = curchunks[i];
- CAtlArray<strm_t::chunk>& cs = m_strms[i]->cs;
- if (curchunk >= cs.GetCount()) {
- continue;
- }
- UINT64 fp = cs[curchunk].filepos;
- if (fp < fpmin) {
- fpmin = fp;
- n = i;
- }
- }
- if (n == -1) {
- break;
- }
-
- strm_t* s = m_strms[n];
- DWORD& curchunk = curchunks[n];
- UINT64& cursize = cursizes[n];
-
- if (!s->IsRawSubtitleStream()) {
- strm_t::chunk2& cs2 = s->cs2[curchunk];
- cs2.t = (DWORD)(s->GetRefTime(curchunk, cursize)>>13); // for comparing later it is just as good as /10000 to get a near [ms] accuracy
- //cs2.t = (DWORD)(s->GetRefTime(curchunk, cursize)/10000);
- cs2.n = end++;
- }
-
- cursize = s->cs[curchunk].size;
- ++curchunk;
- }
-
- memset(curchunks, 0, sizeof(DWORD)*m_avih.dwStreams);
-
- strm_t::chunk2 cs2last = {(DWORD)-1, 0};
-
- bool fInterleaved = true;
-
- while (fInterleaved) {
- strm_t::chunk2 cs2min = {LONG_MAX, LONG_MAX};
-
- DWORD n = (DWORD)-1;
- for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
- DWORD curchunk = curchunks[i];
- if (curchunk >= m_strms[i]->cs2.GetCount()) {
- continue;
- }
- strm_t::chunk2& cs2 = m_strms[i]->cs2[curchunk];
- if (cs2.t < cs2min.t) {
- cs2min = cs2;
- n = i;
- }
- }
- if (n == -1) {
- break;
- }
-
- ++curchunks[n];
-
- if (cs2last.t != (DWORD)-1 && abs((int)cs2min.n - (int)cs2last.n) >= 1000) {
- fInterleaved = false;
- }
-
- cs2last = cs2min;
- }
-
- delete [] curchunks;
- delete [] cursizes;
-
- if (fInterleaved && !fKeepInfo) {
- // this is not needed anymore, let's save a little memory then
- for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
- m_strms[i]->cs2.RemoveAll();
- }
- }
-
- return fInterleaved;
+ if (m_strms.GetCount() < 2) {
+ return true;
+ }
+ /*
+ if (m_avih.dwFlags&AVIF_ISINTERLEAVED) // not reliable, nandub can write f*cked up files and still sets it
+ return true;
+ */
+ for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
+ m_strms[i]->cs2.SetCount(m_strms[i]->cs.GetCount());
+ }
+
+ DWORD* curchunks = DNew DWORD[m_avih.dwStreams];
+ UINT64* cursizes = DNew UINT64[m_avih.dwStreams];
+
+ memset(curchunks, 0, sizeof(DWORD)*m_avih.dwStreams);
+ memset(cursizes, 0, sizeof(UINT64)*m_avih.dwStreams);
+
+ int end = 0;
+
+ for (;;) {
+ UINT64 fpmin = _I64_MAX;
+
+ DWORD n = (DWORD) - 1;
+ for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
+ DWORD curchunk = curchunks[i];
+ CAtlArray<strm_t::chunk>& cs = m_strms[i]->cs;
+ if (curchunk >= cs.GetCount()) {
+ continue;
+ }
+ UINT64 fp = cs[curchunk].filepos;
+ if (fp < fpmin) {
+ fpmin = fp;
+ n = i;
+ }
+ }
+ if (n == -1) {
+ break;
+ }
+
+ strm_t* s = m_strms[n];
+ DWORD& curchunk = curchunks[n];
+ UINT64& cursize = cursizes[n];
+
+ if (!s->IsRawSubtitleStream()) {
+ strm_t::chunk2& cs2 = s->cs2[curchunk];
+ cs2.t = (DWORD)(s->GetRefTime(curchunk, cursize) >> 13); // for comparing later it is just as good as /10000 to get a near [ms] accuracy
+ //cs2.t = (DWORD)(s->GetRefTime(curchunk, cursize)/10000);
+ cs2.n = end++;
+ }
+
+ cursize = s->cs[curchunk].size;
+ ++curchunk;
+ }
+
+ memset(curchunks, 0, sizeof(DWORD)*m_avih.dwStreams);
+
+ strm_t::chunk2 cs2last = {(DWORD) - 1, 0};
+
+ bool fInterleaved = true;
+
+ while (fInterleaved) {
+ strm_t::chunk2 cs2min = {LONG_MAX, LONG_MAX};
+
+ DWORD n = (DWORD) - 1;
+ for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
+ DWORD curchunk = curchunks[i];
+ if (curchunk >= m_strms[i]->cs2.GetCount()) {
+ continue;
+ }
+ strm_t::chunk2& cs2 = m_strms[i]->cs2[curchunk];
+ if (cs2.t < cs2min.t) {
+ cs2min = cs2;
+ n = i;
+ }
+ }
+ if (n == -1) {
+ break;
+ }
+
+ ++curchunks[n];
+
+ if (cs2last.t != (DWORD) - 1 && abs((int)cs2min.n - (int)cs2last.n) >= 1000) {
+ fInterleaved = false;
+ }
+
+ cs2last = cs2min;
+ }
+
+ delete [] curchunks;
+ delete [] cursizes;
+
+ if (fInterleaved && !fKeepInfo) {
+ // this is not needed anymore, let's save a little memory then
+ for (DWORD i = 0; i < m_avih.dwStreams; ++i) {
+ m_strms[i]->cs2.RemoveAll();
+ }
+ }
+
+ return fInterleaved;
}
REFERENCE_TIME CAviFile::strm_t::GetRefTime(DWORD frame, UINT64 size)
{
- if (frame == 0 || strh.dwRate == 0) {
- return 0;
- }
- if (strh.fccType == FCC('auds')) {
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)strf.GetData();
- if (wfe->nBlockAlign == 0) {
- return 0;
- }
- return (REFERENCE_TIME)ceil(10000000.0 * size * strh.dwScale / (unsigned __int64(strh.dwRate) * wfe->nBlockAlign));
- // need calculate in double, because the (10000000ui64 * size * strh.dwScale) can give overflow
- // "ceil" is necessary to compensate for framenumber->reftime->framenumber conversion
- }
- return (REFERENCE_TIME)ceil(10000000.0 * frame * strh.dwScale / strh.dwRate);
- // need calculate in double, because the (10000000ui64 * frame * strh.dwScale) can give overflow (verified in practice)
- // "ceil" is necessary to compensate for framenumber->reftime->framenumber conversion
+ if (frame == 0 || strh.dwRate == 0) {
+ return 0;
+ }
+ if (strh.fccType == FCC('auds')) {
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)strf.GetData();
+ if (wfe->nBlockAlign == 0) {
+ return 0;
+ }
+ return (REFERENCE_TIME)ceil(10000000.0 * size * strh.dwScale / (unsigned __int64(strh.dwRate) * wfe->nBlockAlign));
+ // need calculate in double, because the (10000000ui64 * size * strh.dwScale) can give overflow
+ // "ceil" is necessary to compensate for framenumber->reftime->framenumber conversion
+ }
+ return (REFERENCE_TIME)ceil(10000000.0 * frame * strh.dwScale / strh.dwRate);
+ // need calculate in double, because the (10000000ui64 * frame * strh.dwScale) can give overflow (verified in practice)
+ // "ceil" is necessary to compensate for framenumber->reftime->framenumber conversion
}
DWORD CAviFile::strm_t::GetFrame(REFERENCE_TIME rt)
{
- DWORD frame;
-
- if (strh.dwScale == 0 || rt <= 0 || cs.GetCount() == 0) {
- frame = 0;
- } else if (strh.fccType == FCC('auds')) {
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)strf.GetData();
-
- UINT64 size = (UINT64)(double(rt) * wfe->nBlockAlign * strh.dwRate / (strh.dwScale * 10000000.0));
- // need calculate in double, because the (rt * wfe->nBlockAlign * strh.dwRate) can give overflow
- frame = 1;
- for (; frame < cs.GetCount(); ++frame) {
- if (cs[frame].size > size) {
- break;
- }
- }
- --frame;
- } else {
- frame = (DWORD)(double(rt) * strh.dwRate / (strh.dwScale * 10000000.0));
- // need calculate in double, because the (rt * strh.dwRate) can give overflow (verified in practice)
- if (frame >= cs.GetCount()) {
- frame = (DWORD)cs.GetCount() - 1;
- }
- }
-
- return frame;
+ DWORD frame;
+
+ if (strh.dwScale == 0 || rt <= 0 || cs.GetCount() == 0) {
+ frame = 0;
+ } else if (strh.fccType == FCC('auds')) {
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)strf.GetData();
+
+ UINT64 size = (UINT64)(double(rt) * wfe->nBlockAlign * strh.dwRate / (strh.dwScale * 10000000.0));
+ // need calculate in double, because the (rt * wfe->nBlockAlign * strh.dwRate) can give overflow
+ frame = 1;
+ for (; frame < cs.GetCount(); ++frame) {
+ if (cs[frame].size > size) {
+ break;
+ }
+ }
+ --frame;
+ } else {
+ frame = (DWORD)(double(rt) * strh.dwRate / (strh.dwScale * 10000000.0));
+ // need calculate in double, because the (rt * strh.dwRate) can give overflow (verified in practice)
+ if (frame >= cs.GetCount()) {
+ frame = (DWORD)cs.GetCount() - 1;
+ }
+ }
+
+ return frame;
}
DWORD CAviFile::strm_t::GetKeyFrame(REFERENCE_TIME rt)
{
- DWORD i = GetFrame(rt);
- for (; i > 0; i--) {
- if (cs[i].fKeyFrame) {
- break;
- }
- }
- return i;
+ DWORD i = GetFrame(rt);
+ for (; i > 0; i--) {
+ if (cs[i].fKeyFrame) {
+ break;
+ }
+ }
+ return i;
}
DWORD CAviFile::strm_t::GetChunkSize(DWORD size)
{
- if (strh.fccType == FCC('auds')) {
- WORD nBlockAlign = ((WAVEFORMATEX*)strf.GetData())->nBlockAlign;
- size = nBlockAlign ? (size + (nBlockAlign-1)) / nBlockAlign * nBlockAlign : 0; // round up for nando's vbr hack
- }
+ if (strh.fccType == FCC('auds')) {
+ WORD nBlockAlign = ((WAVEFORMATEX*)strf.GetData())->nBlockAlign;
+ size = nBlockAlign ? (size + (nBlockAlign - 1)) / nBlockAlign * nBlockAlign : 0; // round up for nando's vbr hack
+ }
- return size;
+ return size;
}
bool CAviFile::strm_t::IsRawSubtitleStream()
{
- return strn.Find("Subtitle") == 0 || strh.fccType == FCC('txts') && cs.GetCount() == 1;
+ return strn.Find("Subtitle") == 0 || strh.fccType == FCC('txts') && cs.GetCount() == 1;
}
diff --git a/src/filters/parser/AviSplitter/AviFile.h b/src/filters/parser/AviSplitter/AviFile.h
index df036811a..4f81dc793 100644
--- a/src/filters/parser/AviSplitter/AviFile.h
+++ b/src/filters/parser/AviSplitter/AviFile.h
@@ -28,63 +28,63 @@
class CAviFile : public CBaseSplitterFile
{
- HRESULT Init();
- HRESULT Parse(DWORD parentid, __int64 end);
- HRESULT BuildAMVIndex();
+ HRESULT Init();
+ HRESULT Parse(DWORD parentid, __int64 end);
+ HRESULT BuildAMVIndex();
public:
- CAviFile(IAsyncReader* pAsyncReader, HRESULT& hr);
+ CAviFile(IAsyncReader* pAsyncReader, HRESULT& hr);
- //using CBaseSplitterFile::Read;
- template<typename T>
- HRESULT Read(T& var, int offset = 0) {
- memset(&var, 0, sizeof(var));
- HRESULT hr = ByteRead((BYTE*)&var + offset, sizeof(var) - offset);
- return hr;
- }
+ //using CBaseSplitterFile::Read;
+ template<typename T>
+ HRESULT Read(T& var, int offset = 0) {
+ memset(&var, 0, sizeof(var));
+ HRESULT hr = ByteRead((BYTE*)&var + offset, sizeof(var) - offset);
+ return hr;
+ }
- AVIMAINHEADER m_avih;
- struct ODMLExtendedAVIHeader {
- DWORD dwTotalFrames;
- } m_dmlh;
- //VideoPropHeader m_vprp;
- struct strm_t {
- AVISTREAMHEADER strh;
- CAtlArray<BYTE> strf;
- CStringA strn;
- CAutoPtr<AVISUPERINDEX> indx;
- struct chunk {
- UINT64 fKeyFrame:1, fChunkHdr:1, size:62;
- UINT64 filepos;
- DWORD orgsize;
- };
- CAtlArray<chunk> cs;
- UINT64 totalsize;
- REFERENCE_TIME GetRefTime(DWORD frame, UINT64 size);
- int GetTime(DWORD frame, UINT64 size);
- DWORD GetFrame(REFERENCE_TIME rt);
- DWORD GetKeyFrame(REFERENCE_TIME rt);
- DWORD GetChunkSize(DWORD size);
- bool IsRawSubtitleStream();
+ AVIMAINHEADER m_avih;
+ struct ODMLExtendedAVIHeader {
+ DWORD dwTotalFrames;
+ } m_dmlh;
+ //VideoPropHeader m_vprp;
+ struct strm_t {
+ AVISTREAMHEADER strh;
+ CAtlArray<BYTE> strf;
+ CStringA strn;
+ CAutoPtr<AVISUPERINDEX> indx;
+ struct chunk {
+ UINT64 fKeyFrame: 1, fChunkHdr: 1, size: 62;
+ UINT64 filepos;
+ DWORD orgsize;
+ };
+ CAtlArray<chunk> cs;
+ UINT64 totalsize;
+ REFERENCE_TIME GetRefTime(DWORD frame, UINT64 size);
+ int GetTime(DWORD frame, UINT64 size);
+ DWORD GetFrame(REFERENCE_TIME rt);
+ DWORD GetKeyFrame(REFERENCE_TIME rt);
+ DWORD GetChunkSize(DWORD size);
+ bool IsRawSubtitleStream();
- // tmp
- struct chunk2 {
- DWORD t;
- DWORD n;
- };
- CAtlArray<chunk2> cs2;
- };
- CAutoPtrArray<strm_t> m_strms;
- CAtlMap<DWORD, CStringA> m_info;
- CAutoPtr<AVIOLDINDEX> m_idx1;
+ // tmp
+ struct chunk2 {
+ DWORD t;
+ DWORD n;
+ };
+ CAtlArray<chunk2> cs2;
+ };
+ CAutoPtrArray<strm_t> m_strms;
+ CAtlMap<DWORD, CStringA> m_info;
+ CAutoPtr<AVIOLDINDEX> m_idx1;
- CAtlList<UINT64> m_movis;
- bool m_isamv;
+ CAtlList<UINT64> m_movis;
+ bool m_isamv;
- REFERENCE_TIME GetTotalTime();
- HRESULT BuildIndex();
- void EmptyIndex();
- bool IsInterleaved(bool fKeepInfo = false);
+ REFERENCE_TIME GetTotalTime();
+ HRESULT BuildIndex();
+ void EmptyIndex();
+ bool IsInterleaved(bool fKeepInfo = false);
};
#define TRACKNUM(fcc) (10*((fcc&0xff)-0x30) + (((fcc>>8)&0xff)-0x30))
diff --git a/src/filters/parser/AviSplitter/AviReportWnd.cpp b/src/filters/parser/AviSplitter/AviReportWnd.cpp
index d23f397c3..e35f6701e 100644
--- a/src/filters/parser/AviSplitter/AviReportWnd.cpp
+++ b/src/filters/parser/AviSplitter/AviReportWnd.cpp
@@ -7,160 +7,160 @@
CAviReportWnd::CAviReportWnd()
{
- m_font.CreateFont(12, 0, 0, 0, 400, 0, 0, 0, 1, 0, 0, 0, 0, _T("MS Shell Dlg"));
+ m_font.CreateFont(12, 0, 0, 0, 400, 0, 0, 0, 1, 0, 0, 0, 0, _T("MS Shell Dlg"));
}
bool CAviReportWnd::DoModal(CAviFile* pAF, bool fHideChecked, bool fShowWarningText)
{
- m_nChunks = 0;
- m_rtDur = 0;
+ m_nChunks = 0;
+ m_rtDur = 0;
- for (DWORD i = 0; i < pAF->m_avih.dwStreams; ++i) {
- size_t cnt = pAF->m_strms[i]->cs2.GetCount();
- if (cnt == 0) {
- continue;
- }
- CAviFile::strm_t::chunk2& c2 = pAF->m_strms[i]->cs2[cnt-1];
- m_nChunks = max(m_nChunks, c2.n);
- m_rtDur = max(m_rtDur, (REFERENCE_TIME)c2.t<<13);
- }
+ for (DWORD i = 0; i < pAF->m_avih.dwStreams; ++i) {
+ size_t cnt = pAF->m_strms[i]->cs2.GetCount();
+ if (cnt == 0) {
+ continue;
+ }
+ CAviFile::strm_t::chunk2& c2 = pAF->m_strms[i]->cs2[cnt - 1];
+ m_nChunks = max(m_nChunks, c2.n);
+ m_rtDur = max(m_rtDur, (REFERENCE_TIME)c2.t << 13);
+ }
- CRect r, r2;
- GetDesktopWindow()->GetWindowRect(r);
- r.DeflateRect(r.Width()/4, r.Height()/4);
+ CRect r, r2;
+ GetDesktopWindow()->GetWindowRect(r);
+ r.DeflateRect(r.Width() / 4, r.Height() / 4);
- LPCTSTR wndclass = AfxRegisterWndClass(
- CS_VREDRAW|CS_HREDRAW|CS_DBLCLKS,
- AfxGetApp()->LoadStandardCursor(IDC_ARROW),
- (HBRUSH)(COLOR_BTNFACE + 1), 0);
+ LPCTSTR wndclass = AfxRegisterWndClass(
+ CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS,
+ AfxGetApp()->LoadStandardCursor(IDC_ARROW),
+ (HBRUSH)(COLOR_BTNFACE + 1), 0);
- CreateEx(0, wndclass, TITLE, WS_POPUPWINDOW|WS_CAPTION|WS_CLIPCHILDREN, r, NULL, 0);
+ CreateEx(0, wndclass, TITLE, WS_POPUPWINDOW | WS_CAPTION | WS_CLIPCHILDREN, r, NULL, 0);
- CRect cr;
- GetClientRect(cr);
- cr.DeflateRect(10, 10);
+ CRect cr;
+ GetClientRect(cr);
+ cr.DeflateRect(10, 10);
- SetFont(&m_font, FALSE);
+ SetFont(&m_font, FALSE);
- CDC* pDC = GetDC();
- CFont* pOldFont = pDC->SelectObject(&m_font);
+ CDC* pDC = GetDC();
+ CFont* pOldFont = pDC->SelectObject(&m_font);
- //
+ //
- CString str(
- _T("This AVI file was not prepared for sequential reading, the alternative ")
- _T("'Avi Splitter' will now let the default one handle it. ")
- _T("The complete reinterleaving of this file is strongly recommended before ")
- _T("burning it onto a slow media like cd-rom."));
+ CString str(
+ _T("This AVI file was not prepared for sequential reading, the alternative ")
+ _T("'Avi Splitter' will now let the default one handle it. ")
+ _T("The complete reinterleaving of this file is strongly recommended before ")
+ _T("burning it onto a slow media like cd-rom."));
- r = cr;
+ r = cr;
- pDC->DrawText(str, r, DT_WORDBREAK|DT_CALCRECT);
- r.right = cr.right;
+ pDC->DrawText(str, r, DT_WORDBREAK | DT_CALCRECT);
+ r.right = cr.right;
- m_message.Create(str, WS_CHILD|WS_VISIBLE, r, this);
- m_message.SetFont(&m_font, FALSE);
+ m_message.Create(str, WS_CHILD | WS_VISIBLE, r, this);
+ m_message.SetFont(&m_font, FALSE);
- //
+ //
- r.SetRect(cr.left, r.bottom + 10, cr.right, cr.bottom);
+ r.SetRect(cr.left, r.bottom + 10, cr.right, cr.bottom);
- str = _T("Do not show this dialog again (hold Shift to re-enable it)");
+ str = _T("Do not show this dialog again (hold Shift to re-enable it)");
- pDC->DrawText(str, r, DT_WORDBREAK|DT_CALCRECT);
- r.right = cr.right;
+ pDC->DrawText(str, r, DT_WORDBREAK | DT_CALCRECT);
+ r.right = cr.right;
- m_checkbox.Create(str, WS_CHILD|WS_VISIBLE|BS_CHECKBOX|BS_AUTOCHECKBOX, r, this, IDC_DONOTSHOWAGAINCHECK);
- m_checkbox.SetFont(&m_font, FALSE);
+ m_checkbox.Create(str, WS_CHILD | WS_VISIBLE | BS_CHECKBOX | BS_AUTOCHECKBOX, r, this, IDC_DONOTSHOWAGAINCHECK);
+ m_checkbox.SetFont(&m_font, FALSE);
- CheckDlgButton(IDC_DONOTSHOWAGAINCHECK, fHideChecked?BST_CHECKED:BST_UNCHECKED);
+ CheckDlgButton(IDC_DONOTSHOWAGAINCHECK, fHideChecked ? BST_CHECKED : BST_UNCHECKED);
- //
+ //
- if (!fShowWarningText) {
- m_message.ShowWindow(SW_HIDE);
- m_checkbox.ShowWindow(SW_HIDE);
- r = cr;
- } else {
- r.SetRect(cr.left, r.bottom + 10, cr.right, cr.bottom);
- }
+ if (!fShowWarningText) {
+ m_message.ShowWindow(SW_HIDE);
+ m_checkbox.ShowWindow(SW_HIDE);
+ r = cr;
+ } else {
+ r.SetRect(cr.left, r.bottom + 10, cr.right, cr.bottom);
+ }
- m_graph.Create(pAF, r, this);
+ m_graph.Create(pAF, r, this);
- //
+ //
- pDC->SelectObject(pOldFont);
- ReleaseDC(pDC);
+ pDC->SelectObject(pOldFont);
+ ReleaseDC(pDC);
- SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
- SetForegroundWindow();
- ShowWindow(SW_SHOWNORMAL);
+ SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
+ SetForegroundWindow();
+ ShowWindow(SW_SHOWNORMAL);
- return !!RunModalLoop();
+ return !!RunModalLoop();
}
IMPLEMENT_DYNCREATE(CAviReportWnd, CWnd)
BEGIN_MESSAGE_MAP(CAviReportWnd, CWnd)
- ON_WM_CLOSE()
- ON_WM_MOUSEMOVE()
+ ON_WM_CLOSE()
+ ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
void CAviReportWnd::OnClose()
{
- EndModalLoop(IsDlgButtonChecked(IDC_DONOTSHOWAGAINCHECK));
- __super::OnClose();
+ EndModalLoop(IsDlgButtonChecked(IDC_DONOTSHOWAGAINCHECK));
+ __super::OnClose();
}
void CAviReportWnd::OnMouseMove(UINT nFlags, CPoint p)
{
- MapWindowPoints(&m_graph, &p, 1);
-
- CRect r, r2;
- m_graph.GetClientRect(r);
- r2 = r;
- r.bottom -= GRAPHFOOTER;
- r2.top = r.bottom;
-
- if (r.PtInRect(p)) {
- SetCapture();
-
- int x = p.x - r.left;
- int y = r.bottom - p.y;
-
- REFERENCE_TIME rt = m_rtDur * x / r.Width();
- int chunk = (int)(__int64(m_nChunks) * y / r.Height());
-
- rt /= 10000;
- int ms = (int)(rt%1000);
- rt /= 1000;
- int s = (int)(rt%60);
- rt /= 60;
- int m = (int)(rt%60);
- rt /= 60;
- int h = (int)(rt);
-
- CString str;
- str.Format(_T("%s (%d - %d:%02d:%02d.%03d)"), TITLE, chunk, h, m, s, ms);
- SetWindowText(str);
- } else if (r2.PtInRect(p)) {
- SetCapture();
-
- int dist = m_graph.GetChunkDist(p.x - r2.left);
- CString str;
- str.Format(_T("%s (chunk distance: %d"), TITLE, dist);
- if (dist >= 1000) {
- str += _T(" - over the limit!");
- }
- str += ")";
- SetWindowText(str);
- } else if (GetCapture() == this) {
- SetWindowText(TITLE);
-
- ReleaseCapture();
- }
-
- __super::OnMouseMove(nFlags, p);
+ MapWindowPoints(&m_graph, &p, 1);
+
+ CRect r, r2;
+ m_graph.GetClientRect(r);
+ r2 = r;
+ r.bottom -= GRAPHFOOTER;
+ r2.top = r.bottom;
+
+ if (r.PtInRect(p)) {
+ SetCapture();
+
+ int x = p.x - r.left;
+ int y = r.bottom - p.y;
+
+ REFERENCE_TIME rt = m_rtDur * x / r.Width();
+ int chunk = (int)(__int64(m_nChunks) * y / r.Height());
+
+ rt /= 10000;
+ int ms = (int)(rt % 1000);
+ rt /= 1000;
+ int s = (int)(rt % 60);
+ rt /= 60;
+ int m = (int)(rt % 60);
+ rt /= 60;
+ int h = (int)(rt);
+
+ CString str;
+ str.Format(_T("%s (%d - %d:%02d:%02d.%03d)"), TITLE, chunk, h, m, s, ms);
+ SetWindowText(str);
+ } else if (r2.PtInRect(p)) {
+ SetCapture();
+
+ int dist = m_graph.GetChunkDist(p.x - r2.left);
+ CString str;
+ str.Format(_T("%s (chunk distance: %d"), TITLE, dist);
+ if (dist >= 1000) {
+ str += _T(" - over the limit!");
+ }
+ str += ")";
+ SetWindowText(str);
+ } else if (GetCapture() == this) {
+ SetWindowText(TITLE);
+
+ ReleaseCapture();
+ }
+
+ __super::OnMouseMove(nFlags, p);
}
//////////////
@@ -171,187 +171,187 @@ CAviPlotterWnd::CAviPlotterWnd()
bool CAviPlotterWnd::Create(CAviFile* pAF, CRect r, CWnd* pParentWnd)
{
- if (!CreateEx(WS_EX_CLIENTEDGE, _T("STATIC"), _T(""), WS_CHILD|WS_VISIBLE, r, pParentWnd, 0)) {
- return false;
- }
-
- GetClientRect(r);
- int w = r.Width();
- int h = r.Height() - GRAPHFOOTER;
-
- CDC* pDC = GetDC();
- m_dc.CreateCompatibleDC(pDC);
- m_bm.CreateCompatibleBitmap(pDC, r.Width(), r.Height());
- ReleaseDC(pDC);
-
- CBitmap* pOldBitmap = m_dc.SelectObject(&m_bm);
-
- m_dc.FillSolidRect(r, 0);
-
- {
- CPen pen(PS_DOT, 1, 0x008000);
- CPen* pOldPen = m_dc.SelectObject(&pen);
- for (int y = 0, dy = max(h/10,1); y < h; y += dy) {
- if (y == 0) {
- continue;
- }
- m_dc.MoveTo(0, y);
- m_dc.LineTo(w, y);
- }
- for (int x = 0, dx = max(w/10,1); x < w; x += dx) {
- if (x == 0) {
- continue;
- }
- m_dc.MoveTo(x, 0);
- m_dc.LineTo(x, w);
- }
- m_dc.SelectObject(pOldPen);
- }
-
- {
- CPen pen(PS_SOLID, 1, 0x00ff00);
- CPen* pOldPen = m_dc.SelectObject(&pen);
- m_dc.MoveTo(15, 30);
- m_dc.LineTo(15, 2);
- m_dc.LineTo(19, 10);
- m_dc.LineTo(11, 10);
- m_dc.LineTo(15, 2);
- m_dc.MoveTo(w-30-10, h-15);
- m_dc.LineTo(w-2-10, h-15);
- m_dc.LineTo(w-10-10, h-19);
- m_dc.LineTo(w-10-10, h-11);
- m_dc.LineTo(w-2-10, h-15);
- m_dc.SelectObject(pOldPen);
-
- m_dc.SetTextColor(0x008000);
- m_dc.TextOut(20, 10, _T("Chunk"));
-
- CSize size = m_dc.GetTextExtent(_T("Time"));
- m_dc.TextOut(w - size.cx - 10, h - size.cy - 20, _T("Time"));
- }
-
- COLORREF clr[] = {0x0000ff,0xff0000,0x40ffff,0xff40ff,0xffff40,0xffffff};
-
- for (DWORD i = 0, y = 40, dy = m_dc.GetTextExtent(_T("Stream N")).cy + 1; i < pAF->m_avih.dwStreams; ++i, y += dy) {
- m_dc.SetTextColor(clr[i % pAF->m_avih.dwStreams]);
- m_dc.SetBkMode(TRANSPARENT);
- CString str;
- str.Format(_T("Stream %u"), i);
- m_dc.TextOut(10, y, str);
- }
-
- DWORD nmax = 0, tmax = 0;
-
- for (DWORD i = 0; i < pAF->m_avih.dwStreams; ++i) {
- size_t cnt = pAF->m_strms[i]->cs2.GetCount();
- if (cnt == 0) {
- continue;
- }
- CAviFile::strm_t::chunk2& c2 = pAF->m_strms[i]->cs2[cnt-1];
- nmax = max(nmax, c2.n);
- tmax = max(tmax, c2.t);
- }
-
- if (nmax > 0 && tmax > 0) {
- CAtlArray<CPen> pen;
- pen.SetCount(pAF->m_avih.dwStreams);
- for (size_t i = 0; i < pen.GetCount(); ++i) {
- pen[i].CreatePen(PS_SOLID, 2, clr[i]);
- }
-
- CAtlArray<CPoint> pp;
- pp.SetCount(pAF->m_avih.dwStreams);
- for (size_t i = 0; i < pen.GetCount(); ++i) {
- pp[i].SetPoint(-1, -1);
- }
-
- m_chunkdist.SetCount(w);
- memset(m_chunkdist.GetData(), 0, sizeof(int)*w);
-
- DWORD* curchunks = DNew DWORD[pAF->m_avih.dwStreams];
- memset(curchunks, 0, sizeof(DWORD)*pAF->m_avih.dwStreams);
-
- CAviFile::strm_t::chunk2 cs2last = {(DWORD)-1, 0};
-
- for (;;) {
- CAviFile::strm_t::chunk2 cs2min = {LONG_MAX, LONG_MAX};
-
- DWORD n = (DWORD)-1;
- for (DWORD i = 0; i < pAF->m_avih.dwStreams; ++i) {
- DWORD curchunk = curchunks[i];
- if (curchunk >= pAF->m_strms[i]->cs2.GetCount()) {
- continue;
- }
- CAviFile::strm_t::chunk2& cs2 = pAF->m_strms[i]->cs2[curchunk];
- if (cs2.t < cs2min.t) {
- cs2min = cs2;
- n = i;
- }
- }
- if (n == -1) {
- break;
- }
-
-
- CPoint p;
- p.x = (int)(1.0 * w * cs2min.t / tmax);
- p.y = (int)(h - 1.0 * h * cs2min.n / nmax);
- if (pp[n] != p) {
- CPen* pOldPen = m_dc.SelectObject(&pen[n]);
- if (pp[n] == CPoint(-1, -1)) {
- m_dc.MoveTo(p);
- } else {
- m_dc.MoveTo(pp[n]);
- m_dc.LineTo(p);
- }
- m_dc.SelectObject(pOldPen);
- pp[n] = p;
- }
-
- int dist = abs((int)cs2min.n - (int)cs2last.n);
-
- if (cs2last.t != (DWORD)-1 /*&& dist >= 1000*/) {
- if (p.x >= 0 && p.x < w) {
- m_chunkdist[p.x] = max(m_chunkdist[p.x], dist);
- }
- }
-
- ++curchunks[n];
- cs2last = cs2min;
- }
-
- CPen red(PS_SOLID, 1, 0x0000ff);
- CPen green(PS_SOLID, 1, 0x00ff00);
-
- for (int x = 0; x < w; ++x) {
- CPen* pOldPen = m_dc.SelectObject(m_chunkdist[x] >= 1000 ? &red : &green);
- m_dc.MoveTo(x, h);
- m_dc.LineTo(x, h + GRAPHFOOTER);
- m_dc.SelectObject(pOldPen);
- }
-
- delete [] curchunks;
- }
-
- m_dc.SelectObject(pOldBitmap);
-
- return true;
+ if (!CreateEx(WS_EX_CLIENTEDGE, _T("STATIC"), _T(""), WS_CHILD | WS_VISIBLE, r, pParentWnd, 0)) {
+ return false;
+ }
+
+ GetClientRect(r);
+ int w = r.Width();
+ int h = r.Height() - GRAPHFOOTER;
+
+ CDC* pDC = GetDC();
+ m_dc.CreateCompatibleDC(pDC);
+ m_bm.CreateCompatibleBitmap(pDC, r.Width(), r.Height());
+ ReleaseDC(pDC);
+
+ CBitmap* pOldBitmap = m_dc.SelectObject(&m_bm);
+
+ m_dc.FillSolidRect(r, 0);
+
+ {
+ CPen pen(PS_DOT, 1, 0x008000);
+ CPen* pOldPen = m_dc.SelectObject(&pen);
+ for (int y = 0, dy = max(h / 10, 1); y < h; y += dy) {
+ if (y == 0) {
+ continue;
+ }
+ m_dc.MoveTo(0, y);
+ m_dc.LineTo(w, y);
+ }
+ for (int x = 0, dx = max(w / 10, 1); x < w; x += dx) {
+ if (x == 0) {
+ continue;
+ }
+ m_dc.MoveTo(x, 0);
+ m_dc.LineTo(x, w);
+ }
+ m_dc.SelectObject(pOldPen);
+ }
+
+ {
+ CPen pen(PS_SOLID, 1, 0x00ff00);
+ CPen* pOldPen = m_dc.SelectObject(&pen);
+ m_dc.MoveTo(15, 30);
+ m_dc.LineTo(15, 2);
+ m_dc.LineTo(19, 10);
+ m_dc.LineTo(11, 10);
+ m_dc.LineTo(15, 2);
+ m_dc.MoveTo(w - 30 - 10, h - 15);
+ m_dc.LineTo(w - 2 - 10, h - 15);
+ m_dc.LineTo(w - 10 - 10, h - 19);
+ m_dc.LineTo(w - 10 - 10, h - 11);
+ m_dc.LineTo(w - 2 - 10, h - 15);
+ m_dc.SelectObject(pOldPen);
+
+ m_dc.SetTextColor(0x008000);
+ m_dc.TextOut(20, 10, _T("Chunk"));
+
+ CSize size = m_dc.GetTextExtent(_T("Time"));
+ m_dc.TextOut(w - size.cx - 10, h - size.cy - 20, _T("Time"));
+ }
+
+ COLORREF clr[] = {0x0000ff, 0xff0000, 0x40ffff, 0xff40ff, 0xffff40, 0xffffff};
+
+ for (DWORD i = 0, y = 40, dy = m_dc.GetTextExtent(_T("Stream N")).cy + 1; i < pAF->m_avih.dwStreams; ++i, y += dy) {
+ m_dc.SetTextColor(clr[i % pAF->m_avih.dwStreams]);
+ m_dc.SetBkMode(TRANSPARENT);
+ CString str;
+ str.Format(_T("Stream %u"), i);
+ m_dc.TextOut(10, y, str);
+ }
+
+ DWORD nmax = 0, tmax = 0;
+
+ for (DWORD i = 0; i < pAF->m_avih.dwStreams; ++i) {
+ size_t cnt = pAF->m_strms[i]->cs2.GetCount();
+ if (cnt == 0) {
+ continue;
+ }
+ CAviFile::strm_t::chunk2& c2 = pAF->m_strms[i]->cs2[cnt - 1];
+ nmax = max(nmax, c2.n);
+ tmax = max(tmax, c2.t);
+ }
+
+ if (nmax > 0 && tmax > 0) {
+ CAtlArray<CPen> pen;
+ pen.SetCount(pAF->m_avih.dwStreams);
+ for (size_t i = 0; i < pen.GetCount(); ++i) {
+ pen[i].CreatePen(PS_SOLID, 2, clr[i]);
+ }
+
+ CAtlArray<CPoint> pp;
+ pp.SetCount(pAF->m_avih.dwStreams);
+ for (size_t i = 0; i < pen.GetCount(); ++i) {
+ pp[i].SetPoint(-1, -1);
+ }
+
+ m_chunkdist.SetCount(w);
+ memset(m_chunkdist.GetData(), 0, sizeof(int)*w);
+
+ DWORD* curchunks = DNew DWORD[pAF->m_avih.dwStreams];
+ memset(curchunks, 0, sizeof(DWORD)*pAF->m_avih.dwStreams);
+
+ CAviFile::strm_t::chunk2 cs2last = {(DWORD) - 1, 0};
+
+ for (;;) {
+ CAviFile::strm_t::chunk2 cs2min = {LONG_MAX, LONG_MAX};
+
+ DWORD n = (DWORD) - 1;
+ for (DWORD i = 0; i < pAF->m_avih.dwStreams; ++i) {
+ DWORD curchunk = curchunks[i];
+ if (curchunk >= pAF->m_strms[i]->cs2.GetCount()) {
+ continue;
+ }
+ CAviFile::strm_t::chunk2& cs2 = pAF->m_strms[i]->cs2[curchunk];
+ if (cs2.t < cs2min.t) {
+ cs2min = cs2;
+ n = i;
+ }
+ }
+ if (n == -1) {
+ break;
+ }
+
+
+ CPoint p;
+ p.x = (int)(1.0 * w * cs2min.t / tmax);
+ p.y = (int)(h - 1.0 * h * cs2min.n / nmax);
+ if (pp[n] != p) {
+ CPen* pOldPen = m_dc.SelectObject(&pen[n]);
+ if (pp[n] == CPoint(-1, -1)) {
+ m_dc.MoveTo(p);
+ } else {
+ m_dc.MoveTo(pp[n]);
+ m_dc.LineTo(p);
+ }
+ m_dc.SelectObject(pOldPen);
+ pp[n] = p;
+ }
+
+ int dist = abs((int)cs2min.n - (int)cs2last.n);
+
+ if (cs2last.t != (DWORD) - 1 /*&& dist >= 1000*/) {
+ if (p.x >= 0 && p.x < w) {
+ m_chunkdist[p.x] = max(m_chunkdist[p.x], dist);
+ }
+ }
+
+ ++curchunks[n];
+ cs2last = cs2min;
+ }
+
+ CPen red(PS_SOLID, 1, 0x0000ff);
+ CPen green(PS_SOLID, 1, 0x00ff00);
+
+ for (int x = 0; x < w; ++x) {
+ CPen* pOldPen = m_dc.SelectObject(m_chunkdist[x] >= 1000 ? &red : &green);
+ m_dc.MoveTo(x, h);
+ m_dc.LineTo(x, h + GRAPHFOOTER);
+ m_dc.SelectObject(pOldPen);
+ }
+
+ delete [] curchunks;
+ }
+
+ m_dc.SelectObject(pOldBitmap);
+
+ return true;
}
IMPLEMENT_DYNCREATE(CAviPlotterWnd, CWnd)
BEGIN_MESSAGE_MAP(CAviPlotterWnd, CWnd)
- ON_WM_PAINT()
+ ON_WM_PAINT()
END_MESSAGE_MAP()
void CAviPlotterWnd::OnPaint()
{
- CPaintDC dc(this); // device context for painting
+ CPaintDC dc(this); // device context for painting
- CRect r;
- GetClientRect(r);
+ CRect r;
+ GetClientRect(r);
- CBitmap* pOld = m_dc.SelectObject(&m_bm);
- dc.BitBlt(0, 0, r.Width(), r.Height(), &m_dc, 0, 0, SRCCOPY);
- m_dc.SelectObject(pOld);
+ CBitmap* pOld = m_dc.SelectObject(&m_bm);
+ dc.BitBlt(0, 0, r.Width(), r.Height(), &m_dc, 0, 0, SRCCOPY);
+ m_dc.SelectObject(pOld);
}
diff --git a/src/filters/parser/AviSplitter/AviReportWnd.h b/src/filters/parser/AviSplitter/AviReportWnd.h
index 3813a1852..4db738f6e 100644
--- a/src/filters/parser/AviSplitter/AviReportWnd.h
+++ b/src/filters/parser/AviSplitter/AviReportWnd.h
@@ -4,44 +4,44 @@
class CAviPlotterWnd : public CStatic
{
- DECLARE_DYNCREATE(CAviPlotterWnd)
+ DECLARE_DYNCREATE(CAviPlotterWnd)
private:
- CDC m_dc;
- CBitmap m_bm;
+ CDC m_dc;
+ CBitmap m_bm;
- CAtlArray<int> m_chunkdist;
+ CAtlArray<int> m_chunkdist;
public:
- CAviPlotterWnd();
- bool Create(CAviFile* pAF, CRect r, CWnd* pParentWnd);
+ CAviPlotterWnd();
+ bool Create(CAviFile* pAF, CRect r, CWnd* pParentWnd);
- int GetChunkDist(int x) {
- return (x >= 0 && (size_t)x < m_chunkdist.GetCount()) ? m_chunkdist[x] : 0;
- }
+ int GetChunkDist(int x) {
+ return (x >= 0 && (size_t)x < m_chunkdist.GetCount()) ? m_chunkdist[x] : 0;
+ }
- DECLARE_MESSAGE_MAP()
- afx_msg void OnPaint();
+ DECLARE_MESSAGE_MAP()
+ afx_msg void OnPaint();
};
class CAviReportWnd : public CWnd
{
- DECLARE_DYNCREATE(CAviReportWnd)
+ DECLARE_DYNCREATE(CAviReportWnd)
protected:
- CFont m_font;
- CStatic m_message;
- CButton m_checkbox;
- CAviPlotterWnd m_graph;
+ CFont m_font;
+ CStatic m_message;
+ CButton m_checkbox;
+ CAviPlotterWnd m_graph;
- unsigned int m_nChunks;
- REFERENCE_TIME m_rtDur;
+ unsigned int m_nChunks;
+ REFERENCE_TIME m_rtDur;
public:
- CAviReportWnd();
- bool DoModal(CAviFile* pAF, bool fHideChecked, bool fShowWarningText);
+ CAviReportWnd();
+ bool DoModal(CAviFile* pAF, bool fHideChecked, bool fShowWarningText);
- DECLARE_MESSAGE_MAP()
- afx_msg void OnClose();
- afx_msg void OnMouseMove(UINT nFlags, CPoint point);
+ DECLARE_MESSAGE_MAP()
+ afx_msg void OnClose();
+ afx_msg void OnMouseMove(UINT nFlags, CPoint point);
};
diff --git a/src/filters/parser/AviSplitter/AviSplitter.cpp b/src/filters/parser/AviSplitter/AviSplitter.cpp
index f43a246b5..13fa02aa7 100644
--- a/src/filters/parser/AviSplitter/AviSplitter.cpp
+++ b/src/filters/parser/AviSplitter/AviSplitter.cpp
@@ -27,53 +27,53 @@
#include "AviReportWnd.h"
#include "AviSplitter.h"
-#define MAXPACKETS_AVI MAXPACKETS*10
+#define MAXPACKETS_AVI MAXPACKETS*10
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_Avi},
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_Avi},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CAviSplitterFilter), AviSplitterName, MERIT_NORMAL+1, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CAviSourceFilter), AviSourceName, MERIT_NORMAL+1, 0, NULL, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CAviSplitterFilter), AviSplitterName, MERIT_NORMAL + 1, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CAviSourceFilter), AviSourceName, MERIT_NORMAL + 1, 0, NULL, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CAviSplitterFilter>, NULL, &sudFilter[0]},
- {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CAviSourceFilter>, NULL, &sudFilter[1]},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CAviSplitterFilter>, NULL, &sudFilter[0]},
+ {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CAviSourceFilter>, NULL, &sudFilter[1]},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- CAtlList<CString> chkbytes;
- chkbytes.AddTail(_T("0,4,,52494646,8,4,,41564920")); // 'RIFF' ... 'AVI '
- chkbytes.AddTail(_T("0,4,,52494646,8,4,,41564958")); // 'RIFF' ... 'AVIX'
- chkbytes.AddTail(_T("0,4,,52494646,8,4,,414D5620")); // 'RIFF' ... 'AMV '
-
- RegisterSourceFilter(
- CLSID_AsyncReader,
- MEDIASUBTYPE_Avi,
- chkbytes,
- _T(".avi"), _T(".divx"), _T(".vp6"), _T(".amv"), NULL);
-
- return AMovieDllRegisterServer2(TRUE);
+ CAtlList<CString> chkbytes;
+ chkbytes.AddTail(_T("0,4,,52494646,8,4,,41564920")); // 'RIFF' ... 'AVI '
+ chkbytes.AddTail(_T("0,4,,52494646,8,4,,41564958")); // 'RIFF' ... 'AVIX'
+ chkbytes.AddTail(_T("0,4,,52494646,8,4,,414D5620")); // 'RIFF' ... 'AMV '
+
+ RegisterSourceFilter(
+ CLSID_AsyncReader,
+ MEDIASUBTYPE_Avi,
+ chkbytes,
+ _T(".avi"), _T(".divx"), _T(".vp6"), _T(".amv"), NULL);
+
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- //UnRegisterSourceFilter(MEDIASUBTYPE_Avi);
+ //UnRegisterSourceFilter(MEDIASUBTYPE_Avi);
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
@@ -81,26 +81,26 @@ extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
class CAviSplitterApp : public CWinApp
{
public:
- CAviSplitterApp() {}
-
- BOOL InitInstance() {
- if (!__super::InitInstance()) {
- return FALSE;
- }
- DllEntryPoint(m_hInstance, DLL_PROCESS_ATTACH, 0);
- return TRUE;
- }
-
- BOOL ExitInstance() {
- DllEntryPoint(m_hInstance, DLL_PROCESS_DETACH, 0);
- return __super::ExitInstance();
- }
-
- void SetDefaultRegistryKey() {
- SetRegistryKey(_T("Gabest"));
- }
-
- DECLARE_MESSAGE_MAP()
+ CAviSplitterApp() {}
+
+ BOOL InitInstance() {
+ if (!__super::InitInstance()) {
+ return FALSE;
+ }
+ DllEntryPoint(m_hInstance, DLL_PROCESS_ATTACH, 0);
+ return TRUE;
+ }
+
+ BOOL ExitInstance() {
+ DllEntryPoint(m_hInstance, DLL_PROCESS_DETACH, 0);
+ return __super::ExitInstance();
+ }
+
+ void SetDefaultRegistryKey() {
+ SetRegistryKey(_T("Gabest"));
+ }
+
+ DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CAviSplitterApp, CWinApp)
@@ -115,786 +115,786 @@ CAviSplitterApp theApp;
//
CAviSplitterFilter::CAviSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CBaseSplitterFilter(NAME("CAviSplitterFilter"), pUnk, phr, __uuidof(this), MAXPACKETS_AVI)
- , m_timeformat(TIME_FORMAT_MEDIA_TIME)
- , m_maxTimeStamp(Packet::INVALID_TIME)
+ : CBaseSplitterFilter(NAME("CAviSplitterFilter"), pUnk, phr, __uuidof(this), MAXPACKETS_AVI)
+ , m_timeformat(TIME_FORMAT_MEDIA_TIME)
+ , m_maxTimeStamp(Packet::INVALID_TIME)
{
}
STDMETHODIMP CAviSplitterFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- *ppv = NULL;
+ *ppv = NULL;
- return
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
STDMETHODIMP CAviSplitterFilter::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
-
- if (m_pName && m_pName[0]==L'M' && m_pName[1]==L'P' && m_pName[2]==L'C') {
- (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
- } else {
- wcscpy_s(pInfo->achName, AviSourceName);
- }
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+
+ if (m_pName && m_pName[0] == L'M' && m_pName[1] == L'P' && m_pName[2] == L'C') {
+ (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
+ } else {
+ wcscpy_s(pInfo->achName, AviSourceName);
+ }
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
HRESULT CAviSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
{
- CheckPointer(pAsyncReader, E_POINTER);
+ CheckPointer(pAsyncReader, E_POINTER);
- HRESULT hr = E_FAIL;
+ HRESULT hr = E_FAIL;
- m_pFile.Free();
- m_tFrame.Free();
+ m_pFile.Free();
+ m_tFrame.Free();
- m_pFile.Attach(DNew CAviFile(pAsyncReader, hr));
- if (!m_pFile) {
- return E_OUTOFMEMORY;
- }
+ m_pFile.Attach(DNew CAviFile(pAsyncReader, hr));
+ if (!m_pFile) {
+ return E_OUTOFMEMORY;
+ }
- bool fShiftDown = !!(::GetKeyState(VK_SHIFT)&0x8000);
- bool fShowWarningText = !m_pFile->IsInterleaved(fShiftDown);
+ bool fShiftDown = !!(::GetKeyState(VK_SHIFT) & 0x8000);
+ bool fShowWarningText = !m_pFile->IsInterleaved(fShiftDown);
- if (SUCCEEDED(hr) && (fShowWarningText || fShiftDown)) {
+ if (SUCCEEDED(hr) && (fShowWarningText || fShiftDown)) {
#ifdef REGISTER_FILTER
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
#endif
- bool fHideWarning = !!AfxGetApp()->GetProfileInt(_T("Settings"), _T("HideAviSplitterWarning"), 0);
-
- if (!fHideWarning && !dynamic_cast<CAviSourceFilter*>(this) || fShiftDown) {
- CAviReportWnd wnd;
- fHideWarning = wnd.DoModal(m_pFile, fHideWarning, fShowWarningText);
- AfxGetApp()->WriteProfileInt(_T("Settings"), _T("HideAviSplitterWarning"), fHideWarning);
- }
-
- if (fShowWarningText) {
- hr = E_FAIL;
- }
- }
-
- if (FAILED(hr)) {
- m_pFile.Free();
- return hr;
- }
-
- m_rtNewStart = m_rtCurrent = 0;
- m_rtNewStop = m_rtStop = m_rtDuration = m_pFile->GetTotalTime();
-
- bool fHasIndex = false;
-
- for (unsigned int i = 0; !fHasIndex && i < m_pFile->m_strms.GetCount(); ++i)
- if (m_pFile->m_strms[i]->cs.GetCount() > 0) {
- fHasIndex = true;
- }
-
- for (unsigned int i = 0; i < m_pFile->m_strms.GetCount(); ++i) {
- CAviFile::strm_t* s = m_pFile->m_strms[i];
-
- if (fHasIndex && s->cs.GetCount() == 0) {
- continue;
- }
-
- CMediaType mt;
- CAtlArray<CMediaType> mts;
-
- CStringW name, label;
-
- if (s->strh.fccType == FCC('vids')) {
- label = L"Video";
-
- ASSERT(s->strf.GetCount() >= sizeof(BITMAPINFOHEADER));
-
- BITMAPINFOHEADER* pbmi = &((BITMAPINFO*)s->strf.GetData())->bmiHeader;
-
- mt.majortype = MEDIATYPE_Video;
- switch (pbmi->biCompression) {
- case BI_RGB:
- case BI_BITFIELDS:
- mt.subtype =
- pbmi->biBitCount == 1 ? MEDIASUBTYPE_RGB1 :
- pbmi->biBitCount == 4 ? MEDIASUBTYPE_RGB4 :
- pbmi->biBitCount == 8 ? MEDIASUBTYPE_RGB8 :
- pbmi->biBitCount == 16 ? MEDIASUBTYPE_RGB565 :
- pbmi->biBitCount == 24 ? MEDIASUBTYPE_RGB24 :
- pbmi->biBitCount == 32 ? MEDIASUBTYPE_ARGB32 :
- MEDIASUBTYPE_NULL;
- break;
- //case BI_RLE8: mt.subtype = MEDIASUBTYPE_RGB8; break;
- //case BI_RLE4: mt.subtype = MEDIASUBTYPE_RGB4; break;
- case FCC('AVRn')://uncommon fourcc
- case FCC('JPGL')://uncommon fourcc
- mt.subtype = MEDIASUBTYPE_MJPG;
- break;
- case FCC('MPG2'):
- mt.subtype = MEDIASUBTYPE_MPEG2_VIDEO;
- break;
- default:
- mt.subtype = FOURCCMap(pbmi->biCompression);
- }
- mt.formattype = FORMAT_VideoInfo;
- VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + (ULONG)s->strf.GetCount() - sizeof(BITMAPINFOHEADER));
- memset(mt.Format(), 0, mt.FormatLength());
- memcpy(&pvih->bmiHeader, s->strf.GetData(), s->strf.GetCount());
- if (s->strh.dwRate > 0) {
- pvih->AvgTimePerFrame = 10000000ui64 * s->strh.dwScale / s->strh.dwRate;
- }
-
- if (s->cs.GetCount() && pvih->AvgTimePerFrame > 0) {
- UINT64 size = 0;
- for (unsigned int i = 0; i < s->cs.GetCount(); ++i) {
- size += s->cs[i].orgsize;
- }
- pvih->dwBitRate = (DWORD)(10000000.0 * size * 8 / (s->cs.GetCount() * pvih->AvgTimePerFrame) + 0.5);
- // need calculate in double, because the (10000000ui64 * size * 8) can give overflow
- }
-
- mt.SetSampleSize(s->strh.dwSuggestedBufferSize > 0
- ? s->strh.dwSuggestedBufferSize*3/2
- : (pvih->bmiHeader.biWidth*pvih->bmiHeader.biHeight*4));
- mts.Add(mt);
- } else if (s->strh.fccType == FCC('auds') || s->strh.fccType == FCC('amva')) {
- label = L"Audio";
-
- ASSERT(s->strf.GetCount() >= sizeof(WAVEFORMATEX)
- || s->strf.GetCount() == sizeof(PCMWAVEFORMAT));
-
- WAVEFORMATEX* pwfe = (WAVEFORMATEX*)s->strf.GetData();
-
- if (pwfe->nBlockAlign == 0) {
- continue;
- }
-
- mt.majortype = MEDIATYPE_Audio;
- if (m_pFile->m_isamv) {
- mt.subtype = FOURCCMap(MAKEFOURCC('A','M','V','A'));
- } else {
- mt.subtype = FOURCCMap(pwfe->wFormatTag);
- }
- mt.formattype = FORMAT_WaveFormatEx;
- mt.SetFormat(s->strf.GetData(), max((ULONG)s->strf.GetCount(), sizeof(WAVEFORMATEX)));
- pwfe = (WAVEFORMATEX*)mt.Format();
- if (s->strf.GetCount() == sizeof(PCMWAVEFORMAT)) {
- pwfe->cbSize = 0;
- }
- if (pwfe->wFormatTag == WAVE_FORMAT_PCM) {
- pwfe->nBlockAlign = pwfe->nChannels*pwfe->wBitsPerSample>>3;
- }
- if (pwfe->wFormatTag == WAVE_FORMAT_EXTENSIBLE) {
- mt.subtype = FOURCCMap(WAVE_FORMAT_PCM); // audio renderer doesn't accept fffe in the subtype
- }
- mt.SetSampleSize(s->strh.dwSuggestedBufferSize > 0
- ? s->strh.dwSuggestedBufferSize*3/2
- : (pwfe->nChannels*pwfe->nSamplesPerSec*32>>3));
- mts.Add(mt);
- } else if (s->strh.fccType == FCC('mids')) {
- label = L"Midi";
-
- mt.majortype = MEDIATYPE_Midi;
- mt.subtype = MEDIASUBTYPE_NULL;
- mt.formattype = FORMAT_None;
- mt.SetSampleSize(s->strh.dwSuggestedBufferSize > 0
- ? s->strh.dwSuggestedBufferSize*3/2
- : (1024*1024));
- mts.Add(mt);
- } else if (s->strh.fccType == FCC('txts')) {
- label = L"Text";
-
- mt.majortype = MEDIATYPE_Text;
- mt.subtype = MEDIASUBTYPE_NULL;
- mt.formattype = FORMAT_None;
- mt.SetSampleSize(s->strh.dwSuggestedBufferSize > 0
- ? s->strh.dwSuggestedBufferSize*3/2
- : (1024*1024));
- mts.Add(mt);
- } else if (s->strh.fccType == FCC('iavs')) {
- label = L"Interleaved";
-
- ASSERT(s->strh.fccHandler == FCC('dvsd'));
-
- mt.majortype = MEDIATYPE_Interleaved;
- mt.subtype = FOURCCMap(s->strh.fccHandler);
- mt.formattype = FORMAT_DvInfo;
- mt.SetFormat(s->strf.GetData(), max((ULONG)s->strf.GetCount(), sizeof(DVINFO)));
- mt.SetSampleSize(s->strh.dwSuggestedBufferSize > 0
- ? s->strh.dwSuggestedBufferSize*3/2
- : (1024*1024));
- mts.Add(mt);
- }
-
- if (mts.IsEmpty()) {
- TRACE(_T("CAviSourceFilter: Unsupported stream (%d)\n"), i);
- continue;
- }
-
- //Put filename at front sometime(eg. ~temp.avi) will cause filter graph
- //stop check this pin. Not sure the reason exactly. but it happens.
- //If you know why, please emailto: tomasen@gmail.com
- if (s->strn.IsEmpty()) {
- name.Format(L"%s %u", label, i);
- } else {
- name.Format(L"%s (%s %u)", CStringW(s->strn), label, i);
- }
-
- HRESULT hr;
-
- CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CAviSplitterOutputPin(mts, name, this, this, &hr));
- AddOutputPin(i, pPinOut);
- }
-
- POSITION pos = m_pFile->m_info.GetStartPosition();
- while (pos) {
- DWORD fcc;
- CStringA value;
- m_pFile->m_info.GetNextAssoc(pos, fcc, value);
-
- switch (fcc) {
- case FCC('INAM'):
- SetProperty(L"TITL", CStringW(value));
- break;
- case FCC('IART'):
- SetProperty(L"AUTH", CStringW(value));
- break;
- case FCC('ICOP'):
- SetProperty(L"CPYR", CStringW(value));
- break;
- case FCC('ISBJ'):
- SetProperty(L"DESC", CStringW(value));
- break;
- }
- }
-
- m_tFrame.Attach(DNew DWORD[m_pFile->m_avih.dwStreams]);
-
- return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
+ bool fHideWarning = !!AfxGetApp()->GetProfileInt(_T("Settings"), _T("HideAviSplitterWarning"), 0);
+
+ if (!fHideWarning && !dynamic_cast<CAviSourceFilter*>(this) || fShiftDown) {
+ CAviReportWnd wnd;
+ fHideWarning = wnd.DoModal(m_pFile, fHideWarning, fShowWarningText);
+ AfxGetApp()->WriteProfileInt(_T("Settings"), _T("HideAviSplitterWarning"), fHideWarning);
+ }
+
+ if (fShowWarningText) {
+ hr = E_FAIL;
+ }
+ }
+
+ if (FAILED(hr)) {
+ m_pFile.Free();
+ return hr;
+ }
+
+ m_rtNewStart = m_rtCurrent = 0;
+ m_rtNewStop = m_rtStop = m_rtDuration = m_pFile->GetTotalTime();
+
+ bool fHasIndex = false;
+
+ for (unsigned int i = 0; !fHasIndex && i < m_pFile->m_strms.GetCount(); ++i)
+ if (m_pFile->m_strms[i]->cs.GetCount() > 0) {
+ fHasIndex = true;
+ }
+
+ for (unsigned int i = 0; i < m_pFile->m_strms.GetCount(); ++i) {
+ CAviFile::strm_t* s = m_pFile->m_strms[i];
+
+ if (fHasIndex && s->cs.GetCount() == 0) {
+ continue;
+ }
+
+ CMediaType mt;
+ CAtlArray<CMediaType> mts;
+
+ CStringW name, label;
+
+ if (s->strh.fccType == FCC('vids')) {
+ label = L"Video";
+
+ ASSERT(s->strf.GetCount() >= sizeof(BITMAPINFOHEADER));
+
+ BITMAPINFOHEADER* pbmi = &((BITMAPINFO*)s->strf.GetData())->bmiHeader;
+
+ mt.majortype = MEDIATYPE_Video;
+ switch (pbmi->biCompression) {
+ case BI_RGB:
+ case BI_BITFIELDS:
+ mt.subtype =
+ pbmi->biBitCount == 1 ? MEDIASUBTYPE_RGB1 :
+ pbmi->biBitCount == 4 ? MEDIASUBTYPE_RGB4 :
+ pbmi->biBitCount == 8 ? MEDIASUBTYPE_RGB8 :
+ pbmi->biBitCount == 16 ? MEDIASUBTYPE_RGB565 :
+ pbmi->biBitCount == 24 ? MEDIASUBTYPE_RGB24 :
+ pbmi->biBitCount == 32 ? MEDIASUBTYPE_ARGB32 :
+ MEDIASUBTYPE_NULL;
+ break;
+ //case BI_RLE8: mt.subtype = MEDIASUBTYPE_RGB8; break;
+ //case BI_RLE4: mt.subtype = MEDIASUBTYPE_RGB4; break;
+ case FCC('AVRn')://uncommon fourcc
+ case FCC('JPGL')://uncommon fourcc
+ mt.subtype = MEDIASUBTYPE_MJPG;
+ break;
+ case FCC('MPG2'):
+ mt.subtype = MEDIASUBTYPE_MPEG2_VIDEO;
+ break;
+ default:
+ mt.subtype = FOURCCMap(pbmi->biCompression);
+ }
+ mt.formattype = FORMAT_VideoInfo;
+ VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + (ULONG)s->strf.GetCount() - sizeof(BITMAPINFOHEADER));
+ memset(mt.Format(), 0, mt.FormatLength());
+ memcpy(&pvih->bmiHeader, s->strf.GetData(), s->strf.GetCount());
+ if (s->strh.dwRate > 0) {
+ pvih->AvgTimePerFrame = 10000000ui64 * s->strh.dwScale / s->strh.dwRate;
+ }
+
+ if (s->cs.GetCount() && pvih->AvgTimePerFrame > 0) {
+ UINT64 size = 0;
+ for (unsigned int i = 0; i < s->cs.GetCount(); ++i) {
+ size += s->cs[i].orgsize;
+ }
+ pvih->dwBitRate = (DWORD)(10000000.0 * size * 8 / (s->cs.GetCount() * pvih->AvgTimePerFrame) + 0.5);
+ // need calculate in double, because the (10000000ui64 * size * 8) can give overflow
+ }
+
+ mt.SetSampleSize(s->strh.dwSuggestedBufferSize > 0
+ ? s->strh.dwSuggestedBufferSize * 3 / 2
+ : (pvih->bmiHeader.biWidth * pvih->bmiHeader.biHeight * 4));
+ mts.Add(mt);
+ } else if (s->strh.fccType == FCC('auds') || s->strh.fccType == FCC('amva')) {
+ label = L"Audio";
+
+ ASSERT(s->strf.GetCount() >= sizeof(WAVEFORMATEX)
+ || s->strf.GetCount() == sizeof(PCMWAVEFORMAT));
+
+ WAVEFORMATEX* pwfe = (WAVEFORMATEX*)s->strf.GetData();
+
+ if (pwfe->nBlockAlign == 0) {
+ continue;
+ }
+
+ mt.majortype = MEDIATYPE_Audio;
+ if (m_pFile->m_isamv) {
+ mt.subtype = FOURCCMap(MAKEFOURCC('A', 'M', 'V', 'A'));
+ } else {
+ mt.subtype = FOURCCMap(pwfe->wFormatTag);
+ }
+ mt.formattype = FORMAT_WaveFormatEx;
+ mt.SetFormat(s->strf.GetData(), max((ULONG)s->strf.GetCount(), sizeof(WAVEFORMATEX)));
+ pwfe = (WAVEFORMATEX*)mt.Format();
+ if (s->strf.GetCount() == sizeof(PCMWAVEFORMAT)) {
+ pwfe->cbSize = 0;
+ }
+ if (pwfe->wFormatTag == WAVE_FORMAT_PCM) {
+ pwfe->nBlockAlign = pwfe->nChannels * pwfe->wBitsPerSample >> 3;
+ }
+ if (pwfe->wFormatTag == WAVE_FORMAT_EXTENSIBLE) {
+ mt.subtype = FOURCCMap(WAVE_FORMAT_PCM); // audio renderer doesn't accept fffe in the subtype
+ }
+ mt.SetSampleSize(s->strh.dwSuggestedBufferSize > 0
+ ? s->strh.dwSuggestedBufferSize * 3 / 2
+ : (pwfe->nChannels * pwfe->nSamplesPerSec * 32 >> 3));
+ mts.Add(mt);
+ } else if (s->strh.fccType == FCC('mids')) {
+ label = L"Midi";
+
+ mt.majortype = MEDIATYPE_Midi;
+ mt.subtype = MEDIASUBTYPE_NULL;
+ mt.formattype = FORMAT_None;
+ mt.SetSampleSize(s->strh.dwSuggestedBufferSize > 0
+ ? s->strh.dwSuggestedBufferSize * 3 / 2
+ : (1024 * 1024));
+ mts.Add(mt);
+ } else if (s->strh.fccType == FCC('txts')) {
+ label = L"Text";
+
+ mt.majortype = MEDIATYPE_Text;
+ mt.subtype = MEDIASUBTYPE_NULL;
+ mt.formattype = FORMAT_None;
+ mt.SetSampleSize(s->strh.dwSuggestedBufferSize > 0
+ ? s->strh.dwSuggestedBufferSize * 3 / 2
+ : (1024 * 1024));
+ mts.Add(mt);
+ } else if (s->strh.fccType == FCC('iavs')) {
+ label = L"Interleaved";
+
+ ASSERT(s->strh.fccHandler == FCC('dvsd'));
+
+ mt.majortype = MEDIATYPE_Interleaved;
+ mt.subtype = FOURCCMap(s->strh.fccHandler);
+ mt.formattype = FORMAT_DvInfo;
+ mt.SetFormat(s->strf.GetData(), max((ULONG)s->strf.GetCount(), sizeof(DVINFO)));
+ mt.SetSampleSize(s->strh.dwSuggestedBufferSize > 0
+ ? s->strh.dwSuggestedBufferSize * 3 / 2
+ : (1024 * 1024));
+ mts.Add(mt);
+ }
+
+ if (mts.IsEmpty()) {
+ TRACE(_T("CAviSourceFilter: Unsupported stream (%d)\n"), i);
+ continue;
+ }
+
+ //Put filename at front sometime(eg. ~temp.avi) will cause filter graph
+ //stop check this pin. Not sure the reason exactly. but it happens.
+ //If you know why, please emailto: tomasen@gmail.com
+ if (s->strn.IsEmpty()) {
+ name.Format(L"%s %u", label, i);
+ } else {
+ name.Format(L"%s (%s %u)", CStringW(s->strn), label, i);
+ }
+
+ HRESULT hr;
+
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CAviSplitterOutputPin(mts, name, this, this, &hr));
+ AddOutputPin(i, pPinOut);
+ }
+
+ POSITION pos = m_pFile->m_info.GetStartPosition();
+ while (pos) {
+ DWORD fcc;
+ CStringA value;
+ m_pFile->m_info.GetNextAssoc(pos, fcc, value);
+
+ switch (fcc) {
+ case FCC('INAM'):
+ SetProperty(L"TITL", CStringW(value));
+ break;
+ case FCC('IART'):
+ SetProperty(L"AUTH", CStringW(value));
+ break;
+ case FCC('ICOP'):
+ SetProperty(L"CPYR", CStringW(value));
+ break;
+ case FCC('ISBJ'):
+ SetProperty(L"DESC", CStringW(value));
+ break;
+ }
+ }
+
+ m_tFrame.Attach(DNew DWORD[m_pFile->m_avih.dwStreams]);
+
+ return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
}
bool CAviSplitterFilter::DemuxInit()
{
- SetThreadName((DWORD)-1, "CAviSplitterFilter");
+ SetThreadName((DWORD) - 1, "CAviSplitterFilter");
- if (!m_pFile) {
- return false;
- }
+ if (!m_pFile) {
+ return false;
+ }
- // reindex if needed
+ // reindex if needed
- bool fReIndex = false;
+ bool fReIndex = false;
- for (DWORD i = 0; i < m_pFile->m_avih.dwStreams && !fReIndex; ++i) {
- if (m_pFile->m_strms[i]->cs.GetCount() == 0 && GetOutputPin(i)) {
- fReIndex = true;
- }
- }
+ for (DWORD i = 0; i < m_pFile->m_avih.dwStreams && !fReIndex; ++i) {
+ if (m_pFile->m_strms[i]->cs.GetCount() == 0 && GetOutputPin(i)) {
+ fReIndex = true;
+ }
+ }
- if (fReIndex) {
- m_pFile->EmptyIndex();
+ if (fReIndex) {
+ m_pFile->EmptyIndex();
- m_fAbort = false;
- m_nOpenProgress = 0;
+ m_fAbort = false;
+ m_nOpenProgress = 0;
- m_rtDuration = 0;
+ m_rtDuration = 0;
- CAutoVectorPtr<UINT64> pSize;
- pSize.Allocate(m_pFile->m_avih.dwStreams);
- memset((UINT64*)pSize, 0, sizeof(UINT64)*m_pFile->m_avih.dwStreams);
- m_pFile->Seek(0);
- ReIndex(m_pFile->GetLength(), pSize);
+ CAutoVectorPtr<UINT64> pSize;
+ pSize.Allocate(m_pFile->m_avih.dwStreams);
+ memset((UINT64*)pSize, 0, sizeof(UINT64)*m_pFile->m_avih.dwStreams);
+ m_pFile->Seek(0);
+ ReIndex(m_pFile->GetLength(), pSize);
- if (m_fAbort) {
- m_pFile->EmptyIndex();
- }
+ if (m_fAbort) {
+ m_pFile->EmptyIndex();
+ }
- m_fAbort = false;
- m_nOpenProgress = 100;
- }
+ m_fAbort = false;
+ m_nOpenProgress = 100;
+ }
- return true;
+ return true;
}
HRESULT CAviSplitterFilter::ReIndex(__int64 end, UINT64* pSize)
{
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- while (S_OK == hr && m_pFile->GetPos() < end && SUCCEEDED(hr) && !m_fAbort) {
- __int64 pos = m_pFile->GetPos();
+ while (S_OK == hr && m_pFile->GetPos() < end && SUCCEEDED(hr) && !m_fAbort) {
+ __int64 pos = m_pFile->GetPos();
- DWORD id = 0, size;
- if (S_OK != m_pFile->Read(id) || id == 0) {
- return E_FAIL;
- }
+ DWORD id = 0, size;
+ if (S_OK != m_pFile->Read(id) || id == 0) {
+ return E_FAIL;
+ }
- if (id == FCC('RIFF') || id == FCC('LIST')) {
- if (S_OK != m_pFile->Read(size) || S_OK != m_pFile->Read(id)) {
- return E_FAIL;
- }
+ if (id == FCC('RIFF') || id == FCC('LIST')) {
+ if (S_OK != m_pFile->Read(size) || S_OK != m_pFile->Read(id)) {
+ return E_FAIL;
+ }
- size += (size&1) + 8;
+ size += (size & 1) + 8;
- if (id == FCC('AVI ') || id == FCC('AVIX') || id == FCC('movi') || id == FCC('rec ')) {
- hr = ReIndex(pos + size, pSize);
- }
- } else {
- if (S_OK != m_pFile->Read(size)) {
- return E_FAIL;
- }
+ if (id == FCC('AVI ') || id == FCC('AVIX') || id == FCC('movi') || id == FCC('rec ')) {
+ hr = ReIndex(pos + size, pSize);
+ }
+ } else {
+ if (S_OK != m_pFile->Read(size)) {
+ return E_FAIL;
+ }
- DWORD TrackNumber = TRACKNUM(id);
+ DWORD TrackNumber = TRACKNUM(id);
- if (TrackNumber < m_pFile->m_strms.GetCount()) {
- CAviFile::strm_t* s = m_pFile->m_strms[TrackNumber];
+ if (TrackNumber < m_pFile->m_strms.GetCount()) {
+ CAviFile::strm_t* s = m_pFile->m_strms[TrackNumber];
- WORD type = TRACKTYPE(id);
+ WORD type = TRACKTYPE(id);
- if (type == 'db' || type == 'dc' || /*type == 'pc' ||*/ type == 'wb'
- || type == 'iv' || type == '__' || type == 'xx') {
- CAviFile::strm_t::chunk c;
- c.filepos = pos;
- c.size = pSize[TrackNumber];
- c.orgsize = size;
- c.fKeyFrame = size > 0; // TODO: find a better way...
- c.fChunkHdr = true;
- s->cs.Add(c);
+ if (type == 'db' || type == 'dc' || /*type == 'pc' ||*/ type == 'wb'
+ || type == 'iv' || type == '__' || type == 'xx') {
+ CAviFile::strm_t::chunk c;
+ c.filepos = pos;
+ c.size = pSize[TrackNumber];
+ c.orgsize = size;
+ c.fKeyFrame = size > 0; // TODO: find a better way...
+ c.fChunkHdr = true;
+ s->cs.Add(c);
- pSize[TrackNumber] += s->GetChunkSize(size);
+ pSize[TrackNumber] += s->GetChunkSize(size);
- REFERENCE_TIME rt = s->GetRefTime((DWORD)s->cs.GetCount()-1, pSize[TrackNumber]);
- m_rtDuration = max(rt, m_rtDuration);
- }
- }
+ REFERENCE_TIME rt = s->GetRefTime((DWORD)s->cs.GetCount() - 1, pSize[TrackNumber]);
+ m_rtDuration = max(rt, m_rtDuration);
+ }
+ }
- size += (size&1) + 8;
- }
+ size += (size & 1) + 8;
+ }
- m_pFile->Seek(pos + size);
+ m_pFile->Seek(pos + size);
- m_nOpenProgress = m_pFile->GetPos()*100/m_pFile->GetLength();
+ m_nOpenProgress = m_pFile->GetPos() * 100 / m_pFile->GetLength();
- DWORD cmd;
- if (CheckRequest(&cmd)) {
- if (cmd == CMD_EXIT) {
- m_fAbort = true;
- } else {
- Reply(S_OK);
- }
- }
- }
+ DWORD cmd;
+ if (CheckRequest(&cmd)) {
+ if (cmd == CMD_EXIT) {
+ m_fAbort = true;
+ } else {
+ Reply(S_OK);
+ }
+ }
+ }
- return hr;
+ return hr;
}
void CAviSplitterFilter::DemuxSeek(REFERENCE_TIME rt)
{
- memset((DWORD*)m_tFrame, 0, sizeof(DWORD)*m_pFile->m_avih.dwStreams);
- m_pFile->Seek(0);
+ memset((DWORD*)m_tFrame, 0, sizeof(DWORD)*m_pFile->m_avih.dwStreams);
+ m_pFile->Seek(0);
- DbgLog((LOG_TRACE, 0, _T("Seek: %I64d"), rt/10000));
+ DbgLog((LOG_TRACE, 0, _T("Seek: %I64d"), rt / 10000));
- if (rt > 0) {
- UINT64 minfp = _I64_MAX;
+ if (rt > 0) {
+ UINT64 minfp = _I64_MAX;
- for (unsigned int j = 0; j < m_pFile->m_strms.GetCount(); ++j) {
- CAviFile::strm_t* s = m_pFile->m_strms[j];
+ for (unsigned int j = 0; j < m_pFile->m_strms.GetCount(); ++j) {
+ CAviFile::strm_t* s = m_pFile->m_strms[j];
- if (s->IsRawSubtitleStream()) continue;
+ if (s->IsRawSubtitleStream()) { continue; }
- //ASSERT(s->GetFrame(rt) == s->GetKeyFrame(rt)); // fast seek test
- UINT64 fp = s->cs[s->GetKeyFrame(rt)].filepos;
- minfp = min(minfp, fp);
- }
+ //ASSERT(s->GetFrame(rt) == s->GetKeyFrame(rt)); // fast seek test
+ UINT64 fp = s->cs[s->GetKeyFrame(rt)].filepos;
+ minfp = min(minfp, fp);
+ }
- for (unsigned int j = 0; j < m_pFile->m_strms.GetCount(); ++j) {
- CAviFile::strm_t* s = m_pFile->m_strms[j];
+ for (unsigned int j = 0; j < m_pFile->m_strms.GetCount(); ++j) {
+ CAviFile::strm_t* s = m_pFile->m_strms[j];
- for (unsigned int i = 0; i < s->cs.GetCount(); ++i) {
- CAviFile::strm_t::chunk& c = s->cs[i];
- if (c.filepos >= minfp) {
- m_tFrame[j] = i;
- break;
- }
- }
- }
- DbgLog((LOG_TRACE, 0, _T("minfp: %I64d"), minfp));
- }
+ for (unsigned int i = 0; i < s->cs.GetCount(); ++i) {
+ CAviFile::strm_t::chunk& c = s->cs[i];
+ if (c.filepos >= minfp) {
+ m_tFrame[j] = i;
+ break;
+ }
+ }
+ }
+ DbgLog((LOG_TRACE, 0, _T("minfp: %I64d"), minfp));
+ }
}
bool CAviSplitterFilter::DemuxLoop()
{
- HRESULT hr = S_OK;
-
- size_t nTracks = m_pFile->m_strms.GetCount();
-
- CAtlArray<BOOL> fDiscontinuity;
- fDiscontinuity.SetCount(nTracks);
- memset(fDiscontinuity.GetData(), 0, nTracks*sizeof(bool));
-
- while (SUCCEEDED(hr) && !CheckRequest(NULL)) {
- size_t minTrack = nTracks;
- UINT64 minFilePos = _I64_MAX;
-
- for (unsigned int i = 0; i < nTracks; ++i) {
- CAviFile::strm_t* s = m_pFile->m_strms[i];
-
- DWORD f = m_tFrame[i];
- if (f >= (DWORD)s->cs.GetCount()) {
- continue;
- }
-
- bool fUrgent = s->IsRawSubtitleStream();
-
- if (fUrgent || s->cs[f].filepos < minFilePos) {
- minTrack = i;
- minFilePos = s->cs[f].filepos;
- }
-
- if (fUrgent) {
- break;
- }
- }
-
- if (minTrack == nTracks) {
- break;
- }
-
- DWORD& f = m_tFrame[minTrack];
-
- do {
- CAviFile::strm_t* s = m_pFile->m_strms[minTrack];
-
- m_pFile->Seek(s->cs[f].filepos);
-
- DWORD size = 0;
-
- if (s->cs[f].fChunkHdr) {
- DWORD id = 0;
- if (S_OK != m_pFile->Read(id) || id == 0 || minTrack != TRACKNUM(id)
- || S_OK != m_pFile->Read(size)) {
- fDiscontinuity[minTrack] = true;
- break;
- }
-
- UINT64 expectedsize = (UINT64)-1;
- expectedsize = f < (DWORD)s->cs.GetCount()-1
- ? s->cs[f+1].size - s->cs[f].size
- : s->totalsize - s->cs[f].size;
-
- if (expectedsize != s->GetChunkSize(size)) {
- fDiscontinuity[minTrack] = true;
- //ASSERT(0);
- break;
- }
- } else {
- size = s->cs[f].orgsize;
- }
-
- CAutoPtr<Packet> p(DNew Packet());
-
- p->TrackNumber = (DWORD)minTrack;
- p->bSyncPoint = (BOOL)s->cs[f].fKeyFrame;
- p->bDiscontinuity = fDiscontinuity[minTrack];
- p->rtStart = s->GetRefTime(f, s->cs[f].size);
- p->rtStop = s->GetRefTime(f+1, f+1 < (DWORD)s->cs.GetCount() ? s->cs[f+1].size : s->totalsize);
- p->SetCount(size);
- if (S_OK != (hr = m_pFile->ByteRead(p->GetData(), p->GetCount()))) {
- return true; // break;
- }
+ HRESULT hr = S_OK;
+
+ size_t nTracks = m_pFile->m_strms.GetCount();
+
+ CAtlArray<BOOL> fDiscontinuity;
+ fDiscontinuity.SetCount(nTracks);
+ memset(fDiscontinuity.GetData(), 0, nTracks * sizeof(bool));
+
+ while (SUCCEEDED(hr) && !CheckRequest(NULL)) {
+ size_t minTrack = nTracks;
+ UINT64 minFilePos = _I64_MAX;
+
+ for (unsigned int i = 0; i < nTracks; ++i) {
+ CAviFile::strm_t* s = m_pFile->m_strms[i];
+
+ DWORD f = m_tFrame[i];
+ if (f >= (DWORD)s->cs.GetCount()) {
+ continue;
+ }
+
+ bool fUrgent = s->IsRawSubtitleStream();
+
+ if (fUrgent || s->cs[f].filepos < minFilePos) {
+ minTrack = i;
+ minFilePos = s->cs[f].filepos;
+ }
+
+ if (fUrgent) {
+ break;
+ }
+ }
+
+ if (minTrack == nTracks) {
+ break;
+ }
+
+ DWORD& f = m_tFrame[minTrack];
+
+ do {
+ CAviFile::strm_t* s = m_pFile->m_strms[minTrack];
+
+ m_pFile->Seek(s->cs[f].filepos);
+
+ DWORD size = 0;
+
+ if (s->cs[f].fChunkHdr) {
+ DWORD id = 0;
+ if (S_OK != m_pFile->Read(id) || id == 0 || minTrack != TRACKNUM(id)
+ || S_OK != m_pFile->Read(size)) {
+ fDiscontinuity[minTrack] = true;
+ break;
+ }
+
+ UINT64 expectedsize = (UINT64) - 1;
+ expectedsize = f < (DWORD)s->cs.GetCount() - 1
+ ? s->cs[f + 1].size - s->cs[f].size
+ : s->totalsize - s->cs[f].size;
+
+ if (expectedsize != s->GetChunkSize(size)) {
+ fDiscontinuity[minTrack] = true;
+ //ASSERT(0);
+ break;
+ }
+ } else {
+ size = s->cs[f].orgsize;
+ }
+
+ CAutoPtr<Packet> p(DNew Packet());
+
+ p->TrackNumber = (DWORD)minTrack;
+ p->bSyncPoint = (BOOL)s->cs[f].fKeyFrame;
+ p->bDiscontinuity = fDiscontinuity[minTrack];
+ p->rtStart = s->GetRefTime(f, s->cs[f].size);
+ p->rtStop = s->GetRefTime(f + 1, f + 1 < (DWORD)s->cs.GetCount() ? s->cs[f + 1].size : s->totalsize);
+ p->SetCount(size);
+ if (S_OK != (hr = m_pFile->ByteRead(p->GetData(), p->GetCount()))) {
+ return true; // break;
+ }
#if defined(_DEBUG) && 0
- DbgLog((LOG_TRACE, 0,
- _T("%d (%d): %I64d - %I64d, %I64d - %I64d (size = %d)"),
- minTrack, (int)p->bSyncPoint,
- (p->rtStart)/10000, (p->rtStop)/10000,
- (p->rtStart-m_rtStart)/10000, (p->rtStop-m_rtStart)/10000,
- size));
+ DbgLog((LOG_TRACE, 0,
+ _T("%d (%d): %I64d - %I64d, %I64d - %I64d (size = %d)"),
+ minTrack, (int)p->bSyncPoint,
+ (p->rtStart) / 10000, (p->rtStop) / 10000,
+ (p->rtStart - m_rtStart) / 10000, (p->rtStop - m_rtStart) / 10000,
+ size));
#endif
- m_maxTimeStamp = max(m_maxTimeStamp, p->rtStart);
+ m_maxTimeStamp = max(m_maxTimeStamp, p->rtStart);
- hr = DeliverPacket(p);
+ hr = DeliverPacket(p);
- fDiscontinuity[minTrack] = false;
- } while (0);
+ fDiscontinuity[minTrack] = false;
+ } while (0);
- ++f;
- }
+ ++f;
+ }
- if (m_maxTimeStamp != Packet::INVALID_TIME) {
- m_rtCurrent = m_maxTimeStamp;
- }
- return true;
+ if (m_maxTimeStamp != Packet::INVALID_TIME) {
+ m_rtCurrent = m_maxTimeStamp;
+ }
+ return true;
}
// IMediaSeeking
STDMETHODIMP CAviSplitterFilter::GetDuration(LONGLONG* pDuration)
{
- CheckPointer(pDuration, E_POINTER);
- CheckPointer(m_pFile, VFW_E_NOT_CONNECTED);
-
- if (m_timeformat == TIME_FORMAT_FRAME) {
- for (unsigned int i = 0; i < m_pFile->m_strms.GetCount(); ++i) {
- CAviFile::strm_t* s = m_pFile->m_strms[i];
- if (s->strh.fccType == FCC('vids')) {
- *pDuration = s->cs.GetCount();
- return S_OK;
- }
- }
-
- return E_UNEXPECTED;
- }
-
- return __super::GetDuration(pDuration);
+ CheckPointer(pDuration, E_POINTER);
+ CheckPointer(m_pFile, VFW_E_NOT_CONNECTED);
+
+ if (m_timeformat == TIME_FORMAT_FRAME) {
+ for (unsigned int i = 0; i < m_pFile->m_strms.GetCount(); ++i) {
+ CAviFile::strm_t* s = m_pFile->m_strms[i];
+ if (s->strh.fccType == FCC('vids')) {
+ *pDuration = s->cs.GetCount();
+ return S_OK;
+ }
+ }
+
+ return E_UNEXPECTED;
+ }
+
+ return __super::GetDuration(pDuration);
}
//
STDMETHODIMP CAviSplitterFilter::IsFormatSupported(const GUID* pFormat)
{
- CheckPointer(pFormat, E_POINTER);
- HRESULT hr = __super::IsFormatSupported(pFormat);
- if (S_OK == hr) {
- return hr;
- }
- return *pFormat == TIME_FORMAT_FRAME ? S_OK : S_FALSE;
+ CheckPointer(pFormat, E_POINTER);
+ HRESULT hr = __super::IsFormatSupported(pFormat);
+ if (S_OK == hr) {
+ return hr;
+ }
+ return *pFormat == TIME_FORMAT_FRAME ? S_OK : S_FALSE;
}
STDMETHODIMP CAviSplitterFilter::GetTimeFormat(GUID* pFormat)
{
- CheckPointer(pFormat, E_POINTER);
- *pFormat = m_timeformat;
- return S_OK;
+ CheckPointer(pFormat, E_POINTER);
+ *pFormat = m_timeformat;
+ return S_OK;
}
STDMETHODIMP CAviSplitterFilter::IsUsingTimeFormat(const GUID* pFormat)
{
- CheckPointer(pFormat, E_POINTER);
- return *pFormat == m_timeformat ? S_OK : S_FALSE;
+ CheckPointer(pFormat, E_POINTER);
+ return *pFormat == m_timeformat ? S_OK : S_FALSE;
}
STDMETHODIMP CAviSplitterFilter::SetTimeFormat(const GUID* pFormat)
{
- CheckPointer(pFormat, E_POINTER);
- if (S_OK != IsFormatSupported(pFormat)) {
- return E_FAIL;
- }
- m_timeformat = *pFormat;
- return S_OK;
+ CheckPointer(pFormat, E_POINTER);
+ if (S_OK != IsFormatSupported(pFormat)) {
+ return E_FAIL;
+ }
+ m_timeformat = *pFormat;
+ return S_OK;
}
STDMETHODIMP CAviSplitterFilter::GetStopPosition(LONGLONG* pStop)
{
- CheckPointer(pStop, E_POINTER);
- if (FAILED(__super::GetStopPosition(pStop))) {
- return E_FAIL;
- }
- if (m_timeformat == TIME_FORMAT_MEDIA_TIME) {
- return S_OK;
- }
- LONGLONG rt = *pStop;
- if (FAILED(ConvertTimeFormat(pStop, &TIME_FORMAT_FRAME, rt, &TIME_FORMAT_MEDIA_TIME))) {
- return E_FAIL;
- }
- return S_OK;
+ CheckPointer(pStop, E_POINTER);
+ if (FAILED(__super::GetStopPosition(pStop))) {
+ return E_FAIL;
+ }
+ if (m_timeformat == TIME_FORMAT_MEDIA_TIME) {
+ return S_OK;
+ }
+ LONGLONG rt = *pStop;
+ if (FAILED(ConvertTimeFormat(pStop, &TIME_FORMAT_FRAME, rt, &TIME_FORMAT_MEDIA_TIME))) {
+ return E_FAIL;
+ }
+ return S_OK;
}
STDMETHODIMP CAviSplitterFilter::ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat)
{
- CheckPointer(pTarget, E_POINTER);
-
- const GUID& SourceFormat = pSourceFormat ? *pSourceFormat : m_timeformat;
- const GUID& TargetFormat = pTargetFormat ? *pTargetFormat : m_timeformat;
-
- if (TargetFormat == SourceFormat) {
- *pTarget = Source;
- return S_OK;
- } else if (TargetFormat == TIME_FORMAT_FRAME && SourceFormat == TIME_FORMAT_MEDIA_TIME) {
- for (unsigned int i = 0; i < m_pFile->m_strms.GetCount(); ++i) {
- CAviFile::strm_t* s = m_pFile->m_strms[i];
- if (s->strh.fccType == FCC('vids')) {
- *pTarget = s->GetFrame(Source);
- return S_OK;
- }
- }
- } else if (TargetFormat == TIME_FORMAT_MEDIA_TIME && SourceFormat == TIME_FORMAT_FRAME) {
- for (unsigned int i = 0; i < m_pFile->m_strms.GetCount(); ++i) {
- CAviFile::strm_t* s = m_pFile->m_strms[i];
- if (s->strh.fccType == FCC('vids')) {
- if (Source < 0 || Source >= (LONGLONG)s->cs.GetCount()) {
- return E_FAIL;
- }
- CAviFile::strm_t::chunk& c = s->cs[(size_t)Source];
- *pTarget = s->GetRefTime((DWORD)Source, c.size);
- return S_OK;
- }
- }
- }
-
- return E_FAIL;
+ CheckPointer(pTarget, E_POINTER);
+
+ const GUID& SourceFormat = pSourceFormat ? *pSourceFormat : m_timeformat;
+ const GUID& TargetFormat = pTargetFormat ? *pTargetFormat : m_timeformat;
+
+ if (TargetFormat == SourceFormat) {
+ *pTarget = Source;
+ return S_OK;
+ } else if (TargetFormat == TIME_FORMAT_FRAME && SourceFormat == TIME_FORMAT_MEDIA_TIME) {
+ for (unsigned int i = 0; i < m_pFile->m_strms.GetCount(); ++i) {
+ CAviFile::strm_t* s = m_pFile->m_strms[i];
+ if (s->strh.fccType == FCC('vids')) {
+ *pTarget = s->GetFrame(Source);
+ return S_OK;
+ }
+ }
+ } else if (TargetFormat == TIME_FORMAT_MEDIA_TIME && SourceFormat == TIME_FORMAT_FRAME) {
+ for (unsigned int i = 0; i < m_pFile->m_strms.GetCount(); ++i) {
+ CAviFile::strm_t* s = m_pFile->m_strms[i];
+ if (s->strh.fccType == FCC('vids')) {
+ if (Source < 0 || Source >= (LONGLONG)s->cs.GetCount()) {
+ return E_FAIL;
+ }
+ CAviFile::strm_t::chunk& c = s->cs[(size_t)Source];
+ *pTarget = s->GetRefTime((DWORD)Source, c.size);
+ return S_OK;
+ }
+ }
+ }
+
+ return E_FAIL;
}
STDMETHODIMP CAviSplitterFilter::GetPositions(LONGLONG* pCurrent, LONGLONG* pStop)
{
- HRESULT hr;
- if (FAILED(hr = __super::GetPositions(pCurrent, pStop)) || m_timeformat != TIME_FORMAT_FRAME) {
- return hr;
- }
-
- if (pCurrent)
- if (FAILED(ConvertTimeFormat(pCurrent, &TIME_FORMAT_FRAME, *pCurrent, &TIME_FORMAT_MEDIA_TIME))) {
- return E_FAIL;
- }
- if (pStop)
- if (FAILED(ConvertTimeFormat(pStop, &TIME_FORMAT_FRAME, *pStop, &TIME_FORMAT_MEDIA_TIME))) {
- return E_FAIL;
- }
-
- return S_OK;
+ HRESULT hr;
+ if (FAILED(hr = __super::GetPositions(pCurrent, pStop)) || m_timeformat != TIME_FORMAT_FRAME) {
+ return hr;
+ }
+
+ if (pCurrent)
+ if (FAILED(ConvertTimeFormat(pCurrent, &TIME_FORMAT_FRAME, *pCurrent, &TIME_FORMAT_MEDIA_TIME))) {
+ return E_FAIL;
+ }
+ if (pStop)
+ if (FAILED(ConvertTimeFormat(pStop, &TIME_FORMAT_FRAME, *pStop, &TIME_FORMAT_MEDIA_TIME))) {
+ return E_FAIL;
+ }
+
+ return S_OK;
}
HRESULT CAviSplitterFilter::SetPositionsInternal(void* id, LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags)
{
- if (m_timeformat != TIME_FORMAT_FRAME) {
- return __super::SetPositionsInternal(id, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
- }
-
- if (!pCurrent && !pStop
- || (dwCurrentFlags&AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning
- && (dwStopFlags&AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning) {
- return S_OK;
- }
-
- REFERENCE_TIME
- rtCurrent = m_rtCurrent,
- rtStop = m_rtStop;
-
- if ((dwCurrentFlags&AM_SEEKING_PositioningBitsMask)
- && FAILED(ConvertTimeFormat(&rtCurrent, &TIME_FORMAT_FRAME, rtCurrent, &TIME_FORMAT_MEDIA_TIME))) {
- return E_FAIL;
- }
- if ((dwStopFlags&AM_SEEKING_PositioningBitsMask)
- && FAILED(ConvertTimeFormat(&rtStop, &TIME_FORMAT_FRAME, rtStop, &TIME_FORMAT_MEDIA_TIME))) {
- return E_FAIL;
- }
-
- if (pCurrent)
- switch (dwCurrentFlags&AM_SEEKING_PositioningBitsMask) {
- case AM_SEEKING_NoPositioning:
- break;
- case AM_SEEKING_AbsolutePositioning:
- rtCurrent = *pCurrent;
- break;
- case AM_SEEKING_RelativePositioning:
- rtCurrent = rtCurrent + *pCurrent;
- break;
- case AM_SEEKING_IncrementalPositioning:
- rtCurrent = rtCurrent + *pCurrent;
- break;
- }
-
- if (pStop)
- switch (dwStopFlags&AM_SEEKING_PositioningBitsMask) {
- case AM_SEEKING_NoPositioning:
- break;
- case AM_SEEKING_AbsolutePositioning:
- rtStop = *pStop;
- break;
- case AM_SEEKING_RelativePositioning:
- rtStop += *pStop;
- break;
- case AM_SEEKING_IncrementalPositioning:
- rtStop = rtCurrent + *pStop;
- break;
- }
-
- if ((dwCurrentFlags&AM_SEEKING_PositioningBitsMask)
- && pCurrent)
- if (FAILED(ConvertTimeFormat(pCurrent, &TIME_FORMAT_MEDIA_TIME, rtCurrent, &TIME_FORMAT_FRAME))) {
- return E_FAIL;
- }
- if ((dwStopFlags&AM_SEEKING_PositioningBitsMask)
- && pStop)
- if (FAILED(ConvertTimeFormat(pStop, &TIME_FORMAT_MEDIA_TIME, rtStop, &TIME_FORMAT_FRAME))) {
- return E_FAIL;
- }
-
- return __super::SetPositionsInternal(id, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
+ if (m_timeformat != TIME_FORMAT_FRAME) {
+ return __super::SetPositionsInternal(id, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
+ }
+
+ if (!pCurrent && !pStop
+ || (dwCurrentFlags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning
+ && (dwStopFlags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning) {
+ return S_OK;
+ }
+
+ REFERENCE_TIME
+ rtCurrent = m_rtCurrent,
+ rtStop = m_rtStop;
+
+ if ((dwCurrentFlags & AM_SEEKING_PositioningBitsMask)
+ && FAILED(ConvertTimeFormat(&rtCurrent, &TIME_FORMAT_FRAME, rtCurrent, &TIME_FORMAT_MEDIA_TIME))) {
+ return E_FAIL;
+ }
+ if ((dwStopFlags & AM_SEEKING_PositioningBitsMask)
+ && FAILED(ConvertTimeFormat(&rtStop, &TIME_FORMAT_FRAME, rtStop, &TIME_FORMAT_MEDIA_TIME))) {
+ return E_FAIL;
+ }
+
+ if (pCurrent)
+ switch (dwCurrentFlags & AM_SEEKING_PositioningBitsMask) {
+ case AM_SEEKING_NoPositioning:
+ break;
+ case AM_SEEKING_AbsolutePositioning:
+ rtCurrent = *pCurrent;
+ break;
+ case AM_SEEKING_RelativePositioning:
+ rtCurrent = rtCurrent + *pCurrent;
+ break;
+ case AM_SEEKING_IncrementalPositioning:
+ rtCurrent = rtCurrent + *pCurrent;
+ break;
+ }
+
+ if (pStop)
+ switch (dwStopFlags & AM_SEEKING_PositioningBitsMask) {
+ case AM_SEEKING_NoPositioning:
+ break;
+ case AM_SEEKING_AbsolutePositioning:
+ rtStop = *pStop;
+ break;
+ case AM_SEEKING_RelativePositioning:
+ rtStop += *pStop;
+ break;
+ case AM_SEEKING_IncrementalPositioning:
+ rtStop = rtCurrent + *pStop;
+ break;
+ }
+
+ if ((dwCurrentFlags & AM_SEEKING_PositioningBitsMask)
+ && pCurrent)
+ if (FAILED(ConvertTimeFormat(pCurrent, &TIME_FORMAT_MEDIA_TIME, rtCurrent, &TIME_FORMAT_FRAME))) {
+ return E_FAIL;
+ }
+ if ((dwStopFlags & AM_SEEKING_PositioningBitsMask)
+ && pStop)
+ if (FAILED(ConvertTimeFormat(pStop, &TIME_FORMAT_MEDIA_TIME, rtStop, &TIME_FORMAT_FRAME))) {
+ return E_FAIL;
+ }
+
+ return __super::SetPositionsInternal(id, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
}
// IKeyFrameInfo
STDMETHODIMP CAviSplitterFilter::GetKeyFrameCount(UINT& nKFs)
{
- if (!m_pFile) {
- return E_UNEXPECTED;
- }
+ if (!m_pFile) {
+ return E_UNEXPECTED;
+ }
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- nKFs = 0;
+ nKFs = 0;
- for (unsigned int i = 0; i < m_pFile->m_strms.GetCount(); ++i) {
- CAviFile::strm_t* s = m_pFile->m_strms[i];
- if (s->strh.fccType != FCC('vids')) {
- continue;
- }
+ for (unsigned int i = 0; i < m_pFile->m_strms.GetCount(); ++i) {
+ CAviFile::strm_t* s = m_pFile->m_strms[i];
+ if (s->strh.fccType != FCC('vids')) {
+ continue;
+ }
- for (unsigned int j = 0; j < s->cs.GetCount(); ++j) {
- CAviFile::strm_t::chunk& c = s->cs[j];
- if (c.fKeyFrame) {
- ++nKFs;
- }
- }
+ for (unsigned int j = 0; j < s->cs.GetCount(); ++j) {
+ CAviFile::strm_t::chunk& c = s->cs[j];
+ if (c.fKeyFrame) {
+ ++nKFs;
+ }
+ }
- if (nKFs == s->cs.GetCount()) {
- hr = S_FALSE;
- }
+ if (nKFs == s->cs.GetCount()) {
+ hr = S_FALSE;
+ }
- break;
- }
+ break;
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CAviSplitterFilter::GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs)
{
- CheckPointer(pFormat, E_POINTER);
- CheckPointer(pKFs, E_POINTER);
-
- if (!m_pFile) {
- return E_UNEXPECTED;
- }
- if (*pFormat != TIME_FORMAT_MEDIA_TIME && *pFormat != TIME_FORMAT_FRAME) {
- return E_INVALIDARG;
- }
-
- for (unsigned int i = 0; i < m_pFile->m_strms.GetCount(); ++i) {
- CAviFile::strm_t* s = m_pFile->m_strms[i];
- if (s->strh.fccType != FCC('vids')) {
- continue;
- }
- bool fConvertToRefTime = !!(*pFormat == TIME_FORMAT_MEDIA_TIME);
-
- UINT nKFsTmp = 0;
-
- for (unsigned int j = 0; j < s->cs.GetCount() && nKFsTmp < nKFs; ++j) {
- if (s->cs[j].fKeyFrame) {
- pKFs[nKFsTmp++] = fConvertToRefTime ? s->GetRefTime(j, s->cs[j].size) : j;
- }
- }
- nKFs = nKFsTmp;
-
- return S_OK;
- }
-
- return E_FAIL;
+ CheckPointer(pFormat, E_POINTER);
+ CheckPointer(pKFs, E_POINTER);
+
+ if (!m_pFile) {
+ return E_UNEXPECTED;
+ }
+ if (*pFormat != TIME_FORMAT_MEDIA_TIME && *pFormat != TIME_FORMAT_FRAME) {
+ return E_INVALIDARG;
+ }
+
+ for (unsigned int i = 0; i < m_pFile->m_strms.GetCount(); ++i) {
+ CAviFile::strm_t* s = m_pFile->m_strms[i];
+ if (s->strh.fccType != FCC('vids')) {
+ continue;
+ }
+ bool fConvertToRefTime = !!(*pFormat == TIME_FORMAT_MEDIA_TIME);
+
+ UINT nKFsTmp = 0;
+
+ for (unsigned int j = 0; j < s->cs.GetCount() && nKFsTmp < nKFs; ++j) {
+ if (s->cs[j].fKeyFrame) {
+ pKFs[nKFsTmp++] = fConvertToRefTime ? s->GetRefTime(j, s->cs[j].size) : j;
+ }
+ }
+ nKFs = nKFsTmp;
+
+ return S_OK;
+ }
+
+ return E_FAIL;
}
//
@@ -902,10 +902,10 @@ STDMETHODIMP CAviSplitterFilter::GetKeyFrames(const GUID* pFormat, REFERENCE_TIM
//
CAviSourceFilter::CAviSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CAviSplitterFilter(pUnk, phr)
+ : CAviSplitterFilter(pUnk, phr)
{
- m_clsid = __uuidof(this);
- m_pInput.Free();
+ m_clsid = __uuidof(this);
+ m_pInput.Free();
}
//
@@ -913,27 +913,27 @@ CAviSourceFilter::CAviSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
//
CAviSplitterOutputPin::CAviSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBaseSplitterOutputPin(mts, pName, pFilter, pLock, phr, 0, MAXPACKETS_AVI)
+ : CBaseSplitterOutputPin(mts, pName, pFilter, pLock, phr, 0, MAXPACKETS_AVI)
{
}
HRESULT CAviSplitterOutputPin::CheckConnect(IPin* pPin)
{
- int iPosition = 0;
- CMediaType mt;
- while (S_OK == GetMediaType(iPosition++, &mt)) {
- if (mt.majortype == MEDIATYPE_Video
- && (mt.subtype == FOURCCMap(FCC('IV32'))
- || mt.subtype == FOURCCMap(FCC('IV31'))
- || mt.subtype == FOURCCMap(FCC('IF09')))) {
- CLSID clsid = GetCLSID(GetFilterFromPin(pPin));
- if (clsid == CLSID_VideoMixingRenderer || clsid == CLSID_OverlayMixer) {
- return E_FAIL;
- }
- }
-
- mt.InitMediaType();
- }
-
- return __super::CheckConnect(pPin);
+ int iPosition = 0;
+ CMediaType mt;
+ while (S_OK == GetMediaType(iPosition++, &mt)) {
+ if (mt.majortype == MEDIATYPE_Video
+ && (mt.subtype == FOURCCMap(FCC('IV32'))
+ || mt.subtype == FOURCCMap(FCC('IV31'))
+ || mt.subtype == FOURCCMap(FCC('IF09')))) {
+ CLSID clsid = GetCLSID(GetFilterFromPin(pPin));
+ if (clsid == CLSID_VideoMixingRenderer || clsid == CLSID_OverlayMixer) {
+ return E_FAIL;
+ }
+ }
+
+ mt.InitMediaType();
+ }
+
+ return __super::CheckConnect(pPin);
}
diff --git a/src/filters/parser/AviSplitter/AviSplitter.h b/src/filters/parser/AviSplitter/AviSplitter.h
index 9366c6daf..b899c1ad1 100644
--- a/src/filters/parser/AviSplitter/AviSplitter.h
+++ b/src/filters/parser/AviSplitter/AviSplitter.h
@@ -35,62 +35,62 @@ class CAviFile;
class CAviSplitterOutputPin : public CBaseSplitterOutputPin
{
public:
- CAviSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ CAviSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- HRESULT CheckConnect(IPin* pPin);
+ HRESULT CheckConnect(IPin* pPin);
};
class __declspec(uuid("9736D831-9D6C-4E72-B6E7-560EF9181001"))
- CAviSplitterFilter : public CBaseSplitterFilter
+ CAviSplitterFilter : public CBaseSplitterFilter
{
- CAutoVectorPtr<DWORD> m_tFrame;
+ CAutoVectorPtr<DWORD> m_tFrame;
protected:
- CAutoPtr<CAviFile> m_pFile;
- HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
+ CAutoPtr<CAviFile> m_pFile;
+ HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
- bool DemuxInit();
- void DemuxSeek(REFERENCE_TIME rt);
- bool DemuxLoop();
+ bool DemuxInit();
+ void DemuxSeek(REFERENCE_TIME rt);
+ bool DemuxLoop();
- HRESULT ReIndex(__int64 end, UINT64* pSize);
+ HRESULT ReIndex(__int64 end, UINT64* pSize);
- REFERENCE_TIME m_maxTimeStamp;
+ REFERENCE_TIME m_maxTimeStamp;
public:
- CAviSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ CAviSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // CBaseFilter
+ // CBaseFilter
- STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
+ STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
- // IMediaSeeking
+ // IMediaSeeking
- STDMETHODIMP GetDuration(LONGLONG* pDuration);
+ STDMETHODIMP GetDuration(LONGLONG* pDuration);
- // TODO: this is too ugly, integrate this with the baseclass somehow
- GUID m_timeformat;
- STDMETHODIMP IsFormatSupported(const GUID* pFormat);
- STDMETHODIMP GetTimeFormat(GUID* pFormat);
- STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
- STDMETHODIMP SetTimeFormat(const GUID* pFormat);
- STDMETHODIMP GetStopPosition(LONGLONG* pStop);
- STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
- STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
+ // TODO: this is too ugly, integrate this with the baseclass somehow
+ GUID m_timeformat;
+ STDMETHODIMP IsFormatSupported(const GUID* pFormat);
+ STDMETHODIMP GetTimeFormat(GUID* pFormat);
+ STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
+ STDMETHODIMP SetTimeFormat(const GUID* pFormat);
+ STDMETHODIMP GetStopPosition(LONGLONG* pStop);
+ STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
+ STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
- HRESULT SetPositionsInternal(void* id, LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
+ HRESULT SetPositionsInternal(void* id, LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
- // IKeyFrameInfo
+ // IKeyFrameInfo
- STDMETHODIMP GetKeyFrameCount(UINT& nKFs);
- STDMETHODIMP GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
+ STDMETHODIMP GetKeyFrameCount(UINT& nKFs);
+ STDMETHODIMP GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
};
class __declspec(uuid("CEA8DEFF-0AF7-4DB9-9A38-FB3C3AEFC0DE"))
- CAviSourceFilter : public CAviSplitterFilter
+ CAviSourceFilter : public CAviSplitterFilter
{
public:
- CAviSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ CAviSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
};
diff --git a/src/filters/parser/BaseSplitter/AsyncReader.cpp b/src/filters/parser/BaseSplitter/AsyncReader.cpp
index 1a14a52b2..7ae1455af 100644
--- a/src/filters/parser/BaseSplitter/AsyncReader.cpp
+++ b/src/filters/parser/BaseSplitter/AsyncReader.cpp
@@ -33,110 +33,110 @@
//
CAsyncFileReader::CAsyncFileReader(CString fn, HRESULT& hr)
- : CUnknown(NAME("CAsyncFileReader"), NULL, &hr)
- , m_len((ULONGLONG)-1)
- , m_hBreakEvent(NULL)
- , m_lOsError(0)
+ : CUnknown(NAME("CAsyncFileReader"), NULL, &hr)
+ , m_len((ULONGLONG) - 1)
+ , m_hBreakEvent(NULL)
+ , m_lOsError(0)
{
- hr = Open(fn, modeRead|shareDenyNone|typeBinary|osSequentialScan) ? S_OK : E_FAIL;
- if (SUCCEEDED(hr)) {
- m_len = GetLength();
- }
+ hr = Open(fn, modeRead | shareDenyNone | typeBinary | osSequentialScan) ? S_OK : E_FAIL;
+ if (SUCCEEDED(hr)) {
+ m_len = GetLength();
+ }
}
CAsyncFileReader::CAsyncFileReader(CAtlList<CHdmvClipInfo::PlaylistItem>& Items, HRESULT& hr)
- : CUnknown(NAME("CAsyncFileReader"), NULL, &hr)
- , m_len((ULONGLONG)-1)
- , m_hBreakEvent(NULL)
- , m_lOsError(0)
+ : CUnknown(NAME("CAsyncFileReader"), NULL, &hr)
+ , m_len((ULONGLONG) - 1)
+ , m_hBreakEvent(NULL)
+ , m_lOsError(0)
{
- hr = OpenFiles(Items, modeRead|shareDenyNone|typeBinary|osSequentialScan) ? S_OK : E_FAIL;
- if (SUCCEEDED(hr)) {
- m_len = GetLength();
- }
+ hr = OpenFiles(Items, modeRead | shareDenyNone | typeBinary | osSequentialScan) ? S_OK : E_FAIL;
+ if (SUCCEEDED(hr)) {
+ m_len = GetLength();
+ }
}
STDMETHODIMP CAsyncFileReader::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(IAsyncReader)
- QI(ISyncReader)
- QI(IFileHandle)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IAsyncReader)
+ QI(ISyncReader)
+ QI(IFileHandle)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
// IAsyncReader
STDMETHODIMP CAsyncFileReader::SyncRead(LONGLONG llPosition, LONG lLength, BYTE* pBuffer)
{
- do {
- try {
- if ((ULONGLONG)llPosition+lLength > GetLength()) {
- return E_FAIL; // strange, but the Seek below can return llPosition even if the file is not that big (?)
- }
- if ((ULONGLONG)llPosition != Seek(llPosition, begin)) {
- return E_FAIL;
- }
- if ((UINT)lLength < Read(pBuffer, lLength)) {
- return E_FAIL;
- }
+ do {
+ try {
+ if ((ULONGLONG)llPosition + lLength > GetLength()) {
+ return E_FAIL; // strange, but the Seek below can return llPosition even if the file is not that big (?)
+ }
+ if ((ULONGLONG)llPosition != Seek(llPosition, begin)) {
+ return E_FAIL;
+ }
+ if ((UINT)lLength < Read(pBuffer, lLength)) {
+ return E_FAIL;
+ }
#if 0 // def DEBUG
- static __int64 s_total = 0, s_laststoppos = 0;
- s_total += lLength;
- if (s_laststoppos > llPosition) {
- TRACE(_T("[%I64d - %I64d] %d (%I64d)\n"), llPosition, llPosition + lLength, lLength, s_total);
- }
- s_laststoppos = llPosition + lLength;
+ static __int64 s_total = 0, s_laststoppos = 0;
+ s_total += lLength;
+ if (s_laststoppos > llPosition) {
+ TRACE(_T("[%I64d - %I64d] %d (%I64d)\n"), llPosition, llPosition + lLength, lLength, s_total);
+ }
+ s_laststoppos = llPosition + lLength;
#endif
- return S_OK;
- } catch (CFileException* e) {
- m_lOsError = e->m_lOsError;
- e->Delete();
- Sleep(1);
- CString fn = m_strFileName;
- try {
- Close();
- } catch (CFileException* e) {
- e->Delete();
- }
- try {
- Open(fn, modeRead|shareDenyNone|typeBinary|osSequentialScan);
- } catch (CFileException* e) {
- e->Delete();
- }
- m_strFileName = fn;
- }
- } while (m_hBreakEvent && WaitForSingleObject(m_hBreakEvent, 0) == WAIT_TIMEOUT);
-
- return E_FAIL;
+ return S_OK;
+ } catch (CFileException* e) {
+ m_lOsError = e->m_lOsError;
+ e->Delete();
+ Sleep(1);
+ CString fn = m_strFileName;
+ try {
+ Close();
+ } catch (CFileException* e) {
+ e->Delete();
+ }
+ try {
+ Open(fn, modeRead | shareDenyNone | typeBinary | osSequentialScan);
+ } catch (CFileException* e) {
+ e->Delete();
+ }
+ m_strFileName = fn;
+ }
+ } while (m_hBreakEvent && WaitForSingleObject(m_hBreakEvent, 0) == WAIT_TIMEOUT);
+
+ return E_FAIL;
}
STDMETHODIMP CAsyncFileReader::Length(LONGLONG* pTotal, LONGLONG* pAvailable)
{
- LONGLONG len = m_len >= 0 ? m_len : GetLength();
- if (pTotal) {
- *pTotal = len;
- }
- if (pAvailable) {
- *pAvailable = len;
- }
- return S_OK;
+ LONGLONG len = m_len >= 0 ? m_len : GetLength();
+ if (pTotal) {
+ *pTotal = len;
+ }
+ if (pAvailable) {
+ *pAvailable = len;
+ }
+ return S_OK;
}
// IFileHandle
STDMETHODIMP_(HANDLE) CAsyncFileReader::GetFileHandle()
{
- return m_hFile;
+ return m_hFile;
}
STDMETHODIMP_(LPCTSTR) CAsyncFileReader::GetFileName()
{
- return m_nCurPart != -1 ? m_strFiles[m_nCurPart] : m_strFiles[0];
+ return m_nCurPart != -1 ? m_strFiles[m_nCurPart] : m_strFiles[0];
}
//
@@ -144,99 +144,99 @@ STDMETHODIMP_(LPCTSTR) CAsyncFileReader::GetFileName()
//
CAsyncUrlReader::CAsyncUrlReader(CString url, HRESULT& hr)
- : CAsyncFileReader(url, hr)
+ : CAsyncFileReader(url, hr)
{
- if (SUCCEEDED(hr)) {
- return;
- }
+ if (SUCCEEDED(hr)) {
+ return;
+ }
- m_url = url;
+ m_url = url;
- if (CAMThread::Create()) {
- CallWorker(CMD_INIT);
- }
+ if (CAMThread::Create()) {
+ CallWorker(CMD_INIT);
+ }
- hr = Open(m_fn, modeRead|shareDenyRead|typeBinary|osSequentialScan) ? S_OK : E_FAIL;
- m_len = (ULONGLONG)-1; // force GetLength() return actual length always
+ hr = Open(m_fn, modeRead | shareDenyRead | typeBinary | osSequentialScan) ? S_OK : E_FAIL;
+ m_len = (ULONGLONG) - 1; // force GetLength() return actual length always
}
CAsyncUrlReader::~CAsyncUrlReader()
{
- if (ThreadExists()) {
- CallWorker(CMD_EXIT);
- }
-
- if (!m_fn.IsEmpty()) {
- CMultiFiles::Close();
- DeleteFile(m_fn);
- }
+ if (ThreadExists()) {
+ CallWorker(CMD_EXIT);
+ }
+
+ if (!m_fn.IsEmpty()) {
+ CMultiFiles::Close();
+ DeleteFile(m_fn);
+ }
}
// IAsyncReader
STDMETHODIMP CAsyncUrlReader::Length(LONGLONG* pTotal, LONGLONG* pAvailable)
{
- if (pTotal) {
- *pTotal = 0;
- }
- return __super::Length(NULL, pAvailable);
+ if (pTotal) {
+ *pTotal = 0;
+ }
+ return __super::Length(NULL, pAvailable);
}
// CAMThread
DWORD CAsyncUrlReader::ThreadProc()
{
- AfxSocketInit(NULL);
-
- DWORD cmd = GetRequest();
- if (cmd != CMD_INIT) {
- Reply((DWORD)E_FAIL);
- return (DWORD)-1;
- }
-
- try {
- CInternetSession is;
- CAutoPtr<CStdioFile> fin(is.OpenURL(m_url, 1, INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_NO_CACHE_WRITE));
-
- TCHAR path[_MAX_PATH], fn[_MAX_PATH];
- CFile fout;
- if (GetTempPath(_MAX_PATH, path) && GetTempFileName(path, _T("mpc_http"), 0, fn)
- && fout.Open(fn, modeCreate|modeWrite|shareDenyWrite|typeBinary)) {
- m_fn = fn;
-
- char buff[1024];
- int len = fin->Read(buff, sizeof(buff));
- if (len > 0) {
- fout.Write(buff, len);
- }
-
- Reply(S_OK);
-
- while (!CheckRequest(&cmd)) {
- int len = fin->Read(buff, sizeof(buff));
- if (len > 0) {
- fout.Write(buff, len);
- }
- }
- } else {
- Reply((DWORD)E_FAIL);
- }
-
- fin->Close(); // must close it because the destructor doesn't seem to do it and we will get an exception when "is" is destroying
- } catch (CInternetException* ie) {
- ie->Delete();
- Reply((DWORD)E_FAIL);
- }
-
- //
-
- cmd = GetRequest();
- ASSERT(cmd == CMD_EXIT);
- Reply(S_OK);
-
- //
-
- m_hThread = NULL;
-
- return S_OK;
+ AfxSocketInit(NULL);
+
+ DWORD cmd = GetRequest();
+ if (cmd != CMD_INIT) {
+ Reply((DWORD)E_FAIL);
+ return (DWORD) - 1;
+ }
+
+ try {
+ CInternetSession is;
+ CAutoPtr<CStdioFile> fin(is.OpenURL(m_url, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_CACHE_WRITE));
+
+ TCHAR path[_MAX_PATH], fn[_MAX_PATH];
+ CFile fout;
+ if (GetTempPath(_MAX_PATH, path) && GetTempFileName(path, _T("mpc_http"), 0, fn)
+ && fout.Open(fn, modeCreate | modeWrite | shareDenyWrite | typeBinary)) {
+ m_fn = fn;
+
+ char buff[1024];
+ int len = fin->Read(buff, sizeof(buff));
+ if (len > 0) {
+ fout.Write(buff, len);
+ }
+
+ Reply(S_OK);
+
+ while (!CheckRequest(&cmd)) {
+ int len = fin->Read(buff, sizeof(buff));
+ if (len > 0) {
+ fout.Write(buff, len);
+ }
+ }
+ } else {
+ Reply((DWORD)E_FAIL);
+ }
+
+ fin->Close(); // must close it because the destructor doesn't seem to do it and we will get an exception when "is" is destroying
+ } catch (CInternetException* ie) {
+ ie->Delete();
+ Reply((DWORD)E_FAIL);
+ }
+
+ //
+
+ cmd = GetRequest();
+ ASSERT(cmd == CMD_EXIT);
+ Reply(S_OK);
+
+ //
+
+ m_hThread = NULL;
+
+ return S_OK;
}
diff --git a/src/filters/parser/BaseSplitter/AsyncReader.h b/src/filters/parser/BaseSplitter/AsyncReader.h
index c41223421..3bac9b034 100644
--- a/src/filters/parser/BaseSplitter/AsyncReader.h
+++ b/src/filters/parser/BaseSplitter/AsyncReader.h
@@ -28,91 +28,91 @@
interface __declspec(uuid("6DDB4EE7-45A0-4459-A508-BD77B32C91B2"))
ISyncReader :
public IUnknown {
- STDMETHOD_(void, SetBreakEvent) (HANDLE hBreakEvent) = 0;
- STDMETHOD_(bool, HasErrors) () = 0;
- STDMETHOD_(void, ClearErrors) () = 0;
- STDMETHOD_(void, SetPTSOffset) (REFERENCE_TIME* rtPTSOffset) = 0;
+ STDMETHOD_(void, SetBreakEvent)(HANDLE hBreakEvent) = 0;
+ STDMETHOD_(bool, HasErrors)() = 0;
+ STDMETHOD_(void, ClearErrors)() = 0;
+ STDMETHOD_(void, SetPTSOffset)(REFERENCE_TIME * rtPTSOffset) = 0;
};
interface __declspec(uuid("7D55F67A-826E-40B9-8A7D-3DF0CBBD272D"))
IFileHandle :
public IUnknown {
- STDMETHOD_(HANDLE, GetFileHandle)() = 0;
- STDMETHOD_(LPCTSTR, GetFileName)() = 0;
+ STDMETHOD_(HANDLE, GetFileHandle)() = 0;
+ STDMETHOD_(LPCTSTR, GetFileName)() = 0;
};
class CAsyncFileReader : public CUnknown, public CMultiFiles, public IAsyncReader, public ISyncReader, public IFileHandle
{
protected:
- ULONGLONG m_len;
- HANDLE m_hBreakEvent;
- LONG m_lOsError; // CFileException::m_lOsError
+ ULONGLONG m_len;
+ HANDLE m_hBreakEvent;
+ LONG m_lOsError; // CFileException::m_lOsError
public:
- CAsyncFileReader(CString fn, HRESULT& hr);
- CAsyncFileReader(CAtlList<CHdmvClipInfo::PlaylistItem>& Items, HRESULT& hr);
-
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- // IAsyncReader
-
- STDMETHODIMP RequestAllocator(IMemAllocator* pPreferred, ALLOCATOR_PROPERTIES* pProps, IMemAllocator** ppActual) {
- return E_NOTIMPL;
- }
- STDMETHODIMP Request(IMediaSample* pSample, DWORD_PTR dwUser) {
- return E_NOTIMPL;
- }
- STDMETHODIMP WaitForNext(DWORD dwTimeout, IMediaSample** ppSample, DWORD_PTR* pdwUser) {
- return E_NOTIMPL;
- }
- STDMETHODIMP SyncReadAligned(IMediaSample* pSample) {
- return E_NOTIMPL;
- }
- STDMETHODIMP SyncRead(LONGLONG llPosition, LONG lLength, BYTE* pBuffer);
- STDMETHODIMP Length(LONGLONG* pTotal, LONGLONG* pAvailable);
- STDMETHODIMP BeginFlush() {
- return E_NOTIMPL;
- }
- STDMETHODIMP EndFlush() {
- return E_NOTIMPL;
- }
-
- // ISyncReader
-
- STDMETHODIMP_(void) SetBreakEvent(HANDLE hBreakEvent) {
- m_hBreakEvent = hBreakEvent;
- }
- STDMETHODIMP_(bool) HasErrors() {
- return m_lOsError != 0;
- }
- STDMETHODIMP_(void) ClearErrors() {
- m_lOsError = 0;
- }
- STDMETHODIMP_(void) SetPTSOffset (REFERENCE_TIME* rtPTSOffset) {
- m_pCurrentPTSOffset = rtPTSOffset;
- };
-
- // IFileHandle
-
- STDMETHODIMP_(HANDLE) GetFileHandle();
- STDMETHODIMP_(LPCTSTR) GetFileName();
+ CAsyncFileReader(CString fn, HRESULT& hr);
+ CAsyncFileReader(CAtlList<CHdmvClipInfo::PlaylistItem>& Items, HRESULT& hr);
+
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ // IAsyncReader
+
+ STDMETHODIMP RequestAllocator(IMemAllocator* pPreferred, ALLOCATOR_PROPERTIES* pProps, IMemAllocator** ppActual) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP Request(IMediaSample* pSample, DWORD_PTR dwUser) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP WaitForNext(DWORD dwTimeout, IMediaSample** ppSample, DWORD_PTR* pdwUser) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP SyncReadAligned(IMediaSample* pSample) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP SyncRead(LONGLONG llPosition, LONG lLength, BYTE* pBuffer);
+ STDMETHODIMP Length(LONGLONG* pTotal, LONGLONG* pAvailable);
+ STDMETHODIMP BeginFlush() {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP EndFlush() {
+ return E_NOTIMPL;
+ }
+
+ // ISyncReader
+
+ STDMETHODIMP_(void) SetBreakEvent(HANDLE hBreakEvent) {
+ m_hBreakEvent = hBreakEvent;
+ }
+ STDMETHODIMP_(bool) HasErrors() {
+ return m_lOsError != 0;
+ }
+ STDMETHODIMP_(void) ClearErrors() {
+ m_lOsError = 0;
+ }
+ STDMETHODIMP_(void) SetPTSOffset(REFERENCE_TIME* rtPTSOffset) {
+ m_pCurrentPTSOffset = rtPTSOffset;
+ };
+
+ // IFileHandle
+
+ STDMETHODIMP_(HANDLE) GetFileHandle();
+ STDMETHODIMP_(LPCTSTR) GetFileName();
};
class CAsyncUrlReader : public CAsyncFileReader, protected CAMThread
{
- CString m_url, m_fn;
+ CString m_url, m_fn;
protected:
- enum {CMD_EXIT, CMD_INIT};
- DWORD ThreadProc();
+ enum {CMD_EXIT, CMD_INIT};
+ DWORD ThreadProc();
public:
- CAsyncUrlReader(CString url, HRESULT& hr);
- virtual ~CAsyncUrlReader();
+ CAsyncUrlReader(CString url, HRESULT& hr);
+ virtual ~CAsyncUrlReader();
- // IAsyncReader
+ // IAsyncReader
- STDMETHODIMP Length(LONGLONG* pTotal, LONGLONG* pAvailable);
+ STDMETHODIMP Length(LONGLONG* pTotal, LONGLONG* pAvailable);
};
diff --git a/src/filters/parser/BaseSplitter/BaseSplitter.cpp b/src/filters/parser/BaseSplitter/BaseSplitter.cpp
index 4787c6222..4e71285e0 100644
--- a/src/filters/parser/BaseSplitter/BaseSplitter.cpp
+++ b/src/filters/parser/BaseSplitter/BaseSplitter.cpp
@@ -39,57 +39,57 @@ CPacketQueue::CPacketQueue() : m_size(0)
void CPacketQueue::Add(CAutoPtr<Packet> p)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- if (p) {
- m_size += p->GetDataSize();
+ if (p) {
+ m_size += p->GetDataSize();
- if (p->bAppendable && !p->bDiscontinuity && !p->pmt
- && p->rtStart == Packet::INVALID_TIME
- && !IsEmpty() && GetTail()->rtStart != Packet::INVALID_TIME) {
- Packet* tail = GetTail();
- size_t oldsize = tail->GetCount();
- size_t newsize = tail->GetCount() + p->GetCount();
- tail->SetCount(newsize, max(1024, (int)newsize)); // doubles the reserved buffer size
- memcpy(tail->GetData() + oldsize, p->GetData(), p->GetCount());
- /*
- GetTail()->Append(*p); // too slow
- */
- return;
- }
- }
+ if (p->bAppendable && !p->bDiscontinuity && !p->pmt
+ && p->rtStart == Packet::INVALID_TIME
+ && !IsEmpty() && GetTail()->rtStart != Packet::INVALID_TIME) {
+ Packet* tail = GetTail();
+ size_t oldsize = tail->GetCount();
+ size_t newsize = tail->GetCount() + p->GetCount();
+ tail->SetCount(newsize, max(1024, (int)newsize)); // doubles the reserved buffer size
+ memcpy(tail->GetData() + oldsize, p->GetData(), p->GetCount());
+ /*
+ GetTail()->Append(*p); // too slow
+ */
+ return;
+ }
+ }
- AddTail(p);
+ AddTail(p);
}
CAutoPtr<Packet> CPacketQueue::Remove()
{
- CAutoLock cAutoLock(this);
- ASSERT(__super::GetCount() > 0);
- CAutoPtr<Packet> p = RemoveHead();
- if (p) {
- m_size -= p->GetDataSize();
- }
- return p;
+ CAutoLock cAutoLock(this);
+ ASSERT(__super::GetCount() > 0);
+ CAutoPtr<Packet> p = RemoveHead();
+ if (p) {
+ m_size -= p->GetDataSize();
+ }
+ return p;
}
void CPacketQueue::RemoveAll()
{
- CAutoLock cAutoLock(this);
- m_size = 0;
- __super::RemoveAll();
+ CAutoLock cAutoLock(this);
+ m_size = 0;
+ __super::RemoveAll();
}
int CPacketQueue::GetCount()
{
- CAutoLock cAutoLock(this);
- return (int)__super::GetCount();
+ CAutoLock cAutoLock(this);
+ return (int)__super::GetCount();
}
int CPacketQueue::GetSize()
{
- CAutoLock cAutoLock(this);
- return m_size;
+ CAutoLock cAutoLock(this);
+ return m_size;
}
//
@@ -97,7 +97,7 @@ int CPacketQueue::GetSize()
//
CBaseSplitterInputPin::CBaseSplitterInputPin(TCHAR* pName, CBaseSplitterFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBasePin(pName, pFilter, pLock, phr, L"Input", PINDIR_INPUT)
+ : CBasePin(pName, pFilter, pLock, phr, L"Input", PINDIR_INPUT)
{
}
@@ -107,85 +107,85 @@ CBaseSplitterInputPin::~CBaseSplitterInputPin()
HRESULT CBaseSplitterInputPin::GetAsyncReader(IAsyncReader** ppAsyncReader)
{
- CheckPointer(ppAsyncReader, E_POINTER);
- *ppAsyncReader = NULL;
- CheckPointer(m_pAsyncReader, VFW_E_NOT_CONNECTED);
- (*ppAsyncReader = m_pAsyncReader)->AddRef();
- return S_OK;
+ CheckPointer(ppAsyncReader, E_POINTER);
+ *ppAsyncReader = NULL;
+ CheckPointer(m_pAsyncReader, VFW_E_NOT_CONNECTED);
+ (*ppAsyncReader = m_pAsyncReader)->AddRef();
+ return S_OK;
}
STDMETHODIMP CBaseSplitterInputPin::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CBaseSplitterInputPin::CheckMediaType(const CMediaType* pmt)
{
- return S_OK;
- /*
- return pmt->majortype == MEDIATYPE_Stream
- ? S_OK
- : E_INVALIDARG;
- */
+ return S_OK;
+ /*
+ return pmt->majortype == MEDIATYPE_Stream
+ ? S_OK
+ : E_INVALIDARG;
+ */
}
HRESULT CBaseSplitterInputPin::CheckConnect(IPin* pPin)
{
- HRESULT hr;
- if (FAILED(hr = __super::CheckConnect(pPin))) {
- return hr;
- }
+ HRESULT hr;
+ if (FAILED(hr = __super::CheckConnect(pPin))) {
+ return hr;
+ }
- return CComQIPtr<IAsyncReader>(pPin) ? S_OK : E_NOINTERFACE;
+ return CComQIPtr<IAsyncReader>(pPin) ? S_OK : E_NOINTERFACE;
}
HRESULT CBaseSplitterInputPin::BreakConnect()
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::BreakConnect())) {
- return hr;
- }
+ if (FAILED(hr = __super::BreakConnect())) {
+ return hr;
+ }
- if (FAILED(hr = (static_cast<CBaseSplitterFilter*>(m_pFilter))->BreakConnect(PINDIR_INPUT, this))) {
- return hr;
- }
+ if (FAILED(hr = (static_cast<CBaseSplitterFilter*>(m_pFilter))->BreakConnect(PINDIR_INPUT, this))) {
+ return hr;
+ }
- m_pAsyncReader.Release();
+ m_pAsyncReader.Release();
- return S_OK;
+ return S_OK;
}
HRESULT CBaseSplitterInputPin::CompleteConnect(IPin* pPin)
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::CompleteConnect(pPin))) {
- return hr;
- }
+ if (FAILED(hr = __super::CompleteConnect(pPin))) {
+ return hr;
+ }
- CheckPointer(pPin, E_POINTER);
- m_pAsyncReader = pPin;
- CheckPointer(m_pAsyncReader, E_NOINTERFACE);
+ CheckPointer(pPin, E_POINTER);
+ m_pAsyncReader = pPin;
+ CheckPointer(m_pAsyncReader, E_NOINTERFACE);
- if (FAILED(hr = (static_cast<CBaseSplitterFilter*>(m_pFilter))->CompleteConnect(PINDIR_INPUT, this))) {
- return hr;
- }
+ if (FAILED(hr = (static_cast<CBaseSplitterFilter*>(m_pFilter))->CompleteConnect(PINDIR_INPUT, this))) {
+ return hr;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CBaseSplitterInputPin::BeginFlush()
{
- return E_UNEXPECTED;
+ return E_UNEXPECTED;
}
STDMETHODIMP CBaseSplitterInputPin::EndFlush()
{
- return E_UNEXPECTED;
+ return E_UNEXPECTED;
}
//
@@ -193,28 +193,28 @@ STDMETHODIMP CBaseSplitterInputPin::EndFlush()
//
CBaseSplitterOutputPin::CBaseSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr, int nBuffers, int QueueMaxPackets)
- : CBaseOutputPin(NAME("CBaseSplitterOutputPin"), pFilter, pLock, phr, pName)
- , m_hrDeliver(S_OK) // just in case it were asked before the worker thread could be created and reset it
- , m_fFlushing(false)
- , m_eEndFlush(TRUE)
- , m_QueueMaxPackets(QueueMaxPackets)
+ : CBaseOutputPin(NAME("CBaseSplitterOutputPin"), pFilter, pLock, phr, pName)
+ , m_hrDeliver(S_OK) // just in case it were asked before the worker thread could be created and reset it
+ , m_fFlushing(false)
+ , m_eEndFlush(TRUE)
+ , m_QueueMaxPackets(QueueMaxPackets)
{
- m_mts.Copy(mts);
- m_nBuffers = max(nBuffers, 1);
- memset(&m_brs, 0, sizeof(m_brs));
- m_brs.rtLastDeliverTime = Packet::INVALID_TIME;
+ m_mts.Copy(mts);
+ m_nBuffers = max(nBuffers, 1);
+ memset(&m_brs, 0, sizeof(m_brs));
+ m_brs.rtLastDeliverTime = Packet::INVALID_TIME;
}
CBaseSplitterOutputPin::CBaseSplitterOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr, int nBuffers, int QueueMaxPackets)
- : CBaseOutputPin(NAME("CBaseSplitterOutputPin"), pFilter, pLock, phr, pName)
- , m_hrDeliver(S_OK) // just in case it were asked before the worker thread could be created and reset it
- , m_fFlushing(false)
- , m_eEndFlush(TRUE)
- , m_QueueMaxPackets(QueueMaxPackets)
+ : CBaseOutputPin(NAME("CBaseSplitterOutputPin"), pFilter, pLock, phr, pName)
+ , m_hrDeliver(S_OK) // just in case it were asked before the worker thread could be created and reset it
+ , m_fFlushing(false)
+ , m_eEndFlush(TRUE)
+ , m_QueueMaxPackets(QueueMaxPackets)
{
- m_nBuffers = max(nBuffers, 1);
- memset(&m_brs, 0, sizeof(m_brs));
- m_brs.rtLastDeliverTime = Packet::INVALID_TIME;
+ m_nBuffers = max(nBuffers, 1);
+ memset(&m_brs, 0, sizeof(m_brs));
+ m_brs.rtLastDeliverTime = Packet::INVALID_TIME;
}
CBaseSplitterOutputPin::~CBaseSplitterOutputPin()
@@ -223,549 +223,549 @@ CBaseSplitterOutputPin::~CBaseSplitterOutputPin()
STDMETHODIMP CBaseSplitterOutputPin::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- // riid == __uuidof(IMediaSeeking) ? m_pFilter->QueryInterface(riid, ppv) :
- QI(IMediaSeeking)
- QI(IPropertyBag)
- QI(IPropertyBag2)
- QI(IDSMPropertyBag)
- QI(IBitRateInfo)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ // riid == __uuidof(IMediaSeeking) ? m_pFilter->QueryInterface(riid, ppv) :
+ QI(IMediaSeeking)
+ QI(IPropertyBag)
+ QI(IPropertyBag2)
+ QI(IDSMPropertyBag)
+ QI(IBitRateInfo)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CBaseSplitterOutputPin::SetName(LPCWSTR pName)
{
- CheckPointer(pName, E_POINTER);
- if (m_pName) {
- delete [] m_pName;
- }
- m_pName = DNew WCHAR[wcslen(pName)+1];
- CheckPointer(m_pName, E_OUTOFMEMORY);
- wcscpy_s(m_pName, wcslen(pName) + 1, pName);
- return S_OK;
+ CheckPointer(pName, E_POINTER);
+ if (m_pName) {
+ delete [] m_pName;
+ }
+ m_pName = DNew WCHAR[wcslen(pName) + 1];
+ CheckPointer(m_pName, E_OUTOFMEMORY);
+ wcscpy_s(m_pName, wcslen(pName) + 1, pName);
+ return S_OK;
}
HRESULT CBaseSplitterOutputPin::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties)
{
- ASSERT(pAlloc);
- ASSERT(pProperties);
+ ASSERT(pAlloc);
+ ASSERT(pProperties);
- HRESULT hr = NOERROR;
+ HRESULT hr = NOERROR;
- pProperties->cBuffers = max(pProperties->cBuffers, m_nBuffers);
- pProperties->cbBuffer = max(m_mt.lSampleSize, 1);
+ pProperties->cBuffers = max(pProperties->cBuffers, m_nBuffers);
+ pProperties->cbBuffer = max(m_mt.lSampleSize, 1);
- // TODO: is this still needed ?
- if (m_mt.subtype == MEDIASUBTYPE_Vorbis && m_mt.formattype == FORMAT_VorbisFormat) {
- // oh great, the oggds vorbis decoder assumes there will be two at least, stupid thing...
- pProperties->cBuffers = max(pProperties->cBuffers, 2);
- }
+ // TODO: is this still needed ?
+ if (m_mt.subtype == MEDIASUBTYPE_Vorbis && m_mt.formattype == FORMAT_VorbisFormat) {
+ // oh great, the oggds vorbis decoder assumes there will be two at least, stupid thing...
+ pProperties->cBuffers = max(pProperties->cBuffers, 2);
+ }
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- if (Actual.cbBuffer < pProperties->cbBuffer) {
- return E_FAIL;
- }
- ASSERT(Actual.cBuffers == pProperties->cBuffers);
+ if (Actual.cbBuffer < pProperties->cbBuffer) {
+ return E_FAIL;
+ }
+ ASSERT(Actual.cBuffers == pProperties->cBuffers);
- return NOERROR;
+ return NOERROR;
}
HRESULT CBaseSplitterOutputPin::CheckMediaType(const CMediaType* pmt)
{
- for (size_t i = 0; i < m_mts.GetCount(); i++) {
- if (*pmt == m_mts[i]) {
- return S_OK;
- }
- }
+ for (size_t i = 0; i < m_mts.GetCount(); i++) {
+ if (*pmt == m_mts[i]) {
+ return S_OK;
+ }
+ }
- return E_INVALIDARG;
+ return E_INVALIDARG;
}
HRESULT CBaseSplitterOutputPin::GetMediaType(int iPosition, CMediaType* pmt)
{
- CAutoLock cAutoLock(m_pLock);
+ CAutoLock cAutoLock(m_pLock);
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if ((size_t)iPosition >= m_mts.GetCount()) {
- return VFW_S_NO_MORE_ITEMS;
- }
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if ((size_t)iPosition >= m_mts.GetCount()) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
- *pmt = m_mts[iPosition];
+ *pmt = m_mts[iPosition];
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CBaseSplitterOutputPin::Notify(IBaseFilter* pSender, Quality q)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
//
HRESULT CBaseSplitterOutputPin::Active()
{
- CAutoLock cAutoLock(m_pLock);
+ CAutoLock cAutoLock(m_pLock);
- if (m_Connected) {
- Create();
- }
+ if (m_Connected) {
+ Create();
+ }
- return __super::Active();
+ return __super::Active();
}
HRESULT CBaseSplitterOutputPin::Inactive()
{
- CAutoLock cAutoLock(m_pLock);
+ CAutoLock cAutoLock(m_pLock);
- if (ThreadExists()) {
- CallWorker(CMD_EXIT);
- }
+ if (ThreadExists()) {
+ CallWorker(CMD_EXIT);
+ }
- return __super::Inactive();
+ return __super::Inactive();
}
HRESULT CBaseSplitterOutputPin::DeliverBeginFlush()
{
- m_eEndFlush.Reset();
- m_fFlushed = false;
- m_fFlushing = true;
- m_hrDeliver = S_FALSE;
- m_queue.RemoveAll();
- HRESULT hr = IsConnected() ? GetConnected()->BeginFlush() : S_OK;
- if (S_OK != hr) {
- m_eEndFlush.Set();
- }
- return hr;
+ m_eEndFlush.Reset();
+ m_fFlushed = false;
+ m_fFlushing = true;
+ m_hrDeliver = S_FALSE;
+ m_queue.RemoveAll();
+ HRESULT hr = IsConnected() ? GetConnected()->BeginFlush() : S_OK;
+ if (S_OK != hr) {
+ m_eEndFlush.Set();
+ }
+ return hr;
}
HRESULT CBaseSplitterOutputPin::DeliverEndFlush()
{
- if (!ThreadExists()) {
- return S_FALSE;
- }
- HRESULT hr = IsConnected() ? GetConnected()->EndFlush() : S_OK;
- m_hrDeliver = S_OK;
- m_fFlushing = false;
- m_fFlushed = true;
- m_eEndFlush.Set();
- return hr;
+ if (!ThreadExists()) {
+ return S_FALSE;
+ }
+ HRESULT hr = IsConnected() ? GetConnected()->EndFlush() : S_OK;
+ m_hrDeliver = S_OK;
+ m_fFlushing = false;
+ m_fFlushed = true;
+ m_eEndFlush.Set();
+ return hr;
}
HRESULT CBaseSplitterOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- m_brs.rtLastDeliverTime = Packet::INVALID_TIME;
- if (m_fFlushing) {
- return S_FALSE;
- }
- m_rtStart = tStart;
- if (!ThreadExists()) {
- return S_FALSE;
- }
- HRESULT hr = __super::DeliverNewSegment(tStart, tStop, dRate);
- if (S_OK != hr) {
- return hr;
- }
- MakeISCRHappy();
- return hr;
+ m_brs.rtLastDeliverTime = Packet::INVALID_TIME;
+ if (m_fFlushing) {
+ return S_FALSE;
+ }
+ m_rtStart = tStart;
+ if (!ThreadExists()) {
+ return S_FALSE;
+ }
+ HRESULT hr = __super::DeliverNewSegment(tStart, tStop, dRate);
+ if (S_OK != hr) {
+ return hr;
+ }
+ MakeISCRHappy();
+ return hr;
}
int CBaseSplitterOutputPin::QueueCount()
{
- return m_queue.GetCount();
+ return m_queue.GetCount();
}
int CBaseSplitterOutputPin::QueueSize()
{
- return m_queue.GetSize();
+ return m_queue.GetSize();
}
HRESULT CBaseSplitterOutputPin::QueueEndOfStream()
{
- return QueuePacket(CAutoPtr<Packet>()); // NULL means EndOfStream
+ return QueuePacket(CAutoPtr<Packet>()); // NULL means EndOfStream
}
HRESULT CBaseSplitterOutputPin::QueuePacket(CAutoPtr<Packet> p)
{
- if (!ThreadExists()) {
- return S_FALSE;
- }
+ if (!ThreadExists()) {
+ return S_FALSE;
+ }
- while (S_OK == m_hrDeliver
- && ((m_queue.GetCount() > (m_QueueMaxPackets*3/2) || m_queue.GetSize() > (MAXPACKETSIZE*3/2))
- || ((m_queue.GetCount() > m_QueueMaxPackets || m_queue.GetSize() > MAXPACKETSIZE) && !(static_cast<CBaseSplitterFilter*>(m_pFilter))->IsAnyPinDrying()))) {
- Sleep(10);
- }
+ while (S_OK == m_hrDeliver
+ && ((m_queue.GetCount() > (m_QueueMaxPackets * 3 / 2) || m_queue.GetSize() > (MAXPACKETSIZE * 3 / 2))
+ || ((m_queue.GetCount() > m_QueueMaxPackets || m_queue.GetSize() > MAXPACKETSIZE) && !(static_cast<CBaseSplitterFilter*>(m_pFilter))->IsAnyPinDrying()))) {
+ Sleep(10);
+ }
- if (S_OK != m_hrDeliver) {
- return m_hrDeliver;
- }
+ if (S_OK != m_hrDeliver) {
+ return m_hrDeliver;
+ }
- m_queue.Add(p);
+ m_queue.Add(p);
- return m_hrDeliver;
+ return m_hrDeliver;
}
bool CBaseSplitterOutputPin::IsDiscontinuous()
{
- return m_mt.majortype == MEDIATYPE_Text
- || m_mt.majortype == MEDIATYPE_ScriptCommand
- || m_mt.majortype == MEDIATYPE_Subtitle
- || m_mt.subtype == MEDIASUBTYPE_DVD_SUBPICTURE
- || m_mt.subtype == MEDIASUBTYPE_CVD_SUBPICTURE
- || m_mt.subtype == MEDIASUBTYPE_SVCD_SUBPICTURE;
+ return m_mt.majortype == MEDIATYPE_Text
+ || m_mt.majortype == MEDIATYPE_ScriptCommand
+ || m_mt.majortype == MEDIATYPE_Subtitle
+ || m_mt.subtype == MEDIASUBTYPE_DVD_SUBPICTURE
+ || m_mt.subtype == MEDIASUBTYPE_CVD_SUBPICTURE
+ || m_mt.subtype == MEDIASUBTYPE_SVCD_SUBPICTURE;
}
bool CBaseSplitterOutputPin::IsActive()
{
- CComPtr<IPin> pPin = this;
- do {
- CComPtr<IPin> pPinTo;
- CComQIPtr<IStreamSwitcherInputPin> pSSIP;
- if (S_OK == pPin->ConnectedTo(&pPinTo) && (pSSIP = pPinTo) && !pSSIP->IsActive()) {
- return false;
- }
- pPin = GetFirstPin(GetFilterFromPin(pPinTo), PINDIR_OUTPUT);
- } while (pPin);
+ CComPtr<IPin> pPin = this;
+ do {
+ CComPtr<IPin> pPinTo;
+ CComQIPtr<IStreamSwitcherInputPin> pSSIP;
+ if (S_OK == pPin->ConnectedTo(&pPinTo) && (pSSIP = pPinTo) && !pSSIP->IsActive()) {
+ return false;
+ }
+ pPin = GetFirstPin(GetFilterFromPin(pPinTo), PINDIR_OUTPUT);
+ } while (pPin);
- return true;
+ return true;
}
DWORD CBaseSplitterOutputPin::ThreadProc()
{
- SetThreadName((DWORD)-1, "CBaseSplitterOutputPin");
- m_hrDeliver = S_OK;
- m_fFlushing = m_fFlushed = false;
- m_eEndFlush.Set();
-
- // fix for Microsoft DTV-DVD Video Decoder - video freeze after STOP/PLAY
- bool iHaaliRenderConnect = false;
- CComPtr<IPin> pPinTo = this, pTmp;
- while (pPinTo && SUCCEEDED(pPinTo->ConnectedTo(&pTmp)) && (pPinTo = pTmp)) {
- pTmp = NULL;
- CComPtr<IBaseFilter> pBF = GetFilterFromPin(pPinTo);
- if (GetCLSID(pBF) == CLSID_DXR) { // Haali Renderer
- iHaaliRenderConnect = true;
- break;
- }
- pPinTo = GetFirstPin(pBF, PINDIR_OUTPUT);
- }
- if (IsConnected() && !iHaaliRenderConnect) {
- GetConnected()->BeginFlush();
- GetConnected()->EndFlush();
- }
-
- for (;;) {
- Sleep(1);
-
- DWORD cmd;
- if (CheckRequest(&cmd)) {
- m_hThread = NULL;
- cmd = GetRequest();
- Reply(S_OK);
- ASSERT(cmd == CMD_EXIT);
- return 0;
- }
-
- int cnt = 0;
- do {
- CAutoPtr<Packet> p;
-
- {
- CAutoLock cAutoLock(&m_queue);
- if ((cnt = m_queue.GetCount()) > 0) {
- p = m_queue.Remove();
- }
- }
-
- if (S_OK == m_hrDeliver && cnt > 0) {
- ASSERT(!m_fFlushing);
-
- m_fFlushed = false;
-
- // flushing can still start here, to release a blocked deliver call
-
- HRESULT hr = p
- ? DeliverPacket(p)
- : DeliverEndOfStream();
-
- m_eEndFlush.Wait(); // .. so we have to wait until it is done
-
- if (hr != S_OK && !m_fFlushed) { // and only report the error in m_hrDeliver if we didn't flush the stream
- // CAutoLock cAutoLock(&m_csQueueLock);
- m_hrDeliver = hr;
- break;
- }
- }
- } while (--cnt > 0);
- }
+ SetThreadName((DWORD) - 1, "CBaseSplitterOutputPin");
+ m_hrDeliver = S_OK;
+ m_fFlushing = m_fFlushed = false;
+ m_eEndFlush.Set();
+
+ // fix for Microsoft DTV-DVD Video Decoder - video freeze after STOP/PLAY
+ bool iHaaliRenderConnect = false;
+ CComPtr<IPin> pPinTo = this, pTmp;
+ while (pPinTo && SUCCEEDED(pPinTo->ConnectedTo(&pTmp)) && (pPinTo = pTmp)) {
+ pTmp = NULL;
+ CComPtr<IBaseFilter> pBF = GetFilterFromPin(pPinTo);
+ if (GetCLSID(pBF) == CLSID_DXR) { // Haali Renderer
+ iHaaliRenderConnect = true;
+ break;
+ }
+ pPinTo = GetFirstPin(pBF, PINDIR_OUTPUT);
+ }
+ if (IsConnected() && !iHaaliRenderConnect) {
+ GetConnected()->BeginFlush();
+ GetConnected()->EndFlush();
+ }
+
+ for (;;) {
+ Sleep(1);
+
+ DWORD cmd;
+ if (CheckRequest(&cmd)) {
+ m_hThread = NULL;
+ cmd = GetRequest();
+ Reply(S_OK);
+ ASSERT(cmd == CMD_EXIT);
+ return 0;
+ }
+
+ int cnt = 0;
+ do {
+ CAutoPtr<Packet> p;
+
+ {
+ CAutoLock cAutoLock(&m_queue);
+ if ((cnt = m_queue.GetCount()) > 0) {
+ p = m_queue.Remove();
+ }
+ }
+
+ if (S_OK == m_hrDeliver && cnt > 0) {
+ ASSERT(!m_fFlushing);
+
+ m_fFlushed = false;
+
+ // flushing can still start here, to release a blocked deliver call
+
+ HRESULT hr = p
+ ? DeliverPacket(p)
+ : DeliverEndOfStream();
+
+ m_eEndFlush.Wait(); // .. so we have to wait until it is done
+
+ if (hr != S_OK && !m_fFlushed) { // and only report the error in m_hrDeliver if we didn't flush the stream
+ // CAutoLock cAutoLock(&m_csQueueLock);
+ m_hrDeliver = hr;
+ break;
+ }
+ }
+ } while (--cnt > 0);
+ }
}
HRESULT CBaseSplitterOutputPin::DeliverPacket(CAutoPtr<Packet> p)
{
- HRESULT hr;
-
- long nBytes = (long)p->GetCount();
-
- if (nBytes == 0) {
- return S_OK;
- }
-
- m_brs.nBytesSinceLastDeliverTime += nBytes;
-
- if (p->rtStart != Packet::INVALID_TIME) {
- if (m_brs.rtLastDeliverTime == Packet::INVALID_TIME) {
- m_brs.rtLastDeliverTime = p->rtStart;
- m_brs.nBytesSinceLastDeliverTime = 0;
- }
-
- if (m_brs.rtLastDeliverTime + 10000000 < p->rtStart) {
- REFERENCE_TIME rtDiff = p->rtStart - m_brs.rtLastDeliverTime;
-
- double secs, bits;
-
- secs = (double)rtDiff / 10000000;
- bits = 8.0 * m_brs.nBytesSinceLastDeliverTime;
- m_brs.nCurrentBitRate = (DWORD)(bits / secs);
-
- m_brs.rtTotalTimeDelivered += rtDiff;
- m_brs.nTotalBytesDelivered += m_brs.nBytesSinceLastDeliverTime;
-
- secs = (double)m_brs.rtTotalTimeDelivered / 10000000;
- bits = 8.0 * m_brs.nTotalBytesDelivered;
- m_brs.nAverageBitRate = (DWORD)(bits / secs);
-
- m_brs.rtLastDeliverTime = p->rtStart;
- m_brs.nBytesSinceLastDeliverTime = 0;
- /*
- TRACE(_T("[%d] c: %d kbps, a: %d kbps\n"),
- p->TrackNumber,
- (m_brs.nCurrentBitRate+500)/1000,
- (m_brs.nAverageBitRate+500)/1000);
- */
- }
-
- double dRate = 1.0;
- if (SUCCEEDED((static_cast<CBaseSplitterFilter*>(m_pFilter))->GetRate(&dRate))) {
- p->rtStart = (REFERENCE_TIME)((double)p->rtStart / dRate);
- p->rtStop = (REFERENCE_TIME)((double)p->rtStop / dRate);
- }
- }
-
- do {
- CComPtr<IMediaSample> pSample;
- if (S_OK != (hr = GetDeliveryBuffer(&pSample, NULL, NULL, 0))) {
- break;
- }
-
- if (nBytes > pSample->GetSize()) {
- pSample.Release();
-
- ALLOCATOR_PROPERTIES props, actual;
- if (S_OK != (hr = m_pAllocator->GetProperties(&props))) {
- break;
- }
- props.cbBuffer = nBytes*3/2;
-
- if (props.cBuffers > 1) {
- if (S_OK != (hr = __super::DeliverBeginFlush())) {
- break;
- }
- if (S_OK != (hr = __super::DeliverEndFlush())) {
- break;
- }
- }
-
- if (S_OK != (hr = m_pAllocator->Decommit())) {
- break;
- }
- if (S_OK != (hr = m_pAllocator->SetProperties(&props, &actual))) {
- break;
- }
- if (S_OK != (hr = m_pAllocator->Commit())) {
- break;
- }
- if (S_OK != (hr = GetDeliveryBuffer(&pSample, NULL, NULL, 0))) {
- break;
- }
- }
-
- if (p->pmt) {
- pSample->SetMediaType(p->pmt);
- p->bDiscontinuity = true;
-
- CAutoLock cAutoLock(m_pLock);
- m_mts.RemoveAll();
- m_mts.Add(*p->pmt);
- }
-
- bool fTimeValid = p->rtStart != Packet::INVALID_TIME;
+ HRESULT hr;
+
+ long nBytes = (long)p->GetCount();
+
+ if (nBytes == 0) {
+ return S_OK;
+ }
+
+ m_brs.nBytesSinceLastDeliverTime += nBytes;
+
+ if (p->rtStart != Packet::INVALID_TIME) {
+ if (m_brs.rtLastDeliverTime == Packet::INVALID_TIME) {
+ m_brs.rtLastDeliverTime = p->rtStart;
+ m_brs.nBytesSinceLastDeliverTime = 0;
+ }
+
+ if (m_brs.rtLastDeliverTime + 10000000 < p->rtStart) {
+ REFERENCE_TIME rtDiff = p->rtStart - m_brs.rtLastDeliverTime;
+
+ double secs, bits;
+
+ secs = (double)rtDiff / 10000000;
+ bits = 8.0 * m_brs.nBytesSinceLastDeliverTime;
+ m_brs.nCurrentBitRate = (DWORD)(bits / secs);
+
+ m_brs.rtTotalTimeDelivered += rtDiff;
+ m_brs.nTotalBytesDelivered += m_brs.nBytesSinceLastDeliverTime;
+
+ secs = (double)m_brs.rtTotalTimeDelivered / 10000000;
+ bits = 8.0 * m_brs.nTotalBytesDelivered;
+ m_brs.nAverageBitRate = (DWORD)(bits / secs);
+
+ m_brs.rtLastDeliverTime = p->rtStart;
+ m_brs.nBytesSinceLastDeliverTime = 0;
+ /*
+ TRACE(_T("[%d] c: %d kbps, a: %d kbps\n"),
+ p->TrackNumber,
+ (m_brs.nCurrentBitRate+500)/1000,
+ (m_brs.nAverageBitRate+500)/1000);
+ */
+ }
+
+ double dRate = 1.0;
+ if (SUCCEEDED((static_cast<CBaseSplitterFilter*>(m_pFilter))->GetRate(&dRate))) {
+ p->rtStart = (REFERENCE_TIME)((double)p->rtStart / dRate);
+ p->rtStop = (REFERENCE_TIME)((double)p->rtStop / dRate);
+ }
+ }
+
+ do {
+ CComPtr<IMediaSample> pSample;
+ if (S_OK != (hr = GetDeliveryBuffer(&pSample, NULL, NULL, 0))) {
+ break;
+ }
+
+ if (nBytes > pSample->GetSize()) {
+ pSample.Release();
+
+ ALLOCATOR_PROPERTIES props, actual;
+ if (S_OK != (hr = m_pAllocator->GetProperties(&props))) {
+ break;
+ }
+ props.cbBuffer = nBytes * 3 / 2;
+
+ if (props.cBuffers > 1) {
+ if (S_OK != (hr = __super::DeliverBeginFlush())) {
+ break;
+ }
+ if (S_OK != (hr = __super::DeliverEndFlush())) {
+ break;
+ }
+ }
+
+ if (S_OK != (hr = m_pAllocator->Decommit())) {
+ break;
+ }
+ if (S_OK != (hr = m_pAllocator->SetProperties(&props, &actual))) {
+ break;
+ }
+ if (S_OK != (hr = m_pAllocator->Commit())) {
+ break;
+ }
+ if (S_OK != (hr = GetDeliveryBuffer(&pSample, NULL, NULL, 0))) {
+ break;
+ }
+ }
+
+ if (p->pmt) {
+ pSample->SetMediaType(p->pmt);
+ p->bDiscontinuity = true;
+
+ CAutoLock cAutoLock(m_pLock);
+ m_mts.RemoveAll();
+ m_mts.Add(*p->pmt);
+ }
+
+ bool fTimeValid = p->rtStart != Packet::INVALID_TIME;
#if defined(_DEBUG) && 0
- TRACE(_T("[%d]: d%d s%d p%d, b=%d, [%20I64d - %20I64d]\n"),
- p->TrackNumber,
- p->bDiscontinuity, p->bSyncPoint, fTimeValid && p->rtStart < 0,
- nBytes, p->rtStart, p->rtStop);
+ TRACE(_T("[%d]: d%d s%d p%d, b=%d, [%20I64d - %20I64d]\n"),
+ p->TrackNumber,
+ p->bDiscontinuity, p->bSyncPoint, fTimeValid && p->rtStart < 0,
+ nBytes, p->rtStart, p->rtStop);
#endif
- ASSERT(!p->bSyncPoint || fTimeValid);
-
- BYTE* pData = NULL;
- if (S_OK != (hr = pSample->GetPointer(&pData)) || !pData) {
- break;
- }
- memcpy(pData, p->GetData(), nBytes);
- if (S_OK != (hr = pSample->SetActualDataLength(nBytes))) {
- break;
- }
- if (S_OK != (hr = pSample->SetTime(fTimeValid ? &p->rtStart : NULL, fTimeValid ? &p->rtStop : NULL))) {
- break;
- }
- if (S_OK != (hr = pSample->SetMediaTime(NULL, NULL))) {
- break;
- }
- if (S_OK != (hr = pSample->SetDiscontinuity(p->bDiscontinuity))) {
- break;
- }
- if (S_OK != (hr = pSample->SetSyncPoint(p->bSyncPoint))) {
- break;
- }
- if (S_OK != (hr = pSample->SetPreroll(fTimeValid && p->rtStart < 0))) {
- break;
- }
- if (S_OK != (hr = Deliver(pSample))) {
- break;
- }
- } while (false);
-
- return hr;
+ ASSERT(!p->bSyncPoint || fTimeValid);
+
+ BYTE* pData = NULL;
+ if (S_OK != (hr = pSample->GetPointer(&pData)) || !pData) {
+ break;
+ }
+ memcpy(pData, p->GetData(), nBytes);
+ if (S_OK != (hr = pSample->SetActualDataLength(nBytes))) {
+ break;
+ }
+ if (S_OK != (hr = pSample->SetTime(fTimeValid ? &p->rtStart : NULL, fTimeValid ? &p->rtStop : NULL))) {
+ break;
+ }
+ if (S_OK != (hr = pSample->SetMediaTime(NULL, NULL))) {
+ break;
+ }
+ if (S_OK != (hr = pSample->SetDiscontinuity(p->bDiscontinuity))) {
+ break;
+ }
+ if (S_OK != (hr = pSample->SetSyncPoint(p->bSyncPoint))) {
+ break;
+ }
+ if (S_OK != (hr = pSample->SetPreroll(fTimeValid && p->rtStart < 0))) {
+ break;
+ }
+ if (S_OK != (hr = Deliver(pSample))) {
+ break;
+ }
+ } while (false);
+
+ return hr;
}
void CBaseSplitterOutputPin::MakeISCRHappy()
{
- CComPtr<IPin> pPinTo = this, pTmp;
- while (pPinTo && SUCCEEDED(pPinTo->ConnectedTo(&pTmp)) && (pPinTo = pTmp)) {
- pTmp = NULL;
+ CComPtr<IPin> pPinTo = this, pTmp;
+ while (pPinTo && SUCCEEDED(pPinTo->ConnectedTo(&pTmp)) && (pPinTo = pTmp)) {
+ pTmp = NULL;
- CComPtr<IBaseFilter> pBF = GetFilterFromPin(pPinTo);
+ CComPtr<IBaseFilter> pBF = GetFilterFromPin(pPinTo);
- if (GetCLSID(pBF) == GUIDFromCString(_T("{48025243-2D39-11CE-875D-00608CB78066}"))) { // ISCR
- CAutoPtr<Packet> p(DNew Packet());
- p->TrackNumber = (DWORD)-1;
- p->rtStart = -1;
- p->rtStop = 0;
- p->bSyncPoint = FALSE;
- p->SetData(" ", 2);
- QueuePacket(p);
- break;
- }
+ if (GetCLSID(pBF) == GUIDFromCString(_T("{48025243-2D39-11CE-875D-00608CB78066}"))) { // ISCR
+ CAutoPtr<Packet> p(DNew Packet());
+ p->TrackNumber = (DWORD) - 1;
+ p->rtStart = -1;
+ p->rtStop = 0;
+ p->bSyncPoint = FALSE;
+ p->SetData(" ", 2);
+ QueuePacket(p);
+ break;
+ }
- pPinTo = GetFirstPin(pBF, PINDIR_OUTPUT);
- }
+ pPinTo = GetFirstPin(pBF, PINDIR_OUTPUT);
+ }
}
HRESULT CBaseSplitterOutputPin::GetDeliveryBuffer(IMediaSample** ppSample, REFERENCE_TIME* pStartTime, REFERENCE_TIME* pEndTime, DWORD dwFlags)
{
- return __super::GetDeliveryBuffer(ppSample, pStartTime, pEndTime, dwFlags);
+ return __super::GetDeliveryBuffer(ppSample, pStartTime, pEndTime, dwFlags);
}
HRESULT CBaseSplitterOutputPin::Deliver(IMediaSample* pSample)
{
- return __super::Deliver(pSample);
+ return __super::Deliver(pSample);
}
// IMediaSeeking
STDMETHODIMP CBaseSplitterOutputPin::GetCapabilities(DWORD* pCapabilities)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetCapabilities(pCapabilities);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetCapabilities(pCapabilities);
}
STDMETHODIMP CBaseSplitterOutputPin::CheckCapabilities(DWORD* pCapabilities)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->CheckCapabilities(pCapabilities);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->CheckCapabilities(pCapabilities);
}
STDMETHODIMP CBaseSplitterOutputPin::IsFormatSupported(const GUID* pFormat)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->IsFormatSupported(pFormat);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->IsFormatSupported(pFormat);
}
STDMETHODIMP CBaseSplitterOutputPin::QueryPreferredFormat(GUID* pFormat)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->QueryPreferredFormat(pFormat);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->QueryPreferredFormat(pFormat);
}
STDMETHODIMP CBaseSplitterOutputPin::GetTimeFormat(GUID* pFormat)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetTimeFormat(pFormat);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetTimeFormat(pFormat);
}
STDMETHODIMP CBaseSplitterOutputPin::IsUsingTimeFormat(const GUID* pFormat)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->IsUsingTimeFormat(pFormat);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->IsUsingTimeFormat(pFormat);
}
STDMETHODIMP CBaseSplitterOutputPin::SetTimeFormat(const GUID* pFormat)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->SetTimeFormat(pFormat);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->SetTimeFormat(pFormat);
}
STDMETHODIMP CBaseSplitterOutputPin::GetDuration(LONGLONG* pDuration)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetDuration(pDuration);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetDuration(pDuration);
}
STDMETHODIMP CBaseSplitterOutputPin::GetStopPosition(LONGLONG* pStop)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetStopPosition(pStop);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetStopPosition(pStop);
}
STDMETHODIMP CBaseSplitterOutputPin::GetCurrentPosition(LONGLONG* pCurrent)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetCurrentPosition(pCurrent);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetCurrentPosition(pCurrent);
}
STDMETHODIMP CBaseSplitterOutputPin::ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat);
}
STDMETHODIMP CBaseSplitterOutputPin::SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->SetPositionsInternal(this, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->SetPositionsInternal(this, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
}
STDMETHODIMP CBaseSplitterOutputPin::GetPositions(LONGLONG* pCurrent, LONGLONG* pStop)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetPositions(pCurrent, pStop);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetPositions(pCurrent, pStop);
}
STDMETHODIMP CBaseSplitterOutputPin::GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetAvailable(pEarliest, pLatest);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetAvailable(pEarliest, pLatest);
}
STDMETHODIMP CBaseSplitterOutputPin::SetRate(double dRate)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->SetRate(dRate);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->SetRate(dRate);
}
STDMETHODIMP CBaseSplitterOutputPin::GetRate(double* pdRate)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetRate(pdRate);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetRate(pdRate);
}
STDMETHODIMP CBaseSplitterOutputPin::GetPreroll(LONGLONG* pllPreroll)
{
- return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetPreroll(pllPreroll);
+ return (static_cast<CBaseSplitterFilter*>(m_pFilter))->GetPreroll(pllPreroll);
}
//
@@ -773,845 +773,842 @@ STDMETHODIMP CBaseSplitterOutputPin::GetPreroll(LONGLONG* pllPreroll)
//
CBaseSplitterFilter::CBaseSplitterFilter(LPCTSTR pName, LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid, int QueueMaxPackets)
- : CBaseFilter(pName, pUnk, this, clsid)
- , m_rtDuration(0), m_rtStart(0), m_rtStop(0), m_rtCurrent(0)
- , m_dRate(1.0)
- , m_nOpenProgress(100)
- , m_fAbort(false)
- , m_rtLastStart(_I64_MIN)
- , m_rtLastStop(_I64_MIN)
- , m_priority(THREAD_PRIORITY_NORMAL)
- , m_QueueMaxPackets(QueueMaxPackets)
+ : CBaseFilter(pName, pUnk, this, clsid)
+ , m_rtDuration(0), m_rtStart(0), m_rtStop(0), m_rtCurrent(0)
+ , m_dRate(1.0)
+ , m_nOpenProgress(100)
+ , m_fAbort(false)
+ , m_rtLastStart(_I64_MIN)
+ , m_rtLastStop(_I64_MIN)
+ , m_priority(THREAD_PRIORITY_NORMAL)
+ , m_QueueMaxPackets(QueueMaxPackets)
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
- m_pInput.Attach(DNew CBaseSplitterInputPin(NAME("CBaseSplitterInputPin"), this, this, phr));
+ m_pInput.Attach(DNew CBaseSplitterInputPin(NAME("CBaseSplitterInputPin"), this, this, phr));
}
CBaseSplitterFilter::~CBaseSplitterFilter()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- CAMThread::CallWorker(CMD_EXIT);
- CAMThread::Close();
+ CAMThread::CallWorker(CMD_EXIT);
+ CAMThread::Close();
}
STDMETHODIMP CBaseSplitterFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- *ppv = NULL;
+ *ppv = NULL;
- if (m_pInput && riid == __uuidof(IFileSourceFilter)) {
- return E_NOINTERFACE;
- }
+ if (m_pInput && riid == __uuidof(IFileSourceFilter)) {
+ return E_NOINTERFACE;
+ }
- return
- QI(IFileSourceFilter)
- QI(IMediaSeeking)
- QI(IAMOpenProgress)
- QI2(IAMMediaContent)
- QI2(IAMExtendedSeeking)
- QI(IKeyFrameInfo)
- QI(IBufferInfo)
- QI(IPropertyBag)
- QI(IPropertyBag2)
- QI(IDSMPropertyBag)
- QI(IDSMResourceBag)
- QI(IDSMChapterBag)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IFileSourceFilter)
+ QI(IMediaSeeking)
+ QI(IAMOpenProgress)
+ QI2(IAMMediaContent)
+ QI2(IAMExtendedSeeking)
+ QI(IKeyFrameInfo)
+ QI(IBufferInfo)
+ QI(IPropertyBag)
+ QI(IPropertyBag2)
+ QI(IDSMPropertyBag)
+ QI(IDSMResourceBag)
+ QI(IDSMChapterBag)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
CBaseSplitterOutputPin* CBaseSplitterFilter::GetOutputPin(DWORD TrackNum)
{
- CAutoLock cAutoLock(&m_csPinMap);
+ CAutoLock cAutoLock(&m_csPinMap);
- CBaseSplitterOutputPin* pPin = NULL;
- m_pPinMap.Lookup(TrackNum, pPin);
- return pPin;
+ CBaseSplitterOutputPin* pPin = NULL;
+ m_pPinMap.Lookup(TrackNum, pPin);
+ return pPin;
}
DWORD CBaseSplitterFilter::GetOutputTrackNum(CBaseSplitterOutputPin* pPin)
{
- CAutoLock cAutoLock(&m_csPinMap);
+ CAutoLock cAutoLock(&m_csPinMap);
- POSITION pos = m_pPinMap.GetStartPosition();
- while (pos) {
- DWORD TrackNum;
- CBaseSplitterOutputPin* pPinTmp;
- m_pPinMap.GetNextAssoc(pos, TrackNum, pPinTmp);
- if (pPinTmp == pPin) {
- return TrackNum;
- }
- }
+ POSITION pos = m_pPinMap.GetStartPosition();
+ while (pos) {
+ DWORD TrackNum;
+ CBaseSplitterOutputPin* pPinTmp;
+ m_pPinMap.GetNextAssoc(pos, TrackNum, pPinTmp);
+ if (pPinTmp == pPin) {
+ return TrackNum;
+ }
+ }
- return (DWORD)-1;
+ return (DWORD) - 1;
}
HRESULT CBaseSplitterFilter::RenameOutputPin(DWORD TrackNumSrc, DWORD TrackNumDst, const AM_MEDIA_TYPE* pmt)
{
- CAutoLock cAutoLock(&m_csPinMap);
+ CAutoLock cAutoLock(&m_csPinMap);
- CBaseSplitterOutputPin* pPin;
- if (m_pPinMap.Lookup(TrackNumSrc, pPin)) {
- if (CComQIPtr<IPin> pPinTo = pPin->GetConnected()) {
- if (pmt && S_OK != pPinTo->QueryAccept(pmt)) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- }
+ CBaseSplitterOutputPin* pPin;
+ if (m_pPinMap.Lookup(TrackNumSrc, pPin)) {
+ if (CComQIPtr<IPin> pPinTo = pPin->GetConnected()) {
+ if (pmt && S_OK != pPinTo->QueryAccept(pmt)) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ }
- m_pPinMap.RemoveKey(TrackNumSrc);
- m_pPinMap[TrackNumDst] = pPin;
+ m_pPinMap.RemoveKey(TrackNumSrc);
+ m_pPinMap[TrackNumDst] = pPin;
- if (pmt) {
- CAutoLock cAutoLock(&m_csmtnew);
- m_mtnew[TrackNumDst] = *pmt;
- }
+ if (pmt) {
+ CAutoLock cAutoLock(&m_csmtnew);
+ m_mtnew[TrackNumDst] = *pmt;
+ }
- return S_OK;
- }
+ return S_OK;
+ }
- return E_FAIL;
+ return E_FAIL;
}
HRESULT CBaseSplitterFilter::AddOutputPin(DWORD TrackNum, CAutoPtr<CBaseSplitterOutputPin> pPin)
{
- CAutoLock cAutoLock(&m_csPinMap);
+ CAutoLock cAutoLock(&m_csPinMap);
- if (!pPin) {
- return E_INVALIDARG;
- }
- m_pPinMap[TrackNum] = pPin;
- m_pOutputs.AddTail(pPin);
- return S_OK;
+ if (!pPin) {
+ return E_INVALIDARG;
+ }
+ m_pPinMap[TrackNum] = pPin;
+ m_pOutputs.AddTail(pPin);
+ return S_OK;
}
HRESULT CBaseSplitterFilter::DeleteOutputs()
{
- m_rtDuration = 0;
+ m_rtDuration = 0;
- m_pRetiredOutputs.RemoveAll();
+ m_pRetiredOutputs.RemoveAll();
- CAutoLock cAutoLockF(this);
- if (m_State != State_Stopped) {
- return VFW_E_NOT_STOPPED;
- }
+ CAutoLock cAutoLockF(this);
+ if (m_State != State_Stopped) {
+ return VFW_E_NOT_STOPPED;
+ }
- while (m_pOutputs.GetCount()) {
- CAutoPtr<CBaseSplitterOutputPin> pPin = m_pOutputs.RemoveHead();
- if (IPin* pPinTo = pPin->GetConnected()) {
- pPinTo->Disconnect();
- }
- pPin->Disconnect();
- // we can't just let it be deleted now, something might have AddRefed on it (graphedit...)
- m_pRetiredOutputs.AddTail(pPin);
- }
+ while (m_pOutputs.GetCount()) {
+ CAutoPtr<CBaseSplitterOutputPin> pPin = m_pOutputs.RemoveHead();
+ if (IPin* pPinTo = pPin->GetConnected()) {
+ pPinTo->Disconnect();
+ }
+ pPin->Disconnect();
+ // we can't just let it be deleted now, something might have AddRefed on it (graphedit...)
+ m_pRetiredOutputs.AddTail(pPin);
+ }
- CAutoLock cAutoLockPM(&m_csPinMap);
- m_pPinMap.RemoveAll();
+ CAutoLock cAutoLockPM(&m_csPinMap);
+ m_pPinMap.RemoveAll();
- CAutoLock cAutoLockMT(&m_csmtnew);
- m_mtnew.RemoveAll();
+ CAutoLock cAutoLockMT(&m_csmtnew);
+ m_mtnew.RemoveAll();
- RemoveAll();
- ResRemoveAll();
- ChapRemoveAll();
+ RemoveAll();
+ ResRemoveAll();
+ ChapRemoveAll();
- m_fontinst.UninstallFonts();
+ m_fontinst.UninstallFonts();
- m_pSyncReader.Release();
+ m_pSyncReader.Release();
- return S_OK;
+ return S_OK;
}
void CBaseSplitterFilter::DeliverBeginFlush()
{
- m_fFlushing = true;
- POSITION pos = m_pOutputs.GetHeadPosition();
- while (pos) {
- m_pOutputs.GetNext(pos)->DeliverBeginFlush();
- }
+ m_fFlushing = true;
+ POSITION pos = m_pOutputs.GetHeadPosition();
+ while (pos) {
+ m_pOutputs.GetNext(pos)->DeliverBeginFlush();
+ }
}
void CBaseSplitterFilter::DeliverEndFlush()
{
- POSITION pos = m_pOutputs.GetHeadPosition();
- while (pos) {
- m_pOutputs.GetNext(pos)->DeliverEndFlush();
- }
- m_fFlushing = false;
- m_eEndFlush.Set();
+ POSITION pos = m_pOutputs.GetHeadPosition();
+ while (pos) {
+ m_pOutputs.GetNext(pos)->DeliverEndFlush();
+ }
+ m_fFlushing = false;
+ m_eEndFlush.Set();
}
DWORD CBaseSplitterFilter::ThreadProc()
{
- if (m_pSyncReader) {
- m_pSyncReader->SetBreakEvent(GetRequestHandle());
- }
+ if (m_pSyncReader) {
+ m_pSyncReader->SetBreakEvent(GetRequestHandle());
+ }
- if (!DemuxInit()) {
- for (;;) {
- DWORD cmd = GetRequest();
- if (cmd == CMD_EXIT) {
- CAMThread::m_hThread = NULL;
- }
- Reply(S_OK);
- if (cmd == CMD_EXIT) {
- return 0;
- }
- }
- }
+ if (!DemuxInit()) {
+ for (;;) {
+ DWORD cmd = GetRequest();
+ if (cmd == CMD_EXIT) {
+ CAMThread::m_hThread = NULL;
+ }
+ Reply(S_OK);
+ if (cmd == CMD_EXIT) {
+ return 0;
+ }
+ }
+ }
- m_eEndFlush.Set();
- m_fFlushing = false;
+ m_eEndFlush.Set();
+ m_fFlushing = false;
- for (DWORD cmd = (DWORD)-1; ; cmd = GetRequest()) {
- if (cmd == CMD_EXIT) {
- m_hThread = NULL;
- Reply(S_OK);
- return 0;
- }
+ for (DWORD cmd = (DWORD) - 1; ; cmd = GetRequest()) {
+ if (cmd == CMD_EXIT) {
+ m_hThread = NULL;
+ Reply(S_OK);
+ return 0;
+ }
- SetThreadPriority(m_hThread, m_priority = THREAD_PRIORITY_NORMAL);
+ SetThreadPriority(m_hThread, m_priority = THREAD_PRIORITY_NORMAL);
- m_rtStart = m_rtNewStart;
- m_rtStop = m_rtNewStop;
+ m_rtStart = m_rtNewStart;
+ m_rtStop = m_rtNewStop;
- DemuxSeek(m_rtStart);
+ DemuxSeek(m_rtStart);
- if (cmd != (DWORD)-1) {
- Reply(S_OK);
- }
+ if (cmd != (DWORD) - 1) {
+ Reply(S_OK);
+ }
- m_eEndFlush.Wait();
+ m_eEndFlush.Wait();
- m_pActivePins.RemoveAll();
+ m_pActivePins.RemoveAll();
- POSITION pos = m_pOutputs.GetHeadPosition();
- while (pos && !m_fFlushing) {
- CBaseSplitterOutputPin* pPin = m_pOutputs.GetNext(pos);
- if (pPin->IsConnected() && pPin->IsActive()) {
- m_pActivePins.AddTail(pPin);
- pPin->DeliverNewSegment(m_rtStart, m_rtStop, m_dRate);
- }
- }
+ POSITION pos = m_pOutputs.GetHeadPosition();
+ while (pos && !m_fFlushing) {
+ CBaseSplitterOutputPin* pPin = m_pOutputs.GetNext(pos);
+ if (pPin->IsConnected() && pPin->IsActive()) {
+ m_pActivePins.AddTail(pPin);
+ pPin->DeliverNewSegment(m_rtStart, m_rtStop, m_dRate);
+ }
+ }
- do {
- m_bDiscontinuitySent.RemoveAll();
- } while (!DemuxLoop());
+ do {
+ m_bDiscontinuitySent.RemoveAll();
+ } while (!DemuxLoop());
- pos = m_pActivePins.GetHeadPosition();
- while (pos && !CheckRequest(&cmd)) {
- m_pActivePins.GetNext(pos)->QueueEndOfStream();
- }
- }
+ pos = m_pActivePins.GetHeadPosition();
+ while (pos && !CheckRequest(&cmd)) {
+ m_pActivePins.GetNext(pos)->QueueEndOfStream();
+ }
+ }
- ASSERT(0); // we should only exit via CMD_EXIT
+ ASSERT(0); // we should only exit via CMD_EXIT
- m_hThread = NULL;
- return 0;
+ m_hThread = NULL;
+ return 0;
}
HRESULT CBaseSplitterFilter::DeliverPacket(CAutoPtr<Packet> p)
{
- HRESULT hr = S_FALSE;
+ HRESULT hr = S_FALSE;
- CBaseSplitterOutputPin* pPin = GetOutputPin(p->TrackNumber);
- if (!pPin || !pPin->IsConnected() || !m_pActivePins.Find(pPin)) {
- return S_FALSE;
- }
+ CBaseSplitterOutputPin* pPin = GetOutputPin(p->TrackNumber);
+ if (!pPin || !pPin->IsConnected() || !m_pActivePins.Find(pPin)) {
+ return S_FALSE;
+ }
- if (p->rtStart != Packet::INVALID_TIME) {
- m_rtCurrent = p->rtStart;
+ if (p->rtStart != Packet::INVALID_TIME) {
+ m_rtCurrent = p->rtStart;
- p->rtStart -= m_rtStart;
- p->rtStop -= m_rtStart;
+ p->rtStart -= m_rtStart;
+ p->rtStop -= m_rtStart;
- ASSERT(p->rtStart <= p->rtStop);
- }
+ ASSERT(p->rtStart <= p->rtStop);
+ }
- {
- CAutoLock cAutoLock(&m_csmtnew);
+ {
+ CAutoLock cAutoLock(&m_csmtnew);
- CMediaType mt;
- if (m_mtnew.Lookup(p->TrackNumber, mt)) {
- p->pmt = CreateMediaType(&mt);
- m_mtnew.RemoveKey(p->TrackNumber);
- }
- }
+ CMediaType mt;
+ if (m_mtnew.Lookup(p->TrackNumber, mt)) {
+ p->pmt = CreateMediaType(&mt);
+ m_mtnew.RemoveKey(p->TrackNumber);
+ }
+ }
- if (!m_bDiscontinuitySent.Find(p->TrackNumber)) {
- p->bDiscontinuity = TRUE;
- }
+ if (!m_bDiscontinuitySent.Find(p->TrackNumber)) {
+ p->bDiscontinuity = TRUE;
+ }
- DWORD TrackNumber = p->TrackNumber;
- BOOL bDiscontinuity = p->bDiscontinuity;
+ DWORD TrackNumber = p->TrackNumber;
+ BOOL bDiscontinuity = p->bDiscontinuity;
#if defined(_DEBUG) && 0
- TRACE(_T("[%d]: d%d s%d p%d, b=%d, [%20I64d - %20I64d]\n"),
- p->TrackNumber,
- p->bDiscontinuity, p->bSyncPoint, p->rtStart != Packet::INVALID_TIME && p->rtStart < 0,
- p->GetCount(), p->rtStart, p->rtStop);
+ TRACE(_T("[%d]: d%d s%d p%d, b=%d, [%20I64d - %20I64d]\n"),
+ p->TrackNumber,
+ p->bDiscontinuity, p->bSyncPoint, p->rtStart != Packet::INVALID_TIME && p->rtStart < 0,
+ p->GetCount(), p->rtStart, p->rtStop);
#endif
- hr = pPin->QueuePacket(p);
+ hr = pPin->QueuePacket(p);
- if (S_OK != hr) {
- if (POSITION pos = m_pActivePins.Find(pPin)) {
- m_pActivePins.RemoveAt(pos);
- }
+ if (S_OK != hr) {
+ if (POSITION pos = m_pActivePins.Find(pPin)) {
+ m_pActivePins.RemoveAt(pos);
+ }
- if (!m_pActivePins.IsEmpty()) { // only die when all pins are down
- hr = S_OK;
- }
+ if (!m_pActivePins.IsEmpty()) { // only die when all pins are down
+ hr = S_OK;
+ }
- return hr;
- }
+ return hr;
+ }
- if (bDiscontinuity) {
- m_bDiscontinuitySent.AddTail(TrackNumber);
- }
+ if (bDiscontinuity) {
+ m_bDiscontinuitySent.AddTail(TrackNumber);
+ }
- return hr;
+ return hr;
}
bool CBaseSplitterFilter::IsAnyPinDrying()
{
- int totalcount = 0, totalsize = 0;
-
- POSITION pos = m_pActivePins.GetHeadPosition();
- while (pos) {
- CBaseSplitterOutputPin* pPin = m_pActivePins.GetNext(pos);
- int count = pPin->QueueCount();
- int size = pPin->QueueSize();
- if (!pPin->IsDiscontinuous() && (count < MINPACKETS || size < MINPACKETSIZE)) {
- // if (m_priority != THREAD_PRIORITY_ABOVE_NORMAL && (count < MINPACKETS/3 || size < MINPACKETSIZE/3))
- if (m_priority != THREAD_PRIORITY_BELOW_NORMAL && (count < MINPACKETS/3 || size < MINPACKETSIZE/3)) {
- // SetThreadPriority(m_hThread, m_priority = THREAD_PRIORITY_ABOVE_NORMAL);
- POSITION pos = m_pOutputs.GetHeadPosition();
- while (pos) {
- m_pOutputs.GetNext(pos)->SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
- }
- m_priority = THREAD_PRIORITY_BELOW_NORMAL;
- }
- return true;
- }
- totalcount += count;
- totalsize += size;
- }
-
- if (m_priority != THREAD_PRIORITY_NORMAL && (totalcount > m_QueueMaxPackets*2/3 || totalsize > MAXPACKETSIZE*2/3)) {
- // SetThreadPriority(m_hThread, m_priority = THREAD_PRIORITY_NORMAL);
- POSITION pos = m_pOutputs.GetHeadPosition();
- while (pos) {
- m_pOutputs.GetNext(pos)->SetThreadPriority(THREAD_PRIORITY_NORMAL);
- }
- m_priority = THREAD_PRIORITY_NORMAL;
- }
-
- if (totalcount < MAXPACKETS && totalsize < MAXPACKETSIZE) {
- return true;
- }
-
- return false;
+ int totalcount = 0, totalsize = 0;
+
+ POSITION pos = m_pActivePins.GetHeadPosition();
+ while (pos) {
+ CBaseSplitterOutputPin* pPin = m_pActivePins.GetNext(pos);
+ int count = pPin->QueueCount();
+ int size = pPin->QueueSize();
+ if (!pPin->IsDiscontinuous() && (count < MINPACKETS || size < MINPACKETSIZE)) {
+ // if (m_priority != THREAD_PRIORITY_ABOVE_NORMAL && (count < MINPACKETS/3 || size < MINPACKETSIZE/3))
+ if (m_priority != THREAD_PRIORITY_BELOW_NORMAL && (count < MINPACKETS / 3 || size < MINPACKETSIZE / 3)) {
+ // SetThreadPriority(m_hThread, m_priority = THREAD_PRIORITY_ABOVE_NORMAL);
+ POSITION pos = m_pOutputs.GetHeadPosition();
+ while (pos) {
+ m_pOutputs.GetNext(pos)->SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
+ }
+ m_priority = THREAD_PRIORITY_BELOW_NORMAL;
+ }
+ return true;
+ }
+ totalcount += count;
+ totalsize += size;
+ }
+
+ if (m_priority != THREAD_PRIORITY_NORMAL && (totalcount > m_QueueMaxPackets * 2 / 3 || totalsize > MAXPACKETSIZE * 2 / 3)) {
+ // SetThreadPriority(m_hThread, m_priority = THREAD_PRIORITY_NORMAL);
+ POSITION pos = m_pOutputs.GetHeadPosition();
+ while (pos) {
+ m_pOutputs.GetNext(pos)->SetThreadPriority(THREAD_PRIORITY_NORMAL);
+ }
+ m_priority = THREAD_PRIORITY_NORMAL;
+ }
+
+ if (totalcount < MAXPACKETS && totalsize < MAXPACKETSIZE) {
+ return true;
+ }
+
+ return false;
}
HRESULT CBaseSplitterFilter::BreakConnect(PIN_DIRECTION dir, CBasePin* pPin)
{
- CheckPointer(pPin, E_POINTER);
+ CheckPointer(pPin, E_POINTER);
- if (dir == PINDIR_INPUT) {
- DeleteOutputs();
- } else if (dir == PINDIR_OUTPUT) {
- } else {
- return E_UNEXPECTED;
- }
+ if (dir == PINDIR_INPUT) {
+ DeleteOutputs();
+ } else if (dir == PINDIR_OUTPUT) {
+ } else {
+ return E_UNEXPECTED;
+ }
- return S_OK;
+ return S_OK;
}
HRESULT CBaseSplitterFilter::CompleteConnect(PIN_DIRECTION dir, CBasePin* pPin)
{
- CheckPointer(pPin, E_POINTER);
+ CheckPointer(pPin, E_POINTER);
- if (dir == PINDIR_INPUT) {
- CBaseSplitterInputPin* pIn = static_cast<CBaseSplitterInputPin*>(pPin);
+ if (dir == PINDIR_INPUT) {
+ CBaseSplitterInputPin* pIn = static_cast<CBaseSplitterInputPin*>(pPin);
- HRESULT hr;
+ HRESULT hr;
- CComPtr<IAsyncReader> pAsyncReader;
- if (FAILED(hr = pIn->GetAsyncReader(&pAsyncReader))
- || FAILED(hr = DeleteOutputs())
- || FAILED(hr = CreateOutputs(pAsyncReader))) {
- return hr;
- }
+ CComPtr<IAsyncReader> pAsyncReader;
+ if (FAILED(hr = pIn->GetAsyncReader(&pAsyncReader))
+ || FAILED(hr = DeleteOutputs())
+ || FAILED(hr = CreateOutputs(pAsyncReader))) {
+ return hr;
+ }
- ChapSort();
+ ChapSort();
- m_pSyncReader = pAsyncReader;
- } else if (dir == PINDIR_OUTPUT) {
- m_pRetiredOutputs.RemoveAll();
- } else {
- return E_UNEXPECTED;
- }
+ m_pSyncReader = pAsyncReader;
+ } else if (dir == PINDIR_OUTPUT) {
+ m_pRetiredOutputs.RemoveAll();
+ } else {
+ return E_UNEXPECTED;
+ }
- return S_OK;
+ return S_OK;
}
int CBaseSplitterFilter::GetPinCount()
{
- return (m_pInput ? 1 : 0) + (int)m_pOutputs.GetCount();
+ return (m_pInput ? 1 : 0) + (int)m_pOutputs.GetCount();
}
CBasePin* CBaseSplitterFilter::GetPin(int n)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- if (n >= 0 && n < (int)m_pOutputs.GetCount()) {
- if (POSITION pos = m_pOutputs.FindIndex(n)) {
- return m_pOutputs.GetAt(pos);
- }
- }
+ if (n >= 0 && n < (int)m_pOutputs.GetCount()) {
+ if (POSITION pos = m_pOutputs.FindIndex(n)) {
+ return m_pOutputs.GetAt(pos);
+ }
+ }
- if (n == (int)m_pOutputs.GetCount() && m_pInput) {
- return m_pInput;
- }
+ if (n == (int)m_pOutputs.GetCount() && m_pInput) {
+ return m_pInput;
+ }
- return NULL;
+ return NULL;
}
STDMETHODIMP CBaseSplitterFilter::Stop()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- DeliverBeginFlush();
- CallWorker(CMD_EXIT);
- DeliverEndFlush();
+ DeliverBeginFlush();
+ CallWorker(CMD_EXIT);
+ DeliverEndFlush();
- HRESULT hr;
- if (FAILED(hr = __super::Stop())) {
- return hr;
- }
+ HRESULT hr;
+ if (FAILED(hr = __super::Stop())) {
+ return hr;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CBaseSplitterFilter::Pause()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- FILTER_STATE fs = m_State;
+ FILTER_STATE fs = m_State;
- HRESULT hr;
- if (FAILED(hr = __super::Pause())) {
- return hr;
- }
+ HRESULT hr;
+ if (FAILED(hr = __super::Pause())) {
+ return hr;
+ }
- if (fs == State_Stopped) {
- Create();
- }
+ if (fs == State_Stopped) {
+ Create();
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CBaseSplitterFilter::Run(REFERENCE_TIME tStart)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- HRESULT hr;
- if (FAILED(hr = __super::Run(tStart))) {
- return hr;
- }
+ HRESULT hr;
+ if (FAILED(hr = __super::Run(tStart))) {
+ return hr;
+ }
- return S_OK;
+ return S_OK;
}
// IFileSourceFilter
STDMETHODIMP CBaseSplitterFilter::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt)
{
- CheckPointer(pszFileName, E_POINTER);
-
- m_fn = pszFileName;
- HRESULT hr = E_FAIL;
- CComPtr<IAsyncReader> pAsyncReader;
- CAtlList<CHdmvClipInfo::PlaylistItem> Items;
- CAtlList<CHdmvClipInfo::PlaylistChapter> Chapters;
-
- if (BuildPlaylist (pszFileName, Items))
- pAsyncReader = (IAsyncReader*)DNew CAsyncFileReader(Items, hr);
- else
- pAsyncReader = (IAsyncReader*)DNew CAsyncFileReader(CString(pszFileName), hr);
-
- if (FAILED(hr)
- || FAILED(hr = DeleteOutputs())
- || FAILED(hr = CreateOutputs(pAsyncReader)))
- {
- m_fn = "";
- return hr;
- }
-
- if (BuildChapters (pszFileName, Items, Chapters))
- {
- POSITION pos = Chapters.GetHeadPosition();
- int i = 1;
- while (pos)
- {
- CString str;
- CHdmvClipInfo::PlaylistChapter& chap = Chapters.GetNext(pos);
- if (chap.m_nMarkType == CHdmvClipInfo::EntryMark)
- {
- str.Format (_T("Chapter %d"), i);
- ChapAppend (chap.m_rtTimestamp, str);
- i++;
- }
- }
- }
-
- ChapSort();
-
- m_pSyncReader = pAsyncReader;
-
- return S_OK;
+ CheckPointer(pszFileName, E_POINTER);
+
+ m_fn = pszFileName;
+ HRESULT hr = E_FAIL;
+ CComPtr<IAsyncReader> pAsyncReader;
+ CAtlList<CHdmvClipInfo::PlaylistItem> Items;
+ CAtlList<CHdmvClipInfo::PlaylistChapter> Chapters;
+
+ if (BuildPlaylist(pszFileName, Items)) {
+ pAsyncReader = (IAsyncReader*)DNew CAsyncFileReader(Items, hr);
+ } else {
+ pAsyncReader = (IAsyncReader*)DNew CAsyncFileReader(CString(pszFileName), hr);
+ }
+
+ if (FAILED(hr)
+ || FAILED(hr = DeleteOutputs())
+ || FAILED(hr = CreateOutputs(pAsyncReader))) {
+ m_fn = "";
+ return hr;
+ }
+
+ if (BuildChapters(pszFileName, Items, Chapters)) {
+ POSITION pos = Chapters.GetHeadPosition();
+ int i = 1;
+ while (pos) {
+ CString str;
+ CHdmvClipInfo::PlaylistChapter& chap = Chapters.GetNext(pos);
+ if (chap.m_nMarkType == CHdmvClipInfo::EntryMark) {
+ str.Format(_T("Chapter %d"), i);
+ ChapAppend(chap.m_rtTimestamp, str);
+ i++;
+ }
+ }
+ }
+
+ ChapSort();
+
+ m_pSyncReader = pAsyncReader;
+
+ return S_OK;
}
STDMETHODIMP CBaseSplitterFilter::GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt)
{
- CheckPointer(ppszFileName, E_POINTER);
- *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength()+1)*sizeof(WCHAR));
- if (!(*ppszFileName)) {
- return E_OUTOFMEMORY;
- }
- wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
- return S_OK;
+ CheckPointer(ppszFileName, E_POINTER);
+ *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength() + 1) * sizeof(WCHAR));
+ if (!(*ppszFileName)) {
+ return E_OUTOFMEMORY;
+ }
+ wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
+ return S_OK;
}
LPCTSTR CBaseSplitterFilter::GetPartFilename(IAsyncReader* pAsyncReader)
{
- CComQIPtr<IFileHandle> pFH = pAsyncReader;
- return pFH ? pFH->GetFileName() : m_fn;
+ CComQIPtr<IFileHandle> pFH = pAsyncReader;
+ return pFH ? pFH->GetFileName() : m_fn;
}
// IMediaSeeking
STDMETHODIMP CBaseSplitterFilter::GetCapabilities(DWORD* pCapabilities)
{
- return pCapabilities ? *pCapabilities =
- AM_SEEKING_CanGetStopPos|
- AM_SEEKING_CanGetDuration|
- AM_SEEKING_CanSeekAbsolute|
- AM_SEEKING_CanSeekForwards|
- AM_SEEKING_CanSeekBackwards, S_OK : E_POINTER;
+ return pCapabilities ? *pCapabilities =
+ AM_SEEKING_CanGetStopPos |
+ AM_SEEKING_CanGetDuration |
+ AM_SEEKING_CanSeekAbsolute |
+ AM_SEEKING_CanSeekForwards |
+ AM_SEEKING_CanSeekBackwards, S_OK : E_POINTER;
}
STDMETHODIMP CBaseSplitterFilter::CheckCapabilities(DWORD* pCapabilities)
{
- CheckPointer(pCapabilities, E_POINTER);
- if (*pCapabilities == 0) {
- return S_OK;
- }
- DWORD caps;
- GetCapabilities(&caps);
- if ((caps&*pCapabilities) == 0) {
- return E_FAIL;
- }
- if (caps == *pCapabilities) {
- return S_OK;
- }
- return S_FALSE;
+ CheckPointer(pCapabilities, E_POINTER);
+ if (*pCapabilities == 0) {
+ return S_OK;
+ }
+ DWORD caps;
+ GetCapabilities(&caps);
+ if ((caps&*pCapabilities) == 0) {
+ return E_FAIL;
+ }
+ if (caps == *pCapabilities) {
+ return S_OK;
+ }
+ return S_FALSE;
}
STDMETHODIMP CBaseSplitterFilter::IsFormatSupported(const GUID* pFormat)
{
- return !pFormat ? E_POINTER : *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : S_FALSE;
+ return !pFormat ? E_POINTER : *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : S_FALSE;
}
STDMETHODIMP CBaseSplitterFilter::QueryPreferredFormat(GUID* pFormat)
{
- return GetTimeFormat(pFormat);
+ return GetTimeFormat(pFormat);
}
STDMETHODIMP CBaseSplitterFilter::GetTimeFormat(GUID* pFormat)
{
- return pFormat ? *pFormat = TIME_FORMAT_MEDIA_TIME, S_OK : E_POINTER;
+ return pFormat ? *pFormat = TIME_FORMAT_MEDIA_TIME, S_OK : E_POINTER;
}
STDMETHODIMP CBaseSplitterFilter::IsUsingTimeFormat(const GUID* pFormat)
{
- return IsFormatSupported(pFormat);
+ return IsFormatSupported(pFormat);
}
STDMETHODIMP CBaseSplitterFilter::SetTimeFormat(const GUID* pFormat)
{
- return S_OK == IsFormatSupported(pFormat) ? S_OK : E_INVALIDARG;
+ return S_OK == IsFormatSupported(pFormat) ? S_OK : E_INVALIDARG;
}
STDMETHODIMP CBaseSplitterFilter::GetDuration(LONGLONG* pDuration)
{
- CheckPointer(pDuration, E_POINTER);
- *pDuration = m_rtDuration;
- return S_OK;
+ CheckPointer(pDuration, E_POINTER);
+ *pDuration = m_rtDuration;
+ return S_OK;
}
STDMETHODIMP CBaseSplitterFilter::GetStopPosition(LONGLONG* pStop)
{
- return GetDuration(pStop);
+ return GetDuration(pStop);
}
STDMETHODIMP CBaseSplitterFilter::GetCurrentPosition(LONGLONG* pCurrent)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CBaseSplitterFilter::ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CBaseSplitterFilter::SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags)
{
- return SetPositionsInternal(this, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
+ return SetPositionsInternal(this, pCurrent, dwCurrentFlags, pStop, dwStopFlags);
}
STDMETHODIMP CBaseSplitterFilter::GetPositions(LONGLONG* pCurrent, LONGLONG* pStop)
{
- if (pCurrent) {
- *pCurrent = m_rtCurrent;
- }
- if (pStop) {
- *pStop = m_rtStop;
- }
- return S_OK;
+ if (pCurrent) {
+ *pCurrent = m_rtCurrent;
+ }
+ if (pStop) {
+ *pStop = m_rtStop;
+ }
+ return S_OK;
}
STDMETHODIMP CBaseSplitterFilter::GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest)
{
- if (pEarliest) {
- *pEarliest = 0;
- }
- return GetDuration(pLatest);
+ if (pEarliest) {
+ *pEarliest = 0;
+ }
+ return GetDuration(pLatest);
}
STDMETHODIMP CBaseSplitterFilter::SetRate(double dRate)
{
- return dRate > 0 ? m_dRate = dRate, S_OK : E_INVALIDARG;
+ return dRate > 0 ? m_dRate = dRate, S_OK : E_INVALIDARG;
}
STDMETHODIMP CBaseSplitterFilter::GetRate(double* pdRate)
{
- return pdRate ? *pdRate = m_dRate, S_OK : E_POINTER;
+ return pdRate ? *pdRate = m_dRate, S_OK : E_POINTER;
}
STDMETHODIMP CBaseSplitterFilter::GetPreroll(LONGLONG* pllPreroll)
{
- return pllPreroll ? *pllPreroll = 0, S_OK : E_POINTER;
+ return pllPreroll ? *pllPreroll = 0, S_OK : E_POINTER;
}
HRESULT CBaseSplitterFilter::SetPositionsInternal(void* id, LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags)
{
- CAutoLock cAutoLock(this);
-
- if (!pCurrent && !pStop
- || (dwCurrentFlags&AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning
- && (dwStopFlags&AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning) {
- return S_OK;
- }
-
- REFERENCE_TIME
- rtCurrent = m_rtCurrent,
- rtStop = m_rtStop;
-
- if (pCurrent)
- switch (dwCurrentFlags&AM_SEEKING_PositioningBitsMask) {
- case AM_SEEKING_NoPositioning:
- break;
- case AM_SEEKING_AbsolutePositioning:
- rtCurrent = *pCurrent;
- break;
- case AM_SEEKING_RelativePositioning:
- rtCurrent = rtCurrent + *pCurrent;
- break;
- case AM_SEEKING_IncrementalPositioning:
- rtCurrent = rtCurrent + *pCurrent;
- break;
- }
-
- if (pStop)
- switch (dwStopFlags&AM_SEEKING_PositioningBitsMask) {
- case AM_SEEKING_NoPositioning:
- break;
- case AM_SEEKING_AbsolutePositioning:
- rtStop = *pStop;
- break;
- case AM_SEEKING_RelativePositioning:
- rtStop += *pStop;
- break;
- case AM_SEEKING_IncrementalPositioning:
- rtStop = rtCurrent + *pStop;
- break;
- }
-
- if (m_rtCurrent == rtCurrent && m_rtStop == rtStop) {
- return S_OK;
- }
-
- if (m_rtLastStart == rtCurrent && m_rtLastStop == rtStop && !m_LastSeekers.Find(id)) {
- m_LastSeekers.AddTail(id);
- return S_OK;
- }
-
- m_rtLastStart = rtCurrent;
- m_rtLastStop = rtStop;
- m_LastSeekers.RemoveAll();
- m_LastSeekers.AddTail(id);
-
- DbgLog((LOG_TRACE, 0, _T("Seek Started %I64d"), rtCurrent));
-
- m_rtNewStart = m_rtCurrent = rtCurrent;
- m_rtNewStop = rtStop;
-
- if (ThreadExists()) {
- DeliverBeginFlush();
- CallWorker(CMD_SEEK);
- DeliverEndFlush();
- }
-
- DbgLog((LOG_TRACE, 0, _T("Seek Ended")));
-
- return S_OK;
+ CAutoLock cAutoLock(this);
+
+ if (!pCurrent && !pStop
+ || (dwCurrentFlags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning
+ && (dwStopFlags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning) {
+ return S_OK;
+ }
+
+ REFERENCE_TIME
+ rtCurrent = m_rtCurrent,
+ rtStop = m_rtStop;
+
+ if (pCurrent)
+ switch (dwCurrentFlags & AM_SEEKING_PositioningBitsMask) {
+ case AM_SEEKING_NoPositioning:
+ break;
+ case AM_SEEKING_AbsolutePositioning:
+ rtCurrent = *pCurrent;
+ break;
+ case AM_SEEKING_RelativePositioning:
+ rtCurrent = rtCurrent + *pCurrent;
+ break;
+ case AM_SEEKING_IncrementalPositioning:
+ rtCurrent = rtCurrent + *pCurrent;
+ break;
+ }
+
+ if (pStop)
+ switch (dwStopFlags & AM_SEEKING_PositioningBitsMask) {
+ case AM_SEEKING_NoPositioning:
+ break;
+ case AM_SEEKING_AbsolutePositioning:
+ rtStop = *pStop;
+ break;
+ case AM_SEEKING_RelativePositioning:
+ rtStop += *pStop;
+ break;
+ case AM_SEEKING_IncrementalPositioning:
+ rtStop = rtCurrent + *pStop;
+ break;
+ }
+
+ if (m_rtCurrent == rtCurrent && m_rtStop == rtStop) {
+ return S_OK;
+ }
+
+ if (m_rtLastStart == rtCurrent && m_rtLastStop == rtStop && !m_LastSeekers.Find(id)) {
+ m_LastSeekers.AddTail(id);
+ return S_OK;
+ }
+
+ m_rtLastStart = rtCurrent;
+ m_rtLastStop = rtStop;
+ m_LastSeekers.RemoveAll();
+ m_LastSeekers.AddTail(id);
+
+ DbgLog((LOG_TRACE, 0, _T("Seek Started %I64d"), rtCurrent));
+
+ m_rtNewStart = m_rtCurrent = rtCurrent;
+ m_rtNewStop = rtStop;
+
+ if (ThreadExists()) {
+ DeliverBeginFlush();
+ CallWorker(CMD_SEEK);
+ DeliverEndFlush();
+ }
+
+ DbgLog((LOG_TRACE, 0, _T("Seek Ended")));
+
+ return S_OK;
}
// IAMOpenProgress
STDMETHODIMP CBaseSplitterFilter::QueryProgress(LONGLONG* pllTotal, LONGLONG* pllCurrent)
{
- CheckPointer(pllTotal, E_POINTER);
- CheckPointer(pllCurrent, E_POINTER);
+ CheckPointer(pllTotal, E_POINTER);
+ CheckPointer(pllCurrent, E_POINTER);
- *pllTotal = 100;
- *pllCurrent = m_nOpenProgress;
+ *pllTotal = 100;
+ *pllCurrent = m_nOpenProgress;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CBaseSplitterFilter::AbortOperation()
{
- m_fAbort = true;
- return S_OK;
+ m_fAbort = true;
+ return S_OK;
}
// IAMMediaContent
STDMETHODIMP CBaseSplitterFilter::get_AuthorName(BSTR* pbstrAuthorName)
{
- return GetProperty(L"AUTH", pbstrAuthorName);
+ return GetProperty(L"AUTH", pbstrAuthorName);
}
STDMETHODIMP CBaseSplitterFilter::get_Title(BSTR* pbstrTitle)
{
- return GetProperty(L"TITL", pbstrTitle);
+ return GetProperty(L"TITL", pbstrTitle);
}
STDMETHODIMP CBaseSplitterFilter::get_Rating(BSTR* pbstrRating)
{
- return GetProperty(L"RTNG", pbstrRating);
+ return GetProperty(L"RTNG", pbstrRating);
}
STDMETHODIMP CBaseSplitterFilter::get_Description(BSTR* pbstrDescription)
{
- return GetProperty(L"DESC", pbstrDescription);
+ return GetProperty(L"DESC", pbstrDescription);
}
STDMETHODIMP CBaseSplitterFilter::get_Copyright(BSTR* pbstrCopyright)
{
- return GetProperty(L"CPYR", pbstrCopyright);
+ return GetProperty(L"CPYR", pbstrCopyright);
}
// IAMExtendedSeeking
STDMETHODIMP CBaseSplitterFilter::get_ExSeekCapabilities(long* pExCapabilities)
{
- CheckPointer(pExCapabilities, E_POINTER);
- *pExCapabilities = AM_EXSEEK_CANSEEK;
- if (ChapGetCount()) {
- *pExCapabilities |= AM_EXSEEK_MARKERSEEK;
- }
- return S_OK;
+ CheckPointer(pExCapabilities, E_POINTER);
+ *pExCapabilities = AM_EXSEEK_CANSEEK;
+ if (ChapGetCount()) {
+ *pExCapabilities |= AM_EXSEEK_MARKERSEEK;
+ }
+ return S_OK;
}
STDMETHODIMP CBaseSplitterFilter::get_MarkerCount(long* pMarkerCount)
{
- CheckPointer(pMarkerCount, E_POINTER);
- *pMarkerCount = (long)ChapGetCount();
- return S_OK;
+ CheckPointer(pMarkerCount, E_POINTER);
+ *pMarkerCount = (long)ChapGetCount();
+ return S_OK;
}
STDMETHODIMP CBaseSplitterFilter::get_CurrentMarker(long* pCurrentMarker)
{
- CheckPointer(pCurrentMarker, E_POINTER);
- REFERENCE_TIME rt = m_rtCurrent;
- long i = ChapLookup(&rt);
- if (i < 0) {
- return E_FAIL;
- }
- *pCurrentMarker = i+1;
- return S_OK;
+ CheckPointer(pCurrentMarker, E_POINTER);
+ REFERENCE_TIME rt = m_rtCurrent;
+ long i = ChapLookup(&rt);
+ if (i < 0) {
+ return E_FAIL;
+ }
+ *pCurrentMarker = i + 1;
+ return S_OK;
}
STDMETHODIMP CBaseSplitterFilter::GetMarkerTime(long MarkerNum, double* pMarkerTime)
{
- CheckPointer(pMarkerTime, E_POINTER);
- REFERENCE_TIME rt;
- if (FAILED(ChapGet((int)MarkerNum-1, &rt))) {
- return E_FAIL;
- }
- *pMarkerTime = (double)rt / 10000000;
- return S_OK;
+ CheckPointer(pMarkerTime, E_POINTER);
+ REFERENCE_TIME rt;
+ if (FAILED(ChapGet((int)MarkerNum - 1, &rt))) {
+ return E_FAIL;
+ }
+ *pMarkerTime = (double)rt / 10000000;
+ return S_OK;
}
STDMETHODIMP CBaseSplitterFilter::GetMarkerName(long MarkerNum, BSTR* pbstrMarkerName)
{
- return ChapGet((int)MarkerNum-1, NULL, pbstrMarkerName);
+ return ChapGet((int)MarkerNum - 1, NULL, pbstrMarkerName);
}
// IKeyFrameInfo
STDMETHODIMP CBaseSplitterFilter::GetKeyFrameCount(UINT& nKFs)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CBaseSplitterFilter::GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// IBufferInfo
STDMETHODIMP_(int) CBaseSplitterFilter::GetCount()
{
- CAutoLock cAutoLock(m_pLock);
+ CAutoLock cAutoLock(m_pLock);
- return (int)m_pOutputs.GetCount();
+ return (int)m_pOutputs.GetCount();
}
STDMETHODIMP CBaseSplitterFilter::GetStatus(int i, int& samples, int& size)
{
- CAutoLock cAutoLock(m_pLock);
+ CAutoLock cAutoLock(m_pLock);
- if (POSITION pos = m_pOutputs.FindIndex(i)) {
- CBaseSplitterOutputPin* pPin = m_pOutputs.GetAt(pos);
- samples = pPin->QueueCount();
- size = pPin->QueueSize();
- return pPin->IsConnected() ? S_OK : S_FALSE;
- }
+ if (POSITION pos = m_pOutputs.FindIndex(i)) {
+ CBaseSplitterOutputPin* pPin = m_pOutputs.GetAt(pos);
+ samples = pPin->QueueCount();
+ size = pPin->QueueSize();
+ return pPin->IsConnected() ? S_OK : S_FALSE;
+ }
- return E_INVALIDARG;
+ return E_INVALIDARG;
}
STDMETHODIMP_(DWORD) CBaseSplitterFilter::GetPriority()
{
- return m_priority;
+ return m_priority;
}
diff --git a/src/filters/parser/BaseSplitter/BaseSplitter.h b/src/filters/parser/BaseSplitter/BaseSplitter.h
index 0cd998dd4..b4dfce18f 100644
--- a/src/filters/parser/BaseSplitter/BaseSplitter.h
+++ b/src/filters/parser/BaseSplitter/BaseSplitter.h
@@ -34,432 +34,432 @@
#include "../../../DSUtil/DSMPropertyBag.h"
#include "../../../DSUtil/FontInstaller.h"
-#define MINPACKETS 100 // Beliyaal: Changed the min number of packets to allow Bluray playback over network
-#define MINPACKETSIZE 256*1024 // Beliyaal: Changed the min packet size to allow Bluray playback over network
+#define MINPACKETS 100 // Beliyaal: Changed the min number of packets to allow Bluray playback over network
+#define MINPACKETSIZE 256*1024 // Beliyaal: Changed the min packet size to allow Bluray playback over network
#define MAXPACKETS 1000
#define MAXPACKETSIZE 1024*1024*128
enum {
- /* various PCM "codecs" */
- FF_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
- FF_CODEC_ID_PCM_S16LE= 0x10000,
- FF_CODEC_ID_PCM_S16BE,
- FF_CODEC_ID_PCM_U16LE,
- FF_CODEC_ID_PCM_U16BE,
- FF_CODEC_ID_PCM_S8,
- FF_CODEC_ID_PCM_U8,
- FF_CODEC_ID_PCM_MULAW,
- FF_CODEC_ID_PCM_ALAW,
- FF_CODEC_ID_PCM_S32LE,
- FF_CODEC_ID_PCM_S32BE,
- FF_CODEC_ID_PCM_U32LE,
- FF_CODEC_ID_PCM_U32BE,
- FF_CODEC_ID_PCM_S24LE,
- FF_CODEC_ID_PCM_S24BE,
- FF_CODEC_ID_PCM_U24LE,
- FF_CODEC_ID_PCM_U24BE,
- FF_CODEC_ID_PCM_S24DAUD,
- FF_CODEC_ID_PCM_ZORK,
- FF_CODEC_ID_PCM_S16LE_PLANAR,
- FF_CODEC_ID_PCM_DVD,
- FF_CODEC_ID_PCM_F32BE,
- FF_CODEC_ID_PCM_F32LE,
- FF_CODEC_ID_PCM_F64BE,
- FF_CODEC_ID_PCM_F64LE,
- FF_CODEC_ID_PCM_BLURAY,
- FF_CODEC_ID_PCM_LXF,
- FF_CODEC_ID_S302M,
-
- /* various ADPCM codecs */
- FF_CODEC_ID_ADPCM_IMA_QT= 0x11000,
- FF_CODEC_ID_ADPCM_IMA_WAV,
- FF_CODEC_ID_ADPCM_IMA_DK3,
- FF_CODEC_ID_ADPCM_IMA_DK4,
- FF_CODEC_ID_ADPCM_IMA_WS,
- FF_CODEC_ID_ADPCM_IMA_SMJPEG,
- FF_CODEC_ID_ADPCM_MS,
- FF_CODEC_ID_ADPCM_4XM,
- FF_CODEC_ID_ADPCM_XA,
- FF_CODEC_ID_ADPCM_ADX,
- FF_CODEC_ID_ADPCM_EA,
- FF_CODEC_ID_ADPCM_G726,
- FF_CODEC_ID_ADPCM_CT,
- FF_CODEC_ID_ADPCM_SWF,
- FF_CODEC_ID_ADPCM_YAMAHA,
- FF_CODEC_ID_ADPCM_SBPRO_4,
- FF_CODEC_ID_ADPCM_SBPRO_3,
- FF_CODEC_ID_ADPCM_SBPRO_2,
- FF_CODEC_ID_ADPCM_THP,
- FF_CODEC_ID_ADPCM_IMA_AMV,
- FF_CODEC_ID_ADPCM_EA_R1,
- FF_CODEC_ID_ADPCM_EA_R3,
- FF_CODEC_ID_ADPCM_EA_R2,
- FF_CODEC_ID_ADPCM_IMA_EA_SEAD,
- FF_CODEC_ID_ADPCM_IMA_EA_EACS,
- FF_CODEC_ID_ADPCM_EA_XAS,
- FF_CODEC_ID_ADPCM_EA_MAXIS_XA,
- FF_CODEC_ID_ADPCM_IMA_ISS,
- FF_CODEC_ID_ADPCM_G722,
+ /* various PCM "codecs" */
+ FF_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
+ FF_CODEC_ID_PCM_S16LE = 0x10000,
+ FF_CODEC_ID_PCM_S16BE,
+ FF_CODEC_ID_PCM_U16LE,
+ FF_CODEC_ID_PCM_U16BE,
+ FF_CODEC_ID_PCM_S8,
+ FF_CODEC_ID_PCM_U8,
+ FF_CODEC_ID_PCM_MULAW,
+ FF_CODEC_ID_PCM_ALAW,
+ FF_CODEC_ID_PCM_S32LE,
+ FF_CODEC_ID_PCM_S32BE,
+ FF_CODEC_ID_PCM_U32LE,
+ FF_CODEC_ID_PCM_U32BE,
+ FF_CODEC_ID_PCM_S24LE,
+ FF_CODEC_ID_PCM_S24BE,
+ FF_CODEC_ID_PCM_U24LE,
+ FF_CODEC_ID_PCM_U24BE,
+ FF_CODEC_ID_PCM_S24DAUD,
+ FF_CODEC_ID_PCM_ZORK,
+ FF_CODEC_ID_PCM_S16LE_PLANAR,
+ FF_CODEC_ID_PCM_DVD,
+ FF_CODEC_ID_PCM_F32BE,
+ FF_CODEC_ID_PCM_F32LE,
+ FF_CODEC_ID_PCM_F64BE,
+ FF_CODEC_ID_PCM_F64LE,
+ FF_CODEC_ID_PCM_BLURAY,
+ FF_CODEC_ID_PCM_LXF,
+ FF_CODEC_ID_S302M,
+
+ /* various ADPCM codecs */
+ FF_CODEC_ID_ADPCM_IMA_QT = 0x11000,
+ FF_CODEC_ID_ADPCM_IMA_WAV,
+ FF_CODEC_ID_ADPCM_IMA_DK3,
+ FF_CODEC_ID_ADPCM_IMA_DK4,
+ FF_CODEC_ID_ADPCM_IMA_WS,
+ FF_CODEC_ID_ADPCM_IMA_SMJPEG,
+ FF_CODEC_ID_ADPCM_MS,
+ FF_CODEC_ID_ADPCM_4XM,
+ FF_CODEC_ID_ADPCM_XA,
+ FF_CODEC_ID_ADPCM_ADX,
+ FF_CODEC_ID_ADPCM_EA,
+ FF_CODEC_ID_ADPCM_G726,
+ FF_CODEC_ID_ADPCM_CT,
+ FF_CODEC_ID_ADPCM_SWF,
+ FF_CODEC_ID_ADPCM_YAMAHA,
+ FF_CODEC_ID_ADPCM_SBPRO_4,
+ FF_CODEC_ID_ADPCM_SBPRO_3,
+ FF_CODEC_ID_ADPCM_SBPRO_2,
+ FF_CODEC_ID_ADPCM_THP,
+ FF_CODEC_ID_ADPCM_IMA_AMV,
+ FF_CODEC_ID_ADPCM_EA_R1,
+ FF_CODEC_ID_ADPCM_EA_R3,
+ FF_CODEC_ID_ADPCM_EA_R2,
+ FF_CODEC_ID_ADPCM_IMA_EA_SEAD,
+ FF_CODEC_ID_ADPCM_IMA_EA_EACS,
+ FF_CODEC_ID_ADPCM_EA_XAS,
+ FF_CODEC_ID_ADPCM_EA_MAXIS_XA,
+ FF_CODEC_ID_ADPCM_IMA_ISS,
+ FF_CODEC_ID_ADPCM_G722,
};
class Packet : public CAtlArray<BYTE>
{
public:
- DWORD TrackNumber;
- BOOL bDiscontinuity, bSyncPoint, bAppendable;
- static const REFERENCE_TIME INVALID_TIME = _I64_MIN;
- REFERENCE_TIME rtStart, rtStop;
- AM_MEDIA_TYPE* pmt;
- Packet() {
- pmt = NULL;
- bDiscontinuity = bAppendable = FALSE;
- }
- virtual ~Packet() {
- if (pmt) {
- DeleteMediaType(pmt);
- }
- }
- virtual int GetDataSize() {return (int)GetCount();}
- void SetData(const void* ptr, DWORD len) {
- SetCount(len);
- memcpy(GetData(), ptr, len);
- }
+ DWORD TrackNumber;
+ BOOL bDiscontinuity, bSyncPoint, bAppendable;
+ static const REFERENCE_TIME INVALID_TIME = _I64_MIN;
+ REFERENCE_TIME rtStart, rtStop;
+ AM_MEDIA_TYPE* pmt;
+ Packet() {
+ pmt = NULL;
+ bDiscontinuity = bAppendable = FALSE;
+ }
+ virtual ~Packet() {
+ if (pmt) {
+ DeleteMediaType(pmt);
+ }
+ }
+ virtual int GetDataSize() {return (int)GetCount();}
+ void SetData(const void* ptr, DWORD len) {
+ SetCount(len);
+ memcpy(GetData(), ptr, len);
+ }
};
class CPacketQueue
- : public CCritSec
- , protected CAutoPtrList<Packet>
+ : public CCritSec
+ , protected CAutoPtrList<Packet>
{
- int m_size;
+ int m_size;
public:
- CPacketQueue();
- void Add(CAutoPtr<Packet> p);
- CAutoPtr<Packet> Remove();
- void RemoveAll();
- int GetCount(), GetSize();
+ CPacketQueue();
+ void Add(CAutoPtr<Packet> p);
+ CAutoPtr<Packet> Remove();
+ void RemoveAll();
+ int GetCount(), GetSize();
};
class CBaseSplitterFilter;
class CBaseSplitterInputPin
- : public CBasePin
+ : public CBasePin
{
protected:
- CComQIPtr<IAsyncReader> m_pAsyncReader;
+ CComQIPtr<IAsyncReader> m_pAsyncReader;
public:
- CBaseSplitterInputPin(TCHAR* pName, CBaseSplitterFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- virtual ~CBaseSplitterInputPin();
+ CBaseSplitterInputPin(TCHAR* pName, CBaseSplitterFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ virtual ~CBaseSplitterInputPin();
- HRESULT GetAsyncReader(IAsyncReader** ppAsyncReader);
+ HRESULT GetAsyncReader(IAsyncReader** ppAsyncReader);
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- HRESULT CheckMediaType(const CMediaType* pmt);
+ HRESULT CheckMediaType(const CMediaType* pmt);
- HRESULT CheckConnect(IPin* pPin);
- HRESULT BreakConnect();
- HRESULT CompleteConnect(IPin* pPin);
+ HRESULT CheckConnect(IPin* pPin);
+ HRESULT BreakConnect();
+ HRESULT CompleteConnect(IPin* pPin);
- STDMETHODIMP BeginFlush();
- STDMETHODIMP EndFlush();
+ STDMETHODIMP BeginFlush();
+ STDMETHODIMP EndFlush();
};
class CBaseSplitterOutputPin
- : public CBaseOutputPin
- , public IDSMPropertyBagImpl
- , protected CAMThread
- , public IMediaSeeking
- , public IBitRateInfo
+ : public CBaseOutputPin
+ , public IDSMPropertyBagImpl
+ , protected CAMThread
+ , public IMediaSeeking
+ , public IBitRateInfo
{
protected:
- CAtlArray<CMediaType> m_mts;
- int m_nBuffers;
+ CAtlArray<CMediaType> m_mts;
+ int m_nBuffers;
private:
- CPacketQueue m_queue;
+ CPacketQueue m_queue;
- HRESULT m_hrDeliver;
+ HRESULT m_hrDeliver;
- bool m_fFlushing, m_fFlushed;
- CAMEvent m_eEndFlush;
+ bool m_fFlushing, m_fFlushed;
+ CAMEvent m_eEndFlush;
- enum {CMD_EXIT};
- DWORD ThreadProc();
+ enum {CMD_EXIT};
+ DWORD ThreadProc();
- void MakeISCRHappy();
+ void MakeISCRHappy();
- // please only use DeliverPacket from the derived class
- HRESULT GetDeliveryBuffer(IMediaSample** ppSample, REFERENCE_TIME* pStartTime, REFERENCE_TIME* pEndTime, DWORD dwFlags);
- HRESULT Deliver(IMediaSample* pSample);
+ // please only use DeliverPacket from the derived class
+ HRESULT GetDeliveryBuffer(IMediaSample** ppSample, REFERENCE_TIME* pStartTime, REFERENCE_TIME* pEndTime, DWORD dwFlags);
+ HRESULT Deliver(IMediaSample* pSample);
- // bitrate stats
+ // bitrate stats
- struct {
- UINT64 nTotalBytesDelivered;
- REFERENCE_TIME rtTotalTimeDelivered;
- UINT64 nBytesSinceLastDeliverTime;
- REFERENCE_TIME rtLastDeliverTime;
- DWORD nCurrentBitRate;
- DWORD nAverageBitRate;
- } m_brs;
+ struct {
+ UINT64 nTotalBytesDelivered;
+ REFERENCE_TIME rtTotalTimeDelivered;
+ UINT64 nBytesSinceLastDeliverTime;
+ REFERENCE_TIME rtLastDeliverTime;
+ DWORD nCurrentBitRate;
+ DWORD nAverageBitRate;
+ } m_brs;
- int m_QueueMaxPackets;
+ int m_QueueMaxPackets;
protected:
- REFERENCE_TIME m_rtStart;
-
- // override this if you need some second level stream specific demuxing (optional)
- // the default implementation will send the sample as is
- virtual HRESULT DeliverPacket(CAutoPtr<Packet> p);
-
- // IMediaSeeking
-
- STDMETHODIMP GetCapabilities(DWORD* pCapabilities);
- STDMETHODIMP CheckCapabilities(DWORD* pCapabilities);
- STDMETHODIMP IsFormatSupported(const GUID* pFormat);
- STDMETHODIMP QueryPreferredFormat(GUID* pFormat);
- STDMETHODIMP GetTimeFormat(GUID* pFormat);
- STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
- STDMETHODIMP SetTimeFormat(const GUID* pFormat);
- STDMETHODIMP GetDuration(LONGLONG* pDuration);
- STDMETHODIMP GetStopPosition(LONGLONG* pStop);
- STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent);
- STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
- STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
- STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
- STDMETHODIMP GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest);
- STDMETHODIMP SetRate(double dRate);
- STDMETHODIMP GetRate(double* pdRate);
- STDMETHODIMP GetPreroll(LONGLONG* pllPreroll);
+ REFERENCE_TIME m_rtStart;
+
+ // override this if you need some second level stream specific demuxing (optional)
+ // the default implementation will send the sample as is
+ virtual HRESULT DeliverPacket(CAutoPtr<Packet> p);
+
+ // IMediaSeeking
+
+ STDMETHODIMP GetCapabilities(DWORD* pCapabilities);
+ STDMETHODIMP CheckCapabilities(DWORD* pCapabilities);
+ STDMETHODIMP IsFormatSupported(const GUID* pFormat);
+ STDMETHODIMP QueryPreferredFormat(GUID* pFormat);
+ STDMETHODIMP GetTimeFormat(GUID* pFormat);
+ STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
+ STDMETHODIMP SetTimeFormat(const GUID* pFormat);
+ STDMETHODIMP GetDuration(LONGLONG* pDuration);
+ STDMETHODIMP GetStopPosition(LONGLONG* pStop);
+ STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent);
+ STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
+ STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
+ STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
+ STDMETHODIMP GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest);
+ STDMETHODIMP SetRate(double dRate);
+ STDMETHODIMP GetRate(double* pdRate);
+ STDMETHODIMP GetPreroll(LONGLONG* pllPreroll);
public:
- CBaseSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr, int nBuffers = 0, int QueueMaxPackets = MAXPACKETS);
- CBaseSplitterOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr, int nBuffers = 0, int QueueMaxPackets = MAXPACKETS);
- virtual ~CBaseSplitterOutputPin();
+ CBaseSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr, int nBuffers = 0, int QueueMaxPackets = MAXPACKETS);
+ CBaseSplitterOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr, int nBuffers = 0, int QueueMaxPackets = MAXPACKETS);
+ virtual ~CBaseSplitterOutputPin();
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- HRESULT SetName(LPCWSTR pName);
+ HRESULT SetName(LPCWSTR pName);
- HRESULT DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT CheckMediaType(const CMediaType* pmt);
- HRESULT GetMediaType(int iPosition, CMediaType* pmt);
- CMediaType& CurrentMediaType() {return m_mt;}
+ HRESULT DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT CheckMediaType(const CMediaType* pmt);
+ HRESULT GetMediaType(int iPosition, CMediaType* pmt);
+ CMediaType& CurrentMediaType() {return m_mt;}
- STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
+ STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
- // Queueing
+ // Queueing
- HANDLE GetThreadHandle() {
- ASSERT(m_hThread != NULL);
- return m_hThread;
- }
- void SetThreadPriority(int nPriority) {
- if (m_hThread) {
- ::SetThreadPriority(m_hThread, nPriority);
- }
- }
+ HANDLE GetThreadHandle() {
+ ASSERT(m_hThread != NULL);
+ return m_hThread;
+ }
+ void SetThreadPriority(int nPriority) {
+ if (m_hThread) {
+ ::SetThreadPriority(m_hThread, nPriority);
+ }
+ }
- HRESULT Active();
- HRESULT Inactive();
+ HRESULT Active();
+ HRESULT Inactive();
- HRESULT DeliverBeginFlush();
- HRESULT DeliverEndFlush();
- HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT DeliverBeginFlush();
+ HRESULT DeliverEndFlush();
+ HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
- int QueueCount();
- int QueueSize();
- HRESULT QueueEndOfStream();
- HRESULT QueuePacket(CAutoPtr<Packet> p);
+ int QueueCount();
+ int QueueSize();
+ HRESULT QueueEndOfStream();
+ HRESULT QueuePacket(CAutoPtr<Packet> p);
- // returns true for everything which (the lack of) would not block other streams (subtitle streams, basically)
- virtual bool IsDiscontinuous();
+ // returns true for everything which (the lack of) would not block other streams (subtitle streams, basically)
+ virtual bool IsDiscontinuous();
- // returns IStreamsSwitcherInputPin::IsActive(), when it can find one downstream
- bool IsActive();
+ // returns IStreamsSwitcherInputPin::IsActive(), when it can find one downstream
+ bool IsActive();
- // IBitRateInfo
+ // IBitRateInfo
- STDMETHODIMP_(DWORD) GetCurrentBitRate() {return m_brs.nCurrentBitRate;}
- STDMETHODIMP_(DWORD) GetAverageBitRate() {return m_brs.nAverageBitRate;}
+ STDMETHODIMP_(DWORD) GetCurrentBitRate() {return m_brs.nCurrentBitRate;}
+ STDMETHODIMP_(DWORD) GetAverageBitRate() {return m_brs.nAverageBitRate;}
};
class CBaseSplitterFilter
- : public CBaseFilter
- , public CCritSec
- , public IDSMPropertyBagImpl
- , public IDSMResourceBagImpl
- , public IDSMChapterBagImpl
- , protected CAMThread
- , public IFileSourceFilter
- , public IMediaSeeking
- , public IAMOpenProgress
- , public IAMMediaContent
- , public IAMExtendedSeeking
- , public IKeyFrameInfo
- , public IBufferInfo
+ : public CBaseFilter
+ , public CCritSec
+ , public IDSMPropertyBagImpl
+ , public IDSMResourceBagImpl
+ , public IDSMChapterBagImpl
+ , protected CAMThread
+ , public IFileSourceFilter
+ , public IMediaSeeking
+ , public IAMOpenProgress
+ , public IAMMediaContent
+ , public IAMExtendedSeeking
+ , public IKeyFrameInfo
+ , public IBufferInfo
{
- CCritSec m_csPinMap;
- CAtlMap<DWORD, CBaseSplitterOutputPin*> m_pPinMap;
+ CCritSec m_csPinMap;
+ CAtlMap<DWORD, CBaseSplitterOutputPin*> m_pPinMap;
- CCritSec m_csmtnew;
- CAtlMap<DWORD, CMediaType> m_mtnew;
+ CCritSec m_csmtnew;
+ CAtlMap<DWORD, CMediaType> m_mtnew;
- CAutoPtrList<CBaseSplitterOutputPin> m_pRetiredOutputs;
+ CAutoPtrList<CBaseSplitterOutputPin> m_pRetiredOutputs;
- CComQIPtr<ISyncReader> m_pSyncReader;
+ CComQIPtr<ISyncReader> m_pSyncReader;
protected:
- CStringW m_fn;
+ CStringW m_fn;
- CAutoPtr<CBaseSplitterInputPin> m_pInput;
- CAutoPtrList<CBaseSplitterOutputPin> m_pOutputs;
+ CAutoPtr<CBaseSplitterInputPin> m_pInput;
+ CAutoPtrList<CBaseSplitterOutputPin> m_pOutputs;
- CBaseSplitterOutputPin* GetOutputPin(DWORD TrackNum);
- DWORD GetOutputTrackNum(CBaseSplitterOutputPin* pPin);
- HRESULT AddOutputPin(DWORD TrackNum, CAutoPtr<CBaseSplitterOutputPin> pPin);
- HRESULT RenameOutputPin(DWORD TrackNumSrc, DWORD TrackNumDst, const AM_MEDIA_TYPE* pmt);
- virtual HRESULT DeleteOutputs();
- virtual HRESULT CreateOutputs(IAsyncReader* pAsyncReader) = 0; // override this ...
- virtual LPCTSTR GetPartFilename(IAsyncReader* pAsyncReader);
+ CBaseSplitterOutputPin* GetOutputPin(DWORD TrackNum);
+ DWORD GetOutputTrackNum(CBaseSplitterOutputPin* pPin);
+ HRESULT AddOutputPin(DWORD TrackNum, CAutoPtr<CBaseSplitterOutputPin> pPin);
+ HRESULT RenameOutputPin(DWORD TrackNumSrc, DWORD TrackNumDst, const AM_MEDIA_TYPE* pmt);
+ virtual HRESULT DeleteOutputs();
+ virtual HRESULT CreateOutputs(IAsyncReader* pAsyncReader) = 0; // override this ...
+ virtual LPCTSTR GetPartFilename(IAsyncReader* pAsyncReader);
- LONGLONG m_nOpenProgress;
- bool m_fAbort;
+ LONGLONG m_nOpenProgress;
+ bool m_fAbort;
- REFERENCE_TIME m_rtDuration; // derived filter should set this at the end of CreateOutputs
- REFERENCE_TIME m_rtStart, m_rtStop, m_rtCurrent, m_rtNewStart, m_rtNewStop;
- double m_dRate;
+ REFERENCE_TIME m_rtDuration; // derived filter should set this at the end of CreateOutputs
+ REFERENCE_TIME m_rtStart, m_rtStop, m_rtCurrent, m_rtNewStart, m_rtNewStop;
+ double m_dRate;
- CAtlList<UINT64> m_bDiscontinuitySent;
- CAtlList<CBaseSplitterOutputPin*> m_pActivePins;
+ CAtlList<UINT64> m_bDiscontinuitySent;
+ CAtlList<CBaseSplitterOutputPin*> m_pActivePins;
- CAMEvent m_eEndFlush;
- bool m_fFlushing;
+ CAMEvent m_eEndFlush;
+ bool m_fFlushing;
- void DeliverBeginFlush();
- void DeliverEndFlush();
- HRESULT DeliverPacket(CAutoPtr<Packet> p);
+ void DeliverBeginFlush();
+ void DeliverEndFlush();
+ HRESULT DeliverPacket(CAutoPtr<Packet> p);
- int m_priority;
+ int m_priority;
- CFontInstaller m_fontinst;
+ CFontInstaller m_fontinst;
- int m_QueueMaxPackets;
+ int m_QueueMaxPackets;
protected:
- enum {CMD_EXIT, CMD_SEEK};
- DWORD ThreadProc();
+ enum {CMD_EXIT, CMD_SEEK};
+ DWORD ThreadProc();
- // ... and also override all these too
- virtual bool DemuxInit() = 0;
- virtual void DemuxSeek(REFERENCE_TIME rt) = 0;
- virtual bool DemuxLoop() = 0;
- virtual bool BuildPlaylist(LPCTSTR pszFileName, CAtlList<CHdmvClipInfo::PlaylistItem>& Items) { return false; };
- virtual bool BuildChapters(LPCTSTR pszFileName, CAtlList<CHdmvClipInfo::PlaylistItem>& PlaylistItems, CAtlList<CHdmvClipInfo::PlaylistChapter>& Items) { return false; };
+ // ... and also override all these too
+ virtual bool DemuxInit() = 0;
+ virtual void DemuxSeek(REFERENCE_TIME rt) = 0;
+ virtual bool DemuxLoop() = 0;
+ virtual bool BuildPlaylist(LPCTSTR pszFileName, CAtlList<CHdmvClipInfo::PlaylistItem>& Items) { return false; };
+ virtual bool BuildChapters(LPCTSTR pszFileName, CAtlList<CHdmvClipInfo::PlaylistItem>& PlaylistItems, CAtlList<CHdmvClipInfo::PlaylistChapter>& Items) { return false; };
public:
- CBaseSplitterFilter(LPCTSTR pName, LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid, int QueueMaxPackets = MAXPACKETS);
- virtual ~CBaseSplitterFilter();
+ CBaseSplitterFilter(LPCTSTR pName, LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid, int QueueMaxPackets = MAXPACKETS);
+ virtual ~CBaseSplitterFilter();
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- bool IsAnyPinDrying();
+ bool IsAnyPinDrying();
- HRESULT BreakConnect(PIN_DIRECTION dir, CBasePin* pPin);
- HRESULT CompleteConnect(PIN_DIRECTION dir, CBasePin* pPin);
+ HRESULT BreakConnect(PIN_DIRECTION dir, CBasePin* pPin);
+ HRESULT CompleteConnect(PIN_DIRECTION dir, CBasePin* pPin);
- int GetPinCount();
- CBasePin* GetPin(int n);
+ int GetPinCount();
+ CBasePin* GetPin(int n);
- STDMETHODIMP Stop();
- STDMETHODIMP Pause();
- STDMETHODIMP Run(REFERENCE_TIME tStart);
+ STDMETHODIMP Stop();
+ STDMETHODIMP Pause();
+ STDMETHODIMP Run(REFERENCE_TIME tStart);
- // IFileSourceFilter
+ // IFileSourceFilter
- STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
- STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
- // IMediaSeeking
+ // IMediaSeeking
- STDMETHODIMP GetCapabilities(DWORD* pCapabilities);
- STDMETHODIMP CheckCapabilities(DWORD* pCapabilities);
- STDMETHODIMP IsFormatSupported(const GUID* pFormat);
- STDMETHODIMP QueryPreferredFormat(GUID* pFormat);
- STDMETHODIMP GetTimeFormat(GUID* pFormat);
- STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
- STDMETHODIMP SetTimeFormat(const GUID* pFormat);
- STDMETHODIMP GetDuration(LONGLONG* pDuration);
- STDMETHODIMP GetStopPosition(LONGLONG* pStop);
- STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent);
- STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
- STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
- STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
- STDMETHODIMP GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest);
- STDMETHODIMP SetRate(double dRate);
- STDMETHODIMP GetRate(double* pdRate);
- STDMETHODIMP GetPreroll(LONGLONG* pllPreroll);
+ STDMETHODIMP GetCapabilities(DWORD* pCapabilities);
+ STDMETHODIMP CheckCapabilities(DWORD* pCapabilities);
+ STDMETHODIMP IsFormatSupported(const GUID* pFormat);
+ STDMETHODIMP QueryPreferredFormat(GUID* pFormat);
+ STDMETHODIMP GetTimeFormat(GUID* pFormat);
+ STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
+ STDMETHODIMP SetTimeFormat(const GUID* pFormat);
+ STDMETHODIMP GetDuration(LONGLONG* pDuration);
+ STDMETHODIMP GetStopPosition(LONGLONG* pStop);
+ STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent);
+ STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
+ STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
+ STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
+ STDMETHODIMP GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest);
+ STDMETHODIMP SetRate(double dRate);
+ STDMETHODIMP GetRate(double* pdRate);
+ STDMETHODIMP GetPreroll(LONGLONG* pllPreroll);
protected:
- friend class CBaseSplitterOutputPin;
- virtual HRESULT SetPositionsInternal(void* id, LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
+ friend class CBaseSplitterOutputPin;
+ virtual HRESULT SetPositionsInternal(void* id, LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
private:
- REFERENCE_TIME m_rtLastStart, m_rtLastStop;
- CAtlList<void*> m_LastSeekers;
+ REFERENCE_TIME m_rtLastStart, m_rtLastStop;
+ CAtlList<void*> m_LastSeekers;
public:
- // IAMOpenProgress
-
- STDMETHODIMP QueryProgress(LONGLONG* pllTotal, LONGLONG* pllCurrent);
- STDMETHODIMP AbortOperation();
-
- // IDispatch
-
- STDMETHODIMP GetTypeInfoCount(UINT* pctinfo) {return E_NOTIMPL;}
- STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) {return E_NOTIMPL;}
- STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid) {return E_NOTIMPL;}
- STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr) {return E_NOTIMPL;}
-
- // IAMMediaContent
-
- STDMETHODIMP get_AuthorName(BSTR* pbstrAuthorName);
- STDMETHODIMP get_Title(BSTR* pbstrTitle);
- STDMETHODIMP get_Rating(BSTR* pbstrRating);
- STDMETHODIMP get_Description(BSTR* pbstrDescription);
- STDMETHODIMP get_Copyright(BSTR* pbstrCopyright);
- STDMETHODIMP get_BaseURL(BSTR* pbstrBaseURL) {return E_NOTIMPL;}
- STDMETHODIMP get_LogoURL(BSTR* pbstrLogoURL) {return E_NOTIMPL;}
- STDMETHODIMP get_LogoIconURL(BSTR* pbstrLogoURL) {return E_NOTIMPL;}
- STDMETHODIMP get_WatermarkURL(BSTR* pbstrWatermarkURL) {return E_NOTIMPL;}
- STDMETHODIMP get_MoreInfoURL(BSTR* pbstrMoreInfoURL) {return E_NOTIMPL;}
- STDMETHODIMP get_MoreInfoBannerImage(BSTR* pbstrMoreInfoBannerImage) {return E_NOTIMPL;}
- STDMETHODIMP get_MoreInfoBannerURL(BSTR* pbstrMoreInfoBannerURL) {return E_NOTIMPL;}
- STDMETHODIMP get_MoreInfoText(BSTR* pbstrMoreInfoText) {return E_NOTIMPL;}
-
- // IAMExtendedSeeking
-
- STDMETHODIMP get_ExSeekCapabilities(long* pExCapabilities);
- STDMETHODIMP get_MarkerCount(long* pMarkerCount);
- STDMETHODIMP get_CurrentMarker(long* pCurrentMarker);
- STDMETHODIMP GetMarkerTime(long MarkerNum, double* pMarkerTime);
- STDMETHODIMP GetMarkerName(long MarkerNum, BSTR* pbstrMarkerName);
- STDMETHODIMP put_PlaybackSpeed(double Speed) {return E_NOTIMPL;}
- STDMETHODIMP get_PlaybackSpeed(double* pSpeed) {return E_NOTIMPL;}
-
- // IKeyFrameInfo
-
- STDMETHODIMP_(HRESULT) GetKeyFrameCount(UINT& nKFs);
- STDMETHODIMP_(HRESULT) GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
-
- // IBufferInfo
-
- STDMETHODIMP_(int) GetCount();
- STDMETHODIMP GetStatus(int i, int& samples, int& size);
- STDMETHODIMP_(DWORD) GetPriority();
+ // IAMOpenProgress
+
+ STDMETHODIMP QueryProgress(LONGLONG* pllTotal, LONGLONG* pllCurrent);
+ STDMETHODIMP AbortOperation();
+
+ // IDispatch
+
+ STDMETHODIMP GetTypeInfoCount(UINT* pctinfo) {return E_NOTIMPL;}
+ STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) {return E_NOTIMPL;}
+ STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid) {return E_NOTIMPL;}
+ STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr) {return E_NOTIMPL;}
+
+ // IAMMediaContent
+
+ STDMETHODIMP get_AuthorName(BSTR* pbstrAuthorName);
+ STDMETHODIMP get_Title(BSTR* pbstrTitle);
+ STDMETHODIMP get_Rating(BSTR* pbstrRating);
+ STDMETHODIMP get_Description(BSTR* pbstrDescription);
+ STDMETHODIMP get_Copyright(BSTR* pbstrCopyright);
+ STDMETHODIMP get_BaseURL(BSTR* pbstrBaseURL) {return E_NOTIMPL;}
+ STDMETHODIMP get_LogoURL(BSTR* pbstrLogoURL) {return E_NOTIMPL;}
+ STDMETHODIMP get_LogoIconURL(BSTR* pbstrLogoURL) {return E_NOTIMPL;}
+ STDMETHODIMP get_WatermarkURL(BSTR* pbstrWatermarkURL) {return E_NOTIMPL;}
+ STDMETHODIMP get_MoreInfoURL(BSTR* pbstrMoreInfoURL) {return E_NOTIMPL;}
+ STDMETHODIMP get_MoreInfoBannerImage(BSTR* pbstrMoreInfoBannerImage) {return E_NOTIMPL;}
+ STDMETHODIMP get_MoreInfoBannerURL(BSTR* pbstrMoreInfoBannerURL) {return E_NOTIMPL;}
+ STDMETHODIMP get_MoreInfoText(BSTR* pbstrMoreInfoText) {return E_NOTIMPL;}
+
+ // IAMExtendedSeeking
+
+ STDMETHODIMP get_ExSeekCapabilities(long* pExCapabilities);
+ STDMETHODIMP get_MarkerCount(long* pMarkerCount);
+ STDMETHODIMP get_CurrentMarker(long* pCurrentMarker);
+ STDMETHODIMP GetMarkerTime(long MarkerNum, double* pMarkerTime);
+ STDMETHODIMP GetMarkerName(long MarkerNum, BSTR* pbstrMarkerName);
+ STDMETHODIMP put_PlaybackSpeed(double Speed) {return E_NOTIMPL;}
+ STDMETHODIMP get_PlaybackSpeed(double* pSpeed) {return E_NOTIMPL;}
+
+ // IKeyFrameInfo
+
+ STDMETHODIMP_(HRESULT) GetKeyFrameCount(UINT& nKFs);
+ STDMETHODIMP_(HRESULT) GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
+
+ // IBufferInfo
+
+ STDMETHODIMP_(int) GetCount();
+ STDMETHODIMP GetStatus(int i, int& samples, int& size);
+ STDMETHODIMP_(DWORD) GetPriority();
};
diff --git a/src/filters/parser/BaseSplitter/BaseSplitterFile.cpp b/src/filters/parser/BaseSplitter/BaseSplitterFile.cpp
index 3db0849e2..08a117b8c 100644
--- a/src/filters/parser/BaseSplitter/BaseSplitterFile.cpp
+++ b/src/filters/parser/BaseSplitter/BaseSplitterFile.cpp
@@ -30,222 +30,222 @@
//
CBaseSplitterFile::CBaseSplitterFile(IAsyncReader* pAsyncReader, HRESULT& hr, int cachelen, bool fRandomAccess, bool fStreaming)
- : m_pAsyncReader(pAsyncReader)
- , m_fStreaming(false)
- , m_fRandomAccess(false)
- , m_pos(0), m_len(0)
- , m_bitbuff(0), m_bitlen(0)
- , m_cachepos(0), m_cachelen(0)
+ : m_pAsyncReader(pAsyncReader)
+ , m_fStreaming(false)
+ , m_fRandomAccess(false)
+ , m_pos(0), m_len(0)
+ , m_bitbuff(0), m_bitlen(0)
+ , m_cachepos(0), m_cachelen(0)
{
- if (!m_pAsyncReader) {
- hr = E_UNEXPECTED;
- return;
- }
+ if (!m_pAsyncReader) {
+ hr = E_UNEXPECTED;
+ return;
+ }
- LONGLONG total = 0, available;
- hr = m_pAsyncReader->Length(&total, &available);
+ LONGLONG total = 0, available;
+ hr = m_pAsyncReader->Length(&total, &available);
- m_fStreaming = total == 0 && available > 0;
- m_fRandomAccess = total > 0 && total == available;
- m_len = total;
+ m_fStreaming = total == 0 && available > 0;
+ m_fRandomAccess = total > 0 && total == available;
+ m_len = total;
- if (FAILED(hr) || fRandomAccess && !m_fRandomAccess || !fStreaming && m_fStreaming || m_len < 0) {
- hr = E_FAIL;
- return;
- }
+ if (FAILED(hr) || fRandomAccess && !m_fRandomAccess || !fStreaming && m_fStreaming || m_len < 0) {
+ hr = E_FAIL;
+ return;
+ }
- if (!SetCacheSize(cachelen)) {
- hr = E_OUTOFMEMORY;
- return;
- }
+ if (!SetCacheSize(cachelen)) {
+ hr = E_OUTOFMEMORY;
+ return;
+ }
- hr = S_OK;
+ hr = S_OK;
}
bool CBaseSplitterFile::SetCacheSize(int cachelen)
{
- m_pCache.Free();
- m_cachetotal = 0;
- m_pCache.Allocate((size_t)cachelen);
- if (!m_pCache) {
- return false;
- }
- m_cachetotal = cachelen;
- m_cachelen = 0;
- return true;
+ m_pCache.Free();
+ m_cachetotal = 0;
+ m_pCache.Allocate((size_t)cachelen);
+ if (!m_pCache) {
+ return false;
+ }
+ m_cachetotal = cachelen;
+ m_cachelen = 0;
+ return true;
}
__int64 CBaseSplitterFile::GetPos()
{
- return m_pos - (m_bitlen>>3);
+ return m_pos - (m_bitlen >> 3);
}
__int64 CBaseSplitterFile::GetAvailable()
{
- LONGLONG total, available = 0;
- m_pAsyncReader->Length(&total, &available);
- return available;
+ LONGLONG total, available = 0;
+ m_pAsyncReader->Length(&total, &available);
+ return available;
}
__int64 CBaseSplitterFile::GetLength(bool fUpdate)
{
- if (m_fStreaming) {
- m_len = GetAvailable();
- } else if (fUpdate) {
- LONGLONG total = 0, available;
- m_pAsyncReader->Length(&total, &available);
- m_len = total;
- }
-
- return m_len;
+ if (m_fStreaming) {
+ m_len = GetAvailable();
+ } else if (fUpdate) {
+ LONGLONG total = 0, available;
+ m_pAsyncReader->Length(&total, &available);
+ m_len = total;
+ }
+
+ return m_len;
}
void CBaseSplitterFile::Seek(__int64 pos)
{
- __int64 len = GetLength();
- m_pos = min(max(pos, 0), len);
- BitFlush();
+ __int64 len = GetLength();
+ m_pos = min(max(pos, 0), len);
+ BitFlush();
}
HRESULT CBaseSplitterFile::Read(BYTE* pData, __int64 len)
{
- CheckPointer(m_pAsyncReader, E_NOINTERFACE);
-
- HRESULT hr = S_OK;
-
- if (!m_fRandomAccess) {
- LONGLONG total = 0, available = -1;
- m_pAsyncReader->Length(&total, &available);
- if (total == available) {
- m_fRandomAccess = true;
- OnComplete();
- }
- }
-
- if (m_cachetotal == 0 || !m_pCache) {
- hr = m_pAsyncReader->SyncRead(m_pos, (long)len, pData);
- m_pos += len;
- return hr;
- }
-
- BYTE* pCache = m_pCache;
-
- if (m_cachepos <= m_pos && m_pos < m_cachepos + m_cachelen) {
- __int64 minlen = min(len, m_cachelen - (m_pos - m_cachepos));
-
- memcpy(pData, &pCache[m_pos - m_cachepos], (size_t)minlen);
-
- len -= minlen;
- m_pos += minlen;
- pData += minlen;
- }
-
- while (len > m_cachetotal) {
- hr = m_pAsyncReader->SyncRead(m_pos, (long)m_cachetotal, pData);
- if (S_OK != hr) {
- return hr;
- }
-
- len -= m_cachetotal;
- m_pos += m_cachetotal;
- pData += m_cachetotal;
- }
-
- while (len > 0) {
- __int64 tmplen = GetLength();
- __int64 maxlen = min(tmplen - m_pos, m_cachetotal);
- __int64 minlen = min(len, maxlen);
- if (minlen <= 0) {
- return S_FALSE;
- }
-
- hr = m_pAsyncReader->SyncRead(m_pos, (long)maxlen, pCache);
- if (S_OK != hr) {
- return hr;
- }
-
- m_cachepos = m_pos;
- m_cachelen = maxlen;
-
- memcpy(pData, pCache, (size_t)minlen);
-
- len -= minlen;
- m_pos += minlen;
- pData += minlen;
- }
-
- return hr;
+ CheckPointer(m_pAsyncReader, E_NOINTERFACE);
+
+ HRESULT hr = S_OK;
+
+ if (!m_fRandomAccess) {
+ LONGLONG total = 0, available = -1;
+ m_pAsyncReader->Length(&total, &available);
+ if (total == available) {
+ m_fRandomAccess = true;
+ OnComplete();
+ }
+ }
+
+ if (m_cachetotal == 0 || !m_pCache) {
+ hr = m_pAsyncReader->SyncRead(m_pos, (long)len, pData);
+ m_pos += len;
+ return hr;
+ }
+
+ BYTE* pCache = m_pCache;
+
+ if (m_cachepos <= m_pos && m_pos < m_cachepos + m_cachelen) {
+ __int64 minlen = min(len, m_cachelen - (m_pos - m_cachepos));
+
+ memcpy(pData, &pCache[m_pos - m_cachepos], (size_t)minlen);
+
+ len -= minlen;
+ m_pos += minlen;
+ pData += minlen;
+ }
+
+ while (len > m_cachetotal) {
+ hr = m_pAsyncReader->SyncRead(m_pos, (long)m_cachetotal, pData);
+ if (S_OK != hr) {
+ return hr;
+ }
+
+ len -= m_cachetotal;
+ m_pos += m_cachetotal;
+ pData += m_cachetotal;
+ }
+
+ while (len > 0) {
+ __int64 tmplen = GetLength();
+ __int64 maxlen = min(tmplen - m_pos, m_cachetotal);
+ __int64 minlen = min(len, maxlen);
+ if (minlen <= 0) {
+ return S_FALSE;
+ }
+
+ hr = m_pAsyncReader->SyncRead(m_pos, (long)maxlen, pCache);
+ if (S_OK != hr) {
+ return hr;
+ }
+
+ m_cachepos = m_pos;
+ m_cachelen = maxlen;
+
+ memcpy(pData, pCache, (size_t)minlen);
+
+ len -= minlen;
+ m_pos += minlen;
+ pData += minlen;
+ }
+
+ return hr;
}
UINT64 CBaseSplitterFile::BitRead(int nBits, bool fPeek)
{
- ASSERT(nBits >= 0 && nBits <= 64);
+ ASSERT(nBits >= 0 && nBits <= 64);
- while (m_bitlen < nBits) {
- m_bitbuff <<= 8;
- if (S_OK != Read((BYTE*)&m_bitbuff, 1)) {
- return 0; // EOF? // ASSERT(0);
- }
- m_bitlen += 8;
- }
+ while (m_bitlen < nBits) {
+ m_bitbuff <<= 8;
+ if (S_OK != Read((BYTE*)&m_bitbuff, 1)) {
+ return 0; // EOF? // ASSERT(0);
+ }
+ m_bitlen += 8;
+ }
- int bitlen = m_bitlen - nBits;
+ int bitlen = m_bitlen - nBits;
- UINT64 ret = (m_bitbuff >> bitlen) & ((1ui64 << nBits) - 1);
+ UINT64 ret = (m_bitbuff >> bitlen) & ((1ui64 << nBits) - 1);
- if (!fPeek) {
- m_bitbuff &= ((1ui64 << bitlen) - 1);
- m_bitlen = bitlen;
- }
+ if (!fPeek) {
+ m_bitbuff &= ((1ui64 << bitlen) - 1);
+ m_bitlen = bitlen;
+ }
- return ret;
+ return ret;
}
void CBaseSplitterFile::BitByteAlign()
{
- m_bitlen &= ~7;
+ m_bitlen &= ~7;
}
void CBaseSplitterFile::BitFlush()
{
- m_bitlen = 0;
+ m_bitlen = 0;
}
HRESULT CBaseSplitterFile::ByteRead(BYTE* pData, __int64 len)
{
- Seek(GetPos());
- return Read(pData, len);
+ Seek(GetPos());
+ return Read(pData, len);
}
UINT64 CBaseSplitterFile::UExpGolombRead()
{
- int n = -1;
- for (BYTE b = 0; !b; n++) {
- b = (BYTE)BitRead(1);
- }
- return (1ui64 << n) - 1 + BitRead(n);
+ int n = -1;
+ for (BYTE b = 0; !b; n++) {
+ b = (BYTE)BitRead(1);
+ }
+ return (1ui64 << n) - 1 + BitRead(n);
}
INT64 CBaseSplitterFile::SExpGolombRead()
{
- UINT64 k = UExpGolombRead();
- return ((k&1) ? 1 : -1) * ((k + 1) >> 1);
+ UINT64 k = UExpGolombRead();
+ return ((k & 1) ? 1 : -1) * ((k + 1) >> 1);
}
HRESULT CBaseSplitterFile::HasMoreData(__int64 len, DWORD ms)
{
- __int64 available = GetLength() - GetPos();
+ __int64 available = GetLength() - GetPos();
- if (!m_fStreaming) {
- return available < 1 ? E_FAIL : S_OK;
- }
+ if (!m_fStreaming) {
+ return available < 1 ? E_FAIL : S_OK;
+ }
- if (available < len) {
- if (ms > 0) {
- Sleep(ms);
- }
- return S_FALSE;
- }
+ if (available < len) {
+ if (ms > 0) {
+ Sleep(ms);
+ }
+ return S_FALSE;
+ }
- return S_OK;
+ return S_OK;
}
diff --git a/src/filters/parser/BaseSplitter/BaseSplitterFile.h b/src/filters/parser/BaseSplitter/BaseSplitterFile.h
index 54533140a..59cae090f 100644
--- a/src/filters/parser/BaseSplitter/BaseSplitterFile.h
+++ b/src/filters/parser/BaseSplitter/BaseSplitterFile.h
@@ -25,46 +25,46 @@
#include <atlcoll.h>
-#define DEFAULT_CACHE_LENGTH 64*1024 // Beliyaal: Changed the default cache length to allow Bluray playback over network
+#define DEFAULT_CACHE_LENGTH 64*1024 // Beliyaal: Changed the default cache length to allow Bluray playback over network
class CBaseSplitterFile
{
- CComPtr<IAsyncReader> m_pAsyncReader;
- CAutoVectorPtr<BYTE> m_pCache;
- __int64 m_cachepos, m_cachelen, m_cachetotal;
+ CComPtr<IAsyncReader> m_pAsyncReader;
+ CAutoVectorPtr<BYTE> m_pCache;
+ __int64 m_cachepos, m_cachelen, m_cachetotal;
- bool m_fStreaming, m_fRandomAccess;
- __int64 m_pos, m_len;
+ bool m_fStreaming, m_fRandomAccess;
+ __int64 m_pos, m_len;
- virtual HRESULT Read(BYTE* pData, __int64 len); // use ByteRead
+ virtual HRESULT Read(BYTE* pData, __int64 len); // use ByteRead
protected:
- UINT64 m_bitbuff;
- int m_bitlen;
+ UINT64 m_bitbuff;
+ int m_bitlen;
- virtual void OnComplete() {}
+ virtual void OnComplete() {}
public:
- CBaseSplitterFile(IAsyncReader* pReader, HRESULT& hr, int cachelen = DEFAULT_CACHE_LENGTH, bool fRandomAccess = true, bool fStreaming = false);
- virtual ~CBaseSplitterFile() {}
+ CBaseSplitterFile(IAsyncReader* pReader, HRESULT& hr, int cachelen = DEFAULT_CACHE_LENGTH, bool fRandomAccess = true, bool fStreaming = false);
+ virtual ~CBaseSplitterFile() {}
- bool SetCacheSize(int cachelen = DEFAULT_CACHE_LENGTH);
+ bool SetCacheSize(int cachelen = DEFAULT_CACHE_LENGTH);
- __int64 GetPos();
- __int64 GetAvailable();
- __int64 GetLength(bool fUpdate = false);
- __int64 GetRemaining() {return max(0, GetLength() - GetPos());}
- virtual void Seek(__int64 pos);
+ __int64 GetPos();
+ __int64 GetAvailable();
+ __int64 GetLength(bool fUpdate = false);
+ __int64 GetRemaining() {return max(0, GetLength() - GetPos());}
+ virtual void Seek(__int64 pos);
- UINT64 UExpGolombRead();
- INT64 SExpGolombRead();
+ UINT64 UExpGolombRead();
+ INT64 SExpGolombRead();
- UINT64 BitRead(int nBits, bool fPeek = false);
- void BitByteAlign(), BitFlush();
- HRESULT ByteRead(BYTE* pData, __int64 len);
+ UINT64 BitRead(int nBits, bool fPeek = false);
+ void BitByteAlign(), BitFlush();
+ HRESULT ByteRead(BYTE* pData, __int64 len);
- bool IsStreaming() const {return m_fStreaming;}
- bool IsRandomAccess() const {return m_fRandomAccess;}
+ bool IsStreaming() const {return m_fStreaming;}
+ bool IsRandomAccess() const {return m_fRandomAccess;}
- HRESULT HasMoreData(__int64 len = 1, DWORD ms = 1);
+ HRESULT HasMoreData(__int64 len = 1, DWORD ms = 1);
};
diff --git a/src/filters/parser/BaseSplitter/BaseSplitterFileEx.cpp b/src/filters/parser/BaseSplitter/BaseSplitterFileEx.cpp
index e4129fd58..490d2aab5 100644
--- a/src/filters/parser/BaseSplitter/BaseSplitterFileEx.cpp
+++ b/src/filters/parser/BaseSplitter/BaseSplitterFileEx.cpp
@@ -35,9 +35,9 @@
//
CBaseSplitterFileEx::CBaseSplitterFileEx(IAsyncReader* pReader, HRESULT& hr, int cachelen, bool fRandomAccess, bool fStreaming)
- : CBaseSplitterFile(pReader, hr, cachelen, fRandomAccess, fStreaming)
- , m_tslen(0)
- ,m_rtPTSOffset(0)
+ : CBaseSplitterFile(pReader, hr, cachelen, fRandomAccess, fStreaming)
+ , m_tslen(0)
+ , m_rtPTSOffset(0)
{
}
@@ -49,16 +49,16 @@ CBaseSplitterFileEx::~CBaseSplitterFileEx()
bool CBaseSplitterFileEx::NextMpegStartCode(BYTE& code, __int64 len)
{
- BitByteAlign();
- DWORD dw = (DWORD)-1;
- do {
- if (len-- == 0 || !GetRemaining()) {
- return false;
- }
- dw = (dw << 8) | (BYTE)BitRead(8);
- } while ((dw&0xffffff00) != 0x00000100);
- code = (BYTE)(dw&0xff);
- return true;
+ BitByteAlign();
+ DWORD dw = (DWORD) - 1;
+ do {
+ if (len-- == 0 || !GetRemaining()) {
+ return false;
+ }
+ dw = (dw << 8) | (BYTE)BitRead(8);
+ } while ((dw & 0xffffff00) != 0x00000100);
+ code = (BYTE)(dw & 0xff);
+ return true;
}
//
@@ -67,2098 +67,2111 @@ bool CBaseSplitterFileEx::NextMpegStartCode(BYTE& code, __int64 len)
bool CBaseSplitterFileEx::Read(pshdr& h)
{
- memset(&h, 0, sizeof(h));
-
- BYTE b = (BYTE)BitRead(8, true);
-
- if ((b&0xf1) == 0x21) {
- h.type = mpeg1;
-
- EXECUTE_ASSERT(BitRead(4) == 2);
-
- h.scr = 0;
- h.scr |= BitRead(3) << 30;
- MARKER; // 32..30
- h.scr |= BitRead(15) << 15;
- MARKER; // 29..15
- h.scr |= BitRead(15);
- MARKER;
- MARKER; // 14..0
- h.bitrate = BitRead(22);
- MARKER;
- } else if ((b&0xc4) == 0x44) {
- h.type = mpeg2;
-
- EXECUTE_ASSERT(BitRead(2) == 1);
-
- h.scr = 0;
- h.scr |= BitRead(3) << 30;
- MARKER; // 32..30
- h.scr |= BitRead(15) << 15;
- MARKER; // 29..15
- h.scr |= BitRead(15);
- MARKER; // 14..0
- h.scr = (h.scr*300 + BitRead(9)) * 10 / 27;
- MARKER;
- h.bitrate = BitRead(22);
- MARKER;
- MARKER;
- BitRead(5); // reserved
- UINT64 stuffing = BitRead(3);
- while (stuffing-- > 0) {
- EXECUTE_ASSERT(BitRead(8) == 0xff);
- }
- } else {
- return false;
- }
-
- h.bitrate *= 400;
-
- return true;
+ memset(&h, 0, sizeof(h));
+
+ BYTE b = (BYTE)BitRead(8, true);
+
+ if ((b & 0xf1) == 0x21) {
+ h.type = mpeg1;
+
+ EXECUTE_ASSERT(BitRead(4) == 2);
+
+ h.scr = 0;
+ h.scr |= BitRead(3) << 30;
+ MARKER; // 32..30
+ h.scr |= BitRead(15) << 15;
+ MARKER; // 29..15
+ h.scr |= BitRead(15);
+ MARKER;
+ MARKER; // 14..0
+ h.bitrate = BitRead(22);
+ MARKER;
+ } else if ((b & 0xc4) == 0x44) {
+ h.type = mpeg2;
+
+ EXECUTE_ASSERT(BitRead(2) == 1);
+
+ h.scr = 0;
+ h.scr |= BitRead(3) << 30;
+ MARKER; // 32..30
+ h.scr |= BitRead(15) << 15;
+ MARKER; // 29..15
+ h.scr |= BitRead(15);
+ MARKER; // 14..0
+ h.scr = (h.scr * 300 + BitRead(9)) * 10 / 27;
+ MARKER;
+ h.bitrate = BitRead(22);
+ MARKER;
+ MARKER;
+ BitRead(5); // reserved
+ UINT64 stuffing = BitRead(3);
+ while (stuffing-- > 0) {
+ EXECUTE_ASSERT(BitRead(8) == 0xff);
+ }
+ } else {
+ return false;
+ }
+
+ h.bitrate *= 400;
+
+ return true;
}
bool CBaseSplitterFileEx::Read(pssyshdr& h)
{
- memset(&h, 0, sizeof(h));
-
- WORD len = (WORD)BitRead(16);
- MARKER;
- h.rate_bound = (DWORD)BitRead(22);
- MARKER;
- h.audio_bound = (BYTE)BitRead(6);
- h.fixed_rate = !!BitRead(1);
- h.csps = !!BitRead(1);
- h.sys_audio_loc_flag = !!BitRead(1);
- h.sys_video_loc_flag = !!BitRead(1);
- MARKER;
- h.video_bound = (BYTE)BitRead(5);
-
- EXECUTE_ASSERT((BitRead(8)&0x7f) == 0x7f); // reserved (should be 0xff, but not in reality)
-
- for (len -= 6; len > 3; len -= 3) { // TODO: also store these, somewhere, if needed
- UINT64 stream_id = BitRead(8);
- UNREFERENCED_PARAMETER(stream_id);
- EXECUTE_ASSERT(BitRead(2) == 3);
- UINT64 p_std_buff_size_bound = (BitRead(1)?1024:128)*BitRead(13);
- UNREFERENCED_PARAMETER(p_std_buff_size_bound);
- }
-
- return true;
+ memset(&h, 0, sizeof(h));
+
+ WORD len = (WORD)BitRead(16);
+ MARKER;
+ h.rate_bound = (DWORD)BitRead(22);
+ MARKER;
+ h.audio_bound = (BYTE)BitRead(6);
+ h.fixed_rate = !!BitRead(1);
+ h.csps = !!BitRead(1);
+ h.sys_audio_loc_flag = !!BitRead(1);
+ h.sys_video_loc_flag = !!BitRead(1);
+ MARKER;
+ h.video_bound = (BYTE)BitRead(5);
+
+ EXECUTE_ASSERT((BitRead(8) & 0x7f) == 0x7f); // reserved (should be 0xff, but not in reality)
+
+ for (len -= 6; len > 3; len -= 3) { // TODO: also store these, somewhere, if needed
+ UINT64 stream_id = BitRead(8);
+ UNREFERENCED_PARAMETER(stream_id);
+ EXECUTE_ASSERT(BitRead(2) == 3);
+ UINT64 p_std_buff_size_bound = (BitRead(1) ? 1024 : 128) * BitRead(13);
+ UNREFERENCED_PARAMETER(p_std_buff_size_bound);
+ }
+
+ return true;
}
bool CBaseSplitterFileEx::Read(peshdr& h, BYTE code)
{
- memset(&h, 0, sizeof(h));
-
- if (!(code >= 0xbd && code < 0xf0 || code == 0xfd)) { // 0xfd => blu-ray (.m2ts)
- return false;
- }
-
- h.len = (WORD)BitRead(16);
-
- if (code == 0xbe || code == 0xbf) {
- return true;
- }
-
- // mpeg1 stuffing (ff ff .. , max 16x)
- for (int i = 0; i < 16 && BitRead(8, true) == 0xff; i++) {
- BitRead(8);
- if (h.len) {
- h.len--;
- }
- }
-
- h.type = (BYTE)BitRead(2, true) == mpeg2 ? mpeg2 : mpeg1;
-
- if (h.type == mpeg1) {
- BYTE b = (BYTE)BitRead(2);
-
- if (b == 1) {
- h.std_buff_size = (BitRead(1)?1024:128)*BitRead(13);
- if (h.len) {
- h.len -= 2;
- }
- b = (BYTE)BitRead(2);
- }
-
- if (b == 0) {
- h.fpts = (BYTE)BitRead(1);
- h.fdts = (BYTE)BitRead(1);
- }
- } else if (h.type == mpeg2) {
- EXECUTE_ASSERT(BitRead(2) == mpeg2);
- h.scrambling = (BYTE)BitRead(2);
- h.priority = (BYTE)BitRead(1);
- h.alignment = (BYTE)BitRead(1);
- h.copyright = (BYTE)BitRead(1);
- h.original = (BYTE)BitRead(1);
- h.fpts = (BYTE)BitRead(1);
- h.fdts = (BYTE)BitRead(1);
- h.escr = (BYTE)BitRead(1);
- h.esrate = (BYTE)BitRead(1);
- h.dsmtrickmode = (BYTE)BitRead(1);
- h.morecopyright = (BYTE)BitRead(1);
- h.crc = (BYTE)BitRead(1);
- h.extension = (BYTE)BitRead(1);
- h.hdrlen = (BYTE)BitRead(8);
- } else {
- if (h.len) while (h.len-- > 0) {
- BitRead(8);
- }
- return false;
- }
-
- if (h.fpts) {
- if (h.type == mpeg2) {
- BYTE b = (BYTE)BitRead(4);
- if (!(h.fdts && b == 3 || !h.fdts && b == 2)) {/*ASSERT(0); */return false;}
- }
-
- h.pts = 0;
- h.pts |= BitRead(3) << 30;
- MARKER; // 32..30
- h.pts |= BitRead(15) << 15;
- MARKER; // 29..15
- h.pts |= BitRead(15);
- MARKER; // 14..0
- h.pts = 10000*h.pts/90 + m_rtPTSOffset;
- }
-
- if (h.fdts) {
- if ((BYTE)BitRead(4) != 1) {/*ASSERT(0); */return false;}
-
- h.dts = 0;
- h.dts |= BitRead(3) << 30;
- MARKER; // 32..30
- h.dts |= BitRead(15) << 15;
- MARKER; // 29..15
- h.dts |= BitRead(15);
- MARKER; // 14..0
- h.dts = 10000*h.dts/90 + m_rtPTSOffset;
- }
-
- // skip to the end of header
-
- if (h.type == mpeg1) {
- if (!h.fpts && !h.fdts && BitRead(4) != 0xf) {
- /*ASSERT(0);*/ return false;
- }
-
- if (h.len) {
- h.len--;
- if (h.pts) {
- h.len -= 4;
- }
- if (h.dts) {
- h.len -= 5;
- }
- }
- }
-
- if (h.type == mpeg2) {
- if (h.len) {
- h.len -= 3+h.hdrlen;
- }
-
- int left = h.hdrlen;
- if (h.fpts) {
- left -= 5;
- }
- if (h.fdts) {
- left -= 5;
- }
-
- if (h.extension) { /* PES extension */
- BYTE pes_ext = (BYTE)BitRead(8);
- left--;
- BYTE skip = (pes_ext >> 4) & 0xb;
- skip += skip & 0x9;
- if (pes_ext & 0x40 || skip > left) {
- TRACE(_T("pes_ext %X is invalid\n"), pes_ext);
- pes_ext = skip = 0;
- }
- for (int i=0; i<skip; i++) {
- BitRead(8);
- }
- left -= skip;
- if (pes_ext & 0x01) { /* PES extension 2 */
- BYTE ext2_len = (BYTE)BitRead(8);
- left--;
- if ((ext2_len & 0x7f) > 0) {
- BYTE id_ext = (BYTE)BitRead(8);
- if ((id_ext & 0x80) == 0) {
- h.id_ext = id_ext;
- }
- left--;
- }
- }
- }
- while (left-- > 0) {
- BitRead(8);
- }
- }
-
- return true;
+ memset(&h, 0, sizeof(h));
+
+ if (!(code >= 0xbd && code < 0xf0 || code == 0xfd)) { // 0xfd => blu-ray (.m2ts)
+ return false;
+ }
+
+ h.len = (WORD)BitRead(16);
+
+ if (code == 0xbe || code == 0xbf) {
+ return true;
+ }
+
+ // mpeg1 stuffing (ff ff .. , max 16x)
+ for (int i = 0; i < 16 && BitRead(8, true) == 0xff; i++) {
+ BitRead(8);
+ if (h.len) {
+ h.len--;
+ }
+ }
+
+ h.type = (BYTE)BitRead(2, true) == mpeg2 ? mpeg2 : mpeg1;
+
+ if (h.type == mpeg1) {
+ BYTE b = (BYTE)BitRead(2);
+
+ if (b == 1) {
+ h.std_buff_size = (BitRead(1) ? 1024 : 128) * BitRead(13);
+ if (h.len) {
+ h.len -= 2;
+ }
+ b = (BYTE)BitRead(2);
+ }
+
+ if (b == 0) {
+ h.fpts = (BYTE)BitRead(1);
+ h.fdts = (BYTE)BitRead(1);
+ }
+ } else if (h.type == mpeg2) {
+ EXECUTE_ASSERT(BitRead(2) == mpeg2);
+ h.scrambling = (BYTE)BitRead(2);
+ h.priority = (BYTE)BitRead(1);
+ h.alignment = (BYTE)BitRead(1);
+ h.copyright = (BYTE)BitRead(1);
+ h.original = (BYTE)BitRead(1);
+ h.fpts = (BYTE)BitRead(1);
+ h.fdts = (BYTE)BitRead(1);
+ h.escr = (BYTE)BitRead(1);
+ h.esrate = (BYTE)BitRead(1);
+ h.dsmtrickmode = (BYTE)BitRead(1);
+ h.morecopyright = (BYTE)BitRead(1);
+ h.crc = (BYTE)BitRead(1);
+ h.extension = (BYTE)BitRead(1);
+ h.hdrlen = (BYTE)BitRead(8);
+ } else {
+ if (h.len) while (h.len-- > 0) {
+ BitRead(8);
+ }
+ return false;
+ }
+
+ if (h.fpts) {
+ if (h.type == mpeg2) {
+ BYTE b = (BYTE)BitRead(4);
+ if (!(h.fdts && b == 3 || !h.fdts && b == 2)) {/*ASSERT(0); */return false;}
+ }
+
+ h.pts = 0;
+ h.pts |= BitRead(3) << 30;
+ MARKER; // 32..30
+ h.pts |= BitRead(15) << 15;
+ MARKER; // 29..15
+ h.pts |= BitRead(15);
+ MARKER; // 14..0
+ h.pts = 10000 * h.pts / 90 + m_rtPTSOffset;
+ }
+
+ if (h.fdts) {
+ if ((BYTE)BitRead(4) != 1) {/*ASSERT(0); */return false;}
+
+ h.dts = 0;
+ h.dts |= BitRead(3) << 30;
+ MARKER; // 32..30
+ h.dts |= BitRead(15) << 15;
+ MARKER; // 29..15
+ h.dts |= BitRead(15);
+ MARKER; // 14..0
+ h.dts = 10000 * h.dts / 90 + m_rtPTSOffset;
+ }
+
+ // skip to the end of header
+
+ if (h.type == mpeg1) {
+ if (!h.fpts && !h.fdts && BitRead(4) != 0xf) {
+ /*ASSERT(0);*/ return false;
+ }
+
+ if (h.len) {
+ h.len--;
+ if (h.pts) {
+ h.len -= 4;
+ }
+ if (h.dts) {
+ h.len -= 5;
+ }
+ }
+ }
+
+ if (h.type == mpeg2) {
+ if (h.len) {
+ h.len -= 3 + h.hdrlen;
+ }
+
+ int left = h.hdrlen;
+ if (h.fpts) {
+ left -= 5;
+ }
+ if (h.fdts) {
+ left -= 5;
+ }
+
+ if (h.extension) { /* PES extension */
+ BYTE pes_ext = (BYTE)BitRead(8);
+ left--;
+ BYTE skip = (pes_ext >> 4) & 0xb;
+ skip += skip & 0x9;
+ if (pes_ext & 0x40 || skip > left) {
+ TRACE(_T("pes_ext %X is invalid\n"), pes_ext);
+ pes_ext = skip = 0;
+ }
+ for (int i = 0; i < skip; i++) {
+ BitRead(8);
+ }
+ left -= skip;
+ if (pes_ext & 0x01) { /* PES extension 2 */
+ BYTE ext2_len = (BYTE)BitRead(8);
+ left--;
+ if ((ext2_len & 0x7f) > 0) {
+ BYTE id_ext = (BYTE)BitRead(8);
+ if ((id_ext & 0x80) == 0) {
+ h.id_ext = id_ext;
+ }
+ left--;
+ }
+ }
+ }
+ while (left-- > 0) {
+ BitRead(8);
+ }
+ }
+
+ return true;
}
bool CBaseSplitterFileEx::Read(seqhdr& h, int len, CMediaType* pmt)
{
- __int64 endpos = GetPos() + len; // - sequence header length
-
- BYTE id = 0;
-
- while (GetPos() < endpos && id != 0xb3) {
- if (!NextMpegStartCode(id, len)) {
- return false;
- }
- }
-
- if (id != 0xb3) {
- return false;
- }
-
- __int64 shpos = GetPos() - 4;
-
- h.width = (WORD)BitRead(12);
- h.height = (WORD)BitRead(12);
- h.ar = BitRead(4);
- static int ifps[16] = {0, 1126125, 1125000, 1080000, 900900, 900000, 540000, 450450, 450000, 0, 0, 0, 0, 0, 0, 0};
- h.ifps = ifps[BitRead(4)];
- h.bitrate = (DWORD)BitRead(18);
- MARKER;
- h.vbv = (DWORD)BitRead(10);
- h.constrained = BitRead(1);
-
- h.fiqm = BitRead(1);
- if (h.fiqm)
- for (int i = 0; i < _countof(h.iqm); i++) {
- h.iqm[i] = (BYTE)BitRead(8);
- }
-
- h.fniqm = BitRead(1);
- if (h.fniqm)
- for (int i = 0; i < _countof(h.niqm); i++) {
- h.niqm[i] = (BYTE)BitRead(8);
- }
-
- __int64 shlen = GetPos() - shpos;
-
- static float ar[] = {
- 1.0000f,1.0000f,0.6735f,0.7031f,0.7615f,0.8055f,0.8437f,0.8935f,
- 0.9157f,0.9815f,1.0255f,1.0695f,1.0950f,1.1575f,1.2015f,1.0000f
- };
-
- h.arx = (int)((float)h.width / ar[h.ar] + 0.5);
- h.ary = h.height;
-
- mpeg_t type = mpeg1;
-
- __int64 shextpos = 0, shextlen = 0;
-
- if (NextMpegStartCode(id, 8) && id == 0xb5) { // sequence header ext
- shextpos = GetPos() - 4;
-
- h.startcodeid = BitRead(4);
- h.profile_levelescape = BitRead(1); // reserved, should be 0
- h.profile = BitRead(3);
- h.level = BitRead(4);
- h.progressive = BitRead(1);
- h.chroma = BitRead(2);
- h.width |= (BitRead(2)<<12);
- h.height |= (BitRead(2)<<12);
- h.bitrate |= (BitRead(12)<<18);
- MARKER;
- h.vbv |= (BitRead(8)<<10);
- h.lowdelay = BitRead(1);
- h.ifps = (DWORD)(h.ifps * (BitRead(2)+1) / (BitRead(5)+1));
-
- shextlen = GetPos() - shextpos;
-
- struct {
- DWORD x, y;
- } ar[] = {{h.width,h.height},{4,3},{16,9},{221,100},{h.width,h.height}};
- int i = min(max(h.ar, 1), 5)-1;
- h.arx = ar[i].x;
- h.ary = ar[i].y;
-
- type = mpeg2;
- }
-
- h.ifps = 10 * h.ifps / 27;
- h.bitrate = h.bitrate == (1<<30)-1 ? 0 : h.bitrate * 400;
-
- DWORD a = h.arx, b = h.ary;
- while (a) {
- DWORD tmp = a;
- a = b % tmp;
- b = tmp;
- }
- if (b) {
- h.arx /= b, h.ary /= b;
- }
-
- if (!pmt) {
- return true;
- }
-
- pmt->majortype = MEDIATYPE_Video;
-
- if (type == mpeg1) {
- pmt->subtype = MEDIASUBTYPE_MPEG1Payload;
- pmt->formattype = FORMAT_MPEGVideo;
- int len = FIELD_OFFSET(MPEG1VIDEOINFO, bSequenceHeader) + int(shlen + shextlen);
- MPEG1VIDEOINFO* vi = (MPEG1VIDEOINFO*)DNew BYTE[len];
- memset(vi, 0, len);
- vi->hdr.dwBitRate = h.bitrate;
- vi->hdr.AvgTimePerFrame = h.ifps;
- vi->hdr.bmiHeader.biSize = sizeof(vi->hdr.bmiHeader);
- vi->hdr.bmiHeader.biWidth = h.width;
- vi->hdr.bmiHeader.biHeight = h.height;
- vi->hdr.bmiHeader.biXPelsPerMeter = h.width * h.ary;
- vi->hdr.bmiHeader.biYPelsPerMeter = h.height * h.arx;
- vi->cbSequenceHeader = DWORD(shlen + shextlen);
- Seek(shpos);
- ByteRead((BYTE*)&vi->bSequenceHeader[0], shlen);
- if (shextpos && shextlen) {
- Seek(shextpos);
- }
- ByteRead((BYTE*)&vi->bSequenceHeader[0] + shlen, shextlen);
- pmt->SetFormat((BYTE*)vi, len);
- delete [] vi;
- } else if (type == mpeg2) {
- pmt->subtype = MEDIASUBTYPE_MPEG2_VIDEO;
- pmt->formattype = FORMAT_MPEG2_VIDEO;
- int len = FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + int(shlen + shextlen);
- MPEG2VIDEOINFO* vi = (MPEG2VIDEOINFO*)DNew BYTE[len];
- memset(vi, 0, len);
- vi->hdr.dwBitRate = h.bitrate;
- vi->hdr.AvgTimePerFrame = h.ifps;
- vi->hdr.dwPictAspectRatioX = h.arx;
- vi->hdr.dwPictAspectRatioY = h.ary;
- vi->hdr.bmiHeader.biSize = sizeof(vi->hdr.bmiHeader);
- vi->hdr.bmiHeader.biWidth = h.width;
- vi->hdr.bmiHeader.biHeight = h.height;
- vi->dwProfile = h.profile;
- vi->dwLevel = h.level;
- vi->cbSequenceHeader = DWORD(shlen + shextlen);
- Seek(shpos);
- ByteRead((BYTE*)&vi->dwSequenceHeader[0], shlen);
- if (shextpos && shextlen) {
- Seek(shextpos);
- }
- ByteRead((BYTE*)&vi->dwSequenceHeader[0] + shlen, shextlen);
- pmt->SetFormat((BYTE*)vi, len);
- delete [] vi;
- } else {
- return false;
- }
-
- return true;
+ __int64 endpos = GetPos() + len; // - sequence header length
+
+ BYTE id = 0;
+
+ while (GetPos() < endpos && id != 0xb3) {
+ if (!NextMpegStartCode(id, len)) {
+ return false;
+ }
+ }
+
+ if (id != 0xb3) {
+ return false;
+ }
+
+ __int64 shpos = GetPos() - 4;
+
+ h.width = (WORD)BitRead(12);
+ h.height = (WORD)BitRead(12);
+ h.ar = BitRead(4);
+ static int ifps[16] = {0, 1126125, 1125000, 1080000, 900900, 900000, 540000, 450450, 450000, 0, 0, 0, 0, 0, 0, 0};
+ h.ifps = ifps[BitRead(4)];
+ h.bitrate = (DWORD)BitRead(18);
+ MARKER;
+ h.vbv = (DWORD)BitRead(10);
+ h.constrained = BitRead(1);
+
+ h.fiqm = BitRead(1);
+ if (h.fiqm)
+ for (int i = 0; i < _countof(h.iqm); i++) {
+ h.iqm[i] = (BYTE)BitRead(8);
+ }
+
+ h.fniqm = BitRead(1);
+ if (h.fniqm)
+ for (int i = 0; i < _countof(h.niqm); i++) {
+ h.niqm[i] = (BYTE)BitRead(8);
+ }
+
+ __int64 shlen = GetPos() - shpos;
+
+ static float ar[] = {
+ 1.0000f, 1.0000f, 0.6735f, 0.7031f, 0.7615f, 0.8055f, 0.8437f, 0.8935f,
+ 0.9157f, 0.9815f, 1.0255f, 1.0695f, 1.0950f, 1.1575f, 1.2015f, 1.0000f
+ };
+
+ h.arx = (int)((float)h.width / ar[h.ar] + 0.5);
+ h.ary = h.height;
+
+ mpeg_t type = mpeg1;
+
+ __int64 shextpos = 0, shextlen = 0;
+
+ if (NextMpegStartCode(id, 8) && id == 0xb5) { // sequence header ext
+ shextpos = GetPos() - 4;
+
+ h.startcodeid = BitRead(4);
+ h.profile_levelescape = BitRead(1); // reserved, should be 0
+ h.profile = BitRead(3);
+ h.level = BitRead(4);
+ h.progressive = BitRead(1);
+ h.chroma = BitRead(2);
+ h.width |= (BitRead(2) << 12);
+ h.height |= (BitRead(2) << 12);
+ h.bitrate |= (BitRead(12) << 18);
+ MARKER;
+ h.vbv |= (BitRead(8) << 10);
+ h.lowdelay = BitRead(1);
+ h.ifps = (DWORD)(h.ifps * (BitRead(2) + 1) / (BitRead(5) + 1));
+
+ shextlen = GetPos() - shextpos;
+
+ struct {
+ DWORD x, y;
+ } ar[] = {{h.width, h.height}, {4, 3}, {16, 9}, {221, 100}, {h.width, h.height}};
+ int i = min(max(h.ar, 1), 5) - 1;
+ h.arx = ar[i].x;
+ h.ary = ar[i].y;
+
+ type = mpeg2;
+ }
+
+ h.ifps = 10 * h.ifps / 27;
+ h.bitrate = h.bitrate == (1 << 30) - 1 ? 0 : h.bitrate * 400;
+
+ DWORD a = h.arx, b = h.ary;
+ while (a) {
+ DWORD tmp = a;
+ a = b % tmp;
+ b = tmp;
+ }
+ if (b) {
+ h.arx /= b, h.ary /= b;
+ }
+
+ if (!pmt) {
+ return true;
+ }
+
+ pmt->majortype = MEDIATYPE_Video;
+
+ if (type == mpeg1) {
+ pmt->subtype = MEDIASUBTYPE_MPEG1Payload;
+ pmt->formattype = FORMAT_MPEGVideo;
+ int len = FIELD_OFFSET(MPEG1VIDEOINFO, bSequenceHeader) + int(shlen + shextlen);
+ MPEG1VIDEOINFO* vi = (MPEG1VIDEOINFO*)DNew BYTE[len];
+ memset(vi, 0, len);
+ vi->hdr.dwBitRate = h.bitrate;
+ vi->hdr.AvgTimePerFrame = h.ifps;
+ vi->hdr.bmiHeader.biSize = sizeof(vi->hdr.bmiHeader);
+ vi->hdr.bmiHeader.biWidth = h.width;
+ vi->hdr.bmiHeader.biHeight = h.height;
+ vi->hdr.bmiHeader.biXPelsPerMeter = h.width * h.ary;
+ vi->hdr.bmiHeader.biYPelsPerMeter = h.height * h.arx;
+ vi->cbSequenceHeader = DWORD(shlen + shextlen);
+ Seek(shpos);
+ ByteRead((BYTE*)&vi->bSequenceHeader[0], shlen);
+ if (shextpos && shextlen) {
+ Seek(shextpos);
+ }
+ ByteRead((BYTE*)&vi->bSequenceHeader[0] + shlen, shextlen);
+ pmt->SetFormat((BYTE*)vi, len);
+ delete [] vi;
+ } else if (type == mpeg2) {
+ pmt->subtype = MEDIASUBTYPE_MPEG2_VIDEO;
+ pmt->formattype = FORMAT_MPEG2_VIDEO;
+ int len = FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + int(shlen + shextlen);
+ MPEG2VIDEOINFO* vi = (MPEG2VIDEOINFO*)DNew BYTE[len];
+ memset(vi, 0, len);
+ vi->hdr.dwBitRate = h.bitrate;
+ vi->hdr.AvgTimePerFrame = h.ifps;
+ vi->hdr.dwPictAspectRatioX = h.arx;
+ vi->hdr.dwPictAspectRatioY = h.ary;
+ vi->hdr.bmiHeader.biSize = sizeof(vi->hdr.bmiHeader);
+ vi->hdr.bmiHeader.biWidth = h.width;
+ vi->hdr.bmiHeader.biHeight = h.height;
+ vi->dwProfile = h.profile;
+ vi->dwLevel = h.level;
+ vi->cbSequenceHeader = DWORD(shlen + shextlen);
+ Seek(shpos);
+ ByteRead((BYTE*)&vi->dwSequenceHeader[0], shlen);
+ if (shextpos && shextlen) {
+ Seek(shextpos);
+ }
+ ByteRead((BYTE*)&vi->dwSequenceHeader[0] + shlen, shextlen);
+ pmt->SetFormat((BYTE*)vi, len);
+ delete [] vi;
+ } else {
+ return false;
+ }
+
+ return true;
}
bool CBaseSplitterFileEx::Read(mpahdr& h, int len, bool fAllowV25, CMediaType* pmt)
{
- memset(&h, 0, sizeof(h));
-
- int syncbits = fAllowV25 ? 11 : 12;
-
- for (; len >= 4 && BitRead(syncbits, true) != (1<<syncbits) - 1; len--) {
- BitRead(8);
- }
-
- if (len < 4) {
- return false;
- }
-
- h.sync = BitRead(11);
- h.version = BitRead(2);
- h.layer = BitRead(2);
- h.crc = BitRead(1);
- h.bitrate = BitRead(4);
- h.freq = BitRead(2);
- h.padding = BitRead(1);
- h.privatebit = BitRead(1);
- h.channels = BitRead(2);
- h.modeext = BitRead(2);
- h.copyright = BitRead(1);
- h.original = BitRead(1);
- h.emphasis = BitRead(2);
-
- if (h.version == 1 || h.layer == 0 || h.freq == 3 || h.bitrate == 15 || h.emphasis == 2) {
- return false;
- }
-
- if (h.version == 3 && h.layer == 2) {
- if ((h.bitrate == 1 || h.bitrate == 2 || h.bitrate == 3 || h.bitrate == 5) && h.channels != 3
- && (h.bitrate >= 11 && h.bitrate <= 14) && h.channels == 3) {
- return false;
- }
- }
-
- h.layer = 4 - h.layer;
-
- //
-
- static int brtbl[][5] = {
- {0,0,0,0,0},
- {32,32,32,32,8},
- {64,48,40,48,16},
- {96,56,48,56,24},
- {128,64,56,64,32},
- {160,80,64,80,40},
- {192,96,80,96,48},
- {224,112,96,112,56},
- {256,128,112,128,64},
- {288,160,128,144,80},
- {320,192,160,160,96},
- {352,224,192,176,112},
- {384,256,224,192,128},
- {416,320,256,224,144},
- {448,384,320,256,160},
- {0,0,0,0,0},
- };
-
- static int brtblcol[][4] = {{0,3,4,4},{0,0,1,2}};
- int bitrate = 1000*brtbl[h.bitrate][brtblcol[h.version&1][h.layer]];
- if (bitrate == 0) {
- return false;
- }
-
- static int freq[][4] = {{11025,0,22050,44100},{12000,0,24000,48000},{8000,0,16000,32000}};
-
- bool l3ext = h.layer == 3 && !(h.version&1);
-
- h.nSamplesPerSec = freq[h.freq][h.version];
- h.FrameSize = h.layer == 1
- ? (12 * bitrate / h.nSamplesPerSec + h.padding) * 4
- : (l3ext ? 72 : 144) * bitrate / h.nSamplesPerSec + h.padding;
- h.rtDuration = 10000000i64 * (h.layer == 1 ? 384 : l3ext ? 576 : 1152) / h.nSamplesPerSec;// / (h.channels == 3 ? 1 : 2);
- h.nBytesPerSec = bitrate / 8;
-
- if (!pmt) {
- return true;
- }
-
- size_t size = h.layer == 3
- ? sizeof(WAVEFORMATEX/*MPEGLAYER3WAVEFORMAT*/) // no need to overcomplicate this...
- : sizeof(MPEG1WAVEFORMAT);
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)DNew BYTE[size];
- memset(wfe, 0, size);
- wfe->cbSize = WORD(size - sizeof(WAVEFORMATEX));
-
- if (h.layer == 3) {
- wfe->wFormatTag = WAVE_FORMAT_MP3;
-
- /* MPEGLAYER3WAVEFORMAT* f = (MPEGLAYER3WAVEFORMAT*)wfe;
- f->wfx.wFormatTag = WAVE_FORMAT_MP3;
- f->wID = MPEGLAYER3_ID_UNKNOWN;
- f->fdwFlags = h.padding ? MPEGLAYER3_FLAG_PADDING_ON : MPEGLAYER3_FLAG_PADDING_OFF; // _OFF or _ISO ?
- */
- } else {
- MPEG1WAVEFORMAT* f = (MPEG1WAVEFORMAT*)wfe;
- f->wfx.wFormatTag = WAVE_FORMAT_MPEG;
- f->fwHeadMode = 1 << h.channels;
- f->fwHeadModeExt = 1 << h.modeext;
- f->wHeadEmphasis = h.emphasis+1;
- if (h.privatebit) {
- f->fwHeadFlags |= ACM_MPEG_PRIVATEBIT;
- }
- if (h.copyright) {
- f->fwHeadFlags |= ACM_MPEG_COPYRIGHT;
- }
- if (h.original) {
- f->fwHeadFlags |= ACM_MPEG_ORIGINALHOME;
- }
- if (h.crc == 0) {
- f->fwHeadFlags |= ACM_MPEG_PROTECTIONBIT;
- }
- if (h.version == 3) {
- f->fwHeadFlags |= ACM_MPEG_ID_MPEG1;
- }
- f->fwHeadLayer = 1 << (h.layer-1);
- f->dwHeadBitrate = bitrate;
- }
-
- wfe->nChannels = h.channels == 3 ? 1 : 2;
- wfe->nSamplesPerSec = h.nSamplesPerSec;
- wfe->nBlockAlign = h.FrameSize;
- wfe->nAvgBytesPerSec = h.nBytesPerSec;
-
- pmt->majortype = MEDIATYPE_Audio;
- pmt->subtype = FOURCCMap(wfe->wFormatTag);
- pmt->formattype = FORMAT_WaveFormatEx;
- pmt->SetFormat((BYTE*)wfe, sizeof(WAVEFORMATEX) + wfe->cbSize);
-
- delete [] wfe;
-
- return true;
+ memset(&h, 0, sizeof(h));
+
+ int syncbits = fAllowV25 ? 11 : 12;
+
+ for (; len >= 4 && BitRead(syncbits, true) != (1 << syncbits) - 1; len--) {
+ BitRead(8);
+ }
+
+ if (len < 4) {
+ return false;
+ }
+
+ h.sync = BitRead(11);
+ h.version = BitRead(2);
+ h.layer = BitRead(2);
+ h.crc = BitRead(1);
+ h.bitrate = BitRead(4);
+ h.freq = BitRead(2);
+ h.padding = BitRead(1);
+ h.privatebit = BitRead(1);
+ h.channels = BitRead(2);
+ h.modeext = BitRead(2);
+ h.copyright = BitRead(1);
+ h.original = BitRead(1);
+ h.emphasis = BitRead(2);
+
+ if (h.version == 1 || h.layer == 0 || h.freq == 3 || h.bitrate == 15 || h.emphasis == 2) {
+ return false;
+ }
+
+ if (h.version == 3 && h.layer == 2) {
+ if ((h.bitrate == 1 || h.bitrate == 2 || h.bitrate == 3 || h.bitrate == 5) && h.channels != 3
+ && (h.bitrate >= 11 && h.bitrate <= 14) && h.channels == 3) {
+ return false;
+ }
+ }
+
+ h.layer = 4 - h.layer;
+
+ //
+
+ static int brtbl[][5] = {
+ {0, 0, 0, 0, 0},
+ {32, 32, 32, 32, 8},
+ {64, 48, 40, 48, 16},
+ {96, 56, 48, 56, 24},
+ {128, 64, 56, 64, 32},
+ {160, 80, 64, 80, 40},
+ {192, 96, 80, 96, 48},
+ {224, 112, 96, 112, 56},
+ {256, 128, 112, 128, 64},
+ {288, 160, 128, 144, 80},
+ {320, 192, 160, 160, 96},
+ {352, 224, 192, 176, 112},
+ {384, 256, 224, 192, 128},
+ {416, 320, 256, 224, 144},
+ {448, 384, 320, 256, 160},
+ {0, 0, 0, 0, 0},
+ };
+
+ static int brtblcol[][4] = {{0, 3, 4, 4}, {0, 0, 1, 2}};
+ int bitrate = 1000 * brtbl[h.bitrate][brtblcol[h.version & 1][h.layer]];
+ if (bitrate == 0) {
+ return false;
+ }
+
+ static int freq[][4] = {{11025, 0, 22050, 44100}, {12000, 0, 24000, 48000}, {8000, 0, 16000, 32000}};
+
+ bool l3ext = h.layer == 3 && !(h.version & 1);
+
+ h.nSamplesPerSec = freq[h.freq][h.version];
+ h.FrameSize = h.layer == 1
+ ? (12 * bitrate / h.nSamplesPerSec + h.padding) * 4
+ : (l3ext ? 72 : 144) * bitrate / h.nSamplesPerSec + h.padding;
+ h.rtDuration = 10000000i64 * (h.layer == 1 ? 384 : l3ext ? 576 : 1152) / h.nSamplesPerSec;// / (h.channels == 3 ? 1 : 2);
+ h.nBytesPerSec = bitrate / 8;
+
+ if (!pmt) {
+ return true;
+ }
+
+ size_t size = h.layer == 3
+ ? sizeof(WAVEFORMATEX/*MPEGLAYER3WAVEFORMAT*/) // no need to overcomplicate this...
+ : sizeof(MPEG1WAVEFORMAT);
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)DNew BYTE[size];
+ memset(wfe, 0, size);
+ wfe->cbSize = WORD(size - sizeof(WAVEFORMATEX));
+
+ if (h.layer == 3) {
+ wfe->wFormatTag = WAVE_FORMAT_MP3;
+
+ /* MPEGLAYER3WAVEFORMAT* f = (MPEGLAYER3WAVEFORMAT*)wfe;
+ f->wfx.wFormatTag = WAVE_FORMAT_MP3;
+ f->wID = MPEGLAYER3_ID_UNKNOWN;
+ f->fdwFlags = h.padding ? MPEGLAYER3_FLAG_PADDING_ON : MPEGLAYER3_FLAG_PADDING_OFF; // _OFF or _ISO ?
+ */
+ } else {
+ MPEG1WAVEFORMAT* f = (MPEG1WAVEFORMAT*)wfe;
+ f->wfx.wFormatTag = WAVE_FORMAT_MPEG;
+ f->fwHeadMode = 1 << h.channels;
+ f->fwHeadModeExt = 1 << h.modeext;
+ f->wHeadEmphasis = h.emphasis + 1;
+ if (h.privatebit) {
+ f->fwHeadFlags |= ACM_MPEG_PRIVATEBIT;
+ }
+ if (h.copyright) {
+ f->fwHeadFlags |= ACM_MPEG_COPYRIGHT;
+ }
+ if (h.original) {
+ f->fwHeadFlags |= ACM_MPEG_ORIGINALHOME;
+ }
+ if (h.crc == 0) {
+ f->fwHeadFlags |= ACM_MPEG_PROTECTIONBIT;
+ }
+ if (h.version == 3) {
+ f->fwHeadFlags |= ACM_MPEG_ID_MPEG1;
+ }
+ f->fwHeadLayer = 1 << (h.layer - 1);
+ f->dwHeadBitrate = bitrate;
+ }
+
+ wfe->nChannels = h.channels == 3 ? 1 : 2;
+ wfe->nSamplesPerSec = h.nSamplesPerSec;
+ wfe->nBlockAlign = h.FrameSize;
+ wfe->nAvgBytesPerSec = h.nBytesPerSec;
+
+ pmt->majortype = MEDIATYPE_Audio;
+ pmt->subtype = FOURCCMap(wfe->wFormatTag);
+ pmt->formattype = FORMAT_WaveFormatEx;
+ pmt->SetFormat((BYTE*)wfe, sizeof(WAVEFORMATEX) + wfe->cbSize);
+
+ delete [] wfe;
+
+ return true;
}
bool CBaseSplitterFileEx::Read(latm_aachdr& h, int len, CMediaType* pmt)
{
- memset(&h, 0, sizeof(h));
+ memset(&h, 0, sizeof(h));
- for (; len >= 3 && BitRead(11, true) != 0x2b7; len--) {
- BitRead(8);
- }
+ for (; len >= 3 && BitRead(11, true) != 0x2b7; len--) {
+ BitRead(8);
+ }
- if (len < 3) {
- return false;
- }
+ if (len < 3) {
+ return false;
+ }
- // Disable AAC latm stream support until make correct header parsing ...
- return true;
+ // Disable AAC latm stream support until make correct header parsing ...
+ return true;
}
bool CBaseSplitterFileEx::Read(aachdr& h, int len, CMediaType* pmt, MPEG_TYPES m_type)
{
- memset(&h, 0, sizeof(h));
-
- __int64 pos = 0;
- int found_fake_sync = m_type == mpeg_ts ? 0 : 1;
-
- for (;;) {
- for (; len >= 7 && BitRead(12, true) != 0xfff; len--) {
- BitRead(8);
- }
-
- if (len < 7) {
- return false;
- }
-
- pos = GetPos();
-
- h.sync = BitRead(12);
- h.version = BitRead(1);
- h.layer = BitRead(2);
- h.fcrc = BitRead(1);
- h.profile = BitRead(2);
- h.freq = BitRead(4);
- h.privatebit = BitRead(1);
- h.channels = BitRead(3);
- h.original = BitRead(1);
- h.home = BitRead(1);
-
- h.copyright_id_bit = BitRead(1);
- h.copyright_id_start = BitRead(1);
- h.aac_frame_length = BitRead(13);
- h.adts_buffer_fullness = BitRead(11);
- h.no_raw_data_blocks_in_frame = BitRead(2);
-
- if (h.fcrc == 0) {
- h.crc = (WORD)BitRead(16);
- }
-
- if (h.layer != 0 || h.freq >= 12 || h.aac_frame_length <= (h.fcrc == 0 ? 9 : 7)) {
- if (found_fake_sync) // skip only one "fake" sync. TODO - find better way to detect and skip "fake" sync
- return false;
- found_fake_sync++;
- Seek(pos + 1);
- len--;
- continue;
- }
-
- h.FrameSize = h.aac_frame_length - (h.fcrc == 0 ? 9 : 7);
- static int freq[] = {96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000};
- h.nBytesPerSec = h.aac_frame_length * freq[h.freq] / 1024; // ok?
- h.rtDuration = 10000000i64 * 1024 / freq[h.freq]; // ok?
-
- if (!pmt) {
- return true;
- }
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)DNew BYTE[sizeof(WAVEFORMATEX)+5];
- memset(wfe, 0, sizeof(WAVEFORMATEX)+5);
- wfe->wFormatTag = WAVE_FORMAT_AAC;
- wfe->nChannels = h.channels <= 6 ? h.channels : 2;
- wfe->nSamplesPerSec = freq[h.freq];
- wfe->nBlockAlign = h.aac_frame_length;
- wfe->nAvgBytesPerSec = h.nBytesPerSec;
- wfe->cbSize = MakeAACInitData((BYTE*)(wfe+1), h.profile, wfe->nSamplesPerSec, wfe->nChannels);
-
- pmt->majortype = MEDIATYPE_Audio;
- pmt->subtype = MEDIASUBTYPE_AAC;
- pmt->formattype = FORMAT_WaveFormatEx;
- pmt->SetFormat((BYTE*)wfe, sizeof(WAVEFORMATEX)+wfe->cbSize);
-
- delete [] wfe;
-
- return true;
- }
+ memset(&h, 0, sizeof(h));
+
+ __int64 pos = 0;
+ int found_fake_sync = m_type == mpeg_ts ? 0 : 1;
+
+ for (;;) {
+ for (; len >= 7 && BitRead(12, true) != 0xfff; len--) {
+ BitRead(8);
+ }
+
+ if (len < 7) {
+ return false;
+ }
+
+ pos = GetPos();
+
+ h.sync = BitRead(12);
+ h.version = BitRead(1);
+ h.layer = BitRead(2);
+ h.fcrc = BitRead(1);
+ h.profile = BitRead(2);
+ h.freq = BitRead(4);
+ h.privatebit = BitRead(1);
+ h.channels = BitRead(3);
+ h.original = BitRead(1);
+ h.home = BitRead(1);
+
+ h.copyright_id_bit = BitRead(1);
+ h.copyright_id_start = BitRead(1);
+ h.aac_frame_length = BitRead(13);
+ h.adts_buffer_fullness = BitRead(11);
+ h.no_raw_data_blocks_in_frame = BitRead(2);
+
+ if (h.fcrc == 0) {
+ h.crc = (WORD)BitRead(16);
+ }
+
+ if (h.layer != 0 || h.freq >= 12 || h.aac_frame_length <= (h.fcrc == 0 ? 9 : 7)) {
+ if (found_fake_sync) { // skip only one "fake" sync. TODO - find better way to detect and skip "fake" sync
+ return false;
+ }
+ found_fake_sync++;
+ Seek(pos + 1);
+ len--;
+ continue;
+ }
+
+ h.FrameSize = h.aac_frame_length - (h.fcrc == 0 ? 9 : 7);
+ static int freq[] = {96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000};
+ h.nBytesPerSec = h.aac_frame_length * freq[h.freq] / 1024; // ok?
+ h.rtDuration = 10000000i64 * 1024 / freq[h.freq]; // ok?
+
+ if (!pmt) {
+ return true;
+ }
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)DNew BYTE[sizeof(WAVEFORMATEX) + 5];
+ memset(wfe, 0, sizeof(WAVEFORMATEX) + 5);
+ wfe->wFormatTag = WAVE_FORMAT_AAC;
+ wfe->nChannels = h.channels <= 6 ? h.channels : 2;
+ wfe->nSamplesPerSec = freq[h.freq];
+ wfe->nBlockAlign = h.aac_frame_length;
+ wfe->nAvgBytesPerSec = h.nBytesPerSec;
+ wfe->cbSize = MakeAACInitData((BYTE*)(wfe + 1), h.profile, wfe->nSamplesPerSec, wfe->nChannels);
+
+ pmt->majortype = MEDIATYPE_Audio;
+ pmt->subtype = MEDIASUBTYPE_AAC;
+ pmt->formattype = FORMAT_WaveFormatEx;
+ pmt->SetFormat((BYTE*)wfe, sizeof(WAVEFORMATEX) + wfe->cbSize);
+
+ delete [] wfe;
+
+ return true;
+ }
}
bool CBaseSplitterFileEx::Read(ac3hdr& h, int len, CMediaType* pmt, bool find_sync, bool AC3CoreOnly)
{
- static int freq[] = {48000, 44100, 32000, 0};
-
- bool e_ac3 = false;
-
- __int64 startpos = GetPos();
-
- memset(&h, 0, sizeof(h));
-
- // Parse TrueHD and MLP header
- if (!AC3CoreOnly) {
- BYTE buf[20];
- int channels;
- int samplerate;
- int framelength;
- WORD bitdepth;
- bool isTrueHD;
-
- int fsize = 0;
- ByteRead(buf, 20);
-
- fsize = ParseMLPHeader(buf, &samplerate, &channels, &framelength, &bitdepth, &isTrueHD);
- if (fsize) {
-
- if (!pmt) {
- return true;
- }
-
- int bitrate = (int)(fsize * 8i64 * samplerate / framelength); // inaccurate, because fsize is not constant
-
- pmt->majortype = MEDIATYPE_Audio;
- pmt->subtype = isTrueHD ? MEDIASUBTYPE_DOLBY_TRUEHD : MEDIASUBTYPE_MLP;
- pmt->formattype = FORMAT_WaveFormatEx;
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)pmt->AllocFormatBuffer(sizeof(WAVEFORMATEX));
- wfe->wFormatTag = WAVE_FORMAT_UNKNOWN;
- wfe->nChannels = channels;
- wfe->nSamplesPerSec = samplerate;
- wfe->nAvgBytesPerSec = (bitrate + 4) /8;
- wfe->nBlockAlign = fsize < WORD_MAX ? fsize : WORD_MAX;
- wfe->wBitsPerSample = bitdepth;
- wfe->cbSize = 0;
-
- pmt->SetSampleSize(0);
-
- return true;
- }
- }
-
- Seek(startpos);
-
- if (find_sync) {
- for (; len >= 7 && BitRead(16, true) != 0x0b77; len--) {
- BitRead(8);
- }
- }
-
- if (len < 7) {
- return false;
- }
-
- h.sync = (WORD)BitRead(16);
- if (h.sync != 0x0B77) {
- return false;
- }
-
- _int64 pos = GetPos();
- h.crc1 = (WORD)BitRead(16);
- h.fscod = BitRead(2);
- h.frmsizecod = BitRead(6);
- h.bsid = BitRead(5);
- if (h.bsid > 16) {
- return false;
- }
- if (h.bsid <= 10) {
- /* Normal AC-3 */
- if (h.fscod == 3) {
- return false;
- }
- if (h.frmsizecod > 37) {
- return false;
- }
- h.bsmod = BitRead(3);
- h.acmod = BitRead(3);
- if (h.acmod == 2) {
- h.dsurmod = BitRead(2);
- }
- if ((h.acmod & 1) && h.acmod != 1) {
- h.cmixlev = BitRead(2);
- }
- if (h.acmod & 4) {
- h.surmixlev = BitRead(2);
- }
- h.lfeon = BitRead(1);
- h.sr_shift = max(h.bsid, 8) - 8;
- } else {
- /* Enhanced AC-3 */
- e_ac3 = true;
- Seek(pos);
- h.frame_type = (BYTE)BitRead(2);
- h.substreamid = (BYTE)BitRead(3);
- if (h.frame_type || h.substreamid) {
- return false;
- }
- h.frame_size = ((WORD)BitRead(11) + 1) << 1;
- if (h.frame_size < 7) {
- return false;
- }
- h.sr_code = (BYTE)BitRead(2);
- if (h.sr_code == 3) {
- BYTE sr_code2 = (BYTE)BitRead(2);
- if (sr_code2 == 3) {
- return false;
- }
- h.sample_rate = freq[sr_code2] / 2;
- h.sr_shift = 1;
- } else {
- static int eac3_blocks[4] = {1, 2, 3, 6};
- h.num_blocks = eac3_blocks[BitRead(2)];
- h.sample_rate = freq[h.sr_code];
- h.sr_shift = 0;
- }
- h.acmod = BitRead(3);
- h.lfeon = BitRead(1);
- }
-
- if (!pmt) {
- return true;
- }
-
- WAVEFORMATEX wfe;
- memset(&wfe, 0, sizeof(wfe));
- wfe.wFormatTag = WAVE_FORMAT_DOLBY_AC3;
-
- static int channels[] = {2, 1, 2, 3, 3, 4, 4, 5};
- wfe.nChannels = channels[h.acmod] + h.lfeon;
-
- if (!e_ac3) {
- wfe.nSamplesPerSec = freq[h.fscod] >> h.sr_shift;
- static int rate[] = {32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640, 768, 896, 1024, 1152, 1280};
- wfe.nAvgBytesPerSec = ((rate[h.frmsizecod>>1] * 1000) >> h.sr_shift) / 8;
- } else {
- wfe.nSamplesPerSec = h.sample_rate;
- wfe.nAvgBytesPerSec = h.frame_size * h.sample_rate / (h.num_blocks * 256);
- }
-
- wfe.nBlockAlign = (WORD)(1536 * wfe.nAvgBytesPerSec / wfe.nSamplesPerSec);
-
- pmt->majortype = MEDIATYPE_Audio;
- if (e_ac3) {
- pmt->subtype = MEDIASUBTYPE_DOLBY_DDPLUS;
- } else {
- pmt->subtype = MEDIASUBTYPE_DOLBY_AC3;
- }
- pmt->formattype = FORMAT_WaveFormatEx;
- pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
-
- return true;
+ static int freq[] = {48000, 44100, 32000, 0};
+
+ bool e_ac3 = false;
+
+ __int64 startpos = GetPos();
+
+ memset(&h, 0, sizeof(h));
+
+ // Parse TrueHD and MLP header
+ if (!AC3CoreOnly) {
+ BYTE buf[20];
+ int channels;
+ int samplerate;
+ int framelength;
+ WORD bitdepth;
+ bool isTrueHD;
+
+ int fsize = 0;
+ ByteRead(buf, 20);
+
+ fsize = ParseMLPHeader(buf, &samplerate, &channels, &framelength, &bitdepth, &isTrueHD);
+ if (fsize) {
+
+ if (!pmt) {
+ return true;
+ }
+
+ int bitrate = (int)(fsize * 8i64 * samplerate / framelength); // inaccurate, because fsize is not constant
+
+ pmt->majortype = MEDIATYPE_Audio;
+ pmt->subtype = isTrueHD ? MEDIASUBTYPE_DOLBY_TRUEHD : MEDIASUBTYPE_MLP;
+ pmt->formattype = FORMAT_WaveFormatEx;
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)pmt->AllocFormatBuffer(sizeof(WAVEFORMATEX));
+ wfe->wFormatTag = WAVE_FORMAT_UNKNOWN;
+ wfe->nChannels = channels;
+ wfe->nSamplesPerSec = samplerate;
+ wfe->nAvgBytesPerSec = (bitrate + 4) / 8;
+ wfe->nBlockAlign = fsize < WORD_MAX ? fsize : WORD_MAX;
+ wfe->wBitsPerSample = bitdepth;
+ wfe->cbSize = 0;
+
+ pmt->SetSampleSize(0);
+
+ return true;
+ }
+ }
+
+ Seek(startpos);
+
+ if (find_sync) {
+ for (; len >= 7 && BitRead(16, true) != 0x0b77; len--) {
+ BitRead(8);
+ }
+ }
+
+ if (len < 7) {
+ return false;
+ }
+
+ h.sync = (WORD)BitRead(16);
+ if (h.sync != 0x0B77) {
+ return false;
+ }
+
+ _int64 pos = GetPos();
+ h.crc1 = (WORD)BitRead(16);
+ h.fscod = BitRead(2);
+ h.frmsizecod = BitRead(6);
+ h.bsid = BitRead(5);
+ if (h.bsid > 16) {
+ return false;
+ }
+ if (h.bsid <= 10) {
+ /* Normal AC-3 */
+ if (h.fscod == 3) {
+ return false;
+ }
+ if (h.frmsizecod > 37) {
+ return false;
+ }
+ h.bsmod = BitRead(3);
+ h.acmod = BitRead(3);
+ if (h.acmod == 2) {
+ h.dsurmod = BitRead(2);
+ }
+ if ((h.acmod & 1) && h.acmod != 1) {
+ h.cmixlev = BitRead(2);
+ }
+ if (h.acmod & 4) {
+ h.surmixlev = BitRead(2);
+ }
+ h.lfeon = BitRead(1);
+ h.sr_shift = max(h.bsid, 8) - 8;
+ } else {
+ /* Enhanced AC-3 */
+ e_ac3 = true;
+ Seek(pos);
+ h.frame_type = (BYTE)BitRead(2);
+ h.substreamid = (BYTE)BitRead(3);
+ if (h.frame_type || h.substreamid) {
+ return false;
+ }
+ h.frame_size = ((WORD)BitRead(11) + 1) << 1;
+ if (h.frame_size < 7) {
+ return false;
+ }
+ h.sr_code = (BYTE)BitRead(2);
+ if (h.sr_code == 3) {
+ BYTE sr_code2 = (BYTE)BitRead(2);
+ if (sr_code2 == 3) {
+ return false;
+ }
+ h.sample_rate = freq[sr_code2] / 2;
+ h.sr_shift = 1;
+ } else {
+ static int eac3_blocks[4] = {1, 2, 3, 6};
+ h.num_blocks = eac3_blocks[BitRead(2)];
+ h.sample_rate = freq[h.sr_code];
+ h.sr_shift = 0;
+ }
+ h.acmod = BitRead(3);
+ h.lfeon = BitRead(1);
+ }
+
+ if (!pmt) {
+ return true;
+ }
+
+ WAVEFORMATEX wfe;
+ memset(&wfe, 0, sizeof(wfe));
+ wfe.wFormatTag = WAVE_FORMAT_DOLBY_AC3;
+
+ static int channels[] = {2, 1, 2, 3, 3, 4, 4, 5};
+ wfe.nChannels = channels[h.acmod] + h.lfeon;
+
+ if (!e_ac3) {
+ wfe.nSamplesPerSec = freq[h.fscod] >> h.sr_shift;
+ static int rate[] = {32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640, 768, 896, 1024, 1152, 1280};
+ wfe.nAvgBytesPerSec = ((rate[h.frmsizecod >> 1] * 1000) >> h.sr_shift) / 8;
+ } else {
+ wfe.nSamplesPerSec = h.sample_rate;
+ wfe.nAvgBytesPerSec = h.frame_size * h.sample_rate / (h.num_blocks * 256);
+ }
+
+ wfe.nBlockAlign = (WORD)(1536 * wfe.nAvgBytesPerSec / wfe.nSamplesPerSec);
+
+ pmt->majortype = MEDIATYPE_Audio;
+ if (e_ac3) {
+ pmt->subtype = MEDIASUBTYPE_DOLBY_DDPLUS;
+ } else {
+ pmt->subtype = MEDIASUBTYPE_DOLBY_AC3;
+ }
+ pmt->formattype = FORMAT_WaveFormatEx;
+ pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
+
+ return true;
}
bool CBaseSplitterFileEx::Read(dtshdr& h, int len, CMediaType* pmt, bool find_sync)
{
- memset(&h, 0, sizeof(h));
-
- if (find_sync) {
- for (; len >= 10 && BitRead(32, true) != 0x7ffe8001; len--) {
- BitRead(8);
- }
- }
-
- if (len < 10) {
- return false;
- }
-
- h.sync = (DWORD)BitRead(32);
- if (h.sync != 0x7ffe8001) {
- return false;
- }
-
- h.frametype = BitRead(1);
- h.deficitsamplecount = BitRead(5);
- h.fcrc = BitRead(1);
- h.nblocks = BitRead(7)+1;
- h.framebytes = (WORD)BitRead(14)+1;
- h.amode = BitRead(6);
- h.sfreq = BitRead(4);
- h.rate = BitRead(5);
-
- h.downmix = BitRead(1);
- h.dynrange = BitRead(1);
- h.timestamp = BitRead(1);
- h.aux_data = BitRead(1);
- h.hdcd = BitRead(1);
- h.ext_descr = BitRead(3);
- h.ext_coding = BitRead(1);
- h.aspf = BitRead(1);
- h.lfe = BitRead(2);
- h.predictor_history = BitRead(1);
-
-
- if (!pmt) {
- return true;
- }
-
- WAVEFORMATEX wfe;
- memset(&wfe, 0, sizeof(wfe));
- wfe.wFormatTag = WAVE_FORMAT_DVD_DTS;
-
- static int channels[] = {1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8};
-
- if (h.amode < _countof(channels)) {
- wfe.nChannels = channels[h.amode];
- if (h.lfe > 0) {
- ++wfe.nChannels;
- }
- }
-
- static int freq[] = {0,8000,16000,32000,0,0,11025,22050,44100,0,0,12000,24000,48000,0,0};
- wfe.nSamplesPerSec = freq[h.sfreq];
-
- /*static int rate[] = {
- 32000, 56000, 64000, 96000,
- 112000, 128000, 192000, 224000,
- 256000, 320000, 384000, 448000,
- 512000, 576000, 640000, 768000,
- 960000, 1024000, 1152000, 1280000,
- 1344000, 1408000, 1411200, 1472000,
- 1536000, 1920000, 2048000, 3072000,
- 3840000, 0, 0, 0 //open, variable, lossless
- };
- int nom_bitrate = rate[h.rate];*/
-
- unsigned int bitrate = (unsigned int)(8ui64 * h.framebytes * wfe.nSamplesPerSec / (h.nblocks*32));
-
- wfe.nAvgBytesPerSec = (bitrate + 4) / 8;
- wfe.nBlockAlign = h.framebytes;
-
- pmt->majortype = MEDIATYPE_Audio;
- pmt->subtype = MEDIASUBTYPE_DTS;
- pmt->formattype = FORMAT_WaveFormatEx;
- pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
-
- return true;
+ memset(&h, 0, sizeof(h));
+
+ if (find_sync) {
+ for (; len >= 10 && BitRead(32, true) != 0x7ffe8001; len--) {
+ BitRead(8);
+ }
+ }
+
+ if (len < 10) {
+ return false;
+ }
+
+ h.sync = (DWORD)BitRead(32);
+ if (h.sync != 0x7ffe8001) {
+ return false;
+ }
+
+ h.frametype = BitRead(1);
+ h.deficitsamplecount = BitRead(5);
+ h.fcrc = BitRead(1);
+ h.nblocks = BitRead(7) + 1;
+ h.framebytes = (WORD)BitRead(14) + 1;
+ h.amode = BitRead(6);
+ h.sfreq = BitRead(4);
+ h.rate = BitRead(5);
+
+ h.downmix = BitRead(1);
+ h.dynrange = BitRead(1);
+ h.timestamp = BitRead(1);
+ h.aux_data = BitRead(1);
+ h.hdcd = BitRead(1);
+ h.ext_descr = BitRead(3);
+ h.ext_coding = BitRead(1);
+ h.aspf = BitRead(1);
+ h.lfe = BitRead(2);
+ h.predictor_history = BitRead(1);
+
+
+ if (!pmt) {
+ return true;
+ }
+
+ WAVEFORMATEX wfe;
+ memset(&wfe, 0, sizeof(wfe));
+ wfe.wFormatTag = WAVE_FORMAT_DVD_DTS;
+
+ static int channels[] = {1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8};
+
+ if (h.amode < _countof(channels)) {
+ wfe.nChannels = channels[h.amode];
+ if (h.lfe > 0) {
+ ++wfe.nChannels;
+ }
+ }
+
+ static int freq[] = {0, 8000, 16000, 32000, 0, 0, 11025, 22050, 44100, 0, 0, 12000, 24000, 48000, 0, 0};
+ wfe.nSamplesPerSec = freq[h.sfreq];
+
+ /*static int rate[] = {
+ 32000, 56000, 64000, 96000,
+ 112000, 128000, 192000, 224000,
+ 256000, 320000, 384000, 448000,
+ 512000, 576000, 640000, 768000,
+ 960000, 1024000, 1152000, 1280000,
+ 1344000, 1408000, 1411200, 1472000,
+ 1536000, 1920000, 2048000, 3072000,
+ 3840000, 0, 0, 0 //open, variable, lossless
+ };
+ int nom_bitrate = rate[h.rate];*/
+
+ unsigned int bitrate = (unsigned int)(8ui64 * h.framebytes * wfe.nSamplesPerSec / (h.nblocks * 32));
+
+ wfe.nAvgBytesPerSec = (bitrate + 4) / 8;
+ wfe.nBlockAlign = h.framebytes;
+
+ pmt->majortype = MEDIATYPE_Audio;
+ pmt->subtype = MEDIASUBTYPE_DTS;
+ pmt->formattype = FORMAT_WaveFormatEx;
+ pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
+
+ return true;
}
bool CBaseSplitterFileEx::Read(lpcmhdr& h, CMediaType* pmt)
{
- memset(&h, 0, sizeof(h));
-
- h.emphasis = BitRead(1);
- h.mute = BitRead(1);
- h.reserved1 = BitRead(1);
- h.framenum = BitRead(5);
- h.quantwordlen = BitRead(2);
- h.freq = BitRead(2);
- h.reserved2 = BitRead(1);
- h.channels = BitRead(3);
- h.drc = (BYTE)BitRead(8);
-
- if (h.quantwordlen == 3 || h.reserved1 || h.reserved2) {
- return false;
- }
-
- if (!pmt) {
- return true;
- }
-
- WAVEFORMATEX wfe;
- memset(&wfe, 0, sizeof(wfe));
- wfe.wFormatTag = WAVE_FORMAT_PCM;
- wfe.nChannels = h.channels+1;
- static int freq[] = {48000, 96000, 44100, 32000};
- wfe.nSamplesPerSec = freq[h.freq];
- switch (h.quantwordlen) {
- case 0:
- wfe.wBitsPerSample = 16;
- break;
- case 1:
- wfe.wBitsPerSample = 20;
- break;
- case 2:
- wfe.wBitsPerSample = 24;
- break;
- }
- wfe.nBlockAlign = (wfe.nChannels*2*wfe.wBitsPerSample) / 8;
- wfe.nAvgBytesPerSec = (wfe.nBlockAlign*wfe.nSamplesPerSec) / 2;
-
- pmt->majortype = MEDIATYPE_Audio;
- pmt->subtype = MEDIASUBTYPE_DVD_LPCM_AUDIO;
- pmt->formattype = FORMAT_WaveFormatEx;
- pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
-
- return true;
+ memset(&h, 0, sizeof(h));
+
+ h.emphasis = BitRead(1);
+ h.mute = BitRead(1);
+ h.reserved1 = BitRead(1);
+ h.framenum = BitRead(5);
+ h.quantwordlen = BitRead(2);
+ h.freq = BitRead(2);
+ h.reserved2 = BitRead(1);
+ h.channels = BitRead(3);
+ h.drc = (BYTE)BitRead(8);
+
+ if (h.quantwordlen == 3 || h.reserved1 || h.reserved2) {
+ return false;
+ }
+
+ if (!pmt) {
+ return true;
+ }
+
+ WAVEFORMATEX wfe;
+ memset(&wfe, 0, sizeof(wfe));
+ wfe.wFormatTag = WAVE_FORMAT_PCM;
+ wfe.nChannels = h.channels + 1;
+ static int freq[] = {48000, 96000, 44100, 32000};
+ wfe.nSamplesPerSec = freq[h.freq];
+ switch (h.quantwordlen) {
+ case 0:
+ wfe.wBitsPerSample = 16;
+ break;
+ case 1:
+ wfe.wBitsPerSample = 20;
+ break;
+ case 2:
+ wfe.wBitsPerSample = 24;
+ break;
+ }
+ wfe.nBlockAlign = (wfe.nChannels * 2 * wfe.wBitsPerSample) / 8;
+ wfe.nAvgBytesPerSec = (wfe.nBlockAlign * wfe.nSamplesPerSec) / 2;
+
+ pmt->majortype = MEDIATYPE_Audio;
+ pmt->subtype = MEDIASUBTYPE_DVD_LPCM_AUDIO;
+ pmt->formattype = FORMAT_WaveFormatEx;
+ pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
+
+ return true;
}
bool CBaseSplitterFileEx::Read(dvdalpcmhdr& h, int len, CMediaType* pmt)
{
- memset(&h, 0, sizeof(h));
- if (len < 8) return false;
-
- h.firstaudioframe = (WORD)BitRead(16);// Byte pointer to start of first audio frame.
- h.unknown1 = (BYTE)BitRead(8); // Unknown - e.g. 0x10 for stereo, 0x00 for surround
- if (h.unknown1!= 0x10 && h.unknown1!= 0x00)
- return false; // this is not the aob. maybe this is a vob.
-
- h.bitpersample1 = (BYTE)BitRead(4);
- h.bitpersample2 = (BYTE)BitRead(4);
- h.samplerate1 = (BYTE)BitRead(4);
- h.samplerate2 = (BYTE)BitRead(4);
- h.unknown2 = (BYTE)BitRead(8); // Unknown - e.g. 0x00
- h.groupassignment = (BYTE)BitRead(8); // Channel Group Assignment
- h.unknown3 = (BYTE)BitRead(8); // Unknown - e.g. 0x80
-
- if (h.bitpersample1 > 2 || (h.samplerate1&7) > 2 || h.groupassignment > 20 ||
- h.unknown2 != 0x00 || h.unknown3 != 0x80) {
- return false; // poor parameters or this is a vob.
- }
- // decoder limitations
- if (h.groupassignment > 1 && (h.bitpersample2 != h.bitpersample1 || h.samplerate2 != h.samplerate1)) {
- return false; // decoder does not support different bit depth and frequency.
- }
-
- if (!pmt) {
- return true;
- }
-
- WAVEFORMATEX wfe;
- memset(&wfe, 0, sizeof(wfe));
- wfe.wFormatTag = WAVE_FORMAT_UNKNOWN;
- static const WORD depth[] = {16, 20, 24};
- static const DWORD freq[] = {48000, 96000, 192000, 0, 0, 0, 0, 0, 44100, 88200, 1764000};
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
- static const WORD channels1[] = {1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4};
- static const WORD channels2[] = {0, 0, 1, 2, 1, 2, 3, 1, 2, 3, 2, 3, 4, 1, 2, 1, 2, 3, 1, 1, 2};
- wfe.wBitsPerSample = depth[h.bitpersample1];
- wfe.nSamplesPerSec = freq[h.samplerate1];
- wfe.nChannels = channels1[h.groupassignment]+channels2[h.groupassignment];
-
- if (wfe.nChannels > 2) {
- wfe.nBlockAlign = (depth[h.bitpersample1] * channels1[h.groupassignment] * (WORD)(freq[h.samplerate1] / freq[h.samplerate2]) +
- depth[h.bitpersample2] * channels2[h.groupassignment]) * 2 / 8;
- } else {
- wfe.nBlockAlign = depth[h.bitpersample1] * channels1[h.groupassignment] * 2 / 8;
- }
- wfe.nAvgBytesPerSec = wfe.nBlockAlign * wfe.nSamplesPerSec / 2;
-
- pmt->majortype = MEDIATYPE_Audio;
- pmt->subtype = MEDIASUBTYPE_DVD_LPCM_AUDIO;
- pmt->formattype = FORMAT_WaveFormatEx;
- pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
-
- return true;
+ memset(&h, 0, sizeof(h));
+ if (len < 8) { return false; }
+
+ h.firstaudioframe = (WORD)BitRead(16);// Byte pointer to start of first audio frame.
+ h.unknown1 = (BYTE)BitRead(8); // Unknown - e.g. 0x10 for stereo, 0x00 for surround
+ if (h.unknown1 != 0x10 && h.unknown1 != 0x00) {
+ return false; // this is not the aob. maybe this is a vob.
+ }
+
+ h.bitpersample1 = (BYTE)BitRead(4);
+ h.bitpersample2 = (BYTE)BitRead(4);
+ h.samplerate1 = (BYTE)BitRead(4);
+ h.samplerate2 = (BYTE)BitRead(4);
+ h.unknown2 = (BYTE)BitRead(8); // Unknown - e.g. 0x00
+ h.groupassignment = (BYTE)BitRead(8); // Channel Group Assignment
+ h.unknown3 = (BYTE)BitRead(8); // Unknown - e.g. 0x80
+
+ if (h.bitpersample1 > 2 || (h.samplerate1 & 7) > 2 || h.groupassignment > 20 ||
+ h.unknown2 != 0x00 || h.unknown3 != 0x80) {
+ return false; // poor parameters or this is a vob.
+ }
+ // decoder limitations
+ if (h.groupassignment > 1 && (h.bitpersample2 != h.bitpersample1 || h.samplerate2 != h.samplerate1)) {
+ return false; // decoder does not support different bit depth and frequency.
+ }
+
+ if (!pmt) {
+ return true;
+ }
+
+ WAVEFORMATEX wfe;
+ memset(&wfe, 0, sizeof(wfe));
+ wfe.wFormatTag = WAVE_FORMAT_UNKNOWN;
+ static const WORD depth[] = {16, 20, 24};
+ static const DWORD freq[] = {48000, 96000, 192000, 0, 0, 0, 0, 0, 44100, 88200, 1764000};
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
+ static const WORD channels1[] = {1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4};
+ static const WORD channels2[] = {0, 0, 1, 2, 1, 2, 3, 1, 2, 3, 2, 3, 4, 1, 2, 1, 2, 3, 1, 1, 2};
+ wfe.wBitsPerSample = depth[h.bitpersample1];
+ wfe.nSamplesPerSec = freq[h.samplerate1];
+ wfe.nChannels = channels1[h.groupassignment] + channels2[h.groupassignment];
+
+ if (wfe.nChannels > 2) {
+ wfe.nBlockAlign = (depth[h.bitpersample1] * channels1[h.groupassignment] * (WORD)(freq[h.samplerate1] / freq[h.samplerate2]) +
+ depth[h.bitpersample2] * channels2[h.groupassignment]) * 2 / 8;
+ } else {
+ wfe.nBlockAlign = depth[h.bitpersample1] * channels1[h.groupassignment] * 2 / 8;
+ }
+ wfe.nAvgBytesPerSec = wfe.nBlockAlign * wfe.nSamplesPerSec / 2;
+
+ pmt->majortype = MEDIATYPE_Audio;
+ pmt->subtype = MEDIASUBTYPE_DVD_LPCM_AUDIO;
+ pmt->formattype = FORMAT_WaveFormatEx;
+ pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
+
+ return true;
}
bool CBaseSplitterFileEx::Read(hdmvlpcmhdr& h, CMediaType* pmt)
{
- memset(&h, 0, sizeof(h));
+ memset(&h, 0, sizeof(h));
- h.size = (WORD)BitRead(16);
- h.channels = (BYTE)BitRead(4);
- h.samplerate = (BYTE)BitRead(4);
- h.bitpersample = (BYTE)BitRead(2);
+ h.size = (WORD)BitRead(16);
+ h.channels = (BYTE)BitRead(4);
+ h.samplerate = (BYTE)BitRead(4);
+ h.bitpersample = (BYTE)BitRead(2);
- if (h.channels==0 || h.channels==2 ||
- (h.samplerate != 1 && h.samplerate!= 4 && h.samplerate!= 5) ||
- h.bitpersample<0 || h.bitpersample>3) {
- return false;
- }
+ if (h.channels == 0 || h.channels == 2 ||
+ (h.samplerate != 1 && h.samplerate != 4 && h.samplerate != 5) ||
+ h.bitpersample < 0 || h.bitpersample > 3) {
+ return false;
+ }
- if (!pmt) {
- return true;
- }
+ if (!pmt) {
+ return true;
+ }
- WAVEFORMATEX_HDMV_LPCM wfe;
- wfe.wFormatTag = WAVE_FORMAT_PCM;
+ WAVEFORMATEX_HDMV_LPCM wfe;
+ wfe.wFormatTag = WAVE_FORMAT_PCM;
- static int channels[] = {0, 1, 0, 2, 3, 3, 4, 4, 5, 6, 7, 8};
- wfe.nChannels = channels[h.channels];
- wfe.channel_conf = h.channels;
+ static int channels[] = {0, 1, 0, 2, 3, 3, 4, 4, 5, 6, 7, 8};
+ wfe.nChannels = channels[h.channels];
+ wfe.channel_conf = h.channels;
- static int freq[] = {0, 48000, 0, 0, 96000, 192000};
- wfe.nSamplesPerSec = freq[h.samplerate];
+ static int freq[] = {0, 48000, 0, 0, 96000, 192000};
+ wfe.nSamplesPerSec = freq[h.samplerate];
- static int bitspersample[] = {0, 16, 20, 24};
- wfe.wBitsPerSample = bitspersample[h.bitpersample];
+ static int bitspersample[] = {0, 16, 20, 24};
+ wfe.wBitsPerSample = bitspersample[h.bitpersample];
- wfe.nBlockAlign = wfe.nChannels*wfe.wBitsPerSample>>3;
- wfe.nAvgBytesPerSec = wfe.nBlockAlign*wfe.nSamplesPerSec;
+ wfe.nBlockAlign = wfe.nChannels * wfe.wBitsPerSample >> 3;
+ wfe.nAvgBytesPerSec = wfe.nBlockAlign * wfe.nSamplesPerSec;
- pmt->majortype = MEDIATYPE_Audio;
- pmt->subtype = MEDIASUBTYPE_HDMV_LPCM_AUDIO;
- pmt->formattype = FORMAT_WaveFormatEx;
- pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
+ pmt->majortype = MEDIATYPE_Audio;
+ pmt->subtype = MEDIASUBTYPE_HDMV_LPCM_AUDIO;
+ pmt->formattype = FORMAT_WaveFormatEx;
+ pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
- return true;
+ return true;
}
bool CBaseSplitterFileEx::Read(mlphdr& h, int len, CMediaType* pmt, bool find_sync)
{
- memset(&h, 0, sizeof(h));
- if (len < 20) return false;
-
- __int64 startpos = GetPos();
-
- int samplerate, channels, framelength;
- WORD bitdepth;
- bool isTrueHD;
- int fsize = 0;
-
- BYTE buf[20];
- int k = find_sync ? len - 20 : 1;
- int i = 0;
- while (i < k) {
- Seek(startpos+i);
- ByteRead(buf, 20);
- if (GetMLPFrameSize(buf)) {
- fsize = ParseMLPHeader(buf, &samplerate, &channels, &framelength, &bitdepth, &isTrueHD);
- break;
- }
- ++i;
- }
-
- if (fsize && !isTrueHD) {
- h.size = fsize;
-
- if (!pmt) {
- return true;
- }
-
- int bitrate = (int)(fsize * 8i64 * samplerate / framelength); // inaccurate, because fsize is not constant
- pmt->majortype = MEDIATYPE_Audio;
- pmt->subtype = MEDIASUBTYPE_MLP;
- pmt->formattype = FORMAT_WaveFormatEx;
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)pmt->AllocFormatBuffer(sizeof(WAVEFORMATEX));
- wfe->wFormatTag = WAVE_FORMAT_UNKNOWN;
- wfe->nChannels = channels;
- wfe->nSamplesPerSec = samplerate;
- wfe->nAvgBytesPerSec = (bitrate + 4) /8;
- wfe->nBlockAlign = fsize < WORD_MAX ? fsize : WORD_MAX;
- wfe->wBitsPerSample = bitdepth;
- wfe->cbSize = 0;
-
- pmt->SetSampleSize(0);
-
- Seek(startpos+i);
- return true;
- }
-
- return false;
+ memset(&h, 0, sizeof(h));
+ if (len < 20) { return false; }
+
+ __int64 startpos = GetPos();
+
+ int samplerate, channels, framelength;
+ WORD bitdepth;
+ bool isTrueHD;
+ int fsize = 0;
+
+ BYTE buf[20];
+ int k = find_sync ? len - 20 : 1;
+ int i = 0;
+ while (i < k) {
+ Seek(startpos + i);
+ ByteRead(buf, 20);
+ if (GetMLPFrameSize(buf)) {
+ fsize = ParseMLPHeader(buf, &samplerate, &channels, &framelength, &bitdepth, &isTrueHD);
+ break;
+ }
+ ++i;
+ }
+
+ if (fsize && !isTrueHD) {
+ h.size = fsize;
+
+ if (!pmt) {
+ return true;
+ }
+
+ int bitrate = (int)(fsize * 8i64 * samplerate / framelength); // inaccurate, because fsize is not constant
+ pmt->majortype = MEDIATYPE_Audio;
+ pmt->subtype = MEDIASUBTYPE_MLP;
+ pmt->formattype = FORMAT_WaveFormatEx;
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)pmt->AllocFormatBuffer(sizeof(WAVEFORMATEX));
+ wfe->wFormatTag = WAVE_FORMAT_UNKNOWN;
+ wfe->nChannels = channels;
+ wfe->nSamplesPerSec = samplerate;
+ wfe->nAvgBytesPerSec = (bitrate + 4) / 8;
+ wfe->nBlockAlign = fsize < WORD_MAX ? fsize : WORD_MAX;
+ wfe->wBitsPerSample = bitdepth;
+ wfe->cbSize = 0;
+
+ pmt->SetSampleSize(0);
+
+ Seek(startpos + i);
+ return true;
+ }
+
+ return false;
}
bool CBaseSplitterFileEx::Read(dvdspuhdr& h, CMediaType* pmt)
{
- memset(&h, 0, sizeof(h));
+ memset(&h, 0, sizeof(h));
- if (!pmt) {
- return true;
- }
+ if (!pmt) {
+ return true;
+ }
- pmt->majortype = MEDIATYPE_Video;
- pmt->subtype = MEDIASUBTYPE_DVD_SUBPICTURE;
- pmt->formattype = FORMAT_None;
+ pmt->majortype = MEDIATYPE_Video;
+ pmt->subtype = MEDIASUBTYPE_DVD_SUBPICTURE;
+ pmt->formattype = FORMAT_None;
- return true;
+ return true;
}
bool CBaseSplitterFileEx::Read(hdmvsubhdr& h, CMediaType* pmt, const char* language_code)
{
- memset(&h, 0, sizeof(h));
+ memset(&h, 0, sizeof(h));
- if (!pmt) {
- return true;
- }
+ if (!pmt) {
+ return true;
+ }
- pmt->majortype = MEDIATYPE_Subtitle;
- pmt->subtype = MEDIASUBTYPE_HDMVSUB;
- pmt->formattype = FORMAT_None;
+ pmt->majortype = MEDIATYPE_Subtitle;
+ pmt->subtype = MEDIASUBTYPE_HDMVSUB;
+ pmt->formattype = FORMAT_None;
- SUBTITLEINFO* psi = (SUBTITLEINFO*)pmt->AllocFormatBuffer(sizeof(SUBTITLEINFO));
- if (psi) {
- memset(psi, 0, pmt->FormatLength());
- strcpy_s(psi->IsoLang, language_code ? language_code : "eng");
- }
+ SUBTITLEINFO* psi = (SUBTITLEINFO*)pmt->AllocFormatBuffer(sizeof(SUBTITLEINFO));
+ if (psi) {
+ memset(psi, 0, pmt->FormatLength());
+ strcpy_s(psi->IsoLang, language_code ? language_code : "eng");
+ }
- return true;
+ return true;
}
bool CBaseSplitterFileEx::Read(svcdspuhdr& h, CMediaType* pmt)
{
- memset(&h, 0, sizeof(h));
+ memset(&h, 0, sizeof(h));
- if (!pmt) {
- return true;
- }
+ if (!pmt) {
+ return true;
+ }
- pmt->majortype = MEDIATYPE_Video;
- pmt->subtype = MEDIASUBTYPE_SVCD_SUBPICTURE;
- pmt->formattype = FORMAT_None;
+ pmt->majortype = MEDIATYPE_Video;
+ pmt->subtype = MEDIASUBTYPE_SVCD_SUBPICTURE;
+ pmt->formattype = FORMAT_None;
- return true;
+ return true;
}
bool CBaseSplitterFileEx::Read(cvdspuhdr& h, CMediaType* pmt)
{
- memset(&h, 0, sizeof(h));
+ memset(&h, 0, sizeof(h));
- if (!pmt) {
- return true;
- }
+ if (!pmt) {
+ return true;
+ }
- pmt->majortype = MEDIATYPE_Video;
- pmt->subtype = MEDIASUBTYPE_CVD_SUBPICTURE;
- pmt->formattype = FORMAT_None;
+ pmt->majortype = MEDIATYPE_Video;
+ pmt->subtype = MEDIASUBTYPE_CVD_SUBPICTURE;
+ pmt->formattype = FORMAT_None;
- return true;
+ return true;
}
bool CBaseSplitterFileEx::Read(ps2audhdr& h, CMediaType* pmt)
{
- memset(&h, 0, sizeof(h));
-
- if (BitRead(16, true) != 'SS') {
- return false;
- }
-
- __int64 pos = GetPos();
-
- while (BitRead(16, true) == 'SS') {
- DWORD tag = (DWORD)BitRead(32, true);
- DWORD size = 0;
-
- if (tag == 'SShd') {
- BitRead(32);
- ByteRead((BYTE*)&size, sizeof(size));
- ASSERT(size == 0x18);
- Seek(GetPos());
- ByteRead((BYTE*)&h, sizeof(h));
- } else if (tag == 'SSbd') {
- BitRead(32);
- ByteRead((BYTE*)&size, sizeof(size));
- break;
- }
- }
-
- Seek(pos);
-
- if (!pmt) {
- return true;
- }
-
- WAVEFORMATEXPS2 wfe;
- wfe.wFormatTag =
- h.unk1 == 0x01 ? WAVE_FORMAT_PS2_PCM :
- h.unk1 == 0x10 ? WAVE_FORMAT_PS2_ADPCM :
- WAVE_FORMAT_UNKNOWN;
- wfe.nChannels = (WORD)h.channels;
- wfe.nSamplesPerSec = h.freq;
- wfe.wBitsPerSample = 16; // always?
- wfe.nBlockAlign = wfe.nChannels*wfe.wBitsPerSample>>3;
- wfe.nAvgBytesPerSec = wfe.nBlockAlign*wfe.nSamplesPerSec;
- wfe.dwInterleave = h.interleave;
-
- pmt->majortype = MEDIATYPE_Audio;
- pmt->subtype = FOURCCMap(wfe.wFormatTag);
- pmt->formattype = FORMAT_WaveFormatEx;
- pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
-
- return true;
+ memset(&h, 0, sizeof(h));
+
+ if (BitRead(16, true) != 'SS') {
+ return false;
+ }
+
+ __int64 pos = GetPos();
+
+ while (BitRead(16, true) == 'SS') {
+ DWORD tag = (DWORD)BitRead(32, true);
+ DWORD size = 0;
+
+ if (tag == 'SShd') {
+ BitRead(32);
+ ByteRead((BYTE*)&size, sizeof(size));
+ ASSERT(size == 0x18);
+ Seek(GetPos());
+ ByteRead((BYTE*)&h, sizeof(h));
+ } else if (tag == 'SSbd') {
+ BitRead(32);
+ ByteRead((BYTE*)&size, sizeof(size));
+ break;
+ }
+ }
+
+ Seek(pos);
+
+ if (!pmt) {
+ return true;
+ }
+
+ WAVEFORMATEXPS2 wfe;
+ wfe.wFormatTag =
+ h.unk1 == 0x01 ? WAVE_FORMAT_PS2_PCM :
+ h.unk1 == 0x10 ? WAVE_FORMAT_PS2_ADPCM :
+ WAVE_FORMAT_UNKNOWN;
+ wfe.nChannels = (WORD)h.channels;
+ wfe.nSamplesPerSec = h.freq;
+ wfe.wBitsPerSample = 16; // always?
+ wfe.nBlockAlign = wfe.nChannels * wfe.wBitsPerSample >> 3;
+ wfe.nAvgBytesPerSec = wfe.nBlockAlign * wfe.nSamplesPerSec;
+ wfe.dwInterleave = h.interleave;
+
+ pmt->majortype = MEDIATYPE_Audio;
+ pmt->subtype = FOURCCMap(wfe.wFormatTag);
+ pmt->formattype = FORMAT_WaveFormatEx;
+ pmt->SetFormat((BYTE*)&wfe, sizeof(wfe));
+
+ return true;
}
bool CBaseSplitterFileEx::Read(ps2subhdr& h, CMediaType* pmt)
{
- memset(&h, 0, sizeof(h));
+ memset(&h, 0, sizeof(h));
- if (!pmt) {
- return true;
- }
+ if (!pmt) {
+ return true;
+ }
- pmt->majortype = MEDIATYPE_Subtitle;
- pmt->subtype = MEDIASUBTYPE_PS2_SUB;
- pmt->formattype = FORMAT_None;
+ pmt->majortype = MEDIATYPE_Subtitle;
+ pmt->subtype = MEDIASUBTYPE_PS2_SUB;
+ pmt->formattype = FORMAT_None;
- return true;
+ return true;
}
bool CBaseSplitterFileEx::Read(trhdr& h, bool fSync)
{
- memset(&h, 0, sizeof(h));
-
- BitByteAlign();
-
- if (m_tslen == 0) {
- __int64 pos = GetPos();
- int count = 0;
-
- for (int i = 0; i < 192; i++) {
- if (BitRead(8, true) == 0x47) {
- __int64 pos = GetPos();
- Seek(pos + 188);
- if (BitRead(8, true) == 0x47) {
- if (m_tslen != 188) {
- count = 0;
- }
- m_tslen = 188; // TS stream
- if (count > 1) {
- break;
- }
- count++;
- } else {
- Seek(pos + 192);
- if (BitRead(8, true) == 0x47) {
- if (m_tslen != 192) {
- count = 0;
- }
- m_tslen = 192; // M2TS stream
- if (count > 1) {
- break;
- }
- count++;
- }
- }
- } else {
- BitRead(8);
- }
- }
-
- Seek(pos);
-
- if (m_tslen == 0) {
- return false;
- }
- }
-
- if (fSync) {
- for (int i = 0; i < m_tslen; i++) {
- if (BitRead(8, true) == 0x47) {
- if (i == 0) {
- break;
- }
- Seek(GetPos()+m_tslen);
- if (BitRead(8, true) == 0x47) {
- Seek(GetPos()-m_tslen);
- break;
- }
- }
-
- BitRead(8);
-
- if (i == m_tslen-1) {
- return false;
- }
- }
- }
-
- if (BitRead(8, true) != 0x47) {
- return false;
- }
-
- h.next = GetPos() + m_tslen;
-
- h.sync = (BYTE)BitRead(8);
- h.error = BitRead(1);
- h.payloadstart = BitRead(1);
- h.transportpriority = BitRead(1);
- h.pid = BitRead(13);
- h.scrambling = BitRead(2);
- h.adapfield = BitRead(1);
- h.payload = BitRead(1);
- h.counter = BitRead(4);
-
- h.bytes = 188 - 4;
-
- if (h.adapfield) {
- h.length = (BYTE)BitRead(8);
-
- if (h.length > 0) {
- h.discontinuity = BitRead(1);
- h.randomaccess = BitRead(1);
- h.priority = BitRead(1);
- h.fPCR = BitRead(1);
- h.OPCR = BitRead(1);
- h.splicingpoint = BitRead(1);
- h.privatedata = BitRead(1);
- h.extension = BitRead(1);
-
- int i = 1;
-
- if (h.fPCR && h.length>6) {
- h.PCR = BitRead(33);
- BitRead(6);
- UINT64 PCRExt = BitRead(9);
- h.PCR = (h.PCR*300 + PCRExt) * 10 / 27;
- i += 6;
- }
-
- h.length = min(h.length, h.bytes-1);
- for (; i < h.length; i++) {
- BitRead(8);
- }
- }
-
- h.bytes -= h.length+1;
-
- if (h.bytes < 0) {
- ASSERT(0);
- return false;
- }
- }
- return true;
+ memset(&h, 0, sizeof(h));
+
+ BitByteAlign();
+
+ if (m_tslen == 0) {
+ __int64 pos = GetPos();
+ int count = 0;
+
+ for (int i = 0; i < 192; i++) {
+ if (BitRead(8, true) == 0x47) {
+ __int64 pos = GetPos();
+ Seek(pos + 188);
+ if (BitRead(8, true) == 0x47) {
+ if (m_tslen != 188) {
+ count = 0;
+ }
+ m_tslen = 188; // TS stream
+ if (count > 1) {
+ break;
+ }
+ count++;
+ } else {
+ Seek(pos + 192);
+ if (BitRead(8, true) == 0x47) {
+ if (m_tslen != 192) {
+ count = 0;
+ }
+ m_tslen = 192; // M2TS stream
+ if (count > 1) {
+ break;
+ }
+ count++;
+ }
+ }
+ } else {
+ BitRead(8);
+ }
+ }
+
+ Seek(pos);
+
+ if (m_tslen == 0) {
+ return false;
+ }
+ }
+
+ if (fSync) {
+ for (int i = 0; i < m_tslen; i++) {
+ if (BitRead(8, true) == 0x47) {
+ if (i == 0) {
+ break;
+ }
+ Seek(GetPos() + m_tslen);
+ if (BitRead(8, true) == 0x47) {
+ Seek(GetPos() - m_tslen);
+ break;
+ }
+ }
+
+ BitRead(8);
+
+ if (i == m_tslen - 1) {
+ return false;
+ }
+ }
+ }
+
+ if (BitRead(8, true) != 0x47) {
+ return false;
+ }
+
+ h.next = GetPos() + m_tslen;
+
+ h.sync = (BYTE)BitRead(8);
+ h.error = BitRead(1);
+ h.payloadstart = BitRead(1);
+ h.transportpriority = BitRead(1);
+ h.pid = BitRead(13);
+ h.scrambling = BitRead(2);
+ h.adapfield = BitRead(1);
+ h.payload = BitRead(1);
+ h.counter = BitRead(4);
+
+ h.bytes = 188 - 4;
+
+ if (h.adapfield) {
+ h.length = (BYTE)BitRead(8);
+
+ if (h.length > 0) {
+ h.discontinuity = BitRead(1);
+ h.randomaccess = BitRead(1);
+ h.priority = BitRead(1);
+ h.fPCR = BitRead(1);
+ h.OPCR = BitRead(1);
+ h.splicingpoint = BitRead(1);
+ h.privatedata = BitRead(1);
+ h.extension = BitRead(1);
+
+ int i = 1;
+
+ if (h.fPCR && h.length > 6) {
+ h.PCR = BitRead(33);
+ BitRead(6);
+ UINT64 PCRExt = BitRead(9);
+ h.PCR = (h.PCR * 300 + PCRExt) * 10 / 27;
+ i += 6;
+ }
+
+ h.length = min(h.length, h.bytes - 1);
+ for (; i < h.length; i++) {
+ BitRead(8);
+ }
+ }
+
+ h.bytes -= h.length + 1;
+
+ if (h.bytes < 0) {
+ ASSERT(0);
+ return false;
+ }
+ }
+ return true;
}
bool CBaseSplitterFileEx::Read(trsechdr& h)
{
- memset(&h, 0, sizeof(h));
-
- BYTE pointer_field = (BYTE)BitRead(8);
- while (pointer_field-- > 0) {
- BitRead(8);
- }
- h.table_id = (BYTE)BitRead(8);
- h.section_syntax_indicator = (WORD)BitRead(1);
- h.zero = (WORD)BitRead(1);
- h.reserved1 = (WORD)BitRead(2);
- h.section_length = (WORD)BitRead(12);
- h.transport_stream_id = (WORD)BitRead(16);
- h.reserved2 = (BYTE)BitRead(2);
- h.version_number = (BYTE)BitRead(5);
- h.current_next_indicator = (BYTE)BitRead(1);
- h.section_number = (BYTE)BitRead(8);
- h.last_section_number = (BYTE)BitRead(8);
-
- return h.section_syntax_indicator == 1 && h.zero == 0;
+ memset(&h, 0, sizeof(h));
+
+ BYTE pointer_field = (BYTE)BitRead(8);
+ while (pointer_field-- > 0) {
+ BitRead(8);
+ }
+ h.table_id = (BYTE)BitRead(8);
+ h.section_syntax_indicator = (WORD)BitRead(1);
+ h.zero = (WORD)BitRead(1);
+ h.reserved1 = (WORD)BitRead(2);
+ h.section_length = (WORD)BitRead(12);
+ h.transport_stream_id = (WORD)BitRead(16);
+ h.reserved2 = (BYTE)BitRead(2);
+ h.version_number = (BYTE)BitRead(5);
+ h.current_next_indicator = (BYTE)BitRead(1);
+ h.section_number = (BYTE)BitRead(8);
+ h.last_section_number = (BYTE)BitRead(8);
+
+ return h.section_syntax_indicator == 1 && h.zero == 0;
}
bool CBaseSplitterFileEx::Read(pvahdr& h, bool fSync)
{
- memset(&h, 0, sizeof(h));
-
- BitByteAlign();
-
- if (fSync) {
- for (int i = 0; i < 65536; i++) {
- if ((BitRead(64, true)&0xfffffc00ffe00000i64) == 0x4156000055000000i64) {
- break;
- }
- BitRead(8);
- }
- }
-
- if ((BitRead(64, true)&0xfffffc00ffe00000i64) != 0x4156000055000000i64) {
- return false;
- }
-
- h.sync = (WORD)BitRead(16);
- h.streamid = (BYTE)BitRead(8);
- h.counter = (BYTE)BitRead(8);
- h.res1 = (BYTE)BitRead(8);
- h.res2 = BitRead(3);
- h.fpts = BitRead(1);
- h.postbytes = BitRead(2);
- h.prebytes = BitRead(2);
- h.length = (WORD)BitRead(16);
-
- if (h.length > 6136) {
- return false;
- }
-
- __int64 pos = GetPos();
-
- if (h.streamid == 1 && h.fpts) {
- h.pts = 10000*BitRead(32)/90 + m_rtPTSOffset;
- } else if (h.streamid == 2 && (h.fpts || (BitRead(32, true)&0xffffffe0) == 0x000001c0)) {
- BYTE b;
- if (!NextMpegStartCode(b, 4)) {
- return false;
- }
- peshdr h2;
- if (!Read(h2, b)) {
- return false;
- }
- // Maybe bug, code before: if (h.fpts = h2.fpts) h.pts = h2.pts;
- h.fpts = h2.fpts;
- if (h.fpts) {
- h.pts = h2.pts;
- }
- }
-
- BitRead(8*h.prebytes);
-
- h.length -= (WORD)(GetPos() - pos);
-
- return true;
+ memset(&h, 0, sizeof(h));
+
+ BitByteAlign();
+
+ if (fSync) {
+ for (int i = 0; i < 65536; i++) {
+ if ((BitRead(64, true) & 0xfffffc00ffe00000i64) == 0x4156000055000000i64) {
+ break;
+ }
+ BitRead(8);
+ }
+ }
+
+ if ((BitRead(64, true) & 0xfffffc00ffe00000i64) != 0x4156000055000000i64) {
+ return false;
+ }
+
+ h.sync = (WORD)BitRead(16);
+ h.streamid = (BYTE)BitRead(8);
+ h.counter = (BYTE)BitRead(8);
+ h.res1 = (BYTE)BitRead(8);
+ h.res2 = BitRead(3);
+ h.fpts = BitRead(1);
+ h.postbytes = BitRead(2);
+ h.prebytes = BitRead(2);
+ h.length = (WORD)BitRead(16);
+
+ if (h.length > 6136) {
+ return false;
+ }
+
+ __int64 pos = GetPos();
+
+ if (h.streamid == 1 && h.fpts) {
+ h.pts = 10000 * BitRead(32) / 90 + m_rtPTSOffset;
+ } else if (h.streamid == 2 && (h.fpts || (BitRead(32, true) & 0xffffffe0) == 0x000001c0)) {
+ BYTE b;
+ if (!NextMpegStartCode(b, 4)) {
+ return false;
+ }
+ peshdr h2;
+ if (!Read(h2, b)) {
+ return false;
+ }
+ // Maybe bug, code before: if (h.fpts = h2.fpts) h.pts = h2.pts;
+ h.fpts = h2.fpts;
+ if (h.fpts) {
+ h.pts = h2.pts;
+ }
+ }
+
+ BitRead(8 * h.prebytes);
+
+ h.length -= (WORD)(GetPos() - pos);
+
+ return true;
}
int CBaseSplitterFileEx::HrdParameters(CGolombBuffer& gb)
{
- UINT64 cnt = gb.UExpGolombRead(); // cpb_cnt_minus1
- if (cnt > 32U)
- return -1;
- gb.BitRead(4); // bit_rate_scale
- gb.BitRead(4); // cpb_size_scale
-
- for (unsigned int i = 0; i <= cnt; i++ ) {
- gb.UExpGolombRead(); // bit_rate_value_minus1
- gb.UExpGolombRead(); // cpb_size_value_minus1
- gb.BitRead(1); // cbr_flag
- }
-
- gb.BitRead(5); // initial_cpb_removal_delay_length_minus1
- gb.BitRead(5); // cpb_removal_delay_length_minus1
- gb.BitRead(5); // dpb_output_delay_length_minus1
- gb.BitRead(5); // time_offset_length
-
- return 0;
+ UINT64 cnt = gb.UExpGolombRead(); // cpb_cnt_minus1
+ if (cnt > 32U) {
+ return -1;
+ }
+ gb.BitRead(4); // bit_rate_scale
+ gb.BitRead(4); // cpb_size_scale
+
+ for (unsigned int i = 0; i <= cnt; i++) {
+ gb.UExpGolombRead(); // bit_rate_value_minus1
+ gb.UExpGolombRead(); // cpb_size_value_minus1
+ gb.BitRead(1); // cbr_flag
+ }
+
+ gb.BitRead(5); // initial_cpb_removal_delay_length_minus1
+ gb.BitRead(5); // cpb_removal_delay_length_minus1
+ gb.BitRead(5); // dpb_output_delay_length_minus1
+ gb.BitRead(5); // time_offset_length
+
+ return 0;
}
void CBaseSplitterFileEx::RemoveMpegEscapeCode(BYTE* dst, BYTE* src, int length)
{
- int si=0;
- int di=0;
- while (si+2<length) {
- //remove escapes (very rare 1:2^22)
- if (src[si+2]>3) {
- dst[di++]= src[si++];
- dst[di++]= src[si++];
- } else if (src[si]==0 && src[si+1]==0) {
- if (src[si+2]==3) { //escape
- dst[di++]= 0;
- dst[di++]= 0;
- si+=3;
- continue;
- } else { //next start code
- return;
- }
- }
-
- dst[di++]= src[si++];
- }
+ int si = 0;
+ int di = 0;
+ while (si + 2 < length) {
+ //remove escapes (very rare 1:2^22)
+ if (src[si + 2] > 3) {
+ dst[di++] = src[si++];
+ dst[di++] = src[si++];
+ } else if (src[si] == 0 && src[si + 1] == 0) {
+ if (src[si + 2] == 3) { //escape
+ dst[di++] = 0;
+ dst[di++] = 0;
+ si += 3;
+ continue;
+ } else { //next start code
+ return;
+ }
+ }
+
+ dst[di++] = src[si++];
+ }
}
bool CBaseSplitterFileEx::Read(avchdr& h, int len, CMediaType* pmt)
{
- __int64 endpos = GetPos() + len;
- __int64 nalstartpos = GetPos();
- //__int64 nalendpos;
- bool repeat = false;
-
- // First try search for the start code
- DWORD _dwStartCode = (DWORD)BitRead(32, true);
- while (GetPos() < endpos+4 &&
- (_dwStartCode & 0xFFFFFF1F) != 0x101 && // Coded slide of a non-IDR
- (_dwStartCode & 0xFFFFFF1F) != 0x105 && // Coded slide of an IDR
- (_dwStartCode & 0xFFFFFF1F) != 0x107 && // Sequence Parameter Set
- (_dwStartCode & 0xFFFFFF1F) != 0x108 && // Picture Parameter Set
- (_dwStartCode & 0xFFFFFF1F) != 0x109 && // Access Unit Delimiter
- (_dwStartCode & 0xFFFFFF1F) != 0x10f // Subset Sequence Parameter Set (MVC)
- ) {
- BitRead(8);
- _dwStartCode = (DWORD)BitRead(32, true);
- }
- if (GetPos() >= endpos+4) {
- return false;
- }
-
- // At least a SPS (normal or subset) and a PPS is required
- while (GetPos() < endpos+4 && (!(h.spspps[index_sps].complete || h.spspps[index_subsetsps].complete) || !h.spspps[index_pps1].complete || repeat))
- {
- BYTE id = h.lastid;
- repeat = false;
-
- // Get array index from NAL unit type
- spsppsindex index = index_unknown;
-
- if ((id&0x60) != 0) {
- if ((id&0x9f) == 0x07) {
- index = index_sps;
- } else if ((id&0x9f) == 0x0F) {
- index = index_subsetsps;
- } else if ((id&0x9f) == 0x08) {
- index = h.spspps[index_pps1].complete ? index_pps2 : index_pps1;
- }
- }
-
- // Search for next start code
- DWORD dwStartCode = (DWORD)BitRead(32, true);
- while (GetPos() < endpos+4 && (dwStartCode != 0x00000001) && (dwStartCode & 0xFFFFFF00) != 0x00000100) {
- BitRead(8);
- dwStartCode = (DWORD)BitRead(32, true);
- }
-
- //nalendpos = GetPos();
-
- // Skip start code
- __int64 pos;
- if (GetPos() < endpos+4) {
- if (dwStartCode == 0x00000001)
- BitRead(32);
- else
- BitRead(24);
-
- pos = GetPos();
- h.lastid = (BYTE)BitRead(8);
- } else {
- pos = GetPos()-4;
- }
-
- // The SPS or PPS might be fragmented, copy data into buffer until NAL is complete
- if (index >= 0) {
- if (h.spspps[index].complete) {
- // Don't handle SPS/PPS twice
- continue;
- } else if (pos > nalstartpos) {
- // Copy into buffer
- Seek(nalstartpos);
- unsigned int bufsize = _countof(h.spspps[index].buffer);
- int len = min(int(bufsize - h.spspps[index].size), int(pos - nalstartpos));
- ByteRead(h.spspps[index].buffer+h.spspps[index].size, len);
- Seek(pos);
- h.spspps[index].size += len;
-
- //ASSERT(h.spspps[index].size < bufsize); // disable for better debug ...
-
- if (h.spspps[index].size >= bufsize || dwStartCode == 0x00000001 || (dwStartCode & 0xFFFFFF00) == 0x00000100) {
- if (Read(h, index)) {
- h.spspps[index].complete = true;
- h.spspps[index].size -= 4;
- } else {
- h.spspps[index].size = 0;
- }
- }
-
- repeat = true;
- }
- }
-
- nalstartpos = pos;
- }
-
- // Exit and wait for next packet if there is no SPS and PPS yet
- if ((!h.spspps[index_sps].complete && !h.spspps[index_subsetsps].complete) || !h.spspps[index_pps1].complete || repeat) {
-
- return false;
- }
-
- if (!pmt) {
- return true;
- }
-
- {
- // Calculate size of extra data
- int extra = 0;
- for (int i = 0; i < 4; i++) {
- if (h.spspps[i].complete)
- extra += 2+(h.spspps[i].size);
- }
-
- pmt->majortype = MEDIATYPE_Video;
- if (h.spspps[index_subsetsps].complete && !h.spspps[index_sps].complete) {
- pmt->subtype = FOURCCMap('CVME'); // MVC stream without base view
- } else if (h.spspps[index_subsetsps].complete && h.spspps[index_sps].complete) {
- pmt->subtype = FOURCCMap('CVMA'); // MVC stream with base view
- } else {
- pmt->subtype = FOURCCMap('1CVA'); // AVC stream
- }
- //pmt->subtype = MEDIASUBTYPE_H264; // TODO : put MEDIASUBTYPE_H264 to support Windows 7 decoder !
- pmt->formattype = FORMAT_MPEG2_VIDEO;
- int len = FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + extra;
- MPEG2VIDEOINFO* vi = (MPEG2VIDEOINFO*)DNew BYTE[len];
- memset(vi, 0, len);
- // vi->hdr.dwBitRate = ;
- vi->hdr.AvgTimePerFrame = h.AvgTimePerFrame;
- if (!h.sar.num) h.sar.num = 1;
- if (!h.sar.den) h.sar.den = 1;
- CSize aspect(h.width * h.sar.num, h.height * h.sar.den);
- int lnko = LNKO(aspect.cx, aspect.cy);
- if (lnko > 1) {
- aspect.cx /= lnko, aspect.cy /= lnko;
- }
-
- if (aspect.cx * 2 < aspect.cy) {
- delete[] vi;
- return false;
- }
-
- vi->hdr.dwPictAspectRatioX = aspect.cx;
- vi->hdr.dwPictAspectRatioY = aspect.cy;
- vi->hdr.bmiHeader.biSize = sizeof(vi->hdr.bmiHeader);
- vi->hdr.bmiHeader.biWidth = h.width;
- vi->hdr.bmiHeader.biHeight = h.height;
- if (h.spspps[index_subsetsps].complete && !h.spspps[index_sps].complete) {
- vi->hdr.bmiHeader.biCompression = 'CVME';
- } else if (h.spspps[index_subsetsps].complete && h.spspps[index_sps].complete) {
- vi->hdr.bmiHeader.biCompression = 'CVMA';
- } else {
- vi->hdr.bmiHeader.biCompression = '1CVA';
- }
- vi->dwProfile = h.profile;
- vi->dwFlags = 4; // ?
- vi->dwLevel = h.level;
- vi->cbSequenceHeader = extra;
-
- // Copy extra data
- BYTE* p = (BYTE*)&vi->dwSequenceHeader[0];
- for (int i = 0; i < 4; i++) {
- if (h.spspps[i].complete) {
- *p++ = (h.spspps[i].size) >> 8;
- *p++ = (h.spspps[i].size) & 0xff;
- memcpy(p, h.spspps[i].buffer, h.spspps[i].size);
- p += h.spspps[i].size;
- }
- }
-
- pmt->SetFormat((BYTE*)vi, len);
- delete [] vi;
- }
-
- return true;
+ __int64 endpos = GetPos() + len;
+ __int64 nalstartpos = GetPos();
+ //__int64 nalendpos;
+ bool repeat = false;
+
+ // First try search for the start code
+ DWORD _dwStartCode = (DWORD)BitRead(32, true);
+ while (GetPos() < endpos + 4 &&
+ (_dwStartCode & 0xFFFFFF1F) != 0x101 && // Coded slide of a non-IDR
+ (_dwStartCode & 0xFFFFFF1F) != 0x105 && // Coded slide of an IDR
+ (_dwStartCode & 0xFFFFFF1F) != 0x107 && // Sequence Parameter Set
+ (_dwStartCode & 0xFFFFFF1F) != 0x108 && // Picture Parameter Set
+ (_dwStartCode & 0xFFFFFF1F) != 0x109 && // Access Unit Delimiter
+ (_dwStartCode & 0xFFFFFF1F) != 0x10f // Subset Sequence Parameter Set (MVC)
+ ) {
+ BitRead(8);
+ _dwStartCode = (DWORD)BitRead(32, true);
+ }
+ if (GetPos() >= endpos + 4) {
+ return false;
+ }
+
+ // At least a SPS (normal or subset) and a PPS is required
+ while (GetPos() < endpos + 4 && (!(h.spspps[index_sps].complete || h.spspps[index_subsetsps].complete) || !h.spspps[index_pps1].complete || repeat)) {
+ BYTE id = h.lastid;
+ repeat = false;
+
+ // Get array index from NAL unit type
+ spsppsindex index = index_unknown;
+
+ if ((id & 0x60) != 0) {
+ if ((id & 0x9f) == 0x07) {
+ index = index_sps;
+ } else if ((id & 0x9f) == 0x0F) {
+ index = index_subsetsps;
+ } else if ((id & 0x9f) == 0x08) {
+ index = h.spspps[index_pps1].complete ? index_pps2 : index_pps1;
+ }
+ }
+
+ // Search for next start code
+ DWORD dwStartCode = (DWORD)BitRead(32, true);
+ while (GetPos() < endpos + 4 && (dwStartCode != 0x00000001) && (dwStartCode & 0xFFFFFF00) != 0x00000100) {
+ BitRead(8);
+ dwStartCode = (DWORD)BitRead(32, true);
+ }
+
+ //nalendpos = GetPos();
+
+ // Skip start code
+ __int64 pos;
+ if (GetPos() < endpos + 4) {
+ if (dwStartCode == 0x00000001) {
+ BitRead(32);
+ } else {
+ BitRead(24);
+ }
+
+ pos = GetPos();
+ h.lastid = (BYTE)BitRead(8);
+ } else {
+ pos = GetPos() - 4;
+ }
+
+ // The SPS or PPS might be fragmented, copy data into buffer until NAL is complete
+ if (index >= 0) {
+ if (h.spspps[index].complete) {
+ // Don't handle SPS/PPS twice
+ continue;
+ } else if (pos > nalstartpos) {
+ // Copy into buffer
+ Seek(nalstartpos);
+ unsigned int bufsize = _countof(h.spspps[index].buffer);
+ int len = min(int(bufsize - h.spspps[index].size), int(pos - nalstartpos));
+ ByteRead(h.spspps[index].buffer + h.spspps[index].size, len);
+ Seek(pos);
+ h.spspps[index].size += len;
+
+ //ASSERT(h.spspps[index].size < bufsize); // disable for better debug ...
+
+ if (h.spspps[index].size >= bufsize || dwStartCode == 0x00000001 || (dwStartCode & 0xFFFFFF00) == 0x00000100) {
+ if (Read(h, index)) {
+ h.spspps[index].complete = true;
+ h.spspps[index].size -= 4;
+ } else {
+ h.spspps[index].size = 0;
+ }
+ }
+
+ repeat = true;
+ }
+ }
+
+ nalstartpos = pos;
+ }
+
+ // Exit and wait for next packet if there is no SPS and PPS yet
+ if ((!h.spspps[index_sps].complete && !h.spspps[index_subsetsps].complete) || !h.spspps[index_pps1].complete || repeat) {
+
+ return false;
+ }
+
+ if (!pmt) {
+ return true;
+ }
+
+ {
+ // Calculate size of extra data
+ int extra = 0;
+ for (int i = 0; i < 4; i++) {
+ if (h.spspps[i].complete) {
+ extra += 2 + (h.spspps[i].size);
+ }
+ }
+
+ pmt->majortype = MEDIATYPE_Video;
+ if (h.spspps[index_subsetsps].complete && !h.spspps[index_sps].complete) {
+ pmt->subtype = FOURCCMap('CVME'); // MVC stream without base view
+ } else if (h.spspps[index_subsetsps].complete && h.spspps[index_sps].complete) {
+ pmt->subtype = FOURCCMap('CVMA'); // MVC stream with base view
+ } else {
+ pmt->subtype = FOURCCMap('1CVA'); // AVC stream
+ }
+ //pmt->subtype = MEDIASUBTYPE_H264; // TODO : put MEDIASUBTYPE_H264 to support Windows 7 decoder !
+ pmt->formattype = FORMAT_MPEG2_VIDEO;
+ int len = FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + extra;
+ MPEG2VIDEOINFO* vi = (MPEG2VIDEOINFO*)DNew BYTE[len];
+ memset(vi, 0, len);
+ // vi->hdr.dwBitRate = ;
+ vi->hdr.AvgTimePerFrame = h.AvgTimePerFrame;
+ if (!h.sar.num) { h.sar.num = 1; }
+ if (!h.sar.den) { h.sar.den = 1; }
+ CSize aspect(h.width * h.sar.num, h.height * h.sar.den);
+ int lnko = LNKO(aspect.cx, aspect.cy);
+ if (lnko > 1) {
+ aspect.cx /= lnko, aspect.cy /= lnko;
+ }
+
+ if (aspect.cx * 2 < aspect.cy) {
+ delete[] vi;
+ return false;
+ }
+
+ vi->hdr.dwPictAspectRatioX = aspect.cx;
+ vi->hdr.dwPictAspectRatioY = aspect.cy;
+ vi->hdr.bmiHeader.biSize = sizeof(vi->hdr.bmiHeader);
+ vi->hdr.bmiHeader.biWidth = h.width;
+ vi->hdr.bmiHeader.biHeight = h.height;
+ if (h.spspps[index_subsetsps].complete && !h.spspps[index_sps].complete) {
+ vi->hdr.bmiHeader.biCompression = 'CVME';
+ } else if (h.spspps[index_subsetsps].complete && h.spspps[index_sps].complete) {
+ vi->hdr.bmiHeader.biCompression = 'CVMA';
+ } else {
+ vi->hdr.bmiHeader.biCompression = '1CVA';
+ }
+ vi->dwProfile = h.profile;
+ vi->dwFlags = 4; // ?
+ vi->dwLevel = h.level;
+ vi->cbSequenceHeader = extra;
+
+ // Copy extra data
+ BYTE* p = (BYTE*)&vi->dwSequenceHeader[0];
+ for (int i = 0; i < 4; i++) {
+ if (h.spspps[i].complete) {
+ *p++ = (h.spspps[i].size) >> 8;
+ *p++ = (h.spspps[i].size) & 0xff;
+ memcpy(p, h.spspps[i].buffer, h.spspps[i].size);
+ p += h.spspps[i].size;
+ }
+ }
+
+ pmt->SetFormat((BYTE*)vi, len);
+ delete [] vi;
+ }
+
+ return true;
}
bool CBaseSplitterFileEx::Read(avchdr& h, spsppsindex index)
{
- static BYTE profiles[] = {44, 66, 77, 88, 100, 110, 118, 122, 128, 144, 244};
- static BYTE levels[] = {10, 11, 12, 13, 20, 21, 22, 30, 31, 32, 40, 41, 42, 50, 51};
-
- // Only care about SPS and subset SPS
- if (index != index_sps && index != index_subsetsps)
- return true;
-
- // Manage escape codes
- BYTE buffer[MAX_SPSPPS];
- RemoveMpegEscapeCode(buffer, h.spspps[index].buffer, MAX_SPSPPS);
- CGolombBuffer gb(buffer, MAX_SPSPPS);
-
- gb.BitRead(8); // nal_unit_type
- h.profile = (BYTE)gb.BitRead(8);
- bool b_ident = false;
- for (int i = 0; i<sizeof(profiles); i++) {
- if (h.profile == profiles[i]) {
- b_ident = true;
- break;
- }
- }
- if (!b_ident)
- return false;
-
- gb.BitRead(8);
- h.level = (BYTE)gb.BitRead(8);
- b_ident = false;
- for (int i = 0; i<sizeof(levels); i++) {
- if (h.level == levels[i]) {
- b_ident = true;
- break;
- }
- }
- if (!b_ident)
- return false;
-
- UINT64 sps_id = gb.UExpGolombRead(); // seq_parameter_set_id
- if (sps_id >= 32)
- return false;
-
- UINT64 chroma_format_idc = 0;
- if (h.profile >= 100) { // high profile
- chroma_format_idc = gb.UExpGolombRead();
- if (chroma_format_idc == 3) { // chroma_format_idc
- gb.BitRead(1); // residue_transform_flag
- }
-
- gb.UExpGolombRead(); // bit_depth_luma_minus8
- gb.UExpGolombRead(); // bit_depth_chroma_minus8
-
- gb.BitRead(1); // qpprime_y_zero_transform_bypass_flag
-
- if (gb.BitRead(1)) { // seq_scaling_matrix_present_flag
- for (int i = 0; i < 8; i++) {
- if (gb.BitRead(1)) { // seq_scaling_list_present_flag
- for (int j = 0, size = i < 6 ? 16 : 64, next = 8; j < size && next != 0; ++j) {
- next = (next + gb.SExpGolombRead() + 256) & 255;
- }
- }
- }
- }
- }
-
- gb.UExpGolombRead(); // log2_max_frame_num_minus4
-
- UINT64 pic_order_cnt_type = gb.UExpGolombRead();
-
- if (pic_order_cnt_type == 0) {
- gb.UExpGolombRead(); // log2_max_pic_order_cnt_lsb_minus4
- } else if (pic_order_cnt_type == 1) {
- gb.BitRead(1); // delta_pic_order_always_zero_flag
- gb.SExpGolombRead(); // offset_for_non_ref_pic
- gb.SExpGolombRead(); // offset_for_top_to_bottom_field
- UINT64 num_ref_frames_in_pic_order_cnt_cycle = gb.UExpGolombRead();
- if (num_ref_frames_in_pic_order_cnt_cycle >= 256)
- return false;
- for (int i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {
- gb.SExpGolombRead(); // offset_for_ref_frame[i]
- }
- } else if (pic_order_cnt_type != 2) {
- return false;
- }
-
- UINT64 ref_frame_count = gb.UExpGolombRead(); // num_ref_frames
- if (ref_frame_count > 30)
- return false;
- gb.BitRead(1); // gaps_in_frame_num_value_allowed_flag
-
- UINT64 pic_width_in_mbs_minus1 = gb.UExpGolombRead();
- UINT64 pic_height_in_map_units_minus1 = gb.UExpGolombRead();
- BYTE frame_mbs_only_flag = (BYTE)gb.BitRead(1);
-
- if (!frame_mbs_only_flag) {
- gb.BitRead(1); // mb_adaptive_frame_field_flag
- }
-
- BYTE direct_8x8_inference_flag = (BYTE)gb.BitRead(1); // direct_8x8_inference_flag
- if (!frame_mbs_only_flag && !direct_8x8_inference_flag) {
- return false;
- }
-
- if (gb.BitRead(1)) { // frame_cropping_flag
- h.crop_left = (unsigned int)gb.UExpGolombRead(); // frame_cropping_rect_left_offset
- h.crop_right = (unsigned int)gb.UExpGolombRead(); // frame_cropping_rect_right_offset
- h.crop_top = (unsigned int)gb.UExpGolombRead(); // frame_cropping_rect_top_offset
- h.crop_bottom = (unsigned int)gb.UExpGolombRead(); // frame_cropping_rect_bottom_offset
- }
-
- if (gb.BitRead(1)) { // vui_parameters_present_flag
- if (gb.BitRead(1)) { // aspect_ratio_info_present_flag
- BYTE aspect_ratio_idc = (BYTE)gb.BitRead(8); // aspect_ratio_idc
- if (255 == aspect_ratio_idc) {
- h.sar.num = (WORD)gb.BitRead(16); // sar_width
- h.sar.den = (WORD)gb.BitRead(16); // sar_height
- } else if (aspect_ratio_idc < 17) {
- h.sar.num = pixel_aspect[aspect_ratio_idc][0];
- h.sar.den = pixel_aspect[aspect_ratio_idc][1];
- } else {
- return false;
- }
- } else {
- h.sar.num = 1;
- h.sar.den = 1;
- }
-
- if (gb.BitRead(1)) { // overscan_info_present_flag
- gb.BitRead(1); // overscan_appropriate_flag
- }
-
- if (gb.BitRead(1)) { // video_signal_type_present_flag
- gb.BitRead(3); // video_format
- gb.BitRead(1); // video_full_range_flag
- if (gb.BitRead(1)) { // colour_description_present_flag
- gb.BitRead(8); // colour_primaries
- gb.BitRead(8); // transfer_characteristics
- gb.BitRead(8); // matrix_coefficients
- }
- }
- if (gb.BitRead(1)) { // chroma_location_info_present_flag
- gb.UExpGolombRead(); // chroma_sample_loc_type_top_field
- gb.UExpGolombRead(); // chroma_sample_loc_type_bottom_field
- }
- if (gb.BitRead(1)) { // timing_info_present_flag
- __int64 num_units_in_tick = gb.BitRead(32);
- __int64 time_scale = gb.BitRead(32);
- /*long fixed_frame_rate_flag = */gb.BitRead(1);
-
- // Trick for weird parameters
- if ((num_units_in_tick < 1000) || (num_units_in_tick > 1001)) {
- if ((time_scale % num_units_in_tick != 0) && ((time_scale*1001) % num_units_in_tick == 0)) {
- time_scale = (time_scale * 1001) / num_units_in_tick;
- num_units_in_tick = 1001;
- } else {
- time_scale = (time_scale * 1000) / num_units_in_tick;
- num_units_in_tick = 1000;
- }
- }
- time_scale = time_scale / 2; // VUI consider fields even for progressive stream : divide by 2!
-
- if (time_scale) {
- h.AvgTimePerFrame = (10000000I64*num_units_in_tick)/time_scale;
- }
- }
-
- bool nalflag = !!gb.BitRead(1); // nal_hrd_parameters_present_flag
- if (nalflag) {
- if (HrdParameters(gb)<0)
- return false;
- }
- bool vlcflag = !!gb.BitRead(1); // vlc_hrd_parameters_present_flag
- if (vlcflag) {
- if (HrdParameters(gb)<0)
- return false;
- }
- if (nalflag || vlcflag) {
- gb.BitRead(1); // low_delay_hrd_flag
- }
-
- gb.BitRead(1); // pic_struct_present_flag
- if (gb.BitRead(1)) { // bitstream_restriction_flag
- gb.BitRead(1); // motion_vectors_over_pic_boundaries_flag
- gb.UExpGolombRead(); // max_bytes_per_pic_denom
- gb.UExpGolombRead(); // max_bits_per_mb_denom
- gb.UExpGolombRead(); // log2_max_mv_length_horizontal
- gb.UExpGolombRead(); // log2_max_mv_length_vertical
- UINT64 num_reorder_frames = gb.UExpGolombRead(); // num_reorder_frames
- gb.UExpGolombRead(); // max_dec_frame_buffering
-
- if (gb.GetSize() < gb.GetPos()) {
- num_reorder_frames = 0;
- }
- if (num_reorder_frames > 16U)
- return false;
- }
- }
-
- if (index == index_subsetsps) {
- if (h.profile == 83 || h.profile == 86) {
- // TODO: SVC extensions
- return false;
- } else if (h.profile == 118 || h.profile == 128) {
- gb.BitRead(1); // bit_equal_to_one
-
- // seq_parameter_set_mvc_extension
- h.views = (unsigned int) gb.UExpGolombRead()+1;
-
- /*
- for (unsigned int i = 0; i < h.views; i++) {
- gb.UExpGolombRead(); // view_id
- }
-
- for (unsigned int i = 1; i < h.views; i++) {
- for (int j = 0; j < gb.UExpGolombRead(); j++) { // num_anchor_refs_l0
- gb.UExpGolombRead(); // anchor_refs_l0
- }
- for (int j = 0; j < gb.UExpGolombRead(); j++) { // num_anchor_refs_l1
- gb.UExpGolombRead(); // anchor_refs_l1
- }
- }
-
- for (unsigned int i = 1; i < h.views; i++) {
- for (int j = 0; j < gb.UExpGolombRead(); j++) { // num_non_anchor_refs_l0
- gb.UExpGolombRead(); // non_anchor_refs_l0
- }
- for (int j = 0; j < gb.UExpGolombRead(); j++) { // num_non_anchor_refs_l1
- gb.UExpGolombRead(); // non_anchor_refs_l1
- }
- }
-
- for (unsigned int i = 0; i <= gb.UExpGolombRead(); i++) { // num_level_values_signalled_minus1
- gb.BitRead(8); // level_idc
- for (int j = 0; j <= gb.UExpGolombRead(); j++) { // num_applicable_ops_minus1
- gb.BitRead(3); // applicable_op_temporal_id
- for (int k = 0; k <= gb.UExpGolombRead(); k++) { // applicable_op_num_target_views_minus1
- gb.UExpGolombRead(); // applicable_op_traget_view_id
- }
- gb.UExpGolombRead(); // applicable_op_num_views_minus1
- }
- }
-
- if (gb.BitRead(1)) { // mvc_vui_parameters_present_flag
- // mvc_vui_parameters_extension
- for (unsigned int i = 0; i <= gb.UExpGolombRead(); i++) { // vui_mvc_num_ops_minus1
- gb.BitRead(3);
- for (unsigned int j = 0; j <= gb.UExpGolombRead(); j++) { // vui_mvc_num_target_output_views_minus1
- gb.UExpGolombRead(); // vui_mvc_view_id
- }
- if (gb.BitRead(1)) { // vui_mvc_timing_info_present_flag
- gb.BitRead(32); // vui_mvc_num_units_in_tick
- gb.BitRead(32); // vui_mvc_time_scale
- gb.BitRead(1); // vui_mvc_fixed_frame_rate_flag
- }
- bool nalflag = gb.BitRead(1); // vui_mvc_nal_hrd_parameters_present_flag
- if (nalflag) {
- HrdParameters(gb);
- }
- bool vclflag = gb.BitRead(1); // vui_mvc_vcl_hrd_parameters_present_flag
- if (vclflag) {
- HrdParameters(gb);
- }
- if (nalflag || vclflag) {
- gb.BitRead(1); // vui_mvc_low_delay_hrd_flag
- }
- gb.BitRead(1); // vui_mvc_pic_struct_present_flag
- }
- }
- */
- }
- }
-
- unsigned int mb_Width = (unsigned int)pic_width_in_mbs_minus1 + 1;
- unsigned int mb_Height = ((unsigned int)pic_height_in_map_units_minus1 + 1) * (2 - frame_mbs_only_flag);
- BYTE CHROMA444 = (chroma_format_idc == 3);
-
- h.width = 16 * mb_Width - (2u>>CHROMA444) * min(h.crop_right, (8u<<CHROMA444)-1);
- if (frame_mbs_only_flag) {
- h.height = 16 * mb_Height - (2u>>CHROMA444) * min(h.crop_bottom, (8u<<CHROMA444)-1);
- } else {
- h.height = 16 * mb_Height - (4u>>CHROMA444) * min(h.crop_bottom, (8u<<CHROMA444)-1);
- }
-
- if (h.height<100 || h.width<100) {
- return false;
- }
-
- if (h.height == 1088) {
- h.height = 1080; // Prevent blur lines
- }
-
- return true;
+ static BYTE profiles[] = {44, 66, 77, 88, 100, 110, 118, 122, 128, 144, 244};
+ static BYTE levels[] = {10, 11, 12, 13, 20, 21, 22, 30, 31, 32, 40, 41, 42, 50, 51};
+
+ // Only care about SPS and subset SPS
+ if (index != index_sps && index != index_subsetsps) {
+ return true;
+ }
+
+ // Manage escape codes
+ BYTE buffer[MAX_SPSPPS];
+ RemoveMpegEscapeCode(buffer, h.spspps[index].buffer, MAX_SPSPPS);
+ CGolombBuffer gb(buffer, MAX_SPSPPS);
+
+ gb.BitRead(8); // nal_unit_type
+ h.profile = (BYTE)gb.BitRead(8);
+ bool b_ident = false;
+ for (int i = 0; i < sizeof(profiles); i++) {
+ if (h.profile == profiles[i]) {
+ b_ident = true;
+ break;
+ }
+ }
+ if (!b_ident) {
+ return false;
+ }
+
+ gb.BitRead(8);
+ h.level = (BYTE)gb.BitRead(8);
+ b_ident = false;
+ for (int i = 0; i < sizeof(levels); i++) {
+ if (h.level == levels[i]) {
+ b_ident = true;
+ break;
+ }
+ }
+ if (!b_ident) {
+ return false;
+ }
+
+ UINT64 sps_id = gb.UExpGolombRead(); // seq_parameter_set_id
+ if (sps_id >= 32) {
+ return false;
+ }
+
+ UINT64 chroma_format_idc = 0;
+ if (h.profile >= 100) { // high profile
+ chroma_format_idc = gb.UExpGolombRead();
+ if (chroma_format_idc == 3) { // chroma_format_idc
+ gb.BitRead(1); // residue_transform_flag
+ }
+
+ gb.UExpGolombRead(); // bit_depth_luma_minus8
+ gb.UExpGolombRead(); // bit_depth_chroma_minus8
+
+ gb.BitRead(1); // qpprime_y_zero_transform_bypass_flag
+
+ if (gb.BitRead(1)) { // seq_scaling_matrix_present_flag
+ for (int i = 0; i < 8; i++) {
+ if (gb.BitRead(1)) { // seq_scaling_list_present_flag
+ for (int j = 0, size = i < 6 ? 16 : 64, next = 8; j < size && next != 0; ++j) {
+ next = (next + gb.SExpGolombRead() + 256) & 255;
+ }
+ }
+ }
+ }
+ }
+
+ gb.UExpGolombRead(); // log2_max_frame_num_minus4
+
+ UINT64 pic_order_cnt_type = gb.UExpGolombRead();
+
+ if (pic_order_cnt_type == 0) {
+ gb.UExpGolombRead(); // log2_max_pic_order_cnt_lsb_minus4
+ } else if (pic_order_cnt_type == 1) {
+ gb.BitRead(1); // delta_pic_order_always_zero_flag
+ gb.SExpGolombRead(); // offset_for_non_ref_pic
+ gb.SExpGolombRead(); // offset_for_top_to_bottom_field
+ UINT64 num_ref_frames_in_pic_order_cnt_cycle = gb.UExpGolombRead();
+ if (num_ref_frames_in_pic_order_cnt_cycle >= 256) {
+ return false;
+ }
+ for (int i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {
+ gb.SExpGolombRead(); // offset_for_ref_frame[i]
+ }
+ } else if (pic_order_cnt_type != 2) {
+ return false;
+ }
+
+ UINT64 ref_frame_count = gb.UExpGolombRead(); // num_ref_frames
+ if (ref_frame_count > 30) {
+ return false;
+ }
+ gb.BitRead(1); // gaps_in_frame_num_value_allowed_flag
+
+ UINT64 pic_width_in_mbs_minus1 = gb.UExpGolombRead();
+ UINT64 pic_height_in_map_units_minus1 = gb.UExpGolombRead();
+ BYTE frame_mbs_only_flag = (BYTE)gb.BitRead(1);
+
+ if (!frame_mbs_only_flag) {
+ gb.BitRead(1); // mb_adaptive_frame_field_flag
+ }
+
+ BYTE direct_8x8_inference_flag = (BYTE)gb.BitRead(1); // direct_8x8_inference_flag
+ if (!frame_mbs_only_flag && !direct_8x8_inference_flag) {
+ return false;
+ }
+
+ if (gb.BitRead(1)) { // frame_cropping_flag
+ h.crop_left = (unsigned int)gb.UExpGolombRead(); // frame_cropping_rect_left_offset
+ h.crop_right = (unsigned int)gb.UExpGolombRead(); // frame_cropping_rect_right_offset
+ h.crop_top = (unsigned int)gb.UExpGolombRead(); // frame_cropping_rect_top_offset
+ h.crop_bottom = (unsigned int)gb.UExpGolombRead(); // frame_cropping_rect_bottom_offset
+ }
+
+ if (gb.BitRead(1)) { // vui_parameters_present_flag
+ if (gb.BitRead(1)) { // aspect_ratio_info_present_flag
+ BYTE aspect_ratio_idc = (BYTE)gb.BitRead(8); // aspect_ratio_idc
+ if (255 == aspect_ratio_idc) {
+ h.sar.num = (WORD)gb.BitRead(16); // sar_width
+ h.sar.den = (WORD)gb.BitRead(16); // sar_height
+ } else if (aspect_ratio_idc < 17) {
+ h.sar.num = pixel_aspect[aspect_ratio_idc][0];
+ h.sar.den = pixel_aspect[aspect_ratio_idc][1];
+ } else {
+ return false;
+ }
+ } else {
+ h.sar.num = 1;
+ h.sar.den = 1;
+ }
+
+ if (gb.BitRead(1)) { // overscan_info_present_flag
+ gb.BitRead(1); // overscan_appropriate_flag
+ }
+
+ if (gb.BitRead(1)) { // video_signal_type_present_flag
+ gb.BitRead(3); // video_format
+ gb.BitRead(1); // video_full_range_flag
+ if (gb.BitRead(1)) { // colour_description_present_flag
+ gb.BitRead(8); // colour_primaries
+ gb.BitRead(8); // transfer_characteristics
+ gb.BitRead(8); // matrix_coefficients
+ }
+ }
+ if (gb.BitRead(1)) { // chroma_location_info_present_flag
+ gb.UExpGolombRead(); // chroma_sample_loc_type_top_field
+ gb.UExpGolombRead(); // chroma_sample_loc_type_bottom_field
+ }
+ if (gb.BitRead(1)) { // timing_info_present_flag
+ __int64 num_units_in_tick = gb.BitRead(32);
+ __int64 time_scale = gb.BitRead(32);
+ /*long fixed_frame_rate_flag = */gb.BitRead(1);
+
+ // Trick for weird parameters
+ if ((num_units_in_tick < 1000) || (num_units_in_tick > 1001)) {
+ if ((time_scale % num_units_in_tick != 0) && ((time_scale * 1001) % num_units_in_tick == 0)) {
+ time_scale = (time_scale * 1001) / num_units_in_tick;
+ num_units_in_tick = 1001;
+ } else {
+ time_scale = (time_scale * 1000) / num_units_in_tick;
+ num_units_in_tick = 1000;
+ }
+ }
+ time_scale = time_scale / 2; // VUI consider fields even for progressive stream : divide by 2!
+
+ if (time_scale) {
+ h.AvgTimePerFrame = (10000000I64 * num_units_in_tick) / time_scale;
+ }
+ }
+
+ bool nalflag = !!gb.BitRead(1); // nal_hrd_parameters_present_flag
+ if (nalflag) {
+ if (HrdParameters(gb) < 0) {
+ return false;
+ }
+ }
+ bool vlcflag = !!gb.BitRead(1); // vlc_hrd_parameters_present_flag
+ if (vlcflag) {
+ if (HrdParameters(gb) < 0) {
+ return false;
+ }
+ }
+ if (nalflag || vlcflag) {
+ gb.BitRead(1); // low_delay_hrd_flag
+ }
+
+ gb.BitRead(1); // pic_struct_present_flag
+ if (gb.BitRead(1)) { // bitstream_restriction_flag
+ gb.BitRead(1); // motion_vectors_over_pic_boundaries_flag
+ gb.UExpGolombRead(); // max_bytes_per_pic_denom
+ gb.UExpGolombRead(); // max_bits_per_mb_denom
+ gb.UExpGolombRead(); // log2_max_mv_length_horizontal
+ gb.UExpGolombRead(); // log2_max_mv_length_vertical
+ UINT64 num_reorder_frames = gb.UExpGolombRead(); // num_reorder_frames
+ gb.UExpGolombRead(); // max_dec_frame_buffering
+
+ if (gb.GetSize() < gb.GetPos()) {
+ num_reorder_frames = 0;
+ }
+ if (num_reorder_frames > 16U) {
+ return false;
+ }
+ }
+ }
+
+ if (index == index_subsetsps) {
+ if (h.profile == 83 || h.profile == 86) {
+ // TODO: SVC extensions
+ return false;
+ } else if (h.profile == 118 || h.profile == 128) {
+ gb.BitRead(1); // bit_equal_to_one
+
+ // seq_parameter_set_mvc_extension
+ h.views = (unsigned int) gb.UExpGolombRead() + 1;
+
+ /*
+ for (unsigned int i = 0; i < h.views; i++) {
+ gb.UExpGolombRead(); // view_id
+ }
+
+ for (unsigned int i = 1; i < h.views; i++) {
+ for (int j = 0; j < gb.UExpGolombRead(); j++) { // num_anchor_refs_l0
+ gb.UExpGolombRead(); // anchor_refs_l0
+ }
+ for (int j = 0; j < gb.UExpGolombRead(); j++) { // num_anchor_refs_l1
+ gb.UExpGolombRead(); // anchor_refs_l1
+ }
+ }
+
+ for (unsigned int i = 1; i < h.views; i++) {
+ for (int j = 0; j < gb.UExpGolombRead(); j++) { // num_non_anchor_refs_l0
+ gb.UExpGolombRead(); // non_anchor_refs_l0
+ }
+ for (int j = 0; j < gb.UExpGolombRead(); j++) { // num_non_anchor_refs_l1
+ gb.UExpGolombRead(); // non_anchor_refs_l1
+ }
+ }
+
+ for (unsigned int i = 0; i <= gb.UExpGolombRead(); i++) { // num_level_values_signalled_minus1
+ gb.BitRead(8); // level_idc
+ for (int j = 0; j <= gb.UExpGolombRead(); j++) { // num_applicable_ops_minus1
+ gb.BitRead(3); // applicable_op_temporal_id
+ for (int k = 0; k <= gb.UExpGolombRead(); k++) { // applicable_op_num_target_views_minus1
+ gb.UExpGolombRead(); // applicable_op_traget_view_id
+ }
+ gb.UExpGolombRead(); // applicable_op_num_views_minus1
+ }
+ }
+
+ if (gb.BitRead(1)) { // mvc_vui_parameters_present_flag
+ // mvc_vui_parameters_extension
+ for (unsigned int i = 0; i <= gb.UExpGolombRead(); i++) { // vui_mvc_num_ops_minus1
+ gb.BitRead(3);
+ for (unsigned int j = 0; j <= gb.UExpGolombRead(); j++) { // vui_mvc_num_target_output_views_minus1
+ gb.UExpGolombRead(); // vui_mvc_view_id
+ }
+ if (gb.BitRead(1)) { // vui_mvc_timing_info_present_flag
+ gb.BitRead(32); // vui_mvc_num_units_in_tick
+ gb.BitRead(32); // vui_mvc_time_scale
+ gb.BitRead(1); // vui_mvc_fixed_frame_rate_flag
+ }
+ bool nalflag = gb.BitRead(1); // vui_mvc_nal_hrd_parameters_present_flag
+ if (nalflag) {
+ HrdParameters(gb);
+ }
+ bool vclflag = gb.BitRead(1); // vui_mvc_vcl_hrd_parameters_present_flag
+ if (vclflag) {
+ HrdParameters(gb);
+ }
+ if (nalflag || vclflag) {
+ gb.BitRead(1); // vui_mvc_low_delay_hrd_flag
+ }
+ gb.BitRead(1); // vui_mvc_pic_struct_present_flag
+ }
+ }
+ */
+ }
+ }
+
+ unsigned int mb_Width = (unsigned int)pic_width_in_mbs_minus1 + 1;
+ unsigned int mb_Height = ((unsigned int)pic_height_in_map_units_minus1 + 1) * (2 - frame_mbs_only_flag);
+ BYTE CHROMA444 = (chroma_format_idc == 3);
+
+ h.width = 16 * mb_Width - (2u >> CHROMA444) * min(h.crop_right, (8u << CHROMA444) - 1);
+ if (frame_mbs_only_flag) {
+ h.height = 16 * mb_Height - (2u >> CHROMA444) * min(h.crop_bottom, (8u << CHROMA444) - 1);
+ } else {
+ h.height = 16 * mb_Height - (4u >> CHROMA444) * min(h.crop_bottom, (8u << CHROMA444) - 1);
+ }
+
+ if (h.height < 100 || h.width < 100) {
+ return false;
+ }
+
+ if (h.height == 1088) {
+ h.height = 1080; // Prevent blur lines
+ }
+
+ return true;
}
bool CBaseSplitterFileEx::Read(vc1hdr& h, int len, CMediaType* pmt, int guid_flag)
{
- memset(&h, 0, sizeof(h));
-
- __int64 endpos = GetPos() + len; // - sequence header length
- __int64 extrapos = 0, extralen = 0;
- int nFrameRateNum = 0, nFrameRateDen = 1;
-
- if (GetPos() < endpos+4 && BitRead(32, true) == 0x0000010F) {
- extrapos = GetPos();
-
- BitRead(32);
-
- h.profile = (BYTE)BitRead(2);
-
- // Check if advanced profile
- if (h.profile != 3) {
- return false;
- }
-
- h.level = (BYTE)BitRead(3);
- h.chromaformat = (BYTE)BitRead(2);
-
- // (fps-2)/4 (->30)
- h.frmrtq_postproc = (BYTE)BitRead(3); //common
- // (bitrate-32kbps)/64kbps
- h.bitrtq_postproc = (BYTE)BitRead(5); //common
- h.postprocflag = (BYTE)BitRead(1); //common
-
- h.width = ((unsigned int)BitRead(12) + 1) << 1;
- h.height = ((unsigned int)BitRead(12) + 1) << 1;
-
- h.broadcast = (BYTE)BitRead(1);
- h.interlace = (BYTE)BitRead(1);
- h.tfcntrflag = (BYTE)BitRead(1);
- h.finterpflag = (BYTE)BitRead(1);
- BitRead(1); // reserved
- h.psf = (BYTE)BitRead(1);
- if (BitRead(1)) {
- int ar = 0;
- BitRead(14);
- BitRead(14);
- if (BitRead(1)) {
- ar = (int)BitRead(4);
- }
- if (ar && ar < 14) {
- h.sar.num = pixel_aspect[ar][0];
- h.sar.den = pixel_aspect[ar][1];
- } else if (ar == 15) {
- h.sar.num = (BYTE)BitRead(8);
- h.sar.den = (BYTE)BitRead(8);
- }
-
- // Read framerate
- const int ff_vc1_fps_nr[5] = { 24, 25, 30, 50, 60 };
- const int ff_vc1_fps_dr[2] = { 1000, 1001 };
-
- if (BitRead(1)) {
- if (BitRead(1)) {
- nFrameRateNum = 32;
- nFrameRateDen = (int)BitRead(16) + 1;
- } else {
- int nr, dr;
- nr = (int)BitRead(8);
- dr = (int)BitRead(4);
- if (nr && nr < 8 && dr && dr < 3) {
- nFrameRateNum = ff_vc1_fps_dr[dr - 1];
- nFrameRateDen = ff_vc1_fps_nr[nr - 1] * 1000;
- }
- }
- }
-
- }
-
- Seek(extrapos+4);
- extralen = 0;
- int parse = 0; // really need a signed type? may be unsigned will be better
-
- while (GetPos() < endpos+4 && ((parse == 0x0000010E) || (parse & 0xFFFFFF00) != 0x00000100)) {
- parse = (parse<<8) | (int)BitRead(8);
- extralen++;
- }
- }
-
- if (!extrapos || !extralen) {
- return false;
- }
-
- if (!pmt) {
- return true;
- }
-
- {
- pmt->majortype = MEDIATYPE_Video;
- switch (guid_flag) {
- case 1: pmt->subtype = FOURCCMap('1CVW');
- break;
- case 2: pmt->subtype = MEDIASUBTYPE_WVC1_CYBERLINK;
- break;
- case 3: pmt->subtype = MEDIASUBTYPE_WVC1_ARCSOFT;
- break;
- }
- pmt->formattype = FORMAT_VIDEOINFO2;
- int vi_len = sizeof(VIDEOINFOHEADER2) + (int)extralen + 1;
- VIDEOINFOHEADER2* vi = (VIDEOINFOHEADER2*)DNew BYTE[vi_len];
- memset(vi, 0, vi_len);
- vi->AvgTimePerFrame = (10000000I64*nFrameRateNum)/nFrameRateDen;
-
- if (!h.sar.num) h.sar.num = 1;
- if (!h.sar.den) h.sar.den = 1;
- CSize aspect = CSize(h.width * h.sar.num, h.height * h.sar.den);
- if (h.width == h.sar.num && h.height == h.sar.den) {
- aspect = CSize(h.width, h.height);
- }
- int lnko = LNKO(aspect.cx, aspect.cy);
- if (lnko > 1) {
- aspect.cx /= lnko, aspect.cy /= lnko;
- }
-
- vi->dwPictAspectRatioX = aspect.cx;
- vi->dwPictAspectRatioY = aspect.cy;
- vi->bmiHeader.biSize = sizeof(vi->bmiHeader);
- vi->bmiHeader.biWidth = h.width;
- vi->bmiHeader.biHeight = h.height;
- vi->bmiHeader.biCompression = '1CVW';
- BYTE* p = (BYTE*)vi + sizeof(VIDEOINFOHEADER2);
- *p++ = 0;
- Seek(extrapos);
- ByteRead(p, extralen);
- pmt->SetFormat((BYTE*)vi, vi_len);
- delete [] vi;
- }
- return true;
+ memset(&h, 0, sizeof(h));
+
+ __int64 endpos = GetPos() + len; // - sequence header length
+ __int64 extrapos = 0, extralen = 0;
+ int nFrameRateNum = 0, nFrameRateDen = 1;
+
+ if (GetPos() < endpos + 4 && BitRead(32, true) == 0x0000010F) {
+ extrapos = GetPos();
+
+ BitRead(32);
+
+ h.profile = (BYTE)BitRead(2);
+
+ // Check if advanced profile
+ if (h.profile != 3) {
+ return false;
+ }
+
+ h.level = (BYTE)BitRead(3);
+ h.chromaformat = (BYTE)BitRead(2);
+
+ // (fps-2)/4 (->30)
+ h.frmrtq_postproc = (BYTE)BitRead(3); //common
+ // (bitrate-32kbps)/64kbps
+ h.bitrtq_postproc = (BYTE)BitRead(5); //common
+ h.postprocflag = (BYTE)BitRead(1); //common
+
+ h.width = ((unsigned int)BitRead(12) + 1) << 1;
+ h.height = ((unsigned int)BitRead(12) + 1) << 1;
+
+ h.broadcast = (BYTE)BitRead(1);
+ h.interlace = (BYTE)BitRead(1);
+ h.tfcntrflag = (BYTE)BitRead(1);
+ h.finterpflag = (BYTE)BitRead(1);
+ BitRead(1); // reserved
+ h.psf = (BYTE)BitRead(1);
+ if (BitRead(1)) {
+ int ar = 0;
+ BitRead(14);
+ BitRead(14);
+ if (BitRead(1)) {
+ ar = (int)BitRead(4);
+ }
+ if (ar && ar < 14) {
+ h.sar.num = pixel_aspect[ar][0];
+ h.sar.den = pixel_aspect[ar][1];
+ } else if (ar == 15) {
+ h.sar.num = (BYTE)BitRead(8);
+ h.sar.den = (BYTE)BitRead(8);
+ }
+
+ // Read framerate
+ const int ff_vc1_fps_nr[5] = { 24, 25, 30, 50, 60 };
+ const int ff_vc1_fps_dr[2] = { 1000, 1001 };
+
+ if (BitRead(1)) {
+ if (BitRead(1)) {
+ nFrameRateNum = 32;
+ nFrameRateDen = (int)BitRead(16) + 1;
+ } else {
+ int nr, dr;
+ nr = (int)BitRead(8);
+ dr = (int)BitRead(4);
+ if (nr && nr < 8 && dr && dr < 3) {
+ nFrameRateNum = ff_vc1_fps_dr[dr - 1];
+ nFrameRateDen = ff_vc1_fps_nr[nr - 1] * 1000;
+ }
+ }
+ }
+
+ }
+
+ Seek(extrapos + 4);
+ extralen = 0;
+ int parse = 0; // really need a signed type? may be unsigned will be better
+
+ while (GetPos() < endpos + 4 && ((parse == 0x0000010E) || (parse & 0xFFFFFF00) != 0x00000100)) {
+ parse = (parse << 8) | (int)BitRead(8);
+ extralen++;
+ }
+ }
+
+ if (!extrapos || !extralen) {
+ return false;
+ }
+
+ if (!pmt) {
+ return true;
+ }
+
+ {
+ pmt->majortype = MEDIATYPE_Video;
+ switch (guid_flag) {
+ case 1: pmt->subtype = FOURCCMap('1CVW');
+ break;
+ case 2: pmt->subtype = MEDIASUBTYPE_WVC1_CYBERLINK;
+ break;
+ case 3: pmt->subtype = MEDIASUBTYPE_WVC1_ARCSOFT;
+ break;
+ }
+ pmt->formattype = FORMAT_VIDEOINFO2;
+ int vi_len = sizeof(VIDEOINFOHEADER2) + (int)extralen + 1;
+ VIDEOINFOHEADER2* vi = (VIDEOINFOHEADER2*)DNew BYTE[vi_len];
+ memset(vi, 0, vi_len);
+ vi->AvgTimePerFrame = (10000000I64 * nFrameRateNum) / nFrameRateDen;
+
+ if (!h.sar.num) { h.sar.num = 1; }
+ if (!h.sar.den) { h.sar.den = 1; }
+ CSize aspect = CSize(h.width * h.sar.num, h.height * h.sar.den);
+ if (h.width == h.sar.num && h.height == h.sar.den) {
+ aspect = CSize(h.width, h.height);
+ }
+ int lnko = LNKO(aspect.cx, aspect.cy);
+ if (lnko > 1) {
+ aspect.cx /= lnko, aspect.cy /= lnko;
+ }
+
+ vi->dwPictAspectRatioX = aspect.cx;
+ vi->dwPictAspectRatioY = aspect.cy;
+ vi->bmiHeader.biSize = sizeof(vi->bmiHeader);
+ vi->bmiHeader.biWidth = h.width;
+ vi->bmiHeader.biHeight = h.height;
+ vi->bmiHeader.biCompression = '1CVW';
+ BYTE* p = (BYTE*)vi + sizeof(VIDEOINFOHEADER2);
+ *p++ = 0;
+ Seek(extrapos);
+ ByteRead(p, extralen);
+ pmt->SetFormat((BYTE*)vi, vi_len);
+ delete [] vi;
+ }
+ return true;
}
bool CBaseSplitterFileEx::Read(dvbsub& h, int len, CMediaType* pmt)
{
- memset(&h, 0, sizeof(h));
+ memset(&h, 0, sizeof(h));
- if ((BitRead(32, true) & 0xFFFFFF00) == 0x20000f00) {
- static const SUBTITLEINFO SubFormat = { 0, "", L"" };
+ if ((BitRead(32, true) & 0xFFFFFF00) == 0x20000f00) {
+ static const SUBTITLEINFO SubFormat = { 0, "", L"" };
- pmt->majortype = MEDIATYPE_Subtitle;
- pmt->subtype = MEDIASUBTYPE_DVB_SUBTITLES;
- pmt->formattype = FORMAT_None;
- pmt->SetFormat ((BYTE*)&SubFormat, sizeof(SUBTITLEINFO));
+ pmt->majortype = MEDIATYPE_Subtitle;
+ pmt->subtype = MEDIASUBTYPE_DVB_SUBTITLES;
+ pmt->formattype = FORMAT_None;
+ pmt->SetFormat((BYTE*)&SubFormat, sizeof(SUBTITLEINFO));
- return true;
- }
+ return true;
+ }
- return false;
+ return false;
}
/*
To see working buffer in debugger, look :
- - m_pCache.m_p for the cached buffer
- - m_pos for current read position
+ - m_pCache.m_p for the cached buffer
+ - m_pos for current read position
*/
diff --git a/src/filters/parser/BaseSplitter/BaseSplitterFileEx.h b/src/filters/parser/BaseSplitter/BaseSplitterFileEx.h
index a42d54b8c..285a9a008 100644
--- a/src/filters/parser/BaseSplitter/BaseSplitterFileEx.h
+++ b/src/filters/parser/BaseSplitter/BaseSplitterFileEx.h
@@ -26,434 +26,412 @@
#include "BaseSplitterFile.h"
#include "../../../DSUtil/Mpeg2Def.h"
-#define MAX_SPSPPS 256 // Max size for a SPS/PPS packet
+#define MAX_SPSPPS 256 // Max size for a SPS/PPS packet
class CGolombBuffer;
-static const byte pixel_aspect[17][2]= {
- {0, 1},
- {1, 1},
- {12, 11},
- {10, 11},
- {16, 11},
- {40, 33},
- {24, 11},
- {20, 11},
- {32, 11},
- {80, 33},
- {18, 11},
- {15, 11},
- {64, 33},
- {160,99},
- {4, 3},
- {3, 2},
- {2, 1},
+static const byte pixel_aspect[17][2] = {
+ {0, 1},
+ {1, 1},
+ {12, 11},
+ {10, 11},
+ {16, 11},
+ {40, 33},
+ {24, 11},
+ {20, 11},
+ {32, 11},
+ {80, 33},
+ {18, 11},
+ {15, 11},
+ {64, 33},
+ {160, 99},
+ {4, 3},
+ {3, 2},
+ {2, 1},
};
class CBaseSplitterFileEx : public CBaseSplitterFile
{
- int m_tslen; // transport stream packet length (188 or 192 bytes, auto-detected)
+ int m_tslen; // transport stream packet length (188 or 192 bytes, auto-detected)
protected :
- REFERENCE_TIME m_rtPTSOffset;
+ REFERENCE_TIME m_rtPTSOffset;
public:
- CBaseSplitterFileEx(IAsyncReader* pReader, HRESULT& hr, int cachelen = DEFAULT_CACHE_LENGTH, bool fRandomAccess = true, bool fStreaming = false);
- virtual ~CBaseSplitterFileEx();
+ CBaseSplitterFileEx(IAsyncReader* pReader, HRESULT& hr, int cachelen = DEFAULT_CACHE_LENGTH, bool fRandomAccess = true, bool fStreaming = false);
+ virtual ~CBaseSplitterFileEx();
- // using CBaseSplitterFile::Read;
+ // using CBaseSplitterFile::Read;
- bool NextMpegStartCode(BYTE& b, __int64 len = 65536);
+ bool NextMpegStartCode(BYTE& b, __int64 len = 65536);
#pragma pack(push, 1)
- enum mpeg_t {mpegunk, mpeg1, mpeg2};
-
- struct pshdr {
- mpeg_t type;
- UINT64 scr, bitrate;
- };
-
- struct pssyshdr {
- DWORD rate_bound;
- BYTE video_bound, audio_bound;
- bool fixed_rate, csps;
- bool sys_video_loc_flag, sys_audio_loc_flag;
- };
-
- struct peshdr {
- WORD len;
-
- BYTE type:2, fpts:1, fdts:1;
- REFERENCE_TIME pts, dts;
-
- // mpeg1 stuff
- UINT64 std_buff_size;
-
- // mpeg2 stuff
- BYTE scrambling:2, priority:1, alignment:1, copyright:1, original:1;
- BYTE escr:1, esrate:1, dsmtrickmode:1, morecopyright:1, crc:1, extension:1;
- BYTE hdrlen;
-
- BYTE id_ext;
-
- struct peshdr() {
- memset(this, 0, sizeof(*this));
- }
- };
-
- struct seqhdr {
- WORD width;
- WORD height;
- BYTE ar:4;
- DWORD ifps;
- DWORD bitrate;
- DWORD vbv;
- BYTE constrained:1;
- BYTE fiqm:1;
- BYTE iqm[64];
- BYTE fniqm:1;
- BYTE niqm[64];
- // ext
- BYTE startcodeid:4;
- BYTE profile_levelescape:1;
- BYTE profile:3;
- BYTE level:4;
- BYTE progressive:1;
- BYTE chroma:2;
- BYTE lowdelay:1;
- // misc
- int arx, ary;
- };
-
- struct mpahdr
- {
- WORD sync:11;
- WORD version:2;
- WORD layer:2;
- WORD crc:1;
- WORD bitrate:4;
- WORD freq:2;
- WORD padding:1;
- WORD privatebit:1;
- WORD channels:2;
- WORD modeext:2;
- WORD copyright:1;
- WORD original:1;
- WORD emphasis:2;
-
- int nSamplesPerSec, FrameSize, nBytesPerSec;
- REFERENCE_TIME rtDuration;
- };
-
- struct aachdr
- {
- WORD sync:12;
- WORD version:1;
- WORD layer:2;
- WORD fcrc:1;
- WORD profile:2;
- WORD freq:4;
- WORD privatebit:1;
- WORD channels:3;
- WORD original:1;
- WORD home:1; // ?
-
- WORD copyright_id_bit:1;
- WORD copyright_id_start:1;
- WORD aac_frame_length:13;
- WORD adts_buffer_fullness:11;
- WORD no_raw_data_blocks_in_frame:2;
-
- WORD crc;
-
- int FrameSize, nBytesPerSec;
- REFERENCE_TIME rtDuration;
- };
-
- struct latm_aachdr
- {
- // nothing ;)
- };
-
- struct ac3hdr
- {
- WORD sync;
- WORD crc1;
- BYTE fscod:2;
- BYTE frmsizecod:6;
- BYTE bsid:5;
- BYTE bsmod:3;
- BYTE acmod:3;
- BYTE cmixlev:2;
- BYTE surmixlev:2;
- BYTE dsurmod:2;
- BYTE lfeon:1;
- BYTE sr_shift;
- // E-AC3 header
- BYTE frame_type;
- BYTE substreamid;
- WORD frame_size;
- BYTE sr_code;
- WORD sample_rate;
- BYTE num_blocks;
- // the rest is unimportant for us
- };
-
- struct dtshdr
- {
- DWORD sync;
- BYTE frametype:1;
- BYTE deficitsamplecount:5;
- BYTE fcrc:1;
- BYTE nblocks:7;
- WORD framebytes;
- BYTE amode:6;
- BYTE sfreq:4;
- BYTE rate:5;
-
- BYTE downmix:1;
- BYTE dynrange:1;
- BYTE timestamp:1;
- BYTE aux_data:1;
- BYTE hdcd:1;
- BYTE ext_descr:3;
- BYTE ext_coding:1;
- BYTE aspf:1;
- BYTE lfe:2;
- BYTE predictor_history:1;
- };
-
- struct lpcmhdr
- {
- BYTE emphasis:1;
- BYTE mute:1;
- BYTE reserved1:1;
- BYTE framenum:5;
- BYTE quantwordlen:2;
- BYTE freq:2; // 48, 96, 44.1, 32
- BYTE reserved2:1;
- BYTE channels:3; // +1
- BYTE drc; // 0x80: off
- };
-
- struct dvdalpcmhdr
- {
- // http://dvd-audio.sourceforge.net/spec/aob.shtml
- WORD firstaudioframe;
- BYTE unknown1;
- BYTE bitpersample1:4;
- BYTE bitpersample2:4;
- BYTE samplerate1:4;
- BYTE samplerate2:4;
- BYTE unknown2;
- BYTE groupassignment;
- BYTE unknown3;
- };
-
- struct hdmvlpcmhdr
- {
- WORD size;
- BYTE channels:4;
- BYTE samplerate:4;
- BYTE bitpersample:2;
- };
-
- struct mlphdr
- {
- DWORD size;
- //DWORD samplerate;
- //WORD bitdepth;
- //WORD channels;
- };
-
- struct dvdspuhdr
- {
- // nothing ;)
- };
-
- struct hdmvsubhdr
- {
- // nothing ;)
- };
-
- struct svcdspuhdr
- {
- // nothing ;)
- };
-
- struct cvdspuhdr
- {
- // nothing ;)
- };
-
- struct ps2audhdr
- {
- // 'SShd' + len (0x18)
- DWORD unk1;
- DWORD freq;
- DWORD channels;
- DWORD interleave; // bytes per channel
- // padding: FF .. FF
- // 'SSbd' + len
- // pcm or adpcm data
- };
-
- struct ps2subhdr
- {
- // nothing ;)
- };
-
- struct trhdr
- {
- BYTE sync; // 0x47
- BYTE error:1;
- BYTE payloadstart:1;
- BYTE transportpriority:1;
- WORD pid:13;
- BYTE scrambling:2;
- BYTE adapfield:1;
- BYTE payload:1;
- BYTE counter:4;
- // if adapfield set
- BYTE length;
- BYTE discontinuity:1;
- BYTE randomaccess:1;
- BYTE priority:1;
- BYTE fPCR:1;
- BYTE OPCR:1;
- BYTE splicingpoint:1;
- BYTE privatedata:1;
- BYTE extension:1;
- // TODO: add more fields here when the flags above are set (they aren't very interesting...)
- __int64 PCR;
-
- int bytes;
- __int64 next;
- };
-
- struct trsechdr
- {
- BYTE table_id;
- WORD section_syntax_indicator:1;
- WORD zero:1;
- WORD reserved1:2;
- WORD section_length:12;
- WORD transport_stream_id;
- BYTE reserved2:2;
- BYTE version_number:5;
- BYTE current_next_indicator:1;
- BYTE section_number;
- BYTE last_section_number;
- };
-
- // http://multimedia.cx/mirror/av_format_v1.pdf
- struct pvahdr
- {
- WORD sync; // 'VA'
- BYTE streamid; // 1 - video, 2 - audio
- BYTE counter;
- BYTE res1; // 0x55
- BYTE res2:3;
- BYTE fpts:1;
- BYTE postbytes:2;
- BYTE prebytes:2;
- WORD length;
- REFERENCE_TIME pts;
- };
-
- enum spsppsindex {
- index_unknown = -1,
- index_subsetsps = 0,
- index_sps = 1,
- index_pps1 = 2,
- index_pps2 = 3,
- };
-
- struct spsppsdata
- {
- BYTE buffer[MAX_SPSPPS];
- unsigned int size;
- bool complete;
- };
-
- struct avchdr
- {
- BYTE profile, level;
- unsigned int width, height;
- unsigned int views;
- unsigned int crop_left, crop_right, crop_top, crop_bottom;
- __int64 AvgTimePerFrame;
-
- struct sar {
- WORD num;
- WORD den;
- } sar;
-
- spsppsdata spspps[4];
- BYTE lastid;
-
- avchdr() {
- memset(spspps, 0, sizeof(spspps));
- lastid = 0;
- views = 1;
- AvgTimePerFrame = 0;
- }
- };
-
- struct vc1hdr
- {
- BYTE profile;
- BYTE level;
- BYTE chromaformat;
- BYTE frmrtq_postproc;
- BYTE bitrtq_postproc;
- BYTE postprocflag;
- BYTE broadcast;
- BYTE interlace;
- BYTE tfcntrflag;
- BYTE finterpflag;
- BYTE psf;
- unsigned int width, height;
- struct sar {
- BYTE num;
- BYTE den;
- } sar;
- };
-
- struct dvbsub
- {
- // nothing ;)
- };
+ enum mpeg_t {mpegunk, mpeg1, mpeg2};
+
+ struct pshdr {
+ mpeg_t type;
+ UINT64 scr, bitrate;
+ };
+
+ struct pssyshdr {
+ DWORD rate_bound;
+ BYTE video_bound, audio_bound;
+ bool fixed_rate, csps;
+ bool sys_video_loc_flag, sys_audio_loc_flag;
+ };
+
+ struct peshdr {
+ WORD len;
+
+ BYTE type: 2, fpts: 1, fdts: 1;
+ REFERENCE_TIME pts, dts;
+
+ // mpeg1 stuff
+ UINT64 std_buff_size;
+
+ // mpeg2 stuff
+ BYTE scrambling: 2, priority: 1, alignment: 1, copyright: 1, original: 1;
+ BYTE escr: 1, esrate: 1, dsmtrickmode: 1, morecopyright: 1, crc: 1, extension: 1;
+ BYTE hdrlen;
+
+ BYTE id_ext;
+
+ struct peshdr() {
+ memset(this, 0, sizeof(*this));
+ }
+ };
+
+ struct seqhdr {
+ WORD width;
+ WORD height;
+ BYTE ar: 4;
+ DWORD ifps;
+ DWORD bitrate;
+ DWORD vbv;
+ BYTE constrained: 1;
+ BYTE fiqm: 1;
+ BYTE iqm[64];
+ BYTE fniqm: 1;
+ BYTE niqm[64];
+ // ext
+ BYTE startcodeid: 4;
+ BYTE profile_levelescape: 1;
+ BYTE profile: 3;
+ BYTE level: 4;
+ BYTE progressive: 1;
+ BYTE chroma: 2;
+ BYTE lowdelay: 1;
+ // misc
+ int arx, ary;
+ };
+
+ struct mpahdr {
+ WORD sync: 11;
+ WORD version: 2;
+ WORD layer: 2;
+ WORD crc: 1;
+ WORD bitrate: 4;
+ WORD freq: 2;
+ WORD padding: 1;
+ WORD privatebit: 1;
+ WORD channels: 2;
+ WORD modeext: 2;
+ WORD copyright: 1;
+ WORD original: 1;
+ WORD emphasis: 2;
+
+ int nSamplesPerSec, FrameSize, nBytesPerSec;
+ REFERENCE_TIME rtDuration;
+ };
+
+ struct aachdr {
+ WORD sync: 12;
+ WORD version: 1;
+ WORD layer: 2;
+ WORD fcrc: 1;
+ WORD profile: 2;
+ WORD freq: 4;
+ WORD privatebit: 1;
+ WORD channels: 3;
+ WORD original: 1;
+ WORD home: 1; // ?
+
+ WORD copyright_id_bit: 1;
+ WORD copyright_id_start: 1;
+ WORD aac_frame_length: 13;
+ WORD adts_buffer_fullness: 11;
+ WORD no_raw_data_blocks_in_frame: 2;
+
+ WORD crc;
+
+ int FrameSize, nBytesPerSec;
+ REFERENCE_TIME rtDuration;
+ };
+
+ struct latm_aachdr {
+ // nothing ;)
+ };
+
+ struct ac3hdr {
+ WORD sync;
+ WORD crc1;
+ BYTE fscod: 2;
+ BYTE frmsizecod: 6;
+ BYTE bsid: 5;
+ BYTE bsmod: 3;
+ BYTE acmod: 3;
+ BYTE cmixlev: 2;
+ BYTE surmixlev: 2;
+ BYTE dsurmod: 2;
+ BYTE lfeon: 1;
+ BYTE sr_shift;
+ // E-AC3 header
+ BYTE frame_type;
+ BYTE substreamid;
+ WORD frame_size;
+ BYTE sr_code;
+ WORD sample_rate;
+ BYTE num_blocks;
+ // the rest is unimportant for us
+ };
+
+ struct dtshdr {
+ DWORD sync;
+ BYTE frametype: 1;
+ BYTE deficitsamplecount: 5;
+ BYTE fcrc: 1;
+ BYTE nblocks: 7;
+ WORD framebytes;
+ BYTE amode: 6;
+ BYTE sfreq: 4;
+ BYTE rate: 5;
+
+ BYTE downmix: 1;
+ BYTE dynrange: 1;
+ BYTE timestamp: 1;
+ BYTE aux_data: 1;
+ BYTE hdcd: 1;
+ BYTE ext_descr: 3;
+ BYTE ext_coding: 1;
+ BYTE aspf: 1;
+ BYTE lfe: 2;
+ BYTE predictor_history: 1;
+ };
+
+ struct lpcmhdr {
+ BYTE emphasis: 1;
+ BYTE mute: 1;
+ BYTE reserved1: 1;
+ BYTE framenum: 5;
+ BYTE quantwordlen: 2;
+ BYTE freq: 2; // 48, 96, 44.1, 32
+ BYTE reserved2: 1;
+ BYTE channels: 3; // +1
+ BYTE drc; // 0x80: off
+ };
+
+ struct dvdalpcmhdr {
+ // http://dvd-audio.sourceforge.net/spec/aob.shtml
+ WORD firstaudioframe;
+ BYTE unknown1;
+ BYTE bitpersample1: 4;
+ BYTE bitpersample2: 4;
+ BYTE samplerate1: 4;
+ BYTE samplerate2: 4;
+ BYTE unknown2;
+ BYTE groupassignment;
+ BYTE unknown3;
+ };
+
+ struct hdmvlpcmhdr {
+ WORD size;
+ BYTE channels: 4;
+ BYTE samplerate: 4;
+ BYTE bitpersample: 2;
+ };
+
+ struct mlphdr {
+ DWORD size;
+ //DWORD samplerate;
+ //WORD bitdepth;
+ //WORD channels;
+ };
+
+ struct dvdspuhdr {
+ // nothing ;)
+ };
+
+ struct hdmvsubhdr {
+ // nothing ;)
+ };
+
+ struct svcdspuhdr {
+ // nothing ;)
+ };
+
+ struct cvdspuhdr {
+ // nothing ;)
+ };
+
+ struct ps2audhdr {
+ // 'SShd' + len (0x18)
+ DWORD unk1;
+ DWORD freq;
+ DWORD channels;
+ DWORD interleave; // bytes per channel
+ // padding: FF .. FF
+ // 'SSbd' + len
+ // pcm or adpcm data
+ };
+
+ struct ps2subhdr {
+ // nothing ;)
+ };
+
+ struct trhdr {
+ BYTE sync; // 0x47
+ BYTE error: 1;
+ BYTE payloadstart: 1;
+ BYTE transportpriority: 1;
+ WORD pid: 13;
+ BYTE scrambling: 2;
+ BYTE adapfield: 1;
+ BYTE payload: 1;
+ BYTE counter: 4;
+ // if adapfield set
+ BYTE length;
+ BYTE discontinuity: 1;
+ BYTE randomaccess: 1;
+ BYTE priority: 1;
+ BYTE fPCR: 1;
+ BYTE OPCR: 1;
+ BYTE splicingpoint: 1;
+ BYTE privatedata: 1;
+ BYTE extension: 1;
+ // TODO: add more fields here when the flags above are set (they aren't very interesting...)
+ __int64 PCR;
+
+ int bytes;
+ __int64 next;
+ };
+
+ struct trsechdr {
+ BYTE table_id;
+ WORD section_syntax_indicator: 1;
+ WORD zero: 1;
+ WORD reserved1: 2;
+ WORD section_length: 12;
+ WORD transport_stream_id;
+ BYTE reserved2: 2;
+ BYTE version_number: 5;
+ BYTE current_next_indicator: 1;
+ BYTE section_number;
+ BYTE last_section_number;
+ };
+
+ // http://multimedia.cx/mirror/av_format_v1.pdf
+ struct pvahdr {
+ WORD sync; // 'VA'
+ BYTE streamid; // 1 - video, 2 - audio
+ BYTE counter;
+ BYTE res1; // 0x55
+ BYTE res2: 3;
+ BYTE fpts: 1;
+ BYTE postbytes: 2;
+ BYTE prebytes: 2;
+ WORD length;
+ REFERENCE_TIME pts;
+ };
+
+ enum spsppsindex {
+ index_unknown = -1,
+ index_subsetsps = 0,
+ index_sps = 1,
+ index_pps1 = 2,
+ index_pps2 = 3,
+ };
+
+ struct spsppsdata {
+ BYTE buffer[MAX_SPSPPS];
+ unsigned int size;
+ bool complete;
+ };
+
+ struct avchdr {
+ BYTE profile, level;
+ unsigned int width, height;
+ unsigned int views;
+ unsigned int crop_left, crop_right, crop_top, crop_bottom;
+ __int64 AvgTimePerFrame;
+
+ struct sar {
+ WORD num;
+ WORD den;
+ } sar;
+
+ spsppsdata spspps[4];
+ BYTE lastid;
+
+ avchdr() {
+ memset(spspps, 0, sizeof(spspps));
+ lastid = 0;
+ views = 1;
+ AvgTimePerFrame = 0;
+ }
+ };
+
+ struct vc1hdr {
+ BYTE profile;
+ BYTE level;
+ BYTE chromaformat;
+ BYTE frmrtq_postproc;
+ BYTE bitrtq_postproc;
+ BYTE postprocflag;
+ BYTE broadcast;
+ BYTE interlace;
+ BYTE tfcntrflag;
+ BYTE finterpflag;
+ BYTE psf;
+ unsigned int width, height;
+ struct sar {
+ BYTE num;
+ BYTE den;
+ } sar;
+ };
+
+ struct dvbsub {
+ // nothing ;)
+ };
#pragma pack(pop)
- bool Read(pshdr& h);
- bool Read(pssyshdr& h);
- bool Read(peshdr& h, BYTE code);
- bool Read(seqhdr& h, int len, CMediaType* pmt = NULL);
- bool Read(mpahdr& h, int len, bool fAllowV25, CMediaType* pmt = NULL);
- bool Read(aachdr& h, int len, CMediaType* pmt = NULL, MPEG_TYPES m_type = mpeg_es);
- bool Read(latm_aachdr& h, int len, CMediaType* pmt = NULL);
- bool Read(ac3hdr& h, int len, CMediaType* pmt = NULL, bool find_sync = true, bool AC3CoreOnly = true);
- bool Read(dtshdr& h, int len, CMediaType* pmt = NULL, bool find_sync = true);
- bool Read(lpcmhdr& h, CMediaType* pmt = NULL);
- bool Read(dvdalpcmhdr& h, int len, CMediaType* pmt = NULL);
- bool Read(hdmvlpcmhdr& h, CMediaType* pmt = NULL);
- bool Read(mlphdr& h, int len, CMediaType* pmt = NULL, bool find_sync = false);
- bool Read(dvdspuhdr& h, CMediaType* pmt = NULL);
- bool Read(hdmvsubhdr& h, CMediaType* pmt = NULL, const char* language_code = NULL);
- bool Read(svcdspuhdr& h, CMediaType* pmt = NULL);
- bool Read(cvdspuhdr& h, CMediaType* pmt = NULL);
- bool Read(ps2audhdr& h, CMediaType* pmt = NULL);
- bool Read(ps2subhdr& h, CMediaType* pmt = NULL);
- bool Read(trhdr& h, bool fSync = true);
- bool Read(trsechdr& h);
- bool Read(pvahdr& h, bool fSync = true);
- bool Read(avchdr& h, int len, CMediaType* pmt = NULL);
- bool Read(vc1hdr& h, int len, CMediaType* pmt = NULL, int guid_flag = 1);
- bool Read(dvbsub& h, int len, CMediaType* pmt = NULL);
- bool Read(avchdr& h, spsppsindex index);
-
- int HrdParameters(CGolombBuffer& gb);
- void RemoveMpegEscapeCode(BYTE* dst, BYTE* src, int length);
+ bool Read(pshdr& h);
+ bool Read(pssyshdr& h);
+ bool Read(peshdr& h, BYTE code);
+ bool Read(seqhdr& h, int len, CMediaType* pmt = NULL);
+ bool Read(mpahdr& h, int len, bool fAllowV25, CMediaType* pmt = NULL);
+ bool Read(aachdr& h, int len, CMediaType* pmt = NULL, MPEG_TYPES m_type = mpeg_es);
+ bool Read(latm_aachdr& h, int len, CMediaType* pmt = NULL);
+ bool Read(ac3hdr& h, int len, CMediaType* pmt = NULL, bool find_sync = true, bool AC3CoreOnly = true);
+ bool Read(dtshdr& h, int len, CMediaType* pmt = NULL, bool find_sync = true);
+ bool Read(lpcmhdr& h, CMediaType* pmt = NULL);
+ bool Read(dvdalpcmhdr& h, int len, CMediaType* pmt = NULL);
+ bool Read(hdmvlpcmhdr& h, CMediaType* pmt = NULL);
+ bool Read(mlphdr& h, int len, CMediaType* pmt = NULL, bool find_sync = false);
+ bool Read(dvdspuhdr& h, CMediaType* pmt = NULL);
+ bool Read(hdmvsubhdr& h, CMediaType* pmt = NULL, const char* language_code = NULL);
+ bool Read(svcdspuhdr& h, CMediaType* pmt = NULL);
+ bool Read(cvdspuhdr& h, CMediaType* pmt = NULL);
+ bool Read(ps2audhdr& h, CMediaType* pmt = NULL);
+ bool Read(ps2subhdr& h, CMediaType* pmt = NULL);
+ bool Read(trhdr& h, bool fSync = true);
+ bool Read(trsechdr& h);
+ bool Read(pvahdr& h, bool fSync = true);
+ bool Read(avchdr& h, int len, CMediaType* pmt = NULL);
+ bool Read(vc1hdr& h, int len, CMediaType* pmt = NULL, int guid_flag = 1);
+ bool Read(dvbsub& h, int len, CMediaType* pmt = NULL);
+ bool Read(avchdr& h, spsppsindex index);
+
+ int HrdParameters(CGolombBuffer& gb);
+ void RemoveMpegEscapeCode(BYTE* dst, BYTE* src, int length);
};
diff --git a/src/filters/parser/BaseSplitter/MultiFiles.cpp b/src/filters/parser/BaseSplitter/MultiFiles.cpp
index 65a5b946c..d8d308131 100644
--- a/src/filters/parser/BaseSplitter/MultiFiles.cpp
+++ b/src/filters/parser/BaseSplitter/MultiFiles.cpp
@@ -28,173 +28,173 @@
IMPLEMENT_DYNAMIC(CMultiFiles, CObject)
CMultiFiles::CMultiFiles()
- : m_hFile(INVALID_HANDLE_VALUE)
- , m_llTotalLength(0)
- , m_nCurPart(-1)
- , m_pCurrentPTSOffset(NULL)
+ : m_hFile(INVALID_HANDLE_VALUE)
+ , m_llTotalLength(0)
+ , m_nCurPart(-1)
+ , m_pCurrentPTSOffset(NULL)
{
}
void CMultiFiles::Reset()
{
- m_strFiles.RemoveAll();
- m_FilesSize.RemoveAll();
- m_rtPtsOffsets.RemoveAll();
- m_llTotalLength = 0;
+ m_strFiles.RemoveAll();
+ m_FilesSize.RemoveAll();
+ m_rtPtsOffsets.RemoveAll();
+ m_llTotalLength = 0;
}
BOOL CMultiFiles::Open(LPCTSTR lpszFileName, UINT nOpenFlags)
{
- Reset();
- m_strFiles.Add (lpszFileName);
+ Reset();
+ m_strFiles.Add(lpszFileName);
- return OpenPart(0);
+ return OpenPart(0);
}
BOOL CMultiFiles::OpenFiles(CAtlList<CHdmvClipInfo::PlaylistItem>& files, UINT nOpenFlags)
{
- POSITION pos = files.GetHeadPosition();
- LARGE_INTEGER llSize;
- int nPos = 0;
- REFERENCE_TIME rtDur = 0;
-
- Reset();
- while (pos) {
- CHdmvClipInfo::PlaylistItem& s = files.GetNext(pos);
- m_strFiles.Add(s.m_strFileName);
- if (!OpenPart(nPos)) {
- return false;
- }
-
- llSize.QuadPart = 0;
- GetFileSizeEx (m_hFile, &llSize);
- m_llTotalLength += llSize.QuadPart;
- m_FilesSize.Add (llSize.QuadPart);
- m_rtPtsOffsets.Add (rtDur);
- rtDur += s.Duration();
- nPos++;
- }
-
- if (files.GetCount() > 1) {
- ClosePart();
- }
-
- return TRUE;
+ POSITION pos = files.GetHeadPosition();
+ LARGE_INTEGER llSize;
+ int nPos = 0;
+ REFERENCE_TIME rtDur = 0;
+
+ Reset();
+ while (pos) {
+ CHdmvClipInfo::PlaylistItem& s = files.GetNext(pos);
+ m_strFiles.Add(s.m_strFileName);
+ if (!OpenPart(nPos)) {
+ return false;
+ }
+
+ llSize.QuadPart = 0;
+ GetFileSizeEx(m_hFile, &llSize);
+ m_llTotalLength += llSize.QuadPart;
+ m_FilesSize.Add(llSize.QuadPart);
+ m_rtPtsOffsets.Add(rtDur);
+ rtDur += s.Duration();
+ nPos++;
+ }
+
+ if (files.GetCount() > 1) {
+ ClosePart();
+ }
+
+ return TRUE;
}
ULONGLONG CMultiFiles::Seek(LONGLONG lOff, UINT nFrom)
{
- LARGE_INTEGER llNewPos;
- LARGE_INTEGER llOff;
-
- if (m_strFiles.GetCount() == 1) {
- llOff.QuadPart = lOff;
- SetFilePointerEx (m_hFile, llOff, &llNewPos, nFrom);
-
- return llNewPos.QuadPart;
- } else {
- ULONGLONG lAbsolutePos = GetAbsolutePosition(lOff, nFrom);
- int nNewPart = 0;
- ULONGLONG llSum = 0;
-
- while (m_FilesSize[nNewPart]+llSum <= lAbsolutePos) {
- llSum += m_FilesSize[nNewPart];
- nNewPart++;
- }
-
- OpenPart (nNewPart);
- llOff.QuadPart = lAbsolutePos - llSum;
- SetFilePointerEx (m_hFile, llOff, &llNewPos, FILE_BEGIN);
-
- return llSum + llNewPos.QuadPart;
- }
+ LARGE_INTEGER llNewPos;
+ LARGE_INTEGER llOff;
+
+ if (m_strFiles.GetCount() == 1) {
+ llOff.QuadPart = lOff;
+ SetFilePointerEx(m_hFile, llOff, &llNewPos, nFrom);
+
+ return llNewPos.QuadPart;
+ } else {
+ ULONGLONG lAbsolutePos = GetAbsolutePosition(lOff, nFrom);
+ int nNewPart = 0;
+ ULONGLONG llSum = 0;
+
+ while (m_FilesSize[nNewPart] + llSum <= lAbsolutePos) {
+ llSum += m_FilesSize[nNewPart];
+ nNewPart++;
+ }
+
+ OpenPart(nNewPart);
+ llOff.QuadPart = lAbsolutePos - llSum;
+ SetFilePointerEx(m_hFile, llOff, &llNewPos, FILE_BEGIN);
+
+ return llSum + llNewPos.QuadPart;
+ }
}
ULONGLONG CMultiFiles::GetAbsolutePosition(LONGLONG lOff, UINT nFrom)
{
- LARGE_INTEGER llNoMove = {0, 0};
- LARGE_INTEGER llCurPos;
-
- switch (nFrom) {
- case begin :
- return lOff;
- case current :
- SetFilePointerEx (m_hFile, llNoMove, &llCurPos, FILE_CURRENT);
- return llCurPos.QuadPart + lOff;
- case end :
- return m_llTotalLength - lOff;
- default:
- return 0; // just used to quash "not all control paths return a value" warning
- }
+ LARGE_INTEGER llNoMove = {0, 0};
+ LARGE_INTEGER llCurPos;
+
+ switch (nFrom) {
+ case begin :
+ return lOff;
+ case current :
+ SetFilePointerEx(m_hFile, llNoMove, &llCurPos, FILE_CURRENT);
+ return llCurPos.QuadPart + lOff;
+ case end :
+ return m_llTotalLength - lOff;
+ default:
+ return 0; // just used to quash "not all control paths return a value" warning
+ }
}
ULONGLONG CMultiFiles::GetLength() const
{
- if (m_strFiles.GetCount() == 1) {
- LARGE_INTEGER llSize;
- GetFileSizeEx (m_hFile, &llSize);
- return llSize.QuadPart;
- } else {
- return m_llTotalLength;
- }
+ if (m_strFiles.GetCount() == 1) {
+ LARGE_INTEGER llSize;
+ GetFileSizeEx(m_hFile, &llSize);
+ return llSize.QuadPart;
+ } else {
+ return m_llTotalLength;
+ }
}
UINT CMultiFiles::Read(void* lpBuf, UINT nCount)
{
- DWORD dwRead;
- do {
- if (!ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL)) {
- break;
- }
-
- if (dwRead != nCount && (m_nCurPart < 0 || (size_t)m_nCurPart < m_strFiles.GetCount()-1)) {
- OpenPart (m_nCurPart+1);
- lpBuf = (void*)((BYTE*)lpBuf + dwRead);
- nCount -= dwRead;
- }
- } while (nCount != dwRead && (m_nCurPart < 0 || (size_t)m_nCurPart < m_strFiles.GetCount()-1));
- return dwRead;
+ DWORD dwRead;
+ do {
+ if (!ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL)) {
+ break;
+ }
+
+ if (dwRead != nCount && (m_nCurPart < 0 || (size_t)m_nCurPart < m_strFiles.GetCount() - 1)) {
+ OpenPart(m_nCurPart + 1);
+ lpBuf = (void*)((BYTE*)lpBuf + dwRead);
+ nCount -= dwRead;
+ }
+ } while (nCount != dwRead && (m_nCurPart < 0 || (size_t)m_nCurPart < m_strFiles.GetCount() - 1));
+ return dwRead;
}
void CMultiFiles::Close()
{
- ClosePart();
- Reset();
+ ClosePart();
+ Reset();
}
CMultiFiles::~CMultiFiles()
{
- Close();
+ Close();
}
BOOL CMultiFiles::OpenPart(int nPart)
{
- if (m_nCurPart == nPart) {
- return TRUE;
- } else {
- CString fn;
+ if (m_nCurPart == nPart) {
+ return TRUE;
+ } else {
+ CString fn;
- ClosePart();
+ ClosePart();
- fn = m_strFiles.GetAt(nPart);
- m_hFile = CreateFile (fn, GENERIC_READ, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
+ fn = m_strFiles.GetAt(nPart);
+ m_hFile = CreateFile(fn, GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
- if (m_hFile != INVALID_HANDLE_VALUE) {
- m_nCurPart = nPart;
- if (m_pCurrentPTSOffset != NULL) {
- *m_pCurrentPTSOffset = m_rtPtsOffsets[nPart];
- }
- }
+ if (m_hFile != INVALID_HANDLE_VALUE) {
+ m_nCurPart = nPart;
+ if (m_pCurrentPTSOffset != NULL) {
+ *m_pCurrentPTSOffset = m_rtPtsOffsets[nPart];
+ }
+ }
- return (m_hFile != INVALID_HANDLE_VALUE);
- }
+ return (m_hFile != INVALID_HANDLE_VALUE);
+ }
}
void CMultiFiles::ClosePart()
{
- if (m_hFile != INVALID_HANDLE_VALUE) {
- CloseHandle (m_hFile);
- m_hFile = INVALID_HANDLE_VALUE;
- m_nCurPart = -1;
- }
+ if (m_hFile != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hFile);
+ m_hFile = INVALID_HANDLE_VALUE;
+ m_nCurPart = -1;
+ }
}
diff --git a/src/filters/parser/BaseSplitter/MultiFiles.h b/src/filters/parser/BaseSplitter/MultiFiles.h
index 7df49c0fd..7f1ac0c42 100644
--- a/src/filters/parser/BaseSplitter/MultiFiles.h
+++ b/src/filters/parser/BaseSplitter/MultiFiles.h
@@ -27,73 +27,73 @@
class CMultiFiles : public CObject
{
- DECLARE_DYNAMIC(CMultiFiles)
+ DECLARE_DYNAMIC(CMultiFiles)
public:
- // Flag values
- enum OpenFlags {
- modeRead = (int) 0x00000,
- modeWrite = (int) 0x00001,
- modeReadWrite = (int) 0x00002,
- shareCompat = (int) 0x00000,
- shareExclusive = (int) 0x00010,
- shareDenyWrite = (int) 0x00020,
- shareDenyRead = (int) 0x00030,
- shareDenyNone = (int) 0x00040,
- modeNoInherit = (int) 0x00080,
- modeCreate = (int) 0x01000,
- modeNoTruncate = (int) 0x02000,
- typeText = (int) 0x04000, // typeText and typeBinary are
- typeBinary = (int) 0x08000, // used in derived classes only
- osNoBuffer = (int) 0x10000,
- osWriteThrough = (int) 0x20000,
- osRandomAccess = (int) 0x40000,
- osSequentialScan = (int) 0x80000,
- };
+ // Flag values
+ enum OpenFlags {
+ modeRead = (int) 0x00000,
+ modeWrite = (int) 0x00001,
+ modeReadWrite = (int) 0x00002,
+ shareCompat = (int) 0x00000,
+ shareExclusive = (int) 0x00010,
+ shareDenyWrite = (int) 0x00020,
+ shareDenyRead = (int) 0x00030,
+ shareDenyNone = (int) 0x00040,
+ modeNoInherit = (int) 0x00080,
+ modeCreate = (int) 0x01000,
+ modeNoTruncate = (int) 0x02000,
+ typeText = (int) 0x04000, // typeText and typeBinary are
+ typeBinary = (int) 0x08000, // used in derived classes only
+ osNoBuffer = (int) 0x10000,
+ osWriteThrough = (int) 0x20000,
+ osRandomAccess = (int) 0x40000,
+ osSequentialScan = (int) 0x80000,
+ };
- enum Attribute {
- normal = 0x00,
- readOnly = 0x01,
- hidden = 0x02,
- system = 0x04,
- volume = 0x08,
- directory = 0x10,
- archive = 0x20
- };
+ enum Attribute {
+ normal = 0x00,
+ readOnly = 0x01,
+ hidden = 0x02,
+ system = 0x04,
+ volume = 0x08,
+ directory = 0x10,
+ archive = 0x20
+ };
- enum SeekPosition { begin = 0x0, current = 0x1, end = 0x2 };
+ enum SeekPosition { begin = 0x0, current = 0x1, end = 0x2 };
- // Constructors
- CMultiFiles();
+ // Constructors
+ CMultiFiles();
- CString m_strFileName;
+ CString m_strFileName;
- // Operations
- virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags);
- virtual BOOL OpenFiles(CAtlList<CHdmvClipInfo::PlaylistItem>& files, UINT nOpenFlags);
+ // Operations
+ virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags);
+ virtual BOOL OpenFiles(CAtlList<CHdmvClipInfo::PlaylistItem>& files, UINT nOpenFlags);
- virtual ULONGLONG Seek(LONGLONG lOff, UINT nFrom);
- virtual ULONGLONG GetLength() const;
+ virtual ULONGLONG Seek(LONGLONG lOff, UINT nFrom);
+ virtual ULONGLONG GetLength() const;
- virtual UINT Read(void* lpBuf, UINT nCount);
- virtual void Close();
+ virtual UINT Read(void* lpBuf, UINT nCount);
+ virtual void Close();
- // Implementation
+ // Implementation
public:
- virtual ~CMultiFiles();
+ virtual ~CMultiFiles();
protected:
- REFERENCE_TIME* m_pCurrentPTSOffset;
- CAtlArray<CString> m_strFiles;
- CAtlArray<ULONGLONG> m_FilesSize;
- CAtlArray<REFERENCE_TIME> m_rtPtsOffsets;
- HANDLE m_hFile;
- int m_nCurPart;
- ULONGLONG m_llTotalLength;
+ REFERENCE_TIME* m_pCurrentPTSOffset;
+ CAtlArray<CString> m_strFiles;
+ CAtlArray<ULONGLONG> m_FilesSize;
+ CAtlArray<REFERENCE_TIME> m_rtPtsOffsets;
+ HANDLE m_hFile;
+ int m_nCurPart;
+ ULONGLONG m_llTotalLength;
- BOOL OpenPart(int nPart);
- void ClosePart();
- ULONGLONG GetAbsolutePosition(LONGLONG lOff, UINT nFrom);
- void Reset();
+ BOOL OpenPart(int nPart);
+ void ClosePart();
+ ULONGLONG GetAbsolutePosition(LONGLONG lOff, UINT nFrom);
+ void Reset();
};
diff --git a/src/filters/parser/DSMSplitter/DSMSplitter.cpp b/src/filters/parser/DSMSplitter/DSMSplitter.cpp
index e0bf825ca..81f17ae6b 100644
--- a/src/filters/parser/DSMSplitter/DSMSplitter.cpp
+++ b/src/filters/parser/DSMSplitter/DSMSplitter.cpp
@@ -33,46 +33,46 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_DirectShowMedia},
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_DirectShowMedia},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CDSMSplitterFilter), DSMSplitterName, MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CDSMSourceFilter), DSMSourceName, MERIT_NORMAL, 0, NULL, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CDSMSplitterFilter), DSMSplitterName, MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CDSMSourceFilter), DSMSourceName, MERIT_NORMAL, 0, NULL, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CDSMSplitterFilter>, NULL, &sudFilter[0]},
- {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CDSMSourceFilter>, NULL, &sudFilter[1]},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CDSMSplitterFilter>, NULL, &sudFilter[0]},
+ {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CDSMSourceFilter>, NULL, &sudFilter[1]},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- CString str;
- str.Format(_T("0,%d,,%%0%dI64x"), DSMSW_SIZE, DSMSW_SIZE*2);
- str.Format(CString(str), DSMSW);
+ CString str;
+ str.Format(_T("0,%d,,%%0%dI64x"), DSMSW_SIZE, DSMSW_SIZE * 2);
+ str.Format(CString(str), DSMSW);
- RegisterSourceFilter(
- CLSID_AsyncReader,
- MEDIASUBTYPE_DirectShowMedia,
- str, NULL);
+ RegisterSourceFilter(
+ CLSID_AsyncReader,
+ MEDIASUBTYPE_DirectShowMedia,
+ str, NULL);
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- UnRegisterSourceFilter(MEDIASUBTYPE_DirectShowMedia);
+ UnRegisterSourceFilter(MEDIASUBTYPE_DirectShowMedia);
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -86,7 +86,7 @@ CFilterApp theApp;
//
CDSMSplitterFilter::CDSMSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CBaseSplitterFilter(NAME("CDSMSplitterFilter"), pUnk, phr, __uuidof(this))
+ : CBaseSplitterFilter(NAME("CDSMSplitterFilter"), pUnk, phr, __uuidof(this))
{
}
@@ -96,190 +96,190 @@ CDSMSplitterFilter::~CDSMSplitterFilter()
STDMETHODIMP CDSMSplitterFilter::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
-
- if (m_pName && m_pName[0]==L'M' && m_pName[1]==L'P' && m_pName[2]==L'C') {
- (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
- } else {
- wcscpy_s(pInfo->achName, DSMSourceName);
- }
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+
+ if (m_pName && m_pName[0] == L'M' && m_pName[1] == L'P' && m_pName[2] == L'C') {
+ (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
+ } else {
+ wcscpy_s(pInfo->achName, DSMSourceName);
+ }
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
static int compare_id(const void* id1, const void* id2)
{
- return (int)*(BYTE*)id1 - (int)*(BYTE*)id2;
+ return (int) * (BYTE*)id1 - (int) * (BYTE*)id2;
}
HRESULT CDSMSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
{
- CheckPointer(pAsyncReader, E_POINTER);
-
- HRESULT hr = E_FAIL;
-
- m_pFile.Free();
- m_pFile.Attach(DNew CDSMSplitterFile(pAsyncReader, hr, *this, *this));
- if (!m_pFile) {
- return E_OUTOFMEMORY;
- }
- if (FAILED(hr)) {
- m_pFile.Free();
- return hr;
- }
-
- m_rtNewStart = m_rtCurrent = 0;
- m_rtNewStop = m_rtStop = m_rtDuration = m_pFile->m_rtDuration;
-
- CAtlArray<BYTE> ids;
-
- POSITION pos = m_pFile->m_mts.GetStartPosition();
- while (pos) {
- BYTE id;
- CMediaType mt;
- m_pFile->m_mts.GetNextAssoc(pos, id, mt);
- ids.Add(id);
- }
-
- qsort(ids.GetData(), ids.GetCount(), sizeof(BYTE), compare_id);
-
- for (size_t i = 0; i < ids.GetCount(); i++) {
- BYTE id = ids[i];
- CMediaType& mt = m_pFile->m_mts[id];
-
- CStringW name, lang;
- name.Format(L"Output %02d", id);
-
- CAtlArray<CMediaType> mts;
- mts.Add(mt);
-
- CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CBaseSplitterOutputPin(mts, name, this, this, &hr));
-
- name.Empty();
-
- pos = m_pFile->m_sim[id].GetStartPosition();
- while (pos) {
- CStringA key;
- CStringW value;
- m_pFile->m_sim[id].GetNextAssoc(pos, key, value);
- pPinOut->SetProperty(CStringW(key), value);
-
- if (key == "NAME") {
- name = value;
- }
- if (key == "LANG") if ((lang = ISO6392ToLanguage(CStringA(CString(value)))).IsEmpty()) {
- lang = value;
- }
- }
-
- if (!name.IsEmpty() || !lang.IsEmpty()) {
- if (!name.IsEmpty()) {
- if (!lang.IsEmpty()) {
- name += L" (" + lang + L")";
- }
- } else if (!lang.IsEmpty()) {
- name = lang;
- }
- pPinOut->SetName(name);
- }
-
- EXECUTE_ASSERT(SUCCEEDED(AddOutputPin(id, pPinOut)));
- }
-
- pos = m_pFile->m_fim.GetStartPosition();
- while (pos) {
- CStringA key;
- CStringW value;
- m_pFile->m_fim.GetNextAssoc(pos, key, value);
- SetProperty(CStringW(key), value);
- }
-
- for (size_t i = 0; i < m_resources.GetCount(); i++) {
- const CDSMResource& r = m_resources[i];
- if (r.mime == "application/x-truetype-font" ||
- r.mime == "application/x-font-ttf" ||
- r.mime == "application/vnd.ms-opentype") {
- //m_fontinst.InstallFont(r.data);
- m_fontinst.InstallFontMemory(r.data.GetData(), r.data.GetCount());
- }
- }
-
- return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
+ CheckPointer(pAsyncReader, E_POINTER);
+
+ HRESULT hr = E_FAIL;
+
+ m_pFile.Free();
+ m_pFile.Attach(DNew CDSMSplitterFile(pAsyncReader, hr, *this, *this));
+ if (!m_pFile) {
+ return E_OUTOFMEMORY;
+ }
+ if (FAILED(hr)) {
+ m_pFile.Free();
+ return hr;
+ }
+
+ m_rtNewStart = m_rtCurrent = 0;
+ m_rtNewStop = m_rtStop = m_rtDuration = m_pFile->m_rtDuration;
+
+ CAtlArray<BYTE> ids;
+
+ POSITION pos = m_pFile->m_mts.GetStartPosition();
+ while (pos) {
+ BYTE id;
+ CMediaType mt;
+ m_pFile->m_mts.GetNextAssoc(pos, id, mt);
+ ids.Add(id);
+ }
+
+ qsort(ids.GetData(), ids.GetCount(), sizeof(BYTE), compare_id);
+
+ for (size_t i = 0; i < ids.GetCount(); i++) {
+ BYTE id = ids[i];
+ CMediaType& mt = m_pFile->m_mts[id];
+
+ CStringW name, lang;
+ name.Format(L"Output %02d", id);
+
+ CAtlArray<CMediaType> mts;
+ mts.Add(mt);
+
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CBaseSplitterOutputPin(mts, name, this, this, &hr));
+
+ name.Empty();
+
+ pos = m_pFile->m_sim[id].GetStartPosition();
+ while (pos) {
+ CStringA key;
+ CStringW value;
+ m_pFile->m_sim[id].GetNextAssoc(pos, key, value);
+ pPinOut->SetProperty(CStringW(key), value);
+
+ if (key == "NAME") {
+ name = value;
+ }
+ if (key == "LANG") if ((lang = ISO6392ToLanguage(CStringA(CString(value)))).IsEmpty()) {
+ lang = value;
+ }
+ }
+
+ if (!name.IsEmpty() || !lang.IsEmpty()) {
+ if (!name.IsEmpty()) {
+ if (!lang.IsEmpty()) {
+ name += L" (" + lang + L")";
+ }
+ } else if (!lang.IsEmpty()) {
+ name = lang;
+ }
+ pPinOut->SetName(name);
+ }
+
+ EXECUTE_ASSERT(SUCCEEDED(AddOutputPin(id, pPinOut)));
+ }
+
+ pos = m_pFile->m_fim.GetStartPosition();
+ while (pos) {
+ CStringA key;
+ CStringW value;
+ m_pFile->m_fim.GetNextAssoc(pos, key, value);
+ SetProperty(CStringW(key), value);
+ }
+
+ for (size_t i = 0; i < m_resources.GetCount(); i++) {
+ const CDSMResource& r = m_resources[i];
+ if (r.mime == "application/x-truetype-font" ||
+ r.mime == "application/x-font-ttf" ||
+ r.mime == "application/vnd.ms-opentype") {
+ //m_fontinst.InstallFont(r.data);
+ m_fontinst.InstallFontMemory(r.data.GetData(), r.data.GetCount());
+ }
+ }
+
+ return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
}
bool CDSMSplitterFilter::DemuxInit()
{
- SetThreadName((DWORD)-1, "CDSMSplitterFilter");
- return true;
+ SetThreadName((DWORD) - 1, "CDSMSplitterFilter");
+ return true;
}
void CDSMSplitterFilter::DemuxSeek(REFERENCE_TIME rt)
{
- m_pFile->Seek(m_pFile->FindSyncPoint(rt));
+ m_pFile->Seek(m_pFile->FindSyncPoint(rt));
}
bool CDSMSplitterFilter::DemuxLoop()
{
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- while (SUCCEEDED(hr) && !CheckRequest(NULL) && m_pFile->GetRemaining()) {
- dsmp_t type;
- UINT64 len;
+ while (SUCCEEDED(hr) && !CheckRequest(NULL) && m_pFile->GetRemaining()) {
+ dsmp_t type;
+ UINT64 len;
- if (!m_pFile->Sync(type, len)) {
- continue;
- }
+ if (!m_pFile->Sync(type, len)) {
+ continue;
+ }
- __int64 pos = m_pFile->GetPos();
+ __int64 pos = m_pFile->GetPos();
- if (type == DSMP_SAMPLE) {
- CAutoPtr<Packet> p(DNew Packet());
- if (m_pFile->Read(len, p)) {
- if (p->rtStart != Packet::INVALID_TIME) {
- p->rtStart -= m_pFile->m_rtFirst;
- p->rtStop -= m_pFile->m_rtFirst;
- }
+ if (type == DSMP_SAMPLE) {
+ CAutoPtr<Packet> p(DNew Packet());
+ if (m_pFile->Read(len, p)) {
+ if (p->rtStart != Packet::INVALID_TIME) {
+ p->rtStart -= m_pFile->m_rtFirst;
+ p->rtStop -= m_pFile->m_rtFirst;
+ }
- hr = DeliverPacket(p);
- }
- }
+ hr = DeliverPacket(p);
+ }
+ }
- m_pFile->Seek(pos + len);
- }
+ m_pFile->Seek(pos + len);
+ }
- return true;
+ return true;
}
// IKeyFrameInfo
STDMETHODIMP CDSMSplitterFilter::GetKeyFrameCount(UINT& nKFs)
{
- CheckPointer(m_pFile, E_UNEXPECTED);
- nKFs = m_pFile->m_sps.GetCount();
- return S_OK;
+ CheckPointer(m_pFile, E_UNEXPECTED);
+ nKFs = m_pFile->m_sps.GetCount();
+ return S_OK;
}
STDMETHODIMP CDSMSplitterFilter::GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs)
{
- CheckPointer(pFormat, E_POINTER);
- CheckPointer(pKFs, E_POINTER);
- CheckPointer(m_pFile, E_UNEXPECTED);
+ CheckPointer(pFormat, E_POINTER);
+ CheckPointer(pKFs, E_POINTER);
+ CheckPointer(m_pFile, E_UNEXPECTED);
- if (*pFormat != TIME_FORMAT_MEDIA_TIME) {
- return E_INVALIDARG;
- }
+ if (*pFormat != TIME_FORMAT_MEDIA_TIME) {
+ return E_INVALIDARG;
+ }
- // these aren't really the keyframes, but quicky accessable points in the stream
- for (nKFs = 0; nKFs < m_pFile->m_sps.GetCount(); nKFs++) {
- pKFs[nKFs] = m_pFile->m_sps[nKFs].rt;
- }
+ // these aren't really the keyframes, but quicky accessable points in the stream
+ for (nKFs = 0; nKFs < m_pFile->m_sps.GetCount(); nKFs++) {
+ pKFs[nKFs] = m_pFile->m_sps[nKFs].rt;
+ }
- return S_OK;
+ return S_OK;
}
//
@@ -287,8 +287,8 @@ STDMETHODIMP CDSMSplitterFilter::GetKeyFrames(const GUID* pFormat, REFERENCE_TIM
//
CDSMSourceFilter::CDSMSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CDSMSplitterFilter(pUnk, phr)
+ : CDSMSplitterFilter(pUnk, phr)
{
- m_clsid = __uuidof(this);
- m_pInput.Free();
+ m_clsid = __uuidof(this);
+ m_pInput.Free();
}
diff --git a/src/filters/parser/DSMSplitter/DSMSplitter.h b/src/filters/parser/DSMSplitter/DSMSplitter.h
index 7cdbb1ea2..0022b7795 100644
--- a/src/filters/parser/DSMSplitter/DSMSplitter.h
+++ b/src/filters/parser/DSMSplitter/DSMSplitter.h
@@ -32,32 +32,32 @@
#define DSMSourceName L"MPC DSM Source"
class __declspec(uuid("0912B4DD-A30A-4568-B590-7179EBB420EC"))
- CDSMSplitterFilter : public CBaseSplitterFilter
+ CDSMSplitterFilter : public CBaseSplitterFilter
{
protected:
- CAutoPtr<CDSMSplitterFile> m_pFile;
- HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
+ CAutoPtr<CDSMSplitterFile> m_pFile;
+ HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
- bool DemuxInit();
- void DemuxSeek(REFERENCE_TIME rt);
- bool DemuxLoop();
+ bool DemuxInit();
+ void DemuxSeek(REFERENCE_TIME rt);
+ bool DemuxLoop();
public:
- CDSMSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
- virtual ~CDSMSplitterFilter();
+ CDSMSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ virtual ~CDSMSplitterFilter();
- // CBaseFilter
- STDMETHODIMP_(HRESULT) QueryFilterInfo(FILTER_INFO* pInfo);
+ // CBaseFilter
+ STDMETHODIMP_(HRESULT) QueryFilterInfo(FILTER_INFO* pInfo);
- // IKeyFrameInfo
+ // IKeyFrameInfo
- STDMETHODIMP_(HRESULT) GetKeyFrameCount(UINT& nKFs);
- STDMETHODIMP_(HRESULT) GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
+ STDMETHODIMP_(HRESULT) GetKeyFrameCount(UINT& nKFs);
+ STDMETHODIMP_(HRESULT) GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
};
class __declspec(uuid("803E8280-F3CE-4201-982C-8CD8FB512004"))
- CDSMSourceFilter : public CDSMSplitterFilter
+ CDSMSourceFilter : public CDSMSplitterFilter
{
public:
- CDSMSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ CDSMSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
};
diff --git a/src/filters/parser/DSMSplitter/DSMSplitterFile.cpp b/src/filters/parser/DSMSplitter/DSMSplitterFile.cpp
index f9375f52f..0bdd9257e 100644
--- a/src/filters/parser/DSMSplitter/DSMSplitterFile.cpp
+++ b/src/filters/parser/DSMSplitter/DSMSplitterFile.cpp
@@ -4,399 +4,399 @@
#include <moreuuids.h>
CDSMSplitterFile::CDSMSplitterFile(IAsyncReader* pReader, HRESULT& hr, IDSMResourceBagImpl& res, IDSMChapterBagImpl& chap)
- : CBaseSplitterFile(pReader, hr, DEFAULT_CACHE_LENGTH, false)
- , m_rtFirst(0)
- , m_rtDuration(0)
+ : CBaseSplitterFile(pReader, hr, DEFAULT_CACHE_LENGTH, false)
+ , m_rtFirst(0)
+ , m_rtDuration(0)
{
- if (FAILED(hr)) {
- return;
- }
+ if (FAILED(hr)) {
+ return;
+ }
- hr = Init(res, chap);
+ hr = Init(res, chap);
}
HRESULT CDSMSplitterFile::Init(IDSMResourceBagImpl& res, IDSMChapterBagImpl& chap)
{
- Seek(0);
-
- if (BitRead(DSMSW_SIZE<<3) != DSMSW || BitRead(5) != DSMP_FILEINFO) {
- return E_FAIL;
- }
-
- Seek(0);
-
- m_mts.RemoveAll();
- m_rtFirst = m_rtDuration = 0;
- m_fim.RemoveAll();
- m_sim.RemoveAll();
- res.ResRemoveAll();
- chap.ChapRemoveAll();
-
- dsmp_t type;
- UINT64 len;
- int limit = 65536;
-
- // examine the beginning of the file ...
-
- while (Sync(type, len, 0)) {
- __int64 pos = GetPos();
-
- if (type == DSMP_MEDIATYPE) {
- BYTE id;
- CMediaType mt;
- if (Read(len, id, mt)) {
- m_mts[id] = mt;
- }
- } else if (type == DSMP_SAMPLE) {
- Packet p;
- if (Read(len, &p, false) && p.rtStart != Packet::INVALID_TIME) {
- m_rtFirst = p.rtStart;
- break;
- }
- } else if (type == DSMP_FILEINFO) {
- if ((BYTE)BitRead(8) > DSMF_VERSION) {
- return E_FAIL;
- }
- Read(len-1, m_fim);
- } else if (type == DSMP_STREAMINFO) {
- Read(len-1, m_sim[(BYTE)BitRead(8)]);
- } else if (type == DSMP_SYNCPOINTS) {
- Read(len, m_sps);
- } else if (type == DSMP_RESOURCE) {
- Read(len, res);
- } else if (type == DSMP_CHAPTERS) {
- Read(len, chap);
- }
-
- Seek(pos + len);
- }
-
- if (type != DSMP_SAMPLE) {
- return E_FAIL;
- }
-
- // ... and the end
-
- if (IsRandomAccess())
- for (int i = 1, j = (int)((GetLength()+limit/2)/limit); i <= j; i++) {
- __int64 seekpos = max(0, (__int64)GetLength()-i*limit);
- Seek(seekpos);
-
- while (Sync(type, len, limit) && GetPos() < seekpos+limit) {
- __int64 pos = GetPos();
-
- if (type == DSMP_SAMPLE) {
- Packet p;
- if (Read(len, &p, false) && p.rtStart != Packet::INVALID_TIME) {
- m_rtDuration = max(m_rtDuration, p.rtStop - m_rtFirst); // max isn't really needed, only for safety
- i = j;
- }
- } else if (type == DSMP_SYNCPOINTS) {
- Read(len, m_sps);
- } else if (type == DSMP_RESOURCE) {
- Read(len, res);
- } else if (type == DSMP_CHAPTERS) {
- Read(len, chap);
- }
-
- Seek(pos + len);
- }
- }
-
- if (m_rtFirst < 0) {
- m_rtDuration += m_rtFirst;
- m_rtFirst = 0;
- }
-
- return m_mts.GetCount() > 0 ? S_OK : E_FAIL;
+ Seek(0);
+
+ if (BitRead(DSMSW_SIZE << 3) != DSMSW || BitRead(5) != DSMP_FILEINFO) {
+ return E_FAIL;
+ }
+
+ Seek(0);
+
+ m_mts.RemoveAll();
+ m_rtFirst = m_rtDuration = 0;
+ m_fim.RemoveAll();
+ m_sim.RemoveAll();
+ res.ResRemoveAll();
+ chap.ChapRemoveAll();
+
+ dsmp_t type;
+ UINT64 len;
+ int limit = 65536;
+
+ // examine the beginning of the file ...
+
+ while (Sync(type, len, 0)) {
+ __int64 pos = GetPos();
+
+ if (type == DSMP_MEDIATYPE) {
+ BYTE id;
+ CMediaType mt;
+ if (Read(len, id, mt)) {
+ m_mts[id] = mt;
+ }
+ } else if (type == DSMP_SAMPLE) {
+ Packet p;
+ if (Read(len, &p, false) && p.rtStart != Packet::INVALID_TIME) {
+ m_rtFirst = p.rtStart;
+ break;
+ }
+ } else if (type == DSMP_FILEINFO) {
+ if ((BYTE)BitRead(8) > DSMF_VERSION) {
+ return E_FAIL;
+ }
+ Read(len - 1, m_fim);
+ } else if (type == DSMP_STREAMINFO) {
+ Read(len - 1, m_sim[(BYTE)BitRead(8)]);
+ } else if (type == DSMP_SYNCPOINTS) {
+ Read(len, m_sps);
+ } else if (type == DSMP_RESOURCE) {
+ Read(len, res);
+ } else if (type == DSMP_CHAPTERS) {
+ Read(len, chap);
+ }
+
+ Seek(pos + len);
+ }
+
+ if (type != DSMP_SAMPLE) {
+ return E_FAIL;
+ }
+
+ // ... and the end
+
+ if (IsRandomAccess())
+ for (int i = 1, j = (int)((GetLength() + limit / 2) / limit); i <= j; i++) {
+ __int64 seekpos = max(0, (__int64)GetLength() - i * limit);
+ Seek(seekpos);
+
+ while (Sync(type, len, limit) && GetPos() < seekpos + limit) {
+ __int64 pos = GetPos();
+
+ if (type == DSMP_SAMPLE) {
+ Packet p;
+ if (Read(len, &p, false) && p.rtStart != Packet::INVALID_TIME) {
+ m_rtDuration = max(m_rtDuration, p.rtStop - m_rtFirst); // max isn't really needed, only for safety
+ i = j;
+ }
+ } else if (type == DSMP_SYNCPOINTS) {
+ Read(len, m_sps);
+ } else if (type == DSMP_RESOURCE) {
+ Read(len, res);
+ } else if (type == DSMP_CHAPTERS) {
+ Read(len, chap);
+ }
+
+ Seek(pos + len);
+ }
+ }
+
+ if (m_rtFirst < 0) {
+ m_rtDuration += m_rtFirst;
+ m_rtFirst = 0;
+ }
+
+ return m_mts.GetCount() > 0 ? S_OK : E_FAIL;
}
bool CDSMSplitterFile::Sync(dsmp_t& type, UINT64& len, __int64 limit)
{
- UINT64 pos;
- return Sync(pos, type, len, limit);
+ UINT64 pos;
+ return Sync(pos, type, len, limit);
}
bool CDSMSplitterFile::Sync(UINT64& syncpos, dsmp_t& type, UINT64& len, __int64 limit)
{
- BitByteAlign();
+ BitByteAlign();
- limit += DSMSW_SIZE;
+ limit += DSMSW_SIZE;
- for (UINT64 id = 0; (id&((1ui64<<(DSMSW_SIZE<<3))-1)) != DSMSW; id = (id << 8) | (BYTE)BitRead(8)) {
- if (limit-- <= 0 || GetRemaining() <= 2) {
- return false;
- }
- }
+ for (UINT64 id = 0; (id & ((1ui64 << (DSMSW_SIZE << 3)) - 1)) != DSMSW; id = (id << 8) | (BYTE)BitRead(8)) {
+ if (limit-- <= 0 || GetRemaining() <= 2) {
+ return false;
+ }
+ }
- syncpos = GetPos() - (DSMSW_SIZE<<3);
- type = (dsmp_t)BitRead(5);
- len = BitRead(((int)BitRead(3)+1)<<3);
+ syncpos = GetPos() - (DSMSW_SIZE << 3);
+ type = (dsmp_t)BitRead(5);
+ len = BitRead(((int)BitRead(3) + 1) << 3);
- return true;
+ return true;
}
bool CDSMSplitterFile::Read(__int64 len, BYTE& id, CMediaType& mt)
{
- id = (BYTE)BitRead(8);
- ByteRead((BYTE*)&mt.majortype, sizeof(mt.majortype));
- ByteRead((BYTE*)&mt.subtype, sizeof(mt.subtype));
- mt.bFixedSizeSamples = (BOOL)BitRead(1);
- mt.bTemporalCompression = (BOOL)BitRead(1);
- mt.lSampleSize = (ULONG)BitRead(30);
- ByteRead((BYTE*)&mt.formattype, sizeof(mt.formattype));
- len -= 5 + sizeof(GUID)*3;
- ASSERT(len >= 0);
- if (len > 0) {
- mt.AllocFormatBuffer((LONG)len);
- ByteRead(mt.Format(), mt.FormatLength());
- } else {
- mt.ResetFormatBuffer();
- }
- return true;
+ id = (BYTE)BitRead(8);
+ ByteRead((BYTE*)&mt.majortype, sizeof(mt.majortype));
+ ByteRead((BYTE*)&mt.subtype, sizeof(mt.subtype));
+ mt.bFixedSizeSamples = (BOOL)BitRead(1);
+ mt.bTemporalCompression = (BOOL)BitRead(1);
+ mt.lSampleSize = (ULONG)BitRead(30);
+ ByteRead((BYTE*)&mt.formattype, sizeof(mt.formattype));
+ len -= 5 + sizeof(GUID) * 3;
+ ASSERT(len >= 0);
+ if (len > 0) {
+ mt.AllocFormatBuffer((LONG)len);
+ ByteRead(mt.Format(), mt.FormatLength());
+ } else {
+ mt.ResetFormatBuffer();
+ }
+ return true;
}
bool CDSMSplitterFile::Read(__int64 len, Packet* p, bool fData)
{
- if (!p) {
- return false;
- }
-
- p->TrackNumber = (DWORD)BitRead(8);
- p->bSyncPoint = (BOOL)BitRead(1);
- bool fSign = !!BitRead(1);
- int iTimeStamp = (int)BitRead(3);
- int iDuration = (int)BitRead(3);
-
- if (fSign && !iTimeStamp) {
- ASSERT(!iDuration);
- p->rtStart = Packet::INVALID_TIME;
- p->rtStop = Packet::INVALID_TIME + 1;
- } else {
- p->rtStart = (REFERENCE_TIME)BitRead(iTimeStamp<<3) * (fSign ? -1 : 1);
- p->rtStop = p->rtStart + BitRead(iDuration<<3);
- }
-
- if (fData) {
- p->SetCount((INT_PTR)len - (2 + iTimeStamp + iDuration));
- ByteRead(p->GetData(), p->GetCount());
- }
-
- return true;
+ if (!p) {
+ return false;
+ }
+
+ p->TrackNumber = (DWORD)BitRead(8);
+ p->bSyncPoint = (BOOL)BitRead(1);
+ bool fSign = !!BitRead(1);
+ int iTimeStamp = (int)BitRead(3);
+ int iDuration = (int)BitRead(3);
+
+ if (fSign && !iTimeStamp) {
+ ASSERT(!iDuration);
+ p->rtStart = Packet::INVALID_TIME;
+ p->rtStop = Packet::INVALID_TIME + 1;
+ } else {
+ p->rtStart = (REFERENCE_TIME)BitRead(iTimeStamp << 3) * (fSign ? -1 : 1);
+ p->rtStop = p->rtStart + BitRead(iDuration << 3);
+ }
+
+ if (fData) {
+ p->SetCount((INT_PTR)len - (2 + iTimeStamp + iDuration));
+ ByteRead(p->GetData(), p->GetCount());
+ }
+
+ return true;
}
bool CDSMSplitterFile::Read(__int64 len, CAtlArray<SyncPoint>& sps)
{
- SyncPoint sp = {0, 0};
- sps.RemoveAll();
+ SyncPoint sp = {0, 0};
+ sps.RemoveAll();
- while (len > 0) {
- bool fSign = !!BitRead(1);
- int iTimeStamp = (int)BitRead(3);
- int iFilePos = (int)BitRead(3);
- BitRead(1); // reserved
+ while (len > 0) {
+ bool fSign = !!BitRead(1);
+ int iTimeStamp = (int)BitRead(3);
+ int iFilePos = (int)BitRead(3);
+ BitRead(1); // reserved
- sp.rt += (REFERENCE_TIME)BitRead(iTimeStamp<<3) * (fSign ? -1 : 1);
- sp.fp += BitRead(iFilePos<<3);
- sps.Add(sp);
+ sp.rt += (REFERENCE_TIME)BitRead(iTimeStamp << 3) * (fSign ? -1 : 1);
+ sp.fp += BitRead(iFilePos << 3);
+ sps.Add(sp);
- len -= 1 + iTimeStamp + iFilePos;
- }
+ len -= 1 + iTimeStamp + iFilePos;
+ }
- if (len != 0) {
- sps.RemoveAll();
- return false;
- }
+ if (len != 0) {
+ sps.RemoveAll();
+ return false;
+ }
- // TODO: sort sps
+ // TODO: sort sps
- return true;
+ return true;
}
bool CDSMSplitterFile::Read(__int64 len, CStreamInfoMap& im)
{
- while (len >= 5) {
- CStringA key;
- ByteRead((BYTE*)key.GetBufferSetLength(4), 4);
- len -= 4;
- len -= Read(len, im[key]);
- }
-
- return len == 0;
+ while (len >= 5) {
+ CStringA key;
+ ByteRead((BYTE*)key.GetBufferSetLength(4), 4);
+ len -= 4;
+ len -= Read(len, im[key]);
+ }
+
+ return len == 0;
}
bool CDSMSplitterFile::Read(__int64 len, IDSMResourceBagImpl& res)
{
- BYTE compression = (BYTE)BitRead(2);
- BYTE reserved = (BYTE)BitRead(6);
- UNREFERENCED_PARAMETER(reserved);
- len--;
+ BYTE compression = (BYTE)BitRead(2);
+ BYTE reserved = (BYTE)BitRead(6);
+ UNREFERENCED_PARAMETER(reserved);
+ len--;
- CDSMResource r;
- len -= Read(len, r.name);
- len -= Read(len, r.desc);
- len -= Read(len, r.mime);
+ CDSMResource r;
+ len -= Read(len, r.name);
+ len -= Read(len, r.desc);
+ len -= Read(len, r.mime);
- if (compression != 0) {
- return false; // TODO
- }
+ if (compression != 0) {
+ return false; // TODO
+ }
- r.data.SetCount((size_t)len);
- ByteRead(r.data.GetData(), r.data.GetCount());
+ r.data.SetCount((size_t)len);
+ ByteRead(r.data.GetData(), r.data.GetCount());
- res += r;
+ res += r;
- return true;
+ return true;
}
bool CDSMSplitterFile::Read(__int64 len, IDSMChapterBagImpl& chap)
{
- CDSMChapter c(0, L"");
+ CDSMChapter c(0, L"");
- while (len > 0) {
- bool fSign = !!BitRead(1);
- int iTimeStamp = (int)BitRead(3);
- BitRead(4); // reserved
- len--;
+ while (len > 0) {
+ bool fSign = !!BitRead(1);
+ int iTimeStamp = (int)BitRead(3);
+ BitRead(4); // reserved
+ len--;
- c.rt += (REFERENCE_TIME)BitRead(iTimeStamp<<3) * (fSign ? -1 : 1);
- len -= iTimeStamp;
- len -= Read(len, c.name);
+ c.rt += (REFERENCE_TIME)BitRead(iTimeStamp << 3) * (fSign ? -1 : 1);
+ len -= iTimeStamp;
+ len -= Read(len, c.name);
- chap += c;
- }
+ chap += c;
+ }
- chap.ChapSort();
+ chap.ChapSort();
- return len == 0;
+ return len == 0;
}
__int64 CDSMSplitterFile::Read(__int64 len, CStringW& str)
{
- char c;
- CStringA s;
- __int64 i = 0;
- while (i++ < len && (c = (char)BitRead(8)) != 0) {
- s += c;
- }
- str = UTF8To16(s);
- return i;
+ char c;
+ CStringA s;
+ __int64 i = 0;
+ while (i++ < len && (c = (char)BitRead(8)) != 0) {
+ s += c;
+ }
+ str = UTF8To16(s);
+ return i;
}
__int64 CDSMSplitterFile::FindSyncPoint(REFERENCE_TIME rt)
{
- if (/*!m_sps.IsEmpty()*/ m_sps.GetCount() > 1) {
- ptrdiff_t i = range_bsearch(m_sps, m_rtFirst + rt);
- return i >= 0 ? m_sps[i].fp : 0;
- }
-
- if (m_rtDuration <= 0 || rt <= m_rtFirst) {
- return 0;
- }
-
- // ok, do the hard way then
-
- dsmp_t type;
- UINT64 syncpos, len;
-
- // 1. find some boundaries close to rt's position (minpos, maxpos)
-
- __int64 minpos = 0, maxpos = GetLength();
-
- for (int i = 0; i < 10 && (maxpos - minpos) >= 1024*1024; i++) {
- Seek((minpos + maxpos) / 2);
-
- while (GetPos() < maxpos) {
- if (!Sync(syncpos, type, len)) {
- continue;
- }
-
- __int64 pos = GetPos();
-
- if (type == DSMP_SAMPLE) {
- Packet p;
- if (Read(len, &p, false) && p.rtStart != Packet::INVALID_TIME) {
- REFERENCE_TIME dt = (p.rtStart -= m_rtFirst) - rt;
- if (dt >= 0) {
- maxpos = max((__int64)syncpos - 65536, minpos);
- } else {
- minpos = syncpos;
- }
- break;
- }
- }
-
- Seek(pos + len);
- }
- }
-
- // 2. find the first packet just after rt (maxpos)
-
- Seek(minpos);
-
- while (GetRemaining()) {
- if (!Sync(syncpos, type, len)) {
- continue;
- }
-
- __int64 pos = GetPos();
-
- if (type == DSMP_SAMPLE) {
- Packet p;
- if (Read(len, &p, false) && p.rtStart != Packet::INVALID_TIME) {
- REFERENCE_TIME dt = (p.rtStart -= m_rtFirst) - rt;
- if (dt >= 0) {
- maxpos = (__int64)syncpos;
- break;
- }
- }
- }
-
- Seek(pos + len);
- }
-
- // 3. iterate backwards from maxpos and find at least one syncpoint for every stream, except for subtitle streams
-
- CAtlMap<BYTE,BYTE> ids;
-
- {
- POSITION pos = m_mts.GetStartPosition();
- while (pos) {
- BYTE id;
- CMediaType mt;
- m_mts.GetNextAssoc(pos, id, mt);
- if (mt.majortype != MEDIATYPE_Text && mt.majortype != MEDIATYPE_Subtitle) {
- ids[id] = 0;
- }
- }
- }
-
- __int64 ret = maxpos;
-
- while (maxpos > 0 && !ids.IsEmpty()) {
- minpos = max(0, maxpos - 65536);
-
- Seek(minpos);
-
- while (Sync(syncpos, type, len) && GetPos() < maxpos) {
- UINT64 pos = GetPos();
-
- if (type == DSMP_SAMPLE) {
- Packet p;
- if (Read(len, &p, false) && p.rtStart != Packet::INVALID_TIME && p.bSyncPoint) {
- BYTE id = (BYTE)p.TrackNumber, tmp;
- if (ids.Lookup(id, tmp)) {
- ids.RemoveKey((BYTE)p.TrackNumber);
- ret = min(ret, (__int64)syncpos);
- }
- }
- }
-
- Seek(pos + len);
- }
-
- maxpos = minpos;
- }
-
- return ret;
+ if (/*!m_sps.IsEmpty()*/ m_sps.GetCount() > 1) {
+ ptrdiff_t i = range_bsearch(m_sps, m_rtFirst + rt);
+ return i >= 0 ? m_sps[i].fp : 0;
+ }
+
+ if (m_rtDuration <= 0 || rt <= m_rtFirst) {
+ return 0;
+ }
+
+ // ok, do the hard way then
+
+ dsmp_t type;
+ UINT64 syncpos, len;
+
+ // 1. find some boundaries close to rt's position (minpos, maxpos)
+
+ __int64 minpos = 0, maxpos = GetLength();
+
+ for (int i = 0; i < 10 && (maxpos - minpos) >= 1024 * 1024; i++) {
+ Seek((minpos + maxpos) / 2);
+
+ while (GetPos() < maxpos) {
+ if (!Sync(syncpos, type, len)) {
+ continue;
+ }
+
+ __int64 pos = GetPos();
+
+ if (type == DSMP_SAMPLE) {
+ Packet p;
+ if (Read(len, &p, false) && p.rtStart != Packet::INVALID_TIME) {
+ REFERENCE_TIME dt = (p.rtStart -= m_rtFirst) - rt;
+ if (dt >= 0) {
+ maxpos = max((__int64)syncpos - 65536, minpos);
+ } else {
+ minpos = syncpos;
+ }
+ break;
+ }
+ }
+
+ Seek(pos + len);
+ }
+ }
+
+ // 2. find the first packet just after rt (maxpos)
+
+ Seek(minpos);
+
+ while (GetRemaining()) {
+ if (!Sync(syncpos, type, len)) {
+ continue;
+ }
+
+ __int64 pos = GetPos();
+
+ if (type == DSMP_SAMPLE) {
+ Packet p;
+ if (Read(len, &p, false) && p.rtStart != Packet::INVALID_TIME) {
+ REFERENCE_TIME dt = (p.rtStart -= m_rtFirst) - rt;
+ if (dt >= 0) {
+ maxpos = (__int64)syncpos;
+ break;
+ }
+ }
+ }
+
+ Seek(pos + len);
+ }
+
+ // 3. iterate backwards from maxpos and find at least one syncpoint for every stream, except for subtitle streams
+
+ CAtlMap<BYTE, BYTE> ids;
+
+ {
+ POSITION pos = m_mts.GetStartPosition();
+ while (pos) {
+ BYTE id;
+ CMediaType mt;
+ m_mts.GetNextAssoc(pos, id, mt);
+ if (mt.majortype != MEDIATYPE_Text && mt.majortype != MEDIATYPE_Subtitle) {
+ ids[id] = 0;
+ }
+ }
+ }
+
+ __int64 ret = maxpos;
+
+ while (maxpos > 0 && !ids.IsEmpty()) {
+ minpos = max(0, maxpos - 65536);
+
+ Seek(minpos);
+
+ while (Sync(syncpos, type, len) && GetPos() < maxpos) {
+ UINT64 pos = GetPos();
+
+ if (type == DSMP_SAMPLE) {
+ Packet p;
+ if (Read(len, &p, false) && p.rtStart != Packet::INVALID_TIME && p.bSyncPoint) {
+ BYTE id = (BYTE)p.TrackNumber, tmp;
+ if (ids.Lookup(id, tmp)) {
+ ids.RemoveKey((BYTE)p.TrackNumber);
+ ret = min(ret, (__int64)syncpos);
+ }
+ }
+ }
+
+ Seek(pos + len);
+ }
+
+ maxpos = minpos;
+ }
+
+ return ret;
}
diff --git a/src/filters/parser/DSMSplitter/DSMSplitterFile.h b/src/filters/parser/DSMSplitter/DSMSplitterFile.h
index b61e5e1b7..420ccd8f0 100644
--- a/src/filters/parser/DSMSplitter/DSMSplitterFile.h
+++ b/src/filters/parser/DSMSplitter/DSMSplitterFile.h
@@ -6,33 +6,33 @@
class CDSMSplitterFile : public CBaseSplitterFile
{
- HRESULT Init(IDSMResourceBagImpl& res, IDSMChapterBagImpl& chap);
+ HRESULT Init(IDSMResourceBagImpl& res, IDSMChapterBagImpl& chap);
public:
- CDSMSplitterFile(IAsyncReader* pReader, HRESULT& hr, IDSMResourceBagImpl& res, IDSMChapterBagImpl& chap);
-
- CAtlMap<BYTE, CMediaType> m_mts;
- REFERENCE_TIME m_rtFirst, m_rtDuration;
-
- struct SyncPoint {
- REFERENCE_TIME rt;
- __int64 fp;
- };
- CAtlArray<SyncPoint> m_sps;
-
- typedef CAtlMap<CStringA, CStringW, CStringElementTraits<CStringA>, CStringElementTraits<CStringW> > CStreamInfoMap;
- CStreamInfoMap m_fim;
- CAtlMap<BYTE, CStreamInfoMap> m_sim;
-
- bool Sync(dsmp_t& type, UINT64& len, __int64 limit = 65536);
- bool Sync(UINT64& syncpos, dsmp_t& type, UINT64& len, __int64 limit = 65536);
- bool Read(__int64 len, BYTE& id, CMediaType& mt);
- bool Read(__int64 len, Packet* p, bool fData = true);
- bool Read(__int64 len, CAtlArray<SyncPoint>& sps);
- bool Read(__int64 len, CStreamInfoMap& im);
- bool Read(__int64 len, IDSMResourceBagImpl& res);
- bool Read(__int64 len, IDSMChapterBagImpl& chap);
- __int64 Read(__int64 len, CStringW& str);
-
- __int64 FindSyncPoint(REFERENCE_TIME rt);
+ CDSMSplitterFile(IAsyncReader* pReader, HRESULT& hr, IDSMResourceBagImpl& res, IDSMChapterBagImpl& chap);
+
+ CAtlMap<BYTE, CMediaType> m_mts;
+ REFERENCE_TIME m_rtFirst, m_rtDuration;
+
+ struct SyncPoint {
+ REFERENCE_TIME rt;
+ __int64 fp;
+ };
+ CAtlArray<SyncPoint> m_sps;
+
+ typedef CAtlMap<CStringA, CStringW, CStringElementTraits<CStringA>, CStringElementTraits<CStringW> > CStreamInfoMap;
+ CStreamInfoMap m_fim;
+ CAtlMap<BYTE, CStreamInfoMap> m_sim;
+
+ bool Sync(dsmp_t& type, UINT64& len, __int64 limit = 65536);
+ bool Sync(UINT64& syncpos, dsmp_t& type, UINT64& len, __int64 limit = 65536);
+ bool Read(__int64 len, BYTE& id, CMediaType& mt);
+ bool Read(__int64 len, Packet* p, bool fData = true);
+ bool Read(__int64 len, CAtlArray<SyncPoint>& sps);
+ bool Read(__int64 len, CStreamInfoMap& im);
+ bool Read(__int64 len, IDSMResourceBagImpl& res);
+ bool Read(__int64 len, IDSMChapterBagImpl& chap);
+ __int64 Read(__int64 len, CStringW& str);
+
+ __int64 FindSyncPoint(REFERENCE_TIME rt);
};
diff --git a/src/filters/parser/FLVSplitter/FLVSplitter.cpp b/src/filters/parser/FLVSplitter/FLVSplitter.cpp
index f2d40b023..024757fd4 100644
--- a/src/filters/parser/FLVSplitter/FLVSplitter.cpp
+++ b/src/filters/parser/FLVSplitter/FLVSplitter.cpp
@@ -60,45 +60,45 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_FLV},
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_FLV},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
};
const AMOVIESETUP_MEDIATYPE sudPinTypesOut2[] = {
- {&MEDIATYPE_Video, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CFLVSplitterFilter), FlvSplitterName, MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CFLVSourceFilter), FlvSourceName, MERIT_NORMAL, 0, NULL, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CFLVSplitterFilter), FlvSplitterName, MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CFLVSourceFilter), FlvSourceName, MERIT_NORMAL, 0, NULL, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CFLVSplitterFilter>, NULL, &sudFilter[0]},
- {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CFLVSourceFilter>, NULL, &sudFilter[1]},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CFLVSplitterFilter>, NULL, &sudFilter[0]},
+ {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CFLVSourceFilter>, NULL, &sudFilter[1]},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- DeleteRegKey(_T("Media Type\\Extensions\\"), _T(".flv"));
+ DeleteRegKey(_T("Media Type\\Extensions\\"), _T(".flv"));
- RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_FLV, _T("0,4,,464C5601"), NULL);
+ RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_FLV, _T("0,4,,464C5601"), NULL);
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- UnRegisterSourceFilter(MEDIASUBTYPE_FLV);
+ UnRegisterSourceFilter(MEDIASUBTYPE_FLV);
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -112,792 +112,792 @@ CFilterApp theApp;
//
CFLVSplitterFilter::CFLVSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CBaseSplitterFilter(NAME("CFLVSplitterFilter"), pUnk, phr, __uuidof(this))
+ : CBaseSplitterFilter(NAME("CFLVSplitterFilter"), pUnk, phr, __uuidof(this))
{
}
STDMETHODIMP CFLVSplitterFilter::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
-
- if (m_pName && m_pName[0]==L'M' && m_pName[1]==L'P' && m_pName[2]==L'C') {
- (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
- } else {
- wcscpy_s(pInfo->achName, FlvSourceName);
- }
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+
+ if (m_pName && m_pName[0] == L'M' && m_pName[1] == L'P' && m_pName[2] == L'C') {
+ (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
+ } else {
+ wcscpy_s(pInfo->achName, FlvSourceName);
+ }
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
bool CFLVSplitterFilter::ReadTag(Tag& t)
{
- if (m_pFile->GetRemaining() < 15) {
- return false;
- }
-
- t.PreviousTagSize = (UINT32)m_pFile->BitRead(32);
- t.TagType = (BYTE)m_pFile->BitRead(8);
- t.DataSize = (UINT32)m_pFile->BitRead(24);
- t.TimeStamp = (UINT32)m_pFile->BitRead(24);
- t.TimeStamp |= (UINT32)m_pFile->BitRead(8) << 24;
- t.StreamID = (UINT32)m_pFile->BitRead(24);
-
- return m_pFile->GetRemaining() >= t.DataSize;
+ if (m_pFile->GetRemaining() < 15) {
+ return false;
+ }
+
+ t.PreviousTagSize = (UINT32)m_pFile->BitRead(32);
+ t.TagType = (BYTE)m_pFile->BitRead(8);
+ t.DataSize = (UINT32)m_pFile->BitRead(24);
+ t.TimeStamp = (UINT32)m_pFile->BitRead(24);
+ t.TimeStamp |= (UINT32)m_pFile->BitRead(8) << 24;
+ t.StreamID = (UINT32)m_pFile->BitRead(24);
+
+ return m_pFile->GetRemaining() >= t.DataSize;
}
bool CFLVSplitterFilter::ReadTag(AudioTag& at)
{
- if (!m_pFile->GetRemaining()) {
- return false;
- }
+ if (!m_pFile->GetRemaining()) {
+ return false;
+ }
- at.SoundFormat = (BYTE)m_pFile->BitRead(4);
- at.SoundRate = (BYTE)m_pFile->BitRead(2);
- at.SoundSize = (BYTE)m_pFile->BitRead(1);
- at.SoundType = (BYTE)m_pFile->BitRead(1);
+ at.SoundFormat = (BYTE)m_pFile->BitRead(4);
+ at.SoundRate = (BYTE)m_pFile->BitRead(2);
+ at.SoundSize = (BYTE)m_pFile->BitRead(1);
+ at.SoundType = (BYTE)m_pFile->BitRead(1);
- return true;
+ return true;
}
bool CFLVSplitterFilter::ReadTag(VideoTag& vt)
{
- if (!m_pFile->GetRemaining()) {
- return false;
- }
+ if (!m_pFile->GetRemaining()) {
+ return false;
+ }
- vt.FrameType = (BYTE)m_pFile->BitRead(4);
- vt.CodecID = (BYTE)m_pFile->BitRead(4);
+ vt.FrameType = (BYTE)m_pFile->BitRead(4);
+ vt.CodecID = (BYTE)m_pFile->BitRead(4);
- return true;
+ return true;
}
#ifndef NOVIDEOTWEAK
bool CFLVSplitterFilter::ReadTag(VideoTweak& vt)
{
- if (!m_pFile->GetRemaining()) {
- return false;
- }
+ if (!m_pFile->GetRemaining()) {
+ return false;
+ }
- vt.x = (BYTE)m_pFile->BitRead(4);
- vt.y = (BYTE)m_pFile->BitRead(4);
+ vt.x = (BYTE)m_pFile->BitRead(4);
+ vt.y = (BYTE)m_pFile->BitRead(4);
- return true;
+ return true;
}
#endif
bool CFLVSplitterFilter::Sync(__int64& pos)
{
- m_pFile->Seek(pos);
-
- while (m_pFile->GetRemaining() >= 15) {
- __int64 limit = m_pFile->GetRemaining();
- while (true) {
- BYTE b = (BYTE)m_pFile->BitRead(8);
- if (b == FLV_AUDIODATA || b == FLV_VIDEODATA) {
- break;
- }
- if (--limit < 15) {
- return false;
- }
- }
-
- pos = m_pFile->GetPos() - 5;
- m_pFile->Seek(pos);
-
- Tag ct;
- if (ReadTag(ct)) {
- __int64 next = m_pFile->GetPos() + ct.DataSize;
- if (next == m_pFile->GetLength() - 4) {
- m_pFile->Seek(pos);
- return true;
- } else if (next <= m_pFile->GetLength() - 19) {
- m_pFile->Seek(next);
- Tag nt;
- if (ReadTag(nt) && (nt.TagType == FLV_AUDIODATA || nt.TagType == FLV_VIDEODATA || nt.TagType == FLV_SCRIPTDATA)) {
- if ((nt.PreviousTagSize == ct.DataSize + 11) ||
- (m_IgnorePrevSizes &&
- nt.TimeStamp >= ct.TimeStamp &&
- nt.TimeStamp - ct.TimeStamp <= 1000)) {
- m_pFile->Seek(pos);
- return true;
- }
- }
- }
- }
-
- m_pFile->Seek(pos + 5);
- }
-
- return false;
+ m_pFile->Seek(pos);
+
+ while (m_pFile->GetRemaining() >= 15) {
+ __int64 limit = m_pFile->GetRemaining();
+ while (true) {
+ BYTE b = (BYTE)m_pFile->BitRead(8);
+ if (b == FLV_AUDIODATA || b == FLV_VIDEODATA) {
+ break;
+ }
+ if (--limit < 15) {
+ return false;
+ }
+ }
+
+ pos = m_pFile->GetPos() - 5;
+ m_pFile->Seek(pos);
+
+ Tag ct;
+ if (ReadTag(ct)) {
+ __int64 next = m_pFile->GetPos() + ct.DataSize;
+ if (next == m_pFile->GetLength() - 4) {
+ m_pFile->Seek(pos);
+ return true;
+ } else if (next <= m_pFile->GetLength() - 19) {
+ m_pFile->Seek(next);
+ Tag nt;
+ if (ReadTag(nt) && (nt.TagType == FLV_AUDIODATA || nt.TagType == FLV_VIDEODATA || nt.TagType == FLV_SCRIPTDATA)) {
+ if ((nt.PreviousTagSize == ct.DataSize + 11) ||
+ (m_IgnorePrevSizes &&
+ nt.TimeStamp >= ct.TimeStamp &&
+ nt.TimeStamp - ct.TimeStamp <= 1000)) {
+ m_pFile->Seek(pos);
+ return true;
+ }
+ }
+ }
+ }
+
+ m_pFile->Seek(pos + 5);
+ }
+
+ return false;
}
HRESULT CFLVSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
{
- CheckPointer(pAsyncReader, E_POINTER);
-
- HRESULT hr = E_FAIL;
-
- m_pFile.Free();
- m_pFile.Attach(DNew CBaseSplitterFileEx(pAsyncReader, hr, DEFAULT_CACHE_LENGTH, false));
- if (!m_pFile) {
- return E_OUTOFMEMORY;
- }
- if (FAILED(hr)) {
- m_pFile.Free();
- return hr;
- }
-
- m_rtNewStart = m_rtCurrent = 0;
- m_rtNewStop = m_rtStop = m_rtDuration = 0;
-
- if (m_pFile->BitRead(24) != 'FLV' || m_pFile->BitRead(8) != 1) {
- return E_FAIL;
- }
-
- EXECUTE_ASSERT(m_pFile->BitRead(5) == 0); // TypeFlagsReserved
- bool fTypeFlagsAudio = !!m_pFile->BitRead(1);
- EXECUTE_ASSERT(m_pFile->BitRead(1) == 0); // TypeFlagsReserved
- bool fTypeFlagsVideo = !!m_pFile->BitRead(1);
- m_DataOffset = (UINT32)m_pFile->BitRead(32);
-
- // doh, these flags aren't always telling the truth
- fTypeFlagsAudio = fTypeFlagsVideo = true;
-
- Tag t;
- AudioTag at;
- VideoTag vt;
-
- UINT32 prevTagSize = 0;
- m_IgnorePrevSizes = false;
-
- m_pFile->Seek(m_DataOffset);
-
- for (int i = 0; ReadTag(t) && (fTypeFlagsVideo || fTypeFlagsAudio); i++) {
- if (!t.DataSize) continue; // skip empty Tag
-
- UINT64 next = m_pFile->GetPos() + t.DataSize;
-
- CStringW name;
-
- CMediaType mt;
- CMediaType ff_mtype;
- mt.SetSampleSize(1);
- mt.subtype = GUID_NULL;
-
- if (i != 0 && t.PreviousTagSize != prevTagSize) {
- m_IgnorePrevSizes = true;
- }
- prevTagSize = t.DataSize + 11;
-
- if (t.TagType == FLV_AUDIODATA && t.DataSize != 0 && fTypeFlagsAudio) {
- UNREFERENCED_PARAMETER(at);
- AudioTag at;
- name = L"Audio";
-
- if (ReadTag(at)) {
- int dataSize = t.DataSize - 1;
-
- fTypeFlagsAudio = false;
-
- mt.majortype = MEDIATYPE_Audio;
- mt.formattype = FORMAT_WaveFormatEx;
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX));
- memset(wfe, 0, sizeof(WAVEFORMATEX));
- wfe->nSamplesPerSec = 44100*(1<<at.SoundRate)/8;
- wfe->wBitsPerSample = 8*(at.SoundSize+1);
- wfe->nChannels = at.SoundType+1;
-
- switch (at.SoundFormat) {
- case FLV_AUDIO_PCM:
- case FLV_AUDIO_PCMLE:
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_PCM);
- name += L" PCM";
- break;
- case FLV_AUDIO_ADPCM:
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_ADPCM_SWF);
- name += L" ADPCM";
- break;
- case FLV_AUDIO_MP3:
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_MP3);
- name += L" MP3";
-
- {
- CBaseSplitterFileEx::mpahdr h;
- CMediaType mt2;
- if (m_pFile->Read(h, 4, false, &mt2)) {
- mt = mt2;
- }
- }
- break;
- case FLV_AUDIO_NELLY16:
- mt.subtype = FOURCCMap(MAKEFOURCC('N','E','L','L'));
- wfe->nSamplesPerSec = 16000;
- name += L" Nellimoser";
- break;
- case FLV_AUDIO_NELLY8:
- mt.subtype = FOURCCMap(MAKEFOURCC('N','E','L','L'));
- wfe->nSamplesPerSec = 8000;
- name += L" Nellimoser";
- break;
- case FLV_AUDIO_NELLY:
- mt.subtype = FOURCCMap(MAKEFOURCC('N','E','L','L'));
- name += L" Nellimoser";
- break;
- case FLV_AUDIO_AAC: {
- if (dataSize < 1 || m_pFile->BitRead(8) != 0) { // packet type 0 == aac header
- fTypeFlagsAudio = true;
- break;
- }
- name += L" AAC";
-
- const int sampleRates[] = {
- 96000, 88200, 64000, 48000, 44100, 32000, 24000,
- 22050, 16000, 12000, 11025, 8000, 7350
- };
- const int channels[] = {
- 0, 1, 2, 3, 4, 5, 6, 8
- };
-
- __int64 configOffset = m_pFile->GetPos();
- UINT32 configSize = dataSize - 1;
- if (configSize < 2) {
- break;
- }
-
- // Might break depending on the AAC profile, see ff_mpeg4audio_get_config in ffmpeg's mpeg4audio.c
- m_pFile->BitRead(5);
- int iSampleRate = (int)m_pFile->BitRead(4);
- int iChannels = (int)m_pFile->BitRead(4);
- if (iSampleRate > 12 || iChannels > 7) {
- break;
- }
-
- wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX) + configSize);
- memset(wfe, 0, mt.FormatLength());
- wfe->nSamplesPerSec = sampleRates[iSampleRate];
- wfe->wBitsPerSample = 16;
- wfe->nChannels = channels[iChannels];
- wfe->cbSize = configSize;
-
- m_pFile->Seek(configOffset);
- m_pFile->ByteRead((BYTE*)(wfe+1), configSize);
-
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_AAC);
- }
-
- }
- }
- } else if (t.TagType == FLV_VIDEODATA && t.DataSize != 0 && fTypeFlagsVideo) {
- UNREFERENCED_PARAMETER(vt);
- VideoTag vt;
- if (ReadTag(vt) && vt.FrameType == 1) {
- int dataSize = t.DataSize - 1;
-
- fTypeFlagsVideo = false;
- name = L"Video";
-
- mt.majortype = MEDIATYPE_Video;
- mt.formattype = FORMAT_VideoInfo;
- VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
- memset(vih, 0, sizeof(VIDEOINFOHEADER));
-
- BITMAPINFOHEADER* bih = &vih->bmiHeader;
-
- int w, h, arx, ary;
-
- switch (vt.CodecID) {
- case FLV_VIDEO_H263: // H.263
- if (m_pFile->BitRead(17) != 1) {
- break;
- }
-
- m_pFile->BitRead(13); // Version (5), TemporalReference (8)
-
- switch (BYTE PictureSize = (BYTE)m_pFile->BitRead(3)) { // w00t
- case 0:
- case 1:
- vih->bmiHeader.biWidth = (WORD)m_pFile->BitRead(8*(PictureSize+1));
- vih->bmiHeader.biHeight = (WORD)m_pFile->BitRead(8*(PictureSize+1));
- break;
- case 2:
- case 3:
- case 4:
- vih->bmiHeader.biWidth = 704 / PictureSize;
- vih->bmiHeader.biHeight = 576 / PictureSize;
- break;
- case 5:
- case 6:
- PictureSize -= 3;
- vih->bmiHeader.biWidth = 640 / PictureSize;
- vih->bmiHeader.biHeight = 480 / PictureSize;
- break;
- }
-
- if (!vih->bmiHeader.biWidth || !vih->bmiHeader.biHeight) {
- break;
- }
-
- mt.subtype = FOURCCMap(vih->bmiHeader.biCompression = '1VLF');
- name += L" H.263";
-
- break;
- case FLV_VIDEO_SCREEN: {
- m_pFile->BitRead(4);
- vih->bmiHeader.biWidth = (LONG)m_pFile->BitRead(12);
- m_pFile->BitRead(4);
- vih->bmiHeader.biHeight = (LONG)m_pFile->BitRead(12);
-
- if (!vih->bmiHeader.biWidth || !vih->bmiHeader.biHeight) {
- break;
- }
-
- vih->bmiHeader.biSize = sizeof(vih->bmiHeader);
- vih->bmiHeader.biPlanes = 1;
- vih->bmiHeader.biBitCount = 24;
- vih->bmiHeader.biSizeImage = vih->bmiHeader.biWidth * vih->bmiHeader.biHeight * 3;
-
- mt.subtype = FOURCCMap(vih->bmiHeader.biCompression = '1VSF');
- name += L" Screen";
-
- break;
- }
- case FLV_VIDEO_VP6A: // VP6 with alpha
- m_pFile->BitRead(24);
- case FLV_VIDEO_VP6: { // VP6
+ CheckPointer(pAsyncReader, E_POINTER);
+
+ HRESULT hr = E_FAIL;
+
+ m_pFile.Free();
+ m_pFile.Attach(DNew CBaseSplitterFileEx(pAsyncReader, hr, DEFAULT_CACHE_LENGTH, false));
+ if (!m_pFile) {
+ return E_OUTOFMEMORY;
+ }
+ if (FAILED(hr)) {
+ m_pFile.Free();
+ return hr;
+ }
+
+ m_rtNewStart = m_rtCurrent = 0;
+ m_rtNewStop = m_rtStop = m_rtDuration = 0;
+
+ if (m_pFile->BitRead(24) != 'FLV' || m_pFile->BitRead(8) != 1) {
+ return E_FAIL;
+ }
+
+ EXECUTE_ASSERT(m_pFile->BitRead(5) == 0); // TypeFlagsReserved
+ bool fTypeFlagsAudio = !!m_pFile->BitRead(1);
+ EXECUTE_ASSERT(m_pFile->BitRead(1) == 0); // TypeFlagsReserved
+ bool fTypeFlagsVideo = !!m_pFile->BitRead(1);
+ m_DataOffset = (UINT32)m_pFile->BitRead(32);
+
+ // doh, these flags aren't always telling the truth
+ fTypeFlagsAudio = fTypeFlagsVideo = true;
+
+ Tag t;
+ AudioTag at;
+ VideoTag vt;
+
+ UINT32 prevTagSize = 0;
+ m_IgnorePrevSizes = false;
+
+ m_pFile->Seek(m_DataOffset);
+
+ for (int i = 0; ReadTag(t) && (fTypeFlagsVideo || fTypeFlagsAudio); i++) {
+ if (!t.DataSize) { continue; } // skip empty Tag
+
+ UINT64 next = m_pFile->GetPos() + t.DataSize;
+
+ CStringW name;
+
+ CMediaType mt;
+ CMediaType ff_mtype;
+ mt.SetSampleSize(1);
+ mt.subtype = GUID_NULL;
+
+ if (i != 0 && t.PreviousTagSize != prevTagSize) {
+ m_IgnorePrevSizes = true;
+ }
+ prevTagSize = t.DataSize + 11;
+
+ if (t.TagType == FLV_AUDIODATA && t.DataSize != 0 && fTypeFlagsAudio) {
+ UNREFERENCED_PARAMETER(at);
+ AudioTag at;
+ name = L"Audio";
+
+ if (ReadTag(at)) {
+ int dataSize = t.DataSize - 1;
+
+ fTypeFlagsAudio = false;
+
+ mt.majortype = MEDIATYPE_Audio;
+ mt.formattype = FORMAT_WaveFormatEx;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX));
+ memset(wfe, 0, sizeof(WAVEFORMATEX));
+ wfe->nSamplesPerSec = 44100 * (1 << at.SoundRate) / 8;
+ wfe->wBitsPerSample = 8 * (at.SoundSize + 1);
+ wfe->nChannels = at.SoundType + 1;
+
+ switch (at.SoundFormat) {
+ case FLV_AUDIO_PCM:
+ case FLV_AUDIO_PCMLE:
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_PCM);
+ name += L" PCM";
+ break;
+ case FLV_AUDIO_ADPCM:
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_ADPCM_SWF);
+ name += L" ADPCM";
+ break;
+ case FLV_AUDIO_MP3:
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_MP3);
+ name += L" MP3";
+
+ {
+ CBaseSplitterFileEx::mpahdr h;
+ CMediaType mt2;
+ if (m_pFile->Read(h, 4, false, &mt2)) {
+ mt = mt2;
+ }
+ }
+ break;
+ case FLV_AUDIO_NELLY16:
+ mt.subtype = FOURCCMap(MAKEFOURCC('N', 'E', 'L', 'L'));
+ wfe->nSamplesPerSec = 16000;
+ name += L" Nellimoser";
+ break;
+ case FLV_AUDIO_NELLY8:
+ mt.subtype = FOURCCMap(MAKEFOURCC('N', 'E', 'L', 'L'));
+ wfe->nSamplesPerSec = 8000;
+ name += L" Nellimoser";
+ break;
+ case FLV_AUDIO_NELLY:
+ mt.subtype = FOURCCMap(MAKEFOURCC('N', 'E', 'L', 'L'));
+ name += L" Nellimoser";
+ break;
+ case FLV_AUDIO_AAC: {
+ if (dataSize < 1 || m_pFile->BitRead(8) != 0) { // packet type 0 == aac header
+ fTypeFlagsAudio = true;
+ break;
+ }
+ name += L" AAC";
+
+ const int sampleRates[] = {
+ 96000, 88200, 64000, 48000, 44100, 32000, 24000,
+ 22050, 16000, 12000, 11025, 8000, 7350
+ };
+ const int channels[] = {
+ 0, 1, 2, 3, 4, 5, 6, 8
+ };
+
+ __int64 configOffset = m_pFile->GetPos();
+ UINT32 configSize = dataSize - 1;
+ if (configSize < 2) {
+ break;
+ }
+
+ // Might break depending on the AAC profile, see ff_mpeg4audio_get_config in ffmpeg's mpeg4audio.c
+ m_pFile->BitRead(5);
+ int iSampleRate = (int)m_pFile->BitRead(4);
+ int iChannels = (int)m_pFile->BitRead(4);
+ if (iSampleRate > 12 || iChannels > 7) {
+ break;
+ }
+
+ wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX) + configSize);
+ memset(wfe, 0, mt.FormatLength());
+ wfe->nSamplesPerSec = sampleRates[iSampleRate];
+ wfe->wBitsPerSample = 16;
+ wfe->nChannels = channels[iChannels];
+ wfe->cbSize = configSize;
+
+ m_pFile->Seek(configOffset);
+ m_pFile->ByteRead((BYTE*)(wfe + 1), configSize);
+
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_AAC);
+ }
+
+ }
+ }
+ } else if (t.TagType == FLV_VIDEODATA && t.DataSize != 0 && fTypeFlagsVideo) {
+ UNREFERENCED_PARAMETER(vt);
+ VideoTag vt;
+ if (ReadTag(vt) && vt.FrameType == 1) {
+ int dataSize = t.DataSize - 1;
+
+ fTypeFlagsVideo = false;
+ name = L"Video";
+
+ mt.majortype = MEDIATYPE_Video;
+ mt.formattype = FORMAT_VideoInfo;
+ VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
+ memset(vih, 0, sizeof(VIDEOINFOHEADER));
+
+ BITMAPINFOHEADER* bih = &vih->bmiHeader;
+
+ int w, h, arx, ary;
+
+ switch (vt.CodecID) {
+ case FLV_VIDEO_H263: // H.263
+ if (m_pFile->BitRead(17) != 1) {
+ break;
+ }
+
+ m_pFile->BitRead(13); // Version (5), TemporalReference (8)
+
+ switch (BYTE PictureSize = (BYTE)m_pFile->BitRead(3)) { // w00t
+ case 0:
+ case 1:
+ vih->bmiHeader.biWidth = (WORD)m_pFile->BitRead(8 * (PictureSize + 1));
+ vih->bmiHeader.biHeight = (WORD)m_pFile->BitRead(8 * (PictureSize + 1));
+ break;
+ case 2:
+ case 3:
+ case 4:
+ vih->bmiHeader.biWidth = 704 / PictureSize;
+ vih->bmiHeader.biHeight = 576 / PictureSize;
+ break;
+ case 5:
+ case 6:
+ PictureSize -= 3;
+ vih->bmiHeader.biWidth = 640 / PictureSize;
+ vih->bmiHeader.biHeight = 480 / PictureSize;
+ break;
+ }
+
+ if (!vih->bmiHeader.biWidth || !vih->bmiHeader.biHeight) {
+ break;
+ }
+
+ mt.subtype = FOURCCMap(vih->bmiHeader.biCompression = '1VLF');
+ name += L" H.263";
+
+ break;
+ case FLV_VIDEO_SCREEN: {
+ m_pFile->BitRead(4);
+ vih->bmiHeader.biWidth = (LONG)m_pFile->BitRead(12);
+ m_pFile->BitRead(4);
+ vih->bmiHeader.biHeight = (LONG)m_pFile->BitRead(12);
+
+ if (!vih->bmiHeader.biWidth || !vih->bmiHeader.biHeight) {
+ break;
+ }
+
+ vih->bmiHeader.biSize = sizeof(vih->bmiHeader);
+ vih->bmiHeader.biPlanes = 1;
+ vih->bmiHeader.biBitCount = 24;
+ vih->bmiHeader.biSizeImage = vih->bmiHeader.biWidth * vih->bmiHeader.biHeight * 3;
+
+ mt.subtype = FOURCCMap(vih->bmiHeader.biCompression = '1VSF');
+ name += L" Screen";
+
+ break;
+ }
+ case FLV_VIDEO_VP6A: // VP6 with alpha
+ m_pFile->BitRead(24);
+ case FLV_VIDEO_VP6: { // VP6
#ifdef NOVIDEOTWEAK
- m_pFile->BitRead(8);
+ m_pFile->BitRead(8);
#else
- VideoTweak fudge;
- ReadTag(fudge);
+ VideoTweak fudge;
+ ReadTag(fudge);
#endif
- if (m_pFile->BitRead(1)) {
- // Delta (inter) frame
- fTypeFlagsVideo = true;
- break;
- }
- m_pFile->BitRead(6);
- bool fSeparatedCoeff = !!m_pFile->BitRead(1);
- m_pFile->BitRead(5);
- int filterHeader = (int)m_pFile->BitRead(2);
- m_pFile->BitRead(1);
- if (fSeparatedCoeff || !filterHeader) {
- m_pFile->BitRead(16);
- }
-
- h = (int)m_pFile->BitRead(8) * 16;
- w = (int)m_pFile->BitRead(8) * 16;
-
- ary = (int)m_pFile->BitRead(8) * 16;
- arx = (int)m_pFile->BitRead(8) * 16;
-
- if (arx && arx != w || ary && ary != h) {
- VIDEOINFOHEADER2* vih2 = (VIDEOINFOHEADER2*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER2));
- memset(vih2, 0, sizeof(VIDEOINFOHEADER2));
- vih2->dwPictAspectRatioX = arx;
- vih2->dwPictAspectRatioY = ary;
- bih = &vih2->bmiHeader;
- mt.formattype = FORMAT_VideoInfo2;
- vih = (VIDEOINFOHEADER *)vih2;
- }
-
- bih->biWidth = w;
- bih->biHeight = h;
+ if (m_pFile->BitRead(1)) {
+ // Delta (inter) frame
+ fTypeFlagsVideo = true;
+ break;
+ }
+ m_pFile->BitRead(6);
+ bool fSeparatedCoeff = !!m_pFile->BitRead(1);
+ m_pFile->BitRead(5);
+ int filterHeader = (int)m_pFile->BitRead(2);
+ m_pFile->BitRead(1);
+ if (fSeparatedCoeff || !filterHeader) {
+ m_pFile->BitRead(16);
+ }
+
+ h = (int)m_pFile->BitRead(8) * 16;
+ w = (int)m_pFile->BitRead(8) * 16;
+
+ ary = (int)m_pFile->BitRead(8) * 16;
+ arx = (int)m_pFile->BitRead(8) * 16;
+
+ if (arx && arx != w || ary && ary != h) {
+ VIDEOINFOHEADER2* vih2 = (VIDEOINFOHEADER2*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER2));
+ memset(vih2, 0, sizeof(VIDEOINFOHEADER2));
+ vih2->dwPictAspectRatioX = arx;
+ vih2->dwPictAspectRatioY = ary;
+ bih = &vih2->bmiHeader;
+ mt.formattype = FORMAT_VideoInfo2;
+ vih = (VIDEOINFOHEADER*)vih2;
+ }
+
+ bih->biWidth = w;
+ bih->biHeight = h;
#ifndef NOVIDEOTWEAK
- SetRect(&vih->rcSource, 0, 0, w - fudge.x, h - fudge.y);
- SetRect(&vih->rcTarget, 0, 0, w - fudge.x, h - fudge.y);
+ SetRect(&vih->rcSource, 0, 0, w - fudge.x, h - fudge.y);
+ SetRect(&vih->rcTarget, 0, 0, w - fudge.x, h - fudge.y);
#endif
- mt.subtype = FOURCCMap(bih->biCompression = '4VLF');
- name += L" VP6";
-
- break;
- }
- case FLV_VIDEO_AVC: { // H.264
- if (dataSize < 4 || m_pFile->BitRead(8) != 0) { // packet type 0 == avc header
- fTypeFlagsVideo = true;
- break;
- }
- m_pFile->BitRead(24); // composition time
-
- __int64 headerOffset = m_pFile->GetPos();
- UINT32 headerSize = dataSize - 4;
- BYTE *headerData = DNew BYTE[headerSize];
-
- m_pFile->ByteRead(headerData, headerSize);
-
- m_pFile->Seek(headerOffset + 9);
-
- mt.formattype = FORMAT_MPEG2Video;
- MPEG2VIDEOINFO* vih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + headerSize);
- memset(vih, 0, mt.FormatLength());
- vih->hdr.bmiHeader.biSize = sizeof(vih->hdr.bmiHeader);
- vih->hdr.bmiHeader.biPlanes = 1;
- vih->hdr.bmiHeader.biBitCount = 24;
- vih->dwFlags = (headerData[4] & 0x03) + 1; // nal length size
-
- vih->dwProfile = (BYTE)m_pFile->BitRead(8);
- m_pFile->BitRead(8);
- vih->dwLevel = (BYTE)m_pFile->BitRead(8);
- m_pFile->UExpGolombRead(); // seq_parameter_set_id
- UINT64 chroma_format_idc = 0;
- if (vih->dwProfile >= 100) { // high profile
- chroma_format_idc = m_pFile->UExpGolombRead();
- if (chroma_format_idc == 3) { // chroma_format_idc
- m_pFile->BitRead(1); // residue_transform_flag
- }
- m_pFile->UExpGolombRead(); // bit_depth_luma_minus8
- m_pFile->UExpGolombRead(); // bit_depth_chroma_minus8
- m_pFile->BitRead(1); // qpprime_y_zero_transform_bypass_flag
- if (m_pFile->BitRead(1)) // seq_scaling_matrix_present_flag
- for (int i = 0; i < 8; i++)
- if (m_pFile->BitRead(1)) // seq_scaling_list_present_flag
- for (int j = 0, size = i < 6 ? 16 : 64, next = 8; j < size && next != 0; ++j) {
- next = (next + m_pFile->SExpGolombRead() + 256) & 255;
- }
- }
- m_pFile->UExpGolombRead(); // log2_max_frame_num_minus4
- UINT64 pic_order_cnt_type = m_pFile->UExpGolombRead();
- if (pic_order_cnt_type == 0) {
- m_pFile->UExpGolombRead(); // log2_max_pic_order_cnt_lsb_minus4
- } else if (pic_order_cnt_type == 1) {
- m_pFile->BitRead(1); // delta_pic_order_always_zero_flag
- m_pFile->SExpGolombRead(); // offset_for_non_ref_pic
- m_pFile->SExpGolombRead(); // offset_for_top_to_bottom_field
- UINT64 num_ref_frames_in_pic_order_cnt_cycle = m_pFile->UExpGolombRead();
- for (int i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {
- m_pFile->SExpGolombRead(); // offset_for_ref_frame[i]
- }
- }
- m_pFile->UExpGolombRead(); // num_ref_frames
- m_pFile->BitRead(1); // gaps_in_frame_num_value_allowed_flag
- UINT64 pic_width_in_mbs_minus1 = m_pFile->UExpGolombRead();
- UINT64 pic_height_in_map_units_minus1 = m_pFile->UExpGolombRead();
- BYTE frame_mbs_only_flag = (BYTE)m_pFile->BitRead(1);
- if (!frame_mbs_only_flag) {
- m_pFile->BitRead(1); // mb_adaptive_frame_field_flag
- }
- m_pFile->BitRead(1); // direct_8x8_inference_flag
- BYTE crop = (BYTE)m_pFile->BitRead(1); // frame_cropping_flag
- unsigned int crop_left = 0;
- unsigned int crop_right = 0;
- unsigned int crop_top = 0;
- unsigned int crop_bottom = 0;
-
- if (crop) {
- crop_left = (unsigned int)m_pFile->UExpGolombRead(); // frame_cropping_rect_left_offset
- crop_right = (unsigned int)m_pFile->UExpGolombRead(); // frame_cropping_rect_right_offset
- crop_top = (unsigned int)m_pFile->UExpGolombRead(); // frame_cropping_rect_top_offset
- crop_bottom = (unsigned int)m_pFile->UExpGolombRead(); // frame_cropping_rect_bottom_offset
- }
- struct sar {
- WORD num;
- WORD den;
- } sar;
-
- if (m_pFile->BitRead(1)) { // vui_parameters_present_flag
- if (m_pFile->BitRead(1)) { // aspect_ratio_info_present_flag
- BYTE aspect_ratio_idc = (BYTE)m_pFile->BitRead(8); // aspect_ratio_idc
- if (255 == aspect_ratio_idc) {
- sar.num = (WORD)m_pFile->BitRead(16); // sar_width
- sar.den = (WORD)m_pFile->BitRead(16); // sar_height
- } else if (aspect_ratio_idc < 17) {
- sar.num = pixel_aspect[aspect_ratio_idc][0];
- sar.den = pixel_aspect[aspect_ratio_idc][1];
- } else {
- return false;
- }
- } else {
- sar.num = 1;
- sar.den = 1;
- }
- }
- unsigned int mb_Width = (unsigned int)pic_width_in_mbs_minus1 + 1;
- unsigned int mb_Height = ((unsigned int)pic_height_in_map_units_minus1 + 1) * (2 - frame_mbs_only_flag);
- BYTE CHROMA444 = (chroma_format_idc == 3);
-
- unsigned int Width, Height;
- Width = 16 * mb_Width - (2u>>CHROMA444) * min(crop_right, (8u<<CHROMA444)-1);
- if (frame_mbs_only_flag) {
- Height = 16 * mb_Height - (2u>>CHROMA444) * min(crop_bottom, (8u<<CHROMA444)-1);
- } else {
- Height = 16 * mb_Height - (4u>>CHROMA444) * min(crop_bottom, (8u<<CHROMA444)-1);
- }
- if (!sar.num) sar.num = 1;
- if (!sar.den) sar.den = 1;
- CSize aspect(Width * sar.num, Height * sar.den);
- int lnko = LNKO(aspect.cx, aspect.cy);
- if (lnko > 1) {
- aspect.cx /= lnko, aspect.cy /= lnko;
- }
-
- vih->hdr.dwPictAspectRatioX = aspect.cx;
- vih->hdr.dwPictAspectRatioY = aspect.cy;
- vih->hdr.bmiHeader.biWidth = Width;
- vih->hdr.bmiHeader.biHeight = Height;
-
- BYTE* src = (BYTE*)headerData + 5;
- BYTE* dst = (BYTE*)vih->dwSequenceHeader;
- BYTE* src_end = (BYTE*)headerData + headerSize;
- BYTE* dst_end = (BYTE*)vih->dwSequenceHeader + headerSize;
- int spsCount = *(src++) & 0x1F;
- int ppsCount = -1;
-
- vih->cbSequenceHeader = 0;
-
- while (src < src_end - 1) {
- if (spsCount == 0 && ppsCount == -1) {
- ppsCount = *(src++);
- continue;
- }
-
- if (spsCount > 0) {
- spsCount--;
- } else if (ppsCount > 0) {
- ppsCount--;
- } else {
- break;
- }
-
- int len = ((src[0] << 8) | src[1]) + 2;
- if (src + len > src_end || dst + len > dst_end) {
- ASSERT(0);
- break;
- }
- memcpy(dst, src, len);
- src += len;
- dst += len;
- vih->cbSequenceHeader += len;
- }
-
- delete[] headerData;
-
- mt.subtype = FOURCCMap(vih->hdr.bmiHeader.biCompression = '1CVA');
- name += L" H.264";
-
- break;
- }
- default:
- fTypeFlagsVideo = true;
- }
- }
- }
-
- 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)));
- }
-
- m_pFile->Seek(next);
- }
-
- if (m_pFile->IsRandomAccess()) {
- __int64 pos = max(m_DataOffset, m_pFile->GetLength() - 256 * 1024);
-
- if (Sync(pos)) {
- Tag t;
- AudioTag at;
- VideoTag vt;
-
- while (ReadTag(t)) {
- UINT64 next = m_pFile->GetPos() + t.DataSize;
-
- if (t.TagType == FLV_AUDIODATA && ReadTag(at) || t.TagType == FLV_VIDEODATA && ReadTag(vt)) {
- m_rtDuration = max(m_rtDuration, 10000i64 * t.TimeStamp);
- }
-
- m_pFile->Seek(next);
- }
- }
- }
-
- m_rtNewStop = m_rtStop = m_rtDuration;
-
- return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
+ mt.subtype = FOURCCMap(bih->biCompression = '4VLF');
+ name += L" VP6";
+
+ break;
+ }
+ case FLV_VIDEO_AVC: { // H.264
+ if (dataSize < 4 || m_pFile->BitRead(8) != 0) { // packet type 0 == avc header
+ fTypeFlagsVideo = true;
+ break;
+ }
+ m_pFile->BitRead(24); // composition time
+
+ __int64 headerOffset = m_pFile->GetPos();
+ UINT32 headerSize = dataSize - 4;
+ BYTE* headerData = DNew BYTE[headerSize];
+
+ m_pFile->ByteRead(headerData, headerSize);
+
+ m_pFile->Seek(headerOffset + 9);
+
+ mt.formattype = FORMAT_MPEG2Video;
+ MPEG2VIDEOINFO* vih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + headerSize);
+ memset(vih, 0, mt.FormatLength());
+ vih->hdr.bmiHeader.biSize = sizeof(vih->hdr.bmiHeader);
+ vih->hdr.bmiHeader.biPlanes = 1;
+ vih->hdr.bmiHeader.biBitCount = 24;
+ vih->dwFlags = (headerData[4] & 0x03) + 1; // nal length size
+
+ vih->dwProfile = (BYTE)m_pFile->BitRead(8);
+ m_pFile->BitRead(8);
+ vih->dwLevel = (BYTE)m_pFile->BitRead(8);
+ m_pFile->UExpGolombRead(); // seq_parameter_set_id
+ UINT64 chroma_format_idc = 0;
+ if (vih->dwProfile >= 100) { // high profile
+ chroma_format_idc = m_pFile->UExpGolombRead();
+ if (chroma_format_idc == 3) { // chroma_format_idc
+ m_pFile->BitRead(1); // residue_transform_flag
+ }
+ m_pFile->UExpGolombRead(); // bit_depth_luma_minus8
+ m_pFile->UExpGolombRead(); // bit_depth_chroma_minus8
+ m_pFile->BitRead(1); // qpprime_y_zero_transform_bypass_flag
+ if (m_pFile->BitRead(1)) // seq_scaling_matrix_present_flag
+ for (int i = 0; i < 8; i++)
+ if (m_pFile->BitRead(1)) // seq_scaling_list_present_flag
+ for (int j = 0, size = i < 6 ? 16 : 64, next = 8; j < size && next != 0; ++j) {
+ next = (next + m_pFile->SExpGolombRead() + 256) & 255;
+ }
+ }
+ m_pFile->UExpGolombRead(); // log2_max_frame_num_minus4
+ UINT64 pic_order_cnt_type = m_pFile->UExpGolombRead();
+ if (pic_order_cnt_type == 0) {
+ m_pFile->UExpGolombRead(); // log2_max_pic_order_cnt_lsb_minus4
+ } else if (pic_order_cnt_type == 1) {
+ m_pFile->BitRead(1); // delta_pic_order_always_zero_flag
+ m_pFile->SExpGolombRead(); // offset_for_non_ref_pic
+ m_pFile->SExpGolombRead(); // offset_for_top_to_bottom_field
+ UINT64 num_ref_frames_in_pic_order_cnt_cycle = m_pFile->UExpGolombRead();
+ for (int i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {
+ m_pFile->SExpGolombRead(); // offset_for_ref_frame[i]
+ }
+ }
+ m_pFile->UExpGolombRead(); // num_ref_frames
+ m_pFile->BitRead(1); // gaps_in_frame_num_value_allowed_flag
+ UINT64 pic_width_in_mbs_minus1 = m_pFile->UExpGolombRead();
+ UINT64 pic_height_in_map_units_minus1 = m_pFile->UExpGolombRead();
+ BYTE frame_mbs_only_flag = (BYTE)m_pFile->BitRead(1);
+ if (!frame_mbs_only_flag) {
+ m_pFile->BitRead(1); // mb_adaptive_frame_field_flag
+ }
+ m_pFile->BitRead(1); // direct_8x8_inference_flag
+ BYTE crop = (BYTE)m_pFile->BitRead(1); // frame_cropping_flag
+ unsigned int crop_left = 0;
+ unsigned int crop_right = 0;
+ unsigned int crop_top = 0;
+ unsigned int crop_bottom = 0;
+
+ if (crop) {
+ crop_left = (unsigned int)m_pFile->UExpGolombRead(); // frame_cropping_rect_left_offset
+ crop_right = (unsigned int)m_pFile->UExpGolombRead(); // frame_cropping_rect_right_offset
+ crop_top = (unsigned int)m_pFile->UExpGolombRead(); // frame_cropping_rect_top_offset
+ crop_bottom = (unsigned int)m_pFile->UExpGolombRead(); // frame_cropping_rect_bottom_offset
+ }
+ struct sar {
+ WORD num;
+ WORD den;
+ } sar;
+
+ if (m_pFile->BitRead(1)) { // vui_parameters_present_flag
+ if (m_pFile->BitRead(1)) { // aspect_ratio_info_present_flag
+ BYTE aspect_ratio_idc = (BYTE)m_pFile->BitRead(8); // aspect_ratio_idc
+ if (255 == aspect_ratio_idc) {
+ sar.num = (WORD)m_pFile->BitRead(16); // sar_width
+ sar.den = (WORD)m_pFile->BitRead(16); // sar_height
+ } else if (aspect_ratio_idc < 17) {
+ sar.num = pixel_aspect[aspect_ratio_idc][0];
+ sar.den = pixel_aspect[aspect_ratio_idc][1];
+ } else {
+ return false;
+ }
+ } else {
+ sar.num = 1;
+ sar.den = 1;
+ }
+ }
+ unsigned int mb_Width = (unsigned int)pic_width_in_mbs_minus1 + 1;
+ unsigned int mb_Height = ((unsigned int)pic_height_in_map_units_minus1 + 1) * (2 - frame_mbs_only_flag);
+ BYTE CHROMA444 = (chroma_format_idc == 3);
+
+ unsigned int Width, Height;
+ Width = 16 * mb_Width - (2u >> CHROMA444) * min(crop_right, (8u << CHROMA444) - 1);
+ if (frame_mbs_only_flag) {
+ Height = 16 * mb_Height - (2u >> CHROMA444) * min(crop_bottom, (8u << CHROMA444) - 1);
+ } else {
+ Height = 16 * mb_Height - (4u >> CHROMA444) * min(crop_bottom, (8u << CHROMA444) - 1);
+ }
+ if (!sar.num) { sar.num = 1; }
+ if (!sar.den) { sar.den = 1; }
+ CSize aspect(Width * sar.num, Height * sar.den);
+ int lnko = LNKO(aspect.cx, aspect.cy);
+ if (lnko > 1) {
+ aspect.cx /= lnko, aspect.cy /= lnko;
+ }
+
+ vih->hdr.dwPictAspectRatioX = aspect.cx;
+ vih->hdr.dwPictAspectRatioY = aspect.cy;
+ vih->hdr.bmiHeader.biWidth = Width;
+ vih->hdr.bmiHeader.biHeight = Height;
+
+ BYTE* src = (BYTE*)headerData + 5;
+ BYTE* dst = (BYTE*)vih->dwSequenceHeader;
+ BYTE* src_end = (BYTE*)headerData + headerSize;
+ BYTE* dst_end = (BYTE*)vih->dwSequenceHeader + headerSize;
+ int spsCount = *(src++) & 0x1F;
+ int ppsCount = -1;
+
+ vih->cbSequenceHeader = 0;
+
+ while (src < src_end - 1) {
+ if (spsCount == 0 && ppsCount == -1) {
+ ppsCount = *(src++);
+ continue;
+ }
+
+ if (spsCount > 0) {
+ spsCount--;
+ } else if (ppsCount > 0) {
+ ppsCount--;
+ } else {
+ break;
+ }
+
+ int len = ((src[0] << 8) | src[1]) + 2;
+ if (src + len > src_end || dst + len > dst_end) {
+ ASSERT(0);
+ break;
+ }
+ memcpy(dst, src, len);
+ src += len;
+ dst += len;
+ vih->cbSequenceHeader += len;
+ }
+
+ delete[] headerData;
+
+ mt.subtype = FOURCCMap(vih->hdr.bmiHeader.biCompression = '1CVA');
+ name += L" H.264";
+
+ break;
+ }
+ default:
+ fTypeFlagsVideo = true;
+ }
+ }
+ }
+
+ 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)));
+ }
+
+ m_pFile->Seek(next);
+ }
+
+ if (m_pFile->IsRandomAccess()) {
+ __int64 pos = max(m_DataOffset, m_pFile->GetLength() - 256 * 1024);
+
+ if (Sync(pos)) {
+ Tag t;
+ AudioTag at;
+ VideoTag vt;
+
+ while (ReadTag(t)) {
+ UINT64 next = m_pFile->GetPos() + t.DataSize;
+
+ if (t.TagType == FLV_AUDIODATA && ReadTag(at) || t.TagType == FLV_VIDEODATA && ReadTag(vt)) {
+ m_rtDuration = max(m_rtDuration, 10000i64 * t.TimeStamp);
+ }
+
+ m_pFile->Seek(next);
+ }
+ }
+ }
+
+ m_rtNewStop = m_rtStop = m_rtDuration;
+
+ return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
}
bool CFLVSplitterFilter::DemuxInit()
{
- SetThreadName((DWORD)-1, "CFLVSplitterFilter");
- return true;
+ SetThreadName((DWORD) - 1, "CFLVSplitterFilter");
+ return true;
}
void CFLVSplitterFilter::DemuxSeek(REFERENCE_TIME rt)
{
- if (!m_rtDuration || rt <= 0) {
- m_pFile->Seek(m_DataOffset);
- } else if (!m_IgnorePrevSizes) {
- NormalSeek(rt);
- } else {
- AlternateSeek(rt);
- }
+ if (!m_rtDuration || rt <= 0) {
+ m_pFile->Seek(m_DataOffset);
+ } else if (!m_IgnorePrevSizes) {
+ NormalSeek(rt);
+ } else {
+ AlternateSeek(rt);
+ }
}
void CFLVSplitterFilter::NormalSeek(REFERENCE_TIME rt)
{
- bool fAudio = !!GetOutputPin(FLV_AUDIODATA);
- bool fVideo = !!GetOutputPin(FLV_VIDEODATA);
-
- __int64 pos = m_DataOffset + (__int64)(double(m_pFile->GetLength() - m_DataOffset) * rt / m_rtDuration);
-
- if (!Sync(pos)) {
- ASSERT(0);
- m_pFile->Seek(m_DataOffset);
- return;
- }
-
- Tag t;
- AudioTag at;
- VideoTag vt;
-
- while (ReadTag(t)) {
- if (10000i64 * t.TimeStamp >= rt) {
- m_pFile->Seek(m_pFile->GetPos() - 15);
- break;
- }
-
- m_pFile->Seek(m_pFile->GetPos() + t.DataSize);
- }
-
- while (m_pFile->GetPos() >= m_DataOffset && (fAudio || fVideo) && ReadTag(t)) {
- UINT64 prev = m_pFile->GetPos() - 15 - t.PreviousTagSize - 4;
-
- if (10000i64 * t.TimeStamp <= rt) {
- if (t.TagType == FLV_AUDIODATA && ReadTag(at)) {
- fAudio = false;
- } else if (t.TagType == FLV_VIDEODATA && ReadTag(vt) && vt.FrameType == 1) {
- fVideo = false;
- }
- }
-
- m_pFile->Seek(prev);
- }
-
- if (fAudio || fVideo) {
- ASSERT(0);
- m_pFile->Seek(m_DataOffset);
- }
+ bool fAudio = !!GetOutputPin(FLV_AUDIODATA);
+ bool fVideo = !!GetOutputPin(FLV_VIDEODATA);
+
+ __int64 pos = m_DataOffset + (__int64)(double(m_pFile->GetLength() - m_DataOffset) * rt / m_rtDuration);
+
+ if (!Sync(pos)) {
+ ASSERT(0);
+ m_pFile->Seek(m_DataOffset);
+ return;
+ }
+
+ Tag t;
+ AudioTag at;
+ VideoTag vt;
+
+ while (ReadTag(t)) {
+ if (10000i64 * t.TimeStamp >= rt) {
+ m_pFile->Seek(m_pFile->GetPos() - 15);
+ break;
+ }
+
+ m_pFile->Seek(m_pFile->GetPos() + t.DataSize);
+ }
+
+ while (m_pFile->GetPos() >= m_DataOffset && (fAudio || fVideo) && ReadTag(t)) {
+ UINT64 prev = m_pFile->GetPos() - 15 - t.PreviousTagSize - 4;
+
+ if (10000i64 * t.TimeStamp <= rt) {
+ if (t.TagType == FLV_AUDIODATA && ReadTag(at)) {
+ fAudio = false;
+ } else if (t.TagType == FLV_VIDEODATA && ReadTag(vt) && vt.FrameType == 1) {
+ fVideo = false;
+ }
+ }
+
+ m_pFile->Seek(prev);
+ }
+
+ if (fAudio || fVideo) {
+ ASSERT(0);
+ m_pFile->Seek(m_DataOffset);
+ }
}
void CFLVSplitterFilter::AlternateSeek(REFERENCE_TIME rt)
{
- bool hasAudio = !!GetOutputPin(FLV_AUDIODATA);
- bool hasVideo = !!GetOutputPin(FLV_VIDEODATA);
-
- __int64 estimPos = m_DataOffset + (__int64)(double(m_pFile->GetLength() - m_DataOffset) * rt / m_rtDuration);
-
- while (true) {
- estimPos -= 256 * 1024;
- if (estimPos < m_DataOffset) estimPos = m_DataOffset;
-
- bool foundAudio = !hasAudio;
- bool foundVideo = !hasVideo;
- __int64 bestPos = estimPos;
-
- if (Sync(bestPos)) {
- Tag t;
- AudioTag at;
- VideoTag vt;
-
- while (ReadTag(t) && t.TimeStamp * 10000i64 < rt) {
- __int64 cur = m_pFile->GetPos() - 15;
- __int64 next = cur + 15 + t.DataSize;
-
- if (hasAudio && t.TagType == FLV_AUDIODATA && ReadTag(at)) {
- foundAudio = true;
- if (!hasVideo) {
- bestPos = cur;
- }
- } else if (hasVideo && t.TagType == FLV_VIDEODATA && ReadTag(vt) && vt.FrameType == 1) {
- foundVideo = true;
- bestPos = cur;
- }
-
- m_pFile->Seek(next);
- }
- }
-
- if (foundAudio && foundVideo) {
- m_pFile->Seek(bestPos);
- return;
- } else if (estimPos == m_DataOffset) {
- m_pFile->Seek(m_DataOffset);
- return;
- }
-
- }
+ bool hasAudio = !!GetOutputPin(FLV_AUDIODATA);
+ bool hasVideo = !!GetOutputPin(FLV_VIDEODATA);
+
+ __int64 estimPos = m_DataOffset + (__int64)(double(m_pFile->GetLength() - m_DataOffset) * rt / m_rtDuration);
+
+ while (true) {
+ estimPos -= 256 * 1024;
+ if (estimPos < m_DataOffset) { estimPos = m_DataOffset; }
+
+ bool foundAudio = !hasAudio;
+ bool foundVideo = !hasVideo;
+ __int64 bestPos = estimPos;
+
+ if (Sync(bestPos)) {
+ Tag t;
+ AudioTag at;
+ VideoTag vt;
+
+ while (ReadTag(t) && t.TimeStamp * 10000i64 < rt) {
+ __int64 cur = m_pFile->GetPos() - 15;
+ __int64 next = cur + 15 + t.DataSize;
+
+ if (hasAudio && t.TagType == FLV_AUDIODATA && ReadTag(at)) {
+ foundAudio = true;
+ if (!hasVideo) {
+ bestPos = cur;
+ }
+ } else if (hasVideo && t.TagType == FLV_VIDEODATA && ReadTag(vt) && vt.FrameType == 1) {
+ foundVideo = true;
+ bestPos = cur;
+ }
+
+ m_pFile->Seek(next);
+ }
+ }
+
+ if (foundAudio && foundVideo) {
+ m_pFile->Seek(bestPos);
+ return;
+ } else if (estimPos == m_DataOffset) {
+ m_pFile->Seek(m_DataOffset);
+ return;
+ }
+
+ }
}
bool CFLVSplitterFilter::DemuxLoop()
{
- HRESULT hr = S_OK;
-
- CAutoPtr<Packet> p;
-
- Tag t;
- AudioTag at = {};
- VideoTag vt = {};
-
- while (SUCCEEDED(hr) && !CheckRequest(NULL) && m_pFile->GetRemaining()) {
- if (!ReadTag(t)) {
- break;
- }
-
- __int64 next = m_pFile->GetPos() + t.DataSize;
-
- if ((t.DataSize > 0) && (t.TagType == FLV_AUDIODATA && ReadTag(at) || t.TagType == FLV_VIDEODATA && ReadTag(vt))) {
- UINT32 tsOffset = 0;
- if (t.TagType == FLV_VIDEODATA) {
- if (vt.FrameType == 5) {
- goto NextTag; // video info/command frame
- }
- if (vt.CodecID == FLV_VIDEO_VP6) {
- m_pFile->BitRead(8);
- } else if (vt.CodecID == FLV_VIDEO_VP6A) {
- m_pFile->BitRead(32);
- } else if (vt.CodecID == FLV_VIDEO_AVC) {
- if (m_pFile->BitRead(8) != 1) {
- goto NextTag;
- }
- // Tag timestamps specify decode time, this is the display time offset
- tsOffset = (UINT32)m_pFile->BitRead(24);
- tsOffset = (tsOffset + 0xff800000) ^ 0xff800000; // sign extension
- }
- }
- if (t.TagType == FLV_AUDIODATA && at.SoundFormat == FLV_AUDIO_AAC) {
- if (m_pFile->BitRead(8) != 1) {
- goto NextTag;
- }
- }
- __int64 dataSize = next - m_pFile->GetPos();
- if (dataSize <= 0) {
- goto NextTag;
- }
- p.Attach(DNew Packet());
- p->TrackNumber = t.TagType;
- p->rtStart = 10000i64 * (t.TimeStamp + tsOffset);
- p->rtStop = p->rtStart + 1;
- p->bSyncPoint = t.TagType == FLV_VIDEODATA ? vt.FrameType == 1 : true;
- p->SetCount((size_t)dataSize);
- m_pFile->ByteRead(p->GetData(), p->GetCount());
- hr = DeliverPacket(p);
- }
+ HRESULT hr = S_OK;
+
+ CAutoPtr<Packet> p;
+
+ Tag t;
+ AudioTag at = {};
+ VideoTag vt = {};
+
+ while (SUCCEEDED(hr) && !CheckRequest(NULL) && m_pFile->GetRemaining()) {
+ if (!ReadTag(t)) {
+ break;
+ }
+
+ __int64 next = m_pFile->GetPos() + t.DataSize;
+
+ if ((t.DataSize > 0) && (t.TagType == FLV_AUDIODATA && ReadTag(at) || t.TagType == FLV_VIDEODATA && ReadTag(vt))) {
+ UINT32 tsOffset = 0;
+ if (t.TagType == FLV_VIDEODATA) {
+ if (vt.FrameType == 5) {
+ goto NextTag; // video info/command frame
+ }
+ if (vt.CodecID == FLV_VIDEO_VP6) {
+ m_pFile->BitRead(8);
+ } else if (vt.CodecID == FLV_VIDEO_VP6A) {
+ m_pFile->BitRead(32);
+ } else if (vt.CodecID == FLV_VIDEO_AVC) {
+ if (m_pFile->BitRead(8) != 1) {
+ goto NextTag;
+ }
+ // Tag timestamps specify decode time, this is the display time offset
+ tsOffset = (UINT32)m_pFile->BitRead(24);
+ tsOffset = (tsOffset + 0xff800000) ^ 0xff800000; // sign extension
+ }
+ }
+ if (t.TagType == FLV_AUDIODATA && at.SoundFormat == FLV_AUDIO_AAC) {
+ if (m_pFile->BitRead(8) != 1) {
+ goto NextTag;
+ }
+ }
+ __int64 dataSize = next - m_pFile->GetPos();
+ if (dataSize <= 0) {
+ goto NextTag;
+ }
+ p.Attach(DNew Packet());
+ p->TrackNumber = t.TagType;
+ p->rtStart = 10000i64 * (t.TimeStamp + tsOffset);
+ p->rtStop = p->rtStart + 1;
+ p->bSyncPoint = t.TagType == FLV_VIDEODATA ? vt.FrameType == 1 : true;
+ p->SetCount((size_t)dataSize);
+ m_pFile->ByteRead(p->GetData(), p->GetCount());
+ hr = DeliverPacket(p);
+ }
NextTag:
- m_pFile->Seek(next);
- }
+ m_pFile->Seek(next);
+ }
- return true;
+ return true;
}
//
@@ -905,8 +905,8 @@ NextTag:
//
CFLVSourceFilter::CFLVSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CFLVSplitterFilter(pUnk, phr)
+ : CFLVSplitterFilter(pUnk, phr)
{
- m_clsid = __uuidof(this);
- m_pInput.Free();
+ m_clsid = __uuidof(this);
+ m_pInput.Free();
}
diff --git a/src/filters/parser/FLVSplitter/FLVSplitter.h b/src/filters/parser/FLVSplitter/FLVSplitter.h
index e2f0a4250..e44fc7d1d 100644
--- a/src/filters/parser/FLVSplitter/FLVSplitter.h
+++ b/src/filters/parser/FLVSplitter/FLVSplitter.h
@@ -31,68 +31,68 @@
#define FlvSourceName L"MPC FLV Source"
class __declspec(uuid("47E792CF-0BBE-4F7A-859C-194B0768650A"))
- CFLVSplitterFilter : public CBaseSplitterFilter
+ CFLVSplitterFilter : public CBaseSplitterFilter
{
- UINT32 m_DataOffset;
- bool m_IgnorePrevSizes;
+ UINT32 m_DataOffset;
+ bool m_IgnorePrevSizes;
- bool Sync(__int64& pos);
+ bool Sync(__int64& pos);
- struct VideoTweak {
- BYTE x;
- BYTE y;
- };
+ struct VideoTweak {
+ BYTE x;
+ BYTE y;
+ };
- bool ReadTag(VideoTweak& t);
+ bool ReadTag(VideoTweak& t);
- struct Tag {
- UINT32 PreviousTagSize;
- BYTE TagType;
- UINT32 DataSize;
- UINT32 TimeStamp;
- UINT32 StreamID;
- };
+ struct Tag {
+ UINT32 PreviousTagSize;
+ BYTE TagType;
+ UINT32 DataSize;
+ UINT32 TimeStamp;
+ UINT32 StreamID;
+ };
- bool ReadTag(Tag& t);
+ bool ReadTag(Tag& t);
- struct AudioTag {
- BYTE SoundFormat;
- BYTE SoundRate;
- BYTE SoundSize;
- BYTE SoundType;
- };
+ struct AudioTag {
+ BYTE SoundFormat;
+ BYTE SoundRate;
+ BYTE SoundSize;
+ BYTE SoundType;
+ };
- bool ReadTag(AudioTag& at);
+ bool ReadTag(AudioTag& at);
- struct VideoTag {
- BYTE FrameType;
- BYTE CodecID;
- };
+ struct VideoTag {
+ BYTE FrameType;
+ BYTE CodecID;
+ };
- bool ReadTag(VideoTag& vt);
+ bool ReadTag(VideoTag& vt);
- void NormalSeek(REFERENCE_TIME rt);
- void AlternateSeek(REFERENCE_TIME rt);
+ void NormalSeek(REFERENCE_TIME rt);
+ void AlternateSeek(REFERENCE_TIME rt);
protected:
- CAutoPtr<CBaseSplitterFileEx> m_pFile;
- HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
+ CAutoPtr<CBaseSplitterFileEx> m_pFile;
+ HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
- bool DemuxInit();
- void DemuxSeek(REFERENCE_TIME rt);
- bool DemuxLoop();
+ bool DemuxInit();
+ void DemuxSeek(REFERENCE_TIME rt);
+ bool DemuxLoop();
public:
- CFLVSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ CFLVSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
- // CBaseFilter
- STDMETHODIMP_(HRESULT) QueryFilterInfo(FILTER_INFO* pInfo);
+ // CBaseFilter
+ STDMETHODIMP_(HRESULT) QueryFilterInfo(FILTER_INFO* pInfo);
};
class __declspec(uuid("C9ECE7B3-1D8E-41F5-9F24-B255DF16C087"))
- CFLVSourceFilter : public CFLVSplitterFilter
+ CFLVSourceFilter : public CFLVSplitterFilter
{
public:
- CFLVSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ CFLVSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
};
diff --git a/src/filters/parser/MP4Splitter/Ap4AsyncReaderStream.cpp b/src/filters/parser/MP4Splitter/Ap4AsyncReaderStream.cpp
index 2824094a2..dc07cce13 100644
--- a/src/filters/parser/MP4Splitter/Ap4AsyncReaderStream.cpp
+++ b/src/filters/parser/MP4Splitter/Ap4AsyncReaderStream.cpp
@@ -2,79 +2,79 @@
#include "Ap4AsyncReaderStream.h"
AP4_AsyncReaderStream::AP4_AsyncReaderStream(CBaseSplitterFile* pFile)
- : m_refs(1)
- , m_pFile(pFile)
+ : m_refs(1)
+ , m_pFile(pFile)
{
- ASSERT(pFile);
+ ASSERT(pFile);
}
AP4_AsyncReaderStream::~AP4_AsyncReaderStream()
{
- ASSERT(m_refs == 0);
+ ASSERT(m_refs == 0);
}
void AP4_AsyncReaderStream::AddReference()
{
- ASSERT(m_refs > 0);
- ++m_refs;
+ ASSERT(m_refs > 0);
+ ++m_refs;
}
void AP4_AsyncReaderStream::Release()
{
- ASSERT(m_refs > 0);
- if (--m_refs == 0) {
- delete this;
- }
+ ASSERT(m_refs > 0);
+ if (--m_refs == 0) {
+ delete this;
+ }
}
AP4_Result AP4_AsyncReaderStream::Read(void* buffer, AP4_Size bytesToRead, AP4_Size* bytesRead)
{
- __int64 bytesAvail = m_pFile->GetRemaining();
+ __int64 bytesAvail = m_pFile->GetRemaining();
- if (bytesAvail < (long long)bytesToRead) {
- if (bytesRead) {
- *bytesRead = bytesAvail;
- }
- bytesToRead = bytesAvail;
- }
+ if (bytesAvail < (long long)bytesToRead) {
+ if (bytesRead) {
+ *bytesRead = bytesAvail;
+ }
+ bytesToRead = bytesAvail;
+ }
- if (bytesAvail == 0) {
- return AP4_ERROR_EOS;
- }
+ if (bytesAvail == 0) {
+ return AP4_ERROR_EOS;
+ }
- if (FAILED(m_pFile->ByteRead((BYTE*)buffer, bytesToRead))) {
- if (bytesRead) {
- *bytesRead = 0;
- }
- return AP4_ERROR_READ_FAILED;
- }
+ if (FAILED(m_pFile->ByteRead((BYTE*)buffer, bytesToRead))) {
+ if (bytesRead) {
+ *bytesRead = 0;
+ }
+ return AP4_ERROR_READ_FAILED;
+ }
- if (bytesRead) {
- *bytesRead = bytesToRead;
- }
+ if (bytesRead) {
+ *bytesRead = bytesToRead;
+ }
- return AP4_SUCCESS;
+ return AP4_SUCCESS;
}
AP4_Result AP4_AsyncReaderStream::Write(const void* buffer, AP4_Size bytesToWrite, AP4_Size* bytesWritten)
{
- return AP4_ERROR_WRITE_FAILED;
+ return AP4_ERROR_WRITE_FAILED;
}
AP4_Result AP4_AsyncReaderStream::Seek(AP4_Offset offset)
{
- m_pFile->Seek(offset);
- return m_pFile->GetPos() == offset ? AP4_SUCCESS : AP4_FAILURE;
+ m_pFile->Seek(offset);
+ return m_pFile->GetPos() == offset ? AP4_SUCCESS : AP4_FAILURE;
}
AP4_Result AP4_AsyncReaderStream::Tell(AP4_Offset& offset)
{
- offset = (AP4_Offset)m_pFile->GetPos();
- return AP4_SUCCESS;
+ offset = (AP4_Offset)m_pFile->GetPos();
+ return AP4_SUCCESS;
}
AP4_Result AP4_AsyncReaderStream::GetSize(AP4_Size& size)
{
- size = (AP4_Size)m_pFile->GetLength();
- return AP4_SUCCESS;
+ size = (AP4_Size)m_pFile->GetLength();
+ return AP4_SUCCESS;
} \ No newline at end of file
diff --git a/src/filters/parser/MP4Splitter/Ap4AsyncReaderStream.h b/src/filters/parser/MP4Splitter/Ap4AsyncReaderStream.h
index f1e1a14a2..aec075a1f 100644
--- a/src/filters/parser/MP4Splitter/Ap4AsyncReaderStream.h
+++ b/src/filters/parser/MP4Splitter/Ap4AsyncReaderStream.h
@@ -4,31 +4,23 @@
#include "Ap4.h"
#include "Ap4File.h"
-//#include "Ap4Utils.h"
-//#include "Ap4Sample.h"
#include "Ap4ByteStream.h"
-//#include "Ap4SampleEntry.h"
-//#include "Ap4IsmaCryp.h"
-//#include "Ap4AvcCAtom.h"
-//#include "Ap4FtabAtom.h"
-//#include "Ap4MdhdAtom.h"
-//#include "Ap4HdlrAtom.h"
class AP4_AsyncReaderStream : public AP4_ByteStream
{
- int m_refs;
- CBaseSplitterFile* m_pFile;
+ int m_refs;
+ CBaseSplitterFile* m_pFile;
public:
- AP4_AsyncReaderStream(CBaseSplitterFile* pFile);
- virtual ~AP4_AsyncReaderStream();
+ AP4_AsyncReaderStream(CBaseSplitterFile* pFile);
+ virtual ~AP4_AsyncReaderStream();
- void AddReference();
- void Release();
+ void AddReference();
+ void Release();
- AP4_Result Read(void* buffer, AP4_Size bytesToRead, AP4_Size* bytesRead);
- AP4_Result Write(const void* buffer, AP4_Size bytesToWrite, AP4_Size* bytesWritten);
- AP4_Result Seek(AP4_Offset offset);
- AP4_Result Tell(AP4_Offset& offset);
- AP4_Result GetSize(AP4_Size& size);
+ AP4_Result Read(void* buffer, AP4_Size bytesToRead, AP4_Size* bytesRead);
+ AP4_Result Write(const void* buffer, AP4_Size bytesToWrite, AP4_Size* bytesWritten);
+ AP4_Result Seek(AP4_Offset offset);
+ AP4_Result Tell(AP4_Offset& offset);
+ AP4_Result GetSize(AP4_Size& size);
}; \ No newline at end of file
diff --git a/src/filters/parser/MP4Splitter/MP4Splitter.cpp b/src/filters/parser/MP4Splitter/MP4Splitter.cpp
index 74254469d..a5ab36613 100644
--- a/src/filters/parser/MP4Splitter/MP4Splitter.cpp
+++ b/src/filters/parser/MP4Splitter/MP4Splitter.cpp
@@ -46,58 +46,58 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_MP4},
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_MP4},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CMP4SplitterFilter), MP4SplitterName, MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CMP4SourceFilter), MP4SourceName, MERIT_NORMAL, 0, NULL, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CMPEG4VideoSplitterFilter), L"MPC MPEG4 Video Splitter", MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CMPEG4VideoSourceFilter), L"MPC MPEG4 Video Source", MERIT_NORMAL, 0, NULL, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CMP4SplitterFilter), MP4SplitterName, MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CMP4SourceFilter), MP4SourceName, MERIT_NORMAL, 0, NULL, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CMPEG4VideoSplitterFilter), L"MPC MPEG4 Video Splitter", MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CMPEG4VideoSourceFilter), L"MPC MPEG4 Video Source", MERIT_NORMAL, 0, NULL, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CMP4SplitterFilter>, NULL, &sudFilter[0]},
- {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CMP4SourceFilter>, NULL, &sudFilter[1]},
- {sudFilter[2].strName, sudFilter[2].clsID, CreateInstance<CMPEG4VideoSplitterFilter>, NULL, &sudFilter[2]},
- {sudFilter[3].strName, sudFilter[3].clsID, CreateInstance<CMPEG4VideoSourceFilter>, NULL, &sudFilter[3]},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CMP4SplitterFilter>, NULL, &sudFilter[0]},
+ {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CMP4SourceFilter>, NULL, &sudFilter[1]},
+ {sudFilter[2].strName, sudFilter[2].clsID, CreateInstance<CMPEG4VideoSplitterFilter>, NULL, &sudFilter[2]},
+ {sudFilter[3].strName, sudFilter[3].clsID, CreateInstance<CMPEG4VideoSourceFilter>, NULL, &sudFilter[3]},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- DeleteRegKey(_T("Media Type\\Extensions\\"), _T(".mp4"));
- DeleteRegKey(_T("Media Type\\Extensions\\"), _T(".mov"));
+ DeleteRegKey(_T("Media Type\\Extensions\\"), _T(".mp4"));
+ DeleteRegKey(_T("Media Type\\Extensions\\"), _T(".mov"));
- CAtlList<CString> chkbytes;
+ CAtlList<CString> chkbytes;
- // mp4
- chkbytes.AddTail(_T("4,4,,66747970")); // ftyp
- chkbytes.AddTail(_T("4,4,,6d6f6f76")); // moov
- chkbytes.AddTail(_T("4,4,,6d646174")); // mdat
- chkbytes.AddTail(_T("4,4,,736b6970")); // skip
- chkbytes.AddTail(_T("4,12,ffffffff00000000ffffffff,77696465027fe3706d646174")); // wide ? mdat
+ // mp4
+ chkbytes.AddTail(_T("4,4,,66747970")); // ftyp
+ chkbytes.AddTail(_T("4,4,,6d6f6f76")); // moov
+ chkbytes.AddTail(_T("4,4,,6d646174")); // mdat
+ chkbytes.AddTail(_T("4,4,,736b6970")); // skip
+ chkbytes.AddTail(_T("4,12,ffffffff00000000ffffffff,77696465027fe3706d646174")); // wide ? mdat
- // mpeg4 video
- chkbytes.AddTail(_T("3,3,,000001"));
+ // mpeg4 video
+ chkbytes.AddTail(_T("3,3,,000001"));
- RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_MP4, chkbytes, NULL);
+ RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_MP4, chkbytes, NULL);
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- UnRegisterSourceFilter(MEDIASUBTYPE_MP4);
+ UnRegisterSourceFilter(MEDIASUBTYPE_MP4);
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -107,294 +107,294 @@ CFilterApp theApp;
#endif
struct SSACharacter {
- CString pre, post;
- WCHAR c;
+ CString pre, post;
+ WCHAR c;
};
static CStringW ConvertTX3GToSSA(
- CStringW str,
- const AP4_Tx3gSampleEntry::AP4_Tx3gDescription& desc,
- CStringW font,
- const AP4_Byte* mods,
- int size,
- CSize framesize,
- CPoint translation,
- int durationms,
- CRect& rbox)
+ CStringW str,
+ const AP4_Tx3gSampleEntry::AP4_Tx3gDescription& desc,
+ CStringW font,
+ const AP4_Byte* mods,
+ int size,
+ CSize framesize,
+ CPoint translation,
+ int durationms,
+ CRect& rbox)
{
- int str_len = str.GetLength();
-
- SSACharacter* chars = DNew SSACharacter[str_len];
- for (int i = 0; i < str_len; ++i) {
- chars[i].c = str[i];
- }
- str.Empty();
-
- //
-
- rbox.SetRect(desc.TextBox.Left, desc.TextBox.Top, desc.TextBox.Right, desc.TextBox.Bottom);
-
- int align = 2;
- signed char h = (signed char)desc.HorizontalJustification;
- signed char v = (signed char)desc.VerticalJustification;
- if (h == 0 && v < 0) {
- align = 1;
- } else if (h > 0 && v < 0) {
- align = 2;
- } else if (h < 0 && v < 0) {
- align = 3;
- } else if (h == 0 && v > 0) {
- align = 4;
- } else if (h > 0 && v > 0) {
- align = 5;
- } else if (h < 0 && v > 0) {
- align = 6;
- } else if (h == 0 && v == 0) {
- align = 7;
- } else if (h > 0 && v == 0) {
- align = 8;
- } else if (h < 0 && v == 0) {
- align = 9;
- }
- str.Format(L"{\\an%d}%s", align, CStringW(str));
-
- if (!font.CompareNoCase(L"serif")) {
- font = L"Times New Roman";
- } else if (!font.CompareNoCase(L"sans-serif")) {
- font = L"Arial";
- } else if (!font.CompareNoCase(L"monospace")) {
- font = L"Courier New";
- }
- str.Format(L"{\\fn%s}%s", font, CStringW(str));
-
- const AP4_Byte* fclr = (const AP4_Byte*)&desc.Style.Font.Color;
-
- CStringW font_color;
- font_color.Format(L"{\\1c%02x%02x%02x\\1a%02x}", fclr[2], fclr[1], fclr[0], 255 - fclr[3]);
- str = font_color + str;
-
- str.Format(L"%s{\\2c%02x%02x%02x\\2a%02x}", CString(str), fclr[2], fclr[1], fclr[0], 255 - fclr[3]);
-
- CStringW font_size;
- font_size.Format(L"{\\fs%d}", desc.Style.Font.Size);
- str = font_size + str;
-
- CStringW font_flags;
- font_flags.Format(L"{\\b%d\\i%d\\u%d}",
- (desc.Style.Font.Face&1) ? 1 : 0,
- (desc.Style.Font.Face&2) ? 1 : 0,
- (desc.Style.Font.Face&4) ? 1 : 0);
- str = font_flags + str;
-
- //
-
- const AP4_Byte* hclr = (const AP4_Byte*)&desc.BackgroundColor;
-
- while (size > 8) {
- DWORD tag_size = (mods[0]<<24)|(mods[1]<<16)|(mods[2]<<8)|(mods[3]);
- mods += 4;
- DWORD tag = (mods[0]<<24)|(mods[1]<<16)|(mods[2]<<8)|(mods[3]);
- mods += 4;
-
- size -= tag_size;
- tag_size -= 8;
- const AP4_Byte* next = mods + tag_size;
-
- if (tag == 'styl') {
- WORD styl_count = (mods[0]<<8)|(mods[1]);
- mods += 2;
-
- while (styl_count-- > 0) {
- WORD start = (mods[0]<<8)|(mods[1]);
- mods += 2;
- WORD end = (mods[0]<<8)|(mods[1]);
- mods += 2;
- WORD font_id = (mods[0]<<8)|(mods[1]);
- mods += 2;
- WORD flags = mods[0];
- mods += 1;
- WORD size = mods[0];
- mods += 1;
- const AP4_Byte* color = mods;
- mods += 4;
-
- if (end > str_len) {
- end = str_len;
- }
-
- if (start < end) {
- CStringW s;
-
- s.Format(L"{\\1c%02x%02x%02x\\1a%02x}", color[2], color[1], color[0], 255 - color[3]);
- chars[start].pre += s;
- chars[end-1].post += font_color;
-
- s.Format(L"{\\fs%d}", size);
- chars[start].pre += s;
- chars[end-1].post += font_size;
-
- s.Format(L"{\\b%d\\i%d\\u%d}", (flags&1) ? 1 : 0, (flags&2) ? 1 : 0, (flags&4) ? 1 : 0);
- chars[start].pre += s;
- chars[end-1].post += font_flags;
- }
- }
- } else if (tag == 'hclr') {
- hclr = mods;
- } else if (tag == 'hlit') {
- WORD start = (mods[0]<<8)|(mods[1]);
- mods += 2;
- WORD end = (mods[0]<<8)|(mods[1]);
- mods += 2;
-
- if (end > str_len) {
- end = str_len;
- }
-
- if (start < end) {
- CStringW s;
-
- s.Format(L"{\\3c%02x%02x%02x\\3a%02x}", hclr[2], hclr[1], hclr[0], 255 - hclr[3]);
- chars[start].pre += s;
- chars[end-1].post += font_color;
-
- chars[start].pre += L"{\\bord0.1}";
- chars[end-1].post += L"{\\bord}";
- }
- } else if (tag == 'blnk') {
- WORD start = (mods[0]<<8)|(mods[1]);
- mods += 2;
- WORD end = (mods[0]<<8)|(mods[1]);
- mods += 2;
-
- if (end > str_len) {
- end = str_len;
- }
-
- if (start < end) {
- // cheap...
-
- for (int i = 0, alpha = 255; i < durationms; i += 750, alpha = 255 - alpha) {
- CStringW s;
- s.Format(L"{\\t(%d, %d, \\alpha&H%02x&)}", i, i + 750, alpha);
- chars[start].pre += s;
- }
-
- chars[end-1].post += L"{\\alpha}";
- }
- } else if (tag == 'tbox') {
- rbox.top = (mods[0]<<8)|(mods[1]);
- mods += 2;
- rbox.left = (mods[0]<<8)|(mods[1]);
- mods += 2;
- rbox.bottom = (mods[0]<<8)|(mods[1]);
- mods += 2;
- rbox.right = (mods[0]<<8)|(mods[1]);
- mods += 2;
- } else if (tag == 'krok' && !(desc.DisplayFlags & 0x800)) {
- DWORD start_time = (mods[0]<<24)|(mods[1]<<16)|(mods[2]<<8)|(mods[3]);
- mods += 4;
- WORD krok_count = (mods[0]<<8)|(mods[1]);
- mods += 2;
-
- while (krok_count-- > 0) {
- DWORD end_time = (mods[0]<<24)|(mods[1]<<16)|(mods[2]<<8)|(mods[3]);
- mods += 4;
- WORD start = (mods[0]<<8)|(mods[1]);
- mods += 2;
- WORD end = (mods[0]<<8)|(mods[1]);
- mods += 2;
-
- if (end > str_len) {
- end = str_len;
- }
-
- if (start < end) {
- CStringW s;
-
- s.Format(L"{\\kt%d\\kf%d}", start_time/10, (end_time - start_time)/10);
- chars[start].pre += s;
- s.Format(L"{\\1c%02x%02x%02x\\1a%02x}", hclr[2], hclr[1], hclr[0], 255 - hclr[3]);
- chars[start].pre += s;
- chars[end-1].post += L"{\\kt}" + font_color;
- }
-
- start_time = end_time;
- }
- }
-
- mods = next;
- }
-
- // continous karaoke
-
- if (desc.DisplayFlags & 0x800) {
- CStringW s;
-
- s.Format(L"{\\1c%02x%02x%02x\\1a%02x}", hclr[2], hclr[1], hclr[0], 255 - hclr[3]);
- str += s;
-
- int breaks = 0;
-
- for (int i = 0, j = 0; i <= str_len; ++i) {
- if (chars[i].c == '\n' /*|| chars[i].c == ' '*/) {
- ++breaks;
- }
- }
-
- if (str_len > breaks) {
- float dur = (float)max(durationms - 500, 0) / 10;
-
- for (int i = 0, j = 0; i <= str_len; ++i) {
- if (i == str_len || chars[i].c == '\n' /*|| chars[i].c == ' '*/) {
- s.Format(L"{\\kf%d}", (int)(dur * (i - j) / (str_len - breaks)));
- chars[j].pre += s;
- j = i+1;
- }
- }
- }
- }
-
- //
-
- for (int i = 0; i < str_len; ++i) {
- str += chars[i].pre;
- str += chars[i].c;
- if (desc.DisplayFlags & 0x20000) {
- str += L"\\N";
- }
- str += chars[i].post;
- }
-
- delete [] chars;
-
- //
-
- if (rbox.IsRectEmpty()) {
- rbox.SetRect(0, 0, framesize.cx, framesize.cy);
- }
- rbox.OffsetRect(translation);
-
- CRect rbox2 = rbox;
- rbox2.DeflateRect(2, 2);
-
- CRect r(0,0,0,0);
- if (rbox2.Height() > 0) {
- r.top = rbox2.top;
- r.bottom = framesize.cy - rbox2.bottom;
- }
- if (rbox2.Width() > 0) {
- r.left = rbox2.left;
- r.right = framesize.cx - rbox2.right;
- }
-
- CStringW hdr;
- hdr.Format(L"0,0,Text,,%d,%d,%d,%d,,{\\clip(%d,%d,%d,%d)}",
- r.left, r.right, r.top, r.bottom,
- rbox.left, rbox.top, rbox.right, rbox.bottom);
-
- //
-
- return hdr + str;
+ int str_len = str.GetLength();
+
+ SSACharacter* chars = DNew SSACharacter[str_len];
+ for (int i = 0; i < str_len; ++i) {
+ chars[i].c = str[i];
+ }
+ str.Empty();
+
+ //
+
+ rbox.SetRect(desc.TextBox.Left, desc.TextBox.Top, desc.TextBox.Right, desc.TextBox.Bottom);
+
+ int align = 2;
+ signed char h = (signed char)desc.HorizontalJustification;
+ signed char v = (signed char)desc.VerticalJustification;
+ if (h == 0 && v < 0) {
+ align = 1;
+ } else if (h > 0 && v < 0) {
+ align = 2;
+ } else if (h < 0 && v < 0) {
+ align = 3;
+ } else if (h == 0 && v > 0) {
+ align = 4;
+ } else if (h > 0 && v > 0) {
+ align = 5;
+ } else if (h < 0 && v > 0) {
+ align = 6;
+ } else if (h == 0 && v == 0) {
+ align = 7;
+ } else if (h > 0 && v == 0) {
+ align = 8;
+ } else if (h < 0 && v == 0) {
+ align = 9;
+ }
+ str.Format(L"{\\an%d}%s", align, CStringW(str));
+
+ if (!font.CompareNoCase(L"serif")) {
+ font = L"Times New Roman";
+ } else if (!font.CompareNoCase(L"sans-serif")) {
+ font = L"Arial";
+ } else if (!font.CompareNoCase(L"monospace")) {
+ font = L"Courier New";
+ }
+ str.Format(L"{\\fn%s}%s", font, CStringW(str));
+
+ const AP4_Byte* fclr = (const AP4_Byte*)&desc.Style.Font.Color;
+
+ CStringW font_color;
+ font_color.Format(L"{\\1c%02x%02x%02x\\1a%02x}", fclr[2], fclr[1], fclr[0], 255 - fclr[3]);
+ str = font_color + str;
+
+ str.Format(L"%s{\\2c%02x%02x%02x\\2a%02x}", CString(str), fclr[2], fclr[1], fclr[0], 255 - fclr[3]);
+
+ CStringW font_size;
+ font_size.Format(L"{\\fs%d}", desc.Style.Font.Size);
+ str = font_size + str;
+
+ CStringW font_flags;
+ font_flags.Format(L"{\\b%d\\i%d\\u%d}",
+ (desc.Style.Font.Face & 1) ? 1 : 0,
+ (desc.Style.Font.Face & 2) ? 1 : 0,
+ (desc.Style.Font.Face & 4) ? 1 : 0);
+ str = font_flags + str;
+
+ //
+
+ const AP4_Byte* hclr = (const AP4_Byte*)&desc.BackgroundColor;
+
+ while (size > 8) {
+ DWORD tag_size = (mods[0] << 24) | (mods[1] << 16) | (mods[2] << 8) | (mods[3]);
+ mods += 4;
+ DWORD tag = (mods[0] << 24) | (mods[1] << 16) | (mods[2] << 8) | (mods[3]);
+ mods += 4;
+
+ size -= tag_size;
+ tag_size -= 8;
+ const AP4_Byte* next = mods + tag_size;
+
+ if (tag == 'styl') {
+ WORD styl_count = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+
+ while (styl_count-- > 0) {
+ WORD start = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+ WORD end = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+ WORD font_id = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+ WORD flags = mods[0];
+ mods += 1;
+ WORD size = mods[0];
+ mods += 1;
+ const AP4_Byte* color = mods;
+ mods += 4;
+
+ if (end > str_len) {
+ end = str_len;
+ }
+
+ if (start < end) {
+ CStringW s;
+
+ s.Format(L"{\\1c%02x%02x%02x\\1a%02x}", color[2], color[1], color[0], 255 - color[3]);
+ chars[start].pre += s;
+ chars[end - 1].post += font_color;
+
+ s.Format(L"{\\fs%d}", size);
+ chars[start].pre += s;
+ chars[end - 1].post += font_size;
+
+ s.Format(L"{\\b%d\\i%d\\u%d}", (flags & 1) ? 1 : 0, (flags & 2) ? 1 : 0, (flags & 4) ? 1 : 0);
+ chars[start].pre += s;
+ chars[end - 1].post += font_flags;
+ }
+ }
+ } else if (tag == 'hclr') {
+ hclr = mods;
+ } else if (tag == 'hlit') {
+ WORD start = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+ WORD end = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+
+ if (end > str_len) {
+ end = str_len;
+ }
+
+ if (start < end) {
+ CStringW s;
+
+ s.Format(L"{\\3c%02x%02x%02x\\3a%02x}", hclr[2], hclr[1], hclr[0], 255 - hclr[3]);
+ chars[start].pre += s;
+ chars[end - 1].post += font_color;
+
+ chars[start].pre += L"{\\bord0.1}";
+ chars[end - 1].post += L"{\\bord}";
+ }
+ } else if (tag == 'blnk') {
+ WORD start = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+ WORD end = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+
+ if (end > str_len) {
+ end = str_len;
+ }
+
+ if (start < end) {
+ // cheap...
+
+ for (int i = 0, alpha = 255; i < durationms; i += 750, alpha = 255 - alpha) {
+ CStringW s;
+ s.Format(L"{\\t(%d, %d, \\alpha&H%02x&)}", i, i + 750, alpha);
+ chars[start].pre += s;
+ }
+
+ chars[end - 1].post += L"{\\alpha}";
+ }
+ } else if (tag == 'tbox') {
+ rbox.top = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+ rbox.left = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+ rbox.bottom = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+ rbox.right = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+ } else if (tag == 'krok' && !(desc.DisplayFlags & 0x800)) {
+ DWORD start_time = (mods[0] << 24) | (mods[1] << 16) | (mods[2] << 8) | (mods[3]);
+ mods += 4;
+ WORD krok_count = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+
+ while (krok_count-- > 0) {
+ DWORD end_time = (mods[0] << 24) | (mods[1] << 16) | (mods[2] << 8) | (mods[3]);
+ mods += 4;
+ WORD start = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+ WORD end = (mods[0] << 8) | (mods[1]);
+ mods += 2;
+
+ if (end > str_len) {
+ end = str_len;
+ }
+
+ if (start < end) {
+ CStringW s;
+
+ s.Format(L"{\\kt%d\\kf%d}", start_time / 10, (end_time - start_time) / 10);
+ chars[start].pre += s;
+ s.Format(L"{\\1c%02x%02x%02x\\1a%02x}", hclr[2], hclr[1], hclr[0], 255 - hclr[3]);
+ chars[start].pre += s;
+ chars[end - 1].post += L"{\\kt}" + font_color;
+ }
+
+ start_time = end_time;
+ }
+ }
+
+ mods = next;
+ }
+
+ // continous karaoke
+
+ if (desc.DisplayFlags & 0x800) {
+ CStringW s;
+
+ s.Format(L"{\\1c%02x%02x%02x\\1a%02x}", hclr[2], hclr[1], hclr[0], 255 - hclr[3]);
+ str += s;
+
+ int breaks = 0;
+
+ for (int i = 0, j = 0; i <= str_len; ++i) {
+ if (chars[i].c == '\n' /*|| chars[i].c == ' '*/) {
+ ++breaks;
+ }
+ }
+
+ if (str_len > breaks) {
+ float dur = (float)max(durationms - 500, 0) / 10;
+
+ for (int i = 0, j = 0; i <= str_len; ++i) {
+ if (i == str_len || chars[i].c == '\n' /*|| chars[i].c == ' '*/) {
+ s.Format(L"{\\kf%d}", (int)(dur * (i - j) / (str_len - breaks)));
+ chars[j].pre += s;
+ j = i + 1;
+ }
+ }
+ }
+ }
+
+ //
+
+ for (int i = 0; i < str_len; ++i) {
+ str += chars[i].pre;
+ str += chars[i].c;
+ if (desc.DisplayFlags & 0x20000) {
+ str += L"\\N";
+ }
+ str += chars[i].post;
+ }
+
+ delete [] chars;
+
+ //
+
+ if (rbox.IsRectEmpty()) {
+ rbox.SetRect(0, 0, framesize.cx, framesize.cy);
+ }
+ rbox.OffsetRect(translation);
+
+ CRect rbox2 = rbox;
+ rbox2.DeflateRect(2, 2);
+
+ CRect r(0, 0, 0, 0);
+ if (rbox2.Height() > 0) {
+ r.top = rbox2.top;
+ r.bottom = framesize.cy - rbox2.bottom;
+ }
+ if (rbox2.Width() > 0) {
+ r.left = rbox2.left;
+ r.right = framesize.cx - rbox2.right;
+ }
+
+ CStringW hdr;
+ hdr.Format(L"0,0,Text,,%d,%d,%d,%d,,{\\clip(%d,%d,%d,%d)}",
+ r.left, r.right, r.top, r.bottom,
+ rbox.left, rbox.top, rbox.right, rbox.bottom);
+
+ //
+
+ return hdr + str;
}
//
@@ -402,7 +402,7 @@ static CStringW ConvertTX3GToSSA(
//
CMP4SplitterFilter::CMP4SplitterFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CBaseSplitterFilter(NAME("CMP4SplitterFilter"), pUnk, phr, __uuidof(this))
+ : CBaseSplitterFilter(NAME("CMP4SplitterFilter"), pUnk, phr, __uuidof(this))
{
}
@@ -412,1286 +412,1288 @@ CMP4SplitterFilter::~CMP4SplitterFilter()
STDMETHODIMP CMP4SplitterFilter::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
-
- if (m_pName && m_pName[0]==L'M' && m_pName[1]==L'P' && m_pName[2]==L'C') {
- (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
- } else {
- wcscpy_s(pInfo->achName, MP4SourceName);
- }
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+
+ if (m_pName && m_pName[0] == L'M' && m_pName[1] == L'P' && m_pName[2] == L'C') {
+ (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
+ } else {
+ wcscpy_s(pInfo->achName, MP4SourceName);
+ }
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
-void SetTrackName(CString *TrackName, CString Suffix)
+void SetTrackName(CString* TrackName, CString Suffix)
{
- if (TrackName->IsEmpty()) {
- *TrackName = Suffix;
- } else {
- *TrackName += _T(" - ");
- *TrackName += Suffix;
- }
+ if (TrackName->IsEmpty()) {
+ *TrackName = Suffix;
+ } else {
+ *TrackName += _T(" - ");
+ *TrackName += Suffix;
+ }
}
HRESULT CMP4SplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
{
- CheckPointer(pAsyncReader, E_POINTER);
-
- HRESULT hr = E_FAIL;
-
- //bool b_HasVideo = false;
-
- m_trackpos.RemoveAll();
-
- m_pFile.Free();
- m_pFile.Attach(DNew CMP4SplitterFile(pAsyncReader, hr));
- if (!m_pFile) {
- return E_OUTOFMEMORY;
- }
- if (FAILED(hr)) {
- m_pFile.Free();
- return hr;
- }
-
- m_rtNewStart = m_rtCurrent = 0;
- m_rtNewStop = m_rtStop = m_rtDuration = 0;
- REFERENCE_TIME rtVideoDuration = 0;
-
- m_framesize.SetSize(640, 480);
-
- if (AP4_Movie* movie = (AP4_Movie*)m_pFile->GetMovie()) {
- // looking for main video track (skip tracks with motionless frames)
- AP4_UI32 mainvideoID = 0;
- for (AP4_List<AP4_Track>::Item* item = movie->GetTracks().FirstItem();
- item;
- item = item->GetNext()) {
- AP4_Track* track = item->GetData();
-
- if (track->GetType() != AP4_Track::TYPE_VIDEO) {
- continue;
- }
- if (!mainvideoID) {
- mainvideoID = track->GetId();
- }
- if (AP4_StssAtom* stss = dynamic_cast<AP4_StssAtom*>(track->GetTrakAtom()->FindChild("mdia/minf/stbl/stss"))) {
- if (stss->m_Entries.ItemCount() > 0) {
- mainvideoID = track->GetId();
- break;
- }
- }
- }
- // process the tracks
- for (AP4_List<AP4_Track>::Item* item = movie->GetTracks().FirstItem();
- item;
- item = item->GetNext()) {
- AP4_Track* track = item->GetData();
-
- if (track->GetType() != AP4_Track::TYPE_VIDEO
- && track->GetType() != AP4_Track::TYPE_AUDIO
- && track->GetType() != AP4_Track::TYPE_TEXT
- && track->GetType() != AP4_Track::TYPE_SUBP) {
- continue;
- }
-
- //if (b_HasVideo && track->GetType() == AP4_Track::TYPE_VIDEO) {
- if (track->GetType() == AP4_Track::TYPE_VIDEO && track->GetId() != mainvideoID) {
- continue;
- }
-
- AP4_Sample sample;
-
- if (!AP4_SUCCEEDED(track->GetSample(0, sample)) || sample.GetDescriptionIndex() == 0xFFFFFFFF) {
- continue;
- }
-
- CStringW TrackName = UTF8ToStringW(track->GetTrackName().c_str());
- if (TrackName.IsEmpty()) {
- TrackName = LocalToStringW(track->GetTrackName().c_str()); //Trying Local...
- }
- TrackName.TrimLeft(_T("\x0010\x0013\x0015\x0017\x0018\x0019\x001A\x001B"));
- TrackName.Trim();
-
- CStringA TrackLanguage = track->GetTrackLanguage().c_str();
-
- CAtlArray<CMediaType> mts;
-
- CMediaType mt;
- mt.SetSampleSize(1);
-
- VIDEOINFOHEADER* vih = NULL;
- WAVEFORMATEX* wfe = NULL;
-
- AP4_DataBuffer empty;
-
- if (AP4_SampleDescription* desc = track->GetSampleDescription(sample.GetDescriptionIndex())) {
- AP4_MpegSampleDescription* mpeg_desc = NULL;
-
- if (desc->GetType() == AP4_SampleDescription::TYPE_MPEG) {
- mpeg_desc = dynamic_cast<AP4_MpegSampleDescription*>(desc);
- } else if (desc->GetType() == AP4_SampleDescription::TYPE_ISMACRYP) {
- AP4_IsmaCrypSampleDescription* isma_desc = dynamic_cast<AP4_IsmaCrypSampleDescription*>(desc);
- mpeg_desc = isma_desc->GetOriginalSampleDescription();
- }
-
- if (mpeg_desc) {
- CStringW TypeString = CStringW(mpeg_desc->GetObjectTypeString(mpeg_desc->GetObjectTypeId()));
- if ((TypeString.Find(_T("UNKNOWN")) == -1) && (TypeString.Find(_T("INVALID")) == -1)) {
- SetTrackName(&TrackName, TypeString);
- }
- }
-
- if (AP4_MpegVideoSampleDescription* video_desc =
- dynamic_cast<AP4_MpegVideoSampleDescription*>(mpeg_desc)) {
- const AP4_DataBuffer* di = video_desc->GetDecoderInfo();
- if (!di) {
- di = &empty;
- }
-
- LONG biWidth = (LONG)video_desc->GetWidth();
- LONG biHeight = (LONG)video_desc->GetHeight();
-
- if (!biWidth || !biHeight) {
- if (AP4_TkhdAtom* tkhd = dynamic_cast<AP4_TkhdAtom*>(track->GetTrakAtom()->GetChild(AP4_ATOM_TYPE_TKHD))) {
- biWidth = tkhd->GetWidth()>>16;
- biHeight = tkhd->GetHeight()>>16;
- }
- }
-
- if (!biWidth || !biHeight) {
- continue;
- }
-
- mt.majortype = MEDIATYPE_Video;
- mt.formattype = FORMAT_VideoInfo;
- vih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + di->GetDataSize());
- memset(vih, 0, mt.FormatLength());
- vih->dwBitRate = video_desc->GetAvgBitrate()/8;
- vih->bmiHeader.biSize = sizeof(vih->bmiHeader);
- vih->bmiHeader.biWidth = biWidth;
- vih->bmiHeader.biHeight = biHeight;
- memcpy(vih + 1, di->GetData(), di->GetDataSize());
-
- switch (video_desc->GetObjectTypeId()) {
- case AP4_MPEG4_VISUAL_OTI:
- mt.subtype = FOURCCMap('v4pm');
- mt.formattype = FORMAT_MPEG2Video;
- {
- MPEG2VIDEOINFO* mvih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + di->GetDataSize());
- memset(mvih, 0, mt.FormatLength());
- mvih->hdr.bmiHeader.biSize = sizeof(mvih->hdr.bmiHeader);
- mvih->hdr.bmiHeader.biWidth = biWidth;
- mvih->hdr.bmiHeader.biHeight = biHeight;
- mvih->hdr.bmiHeader.biCompression = 'v4pm';
- mvih->hdr.bmiHeader.biPlanes = 1;
- mvih->hdr.bmiHeader.biBitCount = 24;
- mvih->hdr.dwPictAspectRatioX = mvih->hdr.bmiHeader.biWidth;
- mvih->hdr.dwPictAspectRatioY = mvih->hdr.bmiHeader.biHeight;
- mvih->cbSequenceHeader = di->GetDataSize();
- memcpy(mvih->dwSequenceHeader, di->GetData(), di->GetDataSize());
- mts.Add(mt);
- mt.subtype = FOURCCMap(mvih->hdr.bmiHeader.biCompression = 'V4PM');
- mts.Add(mt);
- //b_HasVideo = true;
- }
- break;
- case AP4_JPEG_OTI:
- mt.subtype = FOURCCMap('gepj');
- mt.formattype = FORMAT_MPEG2Video;
- {
- MPEG2VIDEOINFO* mvih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + di->GetDataSize());
- memset(mvih, 0, mt.FormatLength());
- mvih->hdr.bmiHeader.biSize = sizeof(mvih->hdr.bmiHeader);
- mvih->hdr.bmiHeader.biWidth = biWidth;
- mvih->hdr.bmiHeader.biHeight = biHeight;
- mvih->hdr.bmiHeader.biCompression = 'gepj';
- mvih->hdr.bmiHeader.biPlanes = 1;
- mvih->hdr.bmiHeader.biBitCount = 24;
- mvih->hdr.dwPictAspectRatioX = mvih->hdr.bmiHeader.biWidth;
- mvih->hdr.dwPictAspectRatioY = mvih->hdr.bmiHeader.biHeight;
- mvih->cbSequenceHeader = di->GetDataSize();
- memcpy(mvih->dwSequenceHeader, di->GetData(), di->GetDataSize());
- mts.Add(mt);
- //b_HasVideo = true;
- }
- break;
- case AP4_MPEG2_VISUAL_SIMPLE_OTI:
- case AP4_MPEG2_VISUAL_MAIN_OTI:
- case AP4_MPEG2_VISUAL_SNR_OTI:
- case AP4_MPEG2_VISUAL_SPATIAL_OTI:
- case AP4_MPEG2_VISUAL_HIGH_OTI:
- case AP4_MPEG2_VISUAL_422_OTI:
- mt.subtype = MEDIASUBTYPE_MPEG2_VIDEO;
- {
- m_pFile->Seek(sample.GetOffset());
- CBaseSplitterFileEx::seqhdr h;
- CMediaType mt2;
- if (m_pFile->Read(h, sample.GetSize(), &mt2)) {
- mt = mt2;
- }
- }
- mts.Add(mt);
- break;
- case AP4_MPEG1_VISUAL_OTI: // ???
- mt.subtype = MEDIASUBTYPE_MPEG1Payload;
- {
- m_pFile->Seek(sample.GetOffset());
- CBaseSplitterFileEx::seqhdr h;
- CMediaType mt2;
- if (m_pFile->Read(h, sample.GetSize(), &mt2)) {
- mt = mt2;
- }
- }
- mts.Add(mt);
- break;
- }
-
- if (mt.subtype == GUID_NULL) {
- TRACE(_T("Unknown video OBI: %02x\n"), video_desc->GetObjectTypeId());
- }
- } else if (AP4_MpegAudioSampleDescription* audio_desc =
- dynamic_cast<AP4_MpegAudioSampleDescription*>(mpeg_desc)) {
- const AP4_DataBuffer* di = audio_desc->GetDecoderInfo();
- if (!di) {
- di = &empty;
- }
-
- mt.majortype = MEDIATYPE_Audio;
- mt.formattype = FORMAT_WaveFormatEx;
-
- wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX) + di->GetDataSize());
- memset(wfe, 0, mt.FormatLength());
- wfe->nSamplesPerSec = audio_desc->GetSampleRate();
- wfe->nAvgBytesPerSec = audio_desc->GetAvgBitrate()/8;
- wfe->nChannels = audio_desc->GetChannelCount();
- wfe->wBitsPerSample = audio_desc->GetSampleSize();
- wfe->cbSize = (WORD)di->GetDataSize();
- wfe->nBlockAlign = (WORD)((wfe->nChannels * wfe->wBitsPerSample) / 8);
-
- memcpy(wfe + 1, di->GetData(), di->GetDataSize());
-
- switch (audio_desc->GetObjectTypeId()) {
- case AP4_MPEG4_AUDIO_OTI:
- case AP4_MPEG2_AAC_AUDIO_MAIN_OTI: // ???
- case AP4_MPEG2_AAC_AUDIO_LC_OTI: // ???
- case AP4_MPEG2_AAC_AUDIO_SSRP_OTI: // ???
- if (di->GetDataSize() > 10) {
- if (*(DWORD*)(di->GetData()+6) == 0x00534c41) { // 'ALS\0' sync word
- wfe->wFormatTag = WAVE_FORMAT_UNKNOWN;
- mt.subtype = FOURCCMap(MAKEFOURCC('A','L','S',' ')); // create our own GUID - {20534C41-0000-0010-8000-00AA00389B71}
- mts.Add(mt);
- break;
- }
- }
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_AAC);
- if (wfe->cbSize >= 2 && wfe->nChannels < 8) {
- wfe->nChannels = (((BYTE*)(wfe+1))[1]>>3) & 0xf;
- wfe->nBlockAlign = (WORD)((wfe->nChannels * wfe->wBitsPerSample) / 8);
- }
- mts.Add(mt);
- break;
- case AP4_MPEG2_PART3_AUDIO_OTI: // ???
- case AP4_MPEG1_AUDIO_OTI:
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_MP3);
- {
- m_pFile->Seek(sample.GetOffset());
- CBaseSplitterFileEx::mpahdr h;
- CMediaType mt2;
- if (m_pFile->Read(h, sample.GetSize(), false, &mt2)) {
- mt = mt2;
- }
- }
- mts.Add(mt);
- break;
- case AP4_DTSC_AUDIO_OTI:
- case AP4_DTSH_AUDIO_OTI:
- case AP4_DTSL_AUDIO_OTI:
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_DVD_DTS);
- {
- m_pFile->Seek(sample.GetOffset());
- CBaseSplitterFileEx::dtshdr h;
- CMediaType mt2;
- if (m_pFile->Read(h, sample.GetSize(), &mt2)) {
- mt = mt2;
- }
- }
- mts.Add(mt);
- break;
- }
-
- if (mt.subtype == GUID_NULL) {
- TRACE(_T("Unknown audio OBI: %02x\n"), audio_desc->GetObjectTypeId());
- }
- } else if (AP4_MpegSystemSampleDescription* system_desc =
- dynamic_cast<AP4_MpegSystemSampleDescription*>(desc)) {
- const AP4_DataBuffer* di = system_desc->GetDecoderInfo();
- if (!di) {
- di = &empty;
- }
-
- switch (system_desc->GetObjectTypeId()) {
- case AP4_NERO_VOBSUB:
- if (di->GetDataSize() >= 16*4) {
- CSize size(720, 576);
- if (AP4_TkhdAtom* tkhd = dynamic_cast<AP4_TkhdAtom*>(track->GetTrakAtom()->GetChild(AP4_ATOM_TYPE_TKHD))) {
- size.cx = tkhd->GetWidth()>>16;
- size.cy = tkhd->GetHeight()>>16;
- }
-
- const AP4_Byte* pal = di->GetData();
- CAtlList<CStringA> sl;
- for (int i = 0; i < 16*4; i += 4) {
- BYTE y = (pal[i+1]-16)*255/219;
- BYTE u = pal[i+2];
- BYTE v = pal[i+3];
- BYTE r = (BYTE)min(max(1.0*y + 1.4022*(v-128), 0), 255);
- BYTE g = (BYTE)min(max(1.0*y - 0.3456*(u-128) - 0.7145*(v-128), 0), 255);
- BYTE b = (BYTE)min(max(1.0*y + 1.7710*(u-128), 0) , 255);
- CStringA str;
- str.Format("%02x%02x%02x", r, g, b);
- sl.AddTail(str);
- }
-
- CStringA hdr;
- hdr.Format(
- "# VobSub index file, v7 (do not modify this line!)\n"
- "size: %dx%d\n"
- "palette: %s\n",
- size.cx, size.cy,
- Implode(sl, ','));
-
- mt.majortype = MEDIATYPE_Subtitle;
- mt.subtype = MEDIASUBTYPE_VOBSUB;
- mt.formattype = FORMAT_SubtitleInfo;
- SUBTITLEINFO* si = (SUBTITLEINFO*)mt.AllocFormatBuffer(sizeof(SUBTITLEINFO) + hdr.GetLength());
- memset(si, 0, mt.FormatLength());
- si->dwOffset = sizeof(SUBTITLEINFO);
- strcpy_s(si->IsoLang, _countof(si->IsoLang), CStringA(TrackLanguage));
- wcscpy_s(si->TrackName, _countof(si->TrackName), TrackName);
- memcpy(si + 1, (LPCSTR)hdr, hdr.GetLength());
- mts.Add(mt);
- }
- break;
- }
-
- if (mt.subtype == GUID_NULL) {
- TRACE(_T("Unknown audio OBI: %02x\n"), system_desc->GetObjectTypeId());
- }
- } else if (AP4_UnknownSampleDescription* unknown_desc =
- dynamic_cast<AP4_UnknownSampleDescription*>(desc)) { // TEMP
- AP4_SampleEntry* sample_entry = unknown_desc->GetSampleEntry();
-
- if (dynamic_cast<AP4_TextSampleEntry*>(sample_entry)
- || dynamic_cast<AP4_Tx3gSampleEntry*>(sample_entry)) {
- mt.majortype = MEDIATYPE_Subtitle;
- mt.subtype = MEDIASUBTYPE_ASS2;
- mt.formattype = FORMAT_SubtitleInfo;
- CStringA hdr;
- hdr.Format(
- "[Script Info]\n"
- "ScriptType: v4.00++\n"
- "ScaledBorderAndShadow: yes\n"
- "PlayResX: %d\n"
- "PlayResY: %d\n"
- "[V4++ Styles]\n"
- "Style: Text,Arial,12,&H00ffffff,&H0000ffff,&H00000000,&H80000000,0,0,0,0,100,100,0,0.00,3,0,0,2,0,0,0,0,1,1\n",
- // "Style: Text,Arial,12,&H00ffffff,&H0000ffff,&H00000000,&H80000000,0,0,0,0,100,100,0,0.00,1,0,0,2,0,0,0,0,1,1\n",
- m_framesize.cx,
- m_framesize.cy);
- SUBTITLEINFO* si = (SUBTITLEINFO*)mt.AllocFormatBuffer(sizeof(SUBTITLEINFO) + hdr.GetLength());
- memset(si, 0, mt.FormatLength());
- si->dwOffset = sizeof(SUBTITLEINFO);
- strcpy_s(si->IsoLang, _countof(si->IsoLang), CStringA(TrackLanguage));
- wcscpy_s(si->TrackName, _countof(si->TrackName), TrackName);
- memcpy(si + 1, (LPCSTR)hdr, hdr.GetLength());
- mts.Add(mt);
- }
- }
- } else if (AP4_Avc1SampleEntry* avc1 = dynamic_cast<AP4_Avc1SampleEntry*>(
- track->GetTrakAtom()->FindChild("mdia/minf/stbl/stsd/avc1"))) {
- if (AP4_AvcCAtom* avcC = dynamic_cast<AP4_AvcCAtom*>(avc1->GetChild(AP4_ATOM_TYPE_AVCC))) {
- SetTrackName(&TrackName, _T("MPEG4 Video (H264)"));
-
- const AP4_DataBuffer* di = avcC->GetDecoderInfo();
- if (!di) {
- di = &empty;
- }
- int num = 1;
- int den = 1;
- if (AP4_PaspAtom* pasp = dynamic_cast<AP4_PaspAtom*>(avc1->GetChild(AP4_ATOM_TYPE_PASP))) {
- num = pasp->GetNum();
- den = pasp->GetDen();
- }
- if (num <= 0 || den <= 0) { // if bad AR
- num = den = 1; // then reset AR
- }
-
- const AP4_Byte* data = di->GetData();
- AP4_Size size = di->GetDataSize();
-
- mt.majortype = MEDIATYPE_Video;
- mt.subtype = FOURCCMap('1cva');
- mt.formattype = FORMAT_MPEG2Video;
-
- MPEG2VIDEOINFO* mvih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + size - 7);
- memset(mvih, 0, mt.FormatLength());
- mvih->hdr.bmiHeader.biSize = sizeof(mvih->hdr.bmiHeader);
- mvih->hdr.bmiHeader.biWidth = (LONG)avc1->GetWidth();
- mvih->hdr.bmiHeader.biHeight = (LONG)avc1->GetHeight();
- mvih->hdr.bmiHeader.biCompression = '1cva';
- mvih->hdr.bmiHeader.biPlanes = 1;
- mvih->hdr.bmiHeader.biBitCount = 24;
-
- CSize aspect(mvih->hdr.bmiHeader.biWidth * num, mvih->hdr.bmiHeader.biHeight * den);
- int lnko = LNKO(aspect.cx, aspect.cy);
- if (lnko > 1) {
- aspect.cx /= lnko, aspect.cy /= lnko;
- }
- mvih->hdr.dwPictAspectRatioX = aspect.cx;
- mvih->hdr.dwPictAspectRatioY = aspect.cy;
- if (item->GetData()->GetSampleCount()) {
- mvih->hdr.AvgTimePerFrame = item->GetData()->GetDurationMs()*10000 / (item->GetData()->GetSampleCount());
- }
- mvih->dwProfile = data[1];
- mvih->dwLevel = data[3];
- mvih->dwFlags = (data[4] & 3) + 1;
-
- mvih->cbSequenceHeader = 0;
-
- BYTE* src = (BYTE*)data + 5;
- BYTE* dst = (BYTE*)mvih->dwSequenceHeader;
-
- BYTE* src_end = (BYTE*)data + size;
- BYTE* dst_end = (BYTE*)mvih->dwSequenceHeader + size;
-
- for (int i = 0; i < 2; ++i) {
- for (int n = *src++ & 0x1f; n > 0; --n) {
- int len = ((src[0] << 8) | src[1]) + 2;
- if (src + len > src_end || dst + len > dst_end) {
- ASSERT(0);
- break;
- }
- memcpy(dst, src, len);
- src += len;
- dst += len;
- mvih->cbSequenceHeader += len;
- }
- }
-
- mts.Add(mt);
-
- mt.subtype = FOURCCMap(mvih->hdr.bmiHeader.biCompression = '1CVA');
- mts.Add(mt);
- //b_HasVideo = true;
- }
- } else if (AP4_StsdAtom* stsd = dynamic_cast<AP4_StsdAtom*>(
- track->GetTrakAtom()->FindChild("mdia/minf/stbl/stsd"))) {
- const AP4_DataBuffer& db = stsd->GetDataBuffer();
-
- for (AP4_List<AP4_Atom>::Item* item = stsd->GetChildren().FirstItem();
- item;
- item = item->GetNext()) {
- AP4_Atom* atom = item->GetData();
-
- AP4_Atom::Type type = atom->GetType();
- DWORD fourcc =
- ((type >> 24) & 0x000000ff) |
- ((type >> 8) & 0x0000ff00) |
- ((type << 8) & 0x00ff0000) |
- ((type << 24) & 0xff000000);
-
- if (AP4_VisualSampleEntry* vse = dynamic_cast<AP4_VisualSampleEntry*>(atom)) {
-
- if (type == AP4_ATOM_TYPE_MJPA || type == AP4_ATOM_TYPE_MJPB || type == AP4_ATOM_TYPE_MJPG) {
- SetTrackName(&TrackName, _T("M-Jpeg"));
- }
-
- mt.majortype = MEDIATYPE_Video;
- mt.subtype = FOURCCMap(fourcc);
- mt.formattype = FORMAT_VideoInfo;
- vih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER)+db.GetDataSize());
- memset(vih, 0, mt.FormatLength());
- vih->bmiHeader.biSize = sizeof(vih->bmiHeader);
- vih->bmiHeader.biWidth = (LONG)vse->GetWidth();
- vih->bmiHeader.biHeight = (LONG)vse->GetHeight();
- vih->bmiHeader.biCompression = fourcc;
- vih->bmiHeader.biBitCount = (LONG)vse->GetDepth();
- memcpy(vih+1, db.GetData(), db.GetDataSize());
- mts.Add(mt);
-
- char buff[5];
- memcpy(buff, &fourcc, 4);
- buff[4] = 0;
-
- _strlwr_s(buff);
- AP4_Atom::Type typelwr = *(AP4_Atom::Type*)buff;
-
- if (typelwr != fourcc) {
- mt.subtype = FOURCCMap(vih->bmiHeader.biCompression = typelwr);
- mts.Add(mt);
- //b_HasVideo = true;
- }
-
- _strupr_s(buff);
- AP4_Atom::Type typeupr = *(AP4_Atom::Type*)buff;
-
- if (typeupr != fourcc) {
- mt.subtype = FOURCCMap(vih->bmiHeader.biCompression = typeupr);
- mts.Add(mt);
- //b_HasVideo = true;
- }
-
- break;
- } else if (AP4_AudioSampleEntry* ase = dynamic_cast<AP4_AudioSampleEntry*>(atom)) {
- DWORD samplerate = ase->GetSampleRate();
- WORD channels = ase->GetChannelCount();
- WORD bitspersample = ase->GetSampleSize();
-
- // overwrite audio fourc
- if ((type & 0xffff0000) == AP4_ATOM_TYPE('m', 's', 0, 0)) {
- fourcc = type & 0xffff;
- } else if (type == AP4_ATOM_TYPE_ALAW) {
- fourcc = WAVE_FORMAT_ALAW;
- SetTrackName(&TrackName, _T("PCM A-law"));
- } else if (type == AP4_ATOM_TYPE_ULAW) {
- fourcc = WAVE_FORMAT_MULAW;
- SetTrackName(&TrackName, _T("PCM mu-law"));
- } else if (type == AP4_ATOM_TYPE__MP3) {
- SetTrackName(&TrackName, _T("MPEG Audio (MP3)"));
- fourcc = WAVE_FORMAT_MPEGLAYER3;
- } else if ((type == AP4_ATOM_TYPE__AC3) || (type == AP4_ATOM_TYPE_SAC3) || (type == AP4_ATOM_TYPE_EAC3)) {
- fourcc = 0x2000;
- if (type == AP4_ATOM_TYPE_EAC3) {
- SetTrackName(&TrackName, _T("AC-3 Audio"));
- } else {
- SetTrackName(&TrackName, _T("Enhanced AC-3 audio"));
- }
- } else if (type == AP4_ATOM_TYPE_MP4A) {
- fourcc = WAVE_FORMAT_AAC;
- SetTrackName(&TrackName, _T("MPEG-2 Audio AAC"));
- } else if (type == AP4_ATOM_TYPE_NMOS) {
- fourcc = MAKEFOURCC('N','E','L','L');
- SetTrackName(&TrackName, _T("NellyMoser Audio"));
- } else if (type == AP4_ATOM_TYPE_ALAC) {
- fourcc = MAKEFOURCC('a','l','a','c');
- SetTrackName(&TrackName, _T("Alac Audio"));
- } else if ((type == AP4_ATOM_TYPE_NONE || type == AP4_ATOM_TYPE_RAW) && bitspersample == 8 ||
- type == AP4_ATOM_TYPE_SOWT && bitspersample == 16 ||
- (type == AP4_ATOM_TYPE_IN24 || type == AP4_ATOM_TYPE_IN32) && ase->GetEndian()==ENDIAN_LITTLE) {
- fourcc = type = WAVE_FORMAT_PCM;
- } else if ((type == AP4_ATOM_TYPE_FL32 || type == AP4_ATOM_TYPE_FL64) && ase->GetEndian()==ENDIAN_LITTLE) {
- fourcc = type = WAVE_FORMAT_IEEE_FLOAT;
- } else if (type == AP4_ATOM_TYPE_LPCM) {
- DWORD flags = ase->GetFormatSpecificFlags();
- if (flags & 2) { // big endian
- if (flags & 1) { // floating point
- if (bitspersample == 32) type = AP4_ATOM_TYPE_FL32;
- else if (bitspersample == 64) type = AP4_ATOM_TYPE_FL64;
- } else {
- if (bitspersample == 16) type = AP4_ATOM_TYPE_TWOS;
- else if (bitspersample == 24) type = AP4_ATOM_TYPE_IN24;
- else if (bitspersample == 32) type = AP4_ATOM_TYPE_IN32;
- }
- fourcc = ((type >> 24) & 0x000000ff) |
- ((type >> 8) & 0x0000ff00) |
- ((type << 8) & 0x00ff0000) |
- ((type << 24) & 0xff000000);
- } else { // little endian
- if (flags & 1) { // floating point
- fourcc = type = WAVE_FORMAT_IEEE_FLOAT;
- } else {
- fourcc = type = WAVE_FORMAT_PCM;
- }
- }
- }
-
- DWORD nAvgBytesPerSec = 0;
- if (type == AP4_ATOM_TYPE_EAC3) {
-
- AP4_Sample sample;
- AP4_DataBuffer sample_data;
-
- AP4_Cardinal SampleCount = track->GetSampleCount();
- if (SampleCount) {
- track->ReadSample(1, sample, sample_data);
- const AP4_Byte* data = sample_data.GetData();
- AP4_Size size = sample_data.GetDataSize();
-
- CGolombBuffer gb((BYTE *)data, size);
- for (; size >= 7 && gb.BitRead(16, true) != 0x0b77; --size) {
- gb.BitRead(8);
- }
- WORD sync = (WORD)gb.BitRead(16);
- if ((size >= 7) && (sync == 0x0b77)) {
- static DWORD freq[] = {48000, 44100, 32000, 0};
- gb.BitRead(2);
- gb.BitRead(3);
- WORD frame_size = ((WORD)gb.BitRead(11) + 1) << 1;
- BYTE sr_code = (BYTE)gb.BitRead(2);
- if (sr_code == 3) {
- BYTE sr_code2 = (BYTE)gb.BitRead(2);
- samplerate = freq[sr_code2] / 2;
- } else {
- static BYTE eac3_blocks[4] = {1, 2, 3, 6};
- BYTE num_blocks = eac3_blocks[gb.BitRead(2)];
- samplerate = freq[sr_code];
- nAvgBytesPerSec = frame_size * samplerate / (num_blocks * 256);
- }
- BYTE acmod = (BYTE)gb.BitRead(3);
- BYTE lfeon = (BYTE)gb.BitRead(1);
- static WORD channels_tbl[] = {2, 1, 2, 3, 3, 4, 4, 5};
- channels = channels_tbl[acmod] + lfeon;
- }
- }
- }
-
- mt.majortype = MEDIATYPE_Audio;
- mt.formattype = FORMAT_WaveFormatEx;
- wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX));
- memset(wfe, 0, mt.FormatLength());
- if (!(fourcc & 0xffff0000)) {
- wfe->wFormatTag = (WORD)fourcc;
- }
- wfe->nSamplesPerSec = samplerate;
- wfe->nChannels = channels;
- wfe->wBitsPerSample = bitspersample;
- wfe->nBlockAlign = ase->GetBytesPerFrame();
- if (nAvgBytesPerSec == 0 && ase->GetSamplesPerPacket() > 0) {
- wfe->nAvgBytesPerSec = wfe->nSamplesPerSec * wfe->nBlockAlign / ase->GetSamplesPerPacket();
- }
-
- mt.subtype = FOURCCMap(fourcc);
-
-
- if (type == AP4_ATOM_TYPE('m', 's', 0x00, 0x02)) {
- const WORD numcoef = 7;
- static ADPCMCOEFSET coef[] = { {256, 0}, {512, -256}, {0,0}, {192,64}, {240,0}, {460, -208}, {392,-232} };
- const ULONG size = sizeof(ADPCMWAVEFORMAT) + (numcoef * sizeof(ADPCMCOEFSET));
- ADPCMWAVEFORMAT* format = (ADPCMWAVEFORMAT*)mt.ReallocFormatBuffer(size);
- if (format != NULL) {
- format->wfx.wFormatTag = WAVE_FORMAT_ADPCM;
- format->wfx.wBitsPerSample = 4;
- format->wfx.cbSize = (WORD)(size - sizeof(WAVEFORMATEX));
- format->wSamplesPerBlock = format->wfx.nBlockAlign * 2 / format->wfx.nChannels - 12;
- format->wNumCoef = numcoef;
- memcpy( format->aCoef, coef, sizeof(coef) );
- }
- } else if (type == AP4_ATOM_TYPE('m', 's', 0x00, 0x11)) {
- IMAADPCMWAVEFORMAT* format = (IMAADPCMWAVEFORMAT*)mt.ReallocFormatBuffer(sizeof(IMAADPCMWAVEFORMAT));
- if (format != NULL) {
- format->wfx.wFormatTag = WAVE_FORMAT_IMA_ADPCM;
- format->wfx.wBitsPerSample = 4;
- format->wfx.cbSize = (WORD)(sizeof(IMAADPCMWAVEFORMAT) - sizeof(WAVEFORMATEX));
- int X = (format->wfx.nBlockAlign - (4 * format->wfx.nChannels)) * 8;
- int Y = format->wfx.wBitsPerSample * format->wfx.nChannels;
- format->wSamplesPerBlock = (X / Y) + 1;
- }
- } else if (type == AP4_ATOM_TYPE_ALAC) {
- const AP4_Byte* data = db.GetData();
- AP4_Size size = db.GetDataSize();
-
- while (size >= 36) {
- if ((*(DWORD*)(data) == 0x24000000) && (*(DWORD*)(data+4) == 0x63616c61)) {
- break;
- }
- size--;
- data++;
- }
-
- if (size >= 36) {
- wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + 36);
- wfe->cbSize = 36;
- memcpy(wfe+1, data, 36);
- }
- } else if (type == WAVE_FORMAT_PCM) {
- mt.SetSampleSize(wfe->nBlockAlign);
- if (channels > 2 || bitspersample > 16) {
- WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEXTENSIBLE));
- if (wfex != NULL) {
- wfex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
- wfex->Format.cbSize = 22;
- wfex->Samples.wValidBitsPerSample = bitspersample;
- wfex->dwChannelMask = GetDefChannelMask(channels); // TODO: get correct channel mask from mov file
- wfex->SubFormat = MEDIASUBTYPE_PCM;
- }
- }
- } else if (type == WAVE_FORMAT_IEEE_FLOAT) {
- mt.SetSampleSize(wfe->nBlockAlign);
- if (channels > 2) {
- WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEXTENSIBLE));
- if (wfex != NULL) {
- wfex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
- wfex->Format.cbSize = 22;
- wfex->Samples.wValidBitsPerSample = bitspersample;
- wfex->dwChannelMask = GetDefChannelMask(channels); // TODO: get correct channel mask from mov file
- wfex->SubFormat = MEDIASUBTYPE_IEEE_FLOAT;
- }
- }
- } else if (type == AP4_ATOM_TYPE_MP4A ||
- type == AP4_ATOM_TYPE_ALAW ||
- type == AP4_ATOM_TYPE_ULAW) {
- // not need any extra data for ALAW, ULAW
- // also extra data is not required for IMA4, MAC3, MAC6
- } else if (db.GetDataSize() > 0) {
- //always needed extra data for QDM2
- wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + db.GetDataSize());
- wfe->cbSize = db.GetDataSize();
- memcpy(wfe+1, db.GetData(), db.GetDataSize());
- }
-
- mts.Add(mt);
- break;
- } else {
- TRACE(_T("Unknow MP4 Stream %x") , fourcc);
- }
- }
- }
-
- if (mts.IsEmpty()) {
- continue;
- }
-
- REFERENCE_TIME rtDuration = 10000i64 * track->GetDurationMs();
- if (m_rtDuration < rtDuration) {
- m_rtDuration = rtDuration;
- }
- if (rtVideoDuration < rtDuration && AP4_Track::TYPE_VIDEO == track->GetType())
- rtVideoDuration = rtDuration; // get the max video duration
-
- DWORD id = track->GetId();
-
- CStringW name, lang;
- name.Format(L"Output %d", id);
-
- if (!TrackName.IsEmpty()) {
- name = TrackName;
- }
-
- if (!TrackLanguage.IsEmpty()) {
- if (TrackLanguage != L"und") {
- name += " (" + TrackLanguage + ")";
- }
- }
-
- for (int i = 0, j = mts.GetCount(); i < j; ++i) {
- BITMAPINFOHEADER bih;
- if (ExtractBIH(&mts[i], &bih)) {
- m_framesize.cx = bih.biWidth;
- m_framesize.cy = abs(bih.biHeight);
- }
- }
-
- CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CMP4SplitterOutputPin(mts, name, this, this, &hr));
-
- if (!TrackName.IsEmpty()) {
- pPinOut->SetProperty(L"NAME", TrackName);
- }
- if (!TrackLanguage.IsEmpty()) {
- pPinOut->SetProperty(L"LANG", CStringW(TrackLanguage));
- }
-
- EXECUTE_ASSERT(SUCCEEDED(AddOutputPin(id, pPinOut)));
-
- m_trackpos[id] = trackpos();
-
- if (mts.GetCount() == 1 && mts[0].subtype == MEDIASUBTYPE_ASS2) {
- LPCWSTR postfix = L" (plain text)";
-
- mts[0].subtype = MEDIASUBTYPE_UTF8;
-
- SUBTITLEINFO* si = (SUBTITLEINFO*)mts[0].ReallocFormatBuffer(sizeof(SUBTITLEINFO));
- wcscat_s(si->TrackName, postfix);
-
- id ^= 0x80402010; // FIXME: until fixing, let's hope there won't be another track like this...
-
- CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CMP4SplitterOutputPin(mts, name + postfix, this, this, &hr));
-
- if (!TrackName.IsEmpty()) {
- pPinOut->SetProperty(L"NAME", TrackName + postfix);
- }
- if (!TrackLanguage.IsEmpty()) {
- pPinOut->SetProperty(L"LANG", CStringW(TrackLanguage));
- }
-
- EXECUTE_ASSERT(SUCCEEDED(AddOutputPin(id, pPinOut)));
- }
- }
-
- if (AP4_ChplAtom* chpl = dynamic_cast<AP4_ChplAtom*>(movie->GetMoovAtom()->FindChild("udta/chpl"))) {
- AP4_Array<AP4_ChplAtom::AP4_Chapter>& chapters = chpl->GetChapters();
-
- for (AP4_Cardinal i = 0; i < chapters.ItemCount(); ++i) {
- AP4_ChplAtom::AP4_Chapter& chapter = chapters[i];
- ChapAppend(chapter.Time, UTF8To16(ConvertMBCS(chapter.Name.c_str(), ANSI_CHARSET, CP_UTF8))); // this is b0rked, thx to nero :P
- }
-
- ChapSort();
- }
-
- if (AP4_ContainerAtom* ilst = dynamic_cast<AP4_ContainerAtom*>(movie->GetMoovAtom()->FindChild("udta/meta/ilst"))) {
- CStringW title, artist, writer, album, year, appl, desc, gen, track;
-
- for (AP4_List<AP4_Atom>::Item* item = ilst->GetChildren().FirstItem();
- item;
- item = item->GetNext()) {
- if (AP4_ContainerAtom* atom = dynamic_cast<AP4_ContainerAtom*>(item->GetData())) {
- if (AP4_DataAtom* data = dynamic_cast<AP4_DataAtom*>(atom->GetChild(AP4_ATOM_TYPE_DATA))) {
- const AP4_DataBuffer* db = data->GetData();
-
- if (atom->GetType() == AP4_ATOM_TYPE_TRKN) {
- if (db->GetDataSize() >= 4) {
- unsigned short n = (db->GetData()[2] << 8) | db->GetData()[3];
- if (n > 0 && n < 100) {
- track.Format(L"%02d", n);
- } else if (n >= 100) {
- track.Format(L"%d", n);
- }
- }
- } else {
- CStringW str = UTF8To16(CStringA((LPCSTR)db->GetData(), db->GetDataSize()));
-
- switch (atom->GetType()) {
- case AP4_ATOM_TYPE_NAM:
- title = str;
- break;
- case AP4_ATOM_TYPE_ART:
- artist = str;
- break;
- case AP4_ATOM_TYPE_WRT:
- writer = str;
- break;
- case AP4_ATOM_TYPE_ALB:
- album = str;
- break;
- case AP4_ATOM_TYPE_DAY:
- year = str;
- break;
- case AP4_ATOM_TYPE_TOO:
- appl = str;
- break;
- case AP4_ATOM_TYPE_CMT:
- desc = str;
- break;
- case AP4_ATOM_TYPE_GEN:
- gen = str;
- break;
- }
- }
- }
- }
- }
-
- if (!title.IsEmpty()) {
- if (!track.IsEmpty()) {
- title = track + L" - " + title;
- }
- if (!album.IsEmpty()) {
- title = album + L" - " + title;
- }
- if (!year.IsEmpty()) {
- title += L" - " + year;
- }
- if (!gen.IsEmpty()) {
- title += L" - " + gen;
- }
- SetProperty(L"TITL", title);
- }
-
- if (!artist.IsEmpty()) {
- SetProperty(L"AUTH", artist);
- } else if (!writer.IsEmpty()) {
- SetProperty(L"AUTH", writer);
- }
-
- if (!appl.IsEmpty()) {
- SetProperty(L"APPL", appl);
- }
-
- if (!desc.IsEmpty()) {
- SetProperty(L"DESC", desc);
- }
- }
- }
-
- if (rtVideoDuration > 0 && rtVideoDuration < m_rtDuration/2)
- m_rtDuration = rtVideoDuration; // fix incorrect duration
-
- m_rtNewStop = m_rtStop = m_rtDuration;
-
- TRACE(_T("CMP4SplitterFilter m_pOutputs.GetCount() = %d") , m_pOutputs.GetCount());
-
- return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
+ CheckPointer(pAsyncReader, E_POINTER);
+
+ HRESULT hr = E_FAIL;
+
+ //bool b_HasVideo = false;
+
+ m_trackpos.RemoveAll();
+
+ m_pFile.Free();
+ m_pFile.Attach(DNew CMP4SplitterFile(pAsyncReader, hr));
+ if (!m_pFile) {
+ return E_OUTOFMEMORY;
+ }
+ if (FAILED(hr)) {
+ m_pFile.Free();
+ return hr;
+ }
+
+ m_rtNewStart = m_rtCurrent = 0;
+ m_rtNewStop = m_rtStop = m_rtDuration = 0;
+ REFERENCE_TIME rtVideoDuration = 0;
+
+ m_framesize.SetSize(640, 480);
+
+ if (AP4_Movie* movie = (AP4_Movie*)m_pFile->GetMovie()) {
+ // looking for main video track (skip tracks with motionless frames)
+ AP4_UI32 mainvideoID = 0;
+ for (AP4_List<AP4_Track>::Item* item = movie->GetTracks().FirstItem();
+ item;
+ item = item->GetNext()) {
+ AP4_Track* track = item->GetData();
+
+ if (track->GetType() != AP4_Track::TYPE_VIDEO) {
+ continue;
+ }
+ if (!mainvideoID) {
+ mainvideoID = track->GetId();
+ }
+ if (AP4_StssAtom* stss = dynamic_cast<AP4_StssAtom*>(track->GetTrakAtom()->FindChild("mdia/minf/stbl/stss"))) {
+ if (stss->m_Entries.ItemCount() > 0) {
+ mainvideoID = track->GetId();
+ break;
+ }
+ }
+ }
+ // process the tracks
+ for (AP4_List<AP4_Track>::Item* item = movie->GetTracks().FirstItem();
+ item;
+ item = item->GetNext()) {
+ AP4_Track* track = item->GetData();
+
+ if (track->GetType() != AP4_Track::TYPE_VIDEO
+ && track->GetType() != AP4_Track::TYPE_AUDIO
+ && track->GetType() != AP4_Track::TYPE_TEXT
+ && track->GetType() != AP4_Track::TYPE_SUBP) {
+ continue;
+ }
+
+ //if (b_HasVideo && track->GetType() == AP4_Track::TYPE_VIDEO) {
+ if (track->GetType() == AP4_Track::TYPE_VIDEO && track->GetId() != mainvideoID) {
+ continue;
+ }
+
+ AP4_Sample sample;
+
+ if (!AP4_SUCCEEDED(track->GetSample(0, sample)) || sample.GetDescriptionIndex() == 0xFFFFFFFF) {
+ continue;
+ }
+
+ CStringW TrackName = UTF8ToStringW(track->GetTrackName().c_str());
+ if (TrackName.IsEmpty()) {
+ TrackName = LocalToStringW(track->GetTrackName().c_str()); //Trying Local...
+ }
+ TrackName.TrimLeft(_T("\x0010\x0013\x0015\x0017\x0018\x0019\x001A\x001B"));
+ TrackName.Trim();
+
+ CStringA TrackLanguage = track->GetTrackLanguage().c_str();
+
+ CAtlArray<CMediaType> mts;
+
+ CMediaType mt;
+ mt.SetSampleSize(1);
+
+ VIDEOINFOHEADER* vih = NULL;
+ WAVEFORMATEX* wfe = NULL;
+
+ AP4_DataBuffer empty;
+
+ if (AP4_SampleDescription* desc = track->GetSampleDescription(sample.GetDescriptionIndex())) {
+ AP4_MpegSampleDescription* mpeg_desc = NULL;
+
+ if (desc->GetType() == AP4_SampleDescription::TYPE_MPEG) {
+ mpeg_desc = dynamic_cast<AP4_MpegSampleDescription*>(desc);
+ } else if (desc->GetType() == AP4_SampleDescription::TYPE_ISMACRYP) {
+ AP4_IsmaCrypSampleDescription* isma_desc = dynamic_cast<AP4_IsmaCrypSampleDescription*>(desc);
+ mpeg_desc = isma_desc->GetOriginalSampleDescription();
+ }
+
+ if (mpeg_desc) {
+ CStringW TypeString = CStringW(mpeg_desc->GetObjectTypeString(mpeg_desc->GetObjectTypeId()));
+ if ((TypeString.Find(_T("UNKNOWN")) == -1) && (TypeString.Find(_T("INVALID")) == -1)) {
+ SetTrackName(&TrackName, TypeString);
+ }
+ }
+
+ if (AP4_MpegVideoSampleDescription* video_desc =
+ dynamic_cast<AP4_MpegVideoSampleDescription*>(mpeg_desc)) {
+ const AP4_DataBuffer* di = video_desc->GetDecoderInfo();
+ if (!di) {
+ di = &empty;
+ }
+
+ LONG biWidth = (LONG)video_desc->GetWidth();
+ LONG biHeight = (LONG)video_desc->GetHeight();
+
+ if (!biWidth || !biHeight) {
+ if (AP4_TkhdAtom* tkhd = dynamic_cast<AP4_TkhdAtom*>(track->GetTrakAtom()->GetChild(AP4_ATOM_TYPE_TKHD))) {
+ biWidth = tkhd->GetWidth() >> 16;
+ biHeight = tkhd->GetHeight() >> 16;
+ }
+ }
+
+ if (!biWidth || !biHeight) {
+ continue;
+ }
+
+ mt.majortype = MEDIATYPE_Video;
+ mt.formattype = FORMAT_VideoInfo;
+ vih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + di->GetDataSize());
+ memset(vih, 0, mt.FormatLength());
+ vih->dwBitRate = video_desc->GetAvgBitrate() / 8;
+ vih->bmiHeader.biSize = sizeof(vih->bmiHeader);
+ vih->bmiHeader.biWidth = biWidth;
+ vih->bmiHeader.biHeight = biHeight;
+ memcpy(vih + 1, di->GetData(), di->GetDataSize());
+
+ switch (video_desc->GetObjectTypeId()) {
+ case AP4_MPEG4_VISUAL_OTI:
+ mt.subtype = FOURCCMap('v4pm');
+ mt.formattype = FORMAT_MPEG2Video;
+ {
+ MPEG2VIDEOINFO* mvih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + di->GetDataSize());
+ memset(mvih, 0, mt.FormatLength());
+ mvih->hdr.bmiHeader.biSize = sizeof(mvih->hdr.bmiHeader);
+ mvih->hdr.bmiHeader.biWidth = biWidth;
+ mvih->hdr.bmiHeader.biHeight = biHeight;
+ mvih->hdr.bmiHeader.biCompression = 'v4pm';
+ mvih->hdr.bmiHeader.biPlanes = 1;
+ mvih->hdr.bmiHeader.biBitCount = 24;
+ mvih->hdr.dwPictAspectRatioX = mvih->hdr.bmiHeader.biWidth;
+ mvih->hdr.dwPictAspectRatioY = mvih->hdr.bmiHeader.biHeight;
+ mvih->cbSequenceHeader = di->GetDataSize();
+ memcpy(mvih->dwSequenceHeader, di->GetData(), di->GetDataSize());
+ mts.Add(mt);
+ mt.subtype = FOURCCMap(mvih->hdr.bmiHeader.biCompression = 'V4PM');
+ mts.Add(mt);
+ //b_HasVideo = true;
+ }
+ break;
+ case AP4_JPEG_OTI:
+ mt.subtype = FOURCCMap('gepj');
+ mt.formattype = FORMAT_MPEG2Video;
+ {
+ MPEG2VIDEOINFO* mvih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + di->GetDataSize());
+ memset(mvih, 0, mt.FormatLength());
+ mvih->hdr.bmiHeader.biSize = sizeof(mvih->hdr.bmiHeader);
+ mvih->hdr.bmiHeader.biWidth = biWidth;
+ mvih->hdr.bmiHeader.biHeight = biHeight;
+ mvih->hdr.bmiHeader.biCompression = 'gepj';
+ mvih->hdr.bmiHeader.biPlanes = 1;
+ mvih->hdr.bmiHeader.biBitCount = 24;
+ mvih->hdr.dwPictAspectRatioX = mvih->hdr.bmiHeader.biWidth;
+ mvih->hdr.dwPictAspectRatioY = mvih->hdr.bmiHeader.biHeight;
+ mvih->cbSequenceHeader = di->GetDataSize();
+ memcpy(mvih->dwSequenceHeader, di->GetData(), di->GetDataSize());
+ mts.Add(mt);
+ //b_HasVideo = true;
+ }
+ break;
+ case AP4_MPEG2_VISUAL_SIMPLE_OTI:
+ case AP4_MPEG2_VISUAL_MAIN_OTI:
+ case AP4_MPEG2_VISUAL_SNR_OTI:
+ case AP4_MPEG2_VISUAL_SPATIAL_OTI:
+ case AP4_MPEG2_VISUAL_HIGH_OTI:
+ case AP4_MPEG2_VISUAL_422_OTI:
+ mt.subtype = MEDIASUBTYPE_MPEG2_VIDEO;
+ {
+ m_pFile->Seek(sample.GetOffset());
+ CBaseSplitterFileEx::seqhdr h;
+ CMediaType mt2;
+ if (m_pFile->Read(h, sample.GetSize(), &mt2)) {
+ mt = mt2;
+ }
+ }
+ mts.Add(mt);
+ break;
+ case AP4_MPEG1_VISUAL_OTI: // ???
+ mt.subtype = MEDIASUBTYPE_MPEG1Payload;
+ {
+ m_pFile->Seek(sample.GetOffset());
+ CBaseSplitterFileEx::seqhdr h;
+ CMediaType mt2;
+ if (m_pFile->Read(h, sample.GetSize(), &mt2)) {
+ mt = mt2;
+ }
+ }
+ mts.Add(mt);
+ break;
+ }
+
+ if (mt.subtype == GUID_NULL) {
+ TRACE(_T("Unknown video OBI: %02x\n"), video_desc->GetObjectTypeId());
+ }
+ } else if (AP4_MpegAudioSampleDescription* audio_desc =
+ dynamic_cast<AP4_MpegAudioSampleDescription*>(mpeg_desc)) {
+ const AP4_DataBuffer* di = audio_desc->GetDecoderInfo();
+ if (!di) {
+ di = &empty;
+ }
+
+ mt.majortype = MEDIATYPE_Audio;
+ mt.formattype = FORMAT_WaveFormatEx;
+
+ wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX) + di->GetDataSize());
+ memset(wfe, 0, mt.FormatLength());
+ wfe->nSamplesPerSec = audio_desc->GetSampleRate();
+ wfe->nAvgBytesPerSec = audio_desc->GetAvgBitrate() / 8;
+ wfe->nChannels = audio_desc->GetChannelCount();
+ wfe->wBitsPerSample = audio_desc->GetSampleSize();
+ wfe->cbSize = (WORD)di->GetDataSize();
+ wfe->nBlockAlign = (WORD)((wfe->nChannels * wfe->wBitsPerSample) / 8);
+
+ memcpy(wfe + 1, di->GetData(), di->GetDataSize());
+
+ switch (audio_desc->GetObjectTypeId()) {
+ case AP4_MPEG4_AUDIO_OTI:
+ case AP4_MPEG2_AAC_AUDIO_MAIN_OTI: // ???
+ case AP4_MPEG2_AAC_AUDIO_LC_OTI: // ???
+ case AP4_MPEG2_AAC_AUDIO_SSRP_OTI: // ???
+ if (di->GetDataSize() > 10) {
+ if (*(DWORD*)(di->GetData() + 6) == 0x00534c41) { // 'ALS\0' sync word
+ wfe->wFormatTag = WAVE_FORMAT_UNKNOWN;
+ mt.subtype = FOURCCMap(MAKEFOURCC('A', 'L', 'S', ' ')); // create our own GUID - {20534C41-0000-0010-8000-00AA00389B71}
+ mts.Add(mt);
+ break;
+ }
+ }
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_AAC);
+ if (wfe->cbSize >= 2 && wfe->nChannels < 8) {
+ wfe->nChannels = (((BYTE*)(wfe + 1))[1] >> 3) & 0xf;
+ wfe->nBlockAlign = (WORD)((wfe->nChannels * wfe->wBitsPerSample) / 8);
+ }
+ mts.Add(mt);
+ break;
+ case AP4_MPEG2_PART3_AUDIO_OTI: // ???
+ case AP4_MPEG1_AUDIO_OTI:
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_MP3);
+ {
+ m_pFile->Seek(sample.GetOffset());
+ CBaseSplitterFileEx::mpahdr h;
+ CMediaType mt2;
+ if (m_pFile->Read(h, sample.GetSize(), false, &mt2)) {
+ mt = mt2;
+ }
+ }
+ mts.Add(mt);
+ break;
+ case AP4_DTSC_AUDIO_OTI:
+ case AP4_DTSH_AUDIO_OTI:
+ case AP4_DTSL_AUDIO_OTI:
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_DVD_DTS);
+ {
+ m_pFile->Seek(sample.GetOffset());
+ CBaseSplitterFileEx::dtshdr h;
+ CMediaType mt2;
+ if (m_pFile->Read(h, sample.GetSize(), &mt2)) {
+ mt = mt2;
+ }
+ }
+ mts.Add(mt);
+ break;
+ }
+
+ if (mt.subtype == GUID_NULL) {
+ TRACE(_T("Unknown audio OBI: %02x\n"), audio_desc->GetObjectTypeId());
+ }
+ } else if (AP4_MpegSystemSampleDescription* system_desc =
+ dynamic_cast<AP4_MpegSystemSampleDescription*>(desc)) {
+ const AP4_DataBuffer* di = system_desc->GetDecoderInfo();
+ if (!di) {
+ di = &empty;
+ }
+
+ switch (system_desc->GetObjectTypeId()) {
+ case AP4_NERO_VOBSUB:
+ if (di->GetDataSize() >= 16 * 4) {
+ CSize size(720, 576);
+ if (AP4_TkhdAtom* tkhd = dynamic_cast<AP4_TkhdAtom*>(track->GetTrakAtom()->GetChild(AP4_ATOM_TYPE_TKHD))) {
+ size.cx = tkhd->GetWidth() >> 16;
+ size.cy = tkhd->GetHeight() >> 16;
+ }
+
+ const AP4_Byte* pal = di->GetData();
+ CAtlList<CStringA> sl;
+ for (int i = 0; i < 16 * 4; i += 4) {
+ BYTE y = (pal[i + 1] - 16) * 255 / 219;
+ BYTE u = pal[i + 2];
+ BYTE v = pal[i + 3];
+ BYTE r = (BYTE)min(max(1.0 * y + 1.4022 * (v - 128), 0), 255);
+ BYTE g = (BYTE)min(max(1.0 * y - 0.3456 * (u - 128) - 0.7145 * (v - 128), 0), 255);
+ BYTE b = (BYTE)min(max(1.0 * y + 1.7710 * (u - 128), 0) , 255);
+ CStringA str;
+ str.Format("%02x%02x%02x", r, g, b);
+ sl.AddTail(str);
+ }
+
+ CStringA hdr;
+ hdr.Format(
+ "# VobSub index file, v7 (do not modify this line!)\n"
+ "size: %dx%d\n"
+ "palette: %s\n",
+ size.cx, size.cy,
+ Implode(sl, ','));
+
+ mt.majortype = MEDIATYPE_Subtitle;
+ mt.subtype = MEDIASUBTYPE_VOBSUB;
+ mt.formattype = FORMAT_SubtitleInfo;
+ SUBTITLEINFO* si = (SUBTITLEINFO*)mt.AllocFormatBuffer(sizeof(SUBTITLEINFO) + hdr.GetLength());
+ memset(si, 0, mt.FormatLength());
+ si->dwOffset = sizeof(SUBTITLEINFO);
+ strcpy_s(si->IsoLang, _countof(si->IsoLang), CStringA(TrackLanguage));
+ wcscpy_s(si->TrackName, _countof(si->TrackName), TrackName);
+ memcpy(si + 1, (LPCSTR)hdr, hdr.GetLength());
+ mts.Add(mt);
+ }
+ break;
+ }
+
+ if (mt.subtype == GUID_NULL) {
+ TRACE(_T("Unknown audio OBI: %02x\n"), system_desc->GetObjectTypeId());
+ }
+ } else if (AP4_UnknownSampleDescription* unknown_desc =
+ dynamic_cast<AP4_UnknownSampleDescription*>(desc)) { // TEMP
+ AP4_SampleEntry* sample_entry = unknown_desc->GetSampleEntry();
+
+ if (dynamic_cast<AP4_TextSampleEntry*>(sample_entry)
+ || dynamic_cast<AP4_Tx3gSampleEntry*>(sample_entry)) {
+ mt.majortype = MEDIATYPE_Subtitle;
+ mt.subtype = MEDIASUBTYPE_ASS2;
+ mt.formattype = FORMAT_SubtitleInfo;
+ CStringA hdr;
+ hdr.Format(
+ "[Script Info]\n"
+ "ScriptType: v4.00++\n"
+ "ScaledBorderAndShadow: yes\n"
+ "PlayResX: %d\n"
+ "PlayResY: %d\n"
+ "[V4++ Styles]\n"
+ "Style: Text,Arial,12,&H00ffffff,&H0000ffff,&H00000000,&H80000000,0,0,0,0,100,100,0,0.00,3,0,0,2,0,0,0,0,1,1\n",
+ // "Style: Text,Arial,12,&H00ffffff,&H0000ffff,&H00000000,&H80000000,0,0,0,0,100,100,0,0.00,1,0,0,2,0,0,0,0,1,1\n",
+ m_framesize.cx,
+ m_framesize.cy);
+ SUBTITLEINFO* si = (SUBTITLEINFO*)mt.AllocFormatBuffer(sizeof(SUBTITLEINFO) + hdr.GetLength());
+ memset(si, 0, mt.FormatLength());
+ si->dwOffset = sizeof(SUBTITLEINFO);
+ strcpy_s(si->IsoLang, _countof(si->IsoLang), CStringA(TrackLanguage));
+ wcscpy_s(si->TrackName, _countof(si->TrackName), TrackName);
+ memcpy(si + 1, (LPCSTR)hdr, hdr.GetLength());
+ mts.Add(mt);
+ }
+ }
+ } else if (AP4_Avc1SampleEntry* avc1 = dynamic_cast<AP4_Avc1SampleEntry*>(
+ track->GetTrakAtom()->FindChild("mdia/minf/stbl/stsd/avc1"))) {
+ if (AP4_AvcCAtom* avcC = dynamic_cast<AP4_AvcCAtom*>(avc1->GetChild(AP4_ATOM_TYPE_AVCC))) {
+ SetTrackName(&TrackName, _T("MPEG4 Video (H264)"));
+
+ const AP4_DataBuffer* di = avcC->GetDecoderInfo();
+ if (!di) {
+ di = &empty;
+ }
+ int num = 1;
+ int den = 1;
+ if (AP4_PaspAtom* pasp = dynamic_cast<AP4_PaspAtom*>(avc1->GetChild(AP4_ATOM_TYPE_PASP))) {
+ num = pasp->GetNum();
+ den = pasp->GetDen();
+ }
+ if (num <= 0 || den <= 0) { // if bad AR
+ num = den = 1; // then reset AR
+ }
+
+ const AP4_Byte* data = di->GetData();
+ AP4_Size size = di->GetDataSize();
+
+ mt.majortype = MEDIATYPE_Video;
+ mt.subtype = FOURCCMap('1cva');
+ mt.formattype = FORMAT_MPEG2Video;
+
+ MPEG2VIDEOINFO* mvih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + size - 7);
+ memset(mvih, 0, mt.FormatLength());
+ mvih->hdr.bmiHeader.biSize = sizeof(mvih->hdr.bmiHeader);
+ mvih->hdr.bmiHeader.biWidth = (LONG)avc1->GetWidth();
+ mvih->hdr.bmiHeader.biHeight = (LONG)avc1->GetHeight();
+ mvih->hdr.bmiHeader.biCompression = '1cva';
+ mvih->hdr.bmiHeader.biPlanes = 1;
+ mvih->hdr.bmiHeader.biBitCount = 24;
+
+ CSize aspect(mvih->hdr.bmiHeader.biWidth * num, mvih->hdr.bmiHeader.biHeight * den);
+ int lnko = LNKO(aspect.cx, aspect.cy);
+ if (lnko > 1) {
+ aspect.cx /= lnko, aspect.cy /= lnko;
+ }
+ mvih->hdr.dwPictAspectRatioX = aspect.cx;
+ mvih->hdr.dwPictAspectRatioY = aspect.cy;
+ if (item->GetData()->GetSampleCount()) {
+ mvih->hdr.AvgTimePerFrame = item->GetData()->GetDurationMs() * 10000 / (item->GetData()->GetSampleCount());
+ }
+ mvih->dwProfile = data[1];
+ mvih->dwLevel = data[3];
+ mvih->dwFlags = (data[4] & 3) + 1;
+
+ mvih->cbSequenceHeader = 0;
+
+ BYTE* src = (BYTE*)data + 5;
+ BYTE* dst = (BYTE*)mvih->dwSequenceHeader;
+
+ BYTE* src_end = (BYTE*)data + size;
+ BYTE* dst_end = (BYTE*)mvih->dwSequenceHeader + size;
+
+ for (int i = 0; i < 2; ++i) {
+ for (int n = *src++ & 0x1f; n > 0; --n) {
+ int len = ((src[0] << 8) | src[1]) + 2;
+ if (src + len > src_end || dst + len > dst_end) {
+ ASSERT(0);
+ break;
+ }
+ memcpy(dst, src, len);
+ src += len;
+ dst += len;
+ mvih->cbSequenceHeader += len;
+ }
+ }
+
+ mts.Add(mt);
+
+ mt.subtype = FOURCCMap(mvih->hdr.bmiHeader.biCompression = '1CVA');
+ mts.Add(mt);
+ //b_HasVideo = true;
+ }
+ } else if (AP4_StsdAtom* stsd = dynamic_cast<AP4_StsdAtom*>(
+ track->GetTrakAtom()->FindChild("mdia/minf/stbl/stsd"))) {
+ const AP4_DataBuffer& db = stsd->GetDataBuffer();
+
+ for (AP4_List<AP4_Atom>::Item* item = stsd->GetChildren().FirstItem();
+ item;
+ item = item->GetNext()) {
+ AP4_Atom* atom = item->GetData();
+
+ AP4_Atom::Type type = atom->GetType();
+ DWORD fourcc =
+ ((type >> 24) & 0x000000ff) |
+ ((type >> 8) & 0x0000ff00) |
+ ((type << 8) & 0x00ff0000) |
+ ((type << 24) & 0xff000000);
+
+ if (AP4_VisualSampleEntry* vse = dynamic_cast<AP4_VisualSampleEntry*>(atom)) {
+
+ if (type == AP4_ATOM_TYPE_MJPA || type == AP4_ATOM_TYPE_MJPB || type == AP4_ATOM_TYPE_MJPG) {
+ SetTrackName(&TrackName, _T("M-Jpeg"));
+ }
+
+ mt.majortype = MEDIATYPE_Video;
+ mt.subtype = FOURCCMap(fourcc);
+ mt.formattype = FORMAT_VideoInfo;
+ vih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + db.GetDataSize());
+ memset(vih, 0, mt.FormatLength());
+ vih->bmiHeader.biSize = sizeof(vih->bmiHeader);
+ vih->bmiHeader.biWidth = (LONG)vse->GetWidth();
+ vih->bmiHeader.biHeight = (LONG)vse->GetHeight();
+ vih->bmiHeader.biCompression = fourcc;
+ vih->bmiHeader.biBitCount = (LONG)vse->GetDepth();
+ memcpy(vih + 1, db.GetData(), db.GetDataSize());
+ mts.Add(mt);
+
+ char buff[5];
+ memcpy(buff, &fourcc, 4);
+ buff[4] = 0;
+
+ _strlwr_s(buff);
+ AP4_Atom::Type typelwr = *(AP4_Atom::Type*)buff;
+
+ if (typelwr != fourcc) {
+ mt.subtype = FOURCCMap(vih->bmiHeader.biCompression = typelwr);
+ mts.Add(mt);
+ //b_HasVideo = true;
+ }
+
+ _strupr_s(buff);
+ AP4_Atom::Type typeupr = *(AP4_Atom::Type*)buff;
+
+ if (typeupr != fourcc) {
+ mt.subtype = FOURCCMap(vih->bmiHeader.biCompression = typeupr);
+ mts.Add(mt);
+ //b_HasVideo = true;
+ }
+
+ break;
+ } else if (AP4_AudioSampleEntry* ase = dynamic_cast<AP4_AudioSampleEntry*>(atom)) {
+ DWORD samplerate = ase->GetSampleRate();
+ WORD channels = ase->GetChannelCount();
+ WORD bitspersample = ase->GetSampleSize();
+
+ // overwrite audio fourc
+ if ((type & 0xffff0000) == AP4_ATOM_TYPE('m', 's', 0, 0)) {
+ fourcc = type & 0xffff;
+ } else if (type == AP4_ATOM_TYPE_ALAW) {
+ fourcc = WAVE_FORMAT_ALAW;
+ SetTrackName(&TrackName, _T("PCM A-law"));
+ } else if (type == AP4_ATOM_TYPE_ULAW) {
+ fourcc = WAVE_FORMAT_MULAW;
+ SetTrackName(&TrackName, _T("PCM mu-law"));
+ } else if (type == AP4_ATOM_TYPE__MP3) {
+ SetTrackName(&TrackName, _T("MPEG Audio (MP3)"));
+ fourcc = WAVE_FORMAT_MPEGLAYER3;
+ } else if ((type == AP4_ATOM_TYPE__AC3) || (type == AP4_ATOM_TYPE_SAC3) || (type == AP4_ATOM_TYPE_EAC3)) {
+ fourcc = 0x2000;
+ if (type == AP4_ATOM_TYPE_EAC3) {
+ SetTrackName(&TrackName, _T("AC-3 Audio"));
+ } else {
+ SetTrackName(&TrackName, _T("Enhanced AC-3 audio"));
+ }
+ } else if (type == AP4_ATOM_TYPE_MP4A) {
+ fourcc = WAVE_FORMAT_AAC;
+ SetTrackName(&TrackName, _T("MPEG-2 Audio AAC"));
+ } else if (type == AP4_ATOM_TYPE_NMOS) {
+ fourcc = MAKEFOURCC('N', 'E', 'L', 'L');
+ SetTrackName(&TrackName, _T("NellyMoser Audio"));
+ } else if (type == AP4_ATOM_TYPE_ALAC) {
+ fourcc = MAKEFOURCC('a', 'l', 'a', 'c');
+ SetTrackName(&TrackName, _T("Alac Audio"));
+ } else if ((type == AP4_ATOM_TYPE_NONE || type == AP4_ATOM_TYPE_RAW) && bitspersample == 8 ||
+ type == AP4_ATOM_TYPE_SOWT && bitspersample == 16 ||
+ (type == AP4_ATOM_TYPE_IN24 || type == AP4_ATOM_TYPE_IN32) && ase->GetEndian() == ENDIAN_LITTLE) {
+ fourcc = type = WAVE_FORMAT_PCM;
+ } else if ((type == AP4_ATOM_TYPE_FL32 || type == AP4_ATOM_TYPE_FL64) && ase->GetEndian() == ENDIAN_LITTLE) {
+ fourcc = type = WAVE_FORMAT_IEEE_FLOAT;
+ } else if (type == AP4_ATOM_TYPE_LPCM) {
+ DWORD flags = ase->GetFormatSpecificFlags();
+ if (flags & 2) { // big endian
+ if (flags & 1) { // floating point
+ if (bitspersample == 32) { type = AP4_ATOM_TYPE_FL32; }
+ else if (bitspersample == 64) { type = AP4_ATOM_TYPE_FL64; }
+ } else {
+ if (bitspersample == 16) { type = AP4_ATOM_TYPE_TWOS; }
+ else if (bitspersample == 24) { type = AP4_ATOM_TYPE_IN24; }
+ else if (bitspersample == 32) { type = AP4_ATOM_TYPE_IN32; }
+ }
+ fourcc = ((type >> 24) & 0x000000ff) |
+ ((type >> 8) & 0x0000ff00) |
+ ((type << 8) & 0x00ff0000) |
+ ((type << 24) & 0xff000000);
+ } else { // little endian
+ if (flags & 1) { // floating point
+ fourcc = type = WAVE_FORMAT_IEEE_FLOAT;
+ } else {
+ fourcc = type = WAVE_FORMAT_PCM;
+ }
+ }
+ }
+
+ DWORD nAvgBytesPerSec = 0;
+ if (type == AP4_ATOM_TYPE_EAC3) {
+
+ AP4_Sample sample;
+ AP4_DataBuffer sample_data;
+
+ AP4_Cardinal SampleCount = track->GetSampleCount();
+ if (SampleCount) {
+ track->ReadSample(1, sample, sample_data);
+ const AP4_Byte* data = sample_data.GetData();
+ AP4_Size size = sample_data.GetDataSize();
+
+ CGolombBuffer gb((BYTE*)data, size);
+ for (; size >= 7 && gb.BitRead(16, true) != 0x0b77; --size) {
+ gb.BitRead(8);
+ }
+ WORD sync = (WORD)gb.BitRead(16);
+ if ((size >= 7) && (sync == 0x0b77)) {
+ static DWORD freq[] = {48000, 44100, 32000, 0};
+ gb.BitRead(2);
+ gb.BitRead(3);
+ WORD frame_size = ((WORD)gb.BitRead(11) + 1) << 1;
+ BYTE sr_code = (BYTE)gb.BitRead(2);
+ if (sr_code == 3) {
+ BYTE sr_code2 = (BYTE)gb.BitRead(2);
+ samplerate = freq[sr_code2] / 2;
+ } else {
+ static BYTE eac3_blocks[4] = {1, 2, 3, 6};
+ BYTE num_blocks = eac3_blocks[gb.BitRead(2)];
+ samplerate = freq[sr_code];
+ nAvgBytesPerSec = frame_size * samplerate / (num_blocks * 256);
+ }
+ BYTE acmod = (BYTE)gb.BitRead(3);
+ BYTE lfeon = (BYTE)gb.BitRead(1);
+ static WORD channels_tbl[] = {2, 1, 2, 3, 3, 4, 4, 5};
+ channels = channels_tbl[acmod] + lfeon;
+ }
+ }
+ }
+
+ mt.majortype = MEDIATYPE_Audio;
+ mt.formattype = FORMAT_WaveFormatEx;
+ wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX));
+ memset(wfe, 0, mt.FormatLength());
+ if (!(fourcc & 0xffff0000)) {
+ wfe->wFormatTag = (WORD)fourcc;
+ }
+ wfe->nSamplesPerSec = samplerate;
+ wfe->nChannels = channels;
+ wfe->wBitsPerSample = bitspersample;
+ wfe->nBlockAlign = ase->GetBytesPerFrame();
+ if (nAvgBytesPerSec == 0 && ase->GetSamplesPerPacket() > 0) {
+ wfe->nAvgBytesPerSec = wfe->nSamplesPerSec * wfe->nBlockAlign / ase->GetSamplesPerPacket();
+ }
+
+ mt.subtype = FOURCCMap(fourcc);
+
+
+ if (type == AP4_ATOM_TYPE('m', 's', 0x00, 0x02)) {
+ const WORD numcoef = 7;
+ static ADPCMCOEFSET coef[] = { {256, 0}, {512, -256}, {0, 0}, {192, 64}, {240, 0}, {460, -208}, {392, -232} };
+ const ULONG size = sizeof(ADPCMWAVEFORMAT) + (numcoef * sizeof(ADPCMCOEFSET));
+ ADPCMWAVEFORMAT* format = (ADPCMWAVEFORMAT*)mt.ReallocFormatBuffer(size);
+ if (format != NULL) {
+ format->wfx.wFormatTag = WAVE_FORMAT_ADPCM;
+ format->wfx.wBitsPerSample = 4;
+ format->wfx.cbSize = (WORD)(size - sizeof(WAVEFORMATEX));
+ format->wSamplesPerBlock = format->wfx.nBlockAlign * 2 / format->wfx.nChannels - 12;
+ format->wNumCoef = numcoef;
+ memcpy(format->aCoef, coef, sizeof(coef));
+ }
+ } else if (type == AP4_ATOM_TYPE('m', 's', 0x00, 0x11)) {
+ IMAADPCMWAVEFORMAT* format = (IMAADPCMWAVEFORMAT*)mt.ReallocFormatBuffer(sizeof(IMAADPCMWAVEFORMAT));
+ if (format != NULL) {
+ format->wfx.wFormatTag = WAVE_FORMAT_IMA_ADPCM;
+ format->wfx.wBitsPerSample = 4;
+ format->wfx.cbSize = (WORD)(sizeof(IMAADPCMWAVEFORMAT) - sizeof(WAVEFORMATEX));
+ int X = (format->wfx.nBlockAlign - (4 * format->wfx.nChannels)) * 8;
+ int Y = format->wfx.wBitsPerSample * format->wfx.nChannels;
+ format->wSamplesPerBlock = (X / Y) + 1;
+ }
+ } else if (type == AP4_ATOM_TYPE_ALAC) {
+ const AP4_Byte* data = db.GetData();
+ AP4_Size size = db.GetDataSize();
+
+ while (size >= 36) {
+ if ((*(DWORD*)(data) == 0x24000000) && (*(DWORD*)(data + 4) == 0x63616c61)) {
+ break;
+ }
+ size--;
+ data++;
+ }
+
+ if (size >= 36) {
+ wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + 36);
+ wfe->cbSize = 36;
+ memcpy(wfe + 1, data, 36);
+ }
+ } else if (type == WAVE_FORMAT_PCM) {
+ mt.SetSampleSize(wfe->nBlockAlign);
+ if (channels > 2 || bitspersample > 16) {
+ WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEXTENSIBLE));
+ if (wfex != NULL) {
+ wfex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+ wfex->Format.cbSize = 22;
+ wfex->Samples.wValidBitsPerSample = bitspersample;
+ wfex->dwChannelMask = GetDefChannelMask(channels); // TODO: get correct channel mask from mov file
+ wfex->SubFormat = MEDIASUBTYPE_PCM;
+ }
+ }
+ } else if (type == WAVE_FORMAT_IEEE_FLOAT) {
+ mt.SetSampleSize(wfe->nBlockAlign);
+ if (channels > 2) {
+ WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEXTENSIBLE));
+ if (wfex != NULL) {
+ wfex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+ wfex->Format.cbSize = 22;
+ wfex->Samples.wValidBitsPerSample = bitspersample;
+ wfex->dwChannelMask = GetDefChannelMask(channels); // TODO: get correct channel mask from mov file
+ wfex->SubFormat = MEDIASUBTYPE_IEEE_FLOAT;
+ }
+ }
+ } else if (type == AP4_ATOM_TYPE_MP4A ||
+ type == AP4_ATOM_TYPE_ALAW ||
+ type == AP4_ATOM_TYPE_ULAW) {
+ // not need any extra data for ALAW, ULAW
+ // also extra data is not required for IMA4, MAC3, MAC6
+ } else if (db.GetDataSize() > 0) {
+ //always needed extra data for QDM2
+ wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + db.GetDataSize());
+ wfe->cbSize = db.GetDataSize();
+ memcpy(wfe + 1, db.GetData(), db.GetDataSize());
+ }
+
+ mts.Add(mt);
+ break;
+ } else {
+ TRACE(_T("Unknow MP4 Stream %x") , fourcc);
+ }
+ }
+ }
+
+ if (mts.IsEmpty()) {
+ continue;
+ }
+
+ REFERENCE_TIME rtDuration = 10000i64 * track->GetDurationMs();
+ if (m_rtDuration < rtDuration) {
+ m_rtDuration = rtDuration;
+ }
+ if (rtVideoDuration < rtDuration && AP4_Track::TYPE_VIDEO == track->GetType()) {
+ rtVideoDuration = rtDuration; // get the max video duration
+ }
+
+ DWORD id = track->GetId();
+
+ CStringW name, lang;
+ name.Format(L"Output %d", id);
+
+ if (!TrackName.IsEmpty()) {
+ name = TrackName;
+ }
+
+ if (!TrackLanguage.IsEmpty()) {
+ if (TrackLanguage != L"und") {
+ name += " (" + TrackLanguage + ")";
+ }
+ }
+
+ for (int i = 0, j = mts.GetCount(); i < j; ++i) {
+ BITMAPINFOHEADER bih;
+ if (ExtractBIH(&mts[i], &bih)) {
+ m_framesize.cx = bih.biWidth;
+ m_framesize.cy = abs(bih.biHeight);
+ }
+ }
+
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CMP4SplitterOutputPin(mts, name, this, this, &hr));
+
+ if (!TrackName.IsEmpty()) {
+ pPinOut->SetProperty(L"NAME", TrackName);
+ }
+ if (!TrackLanguage.IsEmpty()) {
+ pPinOut->SetProperty(L"LANG", CStringW(TrackLanguage));
+ }
+
+ EXECUTE_ASSERT(SUCCEEDED(AddOutputPin(id, pPinOut)));
+
+ m_trackpos[id] = trackpos();
+
+ if (mts.GetCount() == 1 && mts[0].subtype == MEDIASUBTYPE_ASS2) {
+ LPCWSTR postfix = L" (plain text)";
+
+ mts[0].subtype = MEDIASUBTYPE_UTF8;
+
+ SUBTITLEINFO* si = (SUBTITLEINFO*)mts[0].ReallocFormatBuffer(sizeof(SUBTITLEINFO));
+ wcscat_s(si->TrackName, postfix);
+
+ id ^= 0x80402010; // FIXME: until fixing, let's hope there won't be another track like this...
+
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CMP4SplitterOutputPin(mts, name + postfix, this, this, &hr));
+
+ if (!TrackName.IsEmpty()) {
+ pPinOut->SetProperty(L"NAME", TrackName + postfix);
+ }
+ if (!TrackLanguage.IsEmpty()) {
+ pPinOut->SetProperty(L"LANG", CStringW(TrackLanguage));
+ }
+
+ EXECUTE_ASSERT(SUCCEEDED(AddOutputPin(id, pPinOut)));
+ }
+ }
+
+ if (AP4_ChplAtom* chpl = dynamic_cast<AP4_ChplAtom*>(movie->GetMoovAtom()->FindChild("udta/chpl"))) {
+ AP4_Array<AP4_ChplAtom::AP4_Chapter>& chapters = chpl->GetChapters();
+
+ for (AP4_Cardinal i = 0; i < chapters.ItemCount(); ++i) {
+ AP4_ChplAtom::AP4_Chapter& chapter = chapters[i];
+ ChapAppend(chapter.Time, UTF8To16(ConvertMBCS(chapter.Name.c_str(), ANSI_CHARSET, CP_UTF8))); // this is b0rked, thx to nero :P
+ }
+
+ ChapSort();
+ }
+
+ if (AP4_ContainerAtom* ilst = dynamic_cast<AP4_ContainerAtom*>(movie->GetMoovAtom()->FindChild("udta/meta/ilst"))) {
+ CStringW title, artist, writer, album, year, appl, desc, gen, track;
+
+ for (AP4_List<AP4_Atom>::Item* item = ilst->GetChildren().FirstItem();
+ item;
+ item = item->GetNext()) {
+ if (AP4_ContainerAtom* atom = dynamic_cast<AP4_ContainerAtom*>(item->GetData())) {
+ if (AP4_DataAtom* data = dynamic_cast<AP4_DataAtom*>(atom->GetChild(AP4_ATOM_TYPE_DATA))) {
+ const AP4_DataBuffer* db = data->GetData();
+
+ if (atom->GetType() == AP4_ATOM_TYPE_TRKN) {
+ if (db->GetDataSize() >= 4) {
+ unsigned short n = (db->GetData()[2] << 8) | db->GetData()[3];
+ if (n > 0 && n < 100) {
+ track.Format(L"%02d", n);
+ } else if (n >= 100) {
+ track.Format(L"%d", n);
+ }
+ }
+ } else {
+ CStringW str = UTF8To16(CStringA((LPCSTR)db->GetData(), db->GetDataSize()));
+
+ switch (atom->GetType()) {
+ case AP4_ATOM_TYPE_NAM:
+ title = str;
+ break;
+ case AP4_ATOM_TYPE_ART:
+ artist = str;
+ break;
+ case AP4_ATOM_TYPE_WRT:
+ writer = str;
+ break;
+ case AP4_ATOM_TYPE_ALB:
+ album = str;
+ break;
+ case AP4_ATOM_TYPE_DAY:
+ year = str;
+ break;
+ case AP4_ATOM_TYPE_TOO:
+ appl = str;
+ break;
+ case AP4_ATOM_TYPE_CMT:
+ desc = str;
+ break;
+ case AP4_ATOM_TYPE_GEN:
+ gen = str;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (!title.IsEmpty()) {
+ if (!track.IsEmpty()) {
+ title = track + L" - " + title;
+ }
+ if (!album.IsEmpty()) {
+ title = album + L" - " + title;
+ }
+ if (!year.IsEmpty()) {
+ title += L" - " + year;
+ }
+ if (!gen.IsEmpty()) {
+ title += L" - " + gen;
+ }
+ SetProperty(L"TITL", title);
+ }
+
+ if (!artist.IsEmpty()) {
+ SetProperty(L"AUTH", artist);
+ } else if (!writer.IsEmpty()) {
+ SetProperty(L"AUTH", writer);
+ }
+
+ if (!appl.IsEmpty()) {
+ SetProperty(L"APPL", appl);
+ }
+
+ if (!desc.IsEmpty()) {
+ SetProperty(L"DESC", desc);
+ }
+ }
+ }
+
+ if (rtVideoDuration > 0 && rtVideoDuration < m_rtDuration / 2) {
+ m_rtDuration = rtVideoDuration; // fix incorrect duration
+ }
+
+ m_rtNewStop = m_rtStop = m_rtDuration;
+
+ TRACE(_T("CMP4SplitterFilter m_pOutputs.GetCount() = %d") , m_pOutputs.GetCount());
+
+ return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
}
bool CMP4SplitterFilter::DemuxInit()
{
- AP4_Movie* movie = (AP4_Movie*)m_pFile->GetMovie();
+ AP4_Movie* movie = (AP4_Movie*)m_pFile->GetMovie();
- POSITION pos = m_trackpos.GetStartPosition();
- while (pos) {
- CAtlMap<DWORD, trackpos>::CPair* pPair = m_trackpos.GetNext(pos);
+ POSITION pos = m_trackpos.GetStartPosition();
+ while (pos) {
+ CAtlMap<DWORD, trackpos>::CPair* pPair = m_trackpos.GetNext(pos);
- pPair->m_value.index = 0;
- pPair->m_value.ts = 0;
+ pPair->m_value.index = 0;
+ pPair->m_value.ts = 0;
- AP4_Track* track = movie->GetTrack(pPair->m_key);
+ AP4_Track* track = movie->GetTrack(pPair->m_key);
- AP4_Sample sample;
- if (AP4_SUCCEEDED(track->GetSample(0, sample))) {
- pPair->m_value.ts = sample.GetCts();
- }
- }
+ AP4_Sample sample;
+ if (AP4_SUCCEEDED(track->GetSample(0, sample))) {
+ pPair->m_value.ts = sample.GetCts();
+ }
+ }
- return true;
+ return true;
}
void CMP4SplitterFilter::DemuxSeek(REFERENCE_TIME rt)
{
- AP4_Movie* movie = (AP4_Movie*)m_pFile->GetMovie();
-
- POSITION pos = m_trackpos.GetStartPosition();
- while (pos) {
- CAtlMap<DWORD, trackpos>::CPair* pPair = m_trackpos.GetNext(pos);
-
- AP4_Track* track = movie->GetTrack(pPair->m_key);
-
- if (AP4_FAILED(track->GetSampleIndexForRefTime(rt, pPair->m_value.index))) {
- continue;
- }
-
- AP4_Sample sample;
- if (AP4_SUCCEEDED(track->GetSample(pPair->m_value.index, sample))) {
- pPair->m_value.ts = sample.GetCts();
- }
-
- // FIXME: slow search & stss->m_Entries is private
- if (AP4_StssAtom* stss = dynamic_cast<AP4_StssAtom*>(track->GetTrakAtom()->FindChild("mdia/minf/stbl/stss"))) {
- if (stss->m_Entries.ItemCount() > 0) {
- AP4_Cardinal i = 1;
- while (i < stss->m_Entries.ItemCount()) {
- if (stss->m_Entries[i] - 1 > pPair->m_value.index) {
- break;
- }
- ++i;
- }
- //ASSERT(pPair->m_value.index == stss->m_Entries[i-1] - 1); // fast seek test
- pPair->m_value.index = stss->m_Entries[i-1] - 1;
- }
- }
- }
+ AP4_Movie* movie = (AP4_Movie*)m_pFile->GetMovie();
+
+ POSITION pos = m_trackpos.GetStartPosition();
+ while (pos) {
+ CAtlMap<DWORD, trackpos>::CPair* pPair = m_trackpos.GetNext(pos);
+
+ AP4_Track* track = movie->GetTrack(pPair->m_key);
+
+ if (AP4_FAILED(track->GetSampleIndexForRefTime(rt, pPair->m_value.index))) {
+ continue;
+ }
+
+ AP4_Sample sample;
+ if (AP4_SUCCEEDED(track->GetSample(pPair->m_value.index, sample))) {
+ pPair->m_value.ts = sample.GetCts();
+ }
+
+ // FIXME: slow search & stss->m_Entries is private
+ if (AP4_StssAtom* stss = dynamic_cast<AP4_StssAtom*>(track->GetTrakAtom()->FindChild("mdia/minf/stbl/stss"))) {
+ if (stss->m_Entries.ItemCount() > 0) {
+ AP4_Cardinal i = 1;
+ while (i < stss->m_Entries.ItemCount()) {
+ if (stss->m_Entries[i] - 1 > pPair->m_value.index) {
+ break;
+ }
+ ++i;
+ }
+ //ASSERT(pPair->m_value.index == stss->m_Entries[i-1] - 1); // fast seek test
+ pPair->m_value.index = stss->m_Entries[i - 1] - 1;
+ }
+ }
+ }
}
bool CMP4SplitterFilter::DemuxLoop()
{
- HRESULT hr = S_OK;
-
- AP4_Movie* movie = (AP4_Movie*)m_pFile->GetMovie();
-
- while (SUCCEEDED(hr) && !CheckRequest(NULL)) {
- CAtlMap<DWORD, trackpos>::CPair* pPairNext = NULL;
- REFERENCE_TIME rtNext = 0;
-
- POSITION pos = m_trackpos.GetStartPosition();
- while (pos) {
- CAtlMap<DWORD, trackpos>::CPair* pPair = m_trackpos.GetNext(pos);
-
- AP4_Track* track = movie->GetTrack(pPair->m_key);
-
- CBaseSplitterOutputPin* pPin = GetOutputPin((DWORD)track->GetId());
- if (!pPin->IsConnected()) {
- continue;
- }
-
- REFERENCE_TIME rt = (REFERENCE_TIME)(10000000.0 / track->GetMediaTimeScale() * pPair->m_value.ts);
-
- if (pPair->m_value.index < track->GetSampleCount() && (!pPairNext || rt < rtNext)) {
- pPairNext = pPair;
- rtNext = rt;
- }
- }
-
- if (!pPairNext) {
- break;
- }
-
- AP4_Track* track = movie->GetTrack(pPairNext->m_key);
-
- CBaseSplitterOutputPin* pPin = GetOutputPin((DWORD)track->GetId());
-
- AP4_Sample sample;
- AP4_DataBuffer data;
-
- if (pPin && pPin->IsConnected() && AP4_SUCCEEDED(track->ReadSample(pPairNext->m_value.index, sample, data))) {
- const CMediaType& mt = pPin->CurrentMediaType();
-
- CAutoPtr<Packet> p(DNew Packet());
- p->TrackNumber = (DWORD)track->GetId();
- p->rtStart = (REFERENCE_TIME)(10000000.0 / track->GetMediaTimeScale() * sample.GetCts());
- p->rtStop = p->rtStart + (REFERENCE_TIME)(10000000.0 / track->GetMediaTimeScale() * sample.GetDuration());
- p->bSyncPoint = TRUE;
-
- // FIXME: slow search & stss->m_Entries is private
- if (AP4_StssAtom* stss = dynamic_cast<AP4_StssAtom*>(track->GetTrakAtom()->FindChild("mdia/minf/stbl/stss"))) {
- if (stss->m_Entries.ItemCount() > 0) {
- p->bSyncPoint = FALSE;
- for (AP4_Cardinal i = 0; i < stss->m_Entries.ItemCount(); ++i) {
- if (stss->m_Entries[i] - 1 < pPairNext->m_value.index) {
- continue;
- }
- if (stss->m_Entries[i] - 1 == pPairNext->m_value.index) {
- p->bSyncPoint = TRUE;
- }
- break;
- }
- }
- }
-
- //
- if (track->GetType() == AP4_Track::TYPE_AUDIO && data.GetDataSize() >= 1 && data.GetDataSize() <= 16) {
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
-
- int nBlockAlign;
- if (wfe->nBlockAlign == 0) {
- nBlockAlign = 1200;
- } else if (wfe->nBlockAlign <= 16) { // for PCM (from 8bit mono to 64bit stereo), A-Law, u-Law
- nBlockAlign = wfe->nBlockAlign * (wfe->nSamplesPerSec >> 4); // 1/16s=62.5ms
- } else {
- nBlockAlign = wfe->nBlockAlign;
- pPairNext->m_value.index -= pPairNext->m_value.index % wfe->nBlockAlign;
- }
-
- p->rtStop = p->rtStart;
- TRACE(_T("track->GetSampleCount() %d %d "), track->GetSampleCount(),pPairNext->m_value.index);
- int fFirst = true;
-
- while (AP4_SUCCEEDED(track->ReadSample(pPairNext->m_value.index, sample, data))) {
- AP4_Size size = data.GetDataSize();
- const AP4_Byte* ptr = data.GetData();
-
- if (fFirst) {
- p->SetData(ptr, size);
- p->rtStart = p->rtStop = (REFERENCE_TIME)(10000000.0 / track->GetMediaTimeScale() * sample.GetCts());
- fFirst = false;
- } else {
- for (int i = 0; i < size; ++i) p->Add(ptr[i]);
- }
-
- p->rtStop += (REFERENCE_TIME)(10000000.0 / track->GetMediaTimeScale() * sample.GetDuration());
-
- if (pPairNext->m_value.index+1 >= track->GetSampleCount() || (int)p->GetCount() >= nBlockAlign) {
- break;
- }
-
- pPairNext->m_value.index++;
- }
- } else if (track->GetType() == AP4_Track::TYPE_TEXT) {
- CStringA dlgln_bkg, dlgln_plaintext;
-
- const AP4_Byte* ptr = data.GetData();
- AP4_Size avail = data.GetDataSize();
-
- if (avail > 2) {
- AP4_UI16 size = (ptr[0] << 8) | ptr[1];
-
- if (size <= avail-2) {
- CStringA str;
-
- if (size >= 2 && ptr[2] == 0xfe && ptr[3] == 0xff) {
- CStringW wstr = CStringW((LPCWSTR)&ptr[2], size/2);
- for (int i = 0; i < wstr.GetLength(); ++i) {
- wstr.SetAt(i, ((WORD)wstr[i] >> 8) | ((WORD)wstr[i] << 8));
- }
- str = UTF16To8(wstr);
- } else {
- str = CStringA((LPCSTR)&ptr[2], size);
- }
-
- CStringA dlgln = str;
-
- if (mt.subtype == MEDIASUBTYPE_ASS2) {
- AP4_SampleDescription* desc = track->GetSampleDescription(sample.GetDescriptionIndex());
-
- dlgln = "0,0,Text,,0000,0000,0000,0000,," + str;
- dlgln_plaintext = str;
-
- CPoint translation(0, 0);
- if (AP4_TkhdAtom* tkhd = dynamic_cast<AP4_TkhdAtom*>(track->GetTrakAtom()->GetChild(AP4_ATOM_TYPE_TKHD))) {
- AP4_Float x, y;
- tkhd->GetTranslation(x, y);
- translation.SetPoint((int)x, (int)y);
- }
-
- if (AP4_UnknownSampleDescription* unknown_desc = dynamic_cast<AP4_UnknownSampleDescription*>(desc)) { // TEMP
- AP4_SampleEntry* sample_entry = unknown_desc->GetSampleEntry();
-
- if (AP4_TextSampleEntry* text = dynamic_cast<AP4_TextSampleEntry*>(sample_entry)) {
- const AP4_TextSampleEntry::AP4_TextDescription& d = text->GetDescription();
-
- // TODO
- } else if (AP4_Tx3gSampleEntry* tx3g = dynamic_cast<AP4_Tx3gSampleEntry*>(sample_entry)) {
- const AP4_Tx3gSampleEntry::AP4_Tx3gDescription& desc = tx3g->GetDescription();
-
- CStringW font = L"Arial";
-
- if (AP4_FtabAtom* ftab = dynamic_cast<AP4_FtabAtom*>(tx3g->GetChild(AP4_ATOM_TYPE_FTAB))) {
- AP4_String Name;
- if (AP4_SUCCEEDED(ftab->LookupFont(desc.Style.Font.Id, Name))) {
- font = Name.c_str();
- }
- }
-
- CRect rbox;
- CStringW ssa = ConvertTX3GToSSA(
- UTF8To16(str), desc, font,
- ptr + (2 + size), avail - (2 + size),
- m_framesize, translation,
- (p->rtStop - p->rtStart)/10000,
- rbox);
- dlgln = UTF16To8(ssa);
-
- const AP4_Byte* bclr = (const AP4_Byte*)&desc.BackgroundColor;
-
- if (bclr[3]) {
- CPoint tl = rbox.TopLeft();
- rbox.OffsetRect(-tl.x, -tl.y);
-
- dlgln_bkg.Format(
- "0,-1,Text,,0,0,0,0,,{\\an7\\pos(%d,%d)\\1c%02x%02x%02x\\1a%02x\\bord0\\shad0}{\\p1}m %d %d l %d %d l %d %d l %d %d {\\p0}",
- tl.x, tl.y,
- bclr[2], bclr[1], bclr[0],
- 255 - bclr[3],
- rbox.left, rbox.top,
- rbox.right, rbox.top,
- rbox.right, rbox.bottom,
- rbox.left, rbox.bottom);
- }
- }
- }
- }
-
- dlgln.Replace("\r", "");
- dlgln.Replace("\n", "\\N");
-
- p->SetData((LPCSTR)dlgln, dlgln.GetLength());
- }
- }
-
- if (!dlgln_bkg.IsEmpty()) {
- CAutoPtr<Packet> p2(DNew Packet());
- p2->TrackNumber = p->TrackNumber;
- p2->rtStart = p->rtStart;
- p2->rtStop = p->rtStop;
- p2->bSyncPoint = p->bSyncPoint;
- p2->SetData((LPCSTR)dlgln_bkg, dlgln_bkg.GetLength());
- hr = DeliverPacket(p2);
- }
-
- if (!dlgln_plaintext.IsEmpty()) {
- CAutoPtr<Packet> p2(DNew Packet());
- p2->TrackNumber = p->TrackNumber ^ 0x80402010;
- p2->rtStart = p->rtStart;
- p2->rtStop = p->rtStop;
- p2->bSyncPoint = p->bSyncPoint;
- p2->SetData((LPCSTR)dlgln_plaintext, dlgln_plaintext.GetLength());
- hr = DeliverPacket(p2);
- }
- } else {
- p->SetData(data.GetData(), data.GetDataSize());
- }
- hr = DeliverPacket(p);
- }
-
- {
- AP4_Sample sample;
- if (AP4_SUCCEEDED(track->GetSample(++pPairNext->m_value.index, sample))) {
- pPairNext->m_value.ts = sample.GetCts();
- }
- }
-
- }
-
- return true;
+ HRESULT hr = S_OK;
+
+ AP4_Movie* movie = (AP4_Movie*)m_pFile->GetMovie();
+
+ while (SUCCEEDED(hr) && !CheckRequest(NULL)) {
+ CAtlMap<DWORD, trackpos>::CPair* pPairNext = NULL;
+ REFERENCE_TIME rtNext = 0;
+
+ POSITION pos = m_trackpos.GetStartPosition();
+ while (pos) {
+ CAtlMap<DWORD, trackpos>::CPair* pPair = m_trackpos.GetNext(pos);
+
+ AP4_Track* track = movie->GetTrack(pPair->m_key);
+
+ CBaseSplitterOutputPin* pPin = GetOutputPin((DWORD)track->GetId());
+ if (!pPin->IsConnected()) {
+ continue;
+ }
+
+ REFERENCE_TIME rt = (REFERENCE_TIME)(10000000.0 / track->GetMediaTimeScale() * pPair->m_value.ts);
+
+ if (pPair->m_value.index < track->GetSampleCount() && (!pPairNext || rt < rtNext)) {
+ pPairNext = pPair;
+ rtNext = rt;
+ }
+ }
+
+ if (!pPairNext) {
+ break;
+ }
+
+ AP4_Track* track = movie->GetTrack(pPairNext->m_key);
+
+ CBaseSplitterOutputPin* pPin = GetOutputPin((DWORD)track->GetId());
+
+ AP4_Sample sample;
+ AP4_DataBuffer data;
+
+ if (pPin && pPin->IsConnected() && AP4_SUCCEEDED(track->ReadSample(pPairNext->m_value.index, sample, data))) {
+ const CMediaType& mt = pPin->CurrentMediaType();
+
+ CAutoPtr<Packet> p(DNew Packet());
+ p->TrackNumber = (DWORD)track->GetId();
+ p->rtStart = (REFERENCE_TIME)(10000000.0 / track->GetMediaTimeScale() * sample.GetCts());
+ p->rtStop = p->rtStart + (REFERENCE_TIME)(10000000.0 / track->GetMediaTimeScale() * sample.GetDuration());
+ p->bSyncPoint = TRUE;
+
+ // FIXME: slow search & stss->m_Entries is private
+ if (AP4_StssAtom* stss = dynamic_cast<AP4_StssAtom*>(track->GetTrakAtom()->FindChild("mdia/minf/stbl/stss"))) {
+ if (stss->m_Entries.ItemCount() > 0) {
+ p->bSyncPoint = FALSE;
+ for (AP4_Cardinal i = 0; i < stss->m_Entries.ItemCount(); ++i) {
+ if (stss->m_Entries[i] - 1 < pPairNext->m_value.index) {
+ continue;
+ }
+ if (stss->m_Entries[i] - 1 == pPairNext->m_value.index) {
+ p->bSyncPoint = TRUE;
+ }
+ break;
+ }
+ }
+ }
+
+ //
+ if (track->GetType() == AP4_Track::TYPE_AUDIO && data.GetDataSize() >= 1 && data.GetDataSize() <= 16) {
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
+
+ int nBlockAlign;
+ if (wfe->nBlockAlign == 0) {
+ nBlockAlign = 1200;
+ } else if (wfe->nBlockAlign <= 16) { // for PCM (from 8bit mono to 64bit stereo), A-Law, u-Law
+ nBlockAlign = wfe->nBlockAlign * (wfe->nSamplesPerSec >> 4); // 1/16s=62.5ms
+ } else {
+ nBlockAlign = wfe->nBlockAlign;
+ pPairNext->m_value.index -= pPairNext->m_value.index % wfe->nBlockAlign;
+ }
+
+ p->rtStop = p->rtStart;
+ TRACE(_T("track->GetSampleCount() %d %d "), track->GetSampleCount(), pPairNext->m_value.index);
+ int fFirst = true;
+
+ while (AP4_SUCCEEDED(track->ReadSample(pPairNext->m_value.index, sample, data))) {
+ AP4_Size size = data.GetDataSize();
+ const AP4_Byte* ptr = data.GetData();
+
+ if (fFirst) {
+ p->SetData(ptr, size);
+ p->rtStart = p->rtStop = (REFERENCE_TIME)(10000000.0 / track->GetMediaTimeScale() * sample.GetCts());
+ fFirst = false;
+ } else {
+ for (int i = 0; i < size; ++i) { p->Add(ptr[i]); }
+ }
+
+ p->rtStop += (REFERENCE_TIME)(10000000.0 / track->GetMediaTimeScale() * sample.GetDuration());
+
+ if (pPairNext->m_value.index + 1 >= track->GetSampleCount() || (int)p->GetCount() >= nBlockAlign) {
+ break;
+ }
+
+ pPairNext->m_value.index++;
+ }
+ } else if (track->GetType() == AP4_Track::TYPE_TEXT) {
+ CStringA dlgln_bkg, dlgln_plaintext;
+
+ const AP4_Byte* ptr = data.GetData();
+ AP4_Size avail = data.GetDataSize();
+
+ if (avail > 2) {
+ AP4_UI16 size = (ptr[0] << 8) | ptr[1];
+
+ if (size <= avail - 2) {
+ CStringA str;
+
+ if (size >= 2 && ptr[2] == 0xfe && ptr[3] == 0xff) {
+ CStringW wstr = CStringW((LPCWSTR)&ptr[2], size / 2);
+ for (int i = 0; i < wstr.GetLength(); ++i) {
+ wstr.SetAt(i, ((WORD)wstr[i] >> 8) | ((WORD)wstr[i] << 8));
+ }
+ str = UTF16To8(wstr);
+ } else {
+ str = CStringA((LPCSTR)&ptr[2], size);
+ }
+
+ CStringA dlgln = str;
+
+ if (mt.subtype == MEDIASUBTYPE_ASS2) {
+ AP4_SampleDescription* desc = track->GetSampleDescription(sample.GetDescriptionIndex());
+
+ dlgln = "0,0,Text,,0000,0000,0000,0000,," + str;
+ dlgln_plaintext = str;
+
+ CPoint translation(0, 0);
+ if (AP4_TkhdAtom* tkhd = dynamic_cast<AP4_TkhdAtom*>(track->GetTrakAtom()->GetChild(AP4_ATOM_TYPE_TKHD))) {
+ AP4_Float x, y;
+ tkhd->GetTranslation(x, y);
+ translation.SetPoint((int)x, (int)y);
+ }
+
+ if (AP4_UnknownSampleDescription* unknown_desc = dynamic_cast<AP4_UnknownSampleDescription*>(desc)) { // TEMP
+ AP4_SampleEntry* sample_entry = unknown_desc->GetSampleEntry();
+
+ if (AP4_TextSampleEntry* text = dynamic_cast<AP4_TextSampleEntry*>(sample_entry)) {
+ const AP4_TextSampleEntry::AP4_TextDescription& d = text->GetDescription();
+
+ // TODO
+ } else if (AP4_Tx3gSampleEntry* tx3g = dynamic_cast<AP4_Tx3gSampleEntry*>(sample_entry)) {
+ const AP4_Tx3gSampleEntry::AP4_Tx3gDescription& desc = tx3g->GetDescription();
+
+ CStringW font = L"Arial";
+
+ if (AP4_FtabAtom* ftab = dynamic_cast<AP4_FtabAtom*>(tx3g->GetChild(AP4_ATOM_TYPE_FTAB))) {
+ AP4_String Name;
+ if (AP4_SUCCEEDED(ftab->LookupFont(desc.Style.Font.Id, Name))) {
+ font = Name.c_str();
+ }
+ }
+
+ CRect rbox;
+ CStringW ssa = ConvertTX3GToSSA(
+ UTF8To16(str), desc, font,
+ ptr + (2 + size), avail - (2 + size),
+ m_framesize, translation,
+ (p->rtStop - p->rtStart) / 10000,
+ rbox);
+ dlgln = UTF16To8(ssa);
+
+ const AP4_Byte* bclr = (const AP4_Byte*)&desc.BackgroundColor;
+
+ if (bclr[3]) {
+ CPoint tl = rbox.TopLeft();
+ rbox.OffsetRect(-tl.x, -tl.y);
+
+ dlgln_bkg.Format(
+ "0,-1,Text,,0,0,0,0,,{\\an7\\pos(%d,%d)\\1c%02x%02x%02x\\1a%02x\\bord0\\shad0}{\\p1}m %d %d l %d %d l %d %d l %d %d {\\p0}",
+ tl.x, tl.y,
+ bclr[2], bclr[1], bclr[0],
+ 255 - bclr[3],
+ rbox.left, rbox.top,
+ rbox.right, rbox.top,
+ rbox.right, rbox.bottom,
+ rbox.left, rbox.bottom);
+ }
+ }
+ }
+ }
+
+ dlgln.Replace("\r", "");
+ dlgln.Replace("\n", "\\N");
+
+ p->SetData((LPCSTR)dlgln, dlgln.GetLength());
+ }
+ }
+
+ if (!dlgln_bkg.IsEmpty()) {
+ CAutoPtr<Packet> p2(DNew Packet());
+ p2->TrackNumber = p->TrackNumber;
+ p2->rtStart = p->rtStart;
+ p2->rtStop = p->rtStop;
+ p2->bSyncPoint = p->bSyncPoint;
+ p2->SetData((LPCSTR)dlgln_bkg, dlgln_bkg.GetLength());
+ hr = DeliverPacket(p2);
+ }
+
+ if (!dlgln_plaintext.IsEmpty()) {
+ CAutoPtr<Packet> p2(DNew Packet());
+ p2->TrackNumber = p->TrackNumber ^ 0x80402010;
+ p2->rtStart = p->rtStart;
+ p2->rtStop = p->rtStop;
+ p2->bSyncPoint = p->bSyncPoint;
+ p2->SetData((LPCSTR)dlgln_plaintext, dlgln_plaintext.GetLength());
+ hr = DeliverPacket(p2);
+ }
+ } else {
+ p->SetData(data.GetData(), data.GetDataSize());
+ }
+ hr = DeliverPacket(p);
+ }
+
+ {
+ AP4_Sample sample;
+ if (AP4_SUCCEEDED(track->GetSample(++pPairNext->m_value.index, sample))) {
+ pPairNext->m_value.ts = sample.GetCts();
+ }
+ }
+
+ }
+
+ return true;
}
// IKeyFrameInfo
STDMETHODIMP CMP4SplitterFilter::GetKeyFrameCount(UINT& nKFs)
{
- CheckPointer(m_pFile, E_UNEXPECTED);
+ CheckPointer(m_pFile, E_UNEXPECTED);
- if (!m_pFile) {
- return E_UNEXPECTED;
- }
+ if (!m_pFile) {
+ return E_UNEXPECTED;
+ }
- AP4_Movie* movie = (AP4_Movie*)m_pFile->GetMovie();
+ AP4_Movie* movie = (AP4_Movie*)m_pFile->GetMovie();
- POSITION pos = m_trackpos.GetStartPosition();
- while (pos) {
- CAtlMap<DWORD, trackpos>::CPair* pPair = m_trackpos.GetNext(pos);
+ POSITION pos = m_trackpos.GetStartPosition();
+ while (pos) {
+ CAtlMap<DWORD, trackpos>::CPair* pPair = m_trackpos.GetNext(pos);
- AP4_Track* track = movie->GetTrack(pPair->m_key);
+ AP4_Track* track = movie->GetTrack(pPair->m_key);
- if (track->GetType() != AP4_Track::TYPE_VIDEO) {
- continue;
- }
+ if (track->GetType() != AP4_Track::TYPE_VIDEO) {
+ continue;
+ }
- if (AP4_StssAtom* stss = dynamic_cast<AP4_StssAtom*>(track->GetTrakAtom()->FindChild("mdia/minf/stbl/stss"))) {
- nKFs = stss->m_Entries.ItemCount();
- return S_OK;
- }
- }
+ if (AP4_StssAtom* stss = dynamic_cast<AP4_StssAtom*>(track->GetTrakAtom()->FindChild("mdia/minf/stbl/stss"))) {
+ nKFs = stss->m_Entries.ItemCount();
+ return S_OK;
+ }
+ }
- return E_FAIL;
+ return E_FAIL;
}
STDMETHODIMP CMP4SplitterFilter::GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs)
{
- CheckPointer(pFormat, E_POINTER);
- CheckPointer(pKFs, E_POINTER);
- CheckPointer(m_pFile, E_UNEXPECTED);
+ CheckPointer(pFormat, E_POINTER);
+ CheckPointer(pKFs, E_POINTER);
+ CheckPointer(m_pFile, E_UNEXPECTED);
- if (*pFormat != TIME_FORMAT_MEDIA_TIME) {
- return E_INVALIDARG;
- }
+ if (*pFormat != TIME_FORMAT_MEDIA_TIME) {
+ return E_INVALIDARG;
+ }
- if (!m_pFile) {
- return E_UNEXPECTED;
- }
+ if (!m_pFile) {
+ return E_UNEXPECTED;
+ }
- AP4_Movie* movie = (AP4_Movie*)m_pFile->GetMovie();
+ AP4_Movie* movie = (AP4_Movie*)m_pFile->GetMovie();
- POSITION pos = m_trackpos.GetStartPosition();
- while (pos) {
- CAtlMap<DWORD, trackpos>::CPair* pPair = m_trackpos.GetNext(pos);
+ POSITION pos = m_trackpos.GetStartPosition();
+ while (pos) {
+ CAtlMap<DWORD, trackpos>::CPair* pPair = m_trackpos.GetNext(pos);
- AP4_Track* track = movie->GetTrack(pPair->m_key);
+ AP4_Track* track = movie->GetTrack(pPair->m_key);
- if (track->GetType() != AP4_Track::TYPE_VIDEO) {
- continue;
- }
+ if (track->GetType() != AP4_Track::TYPE_VIDEO) {
+ continue;
+ }
- if (AP4_StssAtom* stss = dynamic_cast<AP4_StssAtom*>(track->GetTrakAtom()->FindChild("mdia/minf/stbl/stss"))) {
- UINT nKFsTmp = 0;
- AP4_UI32 mts = track->GetMediaTimeScale();
+ if (AP4_StssAtom* stss = dynamic_cast<AP4_StssAtom*>(track->GetTrakAtom()->FindChild("mdia/minf/stbl/stss"))) {
+ UINT nKFsTmp = 0;
+ AP4_UI32 mts = track->GetMediaTimeScale();
- for (AP4_Cardinal i = 0; i < stss->m_Entries.ItemCount() && nKFsTmp < nKFs; ++i) {
- AP4_Sample sample;
- if (AP4_SUCCEEDED(track->GetSample(stss->m_Entries[i]-1, sample))) {
- pKFs[nKFsTmp++] = REFERENCE_TIME((10000000ui64 * sample.GetCts() + mts/2) / mts);
- //pKFs[nKFsTmp++] = REFERENCE_TIME(10000000.0 * sample.GetCts() / track->GetMediaTimeScale() + 0.5);
- }
- }
- nKFs = nKFsTmp;
+ for (AP4_Cardinal i = 0; i < stss->m_Entries.ItemCount() && nKFsTmp < nKFs; ++i) {
+ AP4_Sample sample;
+ if (AP4_SUCCEEDED(track->GetSample(stss->m_Entries[i] - 1, sample))) {
+ pKFs[nKFsTmp++] = REFERENCE_TIME((10000000ui64 * sample.GetCts() + mts / 2) / mts);
+ //pKFs[nKFsTmp++] = REFERENCE_TIME(10000000.0 * sample.GetCts() / track->GetMediaTimeScale() + 0.5);
+ }
+ }
+ nKFs = nKFsTmp;
- return S_OK;
- }
- }
+ return S_OK;
+ }
+ }
- return E_FAIL;
+ return E_FAIL;
}
//
@@ -1699,10 +1701,10 @@ STDMETHODIMP CMP4SplitterFilter::GetKeyFrames(const GUID* pFormat, REFERENCE_TIM
//
CMP4SourceFilter::CMP4SourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CMP4SplitterFilter(pUnk, phr)
+ : CMP4SplitterFilter(pUnk, phr)
{
- m_clsid = __uuidof(this);
- m_pInput.Free();
+ m_clsid = __uuidof(this);
+ m_pInput.Free();
}
//
@@ -1710,325 +1712,325 @@ CMP4SourceFilter::CMP4SourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
//
CMPEG4VideoSplitterFilter::CMPEG4VideoSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CBaseSplitterFilter(NAME("CMPEG4VideoSplitterFilter"), pUnk, phr, __uuidof(this))
+ : CBaseSplitterFilter(NAME("CMPEG4VideoSplitterFilter"), pUnk, phr, __uuidof(this))
{
}
void CMPEG4VideoSplitterFilter::SkipUserData()
{
- m_pFile->BitByteAlign();
- while (m_pFile->BitRead(32, true) == 0x000001b2)
- while (m_pFile->BitRead(24, true) != 0x000001) {
- m_pFile->BitRead(8);
- }
+ m_pFile->BitByteAlign();
+ while (m_pFile->BitRead(32, true) == 0x000001b2)
+ while (m_pFile->BitRead(24, true) != 0x000001) {
+ m_pFile->BitRead(8);
+ }
}
HRESULT CMPEG4VideoSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
{
- CheckPointer(pAsyncReader, E_POINTER);
-
- HRESULT hr = E_FAIL;
-
- m_pFile.Free();
- m_pFile.Attach(DNew CBaseSplitterFileEx(pAsyncReader, hr));
- if (!m_pFile) {
- return E_OUTOFMEMORY;
- }
- if (FAILED(hr)) {
- m_pFile.Free();
- return hr;
- }
-
- m_rtNewStart = m_rtCurrent = 0;
- m_rtNewStop = m_rtStop = m_rtDuration = 0;
-
- // TODO
-
- DWORD width = 0;
- DWORD height = 0;
- BYTE parx = 1;
- BYTE pary = 1;
- REFERENCE_TIME atpf = 400000;
-
- if (m_pFile->BitRead(24, true) != 0x000001) {
- return E_FAIL;
- }
-
- BYTE id;
- while (m_pFile->NextMpegStartCode(id, 1024 - m_pFile->GetPos())) {
- if (id == 0xb5) {
- BYTE is_visual_object_identifier = (BYTE)m_pFile->BitRead(1);
-
- if (is_visual_object_identifier) {
- BYTE visual_object_verid = (BYTE)m_pFile->BitRead(4);
- BYTE visual_object_priority = (BYTE)m_pFile->BitRead(3);
- }
-
- BYTE visual_object_type = (BYTE)m_pFile->BitRead(4);
-
- if (visual_object_type == 1 || visual_object_type == 2) {
- BYTE video_signal_type = (BYTE)m_pFile->BitRead(1);
-
- if (video_signal_type) {
- BYTE video_format = (BYTE)m_pFile->BitRead(3);
- BYTE video_range = (BYTE)m_pFile->BitRead(1);
- BYTE colour_description = (BYTE)m_pFile->BitRead(1);
-
- if (colour_description) {
- BYTE colour_primaries = (BYTE)m_pFile->BitRead(8);
- BYTE transfer_characteristics = (BYTE)m_pFile->BitRead(8);
- BYTE matrix_coefficients = (BYTE)m_pFile->BitRead(8);
- }
- }
- }
-
- SkipUserData();
-
- if (visual_object_type == 1) {
- if (m_pFile->BitRead(24) != 0x000001) {
- break;
- }
-
- BYTE video_object_start_code = (BYTE)m_pFile->BitRead(8);
- if (video_object_start_code < 0x00 || video_object_start_code > 0x1f) {
- break;
- }
-
- if (m_pFile->BitRead(24) != 0x000001) {
- break;
- }
-
- BYTE video_object_layer_start_code = (DWORD)m_pFile->BitRead(8);
- if (video_object_layer_start_code < 0x20 || video_object_layer_start_code > 0x2f) {
- break;
- }
-
- BYTE random_accessible_vol = (BYTE)m_pFile->BitRead(1);
- BYTE video_object_type_indication = (BYTE)m_pFile->BitRead(8);
-
- if (video_object_type_indication == 0x12) { // Fine Granularity Scalable
- break; // huh
- }
-
- BYTE is_object_layer_identifier = (BYTE)m_pFile->BitRead(1);
-
- BYTE video_object_layer_verid = 0;
-
- if (is_object_layer_identifier) {
- video_object_layer_verid = (BYTE)m_pFile->BitRead(4);
- BYTE video_object_layer_priority = (BYTE)m_pFile->BitRead(3);
- }
-
- BYTE aspect_ratio_info = (BYTE)m_pFile->BitRead(4);
-
- switch (aspect_ratio_info) {
- default:
- ASSERT(0);
- break;
- case 1:
- parx = 1;
- pary = 1;
- break;
- case 2:
- parx = 12;
- pary = 11;
- break;
- case 3:
- parx = 10;
- pary = 11;
- break;
- case 4:
- parx = 16;
- pary = 11;
- break;
- case 5:
- parx = 40;
- pary = 33;
- break;
- case 15:
- parx = (BYTE)m_pFile->BitRead(8);
- pary = (BYTE)m_pFile->BitRead(8);
- break;
- }
-
- BYTE vol_control_parameters = (BYTE)m_pFile->BitRead(1);
-
- if (vol_control_parameters) {
- BYTE chroma_format = (BYTE)m_pFile->BitRead(2);
- BYTE low_delay = (BYTE)m_pFile->BitRead(1);
- BYTE vbv_parameters = (BYTE)m_pFile->BitRead(1);
-
- if (vbv_parameters) {
- WORD first_half_bit_rate = (WORD)m_pFile->BitRead(15);
- if (!m_pFile->BitRead(1)) {
- break;
- }
- WORD latter_half_bit_rate = (WORD)m_pFile->BitRead(15);
- if (!m_pFile->BitRead(1)) {
- break;
- }
- WORD first_half_vbv_buffer_size = (WORD)m_pFile->BitRead(15);
- if (!m_pFile->BitRead(1)) {
- break;
- }
-
- BYTE latter_half_vbv_buffer_size = (BYTE)m_pFile->BitRead(3);
- WORD first_half_vbv_occupancy = (WORD)m_pFile->BitRead(11);
- if (!m_pFile->BitRead(1)) {
- break;
- }
- WORD latter_half_vbv_occupancy = (WORD)m_pFile->BitRead(15);
- if (!m_pFile->BitRead(1)) {
- break;
- }
- }
- }
-
- BYTE video_object_layer_shape = (BYTE)m_pFile->BitRead(2);
-
- if (video_object_layer_shape == 3 && video_object_layer_verid != 1) {
- BYTE video_object_layer_shape_extension = (BYTE)m_pFile->BitRead(4);
- }
-
- if (!m_pFile->BitRead(1)) {
- break;
- }
- WORD vop_time_increment_resolution = (WORD)m_pFile->BitRead(16);
- if (!m_pFile->BitRead(1)) {
- break;
- }
- BYTE fixed_vop_rate = (BYTE)m_pFile->BitRead(1);
-
- if (fixed_vop_rate) {
- int bits = 0;
- for (WORD i = vop_time_increment_resolution; i; i /= 2) {
- ++bits;
- }
-
- WORD fixed_vop_time_increment = m_pFile->BitRead(bits);
-
- if (fixed_vop_time_increment) {
- atpf = 10000000i64 * fixed_vop_time_increment / vop_time_increment_resolution;
- }
- }
-
- if (video_object_layer_shape != 2) {
- if (video_object_layer_shape == 0) {
- if (!m_pFile->BitRead(1)) {
- break;
- }
- width = (WORD)m_pFile->BitRead(13);
- if (!m_pFile->BitRead(1)) {
- break;
- }
- height = (WORD)m_pFile->BitRead(13);
- if (!m_pFile->BitRead(1)) {
- break;
- }
- }
-
- BYTE interlaced = (BYTE)m_pFile->BitRead(1);
- BYTE obmc_disable = (BYTE)m_pFile->BitRead(1);
-
- // ...
- }
- }
- } else if (id == 0xb6) {
- m_seqhdrsize = m_pFile->GetPos() - 4;
- }
- }
-
- if (!width || !height) {
- return E_FAIL;
- }
-
- CAtlArray<CMediaType> mts;
-
- CMediaType mt;
- mt.SetSampleSize(1);
-
- mt.majortype = MEDIATYPE_Video;
- mt.subtype = FOURCCMap('v4pm');
- mt.formattype = FORMAT_MPEG2Video;
- MPEG2VIDEOINFO* mvih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + m_seqhdrsize);
- memset(mvih, 0, mt.FormatLength());
- mvih->hdr.bmiHeader.biSize = sizeof(mvih->hdr.bmiHeader);
- mvih->hdr.bmiHeader.biWidth = width;
- mvih->hdr.bmiHeader.biHeight = height;
- mvih->hdr.bmiHeader.biCompression = 'v4pm';
- mvih->hdr.bmiHeader.biPlanes = 1;
- mvih->hdr.bmiHeader.biBitCount = 24;
- mvih->hdr.AvgTimePerFrame = atpf;
- mvih->hdr.dwPictAspectRatioX = width*parx;
- mvih->hdr.dwPictAspectRatioY = height*pary;
- mvih->cbSequenceHeader = m_seqhdrsize;
- m_pFile->Seek(0);
- m_pFile->ByteRead((BYTE*)mvih->dwSequenceHeader, m_seqhdrsize);
- mts.Add(mt);
- mt.subtype = FOURCCMap(mvih->hdr.bmiHeader.biCompression = 'V4PM');
- mts.Add(mt);
-
- CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CBaseSplitterOutputPin(mts, L"Video", this, this, &hr));
- EXECUTE_ASSERT(SUCCEEDED(AddOutputPin(0, pPinOut)));
-
- m_rtNewStop = m_rtStop = m_rtDuration;
-
- return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
+ CheckPointer(pAsyncReader, E_POINTER);
+
+ HRESULT hr = E_FAIL;
+
+ m_pFile.Free();
+ m_pFile.Attach(DNew CBaseSplitterFileEx(pAsyncReader, hr));
+ if (!m_pFile) {
+ return E_OUTOFMEMORY;
+ }
+ if (FAILED(hr)) {
+ m_pFile.Free();
+ return hr;
+ }
+
+ m_rtNewStart = m_rtCurrent = 0;
+ m_rtNewStop = m_rtStop = m_rtDuration = 0;
+
+ // TODO
+
+ DWORD width = 0;
+ DWORD height = 0;
+ BYTE parx = 1;
+ BYTE pary = 1;
+ REFERENCE_TIME atpf = 400000;
+
+ if (m_pFile->BitRead(24, true) != 0x000001) {
+ return E_FAIL;
+ }
+
+ BYTE id;
+ while (m_pFile->NextMpegStartCode(id, 1024 - m_pFile->GetPos())) {
+ if (id == 0xb5) {
+ BYTE is_visual_object_identifier = (BYTE)m_pFile->BitRead(1);
+
+ if (is_visual_object_identifier) {
+ BYTE visual_object_verid = (BYTE)m_pFile->BitRead(4);
+ BYTE visual_object_priority = (BYTE)m_pFile->BitRead(3);
+ }
+
+ BYTE visual_object_type = (BYTE)m_pFile->BitRead(4);
+
+ if (visual_object_type == 1 || visual_object_type == 2) {
+ BYTE video_signal_type = (BYTE)m_pFile->BitRead(1);
+
+ if (video_signal_type) {
+ BYTE video_format = (BYTE)m_pFile->BitRead(3);
+ BYTE video_range = (BYTE)m_pFile->BitRead(1);
+ BYTE colour_description = (BYTE)m_pFile->BitRead(1);
+
+ if (colour_description) {
+ BYTE colour_primaries = (BYTE)m_pFile->BitRead(8);
+ BYTE transfer_characteristics = (BYTE)m_pFile->BitRead(8);
+ BYTE matrix_coefficients = (BYTE)m_pFile->BitRead(8);
+ }
+ }
+ }
+
+ SkipUserData();
+
+ if (visual_object_type == 1) {
+ if (m_pFile->BitRead(24) != 0x000001) {
+ break;
+ }
+
+ BYTE video_object_start_code = (BYTE)m_pFile->BitRead(8);
+ if (video_object_start_code < 0x00 || video_object_start_code > 0x1f) {
+ break;
+ }
+
+ if (m_pFile->BitRead(24) != 0x000001) {
+ break;
+ }
+
+ BYTE video_object_layer_start_code = (DWORD)m_pFile->BitRead(8);
+ if (video_object_layer_start_code < 0x20 || video_object_layer_start_code > 0x2f) {
+ break;
+ }
+
+ BYTE random_accessible_vol = (BYTE)m_pFile->BitRead(1);
+ BYTE video_object_type_indication = (BYTE)m_pFile->BitRead(8);
+
+ if (video_object_type_indication == 0x12) { // Fine Granularity Scalable
+ break; // huh
+ }
+
+ BYTE is_object_layer_identifier = (BYTE)m_pFile->BitRead(1);
+
+ BYTE video_object_layer_verid = 0;
+
+ if (is_object_layer_identifier) {
+ video_object_layer_verid = (BYTE)m_pFile->BitRead(4);
+ BYTE video_object_layer_priority = (BYTE)m_pFile->BitRead(3);
+ }
+
+ BYTE aspect_ratio_info = (BYTE)m_pFile->BitRead(4);
+
+ switch (aspect_ratio_info) {
+ default:
+ ASSERT(0);
+ break;
+ case 1:
+ parx = 1;
+ pary = 1;
+ break;
+ case 2:
+ parx = 12;
+ pary = 11;
+ break;
+ case 3:
+ parx = 10;
+ pary = 11;
+ break;
+ case 4:
+ parx = 16;
+ pary = 11;
+ break;
+ case 5:
+ parx = 40;
+ pary = 33;
+ break;
+ case 15:
+ parx = (BYTE)m_pFile->BitRead(8);
+ pary = (BYTE)m_pFile->BitRead(8);
+ break;
+ }
+
+ BYTE vol_control_parameters = (BYTE)m_pFile->BitRead(1);
+
+ if (vol_control_parameters) {
+ BYTE chroma_format = (BYTE)m_pFile->BitRead(2);
+ BYTE low_delay = (BYTE)m_pFile->BitRead(1);
+ BYTE vbv_parameters = (BYTE)m_pFile->BitRead(1);
+
+ if (vbv_parameters) {
+ WORD first_half_bit_rate = (WORD)m_pFile->BitRead(15);
+ if (!m_pFile->BitRead(1)) {
+ break;
+ }
+ WORD latter_half_bit_rate = (WORD)m_pFile->BitRead(15);
+ if (!m_pFile->BitRead(1)) {
+ break;
+ }
+ WORD first_half_vbv_buffer_size = (WORD)m_pFile->BitRead(15);
+ if (!m_pFile->BitRead(1)) {
+ break;
+ }
+
+ BYTE latter_half_vbv_buffer_size = (BYTE)m_pFile->BitRead(3);
+ WORD first_half_vbv_occupancy = (WORD)m_pFile->BitRead(11);
+ if (!m_pFile->BitRead(1)) {
+ break;
+ }
+ WORD latter_half_vbv_occupancy = (WORD)m_pFile->BitRead(15);
+ if (!m_pFile->BitRead(1)) {
+ break;
+ }
+ }
+ }
+
+ BYTE video_object_layer_shape = (BYTE)m_pFile->BitRead(2);
+
+ if (video_object_layer_shape == 3 && video_object_layer_verid != 1) {
+ BYTE video_object_layer_shape_extension = (BYTE)m_pFile->BitRead(4);
+ }
+
+ if (!m_pFile->BitRead(1)) {
+ break;
+ }
+ WORD vop_time_increment_resolution = (WORD)m_pFile->BitRead(16);
+ if (!m_pFile->BitRead(1)) {
+ break;
+ }
+ BYTE fixed_vop_rate = (BYTE)m_pFile->BitRead(1);
+
+ if (fixed_vop_rate) {
+ int bits = 0;
+ for (WORD i = vop_time_increment_resolution; i; i /= 2) {
+ ++bits;
+ }
+
+ WORD fixed_vop_time_increment = m_pFile->BitRead(bits);
+
+ if (fixed_vop_time_increment) {
+ atpf = 10000000i64 * fixed_vop_time_increment / vop_time_increment_resolution;
+ }
+ }
+
+ if (video_object_layer_shape != 2) {
+ if (video_object_layer_shape == 0) {
+ if (!m_pFile->BitRead(1)) {
+ break;
+ }
+ width = (WORD)m_pFile->BitRead(13);
+ if (!m_pFile->BitRead(1)) {
+ break;
+ }
+ height = (WORD)m_pFile->BitRead(13);
+ if (!m_pFile->BitRead(1)) {
+ break;
+ }
+ }
+
+ BYTE interlaced = (BYTE)m_pFile->BitRead(1);
+ BYTE obmc_disable = (BYTE)m_pFile->BitRead(1);
+
+ // ...
+ }
+ }
+ } else if (id == 0xb6) {
+ m_seqhdrsize = m_pFile->GetPos() - 4;
+ }
+ }
+
+ if (!width || !height) {
+ return E_FAIL;
+ }
+
+ CAtlArray<CMediaType> mts;
+
+ CMediaType mt;
+ mt.SetSampleSize(1);
+
+ mt.majortype = MEDIATYPE_Video;
+ mt.subtype = FOURCCMap('v4pm');
+ mt.formattype = FORMAT_MPEG2Video;
+ MPEG2VIDEOINFO* mvih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + m_seqhdrsize);
+ memset(mvih, 0, mt.FormatLength());
+ mvih->hdr.bmiHeader.biSize = sizeof(mvih->hdr.bmiHeader);
+ mvih->hdr.bmiHeader.biWidth = width;
+ mvih->hdr.bmiHeader.biHeight = height;
+ mvih->hdr.bmiHeader.biCompression = 'v4pm';
+ mvih->hdr.bmiHeader.biPlanes = 1;
+ mvih->hdr.bmiHeader.biBitCount = 24;
+ mvih->hdr.AvgTimePerFrame = atpf;
+ mvih->hdr.dwPictAspectRatioX = width * parx;
+ mvih->hdr.dwPictAspectRatioY = height * pary;
+ mvih->cbSequenceHeader = m_seqhdrsize;
+ m_pFile->Seek(0);
+ m_pFile->ByteRead((BYTE*)mvih->dwSequenceHeader, m_seqhdrsize);
+ mts.Add(mt);
+ mt.subtype = FOURCCMap(mvih->hdr.bmiHeader.biCompression = 'V4PM');
+ mts.Add(mt);
+
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CBaseSplitterOutputPin(mts, L"Video", this, this, &hr));
+ EXECUTE_ASSERT(SUCCEEDED(AddOutputPin(0, pPinOut)));
+
+ m_rtNewStop = m_rtStop = m_rtDuration;
+
+ return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
}
bool CMPEG4VideoSplitterFilter::DemuxInit()
{
- return true;
+ return true;
}
void CMPEG4VideoSplitterFilter::DemuxSeek(REFERENCE_TIME rt)
{
- ASSERT(rt == 0);
+ ASSERT(rt == 0);
- m_pFile->Seek(m_seqhdrsize);
+ m_pFile->Seek(m_seqhdrsize);
}
bool CMPEG4VideoSplitterFilter::DemuxLoop()
{
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- CAutoPtr<Packet> p;
+ CAutoPtr<Packet> p;
- REFERENCE_TIME rt = 0;
- REFERENCE_TIME atpf = ((MPEG2VIDEOINFO*)GetOutputPin(0)->CurrentMediaType().Format())->hdr.AvgTimePerFrame;
+ REFERENCE_TIME rt = 0;
+ REFERENCE_TIME atpf = ((MPEG2VIDEOINFO*)GetOutputPin(0)->CurrentMediaType().Format())->hdr.AvgTimePerFrame;
- DWORD sync = ~0;
+ DWORD sync = ~0;
- while (SUCCEEDED(hr) && !CheckRequest(NULL) && m_pFile->GetRemaining()) {
- for (int i = 0; i < 65536; ++i) { // don't call CheckRequest so often
- bool eof = !m_pFile->GetRemaining();
+ while (SUCCEEDED(hr) && !CheckRequest(NULL) && m_pFile->GetRemaining()) {
+ for (int i = 0; i < 65536; ++i) { // don't call CheckRequest so often
+ bool eof = !m_pFile->GetRemaining();
- if (p && !p->IsEmpty() && (m_pFile->BitRead(32, true) == 0x000001b6 || eof)) {
- hr = DeliverPacket(p);
- }
+ if (p && !p->IsEmpty() && (m_pFile->BitRead(32, true) == 0x000001b6 || eof)) {
+ hr = DeliverPacket(p);
+ }
- if (eof) {
- break;
- }
+ if (eof) {
+ break;
+ }
- if (!p) {
- p.Attach(DNew Packet());
- p->SetCount(0, 1024);
- p->TrackNumber = 0;
- p->rtStart = rt;
- p->rtStop = rt + atpf;
- p->bSyncPoint = FALSE;
- rt += atpf;
- // rt = Packet::INVALID_TIME;
- }
+ if (!p) {
+ p.Attach(DNew Packet());
+ p->SetCount(0, 1024);
+ p->TrackNumber = 0;
+ p->rtStart = rt;
+ p->rtStop = rt + atpf;
+ p->bSyncPoint = FALSE;
+ rt += atpf;
+ // rt = Packet::INVALID_TIME;
+ }
- BYTE b;
- m_pFile->ByteRead(&b, 1);
- p->Add(b);
- }
- }
+ BYTE b;
+ m_pFile->ByteRead(&b, 1);
+ p->Add(b);
+ }
+ }
- return true;
+ return true;
}
//
@@ -2036,10 +2038,10 @@ bool CMPEG4VideoSplitterFilter::DemuxLoop()
//
CMPEG4VideoSourceFilter::CMPEG4VideoSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CMPEG4VideoSplitterFilter(pUnk, phr)
+ : CMPEG4VideoSplitterFilter(pUnk, phr)
{
- m_clsid = __uuidof(this);
- m_pInput.Free();
+ m_clsid = __uuidof(this);
+ m_pInput.Free();
}
//
@@ -2047,7 +2049,7 @@ CMPEG4VideoSourceFilter::CMPEG4VideoSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
//
CMP4SplitterOutputPin::CMP4SplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBaseSplitterOutputPin(mts, pName, pFilter, pLock, phr)
+ : CBaseSplitterOutputPin(mts, pName, pFilter, pLock, phr)
{
}
@@ -2057,18 +2059,18 @@ CMP4SplitterOutputPin::~CMP4SplitterOutputPin()
HRESULT CMP4SplitterOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- CAutoLock cAutoLock(this);
- return __super::DeliverNewSegment(tStart, tStop, dRate);
+ CAutoLock cAutoLock(this);
+ return __super::DeliverNewSegment(tStart, tStop, dRate);
}
HRESULT CMP4SplitterOutputPin::DeliverEndFlush()
{
- CAutoLock cAutoLock(this);
- return __super::DeliverEndFlush();
+ CAutoLock cAutoLock(this);
+ return __super::DeliverEndFlush();
}
HRESULT CMP4SplitterOutputPin::DeliverPacket(CAutoPtr<Packet> p)
{
- CAutoLock cAutoLock(this);
- return __super::DeliverPacket(p);
+ CAutoLock cAutoLock(this);
+ return __super::DeliverPacket(p);
}
diff --git a/src/filters/parser/MP4Splitter/MP4Splitter.h b/src/filters/parser/MP4Splitter/MP4Splitter.h
index 6faeb2d06..d90fd7f86 100644
--- a/src/filters/parser/MP4Splitter/MP4Splitter.h
+++ b/src/filters/parser/MP4Splitter/MP4Splitter.h
@@ -32,78 +32,78 @@
#define MP4SourceName L"MPC MP4/MOV Source"
class __declspec(uuid("61F47056-E400-43d3-AF1E-AB7DFFD4C4AD"))
- CMP4SplitterFilter : public CBaseSplitterFilter
+ CMP4SplitterFilter : public CBaseSplitterFilter
{
- struct trackpos {
- DWORD /*AP4_Ordinal*/ index;
- unsigned __int64 /*AP4_TimeStamp*/ ts;
- };
- CAtlMap<DWORD, trackpos> m_trackpos;
- CSize m_framesize;
+ struct trackpos {
+ DWORD /*AP4_Ordinal*/ index;
+ unsigned __int64 /*AP4_TimeStamp*/ ts;
+ };
+ CAtlMap<DWORD, trackpos> m_trackpos;
+ CSize m_framesize;
protected:
- CAutoPtr<CMP4SplitterFile> m_pFile;
- HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
+ CAutoPtr<CMP4SplitterFile> m_pFile;
+ HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
- bool DemuxInit();
- void DemuxSeek(REFERENCE_TIME rt);
- bool DemuxLoop();
+ bool DemuxInit();
+ void DemuxSeek(REFERENCE_TIME rt);
+ bool DemuxLoop();
public:
- CMP4SplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
- virtual ~CMP4SplitterFilter();
+ CMP4SplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ virtual ~CMP4SplitterFilter();
- // CBaseFilter
- STDMETHODIMP_(HRESULT) QueryFilterInfo(FILTER_INFO* pInfo);
+ // CBaseFilter
+ STDMETHODIMP_(HRESULT) QueryFilterInfo(FILTER_INFO* pInfo);
- // IKeyFrameInfo
+ // IKeyFrameInfo
- STDMETHODIMP_(HRESULT) GetKeyFrameCount(UINT& nKFs);
- STDMETHODIMP_(HRESULT) GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
+ STDMETHODIMP_(HRESULT) GetKeyFrameCount(UINT& nKFs);
+ STDMETHODIMP_(HRESULT) GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
};
class __declspec(uuid("3CCC052E-BDEE-408a-BEA7-90914EF2964B"))
- CMP4SourceFilter : public CMP4SplitterFilter
+ CMP4SourceFilter : public CMP4SplitterFilter
{
public:
- CMP4SourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ CMP4SourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
};
// for raw mpeg4 elementary streams:
class __declspec(uuid("D3D9D58B-45B5-48AB-B199-B8C40560AEC7"))
- CMPEG4VideoSplitterFilter : public CBaseSplitterFilter
+ CMPEG4VideoSplitterFilter : public CBaseSplitterFilter
{
- __int64 m_seqhdrsize;
- int NextStartCode();
- void SkipUserData();
+ __int64 m_seqhdrsize;
+ int NextStartCode();
+ void SkipUserData();
protected:
- CAutoPtr<CBaseSplitterFileEx> m_pFile;
- HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
+ CAutoPtr<CBaseSplitterFileEx> m_pFile;
+ HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
- bool DemuxInit();
- void DemuxSeek(REFERENCE_TIME rt);
- bool DemuxLoop();
+ bool DemuxInit();
+ void DemuxSeek(REFERENCE_TIME rt);
+ bool DemuxLoop();
public:
- CMPEG4VideoSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ CMPEG4VideoSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
};
class __declspec(uuid("E2B98EEA-EE55-4E9B-A8C1-6E5288DF785A"))
- CMPEG4VideoSourceFilter : public CMPEG4VideoSplitterFilter
+ CMPEG4VideoSourceFilter : public CMPEG4VideoSplitterFilter
{
public:
- CMPEG4VideoSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ CMPEG4VideoSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
};
class CMP4SplitterOutputPin : public CBaseSplitterOutputPin, protected CCritSec
{
public:
- CMP4SplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- virtual ~CMP4SplitterOutputPin();
+ CMP4SplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ virtual ~CMP4SplitterOutputPin();
- HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
- HRESULT DeliverPacket(CAutoPtr<Packet> p);
- HRESULT DeliverEndFlush();
+ HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT DeliverPacket(CAutoPtr<Packet> p);
+ HRESULT DeliverEndFlush();
};
diff --git a/src/filters/parser/MP4Splitter/MP4SplitterFile.cpp b/src/filters/parser/MP4Splitter/MP4SplitterFile.cpp
index b7331bba4..fe45ebe3c 100644
--- a/src/filters/parser/MP4Splitter/MP4SplitterFile.cpp
+++ b/src/filters/parser/MP4Splitter/MP4SplitterFile.cpp
@@ -3,40 +3,40 @@
#include "Ap4AsyncReaderStream.h"
CMP4SplitterFile::CMP4SplitterFile(IAsyncReader* pReader, HRESULT& hr)
- : CBaseSplitterFileEx(pReader, hr, DEFAULT_CACHE_LENGTH, false)
- , m_pAp4File(NULL)
+ : CBaseSplitterFileEx(pReader, hr, DEFAULT_CACHE_LENGTH, false)
+ , m_pAp4File(NULL)
{
- if (FAILED(hr)) {
- return;
- }
+ if (FAILED(hr)) {
+ return;
+ }
- hr = Init();
+ hr = Init();
}
CMP4SplitterFile::~CMP4SplitterFile()
{
- delete (AP4_File*)m_pAp4File;
+ delete(AP4_File*)m_pAp4File;
}
void* /* AP4_Movie* */ CMP4SplitterFile::GetMovie()
{
- ASSERT(m_pAp4File);
- return m_pAp4File ? ((AP4_File*)m_pAp4File)->GetMovie() : NULL;
+ ASSERT(m_pAp4File);
+ return m_pAp4File ? ((AP4_File*)m_pAp4File)->GetMovie() : NULL;
}
HRESULT CMP4SplitterFile::Init()
{
- Seek(0);
+ Seek(0);
- delete (AP4_File*)m_pAp4File;
+ delete(AP4_File*)m_pAp4File;
- AP4_ByteStream* stream = DNew AP4_AsyncReaderStream(this);
+ AP4_ByteStream* stream = DNew AP4_AsyncReaderStream(this);
- m_pAp4File = DNew AP4_File(*stream);
+ m_pAp4File = DNew AP4_File(*stream);
- AP4_Movie* movie = ((AP4_File*)m_pAp4File)->GetMovie();
+ AP4_Movie* movie = ((AP4_File*)m_pAp4File)->GetMovie();
- stream->Release();
+ stream->Release();
- return movie ? S_OK : E_FAIL;
+ return movie ? S_OK : E_FAIL;
}
diff --git a/src/filters/parser/MP4Splitter/MP4SplitterFile.h b/src/filters/parser/MP4Splitter/MP4SplitterFile.h
index ef1557b9f..ac8377c88 100644
--- a/src/filters/parser/MP4Splitter/MP4SplitterFile.h
+++ b/src/filters/parser/MP4Splitter/MP4SplitterFile.h
@@ -5,13 +5,13 @@
class CMP4SplitterFile : public CBaseSplitterFileEx
{
- void* /* AP4_File* */ m_pAp4File;
+ void* /* AP4_File* */ m_pAp4File;
- HRESULT Init();
+ HRESULT Init();
public:
- CMP4SplitterFile(IAsyncReader* pReader, HRESULT& hr);
- virtual ~CMP4SplitterFile();
+ CMP4SplitterFile(IAsyncReader* pReader, HRESULT& hr);
+ virtual ~CMP4SplitterFile();
- void* /* AP4_Movie* */ GetMovie();
+ void* /* AP4_Movie* */ GetMovie();
};
diff --git a/src/filters/parser/MatroskaSplitter/MatroskaFile.cpp b/src/filters/parser/MatroskaSplitter/MatroskaFile.cpp
index 2e4e84776..714074ea3 100644
--- a/src/filters/parser/MatroskaSplitter/MatroskaFile.cpp
+++ b/src/filters/parser/MatroskaSplitter/MatroskaFile.cpp
@@ -55,9 +55,9 @@ using namespace MatroskaReader;
static void bswap(BYTE* s, int len)
{
- for (BYTE* d = s + len-1; s < d; s++, d--) {
- *s ^= *d, *d ^= *s, *s ^= *d;
- }
+ for (BYTE* d = s + len - 1; s < d; s++, d--) {
+ *s ^= *d, *d ^= *s, *s ^= *d;
+ }
}
//
@@ -65,1516 +65,1516 @@ static void bswap(BYTE* s, int len)
//
CMatroskaFile::CMatroskaFile(IAsyncReader* pAsyncReader, HRESULT& hr)
- : CBaseSplitterFile(pAsyncReader, hr, DEFAULT_CACHE_LENGTH, false)
- , m_rtOffset(0)
+ : CBaseSplitterFile(pAsyncReader, hr, DEFAULT_CACHE_LENGTH, false)
+ , m_rtOffset(0)
{
- if (FAILED(hr)) {
- return;
- }
- hr = Init();
+ if (FAILED(hr)) {
+ return;
+ }
+ hr = Init();
}
HRESULT CMatroskaFile::Init()
{
- DWORD dw;
- if (FAILED(Read(dw)) || dw != 0x1A45DFA3) {
- return E_FAIL;
- }
+ DWORD dw;
+ if (FAILED(Read(dw)) || dw != 0x1A45DFA3) {
+ return E_FAIL;
+ }
- CMatroskaNode Root(this);
- if (FAILED(Parse(&Root))) {
- return E_FAIL;
- }
+ CMatroskaNode Root(this);
+ if (FAILED(Parse(&Root))) {
+ return E_FAIL;
+ }
- CAutoPtr<CMatroskaNode> pSegment, pCluster;
- if ((pSegment = Root.Child(0x18538067))
- && (pCluster = pSegment->Child(0x1F43B675))) {
- Cluster c0;
- c0.ParseTimeCode(pCluster);
- m_rtOffset = m_segment.GetRefTime(c0.TimeCode);
- }
+ CAutoPtr<CMatroskaNode> pSegment, pCluster;
+ if ((pSegment = Root.Child(0x18538067))
+ && (pCluster = pSegment->Child(0x1F43B675))) {
+ Cluster c0;
+ c0.ParseTimeCode(pCluster);
+ m_rtOffset = m_segment.GetRefTime(c0.TimeCode);
+ }
- return S_OK;
+ return S_OK;
}
template <class T>
HRESULT CMatroskaFile::Read(T& var)
{
- HRESULT hr = ByteRead((BYTE*)&var, sizeof(var));
- if (S_OK == hr) {
- bswap((BYTE*)&var, sizeof(var));
- }
- return hr;
+ HRESULT hr = ByteRead((BYTE*)&var, sizeof(var));
+ if (S_OK == hr) {
+ bswap((BYTE*)&var, sizeof(var));
+ }
+ return hr;
}
HRESULT CMatroskaFile::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x1A45DFA3:
- m_ebml.Parse(pMN);
- if ((m_ebml.DocType != DOCTYPE || m_ebml.DocTypeReadVersion > DOCTYPEVERSION) && m_ebml.DocType != DOCTYPE_WEBM) {
- return E_FAIL;
- }
- break;
+ m_ebml.Parse(pMN);
+ if ((m_ebml.DocType != DOCTYPE || m_ebml.DocTypeReadVersion > DOCTYPEVERSION) && m_ebml.DocType != DOCTYPE_WEBM) {
+ return E_FAIL;
+ }
+ break;
case 0x18538067:
- if (m_segment.SegmentInfo.SegmentUID.IsEmpty()) {
- m_segment.ParseMinimal(pMN);
- }
- break;
- EndChunk
+ if (m_segment.SegmentInfo.SegmentUID.IsEmpty()) {
+ m_segment.ParseMinimal(pMN);
+ }
+ break;
+ EndChunk
}
//
HRESULT EBML::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x4286:
- EBMLVersion.Parse(pMN);
- break;
+ EBMLVersion.Parse(pMN);
+ break;
case 0x42F7:
- EBMLReadVersion.Parse(pMN);
- break;
+ EBMLReadVersion.Parse(pMN);
+ break;
case 0x42F2:
- EBMLMaxIDLength.Parse(pMN);
- break;
+ EBMLMaxIDLength.Parse(pMN);
+ break;
case 0x42F3:
- EBMLMaxSizeLength.Parse(pMN);
- break;
+ EBMLMaxSizeLength.Parse(pMN);
+ break;
case 0x4282:
- DocType.Parse(pMN);
- break;
+ DocType.Parse(pMN);
+ break;
case 0x4287:
- DocTypeVersion.Parse(pMN);
- break;
+ DocTypeVersion.Parse(pMN);
+ break;
case 0x4285:
- DocTypeReadVersion.Parse(pMN);
- break;
- EndChunk
+ DocTypeReadVersion.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT Segment::Parse(CMatroskaNode* pMN0)
{
- pos = pMN0->GetPos();
+ pos = pMN0->GetPos();
- BeginChunk
+ BeginChunk
case 0x1549A966:
- SegmentInfo.Parse(pMN);
- break;
+ SegmentInfo.Parse(pMN);
+ break;
case 0x114D9B74:
- MetaSeekInfo.Parse(pMN);
- break;
+ MetaSeekInfo.Parse(pMN);
+ break;
case 0x1654AE6B:
- Tracks.Parse(pMN);
- break;
+ Tracks.Parse(pMN);
+ break;
case 0x1F43B675:
- Clusters.Parse(pMN);
- break;
+ Clusters.Parse(pMN);
+ break;
case 0x1C53BB6B:
- Cues.Parse(pMN);
- break;
+ Cues.Parse(pMN);
+ break;
case 0x1941A469:
- Attachments.Parse(pMN);
- break;
+ Attachments.Parse(pMN);
+ break;
case 0x1043A770:
- Chapters.Parse(pMN);
- break;
- // case 0x1254C367: Tags.Parse(pMN); break;
- EndChunk
+ Chapters.Parse(pMN);
+ break;
+ // case 0x1254C367: Tags.Parse(pMN); break;
+ EndChunk
}
HRESULT Segment::ParseMinimal(CMatroskaNode* pMN0)
{
- CheckPointer(pMN0, E_POINTER);
-
- pos = pMN0->GetPos();
- len = pMN0->m_len;
-
- CAutoPtr<CMatroskaNode> pMN = pMN0->Child();
- if (!pMN) {
- return S_FALSE;
- }
-
- unsigned int k = 0;
-
- do {
- switch (pMN->m_id) {
- case 0x1549A966:
- SegmentInfo.Parse(pMN);
- k |= (1 << 0);
- break;
- case 0x114D9B74:
- MetaSeekInfo.Parse(pMN);
- k |= (1 << 1);
- break;
- case 0x1654AE6B:
- Tracks.Parse(pMN);
- k |= (1 << 2);
- break;
- case 0x1C53BB6B:
- k |= (1 << 3);
- Cues.Parse(pMN);
- break;
- }
- } while (k != 15 && pMN->m_id != 0x1F43B675 && pMN->Next());
-
- if (!pMN->IsRandomAccess()) {
- return S_OK;
- }
-
- while (MatroskaReader::QWORD pos = pMN->FindPos(0x114D9B74, pMN->GetPos())) {
- pMN->SeekTo(pos);
- if (FAILED(pMN->Parse())) {
- break; // a broken file
- }
- MetaSeekInfo.Parse(pMN);
- }
-
- if (k != 15) {
- if (Cues.IsEmpty() && (pMN = pMN0->Child(0x1C53BB6B, false))) {
- do {
- Cues.Parse(pMN);
- } while (pMN->Next(true));
- }
-
- if (Chapters.IsEmpty() && (pMN = pMN0->Child(0x1043A770, false))) {
- do {
- Chapters.Parse(pMN); /*BIG UGLY HACK:*/
- break;
- } while (pMN->Next(true));
- }
-
- if (Attachments.IsEmpty() && (pMN = pMN0->Child(0x1941A469, false))) {
- do {
- Attachments.Parse(pMN); /*BIG UGLY HACK:*/
- break;
- } while (pMN->Next(true));
- }
- }
-
- return S_OK;
+ CheckPointer(pMN0, E_POINTER);
+
+ pos = pMN0->GetPos();
+ len = pMN0->m_len;
+
+ CAutoPtr<CMatroskaNode> pMN = pMN0->Child();
+ if (!pMN) {
+ return S_FALSE;
+ }
+
+ unsigned int k = 0;
+
+ do {
+ switch (pMN->m_id) {
+ case 0x1549A966:
+ SegmentInfo.Parse(pMN);
+ k |= (1 << 0);
+ break;
+ case 0x114D9B74:
+ MetaSeekInfo.Parse(pMN);
+ k |= (1 << 1);
+ break;
+ case 0x1654AE6B:
+ Tracks.Parse(pMN);
+ k |= (1 << 2);
+ break;
+ case 0x1C53BB6B:
+ k |= (1 << 3);
+ Cues.Parse(pMN);
+ break;
+ }
+ } while (k != 15 && pMN->m_id != 0x1F43B675 && pMN->Next());
+
+ if (!pMN->IsRandomAccess()) {
+ return S_OK;
+ }
+
+ while (MatroskaReader::QWORD pos = pMN->FindPos(0x114D9B74, pMN->GetPos())) {
+ pMN->SeekTo(pos);
+ if (FAILED(pMN->Parse())) {
+ break; // a broken file
+ }
+ MetaSeekInfo.Parse(pMN);
+ }
+
+ if (k != 15) {
+ if (Cues.IsEmpty() && (pMN = pMN0->Child(0x1C53BB6B, false))) {
+ do {
+ Cues.Parse(pMN);
+ } while (pMN->Next(true));
+ }
+
+ if (Chapters.IsEmpty() && (pMN = pMN0->Child(0x1043A770, false))) {
+ do {
+ Chapters.Parse(pMN); /*BIG UGLY HACK:*/
+ break;
+ } while (pMN->Next(true));
+ }
+
+ if (Attachments.IsEmpty() && (pMN = pMN0->Child(0x1941A469, false))) {
+ do {
+ Attachments.Parse(pMN); /*BIG UGLY HACK:*/
+ break;
+ } while (pMN->Next(true));
+ }
+ }
+
+ return S_OK;
}
UINT64 Segment::GetMasterTrack()
{
- UINT64 TrackNumber = 0, AltTrackNumber = 0;
+ UINT64 TrackNumber = 0, AltTrackNumber = 0;
- POSITION pos1 = Tracks.GetHeadPosition();
- while (pos1 && TrackNumber == 0) {
- Track* pT = Tracks.GetNext(pos1);
+ POSITION pos1 = Tracks.GetHeadPosition();
+ while (pos1 && TrackNumber == 0) {
+ Track* pT = Tracks.GetNext(pos1);
- POSITION pos2 = pT->TrackEntries.GetHeadPosition();
- while (pos2 && TrackNumber == 0) {
- TrackEntry* pTE = pT->TrackEntries.GetNext(pos2);
+ POSITION pos2 = pT->TrackEntries.GetHeadPosition();
+ while (pos2 && TrackNumber == 0) {
+ TrackEntry* pTE = pT->TrackEntries.GetNext(pos2);
- if (pTE->TrackType == TrackEntry::TypeVideo) {
- TrackNumber = pTE->TrackNumber;
- break;
- } else if (pTE->TrackType == TrackEntry::TypeAudio && AltTrackNumber == 0) {
- AltTrackNumber = pTE->TrackNumber;
- }
- }
- }
+ if (pTE->TrackType == TrackEntry::TypeVideo) {
+ TrackNumber = pTE->TrackNumber;
+ break;
+ } else if (pTE->TrackType == TrackEntry::TypeAudio && AltTrackNumber == 0) {
+ AltTrackNumber = pTE->TrackNumber;
+ }
+ }
+ }
- if (TrackNumber == 0) {
- TrackNumber = AltTrackNumber;
- }
- if (TrackNumber == 0) {
- TrackNumber = 1;
- }
+ if (TrackNumber == 0) {
+ TrackNumber = AltTrackNumber;
+ }
+ if (TrackNumber == 0) {
+ TrackNumber = 1;
+ }
- return TrackNumber;
+ return TrackNumber;
}
ChapterAtom* ChapterAtom::FindChapterAtom(UINT64 id)
{
- if (ChapterUID == id) {
- return this;
- }
+ if (ChapterUID == id) {
+ return this;
+ }
- POSITION pos = ChapterAtoms.GetHeadPosition();
- while (pos) {
- ChapterAtom* ca = ChapterAtoms.GetNext(pos)->FindChapterAtom(id);
- if (ca) {
- return ca;
- }
- }
+ POSITION pos = ChapterAtoms.GetHeadPosition();
+ while (pos) {
+ ChapterAtom* ca = ChapterAtoms.GetNext(pos)->FindChapterAtom(id);
+ if (ca) {
+ return ca;
+ }
+ }
- return NULL;
+ return NULL;
}
ChapterAtom* Segment::FindChapterAtom(UINT64 id, int nEditionEntry)
{
- POSITION pos1 = Chapters.GetHeadPosition();
- while (pos1) {
- Chapter* c = Chapters.GetNext(pos1);
+ POSITION pos1 = Chapters.GetHeadPosition();
+ while (pos1) {
+ Chapter* c = Chapters.GetNext(pos1);
- POSITION pos2 = c->EditionEntries.GetHeadPosition();
- while (pos2) {
- EditionEntry* ee = c->EditionEntries.GetNext(pos2);
+ POSITION pos2 = c->EditionEntries.GetHeadPosition();
+ while (pos2) {
+ EditionEntry* ee = c->EditionEntries.GetNext(pos2);
- if (nEditionEntry-- == 0) {
- return id == 0 ? ee : ee->FindChapterAtom(id);
- }
- }
- }
+ if (nEditionEntry-- == 0) {
+ return id == 0 ? ee : ee->FindChapterAtom(id);
+ }
+ }
+ }
- return NULL;
+ return NULL;
}
HRESULT Info::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x73A4:
- SegmentUID.Parse(pMN);
- break;
+ SegmentUID.Parse(pMN);
+ break;
case 0x7384:
- SegmentFilename.Parse(pMN);
- break;
+ SegmentFilename.Parse(pMN);
+ break;
case 0x3CB923:
- PrevUID.Parse(pMN);
- break;
+ PrevUID.Parse(pMN);
+ break;
case 0x3C83AB:
- PrevFilename.Parse(pMN);
- break;
+ PrevFilename.Parse(pMN);
+ break;
case 0x3EB923:
- NextUID.Parse(pMN);
- break;
+ NextUID.Parse(pMN);
+ break;
case 0x3E83BB:
- NextFilename.Parse(pMN);
- break;
+ NextFilename.Parse(pMN);
+ break;
case 0x2AD7B1:
- TimeCodeScale.Parse(pMN);
- break;
+ TimeCodeScale.Parse(pMN);
+ break;
case 0x4489:
- Duration.Parse(pMN);
- break;
+ Duration.Parse(pMN);
+ break;
case 0x4461:
- DateUTC.Parse(pMN);
- break;
+ DateUTC.Parse(pMN);
+ break;
case 0x7BA9:
- Title.Parse(pMN);
- break;
+ Title.Parse(pMN);
+ break;
case 0x4D80:
- MuxingApp.Parse(pMN);
- break;
+ MuxingApp.Parse(pMN);
+ break;
case 0x5741:
- WritingApp.Parse(pMN);
- break;
- EndChunk
+ WritingApp.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT Seek::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x4DBB:
- SeekHeads.Parse(pMN);
- break;
- EndChunk
+ SeekHeads.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT SeekHead::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x53AB:
- SeekID.Parse(pMN);
- break;
+ SeekID.Parse(pMN);
+ break;
case 0x53AC:
- SeekPosition.Parse(pMN);
- break;
- EndChunk
+ SeekPosition.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT Track::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0xAE:
- TrackEntries.Parse(pMN);
- break;
- EndChunk
+ TrackEntries.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT TrackEntry::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0xD7:
- TrackNumber.Parse(pMN);
- break;
+ TrackNumber.Parse(pMN);
+ break;
case 0x73C5:
- TrackUID.Parse(pMN);
- break;
+ TrackUID.Parse(pMN);
+ break;
case 0x83:
- TrackType.Parse(pMN);
- break;
+ TrackType.Parse(pMN);
+ break;
case 0xB9:
- FlagEnabled.Parse(pMN);
- break;
+ FlagEnabled.Parse(pMN);
+ break;
case 0x88:
- FlagDefault.Parse(pMN);
- break;
+ FlagDefault.Parse(pMN);
+ break;
case 0x9C:
- FlagLacing.Parse(pMN);
- break;
+ FlagLacing.Parse(pMN);
+ break;
case 0x55AA:
- FlagForced.Parse(pMN);
- break;
+ FlagForced.Parse(pMN);
+ break;
case 0x6DE7:
- MinCache.Parse(pMN);
- break;
+ MinCache.Parse(pMN);
+ break;
case 0x6DF8:
- MaxCache.Parse(pMN);
- break;
+ MaxCache.Parse(pMN);
+ break;
case 0x536E:
- Name.Parse(pMN);
- break;
+ Name.Parse(pMN);
+ break;
case 0x22B59C:
- Language.Parse(pMN);
- break;
+ Language.Parse(pMN);
+ break;
case 0x86:
- CodecID.Parse(pMN);
- break;
+ CodecID.Parse(pMN);
+ break;
case 0x63A2:
- CodecPrivate.Parse(pMN);
- break;
+ CodecPrivate.Parse(pMN);
+ break;
case 0x258688:
- CodecName.Parse(pMN);
- break;
+ CodecName.Parse(pMN);
+ break;
case 0x3A9697:
- CodecSettings.Parse(pMN);
- break;
+ CodecSettings.Parse(pMN);
+ break;
case 0x3B4040:
- CodecInfoURL.Parse(pMN);
- break;
+ CodecInfoURL.Parse(pMN);
+ break;
case 0x26B240:
- CodecDownloadURL.Parse(pMN);
- break;
+ CodecDownloadURL.Parse(pMN);
+ break;
case 0xAA:
- CodecDecodeAll.Parse(pMN);
- break;
+ CodecDecodeAll.Parse(pMN);
+ break;
case 0x6FAB:
- TrackOverlay.Parse(pMN);
- break;
+ TrackOverlay.Parse(pMN);
+ break;
case 0x23E383:
case 0x2383E3:
- DefaultDuration.Parse(pMN);
- break;
+ DefaultDuration.Parse(pMN);
+ break;
case 0x23314F:
- TrackTimecodeScale.Parse(pMN);
- break;
+ TrackTimecodeScale.Parse(pMN);
+ break;
case 0xE0:
- if (S_OK == v.Parse(pMN)) {
- DescType |= DescVideo;
- }
- break;
+ if (S_OK == v.Parse(pMN)) {
+ DescType |= DescVideo;
+ }
+ break;
case 0xE1:
- if (S_OK == a.Parse(pMN)) {
- DescType |= DescAudio;
- }
- break;
+ if (S_OK == a.Parse(pMN)) {
+ DescType |= DescAudio;
+ }
+ break;
case 0x6D80:
- ces.Parse(pMN);
- break;
- EndChunk
+ ces.Parse(pMN);
+ break;
+ EndChunk
}
static int cesort(const void* a, const void* b)
{
- UINT64 ce1 = (static_cast<ContentEncoding*>(const_cast<void *>(a)))->ContentEncodingOrder;
- UINT64 ce2 = (static_cast<ContentEncoding*>(const_cast<void *>(b)))->ContentEncodingOrder;
+ UINT64 ce1 = (static_cast<ContentEncoding*>(const_cast<void*>(a)))->ContentEncodingOrder;
+ UINT64 ce2 = (static_cast<ContentEncoding*>(const_cast<void*>(b)))->ContentEncodingOrder;
- return (int)ce1 - (int)ce2;
+ return (int)ce1 - (int)ce2;
}
bool TrackEntry::Expand(CBinary& data, UINT64 Scope)
{
- if (ces.ce.GetCount() == 0) {
- return true;
- }
+ if (ces.ce.GetCount() == 0) {
+ return true;
+ }
- CAtlArray<ContentEncoding*> cearray;
- POSITION pos = ces.ce.GetHeadPosition();
- while (pos) {
- cearray.Add(ces.ce.GetNext(pos));
- }
- qsort(cearray.GetData(), cearray.GetCount(), sizeof(ContentEncoding*), cesort);
+ CAtlArray<ContentEncoding*> cearray;
+ POSITION pos = ces.ce.GetHeadPosition();
+ while (pos) {
+ cearray.Add(ces.ce.GetNext(pos));
+ }
+ qsort(cearray.GetData(), cearray.GetCount(), sizeof(ContentEncoding*), cesort);
- for (int i = (int)cearray.GetCount()-1; i >= 0; i--) {
- ContentEncoding* ce = cearray[i];
+ for (int i = (int)cearray.GetCount() - 1; i >= 0; i--) {
+ ContentEncoding* ce = cearray[i];
- if (!(ce->ContentEncodingScope & Scope)) {
- continue;
- }
+ if (!(ce->ContentEncodingScope & Scope)) {
+ continue;
+ }
- if (ce->ContentEncodingType == ContentEncoding::Compression) {
- if (!data.Decompress(ce->cc)) {
- return false;
- }
- } else if (ce->ContentEncodingType == ContentEncoding::Encryption) {
- // TODO
- return false;
- }
- }
+ if (ce->ContentEncodingType == ContentEncoding::Compression) {
+ if (!data.Decompress(ce->cc)) {
+ return false;
+ }
+ } else if (ce->ContentEncodingType == ContentEncoding::Encryption) {
+ // TODO
+ return false;
+ }
+ }
- return true;
+ return true;
}
HRESULT Video::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x9A:
- FlagInterlaced.Parse(pMN);
- break;
+ FlagInterlaced.Parse(pMN);
+ break;
case 0x53B8:
- StereoMode.Parse(pMN);
- break;
+ StereoMode.Parse(pMN);
+ break;
case 0xB0:
- PixelWidth.Parse(pMN);
- if (!DisplayWidth) {
- DisplayWidth.Set(PixelWidth);
- }
- break;
+ PixelWidth.Parse(pMN);
+ if (!DisplayWidth) {
+ DisplayWidth.Set(PixelWidth);
+ }
+ break;
case 0xBA:
- PixelHeight.Parse(pMN);
- if (!DisplayHeight) {
- DisplayHeight.Set(PixelHeight);
- }
- break;
+ PixelHeight.Parse(pMN);
+ if (!DisplayHeight) {
+ DisplayHeight.Set(PixelHeight);
+ }
+ break;
case 0x54B0:
- DisplayWidth.Parse(pMN);
- break;
+ DisplayWidth.Parse(pMN);
+ break;
case 0x54BA:
- DisplayHeight.Parse(pMN);
- break;
+ DisplayHeight.Parse(pMN);
+ break;
case 0x54B2:
- DisplayUnit.Parse(pMN);
- break;
+ DisplayUnit.Parse(pMN);
+ break;
case 0x54B3:
- AspectRatioType.Parse(pMN);
- break;
+ AspectRatioType.Parse(pMN);
+ break;
case 0x54AA:
- VideoPixelCropBottom.Parse(pMN);
- break;
+ VideoPixelCropBottom.Parse(pMN);
+ break;
case 0x54BB:
- VideoPixelCropTop.Parse(pMN);
- break;
+ VideoPixelCropTop.Parse(pMN);
+ break;
case 0x54CC:
- VideoPixelCropLeft.Parse(pMN);
- break;
+ VideoPixelCropLeft.Parse(pMN);
+ break;
case 0x54DD:
- VideoPixelCropRight.Parse(pMN);
- break;
+ VideoPixelCropRight.Parse(pMN);
+ break;
case 0x2EB524:
- ColourSpace.Parse(pMN);
- break;
+ ColourSpace.Parse(pMN);
+ break;
case 0x2FB523:
- GammaValue.Parse(pMN);
- break;
+ GammaValue.Parse(pMN);
+ break;
case 0x2383E3:
- FramePerSec.Parse(pMN);
- break;
- EndChunk
+ FramePerSec.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT Audio::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0xB5:
- SamplingFrequency.Parse(pMN);
- if (!OutputSamplingFrequency) {
- OutputSamplingFrequency.Set(SamplingFrequency);
- }
- break;
+ SamplingFrequency.Parse(pMN);
+ if (!OutputSamplingFrequency) {
+ OutputSamplingFrequency.Set(SamplingFrequency);
+ }
+ break;
case 0x78B5:
- OutputSamplingFrequency.Parse(pMN);
- break;
+ OutputSamplingFrequency.Parse(pMN);
+ break;
case 0x9F:
- Channels.Parse(pMN);
- break;
+ Channels.Parse(pMN);
+ break;
case 0x7D7B:
- ChannelPositions.Parse(pMN);
- break;
+ ChannelPositions.Parse(pMN);
+ break;
case 0x6264:
- BitDepth.Parse(pMN);
- break;
- EndChunk
+ BitDepth.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT ContentEncodings::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x6240:
- ce.Parse(pMN);
- break;
- EndChunk
+ ce.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT ContentEncoding::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x5031:
- ContentEncodingOrder.Parse(pMN);
- break;
+ ContentEncodingOrder.Parse(pMN);
+ break;
case 0x5032:
- ContentEncodingScope.Parse(pMN);
- break;
+ ContentEncodingScope.Parse(pMN);
+ break;
case 0x5033:
- ContentEncodingType.Parse(pMN);
- break;
+ ContentEncodingType.Parse(pMN);
+ break;
case 0x5034:
- cc.Parse(pMN);
- break;
+ cc.Parse(pMN);
+ break;
case 0x5035:
- ce.Parse(pMN);
- break;
- EndChunk
+ ce.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT ContentCompression::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x4254:
- ContentCompAlgo.Parse(pMN);
- break;
+ ContentCompAlgo.Parse(pMN);
+ break;
case 0x4255:
- ContentCompSettings.Parse(pMN);
- break;
- EndChunk
+ ContentCompSettings.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT ContentEncryption::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x47e1:
- ContentEncAlgo.Parse(pMN);
- break;
+ ContentEncAlgo.Parse(pMN);
+ break;
case 0x47e2:
- ContentEncKeyID.Parse(pMN);
- break;
+ ContentEncKeyID.Parse(pMN);
+ break;
case 0x47e3:
- ContentSignature.Parse(pMN);
- break;
+ ContentSignature.Parse(pMN);
+ break;
case 0x47e4:
- ContentSigKeyID.Parse(pMN);
- break;
+ ContentSigKeyID.Parse(pMN);
+ break;
case 0x47e5:
- ContentSigAlgo.Parse(pMN);
- break;
+ ContentSigAlgo.Parse(pMN);
+ break;
case 0x47e6:
- ContentSigHashAlgo.Parse(pMN);
- break;
- EndChunk
+ ContentSigHashAlgo.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT Cluster::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0xE7:
- TimeCode.Parse(pMN);
- break;
+ TimeCode.Parse(pMN);
+ break;
case 0xA7:
- Position.Parse(pMN);
- break;
+ Position.Parse(pMN);
+ break;
case 0xAB:
- PrevSize.Parse(pMN);
- break;
+ PrevSize.Parse(pMN);
+ break;
case 0xA0:
- BlockGroups.Parse(pMN, true);
- break;
+ BlockGroups.Parse(pMN, true);
+ break;
case 0xA3:
- SimpleBlocks.Parse(pMN, true);
- break;
- EndChunk
+ SimpleBlocks.Parse(pMN, true);
+ break;
+ EndChunk
}
HRESULT Cluster::ParseTimeCode(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0xE7:
- TimeCode.Parse(pMN);
- return S_OK;
- EndChunk
+ TimeCode.Parse(pMN);
+ return S_OK;
+ EndChunk
}
HRESULT BlockGroup::Parse(CMatroskaNode* pMN0, bool fFull)
{
- BeginChunk
+ BeginChunk
case 0xA1:
- Block.Parse(pMN, fFull);
- break;
+ Block.Parse(pMN, fFull);
+ break;
case 0xA2: /* TODO: multiple virt blocks? */
- ;
- break;
+ ;
+ break;
case 0x9B:
- BlockDuration.Parse(pMN);
- break;
+ BlockDuration.Parse(pMN);
+ break;
case 0xFA:
- ReferencePriority.Parse(pMN);
- break;
+ ReferencePriority.Parse(pMN);
+ break;
case 0xFB:
- ReferenceBlock.Parse(pMN);
- break;
+ ReferenceBlock.Parse(pMN);
+ break;
case 0xFD:
- ReferenceVirtual.Parse(pMN);
- break;
+ ReferenceVirtual.Parse(pMN);
+ break;
case 0xA4:
- CodecState.Parse(pMN);
- break;
+ CodecState.Parse(pMN);
+ break;
case 0xE8:
- TimeSlices.Parse(pMN);
- break;
+ TimeSlices.Parse(pMN);
+ break;
case 0x75A1:
- if (fFull) {
- ba.Parse(pMN);
- }
- break;
- EndChunk
+ if (fFull) {
+ ba.Parse(pMN);
+ }
+ break;
+ EndChunk
}
HRESULT SimpleBlock::Parse(CMatroskaNode* pMN, bool fFull)
{
- pMN->SeekTo(pMN->m_start);
-
- TrackNumber.Parse(pMN);
- CShort s;
- s.Parse(pMN);
- TimeCode.Set(s);
- Lacing.Parse(pMN);
-
- if (!fFull) {
- return S_OK;
- }
-
- CAtlList<MatroskaReader::QWORD> lens;
- MatroskaReader::QWORD tlen = 0;
- MatroskaReader::QWORD FrameSize;
- BYTE FramesInLaceLessOne;
-
- switch ((Lacing & 0x06) >> 1) {
- case 0:
- // No lacing
- lens.AddTail((pMN->m_start+pMN->m_len) - (pMN->GetPos()+tlen));
- break;
- case 1:
- // Xiph lacing
- BYTE n;
- pMN->Read(n);
- while (n-- > 0) {
- BYTE b;
- MatroskaReader::QWORD len = 0;
- do {
- pMN->Read(b);
- len += b;
- } while (b == 0xff);
- lens.AddTail(len);
- tlen += len;
- }
- lens.AddTail((pMN->m_start+pMN->m_len) - (pMN->GetPos()+tlen));
- break;
- case 2:
- // Fixed-size lacing
- pMN->Read(FramesInLaceLessOne);
- FramesInLaceLessOne++;
- FrameSize = ((pMN->m_start+pMN->m_len) - (pMN->GetPos()+tlen)) / FramesInLaceLessOne;
- while (FramesInLaceLessOne-- > 0) {
- lens.AddTail(FrameSize);
- }
- break;
- case 3:
- // EBML lacing
- pMN->Read(FramesInLaceLessOne);
-
- CLength FirstFrameSize;
- FirstFrameSize.Parse(pMN);
- lens.AddTail(FirstFrameSize);
- FramesInLaceLessOne--;
- tlen = FirstFrameSize;
-
- CSignedLength DiffSize;
- FrameSize = FirstFrameSize;
- while (FramesInLaceLessOne--) {
- DiffSize.Parse(pMN);
- FrameSize += DiffSize;
- lens.AddTail(FrameSize);
- tlen += FrameSize;
- }
- lens.AddTail((pMN->m_start+pMN->m_len) - (pMN->GetPos()+tlen));
- break;
- }
-
- POSITION pos = lens.GetHeadPosition();
- while (pos) {
- MatroskaReader::QWORD len = lens.GetNext(pos);
- CAutoPtr<CBinary> p(DNew CBinary());
- p->SetCount((INT_PTR)len);
- pMN->Read(p->GetData(), len);
- BlockData.AddTail(p);
- }
-
- return S_OK;
+ pMN->SeekTo(pMN->m_start);
+
+ TrackNumber.Parse(pMN);
+ CShort s;
+ s.Parse(pMN);
+ TimeCode.Set(s);
+ Lacing.Parse(pMN);
+
+ if (!fFull) {
+ return S_OK;
+ }
+
+ CAtlList<MatroskaReader::QWORD> lens;
+ MatroskaReader::QWORD tlen = 0;
+ MatroskaReader::QWORD FrameSize;
+ BYTE FramesInLaceLessOne;
+
+ switch ((Lacing & 0x06) >> 1) {
+ case 0:
+ // No lacing
+ lens.AddTail((pMN->m_start + pMN->m_len) - (pMN->GetPos() + tlen));
+ break;
+ case 1:
+ // Xiph lacing
+ BYTE n;
+ pMN->Read(n);
+ while (n-- > 0) {
+ BYTE b;
+ MatroskaReader::QWORD len = 0;
+ do {
+ pMN->Read(b);
+ len += b;
+ } while (b == 0xff);
+ lens.AddTail(len);
+ tlen += len;
+ }
+ lens.AddTail((pMN->m_start + pMN->m_len) - (pMN->GetPos() + tlen));
+ break;
+ case 2:
+ // Fixed-size lacing
+ pMN->Read(FramesInLaceLessOne);
+ FramesInLaceLessOne++;
+ FrameSize = ((pMN->m_start + pMN->m_len) - (pMN->GetPos() + tlen)) / FramesInLaceLessOne;
+ while (FramesInLaceLessOne-- > 0) {
+ lens.AddTail(FrameSize);
+ }
+ break;
+ case 3:
+ // EBML lacing
+ pMN->Read(FramesInLaceLessOne);
+
+ CLength FirstFrameSize;
+ FirstFrameSize.Parse(pMN);
+ lens.AddTail(FirstFrameSize);
+ FramesInLaceLessOne--;
+ tlen = FirstFrameSize;
+
+ CSignedLength DiffSize;
+ FrameSize = FirstFrameSize;
+ while (FramesInLaceLessOne--) {
+ DiffSize.Parse(pMN);
+ FrameSize += DiffSize;
+ lens.AddTail(FrameSize);
+ tlen += FrameSize;
+ }
+ lens.AddTail((pMN->m_start + pMN->m_len) - (pMN->GetPos() + tlen));
+ break;
+ }
+
+ POSITION pos = lens.GetHeadPosition();
+ while (pos) {
+ MatroskaReader::QWORD len = lens.GetNext(pos);
+ CAutoPtr<CBinary> p(DNew CBinary());
+ p->SetCount((INT_PTR)len);
+ pMN->Read(p->GetData(), len);
+ BlockData.AddTail(p);
+ }
+
+ return S_OK;
}
HRESULT BlockAdditions::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0xA6:
- bm.Parse(pMN);
- break;
- EndChunk
+ bm.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT BlockMore::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0xEE:
- BlockAddID.Parse(pMN);
- break;
+ BlockAddID.Parse(pMN);
+ break;
case 0xA5:
- BlockAdditional.Parse(pMN);
- break;
- EndChunk
+ BlockAdditional.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT TimeSlice::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0xCC:
- LaceNumber.Parse(pMN);
- break;
+ LaceNumber.Parse(pMN);
+ break;
case 0xCD:
- FrameNumber.Parse(pMN);
- break;
+ FrameNumber.Parse(pMN);
+ break;
case 0xCE:
- Delay.Parse(pMN);
- break;
+ Delay.Parse(pMN);
+ break;
case 0xCF:
- Duration.Parse(pMN);
- break;
- EndChunk
+ Duration.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT Cue::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0xBB:
- CuePoints.Parse(pMN);
- break;
- EndChunk
+ CuePoints.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT CuePoint::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0xB3:
- CueTime.Parse(pMN);
- break;
+ CueTime.Parse(pMN);
+ break;
case 0xB7:
- CueTrackPositions.Parse(pMN);
- break;
- EndChunk
+ CueTrackPositions.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT CueTrackPosition::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0xF7:
- CueTrack.Parse(pMN);
- break;
+ CueTrack.Parse(pMN);
+ break;
case 0xF1:
- CueClusterPosition.Parse(pMN);
- break;
+ CueClusterPosition.Parse(pMN);
+ break;
case 0x5387:
- CueBlockNumber.Parse(pMN);
- break;
+ CueBlockNumber.Parse(pMN);
+ break;
case 0xEA:
- CueCodecState.Parse(pMN);
- break;
+ CueCodecState.Parse(pMN);
+ break;
case 0xDB:
- CueReferences.Parse(pMN);
- break;
- EndChunk
+ CueReferences.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT CueReference::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x96:
- CueRefTime.Parse(pMN);
- break;
+ CueRefTime.Parse(pMN);
+ break;
case 0x97:
- CueRefCluster.Parse(pMN);
- break;
+ CueRefCluster.Parse(pMN);
+ break;
case 0x535F:
- CueRefNumber.Parse(pMN);
- break;
+ CueRefNumber.Parse(pMN);
+ break;
case 0xEB:
- CueRefCodecState.Parse(pMN);
- break;
- EndChunk
+ CueRefCodecState.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT Attachment::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x61A7:
- AttachedFiles.Parse(pMN);
- break;
- EndChunk
+ AttachedFiles.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT AttachedFile::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x467E:
- FileDescription.Parse(pMN);
- break;
+ FileDescription.Parse(pMN);
+ break;
case 0x466E:
- FileName.Parse(pMN);
- break;
+ FileName.Parse(pMN);
+ break;
case 0x4660:
- FileMimeType.Parse(pMN);
- break;
+ FileMimeType.Parse(pMN);
+ break;
case 0x465C: // binary
- FileDataLen = (INT_PTR)pMN->m_len;
- FileDataPos = pMN->m_start;
- break;
+ FileDataLen = (INT_PTR)pMN->m_len;
+ FileDataPos = pMN->m_start;
+ break;
case 0x46AE:
- FileUID.Parse(pMN);
- break;
- EndChunk
+ FileUID.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT Chapter::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x45B9:
- EditionEntries.Parse(pMN);
- break;
- EndChunk
+ EditionEntries.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT EditionEntry::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0xB6:
- ChapterAtoms.Parse(pMN);
- break;
- EndChunk
+ ChapterAtoms.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT ChapterAtom::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x73C4:
- ChapterUID.Parse(pMN);
- break;
+ ChapterUID.Parse(pMN);
+ break;
case 0x91:
- ChapterTimeStart.Parse(pMN);
- break;
+ ChapterTimeStart.Parse(pMN);
+ break;
case 0x92:
- ChapterTimeEnd.Parse(pMN);
- break;
- // case 0x8F: // TODO
+ ChapterTimeEnd.Parse(pMN);
+ break;
+ // case 0x8F: // TODO
case 0x80:
- ChapterDisplays.Parse(pMN);
- break;
+ ChapterDisplays.Parse(pMN);
+ break;
case 0xB6:
- ChapterAtoms.Parse(pMN);
- break;
+ ChapterAtoms.Parse(pMN);
+ break;
case 0x98:
- ChapterFlagHidden.Parse(pMN);
- break;
+ ChapterFlagHidden.Parse(pMN);
+ break;
case 0x4598:
- ChapterFlagEnabled.Parse(pMN);
- break;
- EndChunk
+ ChapterFlagEnabled.Parse(pMN);
+ break;
+ EndChunk
}
HRESULT ChapterDisplay::Parse(CMatroskaNode* pMN0)
{
- BeginChunk
+ BeginChunk
case 0x85:
- ChapString.Parse(pMN);
- break;
+ ChapString.Parse(pMN);
+ break;
case 0x437C:
- ChapLanguage.Parse(pMN);
- break;
+ ChapLanguage.Parse(pMN);
+ break;
case 0x437E:
- ChapCountry.Parse(pMN);
- break;
- EndChunk
+ ChapCountry.Parse(pMN);
+ break;
+ EndChunk
}
//
HRESULT CBinary::Parse(CMatroskaNode* pMN)
{
- ASSERT(pMN->m_len <= INT_MAX);
- SetCount((INT_PTR)pMN->m_len);
- return pMN->Read(GetData(), pMN->m_len);
+ ASSERT(pMN->m_len <= INT_MAX);
+ SetCount((INT_PTR)pMN->m_len);
+ return pMN->Read(GetData(), pMN->m_len);
}
bool CBinary::Compress(ContentCompression& cc)
{
- if (cc.ContentCompAlgo == ContentCompression::ZLIB) {
- int res;
- z_stream c_stream;
+ if (cc.ContentCompAlgo == ContentCompression::ZLIB) {
+ int res;
+ z_stream c_stream;
- c_stream.zalloc = (alloc_func)0;
- c_stream.zfree = (free_func)0;
- c_stream.opaque = (voidpf)0;
+ c_stream.zalloc = (alloc_func)0;
+ c_stream.zfree = (free_func)0;
+ c_stream.opaque = (voidpf)0;
- if (Z_OK != (res = deflateInit(&c_stream, 9))) {
- return false;
- }
+ if (Z_OK != (res = deflateInit(&c_stream, 9))) {
+ return false;
+ }
- c_stream.next_in = GetData();
- c_stream.avail_in = (uInt)GetCount();
+ c_stream.next_in = GetData();
+ c_stream.avail_in = (uInt)GetCount();
- BYTE* dst = NULL;
- int n = 0;
- do {
- dst = (BYTE*)realloc(dst, ++n*10);
- c_stream.next_out = &dst[(n-1)*10];
- c_stream.avail_out = 10;
- if (Z_OK != (res = deflate(&c_stream, Z_FINISH)) && Z_STREAM_END != res) {
- free(dst);
- return false;
- }
- } while (0 == c_stream.avail_out && Z_STREAM_END != res);
+ BYTE* dst = NULL;
+ int n = 0;
+ do {
+ dst = (BYTE*)realloc(dst, ++n * 10);
+ c_stream.next_out = &dst[(n - 1) * 10];
+ c_stream.avail_out = 10;
+ if (Z_OK != (res = deflate(&c_stream, Z_FINISH)) && Z_STREAM_END != res) {
+ free(dst);
+ return false;
+ }
+ } while (0 == c_stream.avail_out && Z_STREAM_END != res);
- deflateEnd(&c_stream);
+ deflateEnd(&c_stream);
- SetCount(c_stream.total_out);
- memcpy(GetData(), dst, GetCount());
+ SetCount(c_stream.total_out);
+ memcpy(GetData(), dst, GetCount());
- free(dst);
+ free(dst);
- return true;
- }
+ return true;
+ }
- return false;
+ return false;
}
bool CBinary::Decompress(ContentCompression& cc)
{
- if (cc.ContentCompAlgo == ContentCompression::ZLIB) {
- int res;
- z_stream d_stream;
+ if (cc.ContentCompAlgo == ContentCompression::ZLIB) {
+ int res;
+ z_stream d_stream;
- d_stream.zalloc = (alloc_func)0;
- d_stream.zfree = (free_func)0;
- d_stream.opaque = (voidpf)0;
+ d_stream.zalloc = (alloc_func)0;
+ d_stream.zfree = (free_func)0;
+ d_stream.opaque = (voidpf)0;
- if (Z_OK != (res = inflateInit(&d_stream))) {
- return false;
- }
+ if (Z_OK != (res = inflateInit(&d_stream))) {
+ return false;
+ }
- d_stream.next_in = GetData();
- d_stream.avail_in = (uInt)GetCount();
+ d_stream.next_in = GetData();
+ d_stream.avail_in = (uInt)GetCount();
- BYTE* dst = NULL;
- int n = 0;
- do {
- dst = (unsigned char *)realloc(dst, ++n*1000);
- d_stream.next_out = &dst[(n-1)*1000];
- d_stream.avail_out = 1000;
- if (Z_OK != (res = inflate(&d_stream, Z_NO_FLUSH)) && Z_STREAM_END != res) {
- free(dst);
- return false;
- }
- } while (0 == d_stream.avail_out && 0 != d_stream.avail_in && Z_STREAM_END != res);
+ BYTE* dst = NULL;
+ int n = 0;
+ do {
+ dst = (unsigned char*)realloc(dst, ++n * 1000);
+ d_stream.next_out = &dst[(n - 1) * 1000];
+ d_stream.avail_out = 1000;
+ if (Z_OK != (res = inflate(&d_stream, Z_NO_FLUSH)) && Z_STREAM_END != res) {
+ free(dst);
+ return false;
+ }
+ } while (0 == d_stream.avail_out && 0 != d_stream.avail_in && Z_STREAM_END != res);
- inflateEnd(&d_stream);
+ inflateEnd(&d_stream);
- SetCount(d_stream.total_out);
- memcpy(GetData(), dst, GetCount());
+ SetCount(d_stream.total_out);
+ memcpy(GetData(), dst, GetCount());
- free(dst);
+ free(dst);
- return true;
- } else if (cc.ContentCompAlgo == ContentCompression::HDRSTRIP) {
- InsertArrayAt(0, &cc.ContentCompSettings);
- }
+ return true;
+ } else if (cc.ContentCompAlgo == ContentCompression::HDRSTRIP) {
+ InsertArrayAt(0, &cc.ContentCompSettings);
+ }
- return false;
+ return false;
}
HRESULT CANSI::Parse(CMatroskaNode* pMN)
{
- Empty();
+ Empty();
- MatroskaReader::QWORD len = pMN->m_len;
- CHAR c;
- while (len-- > 0 && SUCCEEDED(pMN->Read(c))) {
- *this += c;
- }
+ MatroskaReader::QWORD len = pMN->m_len;
+ CHAR c;
+ while (len-- > 0 && SUCCEEDED(pMN->Read(c))) {
+ *this += c;
+ }
- return (len == -1 ? S_OK : E_FAIL);
+ return (len == -1 ? S_OK : E_FAIL);
}
HRESULT CUTF8::Parse(CMatroskaNode* pMN)
{
- Empty();
- CAutoVectorPtr<BYTE> buff;
- if (!buff.Allocate((UINT)pMN->m_len + 1) || S_OK != pMN->Read(buff, pMN->m_len)) {
- return E_FAIL;
- }
- buff[pMN->m_len] = 0;
- CStringW::operator = (UTF8To16((LPCSTR)(BYTE*)buff));
- return S_OK;
+ Empty();
+ CAutoVectorPtr<BYTE> buff;
+ if (!buff.Allocate((UINT)pMN->m_len + 1) || S_OK != pMN->Read(buff, pMN->m_len)) {
+ return E_FAIL;
+ }
+ buff[pMN->m_len] = 0;
+ CStringW::operator = (UTF8To16((LPCSTR)(BYTE*)buff));
+ return S_OK;
}
HRESULT CUInt::Parse(CMatroskaNode* pMN)
{
- m_val = 0;
- for (int i = 0; i < (int)pMN->m_len; i++) {
- m_val <<= 8;
- HRESULT hr = pMN->Read(*(BYTE*)&m_val);
- if (FAILED(hr)) {
- return hr;
- }
- }
- m_fValid = true;
- return S_OK;
+ m_val = 0;
+ for (int i = 0; i < (int)pMN->m_len; i++) {
+ m_val <<= 8;
+ HRESULT hr = pMN->Read(*(BYTE*)&m_val);
+ if (FAILED(hr)) {
+ return hr;
+ }
+ }
+ m_fValid = true;
+ return S_OK;
}
HRESULT CInt::Parse(CMatroskaNode* pMN)
{
- m_val = 0;
- for (int i = 0; i < (int)pMN->m_len; i++) {
- HRESULT hr = pMN->Read(*((BYTE*)&m_val+7-i));
- if (FAILED(hr)) {
- return hr;
- }
- }
- m_val >>= (8-pMN->m_len)*8;
- m_fValid = true;
- return S_OK;
+ m_val = 0;
+ for (int i = 0; i < (int)pMN->m_len; i++) {
+ HRESULT hr = pMN->Read(*((BYTE*)&m_val + 7 - i));
+ if (FAILED(hr)) {
+ return hr;
+ }
+ }
+ m_val >>= (8 - pMN->m_len) * 8;
+ m_fValid = true;
+ return S_OK;
}
HRESULT CFloat::Parse(CMatroskaNode* pMN)
{
- HRESULT hr = E_FAIL;
- m_val = 0;
+ HRESULT hr = E_FAIL;
+ m_val = 0;
- if (pMN->m_len == 4) {
- float val = 0;
- hr = pMN->Read(val);
- m_val = val;
- } else if (pMN->m_len == 8) {
- hr = pMN->Read(m_val);
- }
- if (SUCCEEDED(hr)) {
- m_fValid = true;
- }
- return hr;
+ if (pMN->m_len == 4) {
+ float val = 0;
+ hr = pMN->Read(val);
+ m_val = val;
+ } else if (pMN->m_len == 8) {
+ hr = pMN->Read(m_val);
+ }
+ if (SUCCEEDED(hr)) {
+ m_fValid = true;
+ }
+ return hr;
}
template<class T, class BASE>
HRESULT CSimpleVar<T, BASE>::Parse(CMatroskaNode* pMN)
{
- m_val = 0;
- m_fValid = true;
- return pMN->Read(m_val);
+ m_val = 0;
+ m_fValid = true;
+ return pMN->Read(m_val);
}
HRESULT CID::Parse(CMatroskaNode* pMN)
{
- m_val = 0;
-
- BYTE b = 0;
- HRESULT hr = pMN->Read(b);
- if (FAILED(hr)) {
- return hr;
- }
-
- int nMoreBytes = 0;
-
- if ((b&0x80) == 0x80) {
- m_val = b&0xff;
- nMoreBytes = 0;
- } else if ((b&0xc0) == 0x40) {
- m_val = b&0x7f;
- nMoreBytes = 1;
- } else if ((b&0xe0) == 0x20) {
- m_val = b&0x3f;
- nMoreBytes = 2;
- } else if ((b&0xf0) == 0x10) {
- m_val = b&0x1f;
- nMoreBytes = 3;
- } else {
- return E_FAIL;
- }
-
- while (nMoreBytes-- > 0) {
- m_val <<= 8;
- hr = pMN->Read(*(BYTE*)&m_val);
- if (FAILED(hr)) {
- return hr;
- }
- }
-
- m_fValid = true;
-
- return S_OK;
+ m_val = 0;
+
+ BYTE b = 0;
+ HRESULT hr = pMN->Read(b);
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ int nMoreBytes = 0;
+
+ if ((b & 0x80) == 0x80) {
+ m_val = b & 0xff;
+ nMoreBytes = 0;
+ } else if ((b & 0xc0) == 0x40) {
+ m_val = b & 0x7f;
+ nMoreBytes = 1;
+ } else if ((b & 0xe0) == 0x20) {
+ m_val = b & 0x3f;
+ nMoreBytes = 2;
+ } else if ((b & 0xf0) == 0x10) {
+ m_val = b & 0x1f;
+ nMoreBytes = 3;
+ } else {
+ return E_FAIL;
+ }
+
+ while (nMoreBytes-- > 0) {
+ m_val <<= 8;
+ hr = pMN->Read(*(BYTE*)&m_val);
+ if (FAILED(hr)) {
+ return hr;
+ }
+ }
+
+ m_fValid = true;
+
+ return S_OK;
}
HRESULT CLength::Parse(CMatroskaNode* pMN)
{
- m_val = 0;
-
- BYTE b = 0;
- HRESULT hr = pMN->Read(b);
- if (FAILED(hr)) {
- return hr;
- }
-
- int nMoreBytes = 0;
-
- if ((b&0x80) == 0x80) {
- m_val = b&0x7f;
- nMoreBytes = 0;
- } else if ((b&0xc0) == 0x40) {
- m_val = b&0x3f;
- nMoreBytes = 1;
- } else if ((b&0xe0) == 0x20) {
- m_val = b&0x1f;
- nMoreBytes = 2;
- } else if ((b&0xf0) == 0x10) {
- m_val = b&0x0f;
- nMoreBytes = 3;
- } else if ((b&0xf8) == 0x08) {
- m_val = b&0x07;
- nMoreBytes = 4;
- } else if ((b&0xfc) == 0x04) {
- m_val = b&0x03;
- nMoreBytes = 5;
- } else if ((b&0xfe) == 0x02) {
- m_val = b&0x01;
- nMoreBytes = 6;
- } else if ((b&0xff) == 0x01) {
- m_val = b&0x00;
- nMoreBytes = 7;
- } else {
- return E_FAIL;
- }
-
- //int nMoreBytesTmp = nMoreBytes;
-
- MatroskaReader::QWORD UnknownSize = (1i64<<(7*(nMoreBytes+1)))-1;
-
- while (nMoreBytes-- > 0) {
- m_val <<= 8;
- hr = pMN->Read(*(BYTE*)&m_val);
- if (FAILED(hr)) {
- return hr;
- }
- }
-
- if (m_val == UnknownSize) {
- m_val = pMN->GetLength() - pMN->GetPos();
- TRACE(_T("CLength: Unspecified chunk size at %I64d (corrected to %I64d)\n"), pMN->GetPos(), m_val);
- }
-
- if (m_fSigned) {
- m_val -= (UnknownSize >> 1);
- }
-
- m_fValid = true;
-
- return S_OK;
+ m_val = 0;
+
+ BYTE b = 0;
+ HRESULT hr = pMN->Read(b);
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ int nMoreBytes = 0;
+
+ if ((b & 0x80) == 0x80) {
+ m_val = b & 0x7f;
+ nMoreBytes = 0;
+ } else if ((b & 0xc0) == 0x40) {
+ m_val = b & 0x3f;
+ nMoreBytes = 1;
+ } else if ((b & 0xe0) == 0x20) {
+ m_val = b & 0x1f;
+ nMoreBytes = 2;
+ } else if ((b & 0xf0) == 0x10) {
+ m_val = b & 0x0f;
+ nMoreBytes = 3;
+ } else if ((b & 0xf8) == 0x08) {
+ m_val = b & 0x07;
+ nMoreBytes = 4;
+ } else if ((b & 0xfc) == 0x04) {
+ m_val = b & 0x03;
+ nMoreBytes = 5;
+ } else if ((b & 0xfe) == 0x02) {
+ m_val = b & 0x01;
+ nMoreBytes = 6;
+ } else if ((b & 0xff) == 0x01) {
+ m_val = b & 0x00;
+ nMoreBytes = 7;
+ } else {
+ return E_FAIL;
+ }
+
+ //int nMoreBytesTmp = nMoreBytes;
+
+ MatroskaReader::QWORD UnknownSize = (1i64 << (7 * (nMoreBytes + 1))) - 1;
+
+ while (nMoreBytes-- > 0) {
+ m_val <<= 8;
+ hr = pMN->Read(*(BYTE*)&m_val);
+ if (FAILED(hr)) {
+ return hr;
+ }
+ }
+
+ if (m_val == UnknownSize) {
+ m_val = pMN->GetLength() - pMN->GetPos();
+ TRACE(_T("CLength: Unspecified chunk size at %I64d (corrected to %I64d)\n"), pMN->GetPos(), m_val);
+ }
+
+ if (m_fSigned) {
+ m_val -= (UnknownSize >> 1);
+ }
+
+ m_fValid = true;
+
+ return S_OK;
}
/*
HRESULT CSignedLength::Parse(CMatroskaNode* pMN)
{
-// HRESULT hr = __super::Parse(pMN);
-// if (FAILED(hr)) return hr;
+// HRESULT hr = __super::Parse(pMN);
+// if (FAILED(hr)) return hr;
- m_val = 0;
+ m_val = 0;
- BYTE b = 0;
- HRESULT hr = pMN->Read(b);
- if (FAILED(hr)) return hr;
+ BYTE b = 0;
+ HRESULT hr = pMN->Read(b);
+ if (FAILED(hr)) return hr;
- int nMoreBytes = 0;
+ int nMoreBytes = 0;
- if ((b&0x80) == 0x80) {m_val = b&0x7f; nMoreBytes = 0;}
- else if ((b&0xc0) == 0x40) {m_val = b&0x3f; nMoreBytes = 1;}
- else if ((b&0xe0) == 0x20) {m_val = b&0x1f; nMoreBytes = 2;}
- else if ((b&0xf0) == 0x10) {m_val = b&0x0f; nMoreBytes = 3;}
- else if ((b&0xf8) == 0x08) {m_val = b&0x07; nMoreBytes = 4;}
- else if ((b&0xfc) == 0x04) {m_val = b&0x03; nMoreBytes = 5;}
- else if ((b&0xfe) == 0x02) {m_val = b&0x01; nMoreBytes = 6;}
- else if ((b&0xff) == 0x01) {m_val = b&0x00; nMoreBytes = 7;}
- else return E_FAIL;
+ if ((b&0x80) == 0x80) {m_val = b&0x7f; nMoreBytes = 0;}
+ else if ((b&0xc0) == 0x40) {m_val = b&0x3f; nMoreBytes = 1;}
+ else if ((b&0xe0) == 0x20) {m_val = b&0x1f; nMoreBytes = 2;}
+ else if ((b&0xf0) == 0x10) {m_val = b&0x0f; nMoreBytes = 3;}
+ else if ((b&0xf8) == 0x08) {m_val = b&0x07; nMoreBytes = 4;}
+ else if ((b&0xfc) == 0x04) {m_val = b&0x03; nMoreBytes = 5;}
+ else if ((b&0xfe) == 0x02) {m_val = b&0x01; nMoreBytes = 6;}
+ else if ((b&0xff) == 0x01) {m_val = b&0x00; nMoreBytes = 7;}
+ else return E_FAIL;
- //int nMoreBytesTmp = nMoreBytes;
+ //int nMoreBytesTmp = nMoreBytes;
- MatroskaReader::QWORD UnknownSize = (1i64<<(7*(nMoreBytes+1)))-1;
+ MatroskaReader::QWORD UnknownSize = (1i64<<(7*(nMoreBytes+1)))-1;
- while (nMoreBytes-- > 0)
- {
- m_val <<= 8;
- hr = pMN->Read(*(BYTE*)&m_val);
- if (FAILED(hr)) return hr;
- }
+ while (nMoreBytes-- > 0)
+ {
+ m_val <<= 8;
+ hr = pMN->Read(*(BYTE*)&m_val);
+ if (FAILED(hr)) return hr;
+ }
- if (m_val == UnknownSize)
- {
- m_val = pMN->GetLength() - pMN->GetPos();
- TRACE(_T("CLength: Unspecified chunk size at %I64d (corrected to %I64d)\n"), pMN->GetPos(), m_val);
- }
+ if (m_val == UnknownSize)
+ {
+ m_val = pMN->GetLength() - pMN->GetPos();
+ TRACE(_T("CLength: Unspecified chunk size at %I64d (corrected to %I64d)\n"), pMN->GetPos(), m_val);
+ }
- m_val -= (UnknownSize >> 1);
+ m_val -= (UnknownSize >> 1);
- m_fValid = true;
+ m_fValid = true;
- return S_OK;
+ return S_OK;
}
*/
template<class T>
HRESULT CNode<T>::Parse(CMatroskaNode* pMN)
{
- CAutoPtr<T> p(DNew T());
- HRESULT hr = E_OUTOFMEMORY;
- if (!p || FAILED(hr = p->Parse(pMN))) {
- return hr;
- }
- AddTail(p);
- return S_OK;
+ CAutoPtr<T> p(DNew T());
+ HRESULT hr = E_OUTOFMEMORY;
+ if (!p || FAILED(hr = p->Parse(pMN))) {
+ return hr;
+ }
+ AddTail(p);
+ return S_OK;
}
HRESULT CBlockGroupNode::Parse(CMatroskaNode* pMN, bool fFull)
{
- CAutoPtr<BlockGroup> p(DNew BlockGroup());
- HRESULT hr = E_OUTOFMEMORY;
- if (!p || FAILED(hr = p->Parse(pMN, fFull))) {
- return hr;
- }
- AddTail(p);
- return S_OK;
+ CAutoPtr<BlockGroup> p(DNew BlockGroup());
+ HRESULT hr = E_OUTOFMEMORY;
+ if (!p || FAILED(hr = p->Parse(pMN, fFull))) {
+ return hr;
+ }
+ AddTail(p);
+ return S_OK;
}
HRESULT CSimpleBlockNode::Parse(CMatroskaNode* pMN, bool fFull)
{
- CAutoPtr<SimpleBlock> p(DNew SimpleBlock());
- HRESULT hr = E_OUTOFMEMORY;
- if (!p || FAILED(hr = p->Parse(pMN, fFull))) {
- return hr;
- }
- AddTail(p);
- return S_OK;
+ CAutoPtr<SimpleBlock> p(DNew SimpleBlock());
+ HRESULT hr = E_OUTOFMEMORY;
+ if (!p || FAILED(hr = p->Parse(pMN, fFull))) {
+ return hr;
+ }
+ AddTail(p);
+ return S_OK;
}
///////////////////////////////
CMatroskaNode::CMatroskaNode(CMatroskaFile* pMF)
- : m_pMF(pMF)
- , m_pParent(NULL)
+ : m_pMF(pMF)
+ , m_pParent(NULL)
{
- ASSERT(m_pMF);
- m_start = m_filepos = 0;
- m_len.Set(m_pMF ? m_pMF->GetLength() : 0);
+ ASSERT(m_pMF);
+ m_start = m_filepos = 0;
+ m_len.Set(m_pMF ? m_pMF->GetLength() : 0);
}
CMatroskaNode::CMatroskaNode(CMatroskaNode* pParent)
- : m_pMF(pParent->m_pMF)
- , m_pParent(pParent)
+ : m_pMF(pParent->m_pMF)
+ , m_pParent(pParent)
{
- Parse();
+ Parse();
}
HRESULT CMatroskaNode::Parse()
{
- m_filepos = GetPos();
- if (FAILED(m_id.Parse(this)) || FAILED(m_len.Parse(this))) {
- return E_FAIL;
- }
- m_start = GetPos();
- return S_OK;
+ m_filepos = GetPos();
+ if (FAILED(m_id.Parse(this)) || FAILED(m_len.Parse(this))) {
+ return E_FAIL;
+ }
+ m_start = GetPos();
+ return S_OK;
}
CAutoPtr<CMatroskaNode> CMatroskaNode::Child(DWORD id, bool fSearch)
{
- if (m_len == 0) {
- return CAutoPtr<CMatroskaNode>();
- }
- SeekTo(m_start);
- CAutoPtr<CMatroskaNode> pMN(DNew CMatroskaNode(this));
- if (id && !pMN->Find(id, fSearch)) {
- pMN.Free();
- }
- return pMN;
+ if (m_len == 0) {
+ return CAutoPtr<CMatroskaNode>();
+ }
+ SeekTo(m_start);
+ CAutoPtr<CMatroskaNode> pMN(DNew CMatroskaNode(this));
+ if (id && !pMN->Find(id, fSearch)) {
+ pMN.Free();
+ }
+ return pMN;
}
bool CMatroskaNode::Next(bool fSame)
{
- if (!m_pParent) {
- return false;
- }
+ if (!m_pParent) {
+ return false;
+ }
- CID id = m_id;
+ CID id = m_id;
- while (m_start+m_len < m_pParent->m_start+m_pParent->m_len) {
- SeekTo(m_start+m_len);
+ while (m_start + m_len < m_pParent->m_start + m_pParent->m_len) {
+ SeekTo(m_start + m_len);
- if (FAILED(Parse())) {
- if (!Resync()) {
- return false;
- }
- }
+ if (FAILED(Parse())) {
+ if (!Resync()) {
+ return false;
+ }
+ }
- if (!fSame || m_id == id) {
- return true;
- }
- }
+ if (!fSame || m_id == id) {
+ return true;
+ }
+ }
- return false;
+ return false;
}
bool CMatroskaNode::Find(DWORD id, bool fSearch)
{
- MatroskaReader::QWORD pos = m_pParent && m_pParent->m_id == 0x18538067 /*segment?*/
- ? FindPos(id)
- : 0;
+ MatroskaReader::QWORD pos = m_pParent && m_pParent->m_id == 0x18538067 /*segment?*/
+ ? FindPos(id)
+ : 0;
- if (pos) {
- SeekTo(pos);
- Parse();
- } else if (fSearch) {
- while (m_id != id && Next()) {
- ;
- }
- }
+ if (pos) {
+ SeekTo(pos);
+ Parse();
+ } else if (fSearch) {
+ while (m_id != id && Next()) {
+ ;
+ }
+ }
- return (m_id == id);
+ return (m_id == id);
}
void CMatroskaNode::SeekTo(MatroskaReader::QWORD pos)
{
- m_pMF->Seek(pos);
+ m_pMF->Seek(pos);
}
MatroskaReader::QWORD CMatroskaNode::GetPos()
{
- return m_pMF->GetPos();
+ return m_pMF->GetPos();
}
MatroskaReader::QWORD CMatroskaNode::GetLength()
{
- return m_pMF->GetLength();
+ return m_pMF->GetLength();
}
template <class T>
HRESULT CMatroskaNode::Read(T& var)
{
- return m_pMF->Read(var);
+ return m_pMF->Read(var);
}
HRESULT CMatroskaNode::Read(BYTE* pData, MatroskaReader::QWORD len)
{
- return m_pMF->ByteRead(pData, len);
+ return m_pMF->ByteRead(pData, len);
}
MatroskaReader::QWORD CMatroskaNode::FindPos(DWORD id, MatroskaReader::QWORD start)
{
- Segment& sm = m_pMF->m_segment;
+ Segment& sm = m_pMF->m_segment;
- POSITION pos = sm.MetaSeekInfo.GetHeadPosition();
- while (pos) {
- Seek* s = sm.MetaSeekInfo.GetNext(pos);
+ POSITION pos = sm.MetaSeekInfo.GetHeadPosition();
+ while (pos) {
+ Seek* s = sm.MetaSeekInfo.GetNext(pos);
- POSITION pos2 = s->SeekHeads.GetHeadPosition();
- while (pos2) {
- SeekHead* sh = s->SeekHeads.GetNext(pos2);
- if (sh->SeekID == id && sh->SeekPosition+sm.pos >= start) {
- return sh->SeekPosition+sm.pos;
- }
- }
- }
+ POSITION pos2 = s->SeekHeads.GetHeadPosition();
+ while (pos2) {
+ SeekHead* sh = s->SeekHeads.GetNext(pos2);
+ if (sh->SeekID == id && sh->SeekPosition + sm.pos >= start) {
+ return sh->SeekPosition + sm.pos;
+ }
+ }
+ }
- return 0;
+ return 0;
}
CAutoPtr<CMatroskaNode> CMatroskaNode::Copy()
{
- CAutoPtr<CMatroskaNode> pNewNode(DNew CMatroskaNode(m_pMF));
- pNewNode->m_pParent = m_pParent;
- pNewNode->m_id.Set(m_id);
- pNewNode->m_len.Set(m_len);
- pNewNode->m_filepos = m_filepos;
- pNewNode->m_start = m_start;
- return pNewNode;
+ CAutoPtr<CMatroskaNode> pNewNode(DNew CMatroskaNode(m_pMF));
+ pNewNode->m_pParent = m_pParent;
+ pNewNode->m_id.Set(m_id);
+ pNewNode->m_len.Set(m_len);
+ pNewNode->m_filepos = m_filepos;
+ pNewNode->m_start = m_start;
+ return pNewNode;
}
CAutoPtr<CMatroskaNode> CMatroskaNode::GetFirstBlock()
{
- CAutoPtr<CMatroskaNode> pNode = Child();
- do {
- if (pNode->m_id == 0xA0 || pNode->m_id == 0xA3) {
- return pNode;
- }
- } while (pNode->Next());
- return CAutoPtr<CMatroskaNode>();
+ CAutoPtr<CMatroskaNode> pNode = Child();
+ do {
+ if (pNode->m_id == 0xA0 || pNode->m_id == 0xA3) {
+ return pNode;
+ }
+ } while (pNode->Next());
+ return CAutoPtr<CMatroskaNode>();
}
bool CMatroskaNode::NextBlock()
{
- if (!m_pParent) {
- return false;
- }
+ if (!m_pParent) {
+ return false;
+ }
- CID id = m_id;
+ CID id = m_id;
- while (m_start+m_len < m_pParent->m_start+m_pParent->m_len) {
- SeekTo(m_start+m_len);
+ while (m_start + m_len < m_pParent->m_start + m_pParent->m_len) {
+ SeekTo(m_start + m_len);
- if (FAILED(Parse())) {
- if (!Resync()) {
- return false;
- }
- }
+ if (FAILED(Parse())) {
+ if (!Resync()) {
+ return false;
+ }
+ }
- if (m_id == 0xA0 || m_id == 0xA3) {
- return true;
- }
- }
+ if (m_id == 0xA0 || m_id == 0xA3) {
+ return true;
+ }
+ }
- return false;
+ return false;
}
bool CMatroskaNode::Resync()
{
- if (m_pParent->m_id == 0x18538067) { /*segment?*/
- SeekTo(m_filepos);
-
- for (BYTE b = 0; S_OK == Read(b); b = 0) {
- if ((b&0xf0) != 0x10) {
- continue;
- }
-
- DWORD dw = b;
- Read((BYTE*)&dw+1, 3);
- bswap((BYTE*)&dw, 4);
-
- switch (dw) {
- case 0x1549A966: // SegmentInfo
- case 0x114D9B74: // MetaSeekInfo
- case 0x1654AE6B: // Tracks
- case 0x1F43B675: // Clusters
- case 0x1C53BB6B: // Cues
- case 0x1941A469: // Attachments
- case 0x1043A770: // Chapters
- case 0x1254C367: // Tags
- SeekTo(GetPos()-4);
- return SUCCEEDED(Parse());
- default:
- SeekTo(GetPos()-3);
- break;
- }
- }
- }
-
- return false;
+ if (m_pParent->m_id == 0x18538067) { /*segment?*/
+ SeekTo(m_filepos);
+
+ for (BYTE b = 0; S_OK == Read(b); b = 0) {
+ if ((b & 0xf0) != 0x10) {
+ continue;
+ }
+
+ DWORD dw = b;
+ Read((BYTE*)&dw + 1, 3);
+ bswap((BYTE*)&dw, 4);
+
+ switch (dw) {
+ case 0x1549A966: // SegmentInfo
+ case 0x114D9B74: // MetaSeekInfo
+ case 0x1654AE6B: // Tracks
+ case 0x1F43B675: // Clusters
+ case 0x1C53BB6B: // Cues
+ case 0x1941A469: // Attachments
+ case 0x1043A770: // Chapters
+ case 0x1254C367: // Tags
+ SeekTo(GetPos() - 4);
+ return SUCCEEDED(Parse());
+ default:
+ SeekTo(GetPos() - 3);
+ break;
+ }
+ }
+ }
+
+ return false;
}
diff --git a/src/filters/parser/MatroskaSplitter/MatroskaFile.h b/src/filters/parser/MatroskaSplitter/MatroskaFile.h
index 02cbbc475..989d4f2fc 100644
--- a/src/filters/parser/MatroskaSplitter/MatroskaFile.h
+++ b/src/filters/parser/MatroskaSplitter/MatroskaFile.h
@@ -29,577 +29,577 @@
namespace MatroskaReader
{
- class CMatroskaNode;
-
- typedef unsigned __int64 QWORD;
-
- class CANSI : public CStringA
- {
- public:
- HRESULT Parse(CMatroskaNode* pMN);
- };
- class CUTF8 : public CStringW
- {
- public:
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- template<class T, class BASE>
- class CSimpleVar
- {
- protected:
- T m_val;
- bool m_fValid;
- public:
- CSimpleVar(T val = 0) : m_val(val), m_fValid(false) {}
- BASE& operator = (const BASE& v) {
- m_val = v.m_val;
- m_fValid = true;
- return *this;
- }
- BASE& operator = (T val) {
- m_val = val;
- m_fValid = true;
- return *this;
- }
- operator T() const {
- return m_val;
- }
- BASE& Set(T val) {
- m_val = val;
- m_fValid = true;
- return (*(BASE*)this);
- }
- bool IsValid() const {
- return m_fValid;
- }
- virtual HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class CUInt : public CSimpleVar<UINT64, CUInt>
- {
- public:
- HRESULT Parse(CMatroskaNode* pMN);
- };
- class CInt : public CSimpleVar<INT64, CInt>
- {
- public:
- HRESULT Parse(CMatroskaNode* pMN);
- };
- class CByte : public CSimpleVar<BYTE, CByte> {};
- class CShort : public CSimpleVar<short, CShort> {};
- class CFloat : public CSimpleVar<double, CFloat>
- {
- public:
- HRESULT Parse(CMatroskaNode* pMN);
- };
- class CID : public CSimpleVar<DWORD, CID>
- {
- public:
- HRESULT Parse(CMatroskaNode* pMN);
- };
- class CLength : public CSimpleVar<UINT64, CLength>
- {
- bool m_fSigned;
- public:
- CLength(bool fSigned = false) : m_fSigned(fSigned) {} HRESULT Parse(CMatroskaNode* pMN);
- };
- class CSignedLength : public CLength
- {
- public:
- CSignedLength() : CLength(true) {}
- };
-
- class ContentCompression;
-
- class CBinary : public CAtlArray<BYTE>
- {
- public:
- CBinary& operator = (const CBinary& b) {
- Copy(b);
- return *this;
- }
- CStringA ToString() {
- return CStringA((LPCSTR)GetData(), (int)GetCount());
- }
- bool Compress(ContentCompression& cc), Decompress(ContentCompression& cc);
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- template<class T>
- class CNode : public CAutoPtrList<T>
- {
- public:
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class EBML
- {
- public:
- CUInt EBMLVersion, EBMLReadVersion;
- CUInt EBMLMaxIDLength, EBMLMaxSizeLength;
- CANSI DocType;
- CUInt DocTypeVersion, DocTypeReadVersion;
-
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class Info
- {
- public:
- CBinary SegmentUID, PrevUID, NextUID;
- CUTF8 SegmentFilename, PrevFilename, NextFilename;
- CUInt TimeCodeScale; // [ns], default: 1.000.000
- CFloat Duration;
- CInt DateUTC;
- CUTF8 Title, MuxingApp, WritingApp;
-
- Info() {
- TimeCodeScale.Set(1000000ui64);
- }
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class SeekHead
- {
- public:
- CID SeekID;
- CUInt SeekPosition;
-
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class Seek
- {
- public:
- CNode<SeekHead> SeekHeads;
-
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class TimeSlice
- {
- public:
- CUInt LaceNumber, FrameNumber;
- CUInt Delay, Duration;
-
- TimeSlice() {
- LaceNumber.Set(0);
- FrameNumber.Set(0);
- Delay.Set(0);
- Duration.Set(0);
- }
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class SimpleBlock
- {
- public:
- CLength TrackNumber;
- CInt TimeCode;
- CByte Lacing;
- CAutoPtrList<CBinary> BlockData;
-
- HRESULT Parse(CMatroskaNode* pMN, bool fFull);
- };
-
- class BlockMore
- {
- public:
- CInt BlockAddID;
- CBinary BlockAdditional;
-
- BlockMore() {
- BlockAddID.Set(1);
- }
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class BlockAdditions
- {
- public:
- CNode<BlockMore> bm;
-
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class BlockGroup
- {
- public:
- SimpleBlock Block;
- // BlockVirtual
- CUInt BlockDuration;
- CUInt ReferencePriority;
- CInt ReferenceBlock;
- CInt ReferenceVirtual;
- CBinary CodecState;
- CNode<TimeSlice> TimeSlices;
- BlockAdditions ba;
-
- HRESULT Parse(CMatroskaNode* pMN, bool fFull);
- };
-
- class CBlockGroupNode : public CNode<BlockGroup>
- {
- public:
- HRESULT Parse(CMatroskaNode* pMN, bool fFull);
- };
-
- class CSimpleBlockNode : public CNode<SimpleBlock>
- {
- public:
- HRESULT Parse(CMatroskaNode* pMN, bool fFull);
- };
-
- class Cluster
- {
- public:
- CUInt TimeCode, Position, PrevSize;
- CBlockGroupNode BlockGroups;
- CSimpleBlockNode SimpleBlocks;
-
- HRESULT Parse(CMatroskaNode* pMN);
- HRESULT ParseTimeCode(CMatroskaNode* pMN);
- };
-
- class Video
- {
- public:
- CUInt FlagInterlaced, StereoMode;
- CUInt PixelWidth, PixelHeight, DisplayWidth, DisplayHeight, DisplayUnit;
- CUInt VideoPixelCropBottom, VideoPixelCropTop, VideoPixelCropLeft, VideoPixelCropRight;
- CUInt AspectRatioType;
- CUInt ColourSpace;
- CFloat GammaValue;
- CFloat FramePerSec;
-
- Video() {
- FlagInterlaced.Set(0);
- StereoMode.Set(0);
- DisplayUnit.Set(0);
- AspectRatioType.Set(0);
- }
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class Audio
- {
- public:
- CFloat SamplingFrequency;
- CFloat OutputSamplingFrequency;
- CUInt Channels;
- CBinary ChannelPositions;
- CUInt BitDepth;
-
- Audio() {
- SamplingFrequency.Set(8000.0);
- Channels.Set(1);
- }
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class ContentCompression
- {
- public:
- CUInt ContentCompAlgo;
- enum {ZLIB, BZLIB, LZO1X, HDRSTRIP};
- CBinary ContentCompSettings;
-
- ContentCompression() {
- ContentCompAlgo.Set(ZLIB);
- }
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class ContentEncryption
- {
- public:
- CUInt ContentEncAlgo;
- enum {UNKE, DES, THREEDES, TWOFISH, BLOWFISH, AES};
- CBinary ContentEncKeyID, ContentSignature, ContentSigKeyID;
- CUInt ContentSigAlgo;
- enum {UNKS, RSA};
- CUInt ContentSigHashAlgo;
- enum {UNKSH, SHA1_160, MD5};
-
- ContentEncryption() {
- ContentEncAlgo.Set(0);
- ContentSigAlgo.Set(0);
- ContentSigHashAlgo.Set(0);
- }
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class ContentEncoding
- {
- public:
- CUInt ContentEncodingOrder;
- CUInt ContentEncodingScope;
- enum {AllFrameContents = 1, TracksPrivateData = 2};
- CUInt ContentEncodingType;
- enum {Compression, Encryption};
- ContentCompression cc;
- ContentEncryption ce;
-
- ContentEncoding() {
- ContentEncodingOrder.Set(0);
- ContentEncodingScope.Set(AllFrameContents);
- ContentEncodingType.Set(Compression);
- }
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class ContentEncodings
- {
- public:
- CNode<ContentEncoding> ce;
-
- ContentEncodings() {}
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class TrackEntry
- {
- public:
- enum {TypeVideo = 1, TypeAudio = 2, TypeComplex = 3, TypeLogo = 0x10, TypeSubtitle = 0x11, TypeControl = 0x20};
- CUInt TrackNumber, TrackUID, TrackType;
- CUInt FlagEnabled, FlagDefault, FlagLacing, FlagForced;
- CUInt MinCache, MaxCache;
- CUTF8 Name;
- CANSI Language;
- CBinary CodecID;
- CBinary CodecPrivate;
- CUTF8 CodecName;
- CUTF8 CodecSettings;
- CANSI CodecInfoURL;
- CANSI CodecDownloadURL;
- CUInt CodecDecodeAll;
- CUInt TrackOverlay;
- CUInt DefaultDuration;
- CUInt MaxBlockAdditionID;
- CFloat TrackTimecodeScale;
- enum {NoDesc = 0, DescVideo = 1, DescAudio = 2};
- unsigned int DescType;
- Video v;
- Audio a;
- ContentEncodings ces;
- TrackEntry() {
- DescType = NoDesc;
- FlagEnabled.Set(1);
- FlagDefault.Set(1);
- FlagLacing.Set(1);
- FlagForced.Set(0);
- MinCache.Set(0);
- TrackTimecodeScale.Set(1.0f);
- Language.CStringA::operator = ("eng");
- MaxBlockAdditionID.Set(0);
- CodecDecodeAll.Set(1);
- }
- HRESULT Parse(CMatroskaNode* pMN);
-
- bool Expand(CBinary& data, UINT64 Scope);
- };
-
- class Track
- {
- public:
- CNode<TrackEntry> TrackEntries;
-
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class CueReference
- {
- public:
- CUInt CueRefTime, CueRefCluster, CueRefNumber, CueRefCodecState;
-
- CueReference() {
- CueRefNumber.Set(1);
- CueRefCodecState.Set(0);
- }
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class CueTrackPosition
- {
- public:
- CUInt CueTrack, CueClusterPosition, CueBlockNumber, CueCodecState;
- CNode<CueReference> CueReferences;
-
- CueTrackPosition() {
- CueBlockNumber.Set(1);
- CueCodecState.Set(0);
- }
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class CuePoint
- {
- public:
- CUInt CueTime;
- CNode<CueTrackPosition> CueTrackPositions;
-
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class Cue
- {
- public:
- CNode<CuePoint> CuePoints;
-
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class AttachedFile
- {
- public:
- CUTF8 FileDescription;
- CUTF8 FileName;
- CANSI FileMimeType;
- QWORD FileDataPos, FileDataLen; // BYTE* FileData
- CUInt FileUID;
-
- AttachedFile() {
- FileDataPos = FileDataLen = 0;
- }
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class Attachment
- {
- public:
- CNode<AttachedFile> AttachedFiles;
-
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class ChapterDisplay
- {
- public:
- CUTF8 ChapString;
- CANSI ChapLanguage;
- CANSI ChapCountry;
-
- ChapterDisplay() {
- ChapLanguage.CStringA::operator = ("eng");
- }
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class ChapterAtom
- {
- public:
- CUInt ChapterUID;
- CUInt ChapterTimeStart, ChapterTimeEnd, ChapterFlagHidden, ChapterFlagEnabled;
- //CNode<CUInt> ChapterTracks; // TODO
- CNode<ChapterDisplay> ChapterDisplays;
- CNode<ChapterAtom> ChapterAtoms;
-
- ChapterAtom() {
- ChapterUID.Set(0);// 0 = not set (ChapUID zero not allow by Matroska specs)
- ChapterFlagHidden.Set(0);
- ChapterFlagEnabled.Set(1);
- }
- HRESULT Parse(CMatroskaNode* pMN);
- ChapterAtom* FindChapterAtom(UINT64 id);
- };
-
- class EditionEntry : public ChapterAtom
- {
- public:
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class Chapter
- {
- public:
- CNode<EditionEntry> EditionEntries;
-
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class Segment
- {
- public:
- QWORD pos, len;
- Info SegmentInfo;
- CNode<Seek> MetaSeekInfo;
- CNode<Cluster> Clusters;
- CNode<Track> Tracks;
- CNode<Cue> Cues;
- CNode<Attachment> Attachments;
- CNode<Chapter> Chapters;
- // TODO: Chapters
- // TODO: Tags
-
- HRESULT Parse(CMatroskaNode* pMN);
- HRESULT ParseMinimal(CMatroskaNode* pMN);
-
- UINT64 GetMasterTrack();
-
- REFERENCE_TIME GetRefTime(INT64 t) const {
- return t*(REFERENCE_TIME)(SegmentInfo.TimeCodeScale)/100;
- }
- ChapterAtom* FindChapterAtom(UINT64 id, int nEditionEntry = 0);
- };
-
- class CMatroskaFile : public CBaseSplitterFile
- {
- public:
- CMatroskaFile(IAsyncReader* pAsyncReader, HRESULT& hr);
- virtual ~CMatroskaFile() {}
-
- HRESULT Init();
-
- //using CBaseSplitterFile::Read;
- template <class T> HRESULT Read(T& var);
-
- EBML m_ebml;
- Segment m_segment;
- REFERENCE_TIME m_rtOffset;
-
- HRESULT Parse(CMatroskaNode* pMN);
- };
-
- class CMatroskaNode
- {
- CMatroskaNode* m_pParent;
- CMatroskaFile* m_pMF;
-
- bool Resync();
-
- public:
- CID m_id;
- CLength m_len;
- QWORD m_filepos, m_start;
-
- HRESULT Parse();
-
- public:
- CMatroskaNode(CMatroskaFile* pMF); // creates the root
- CMatroskaNode(CMatroskaNode* pParent);
-
- CMatroskaNode* Parent() {
- return m_pParent;
- }
- CAutoPtr<CMatroskaNode> Child(DWORD id = 0, bool fSearch = true);
- bool Next(bool fSame = false);
- bool Find(DWORD id, bool fSearch = true);
-
- QWORD FindPos(DWORD id, QWORD start = 0);
-
- void SeekTo(QWORD pos);
- QWORD GetPos(), GetLength();
- template <class T> HRESULT Read(T& var);
- HRESULT Read(BYTE* pData, QWORD len);
-
- CAutoPtr<CMatroskaNode> Copy();
-
- CAutoPtr<CMatroskaNode> GetFirstBlock();
- bool NextBlock();
-
- bool IsRandomAccess() {
- return m_pMF->IsRandomAccess();
- }
- };
+ class CMatroskaNode;
+
+ typedef unsigned __int64 QWORD;
+
+ class CANSI : public CStringA
+ {
+ public:
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+ class CUTF8 : public CStringW
+ {
+ public:
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ template<class T, class BASE>
+ class CSimpleVar
+ {
+ protected:
+ T m_val;
+ bool m_fValid;
+ public:
+ CSimpleVar(T val = 0) : m_val(val), m_fValid(false) {}
+ BASE& operator = (const BASE& v) {
+ m_val = v.m_val;
+ m_fValid = true;
+ return *this;
+ }
+ BASE& operator = (T val) {
+ m_val = val;
+ m_fValid = true;
+ return *this;
+ }
+ operator T() const {
+ return m_val;
+ }
+ BASE& Set(T val) {
+ m_val = val;
+ m_fValid = true;
+ return (*(BASE*)this);
+ }
+ bool IsValid() const {
+ return m_fValid;
+ }
+ virtual HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class CUInt : public CSimpleVar<UINT64, CUInt>
+ {
+ public:
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+ class CInt : public CSimpleVar<INT64, CInt>
+ {
+ public:
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+ class CByte : public CSimpleVar<BYTE, CByte> {};
+ class CShort : public CSimpleVar<short, CShort> {};
+ class CFloat : public CSimpleVar<double, CFloat>
+ {
+ public:
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+ class CID : public CSimpleVar<DWORD, CID>
+ {
+ public:
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+ class CLength : public CSimpleVar<UINT64, CLength>
+ {
+ bool m_fSigned;
+ public:
+ CLength(bool fSigned = false) : m_fSigned(fSigned) {} HRESULT Parse(CMatroskaNode* pMN);
+ };
+ class CSignedLength : public CLength
+ {
+ public:
+ CSignedLength() : CLength(true) {}
+ };
+
+ class ContentCompression;
+
+ class CBinary : public CAtlArray<BYTE>
+ {
+ public:
+ CBinary& operator = (const CBinary& b) {
+ Copy(b);
+ return *this;
+ }
+ CStringA ToString() {
+ return CStringA((LPCSTR)GetData(), (int)GetCount());
+ }
+ bool Compress(ContentCompression& cc), Decompress(ContentCompression& cc);
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ template<class T>
+ class CNode : public CAutoPtrList<T>
+ {
+ public:
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class EBML
+ {
+ public:
+ CUInt EBMLVersion, EBMLReadVersion;
+ CUInt EBMLMaxIDLength, EBMLMaxSizeLength;
+ CANSI DocType;
+ CUInt DocTypeVersion, DocTypeReadVersion;
+
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class Info
+ {
+ public:
+ CBinary SegmentUID, PrevUID, NextUID;
+ CUTF8 SegmentFilename, PrevFilename, NextFilename;
+ CUInt TimeCodeScale; // [ns], default: 1.000.000
+ CFloat Duration;
+ CInt DateUTC;
+ CUTF8 Title, MuxingApp, WritingApp;
+
+ Info() {
+ TimeCodeScale.Set(1000000ui64);
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class SeekHead
+ {
+ public:
+ CID SeekID;
+ CUInt SeekPosition;
+
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class Seek
+ {
+ public:
+ CNode<SeekHead> SeekHeads;
+
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class TimeSlice
+ {
+ public:
+ CUInt LaceNumber, FrameNumber;
+ CUInt Delay, Duration;
+
+ TimeSlice() {
+ LaceNumber.Set(0);
+ FrameNumber.Set(0);
+ Delay.Set(0);
+ Duration.Set(0);
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class SimpleBlock
+ {
+ public:
+ CLength TrackNumber;
+ CInt TimeCode;
+ CByte Lacing;
+ CAutoPtrList<CBinary> BlockData;
+
+ HRESULT Parse(CMatroskaNode* pMN, bool fFull);
+ };
+
+ class BlockMore
+ {
+ public:
+ CInt BlockAddID;
+ CBinary BlockAdditional;
+
+ BlockMore() {
+ BlockAddID.Set(1);
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class BlockAdditions
+ {
+ public:
+ CNode<BlockMore> bm;
+
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class BlockGroup
+ {
+ public:
+ SimpleBlock Block;
+ // BlockVirtual
+ CUInt BlockDuration;
+ CUInt ReferencePriority;
+ CInt ReferenceBlock;
+ CInt ReferenceVirtual;
+ CBinary CodecState;
+ CNode<TimeSlice> TimeSlices;
+ BlockAdditions ba;
+
+ HRESULT Parse(CMatroskaNode* pMN, bool fFull);
+ };
+
+ class CBlockGroupNode : public CNode<BlockGroup>
+ {
+ public:
+ HRESULT Parse(CMatroskaNode* pMN, bool fFull);
+ };
+
+ class CSimpleBlockNode : public CNode<SimpleBlock>
+ {
+ public:
+ HRESULT Parse(CMatroskaNode* pMN, bool fFull);
+ };
+
+ class Cluster
+ {
+ public:
+ CUInt TimeCode, Position, PrevSize;
+ CBlockGroupNode BlockGroups;
+ CSimpleBlockNode SimpleBlocks;
+
+ HRESULT Parse(CMatroskaNode* pMN);
+ HRESULT ParseTimeCode(CMatroskaNode* pMN);
+ };
+
+ class Video
+ {
+ public:
+ CUInt FlagInterlaced, StereoMode;
+ CUInt PixelWidth, PixelHeight, DisplayWidth, DisplayHeight, DisplayUnit;
+ CUInt VideoPixelCropBottom, VideoPixelCropTop, VideoPixelCropLeft, VideoPixelCropRight;
+ CUInt AspectRatioType;
+ CUInt ColourSpace;
+ CFloat GammaValue;
+ CFloat FramePerSec;
+
+ Video() {
+ FlagInterlaced.Set(0);
+ StereoMode.Set(0);
+ DisplayUnit.Set(0);
+ AspectRatioType.Set(0);
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class Audio
+ {
+ public:
+ CFloat SamplingFrequency;
+ CFloat OutputSamplingFrequency;
+ CUInt Channels;
+ CBinary ChannelPositions;
+ CUInt BitDepth;
+
+ Audio() {
+ SamplingFrequency.Set(8000.0);
+ Channels.Set(1);
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class ContentCompression
+ {
+ public:
+ CUInt ContentCompAlgo;
+ enum {ZLIB, BZLIB, LZO1X, HDRSTRIP};
+ CBinary ContentCompSettings;
+
+ ContentCompression() {
+ ContentCompAlgo.Set(ZLIB);
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class ContentEncryption
+ {
+ public:
+ CUInt ContentEncAlgo;
+ enum {UNKE, DES, THREEDES, TWOFISH, BLOWFISH, AES};
+ CBinary ContentEncKeyID, ContentSignature, ContentSigKeyID;
+ CUInt ContentSigAlgo;
+ enum {UNKS, RSA};
+ CUInt ContentSigHashAlgo;
+ enum {UNKSH, SHA1_160, MD5};
+
+ ContentEncryption() {
+ ContentEncAlgo.Set(0);
+ ContentSigAlgo.Set(0);
+ ContentSigHashAlgo.Set(0);
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class ContentEncoding
+ {
+ public:
+ CUInt ContentEncodingOrder;
+ CUInt ContentEncodingScope;
+ enum {AllFrameContents = 1, TracksPrivateData = 2};
+ CUInt ContentEncodingType;
+ enum {Compression, Encryption};
+ ContentCompression cc;
+ ContentEncryption ce;
+
+ ContentEncoding() {
+ ContentEncodingOrder.Set(0);
+ ContentEncodingScope.Set(AllFrameContents);
+ ContentEncodingType.Set(Compression);
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class ContentEncodings
+ {
+ public:
+ CNode<ContentEncoding> ce;
+
+ ContentEncodings() {}
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class TrackEntry
+ {
+ public:
+ enum {TypeVideo = 1, TypeAudio = 2, TypeComplex = 3, TypeLogo = 0x10, TypeSubtitle = 0x11, TypeControl = 0x20};
+ CUInt TrackNumber, TrackUID, TrackType;
+ CUInt FlagEnabled, FlagDefault, FlagLacing, FlagForced;
+ CUInt MinCache, MaxCache;
+ CUTF8 Name;
+ CANSI Language;
+ CBinary CodecID;
+ CBinary CodecPrivate;
+ CUTF8 CodecName;
+ CUTF8 CodecSettings;
+ CANSI CodecInfoURL;
+ CANSI CodecDownloadURL;
+ CUInt CodecDecodeAll;
+ CUInt TrackOverlay;
+ CUInt DefaultDuration;
+ CUInt MaxBlockAdditionID;
+ CFloat TrackTimecodeScale;
+ enum {NoDesc = 0, DescVideo = 1, DescAudio = 2};
+ unsigned int DescType;
+ Video v;
+ Audio a;
+ ContentEncodings ces;
+ TrackEntry() {
+ DescType = NoDesc;
+ FlagEnabled.Set(1);
+ FlagDefault.Set(1);
+ FlagLacing.Set(1);
+ FlagForced.Set(0);
+ MinCache.Set(0);
+ TrackTimecodeScale.Set(1.0f);
+ Language.CStringA::operator = ("eng");
+ MaxBlockAdditionID.Set(0);
+ CodecDecodeAll.Set(1);
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+
+ bool Expand(CBinary& data, UINT64 Scope);
+ };
+
+ class Track
+ {
+ public:
+ CNode<TrackEntry> TrackEntries;
+
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class CueReference
+ {
+ public:
+ CUInt CueRefTime, CueRefCluster, CueRefNumber, CueRefCodecState;
+
+ CueReference() {
+ CueRefNumber.Set(1);
+ CueRefCodecState.Set(0);
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class CueTrackPosition
+ {
+ public:
+ CUInt CueTrack, CueClusterPosition, CueBlockNumber, CueCodecState;
+ CNode<CueReference> CueReferences;
+
+ CueTrackPosition() {
+ CueBlockNumber.Set(1);
+ CueCodecState.Set(0);
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class CuePoint
+ {
+ public:
+ CUInt CueTime;
+ CNode<CueTrackPosition> CueTrackPositions;
+
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class Cue
+ {
+ public:
+ CNode<CuePoint> CuePoints;
+
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class AttachedFile
+ {
+ public:
+ CUTF8 FileDescription;
+ CUTF8 FileName;
+ CANSI FileMimeType;
+ QWORD FileDataPos, FileDataLen; // BYTE* FileData
+ CUInt FileUID;
+
+ AttachedFile() {
+ FileDataPos = FileDataLen = 0;
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class Attachment
+ {
+ public:
+ CNode<AttachedFile> AttachedFiles;
+
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class ChapterDisplay
+ {
+ public:
+ CUTF8 ChapString;
+ CANSI ChapLanguage;
+ CANSI ChapCountry;
+
+ ChapterDisplay() {
+ ChapLanguage.CStringA::operator = ("eng");
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class ChapterAtom
+ {
+ public:
+ CUInt ChapterUID;
+ CUInt ChapterTimeStart, ChapterTimeEnd, ChapterFlagHidden, ChapterFlagEnabled;
+ //CNode<CUInt> ChapterTracks; // TODO
+ CNode<ChapterDisplay> ChapterDisplays;
+ CNode<ChapterAtom> ChapterAtoms;
+
+ ChapterAtom() {
+ ChapterUID.Set(0);// 0 = not set (ChapUID zero not allow by Matroska specs)
+ ChapterFlagHidden.Set(0);
+ ChapterFlagEnabled.Set(1);
+ }
+ HRESULT Parse(CMatroskaNode* pMN);
+ ChapterAtom* FindChapterAtom(UINT64 id);
+ };
+
+ class EditionEntry : public ChapterAtom
+ {
+ public:
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class Chapter
+ {
+ public:
+ CNode<EditionEntry> EditionEntries;
+
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class Segment
+ {
+ public:
+ QWORD pos, len;
+ Info SegmentInfo;
+ CNode<Seek> MetaSeekInfo;
+ CNode<Cluster> Clusters;
+ CNode<Track> Tracks;
+ CNode<Cue> Cues;
+ CNode<Attachment> Attachments;
+ CNode<Chapter> Chapters;
+ // TODO: Chapters
+ // TODO: Tags
+
+ HRESULT Parse(CMatroskaNode* pMN);
+ HRESULT ParseMinimal(CMatroskaNode* pMN);
+
+ UINT64 GetMasterTrack();
+
+ REFERENCE_TIME GetRefTime(INT64 t) const {
+ return t * (REFERENCE_TIME)(SegmentInfo.TimeCodeScale) / 100;
+ }
+ ChapterAtom* FindChapterAtom(UINT64 id, int nEditionEntry = 0);
+ };
+
+ class CMatroskaFile : public CBaseSplitterFile
+ {
+ public:
+ CMatroskaFile(IAsyncReader* pAsyncReader, HRESULT& hr);
+ virtual ~CMatroskaFile() {}
+
+ HRESULT Init();
+
+ //using CBaseSplitterFile::Read;
+ template <class T> HRESULT Read(T& var);
+
+ EBML m_ebml;
+ Segment m_segment;
+ REFERENCE_TIME m_rtOffset;
+
+ HRESULT Parse(CMatroskaNode* pMN);
+ };
+
+ class CMatroskaNode
+ {
+ CMatroskaNode* m_pParent;
+ CMatroskaFile* m_pMF;
+
+ bool Resync();
+
+ public:
+ CID m_id;
+ CLength m_len;
+ QWORD m_filepos, m_start;
+
+ HRESULT Parse();
+
+ public:
+ CMatroskaNode(CMatroskaFile* pMF); // creates the root
+ CMatroskaNode(CMatroskaNode* pParent);
+
+ CMatroskaNode* Parent() {
+ return m_pParent;
+ }
+ CAutoPtr<CMatroskaNode> Child(DWORD id = 0, bool fSearch = true);
+ bool Next(bool fSame = false);
+ bool Find(DWORD id, bool fSearch = true);
+
+ QWORD FindPos(DWORD id, QWORD start = 0);
+
+ void SeekTo(QWORD pos);
+ QWORD GetPos(), GetLength();
+ template <class T> HRESULT Read(T& var);
+ HRESULT Read(BYTE* pData, QWORD len);
+
+ CAutoPtr<CMatroskaNode> Copy();
+
+ CAutoPtr<CMatroskaNode> GetFirstBlock();
+ bool NextBlock();
+
+ bool IsRandomAccess() {
+ return m_pMF->IsRandomAccess();
+ }
+ };
}
diff --git a/src/filters/parser/MatroskaSplitter/MatroskaSplitter.cpp b/src/filters/parser/MatroskaSplitter/MatroskaSplitter.cpp
index 7a8b93f81..43d7a64b5 100644
--- a/src/filters/parser/MatroskaSplitter/MatroskaSplitter.cpp
+++ b/src/filters/parser/MatroskaSplitter/MatroskaSplitter.cpp
@@ -37,43 +37,43 @@ using namespace MatroskaReader;
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_Matroska},
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL}
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_Matroska},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL}
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CMatroskaSplitterFilter), MatroskaSplitterName, MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CMatroskaSourceFilter), MatroskaSourceName, MERIT_NORMAL, 0, NULL, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CMatroskaSplitterFilter), MatroskaSplitterName, MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CMatroskaSourceFilter), MatroskaSourceName, MERIT_NORMAL, 0, NULL, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CMatroskaSplitterFilter>, NULL, &sudFilter[0]},
- {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CMatroskaSourceFilter>, NULL, &sudFilter[1]},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CMatroskaSplitterFilter>, NULL, &sudFilter[0]},
+ {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CMatroskaSourceFilter>, NULL, &sudFilter[1]},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- RegisterSourceFilter(
- __uuidof(CMatroskaSourceFilter),
- MEDIASUBTYPE_Matroska,
- _T("0,4,,1A45DFA3"),
- _T(".mkv"), _T(".mka"), _T(".mks"), NULL);
+ RegisterSourceFilter(
+ __uuidof(CMatroskaSourceFilter),
+ MEDIASUBTYPE_Matroska,
+ _T("0,4,,1A45DFA3"),
+ _T(".mkv"), _T(".mka"), _T(".mks"), NULL);
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- UnRegisterSourceFilter(MEDIASUBTYPE_Matroska);
+ UnRegisterSourceFilter(MEDIASUBTYPE_Matroska);
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -87,7 +87,7 @@ CFilterApp theApp;
//
CMatroskaSplitterFilter::CMatroskaSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CBaseSplitterFilter(NAME("CMatroskaSplitterFilter"), pUnk, phr, __uuidof(this))
+ : CBaseSplitterFilter(NAME("CMatroskaSplitterFilter"), pUnk, phr, __uuidof(this))
{
}
@@ -97,1255 +97,1263 @@ CMatroskaSplitterFilter::~CMatroskaSplitterFilter()
STDMETHODIMP CMatroskaSplitterFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(ITrackInfo)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(ITrackInfo)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
STDMETHODIMP CMatroskaSplitterFilter::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
-
- if (m_pName && m_pName[0]==L'M' && m_pName[1]==L'P' && m_pName[2]==L'C') {
- (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
- } else {
- wcscpy_s(pInfo->achName, MatroskaSourceName);
- }
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+
+ if (m_pName && m_pName[0] == L'M' && m_pName[1] == L'P' && m_pName[2] == L'C') {
+ (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
+ } else {
+ wcscpy_s(pInfo->achName, MatroskaSourceName);
+ }
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
HRESULT CMatroskaSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
{
- CheckPointer(pAsyncReader, E_POINTER);
-
- HRESULT hr = E_FAIL;
-
- m_pFile.Free();
- m_pTrackEntryMap.RemoveAll();
- m_pOrderedTrackArray.RemoveAll();
-
- CAtlArray<CMatroskaSplitterOutputPin*> pinOut;
- CAtlArray<TrackEntry*> pinOutTE;
-
- m_pFile.Attach(DNew CMatroskaFile(pAsyncReader, hr));
- if (!m_pFile) {
- return E_OUTOFMEMORY;
- }
- if (FAILED(hr)) {
- m_pFile.Free();
- return hr;
- }
-
- m_rtNewStart = m_rtCurrent = 0;
- m_rtNewStop = m_rtStop = m_rtDuration = 0;
-
- int iVideo = 1, iAudio = 1, iSubtitle = 1;
- bool bHasVideo = 0;
-
- POSITION pos = m_pFile->m_segment.Tracks.GetHeadPosition();
- while (pos) {
- Track* pT = m_pFile->m_segment.Tracks.GetNext(pos);
-
- POSITION pos2 = pT->TrackEntries.GetHeadPosition();
- while (pos2) {
- TrackEntry* pTE = pT->TrackEntries.GetNext(pos2);
-
- bool isSub = false;
-
- if (!pTE->Expand(pTE->CodecPrivate, ContentEncoding::TracksPrivateData)) {
- continue;
- }
-
- CStringA CodecID = pTE->CodecID.ToString();
-
- CStringW Name;
- Name.Format(L"Output %I64d", (UINT64)pTE->TrackNumber);
-
- CMediaType mt;
- CAtlArray<CMediaType> mts;
-
- mt.SetSampleSize(1);
-
- if (pTE->TrackType == TrackEntry::TypeVideo) {
- Name.Format(L"Video %d", iVideo++);
-
- mt.majortype = MEDIATYPE_Video;
-
- if (CodecID == "V_MS/VFW/FOURCC") {
- mt.formattype = FORMAT_VideoInfo;
- VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + pTE->CodecPrivate.GetCount() - sizeof(BITMAPINFOHEADER));
- memset(mt.Format(), 0, mt.FormatLength());
- memcpy(&pvih->bmiHeader, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
- mt.subtype = FOURCCMap(pvih->bmiHeader.biCompression);
- switch (pvih->bmiHeader.biCompression) {
- case BI_RGB:
- case BI_BITFIELDS:
- mt.subtype =
- pvih->bmiHeader.biBitCount == 1 ? MEDIASUBTYPE_RGB1 :
- pvih->bmiHeader.biBitCount == 4 ? MEDIASUBTYPE_RGB4 :
- pvih->bmiHeader.biBitCount == 8 ? MEDIASUBTYPE_RGB8 :
- pvih->bmiHeader.biBitCount == 16 ? MEDIASUBTYPE_RGB565 :
- pvih->bmiHeader.biBitCount == 24 ? MEDIASUBTYPE_RGB24 :
- pvih->bmiHeader.biBitCount == 32 ? MEDIASUBTYPE_ARGB32 :
- MEDIASUBTYPE_NULL;
- break;
- // case BI_RLE8: mt.subtype = MEDIASUBTYPE_RGB8; break;
- // case BI_RLE4: mt.subtype = MEDIASUBTYPE_RGB4; break;
- }
- if (!bHasVideo) {
- mts.Add(mt);
- if (mt.subtype == MEDIASUBTYPE_WVC1) {
- mt.subtype = MEDIASUBTYPE_WVC1_CYBERLINK;
- mts.Add(mt);
- }
- }
- bHasVideo = true;
- } else if (CodecID == "V_UNCOMPRESSED") {
- } else if (CodecID.Find("V_MPEG4/ISO/AVC") == 0 && pTE->CodecPrivate.GetCount() >= 6) {
- BYTE sps = pTE->CodecPrivate[5] & 0x1f;
-
- std::vector<BYTE> avcC;
- for (size_t i = 0, j = pTE->CodecPrivate.GetCount(); i < j; i++) {
- avcC.push_back(pTE->CodecPrivate[i]);
- }
-
- std::vector<BYTE> sh;
-
- unsigned jj = 6;
-
- while (sps--) {
- if (jj + 2 > avcC.size()) {
- goto avcfail;
- }
- unsigned spslen = ((unsigned)avcC[jj] << 8) | avcC[jj+1];
- if (jj + 2 + spslen > avcC.size()) {
- goto avcfail;
- }
- unsigned cur = sh.size();
- sh.resize(cur + spslen + 2, 0);
- std::copy(avcC.begin() + jj, avcC.begin() + jj + 2 + spslen,sh.begin() + cur);
- jj += 2 + spslen;
- }
-
- if (jj + 1 > avcC.size()) {
- continue;
- }
-
- unsigned pps = avcC[jj++];
-
- while (pps--) {
- if (jj + 2 > avcC.size()) {
- goto avcfail;
- }
- unsigned ppslen = ((unsigned)avcC[jj] << 8) | avcC[jj+1];
- if (jj + 2 + ppslen > avcC.size()) {
- goto avcfail;
- }
- unsigned cur = sh.size();
- sh.resize(cur + ppslen + 2, 0);
- std::copy(avcC.begin() + jj, avcC.begin() + jj + 2 + ppslen, sh.begin() + cur);
- jj += 2 + ppslen;
- }
-
- goto avcsuccess;
+ CheckPointer(pAsyncReader, E_POINTER);
+
+ HRESULT hr = E_FAIL;
+
+ m_pFile.Free();
+ m_pTrackEntryMap.RemoveAll();
+ m_pOrderedTrackArray.RemoveAll();
+
+ CAtlArray<CMatroskaSplitterOutputPin*> pinOut;
+ CAtlArray<TrackEntry*> pinOutTE;
+
+ m_pFile.Attach(DNew CMatroskaFile(pAsyncReader, hr));
+ if (!m_pFile) {
+ return E_OUTOFMEMORY;
+ }
+ if (FAILED(hr)) {
+ m_pFile.Free();
+ return hr;
+ }
+
+ m_rtNewStart = m_rtCurrent = 0;
+ m_rtNewStop = m_rtStop = m_rtDuration = 0;
+
+ int iVideo = 1, iAudio = 1, iSubtitle = 1;
+ bool bHasVideo = 0;
+
+ POSITION pos = m_pFile->m_segment.Tracks.GetHeadPosition();
+ while (pos) {
+ Track* pT = m_pFile->m_segment.Tracks.GetNext(pos);
+
+ POSITION pos2 = pT->TrackEntries.GetHeadPosition();
+ while (pos2) {
+ TrackEntry* pTE = pT->TrackEntries.GetNext(pos2);
+
+ bool isSub = false;
+
+ if (!pTE->Expand(pTE->CodecPrivate, ContentEncoding::TracksPrivateData)) {
+ continue;
+ }
+
+ CStringA CodecID = pTE->CodecID.ToString();
+
+ CStringW Name;
+ Name.Format(L"Output %I64d", (UINT64)pTE->TrackNumber);
+
+ CMediaType mt;
+ CAtlArray<CMediaType> mts;
+
+ mt.SetSampleSize(1);
+
+ if (pTE->TrackType == TrackEntry::TypeVideo) {
+ Name.Format(L"Video %d", iVideo++);
+
+ mt.majortype = MEDIATYPE_Video;
+
+ if (CodecID == "V_MS/VFW/FOURCC") {
+ mt.formattype = FORMAT_VideoInfo;
+ VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + pTE->CodecPrivate.GetCount() - sizeof(BITMAPINFOHEADER));
+ memset(mt.Format(), 0, mt.FormatLength());
+ memcpy(&pvih->bmiHeader, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+ mt.subtype = FOURCCMap(pvih->bmiHeader.biCompression);
+ switch (pvih->bmiHeader.biCompression) {
+ case BI_RGB:
+ case BI_BITFIELDS:
+ mt.subtype =
+ pvih->bmiHeader.biBitCount == 1 ? MEDIASUBTYPE_RGB1 :
+ pvih->bmiHeader.biBitCount == 4 ? MEDIASUBTYPE_RGB4 :
+ pvih->bmiHeader.biBitCount == 8 ? MEDIASUBTYPE_RGB8 :
+ pvih->bmiHeader.biBitCount == 16 ? MEDIASUBTYPE_RGB565 :
+ pvih->bmiHeader.biBitCount == 24 ? MEDIASUBTYPE_RGB24 :
+ pvih->bmiHeader.biBitCount == 32 ? MEDIASUBTYPE_ARGB32 :
+ MEDIASUBTYPE_NULL;
+ break;
+ // case BI_RLE8: mt.subtype = MEDIASUBTYPE_RGB8; break;
+ // case BI_RLE4: mt.subtype = MEDIASUBTYPE_RGB4; break;
+ }
+ if (!bHasVideo) {
+ mts.Add(mt);
+ if (mt.subtype == MEDIASUBTYPE_WVC1) {
+ mt.subtype = MEDIASUBTYPE_WVC1_CYBERLINK;
+ mts.Add(mt);
+ }
+ }
+ bHasVideo = true;
+ } else if (CodecID == "V_UNCOMPRESSED") {
+ } else if (CodecID.Find("V_MPEG4/ISO/AVC") == 0 && pTE->CodecPrivate.GetCount() >= 6) {
+ BYTE sps = pTE->CodecPrivate[5] & 0x1f;
+
+ std::vector<BYTE> avcC;
+ for (size_t i = 0, j = pTE->CodecPrivate.GetCount(); i < j; i++) {
+ avcC.push_back(pTE->CodecPrivate[i]);
+ }
+
+ std::vector<BYTE> sh;
+
+ unsigned jj = 6;
+
+ while (sps--) {
+ if (jj + 2 > avcC.size()) {
+ goto avcfail;
+ }
+ unsigned spslen = ((unsigned)avcC[jj] << 8) | avcC[jj + 1];
+ if (jj + 2 + spslen > avcC.size()) {
+ goto avcfail;
+ }
+ unsigned cur = sh.size();
+ sh.resize(cur + spslen + 2, 0);
+ std::copy(avcC.begin() + jj, avcC.begin() + jj + 2 + spslen, sh.begin() + cur);
+ jj += 2 + spslen;
+ }
+
+ if (jj + 1 > avcC.size()) {
+ continue;
+ }
+
+ unsigned pps = avcC[jj++];
+
+ while (pps--) {
+ if (jj + 2 > avcC.size()) {
+ goto avcfail;
+ }
+ unsigned ppslen = ((unsigned)avcC[jj] << 8) | avcC[jj + 1];
+ if (jj + 2 + ppslen > avcC.size()) {
+ goto avcfail;
+ }
+ unsigned cur = sh.size();
+ sh.resize(cur + ppslen + 2, 0);
+ std::copy(avcC.begin() + jj, avcC.begin() + jj + 2 + ppslen, sh.begin() + cur);
+ jj += 2 + ppslen;
+ }
+
+ goto avcsuccess;
avcfail:
- continue;
+ continue;
avcsuccess:
- CAtlArray<BYTE> data;
- data.SetCount(sh.size());
- std::copy(sh.begin(), sh.end(), data.GetData());
-
- mt.subtype = FOURCCMap('1CVA');
- mt.formattype = FORMAT_MPEG2Video;
- MPEG2VIDEOINFO* pm2vi = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + data.GetCount());
- memset(mt.Format(), 0, mt.FormatLength());
- pm2vi->hdr.bmiHeader.biSize = sizeof(pm2vi->hdr.bmiHeader);
- pm2vi->hdr.bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
- pm2vi->hdr.bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
- pm2vi->hdr.bmiHeader.biCompression = '1CVA';
- pm2vi->hdr.bmiHeader.biPlanes = 1;
- pm2vi->hdr.bmiHeader.biBitCount = 24;
- pm2vi->dwProfile = pTE->CodecPrivate[1];
- pm2vi->dwLevel = pTE->CodecPrivate[3];
- pm2vi->dwFlags = (pTE->CodecPrivate[4] & 3) + 1;
- BYTE* pSequenceHeader = (BYTE*)pm2vi->dwSequenceHeader;
- memcpy(pSequenceHeader, data.GetData(), data.GetCount());
- pm2vi->cbSequenceHeader = (DWORD)data.GetCount();
- if (!bHasVideo)
- mts.Add(mt);
- bHasVideo = true;
- } else if (CodecID.Find("V_MPEG4/") == 0) {
- mt.subtype = FOURCCMap('V4PM');
- mt.formattype = FORMAT_MPEG2Video;
- MPEG2VIDEOINFO* pm2vi = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + pTE->CodecPrivate.GetCount());
- memset(mt.Format(), 0, mt.FormatLength());
- pm2vi->hdr.bmiHeader.biSize = sizeof(pm2vi->hdr.bmiHeader);
- pm2vi->hdr.bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
- pm2vi->hdr.bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
- pm2vi->hdr.bmiHeader.biCompression = 'V4PM';
- pm2vi->hdr.bmiHeader.biPlanes = 1;
- pm2vi->hdr.bmiHeader.biBitCount = 24;
- BYTE* pSequenceHeader = (BYTE*)pm2vi->dwSequenceHeader;
- memcpy(pSequenceHeader, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
- pm2vi->cbSequenceHeader = (DWORD)pTE->CodecPrivate.GetCount();
- if (!bHasVideo)
- mts.Add(mt);
- bHasVideo = true;
- } else if (CodecID.Find("V_REAL/RV") == 0) {
- mt.subtype = FOURCCMap('00VR' + ((CodecID[9]-0x30)<<16));
- mt.formattype = FORMAT_VideoInfo;
- VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + pTE->CodecPrivate.GetCount());
- memset(mt.Format(), 0, mt.FormatLength());
- memcpy(mt.Format() + sizeof(VIDEOINFOHEADER), pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
- pvih->bmiHeader.biSize = sizeof(pvih->bmiHeader);
- pvih->bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
- pvih->bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
- pvih->bmiHeader.biCompression = mt.subtype.Data1;
- if (!bHasVideo)
- mts.Add(mt);
- bHasVideo = true;
- } else if (CodecID == "V_DIRAC") {
- mt.subtype = MEDIASUBTYPE_DiracVideo;
- mt.formattype = FORMAT_DiracVideoInfo;
- DIRACINFOHEADER* dvih = (DIRACINFOHEADER*)mt.AllocFormatBuffer(FIELD_OFFSET(DIRACINFOHEADER, dwSequenceHeader) + pTE->CodecPrivate.GetCount());
- memset(mt.Format(), 0, mt.FormatLength());
- dvih->hdr.bmiHeader.biSize = sizeof(dvih->hdr.bmiHeader);
- dvih->hdr.bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
- dvih->hdr.bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
- dvih->hdr.dwPictAspectRatioX = dvih->hdr.bmiHeader.biWidth;
- dvih->hdr.dwPictAspectRatioY = dvih->hdr.bmiHeader.biHeight;
-
- BYTE* pSequenceHeader = (BYTE*)dvih->dwSequenceHeader;
- memcpy(pSequenceHeader, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
- dvih->cbSequenceHeader = (DWORD)pTE->CodecPrivate.GetCount();
-
- if (!bHasVideo)
- mts.Add(mt);
- bHasVideo = true;
- } else if (CodecID == "V_MPEG2") {
- BYTE* seqhdr = pTE->CodecPrivate.GetData();
- DWORD len = (DWORD)pTE->CodecPrivate.GetCount();
- int w = (int)pTE->v.PixelWidth;
- int h = (int)pTE->v.PixelHeight;
-
- if (MakeMPEG2MediaType(mt, seqhdr, len, w, h)) {
- if (!bHasVideo)
- mts.Add(mt);
- bHasVideo = true;
- }
- } else if (CodecID == "V_THEORA") {
- BYTE* thdr = pTE->CodecPrivate.GetData() + 3;
-
- mt.majortype = MEDIATYPE_Video;
- mt.subtype = FOURCCMap('OEHT');
- mt.formattype = FORMAT_MPEG2_VIDEO;
- MPEG2VIDEOINFO* vih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(sizeof(MPEG2VIDEOINFO) + pTE->CodecPrivate.GetCount());
- memset(mt.Format(), 0, mt.FormatLength());
- vih->hdr.bmiHeader.biSize = sizeof(vih->hdr.bmiHeader);
- vih->hdr.bmiHeader.biWidth = *(WORD*)&thdr[10] >> 4;
- vih->hdr.bmiHeader.biHeight = *(WORD*)&thdr[12] >> 4;
- vih->hdr.bmiHeader.biCompression = 'OEHT';
- vih->hdr.bmiHeader.biPlanes = 1;
- vih->hdr.bmiHeader.biBitCount = 24;
- int nFpsNum = (thdr[22]<<24)|(thdr[23]<<16)|(thdr[24]<<8)|thdr[25];
- int nFpsDenum = (thdr[26]<<24)|(thdr[27]<<16)|(thdr[28]<<8)|thdr[29];
- if (nFpsNum) {
- vih->hdr.AvgTimePerFrame = (REFERENCE_TIME)(10000000.0 * nFpsDenum / nFpsNum);
- }
- vih->hdr.dwPictAspectRatioX = (thdr[14]<<16)|(thdr[15]<<8)|thdr[16];
- vih->hdr.dwPictAspectRatioY = (thdr[17]<<16)|(thdr[18]<<8)|thdr[19];
- mt.bFixedSizeSamples = 0;
-
- vih->cbSequenceHeader = (DWORD)pTE->CodecPrivate.GetCount();
- memcpy (&vih->dwSequenceHeader, pTE->CodecPrivate.GetData(), vih->cbSequenceHeader);
-
- if (!bHasVideo)
- mts.Add(mt);
- bHasVideo = true;
- } else if (CodecID.Find("V_VP8") == 0) {
- mt.subtype = FOURCCMap('08PV');
- mt.formattype = FORMAT_VideoInfo;
- VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + pTE->CodecPrivate.GetCount());
- memset(mt.Format(), 0, mt.FormatLength());
- memcpy(mt.Format() + sizeof(VIDEOINFOHEADER), pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
- pvih->bmiHeader.biSize = sizeof(pvih->bmiHeader);
- pvih->bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
- pvih->bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
- pvih->bmiHeader.biCompression = mt.subtype.Data1;
- if (!bHasVideo)
- mts.Add(mt);
- bHasVideo = true;
- } else if (CodecID == "V_QUICKTIME" && pTE->CodecPrivate.GetCount() >= 8) {
- DWORD* type;
- if (m_pFile->m_ebml.DocTypeReadVersion == 1) {
- type = (DWORD*)(pTE->CodecPrivate.GetData());
- } else {
- type = (DWORD*)(pTE->CodecPrivate.GetData() + 4);
- }
- if (*type == MAKEFOURCC('S','V','Q','3') || *type == MAKEFOURCC('S','V','Q','1') || *type == MAKEFOURCC('c','v','i','d')) {
- mt.subtype = FOURCCMap(*type);
- mt.formattype = FORMAT_VideoInfo;
- VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + pTE->CodecPrivate.GetCount());
- memset(mt.Format(), 0, mt.FormatLength());
- memcpy(mt.Format() + sizeof(VIDEOINFOHEADER), pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
- pvih->bmiHeader.biSize = sizeof(pvih->bmiHeader);
- pvih->bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
- pvih->bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
- pvih->bmiHeader.biCompression = mt.subtype.Data1;
- if (!bHasVideo)
- mts.Add(mt);
- bHasVideo = true;
- }
- } else if (CodecID == "V_DSHOW/MPEG1VIDEO" || CodecID == "V_MPEG1") {
- mt.majortype = MEDIATYPE_Video;
- mt.subtype = MEDIASUBTYPE_MPEG1Payload;
- mt.formattype = FORMAT_MPEGVideo;
-
- MPEG1VIDEOINFO* pm1vi = (MPEG1VIDEOINFO*)mt.AllocFormatBuffer(sizeof(MPEG1VIDEOINFO) + pTE->CodecPrivate.GetCount());
- memset(mt.Format(), 0, mt.FormatLength());
- memcpy(mt.Format() + sizeof(MPEG1VIDEOINFO), pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
-
- pm1vi->hdr.bmiHeader.biSize = sizeof(pm1vi->hdr.bmiHeader);
- pm1vi->hdr.bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
- pm1vi->hdr.bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
- pm1vi->hdr.bmiHeader.biBitCount = 12;
- pm1vi->hdr.bmiHeader.biSizeImage = DIBSIZE(pm1vi->hdr.bmiHeader);
-
- mt.SetSampleSize(pm1vi->hdr.bmiHeader.biWidth*pm1vi->hdr.bmiHeader.biHeight*4);
- if (!bHasVideo)
- mts.Add(mt);
- bHasVideo = true;
- }
- REFERENCE_TIME AvgTimePerFrame = 0;
-
- if (pTE->v.FramePerSec > 0) {
- AvgTimePerFrame = (REFERENCE_TIME)(10000000i64 / pTE->v.FramePerSec);
- } else if (pTE->DefaultDuration > 0 && pTE->DefaultDuration != 1000000) {
- AvgTimePerFrame = (REFERENCE_TIME)pTE->DefaultDuration / 100;
- } else { // pTE->DefaultDuration == 1000000 or < 0
- CMatroskaNode Root(m_pFile);
- m_pSegment = Root.Child(0x18538067);
- m_pCluster = m_pSegment->Child(0x1F43B675);
-
- MatroskaReader::QWORD lastCueClusterPosition = (MatroskaReader::QWORD)-1;
- UINT64 timecode1 = -1;
- UINT64 timecode2 = -1;
- unsigned int framecount = 0;
- bool readmore = true;
-
- POSITION pos1 = m_pFile->m_segment.Cues.GetHeadPosition();
- while (readmore && pos1) {
- Cue* pCue = m_pFile->m_segment.Cues.GetNext(pos1);
- POSITION pos2 = pCue->CuePoints.GetHeadPosition();
- while (readmore && pos2) {
- CuePoint* pCuePoint = pCue->CuePoints.GetNext(pos2);
- POSITION pos3 = pCuePoint->CueTrackPositions.GetHeadPosition();
- while (readmore && pos3) {
- CueTrackPosition* pCueTrackPositions = pCuePoint->CueTrackPositions.GetNext(pos3);
- if (pCueTrackPositions->CueTrack != pTE->TrackNumber) {
- continue;
- }
-
- if (lastCueClusterPosition == pCueTrackPositions->CueClusterPosition) {
- continue;
- }
- lastCueClusterPosition = pCueTrackPositions->CueClusterPosition;
-
- m_pCluster->SeekTo(m_pSegment->m_start + pCueTrackPositions->CueClusterPosition);
- m_pCluster->Parse();
-
- Cluster c;
- c.ParseTimeCode(m_pCluster);
-
- if (CAutoPtr<CMatroskaNode> pBlock = m_pCluster->GetFirstBlock()) {
- do {
- CBlockGroupNode bgn;
-
- if (pBlock->m_id == 0xA0) {
- bgn.Parse(pBlock, true);
- } else if (pBlock->m_id == 0xA3) {
- CAutoPtr<BlockGroup> bg(DNew BlockGroup());
- bg->Block.Parse(pBlock, true);
- if (!(bg->Block.Lacing & 0x80)) {
- bg->ReferenceBlock.Set(0); // not a kf
- }
- bgn.AddTail(bg);
- }
-
- POSITION pos4 = bgn.GetHeadPosition();
- while (pos4) {
- BlockGroup* bg = bgn.GetNext(pos4);
- if (bg->Block.TrackNumber != pTE->TrackNumber) {
- continue;
- }
- UINT64 tc = c.TimeCode + bg->Block.TimeCode;
- if (tc == timecode2) {
- continue;
- }
-
- if (timecode1 == -1) {
- timecode1 = tc;
- } else {
- timecode2 = tc;
- ++framecount;
- }
-
- if (framecount >= 24) {
- // good for 23.976, 24, 25, 30, 50, 60 fps.
- // for 29.97 and 59,94 can give a small inaccuracy
- readmore = false;
- break;
- }
- }
- } while (readmore && pBlock->NextBlock());
- }
- }
- }
- }
- if (framecount) {
- AvgTimePerFrame = m_pFile->m_segment.SegmentInfo.TimeCodeScale*(timecode2 - timecode1) / (100*framecount);
- }
-
- m_pCluster.Free();
- }
- //if (AvgTimePerFrame < 0) AvgTimePerFrame = 0;
-
- for (size_t i = 0; i < mts.GetCount(); i++) {
- if (mts[i].formattype == FORMAT_VideoInfo
- || mts[i].formattype == FORMAT_VideoInfo2
- || mts[i].formattype == FORMAT_MPEG2Video
- || mts[i].formattype == FORMAT_MPEGVideo) {
- if (pTE->v.PixelWidth && pTE->v.PixelHeight) {
- RECT rect = {(LONG)pTE->v.VideoPixelCropLeft,
- (LONG)pTE->v.VideoPixelCropTop,
- (LONG)(pTE->v.PixelWidth - pTE->v.VideoPixelCropRight),
- (LONG)(pTE->v.PixelHeight - pTE->v.VideoPixelCropBottom)
- };
- VIDEOINFOHEADER *vih = (VIDEOINFOHEADER*)mts[i].Format();
- vih->rcSource = vih->rcTarget = rect;
- }
-
- if (AvgTimePerFrame) {
- if (mts[i].subtype == MEDIASUBTYPE_MPEG1Payload) {
- AvgTimePerFrame *= 2; // Need more testing, but work on all sample that i have :)
- }
- ((VIDEOINFOHEADER*)mts[i].Format())->AvgTimePerFrame = AvgTimePerFrame;
- }
- }
- }
-
- if (pTE->v.DisplayWidth && pTE->v.DisplayHeight) {
- for (size_t i = 0; i < mts.GetCount(); i++) {
- if (mts[i].formattype == FORMAT_VideoInfo) {
- mt = mts[i];
- DWORD vih1 = FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader);
- DWORD vih2 = FIELD_OFFSET(VIDEOINFOHEADER2, bmiHeader);
- DWORD bmi = mts[i].FormatLength() - FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader);
- mt.formattype = FORMAT_VideoInfo2;
- mt.AllocFormatBuffer(vih2 + bmi);
- memcpy(mt.Format(), mts[i].Format(), vih1);
- memset(mt.Format() + vih1, 0, vih2 - vih1);
- memcpy(mt.Format() + vih2, mts[i].Format() + vih1, bmi);
-
- CSize aspect((int)pTE->v.DisplayWidth, (int)pTE->v.DisplayHeight);
- int lnko = LNKO(aspect.cx, aspect.cy);
- if (lnko > 1) {
- aspect.cx /= lnko, aspect.cy /= lnko;
- }
- ((VIDEOINFOHEADER2*)mt.Format())->dwPictAspectRatioX = aspect.cx;
- ((VIDEOINFOHEADER2*)mt.Format())->dwPictAspectRatioY = aspect.cy;
- mts.InsertAt(i++, mt);
- } else if (mts[i].formattype == FORMAT_MPEG2Video) {
- CSize aspect((int)pTE->v.DisplayWidth, (int)pTE->v.DisplayHeight);
- int lnko = LNKO(aspect.cx, aspect.cy);
- if (lnko > 1) {
- aspect.cx /= lnko, aspect.cy /= lnko;
- }
- ((MPEG2VIDEOINFO*)mts[i].Format())->hdr.dwPictAspectRatioX = aspect.cx;
- ((MPEG2VIDEOINFO*)mts[i].Format())->hdr.dwPictAspectRatioY = aspect.cy;
- }
- }
- }
- } else if (pTE->TrackType == TrackEntry::TypeAudio) {
- Name.Format(L"Audio %d", iAudio++);
-
- mt.majortype = MEDIATYPE_Audio;
- mt.formattype = FORMAT_WaveFormatEx;
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX));
- memset(wfe, 0, mt.FormatLength());
- wfe->nChannels = (WORD)pTE->a.Channels;
- wfe->nSamplesPerSec = (DWORD)pTE->a.SamplingFrequency;
- wfe->wBitsPerSample = (WORD)pTE->a.BitDepth;
- wfe->nBlockAlign = (WORD)((wfe->nChannels * wfe->wBitsPerSample) / 8);
- wfe->nAvgBytesPerSec = wfe->nSamplesPerSec * wfe->nBlockAlign;
- mt.SetSampleSize(256000);
-
- if (CodecID == "A_MPEG/L3") {
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_MPEGLAYER3);
- mts.Add(mt);
- } else if (CodecID == "A_MPEG/L2" ||
- CodecID == "A_MPEG/L1") {
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_MPEG);
- mts.Add(mt);
- } else if (CodecID == "A_AC3" ||
- CodecID == "A_EAC3") {
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_DOLBY_AC3);
- mts.Add(mt);
- } else if (CodecID == "A_TRUEHD" ||
- CodecID == "A_MLP") {
- wfe->wFormatTag = WAVE_FORMAT_DOLBY_AC3;
- mt.subtype = MEDIASUBTYPE_DOLBY_TRUEHD;
- mts.Add(mt);
- } else if (CodecID == "A_DTS") {
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_DVD_DTS);
- mts.Add(mt);
- } else if (CodecID == "A_TTA1") {
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_TTA1);
- wfe->cbSize = 30;
- wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + 30);
- BYTE *p = (BYTE *)(wfe + 1);
- memcpy(p, (const unsigned char *)"TTA1\x01\x00", 6);
- memcpy(p + 6, &wfe->nChannels, 2);
- memcpy(p + 8, &wfe->wBitsPerSample, 2);
- memcpy(p + 10, &wfe->nSamplesPerSec, 4);
- memset(p + 14, 0, 30 - 14);
- mts.Add(mt);
- } else if (CodecID == "A_AAC") {
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_AAC);
- wfe->cbSize = (WORD)pTE->CodecPrivate.GetCount();
- wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + pTE->CodecPrivate.GetCount());
- memcpy(wfe + 1, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
- mts.Add(mt);
- } else if (CodecID == "A_WAVPACK4") {
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_WAVPACK4);
- wfe->cbSize = (WORD)pTE->CodecPrivate.GetCount();
- wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + pTE->CodecPrivate.GetCount());
- memcpy(wfe + 1, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
- mts.Add(mt);
- } else if (CodecID == "A_FLAC") {
- wfe->wFormatTag = WAVE_FORMAT_FLAC;
- wfe->cbSize = (WORD)pTE->CodecPrivate.GetCount();
- wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + pTE->CodecPrivate.GetCount());
- memcpy(wfe + 1, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
-
- mt.subtype = MEDIASUBTYPE_FLAC_FRAMED;
- mts.Add(mt);
- mt.subtype = MEDIASUBTYPE_FLAC;
- mts.Add(mt);
- } else if (CodecID == "A_PCM/INT/LIT") {
- mt.subtype = MEDIASUBTYPE_PCM;
- mt.SetSampleSize(wfe->nBlockAlign);
- if (pTE->a.Channels <= 2 && pTE->a.BitDepth <= 16) {
- wfe->wFormatTag = WAVE_FORMAT_PCM;
- } else {
- WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEXTENSIBLE));
- if (pTE->a.BitDepth&7) {
- wfex->Format.wBitsPerSample = (WORD)(pTE->a.BitDepth + 7) & 0xFFF8;
- wfex->Format.nBlockAlign = wfex->Format.nChannels * wfex->Format.wBitsPerSample / 8;
- wfex->Format.nAvgBytesPerSec = wfex->Format.nSamplesPerSec * wfex->Format.nBlockAlign;
- mt.SetSampleSize(wfex->Format.nBlockAlign);
- }
- wfex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
- wfex->Format.cbSize = 22;
- wfex->Samples.wValidBitsPerSample = (WORD)pTE->a.BitDepth;
- wfex->dwChannelMask = GetDefChannelMask(wfex->Format.nChannels);
- wfex->SubFormat = MEDIASUBTYPE_PCM;
- }
- mts.Add(mt);
- } else if (CodecID == "A_PCM/FLOAT/IEEE") {
- mt.subtype = MEDIASUBTYPE_IEEE_FLOAT;
- mt.SetSampleSize(wfe->nBlockAlign);
- if (pTE->a.Channels <= 2) {
- wfe->wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
- } else {
- WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEXTENSIBLE));
- wfex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
- wfex->Format.cbSize = 22;
- wfex->Samples.wValidBitsPerSample = (WORD)pTE->a.BitDepth;
- wfex->dwChannelMask = GetDefChannelMask(wfex->Format.nChannels);
- wfex->SubFormat = MEDIASUBTYPE_IEEE_FLOAT;
- }
- mts.Add(mt);
- } else if (CodecID == "A_MS/ACM") {
- wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(pTE->CodecPrivate.GetCount());
- memcpy(wfe, (WAVEFORMATEX*)pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
- if (wfe->wFormatTag == WAVE_FORMAT_EXTENSIBLE && wfe->cbSize == 22) {
- mt.subtype = ((WAVEFORMATEXTENSIBLE*)wfe)->SubFormat;
- }
- else mt.subtype = FOURCCMap(wfe->wFormatTag);
- mts.Add(mt);
- } else if (CodecID == "A_VORBIS") {
- BYTE* p = pTE->CodecPrivate.GetData();
- CAtlArray<int> sizes;
- int totalsize = 0;
- for (BYTE n = *p++; n > 0; n--) {
- int size = 0;
- do {
- size += *p;
- } while (*p++ == 0xff);
- sizes.Add(size);
- totalsize += size;
- }
- sizes.Add(pTE->CodecPrivate.GetCount() - (p - pTE->CodecPrivate.GetData()) - totalsize);
- totalsize += sizes[sizes.GetCount()-1];
-
- if (sizes.GetCount() == 3) {
- mt.subtype = MEDIASUBTYPE_Vorbis2;
- mt.formattype = FORMAT_VorbisFormat2;
- VORBISFORMAT2* pvf2 = (VORBISFORMAT2*)mt.AllocFormatBuffer(sizeof(VORBISFORMAT2) + totalsize);
- memset(pvf2, 0, mt.FormatLength());
- pvf2->Channels = (WORD)pTE->a.Channels;
- pvf2->SamplesPerSec = (DWORD)pTE->a.SamplingFrequency;
- pvf2->BitsPerSample = (DWORD)pTE->a.BitDepth;
- BYTE* p2 = mt.Format() + sizeof(VORBISFORMAT2);
- for (size_t i = 0; i < sizes.GetCount(); p += sizes[i], p2 += sizes[i], i++) {
- memcpy(p2, p, pvf2->HeaderSize[i] = sizes[i]);
- }
-
- mts.Add(mt);
- }
-
- mt.subtype = MEDIASUBTYPE_Vorbis;
- mt.formattype = FORMAT_VorbisFormat;
- VORBISFORMAT* vf = (VORBISFORMAT*)mt.AllocFormatBuffer(sizeof(VORBISFORMAT));
- memset(vf, 0, mt.FormatLength());
- vf->nChannels = (WORD)pTE->a.Channels;
- vf->nSamplesPerSec = (DWORD)pTE->a.SamplingFrequency;
- vf->nMinBitsPerSec = vf->nMaxBitsPerSec = vf->nAvgBitsPerSec = (DWORD)-1;
- mts.Add(mt);
- } else if (CodecID.Find("A_AAC/") == 0) {
- mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_AAC);
- wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + 5);
- wfe->cbSize = 2;
-
- int profile;
-
- if (CodecID.Find("/MAIN") > 0) {
- profile = 0;
- } else if (CodecID.Find("/SBR") > 0) {
- profile = -1;
- } else if (CodecID.Find("/LC") > 0) {
- profile = 1;
- } else if (CodecID.Find("/SSR") > 0) {
- profile = 2;
- } else if (CodecID.Find("/LTP") > 0) {
- profile = 3;
- } else {
- continue;
- }
-
- WORD cbSize = MakeAACInitData((BYTE*)(wfe + 1), profile, wfe->nSamplesPerSec, (int)pTE->a.Channels);
-
- mts.Add(mt);
-
- if (profile < 0) {
- wfe->cbSize = cbSize;
- wfe->nSamplesPerSec *= 2;
- wfe->nAvgBytesPerSec *= 2;
-
- mts.InsertAt(0, mt);
- }
- } else if (CodecID.Find("A_REAL/") == 0 && CodecID.GetLength() >= 11) {
- mt.subtype = FOURCCMap((DWORD)CodecID[7]|((DWORD)CodecID[8]<<8)|((DWORD)CodecID[9]<<16)|((DWORD)CodecID[10]<<24));
- mt.bTemporalCompression = TRUE;
- wfe->cbSize = (WORD)pTE->CodecPrivate.GetCount();
- wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + pTE->CodecPrivate.GetCount());
- memcpy(wfe + 1, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
- wfe->cbSize = 0; // IMPORTANT: this is screwed, but cbSize has to be 0 and the extra data from codec priv must be after WAVEFORMATEX
- mts.Add(mt);
- } else if (CodecID == "A_QUICKTIME" && pTE->CodecPrivate.GetCount() >= 8) {
- DWORD* type = (DWORD*)(pTE->CodecPrivate.GetData() + 4);
- if (*type == MAKEFOURCC('Q','D','M','2') || *type == MAKEFOURCC('Q','D','M','C')) {
- mt.subtype = FOURCCMap(*type);
- wfe->cbSize = (WORD)pTE->CodecPrivate.GetCount();
- wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + pTE->CodecPrivate.GetCount());
- memcpy(wfe + 1, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
- mts.Add(mt);
- }
- }
- } else if (pTE->TrackType == TrackEntry::TypeSubtitle) {
- if (iSubtitle == 1) {
- InstallFonts();
- }
-
- Name.Format(L"Subtitle %d", iSubtitle++);
-
- mt.SetSampleSize(1);
-
- if (CodecID == "S_TEXT/ASCII") {
- mt.majortype = MEDIATYPE_Text;
- mt.subtype = MEDIASUBTYPE_NULL;
- mt.formattype = FORMAT_None;
- mts.Add(mt);
- isSub = true;
- } else {
- mt.majortype = MEDIATYPE_Subtitle;
- mt.formattype = FORMAT_SubtitleInfo;
- SUBTITLEINFO* psi = (SUBTITLEINFO*)mt.AllocFormatBuffer(sizeof(SUBTITLEINFO) + pTE->CodecPrivate.GetCount());
- memset(psi, 0, mt.FormatLength());
- strncpy_s(psi->IsoLang, pTE->Language, _countof(psi->IsoLang)-1);
- CString subtitle_Name = pTE->Name;
- if (pTE->FlagForced) { // "Forced" overrides "Default"
- subtitle_Name += L" [Forced]";
- } else if (pTE->FlagDefault) {
- subtitle_Name += L" [Default]";
- }
- subtitle_Name = subtitle_Name.Trim();
-
- wcsncpy_s(psi->TrackName, subtitle_Name, _countof(psi->TrackName)-1);
- memcpy(mt.pbFormat + (psi->dwOffset = sizeof(SUBTITLEINFO)), pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
-
- mt.subtype =
- CodecID == "S_TEXT/UTF8" ? MEDIASUBTYPE_UTF8 :
- CodecID == "S_TEXT/SSA" || CodecID == "S_SSA" ? MEDIASUBTYPE_SSA :
- CodecID == "S_TEXT/ASS" || CodecID == "S_ASS" ? MEDIASUBTYPE_ASS :
- CodecID == "S_TEXT/USF" || CodecID == "S_USF" ? MEDIASUBTYPE_USF :
- CodecID == "S_HDMV/PGS" ? MEDIASUBTYPE_HDMVSUB :
- //CodecID == "S_DVBSUB" ? MEDIASUBTYPE_DVB_SUBTITLES : // does not work
- CodecID == "S_VOBSUB" ? MEDIASUBTYPE_VOBSUB :
- MEDIASUBTYPE_NULL;
-
- if (mt.subtype != MEDIASUBTYPE_NULL) {
- mts.Add(mt);
- isSub = true;
- }
- }
- }
-
- if (mts.IsEmpty()) {
- TRACE(_T("CMatroskaSourceFilter: Unsupported TrackType %s (%I64d)\n"), CString(CodecID), (UINT64)pTE->TrackType);
- continue;
- }
-
- Name = CStringW(pTE->Language.IsEmpty() ? L"English" : CStringW(ISO6392ToLanguage(pTE->Language)))
- + (pTE->Name.IsEmpty() ? L"" : L", " + pTE->Name)
- + (L" (" + Name + L")");
-
- if (pTE->FlagForced) { // "Forced" overrides "Default"
- Name = Name + L" [Forced]";
- } else if (pTE->FlagDefault) {
- Name = Name + L" [Default]";
- }
-
- HRESULT hr;
-
- CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CMatroskaSplitterOutputPin(pTE->MinCache, pTE->DefaultDuration / 100, mts, Name, this, this, &hr));
- if (!pTE->Name.IsEmpty()) {
- pPinOut->SetProperty(L"NAME", pTE->Name);
- }
- if (pTE->Language.GetLength() == 3) {
- pPinOut->SetProperty(L"LANG", CStringW(CString(pTE->Language)));
- }
-
- if (!isSub) {
- pinOut.InsertAt((iVideo + iAudio - 3), DNew CMatroskaSplitterOutputPin(pTE->MinCache, pTE->DefaultDuration / 100, mts, Name, this, this, &hr), 1);
- pinOutTE.InsertAt((iVideo + iAudio - 3), pTE, 1);
- } else {
- pinOut.Add(DNew CMatroskaSplitterOutputPin(pTE->MinCache, pTE->DefaultDuration / 100, mts, Name, this, this, &hr));
- pinOutTE.Add(pTE);
- }
-
- }
- }
-
- for (size_t i = 0; i < pinOut.GetCount(); i++) {
-
- CAutoPtr<CBaseSplitterOutputPin> pPinOut;
- pPinOut.Attach(pinOut[i]);
- TrackEntry* pTE = pinOutTE[i];
-
- if (pTE != NULL) {
- AddOutputPin((DWORD)pTE->TrackNumber, pPinOut);
- m_pTrackEntryMap[(DWORD)pTE->TrackNumber] = pTE;
- m_pOrderedTrackArray.Add(pTE);
- }
- }
-
-
- Info& info = m_pFile->m_segment.SegmentInfo;
-
- if (m_pFile->IsRandomAccess()) {
- m_rtDuration = (REFERENCE_TIME)(info.Duration * info.TimeCodeScale / 100);
- }
-
- m_rtNewStop = m_rtStop = m_rtDuration;
-
-/*#ifdef _DEBUG
- for (int i = 1, j = GetChapterCount(CHAPTER_ROOT_ID); i <= j; i++)
- {
- UINT id = GetChapterId(CHAPTER_ROOT_ID, i);
- struct ChapterElement ce;
- BOOL b = GetChapterInfo(id, &ce);
- BSTR bstr = GetChapterStringInfo(id, "eng", "");
- if (bstr) ::SysFreeString(bstr);
- }
-#endif*/
-
- SetProperty(L"TITL", info.Title);
- // TODO
-
- // resources
-
- {
- POSITION pos = m_pFile->m_segment.Attachments.GetHeadPosition();
- while (pos) {
- Attachment* pA = m_pFile->m_segment.Attachments.GetNext(pos);
-
- POSITION pos = pA->AttachedFiles.GetHeadPosition();
- while (pos) {
- AttachedFile* pF = pA->AttachedFiles.GetNext(pos);
-
- CAtlArray<BYTE> pData;
- pData.SetCount((size_t)pF->FileDataLen);
- m_pFile->Seek(pF->FileDataPos);
- if (SUCCEEDED(m_pFile->ByteRead(pData.GetData(), pData.GetCount()))) {
- ResAppend(pF->FileName, pF->FileDescription, CStringW(pF->FileMimeType), pData.GetData(), (DWORD)pData.GetCount());
- }
- }
- }
- }
-
- // chapters
-
- if (ChapterAtom* caroot = m_pFile->m_segment.FindChapterAtom(0)) {
- CStringA str;
- str.ReleaseBufferSetLength(GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, str.GetBuffer(3), 3));
- CStringA ChapLanguage = CStringA(ISO6391To6392(str));
- if (ChapLanguage.GetLength() < 3) {
- ChapLanguage = "eng";
- }
-
- SetupChapters(ChapLanguage, caroot);
- }
-
- return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
+ CAtlArray<BYTE> data;
+ data.SetCount(sh.size());
+ std::copy(sh.begin(), sh.end(), data.GetData());
+
+ mt.subtype = FOURCCMap('1CVA');
+ mt.formattype = FORMAT_MPEG2Video;
+ MPEG2VIDEOINFO* pm2vi = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + data.GetCount());
+ memset(mt.Format(), 0, mt.FormatLength());
+ pm2vi->hdr.bmiHeader.biSize = sizeof(pm2vi->hdr.bmiHeader);
+ pm2vi->hdr.bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
+ pm2vi->hdr.bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
+ pm2vi->hdr.bmiHeader.biCompression = '1CVA';
+ pm2vi->hdr.bmiHeader.biPlanes = 1;
+ pm2vi->hdr.bmiHeader.biBitCount = 24;
+ pm2vi->dwProfile = pTE->CodecPrivate[1];
+ pm2vi->dwLevel = pTE->CodecPrivate[3];
+ pm2vi->dwFlags = (pTE->CodecPrivate[4] & 3) + 1;
+ BYTE* pSequenceHeader = (BYTE*)pm2vi->dwSequenceHeader;
+ memcpy(pSequenceHeader, data.GetData(), data.GetCount());
+ pm2vi->cbSequenceHeader = (DWORD)data.GetCount();
+ if (!bHasVideo) {
+ mts.Add(mt);
+ }
+ bHasVideo = true;
+ } else if (CodecID.Find("V_MPEG4/") == 0) {
+ mt.subtype = FOURCCMap('V4PM');
+ mt.formattype = FORMAT_MPEG2Video;
+ MPEG2VIDEOINFO* pm2vi = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) + pTE->CodecPrivate.GetCount());
+ memset(mt.Format(), 0, mt.FormatLength());
+ pm2vi->hdr.bmiHeader.biSize = sizeof(pm2vi->hdr.bmiHeader);
+ pm2vi->hdr.bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
+ pm2vi->hdr.bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
+ pm2vi->hdr.bmiHeader.biCompression = 'V4PM';
+ pm2vi->hdr.bmiHeader.biPlanes = 1;
+ pm2vi->hdr.bmiHeader.biBitCount = 24;
+ BYTE* pSequenceHeader = (BYTE*)pm2vi->dwSequenceHeader;
+ memcpy(pSequenceHeader, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+ pm2vi->cbSequenceHeader = (DWORD)pTE->CodecPrivate.GetCount();
+ if (!bHasVideo) {
+ mts.Add(mt);
+ }
+ bHasVideo = true;
+ } else if (CodecID.Find("V_REAL/RV") == 0) {
+ mt.subtype = FOURCCMap('00VR' + ((CodecID[9] - 0x30) << 16));
+ mt.formattype = FORMAT_VideoInfo;
+ VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + pTE->CodecPrivate.GetCount());
+ memset(mt.Format(), 0, mt.FormatLength());
+ memcpy(mt.Format() + sizeof(VIDEOINFOHEADER), pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+ pvih->bmiHeader.biSize = sizeof(pvih->bmiHeader);
+ pvih->bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
+ pvih->bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
+ pvih->bmiHeader.biCompression = mt.subtype.Data1;
+ if (!bHasVideo) {
+ mts.Add(mt);
+ }
+ bHasVideo = true;
+ } else if (CodecID == "V_DIRAC") {
+ mt.subtype = MEDIASUBTYPE_DiracVideo;
+ mt.formattype = FORMAT_DiracVideoInfo;
+ DIRACINFOHEADER* dvih = (DIRACINFOHEADER*)mt.AllocFormatBuffer(FIELD_OFFSET(DIRACINFOHEADER, dwSequenceHeader) + pTE->CodecPrivate.GetCount());
+ memset(mt.Format(), 0, mt.FormatLength());
+ dvih->hdr.bmiHeader.biSize = sizeof(dvih->hdr.bmiHeader);
+ dvih->hdr.bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
+ dvih->hdr.bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
+ dvih->hdr.dwPictAspectRatioX = dvih->hdr.bmiHeader.biWidth;
+ dvih->hdr.dwPictAspectRatioY = dvih->hdr.bmiHeader.biHeight;
+
+ BYTE* pSequenceHeader = (BYTE*)dvih->dwSequenceHeader;
+ memcpy(pSequenceHeader, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+ dvih->cbSequenceHeader = (DWORD)pTE->CodecPrivate.GetCount();
+
+ if (!bHasVideo) {
+ mts.Add(mt);
+ }
+ bHasVideo = true;
+ } else if (CodecID == "V_MPEG2") {
+ BYTE* seqhdr = pTE->CodecPrivate.GetData();
+ DWORD len = (DWORD)pTE->CodecPrivate.GetCount();
+ int w = (int)pTE->v.PixelWidth;
+ int h = (int)pTE->v.PixelHeight;
+
+ if (MakeMPEG2MediaType(mt, seqhdr, len, w, h)) {
+ if (!bHasVideo) {
+ mts.Add(mt);
+ }
+ bHasVideo = true;
+ }
+ } else if (CodecID == "V_THEORA") {
+ BYTE* thdr = pTE->CodecPrivate.GetData() + 3;
+
+ mt.majortype = MEDIATYPE_Video;
+ mt.subtype = FOURCCMap('OEHT');
+ mt.formattype = FORMAT_MPEG2_VIDEO;
+ MPEG2VIDEOINFO* vih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(sizeof(MPEG2VIDEOINFO) + pTE->CodecPrivate.GetCount());
+ memset(mt.Format(), 0, mt.FormatLength());
+ vih->hdr.bmiHeader.biSize = sizeof(vih->hdr.bmiHeader);
+ vih->hdr.bmiHeader.biWidth = *(WORD*)&thdr[10] >> 4;
+ vih->hdr.bmiHeader.biHeight = *(WORD*)&thdr[12] >> 4;
+ vih->hdr.bmiHeader.biCompression = 'OEHT';
+ vih->hdr.bmiHeader.biPlanes = 1;
+ vih->hdr.bmiHeader.biBitCount = 24;
+ int nFpsNum = (thdr[22] << 24) | (thdr[23] << 16) | (thdr[24] << 8) | thdr[25];
+ int nFpsDenum = (thdr[26] << 24) | (thdr[27] << 16) | (thdr[28] << 8) | thdr[29];
+ if (nFpsNum) {
+ vih->hdr.AvgTimePerFrame = (REFERENCE_TIME)(10000000.0 * nFpsDenum / nFpsNum);
+ }
+ vih->hdr.dwPictAspectRatioX = (thdr[14] << 16) | (thdr[15] << 8) | thdr[16];
+ vih->hdr.dwPictAspectRatioY = (thdr[17] << 16) | (thdr[18] << 8) | thdr[19];
+ mt.bFixedSizeSamples = 0;
+
+ vih->cbSequenceHeader = (DWORD)pTE->CodecPrivate.GetCount();
+ memcpy(&vih->dwSequenceHeader, pTE->CodecPrivate.GetData(), vih->cbSequenceHeader);
+
+ if (!bHasVideo) {
+ mts.Add(mt);
+ }
+ bHasVideo = true;
+ } else if (CodecID.Find("V_VP8") == 0) {
+ mt.subtype = FOURCCMap('08PV');
+ mt.formattype = FORMAT_VideoInfo;
+ VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + pTE->CodecPrivate.GetCount());
+ memset(mt.Format(), 0, mt.FormatLength());
+ memcpy(mt.Format() + sizeof(VIDEOINFOHEADER), pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+ pvih->bmiHeader.biSize = sizeof(pvih->bmiHeader);
+ pvih->bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
+ pvih->bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
+ pvih->bmiHeader.biCompression = mt.subtype.Data1;
+ if (!bHasVideo) {
+ mts.Add(mt);
+ }
+ bHasVideo = true;
+ } else if (CodecID == "V_QUICKTIME" && pTE->CodecPrivate.GetCount() >= 8) {
+ DWORD* type;
+ if (m_pFile->m_ebml.DocTypeReadVersion == 1) {
+ type = (DWORD*)(pTE->CodecPrivate.GetData());
+ } else {
+ type = (DWORD*)(pTE->CodecPrivate.GetData() + 4);
+ }
+ if (*type == MAKEFOURCC('S', 'V', 'Q', '3') || *type == MAKEFOURCC('S', 'V', 'Q', '1') || *type == MAKEFOURCC('c', 'v', 'i', 'd')) {
+ mt.subtype = FOURCCMap(*type);
+ mt.formattype = FORMAT_VideoInfo;
+ VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + pTE->CodecPrivate.GetCount());
+ memset(mt.Format(), 0, mt.FormatLength());
+ memcpy(mt.Format() + sizeof(VIDEOINFOHEADER), pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+ pvih->bmiHeader.biSize = sizeof(pvih->bmiHeader);
+ pvih->bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
+ pvih->bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
+ pvih->bmiHeader.biCompression = mt.subtype.Data1;
+ if (!bHasVideo) {
+ mts.Add(mt);
+ }
+ bHasVideo = true;
+ }
+ } else if (CodecID == "V_DSHOW/MPEG1VIDEO" || CodecID == "V_MPEG1") {
+ mt.majortype = MEDIATYPE_Video;
+ mt.subtype = MEDIASUBTYPE_MPEG1Payload;
+ mt.formattype = FORMAT_MPEGVideo;
+
+ MPEG1VIDEOINFO* pm1vi = (MPEG1VIDEOINFO*)mt.AllocFormatBuffer(sizeof(MPEG1VIDEOINFO) + pTE->CodecPrivate.GetCount());
+ memset(mt.Format(), 0, mt.FormatLength());
+ memcpy(mt.Format() + sizeof(MPEG1VIDEOINFO), pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+
+ pm1vi->hdr.bmiHeader.biSize = sizeof(pm1vi->hdr.bmiHeader);
+ pm1vi->hdr.bmiHeader.biWidth = (LONG)pTE->v.PixelWidth;
+ pm1vi->hdr.bmiHeader.biHeight = (LONG)pTE->v.PixelHeight;
+ pm1vi->hdr.bmiHeader.biBitCount = 12;
+ pm1vi->hdr.bmiHeader.biSizeImage = DIBSIZE(pm1vi->hdr.bmiHeader);
+
+ mt.SetSampleSize(pm1vi->hdr.bmiHeader.biWidth * pm1vi->hdr.bmiHeader.biHeight * 4);
+ if (!bHasVideo) {
+ mts.Add(mt);
+ }
+ bHasVideo = true;
+ }
+ REFERENCE_TIME AvgTimePerFrame = 0;
+
+ if (pTE->v.FramePerSec > 0) {
+ AvgTimePerFrame = (REFERENCE_TIME)(10000000i64 / pTE->v.FramePerSec);
+ } else if (pTE->DefaultDuration > 0 && pTE->DefaultDuration != 1000000) {
+ AvgTimePerFrame = (REFERENCE_TIME)pTE->DefaultDuration / 100;
+ } else { // pTE->DefaultDuration == 1000000 or < 0
+ CMatroskaNode Root(m_pFile);
+ m_pSegment = Root.Child(0x18538067);
+ m_pCluster = m_pSegment->Child(0x1F43B675);
+
+ MatroskaReader::QWORD lastCueClusterPosition = (MatroskaReader::QWORD) - 1;
+ UINT64 timecode1 = -1;
+ UINT64 timecode2 = -1;
+ unsigned int framecount = 0;
+ bool readmore = true;
+
+ POSITION pos1 = m_pFile->m_segment.Cues.GetHeadPosition();
+ while (readmore && pos1) {
+ Cue* pCue = m_pFile->m_segment.Cues.GetNext(pos1);
+ POSITION pos2 = pCue->CuePoints.GetHeadPosition();
+ while (readmore && pos2) {
+ CuePoint* pCuePoint = pCue->CuePoints.GetNext(pos2);
+ POSITION pos3 = pCuePoint->CueTrackPositions.GetHeadPosition();
+ while (readmore && pos3) {
+ CueTrackPosition* pCueTrackPositions = pCuePoint->CueTrackPositions.GetNext(pos3);
+ if (pCueTrackPositions->CueTrack != pTE->TrackNumber) {
+ continue;
+ }
+
+ if (lastCueClusterPosition == pCueTrackPositions->CueClusterPosition) {
+ continue;
+ }
+ lastCueClusterPosition = pCueTrackPositions->CueClusterPosition;
+
+ m_pCluster->SeekTo(m_pSegment->m_start + pCueTrackPositions->CueClusterPosition);
+ m_pCluster->Parse();
+
+ Cluster c;
+ c.ParseTimeCode(m_pCluster);
+
+ if (CAutoPtr<CMatroskaNode> pBlock = m_pCluster->GetFirstBlock()) {
+ do {
+ CBlockGroupNode bgn;
+
+ if (pBlock->m_id == 0xA0) {
+ bgn.Parse(pBlock, true);
+ } else if (pBlock->m_id == 0xA3) {
+ CAutoPtr<BlockGroup> bg(DNew BlockGroup());
+ bg->Block.Parse(pBlock, true);
+ if (!(bg->Block.Lacing & 0x80)) {
+ bg->ReferenceBlock.Set(0); // not a kf
+ }
+ bgn.AddTail(bg);
+ }
+
+ POSITION pos4 = bgn.GetHeadPosition();
+ while (pos4) {
+ BlockGroup* bg = bgn.GetNext(pos4);
+ if (bg->Block.TrackNumber != pTE->TrackNumber) {
+ continue;
+ }
+ UINT64 tc = c.TimeCode + bg->Block.TimeCode;
+ if (tc == timecode2) {
+ continue;
+ }
+
+ if (timecode1 == -1) {
+ timecode1 = tc;
+ } else {
+ timecode2 = tc;
+ ++framecount;
+ }
+
+ if (framecount >= 24) {
+ // good for 23.976, 24, 25, 30, 50, 60 fps.
+ // for 29.97 and 59,94 can give a small inaccuracy
+ readmore = false;
+ break;
+ }
+ }
+ } while (readmore && pBlock->NextBlock());
+ }
+ }
+ }
+ }
+ if (framecount) {
+ AvgTimePerFrame = m_pFile->m_segment.SegmentInfo.TimeCodeScale * (timecode2 - timecode1) / (100 * framecount);
+ }
+
+ m_pCluster.Free();
+ }
+ //if (AvgTimePerFrame < 0) AvgTimePerFrame = 0;
+
+ for (size_t i = 0; i < mts.GetCount(); i++) {
+ if (mts[i].formattype == FORMAT_VideoInfo
+ || mts[i].formattype == FORMAT_VideoInfo2
+ || mts[i].formattype == FORMAT_MPEG2Video
+ || mts[i].formattype == FORMAT_MPEGVideo) {
+ if (pTE->v.PixelWidth && pTE->v.PixelHeight) {
+ RECT rect = {(LONG)pTE->v.VideoPixelCropLeft,
+ (LONG)pTE->v.VideoPixelCropTop,
+ (LONG)(pTE->v.PixelWidth - pTE->v.VideoPixelCropRight),
+ (LONG)(pTE->v.PixelHeight - pTE->v.VideoPixelCropBottom)
+ };
+ VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)mts[i].Format();
+ vih->rcSource = vih->rcTarget = rect;
+ }
+
+ if (AvgTimePerFrame) {
+ if (mts[i].subtype == MEDIASUBTYPE_MPEG1Payload) {
+ AvgTimePerFrame *= 2; // Need more testing, but work on all sample that i have :)
+ }
+ ((VIDEOINFOHEADER*)mts[i].Format())->AvgTimePerFrame = AvgTimePerFrame;
+ }
+ }
+ }
+
+ if (pTE->v.DisplayWidth && pTE->v.DisplayHeight) {
+ for (size_t i = 0; i < mts.GetCount(); i++) {
+ if (mts[i].formattype == FORMAT_VideoInfo) {
+ mt = mts[i];
+ DWORD vih1 = FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader);
+ DWORD vih2 = FIELD_OFFSET(VIDEOINFOHEADER2, bmiHeader);
+ DWORD bmi = mts[i].FormatLength() - FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader);
+ mt.formattype = FORMAT_VideoInfo2;
+ mt.AllocFormatBuffer(vih2 + bmi);
+ memcpy(mt.Format(), mts[i].Format(), vih1);
+ memset(mt.Format() + vih1, 0, vih2 - vih1);
+ memcpy(mt.Format() + vih2, mts[i].Format() + vih1, bmi);
+
+ CSize aspect((int)pTE->v.DisplayWidth, (int)pTE->v.DisplayHeight);
+ int lnko = LNKO(aspect.cx, aspect.cy);
+ if (lnko > 1) {
+ aspect.cx /= lnko, aspect.cy /= lnko;
+ }
+ ((VIDEOINFOHEADER2*)mt.Format())->dwPictAspectRatioX = aspect.cx;
+ ((VIDEOINFOHEADER2*)mt.Format())->dwPictAspectRatioY = aspect.cy;
+ mts.InsertAt(i++, mt);
+ } else if (mts[i].formattype == FORMAT_MPEG2Video) {
+ CSize aspect((int)pTE->v.DisplayWidth, (int)pTE->v.DisplayHeight);
+ int lnko = LNKO(aspect.cx, aspect.cy);
+ if (lnko > 1) {
+ aspect.cx /= lnko, aspect.cy /= lnko;
+ }
+ ((MPEG2VIDEOINFO*)mts[i].Format())->hdr.dwPictAspectRatioX = aspect.cx;
+ ((MPEG2VIDEOINFO*)mts[i].Format())->hdr.dwPictAspectRatioY = aspect.cy;
+ }
+ }
+ }
+ } else if (pTE->TrackType == TrackEntry::TypeAudio) {
+ Name.Format(L"Audio %d", iAudio++);
+
+ mt.majortype = MEDIATYPE_Audio;
+ mt.formattype = FORMAT_WaveFormatEx;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX));
+ memset(wfe, 0, mt.FormatLength());
+ wfe->nChannels = (WORD)pTE->a.Channels;
+ wfe->nSamplesPerSec = (DWORD)pTE->a.SamplingFrequency;
+ wfe->wBitsPerSample = (WORD)pTE->a.BitDepth;
+ wfe->nBlockAlign = (WORD)((wfe->nChannels * wfe->wBitsPerSample) / 8);
+ wfe->nAvgBytesPerSec = wfe->nSamplesPerSec * wfe->nBlockAlign;
+ mt.SetSampleSize(256000);
+
+ if (CodecID == "A_MPEG/L3") {
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_MPEGLAYER3);
+ mts.Add(mt);
+ } else if (CodecID == "A_MPEG/L2" ||
+ CodecID == "A_MPEG/L1") {
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_MPEG);
+ mts.Add(mt);
+ } else if (CodecID == "A_AC3" ||
+ CodecID == "A_EAC3") {
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_DOLBY_AC3);
+ mts.Add(mt);
+ } else if (CodecID == "A_TRUEHD" ||
+ CodecID == "A_MLP") {
+ wfe->wFormatTag = WAVE_FORMAT_DOLBY_AC3;
+ mt.subtype = MEDIASUBTYPE_DOLBY_TRUEHD;
+ mts.Add(mt);
+ } else if (CodecID == "A_DTS") {
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_DVD_DTS);
+ mts.Add(mt);
+ } else if (CodecID == "A_TTA1") {
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_TTA1);
+ wfe->cbSize = 30;
+ wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + 30);
+ BYTE* p = (BYTE*)(wfe + 1);
+ memcpy(p, (const unsigned char*)"TTA1\x01\x00", 6);
+ memcpy(p + 6, &wfe->nChannels, 2);
+ memcpy(p + 8, &wfe->wBitsPerSample, 2);
+ memcpy(p + 10, &wfe->nSamplesPerSec, 4);
+ memset(p + 14, 0, 30 - 14);
+ mts.Add(mt);
+ } else if (CodecID == "A_AAC") {
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_AAC);
+ wfe->cbSize = (WORD)pTE->CodecPrivate.GetCount();
+ wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + pTE->CodecPrivate.GetCount());
+ memcpy(wfe + 1, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+ mts.Add(mt);
+ } else if (CodecID == "A_WAVPACK4") {
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_WAVPACK4);
+ wfe->cbSize = (WORD)pTE->CodecPrivate.GetCount();
+ wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + pTE->CodecPrivate.GetCount());
+ memcpy(wfe + 1, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+ mts.Add(mt);
+ } else if (CodecID == "A_FLAC") {
+ wfe->wFormatTag = WAVE_FORMAT_FLAC;
+ wfe->cbSize = (WORD)pTE->CodecPrivate.GetCount();
+ wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + pTE->CodecPrivate.GetCount());
+ memcpy(wfe + 1, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+
+ mt.subtype = MEDIASUBTYPE_FLAC_FRAMED;
+ mts.Add(mt);
+ mt.subtype = MEDIASUBTYPE_FLAC;
+ mts.Add(mt);
+ } else if (CodecID == "A_PCM/INT/LIT") {
+ mt.subtype = MEDIASUBTYPE_PCM;
+ mt.SetSampleSize(wfe->nBlockAlign);
+ if (pTE->a.Channels <= 2 && pTE->a.BitDepth <= 16) {
+ wfe->wFormatTag = WAVE_FORMAT_PCM;
+ } else {
+ WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEXTENSIBLE));
+ if (pTE->a.BitDepth & 7) {
+ wfex->Format.wBitsPerSample = (WORD)(pTE->a.BitDepth + 7) & 0xFFF8;
+ wfex->Format.nBlockAlign = wfex->Format.nChannels * wfex->Format.wBitsPerSample / 8;
+ wfex->Format.nAvgBytesPerSec = wfex->Format.nSamplesPerSec * wfex->Format.nBlockAlign;
+ mt.SetSampleSize(wfex->Format.nBlockAlign);
+ }
+ wfex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+ wfex->Format.cbSize = 22;
+ wfex->Samples.wValidBitsPerSample = (WORD)pTE->a.BitDepth;
+ wfex->dwChannelMask = GetDefChannelMask(wfex->Format.nChannels);
+ wfex->SubFormat = MEDIASUBTYPE_PCM;
+ }
+ mts.Add(mt);
+ } else if (CodecID == "A_PCM/FLOAT/IEEE") {
+ mt.subtype = MEDIASUBTYPE_IEEE_FLOAT;
+ mt.SetSampleSize(wfe->nBlockAlign);
+ if (pTE->a.Channels <= 2) {
+ wfe->wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
+ } else {
+ WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEXTENSIBLE));
+ wfex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+ wfex->Format.cbSize = 22;
+ wfex->Samples.wValidBitsPerSample = (WORD)pTE->a.BitDepth;
+ wfex->dwChannelMask = GetDefChannelMask(wfex->Format.nChannels);
+ wfex->SubFormat = MEDIASUBTYPE_IEEE_FLOAT;
+ }
+ mts.Add(mt);
+ } else if (CodecID == "A_MS/ACM") {
+ wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(pTE->CodecPrivate.GetCount());
+ memcpy(wfe, (WAVEFORMATEX*)pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+ if (wfe->wFormatTag == WAVE_FORMAT_EXTENSIBLE && wfe->cbSize == 22) {
+ mt.subtype = ((WAVEFORMATEXTENSIBLE*)wfe)->SubFormat;
+ } else { mt.subtype = FOURCCMap(wfe->wFormatTag); }
+ mts.Add(mt);
+ } else if (CodecID == "A_VORBIS") {
+ BYTE* p = pTE->CodecPrivate.GetData();
+ CAtlArray<int> sizes;
+ int totalsize = 0;
+ for (BYTE n = *p++; n > 0; n--) {
+ int size = 0;
+ do {
+ size += *p;
+ } while (*p++ == 0xff);
+ sizes.Add(size);
+ totalsize += size;
+ }
+ sizes.Add(pTE->CodecPrivate.GetCount() - (p - pTE->CodecPrivate.GetData()) - totalsize);
+ totalsize += sizes[sizes.GetCount() - 1];
+
+ if (sizes.GetCount() == 3) {
+ mt.subtype = MEDIASUBTYPE_Vorbis2;
+ mt.formattype = FORMAT_VorbisFormat2;
+ VORBISFORMAT2* pvf2 = (VORBISFORMAT2*)mt.AllocFormatBuffer(sizeof(VORBISFORMAT2) + totalsize);
+ memset(pvf2, 0, mt.FormatLength());
+ pvf2->Channels = (WORD)pTE->a.Channels;
+ pvf2->SamplesPerSec = (DWORD)pTE->a.SamplingFrequency;
+ pvf2->BitsPerSample = (DWORD)pTE->a.BitDepth;
+ BYTE* p2 = mt.Format() + sizeof(VORBISFORMAT2);
+ for (size_t i = 0; i < sizes.GetCount(); p += sizes[i], p2 += sizes[i], i++) {
+ memcpy(p2, p, pvf2->HeaderSize[i] = sizes[i]);
+ }
+
+ mts.Add(mt);
+ }
+
+ mt.subtype = MEDIASUBTYPE_Vorbis;
+ mt.formattype = FORMAT_VorbisFormat;
+ VORBISFORMAT* vf = (VORBISFORMAT*)mt.AllocFormatBuffer(sizeof(VORBISFORMAT));
+ memset(vf, 0, mt.FormatLength());
+ vf->nChannels = (WORD)pTE->a.Channels;
+ vf->nSamplesPerSec = (DWORD)pTE->a.SamplingFrequency;
+ vf->nMinBitsPerSec = vf->nMaxBitsPerSec = vf->nAvgBitsPerSec = (DWORD) - 1;
+ mts.Add(mt);
+ } else if (CodecID.Find("A_AAC/") == 0) {
+ mt.subtype = FOURCCMap(wfe->wFormatTag = WAVE_FORMAT_AAC);
+ wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + 5);
+ wfe->cbSize = 2;
+
+ int profile;
+
+ if (CodecID.Find("/MAIN") > 0) {
+ profile = 0;
+ } else if (CodecID.Find("/SBR") > 0) {
+ profile = -1;
+ } else if (CodecID.Find("/LC") > 0) {
+ profile = 1;
+ } else if (CodecID.Find("/SSR") > 0) {
+ profile = 2;
+ } else if (CodecID.Find("/LTP") > 0) {
+ profile = 3;
+ } else {
+ continue;
+ }
+
+ WORD cbSize = MakeAACInitData((BYTE*)(wfe + 1), profile, wfe->nSamplesPerSec, (int)pTE->a.Channels);
+
+ mts.Add(mt);
+
+ if (profile < 0) {
+ wfe->cbSize = cbSize;
+ wfe->nSamplesPerSec *= 2;
+ wfe->nAvgBytesPerSec *= 2;
+
+ mts.InsertAt(0, mt);
+ }
+ } else if (CodecID.Find("A_REAL/") == 0 && CodecID.GetLength() >= 11) {
+ mt.subtype = FOURCCMap((DWORD)CodecID[7] | ((DWORD)CodecID[8] << 8) | ((DWORD)CodecID[9] << 16) | ((DWORD)CodecID[10] << 24));
+ mt.bTemporalCompression = TRUE;
+ wfe->cbSize = (WORD)pTE->CodecPrivate.GetCount();
+ wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + pTE->CodecPrivate.GetCount());
+ memcpy(wfe + 1, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+ wfe->cbSize = 0; // IMPORTANT: this is screwed, but cbSize has to be 0 and the extra data from codec priv must be after WAVEFORMATEX
+ mts.Add(mt);
+ } else if (CodecID == "A_QUICKTIME" && pTE->CodecPrivate.GetCount() >= 8) {
+ DWORD* type = (DWORD*)(pTE->CodecPrivate.GetData() + 4);
+ if (*type == MAKEFOURCC('Q', 'D', 'M', '2') || *type == MAKEFOURCC('Q', 'D', 'M', 'C')) {
+ mt.subtype = FOURCCMap(*type);
+ wfe->cbSize = (WORD)pTE->CodecPrivate.GetCount();
+ wfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + pTE->CodecPrivate.GetCount());
+ memcpy(wfe + 1, pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+ mts.Add(mt);
+ }
+ }
+ } else if (pTE->TrackType == TrackEntry::TypeSubtitle) {
+ if (iSubtitle == 1) {
+ InstallFonts();
+ }
+
+ Name.Format(L"Subtitle %d", iSubtitle++);
+
+ mt.SetSampleSize(1);
+
+ if (CodecID == "S_TEXT/ASCII") {
+ mt.majortype = MEDIATYPE_Text;
+ mt.subtype = MEDIASUBTYPE_NULL;
+ mt.formattype = FORMAT_None;
+ mts.Add(mt);
+ isSub = true;
+ } else {
+ mt.majortype = MEDIATYPE_Subtitle;
+ mt.formattype = FORMAT_SubtitleInfo;
+ SUBTITLEINFO* psi = (SUBTITLEINFO*)mt.AllocFormatBuffer(sizeof(SUBTITLEINFO) + pTE->CodecPrivate.GetCount());
+ memset(psi, 0, mt.FormatLength());
+ strncpy_s(psi->IsoLang, pTE->Language, _countof(psi->IsoLang) - 1);
+ CString subtitle_Name = pTE->Name;
+ if (pTE->FlagForced) { // "Forced" overrides "Default"
+ subtitle_Name += L" [Forced]";
+ } else if (pTE->FlagDefault) {
+ subtitle_Name += L" [Default]";
+ }
+ subtitle_Name = subtitle_Name.Trim();
+
+ wcsncpy_s(psi->TrackName, subtitle_Name, _countof(psi->TrackName) - 1);
+ memcpy(mt.pbFormat + (psi->dwOffset = sizeof(SUBTITLEINFO)), pTE->CodecPrivate.GetData(), pTE->CodecPrivate.GetCount());
+
+ mt.subtype =
+ CodecID == "S_TEXT/UTF8" ? MEDIASUBTYPE_UTF8 :
+ CodecID == "S_TEXT/SSA" || CodecID == "S_SSA" ? MEDIASUBTYPE_SSA :
+ CodecID == "S_TEXT/ASS" || CodecID == "S_ASS" ? MEDIASUBTYPE_ASS :
+ CodecID == "S_TEXT/USF" || CodecID == "S_USF" ? MEDIASUBTYPE_USF :
+ CodecID == "S_HDMV/PGS" ? MEDIASUBTYPE_HDMVSUB :
+ //CodecID == "S_DVBSUB" ? MEDIASUBTYPE_DVB_SUBTITLES : // does not work
+ CodecID == "S_VOBSUB" ? MEDIASUBTYPE_VOBSUB :
+ MEDIASUBTYPE_NULL;
+
+ if (mt.subtype != MEDIASUBTYPE_NULL) {
+ mts.Add(mt);
+ isSub = true;
+ }
+ }
+ }
+
+ if (mts.IsEmpty()) {
+ TRACE(_T("CMatroskaSourceFilter: Unsupported TrackType %s (%I64d)\n"), CString(CodecID), (UINT64)pTE->TrackType);
+ continue;
+ }
+
+ Name = CStringW(pTE->Language.IsEmpty() ? L"English" : CStringW(ISO6392ToLanguage(pTE->Language)))
+ + (pTE->Name.IsEmpty() ? L"" : L", " + pTE->Name)
+ + (L" (" + Name + L")");
+
+ if (pTE->FlagForced) { // "Forced" overrides "Default"
+ Name = Name + L" [Forced]";
+ } else if (pTE->FlagDefault) {
+ Name = Name + L" [Default]";
+ }
+
+ HRESULT hr;
+
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CMatroskaSplitterOutputPin(pTE->MinCache, pTE->DefaultDuration / 100, mts, Name, this, this, &hr));
+ if (!pTE->Name.IsEmpty()) {
+ pPinOut->SetProperty(L"NAME", pTE->Name);
+ }
+ if (pTE->Language.GetLength() == 3) {
+ pPinOut->SetProperty(L"LANG", CStringW(CString(pTE->Language)));
+ }
+
+ if (!isSub) {
+ pinOut.InsertAt((iVideo + iAudio - 3), DNew CMatroskaSplitterOutputPin(pTE->MinCache, pTE->DefaultDuration / 100, mts, Name, this, this, &hr), 1);
+ pinOutTE.InsertAt((iVideo + iAudio - 3), pTE, 1);
+ } else {
+ pinOut.Add(DNew CMatroskaSplitterOutputPin(pTE->MinCache, pTE->DefaultDuration / 100, mts, Name, this, this, &hr));
+ pinOutTE.Add(pTE);
+ }
+
+ }
+ }
+
+ for (size_t i = 0; i < pinOut.GetCount(); i++) {
+
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut;
+ pPinOut.Attach(pinOut[i]);
+ TrackEntry* pTE = pinOutTE[i];
+
+ if (pTE != NULL) {
+ AddOutputPin((DWORD)pTE->TrackNumber, pPinOut);
+ m_pTrackEntryMap[(DWORD)pTE->TrackNumber] = pTE;
+ m_pOrderedTrackArray.Add(pTE);
+ }
+ }
+
+
+ Info& info = m_pFile->m_segment.SegmentInfo;
+
+ if (m_pFile->IsRandomAccess()) {
+ m_rtDuration = (REFERENCE_TIME)(info.Duration * info.TimeCodeScale / 100);
+ }
+
+ m_rtNewStop = m_rtStop = m_rtDuration;
+
+ /*#ifdef _DEBUG
+ for (int i = 1, j = GetChapterCount(CHAPTER_ROOT_ID); i <= j; i++)
+ {
+ UINT id = GetChapterId(CHAPTER_ROOT_ID, i);
+ struct ChapterElement ce;
+ BOOL b = GetChapterInfo(id, &ce);
+ BSTR bstr = GetChapterStringInfo(id, "eng", "");
+ if (bstr) ::SysFreeString(bstr);
+ }
+ #endif*/
+
+ SetProperty(L"TITL", info.Title);
+ // TODO
+
+ // resources
+
+ {
+ POSITION pos = m_pFile->m_segment.Attachments.GetHeadPosition();
+ while (pos) {
+ Attachment* pA = m_pFile->m_segment.Attachments.GetNext(pos);
+
+ POSITION pos = pA->AttachedFiles.GetHeadPosition();
+ while (pos) {
+ AttachedFile* pF = pA->AttachedFiles.GetNext(pos);
+
+ CAtlArray<BYTE> pData;
+ pData.SetCount((size_t)pF->FileDataLen);
+ m_pFile->Seek(pF->FileDataPos);
+ if (SUCCEEDED(m_pFile->ByteRead(pData.GetData(), pData.GetCount()))) {
+ ResAppend(pF->FileName, pF->FileDescription, CStringW(pF->FileMimeType), pData.GetData(), (DWORD)pData.GetCount());
+ }
+ }
+ }
+ }
+
+ // chapters
+
+ if (ChapterAtom* caroot = m_pFile->m_segment.FindChapterAtom(0)) {
+ CStringA str;
+ str.ReleaseBufferSetLength(GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, str.GetBuffer(3), 3));
+ CStringA ChapLanguage = CStringA(ISO6391To6392(str));
+ if (ChapLanguage.GetLength() < 3) {
+ ChapLanguage = "eng";
+ }
+
+ SetupChapters(ChapLanguage, caroot);
+ }
+
+ return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
}
void CMatroskaSplitterFilter::SetupChapters(LPCSTR lng, ChapterAtom* parent, int level)
{
- CStringW tabs('+', level);
-
- if (!tabs.IsEmpty()) {
- tabs += ' ';
- }
-
- POSITION pos = parent->ChapterAtoms.GetHeadPosition();
- while (pos) {
- // ChapUID zero not allow by Matroska specs
- UINT64 ChapUID = parent->ChapterAtoms.GetNext(pos)->ChapterUID;
- ChapterAtom* ca = (ChapUID == 0) ? NULL : m_pFile->m_segment.FindChapterAtom(ChapUID);
-
- if (ca) {
- CStringW name, first;
-
- POSITION pos = ca->ChapterDisplays.GetHeadPosition();
- while (pos) {
- ChapterDisplay* cd = ca->ChapterDisplays.GetNext(pos);
- if (first.IsEmpty()) {
- first = cd->ChapString;
- }
- if (cd->ChapLanguage == lng) {
- name = cd->ChapString;
- }
- }
-
- name = tabs + (!name.IsEmpty() ? name : first);
-
- ChapAppend(ca->ChapterTimeStart / 100 - m_pFile->m_rtOffset, name);
-
- if (!ca->ChapterAtoms.IsEmpty() && level < 5) {
- // level < 5 - hard limit for the number of levels
- SetupChapters(lng, ca, level+1);
- }
- }
- }
+ CStringW tabs('+', level);
+
+ if (!tabs.IsEmpty()) {
+ tabs += ' ';
+ }
+
+ POSITION pos = parent->ChapterAtoms.GetHeadPosition();
+ while (pos) {
+ // ChapUID zero not allow by Matroska specs
+ UINT64 ChapUID = parent->ChapterAtoms.GetNext(pos)->ChapterUID;
+ ChapterAtom* ca = (ChapUID == 0) ? NULL : m_pFile->m_segment.FindChapterAtom(ChapUID);
+
+ if (ca) {
+ CStringW name, first;
+
+ POSITION pos = ca->ChapterDisplays.GetHeadPosition();
+ while (pos) {
+ ChapterDisplay* cd = ca->ChapterDisplays.GetNext(pos);
+ if (first.IsEmpty()) {
+ first = cd->ChapString;
+ }
+ if (cd->ChapLanguage == lng) {
+ name = cd->ChapString;
+ }
+ }
+
+ name = tabs + (!name.IsEmpty() ? name : first);
+
+ ChapAppend(ca->ChapterTimeStart / 100 - m_pFile->m_rtOffset, name);
+
+ if (!ca->ChapterAtoms.IsEmpty() && level < 5) {
+ // level < 5 - hard limit for the number of levels
+ SetupChapters(lng, ca, level + 1);
+ }
+ }
+ }
}
void CMatroskaSplitterFilter::InstallFonts()
{
- POSITION pos = m_pFile->m_segment.Attachments.GetHeadPosition();
- while (pos) {
- Attachment* pA = m_pFile->m_segment.Attachments.GetNext(pos);
-
- POSITION p2 = pA->AttachedFiles.GetHeadPosition();
- while (p2) {
- AttachedFile* pF = pA->AttachedFiles.GetNext(p2);
-
- if (pF->FileMimeType == "application/x-truetype-font" ||
- pF->FileMimeType == "application/x-font-ttf" ||
- pF->FileMimeType == "application/vnd.ms-opentype") {
- // assume this is a font resource
-
- if (BYTE* pData = DNew BYTE[(UINT)pF->FileDataLen]) {
- m_pFile->Seek(pF->FileDataPos);
-
- if (SUCCEEDED(m_pFile->ByteRead(pData, pF->FileDataLen))) {
- //m_fontinst.InstallFont(pData, (UINT)pF->FileDataLen);
- m_fontinst.InstallFontMemory(pData, (UINT)pF->FileDataLen);
- }
-
- delete [] pData;
- }
- }
- }
- }
+ POSITION pos = m_pFile->m_segment.Attachments.GetHeadPosition();
+ while (pos) {
+ Attachment* pA = m_pFile->m_segment.Attachments.GetNext(pos);
+
+ POSITION p2 = pA->AttachedFiles.GetHeadPosition();
+ while (p2) {
+ AttachedFile* pF = pA->AttachedFiles.GetNext(p2);
+
+ if (pF->FileMimeType == "application/x-truetype-font" ||
+ pF->FileMimeType == "application/x-font-ttf" ||
+ pF->FileMimeType == "application/vnd.ms-opentype") {
+ // assume this is a font resource
+
+ if (BYTE* pData = DNew BYTE[(UINT)pF->FileDataLen]) {
+ m_pFile->Seek(pF->FileDataPos);
+
+ if (SUCCEEDED(m_pFile->ByteRead(pData, pF->FileDataLen))) {
+ //m_fontinst.InstallFont(pData, (UINT)pF->FileDataLen);
+ m_fontinst.InstallFontMemory(pData, (UINT)pF->FileDataLen);
+ }
+
+ delete [] pData;
+ }
+ }
+ }
+ }
}
void CMatroskaSplitterFilter::SendVorbisHeaderSample()
{
- HRESULT hr;
-
- POSITION pos = m_pTrackEntryMap.GetStartPosition();
- while (pos) {
- DWORD TrackNumber = 0;
- TrackEntry* pTE = NULL;
- m_pTrackEntryMap.GetNextAssoc(pos, TrackNumber, pTE);
-
- CBaseSplitterOutputPin* pPin = GetOutputPin(TrackNumber);
-
- if (!(pTE && pPin && pPin->IsConnected())) {
- continue;
- }
-
- if (pTE->CodecID.ToString() == "A_VORBIS" && pPin->CurrentMediaType().subtype == MEDIASUBTYPE_Vorbis
- && pTE->CodecPrivate.GetCount() > 0) {
- BYTE* ptr = pTE->CodecPrivate.GetData();
-
- CAtlList<int> sizes;
- long last = 0;
- for (BYTE n = *ptr++; n > 0; n--) {
- int size = 0;
- do {
- size += *ptr;
- } while (*ptr++ == 0xff);
- sizes.AddTail(size);
- last += size;
- }
- sizes.AddTail(pTE->CodecPrivate.GetCount() - (ptr - pTE->CodecPrivate.GetData()) - last);
-
- hr = S_OK;
-
- POSITION pos = sizes.GetHeadPosition();
- while (pos && SUCCEEDED(hr)) {
- long len = sizes.GetNext(pos);
-
- CAutoPtr<Packet> p(DNew Packet());
- p->TrackNumber = (DWORD)pTE->TrackNumber;
- p->rtStart = 0;
- p->rtStop = 1;
- p->bSyncPoint = FALSE;
-
- p->SetData(ptr, len);
- ptr += len;
-
- hr = DeliverPacket(p);
- }
-
- if (FAILED(hr)) {
- TRACE(_T("ERROR: Vorbis initialization failed for stream %I64d\n"), TrackNumber);
- }
- }
- }
+ HRESULT hr;
+
+ POSITION pos = m_pTrackEntryMap.GetStartPosition();
+ while (pos) {
+ DWORD TrackNumber = 0;
+ TrackEntry* pTE = NULL;
+ m_pTrackEntryMap.GetNextAssoc(pos, TrackNumber, pTE);
+
+ CBaseSplitterOutputPin* pPin = GetOutputPin(TrackNumber);
+
+ if (!(pTE && pPin && pPin->IsConnected())) {
+ continue;
+ }
+
+ if (pTE->CodecID.ToString() == "A_VORBIS" && pPin->CurrentMediaType().subtype == MEDIASUBTYPE_Vorbis
+ && pTE->CodecPrivate.GetCount() > 0) {
+ BYTE* ptr = pTE->CodecPrivate.GetData();
+
+ CAtlList<int> sizes;
+ long last = 0;
+ for (BYTE n = *ptr++; n > 0; n--) {
+ int size = 0;
+ do {
+ size += *ptr;
+ } while (*ptr++ == 0xff);
+ sizes.AddTail(size);
+ last += size;
+ }
+ sizes.AddTail(pTE->CodecPrivate.GetCount() - (ptr - pTE->CodecPrivate.GetData()) - last);
+
+ hr = S_OK;
+
+ POSITION pos = sizes.GetHeadPosition();
+ while (pos && SUCCEEDED(hr)) {
+ long len = sizes.GetNext(pos);
+
+ CAutoPtr<Packet> p(DNew Packet());
+ p->TrackNumber = (DWORD)pTE->TrackNumber;
+ p->rtStart = 0;
+ p->rtStop = 1;
+ p->bSyncPoint = FALSE;
+
+ p->SetData(ptr, len);
+ ptr += len;
+
+ hr = DeliverPacket(p);
+ }
+
+ if (FAILED(hr)) {
+ TRACE(_T("ERROR: Vorbis initialization failed for stream %I64d\n"), TrackNumber);
+ }
+ }
+ }
}
bool CMatroskaSplitterFilter::DemuxInit()
{
- SetThreadName((DWORD)-1, "CMatroskaSplitterFilter");
+ SetThreadName((DWORD) - 1, "CMatroskaSplitterFilter");
- CMatroskaNode Root(m_pFile);
- if (!m_pFile
- || !(m_pSegment = Root.Child(0x18538067))
- || !(m_pCluster = m_pSegment->Child(0x1F43B675))) {
- return false;
- }
+ CMatroskaNode Root(m_pFile);
+ if (!m_pFile
+ || !(m_pSegment = Root.Child(0x18538067))
+ || !(m_pCluster = m_pSegment->Child(0x1F43B675))) {
+ return false;
+ }
- // reindex if needed
+ // reindex if needed
- if (m_pFile->IsRandomAccess() && m_pFile->m_segment.Cues.GetCount() == 0) {
- m_nOpenProgress = 0;
- m_pFile->m_segment.SegmentInfo.Duration.Set(0);
+ if (m_pFile->IsRandomAccess() && m_pFile->m_segment.Cues.GetCount() == 0) {
+ m_nOpenProgress = 0;
+ m_pFile->m_segment.SegmentInfo.Duration.Set(0);
- UINT64 TrackNumber = m_pFile->m_segment.GetMasterTrack();
+ UINT64 TrackNumber = m_pFile->m_segment.GetMasterTrack();
- CAutoPtr<Cue> pCue(DNew Cue());
+ CAutoPtr<Cue> pCue(DNew Cue());
- do {
- Cluster c;
- c.ParseTimeCode(m_pCluster);
+ do {
+ Cluster c;
+ c.ParseTimeCode(m_pCluster);
- m_pFile->m_segment.SegmentInfo.Duration.Set((float)c.TimeCode - m_pFile->m_rtOffset/10000);
+ m_pFile->m_segment.SegmentInfo.Duration.Set((float)c.TimeCode - m_pFile->m_rtOffset / 10000);
- CAutoPtr<CuePoint> pCuePoint(DNew CuePoint());
- CAutoPtr<CueTrackPosition> pCueTrackPosition(DNew CueTrackPosition());
- pCuePoint->CueTime.Set(c.TimeCode);
- pCueTrackPosition->CueTrack.Set(TrackNumber);
- pCueTrackPosition->CueClusterPosition.Set(m_pCluster->m_filepos - m_pSegment->m_start);
- pCuePoint->CueTrackPositions.AddTail(pCueTrackPosition);
- pCue->CuePoints.AddTail(pCuePoint);
+ CAutoPtr<CuePoint> pCuePoint(DNew CuePoint());
+ CAutoPtr<CueTrackPosition> pCueTrackPosition(DNew CueTrackPosition());
+ pCuePoint->CueTime.Set(c.TimeCode);
+ pCueTrackPosition->CueTrack.Set(TrackNumber);
+ pCueTrackPosition->CueClusterPosition.Set(m_pCluster->m_filepos - m_pSegment->m_start);
+ pCuePoint->CueTrackPositions.AddTail(pCueTrackPosition);
+ pCue->CuePoints.AddTail(pCuePoint);
- m_nOpenProgress = m_pFile->GetPos()*100/m_pFile->GetLength();
+ m_nOpenProgress = m_pFile->GetPos() * 100 / m_pFile->GetLength();
- DWORD cmd;
- if (CheckRequest(&cmd)) {
- if (cmd == CMD_EXIT) {
- m_fAbort = true;
- } else {
- Reply(S_OK);
- }
- }
- } while (!m_fAbort && m_pCluster->Next(true));
+ DWORD cmd;
+ if (CheckRequest(&cmd)) {
+ if (cmd == CMD_EXIT) {
+ m_fAbort = true;
+ } else {
+ Reply(S_OK);
+ }
+ }
+ } while (!m_fAbort && m_pCluster->Next(true));
- m_nOpenProgress = 100;
+ m_nOpenProgress = 100;
- if (!m_fAbort) {
- m_pFile->m_segment.Cues.AddTail(pCue);
- }
+ if (!m_fAbort) {
+ m_pFile->m_segment.Cues.AddTail(pCue);
+ }
- m_fAbort = false;
- }
+ m_fAbort = false;
+ }
- m_pCluster.Free();
- m_pBlock.Free();
+ m_pCluster.Free();
+ m_pBlock.Free();
- return true;
+ return true;
}
void CMatroskaSplitterFilter::DemuxSeek(REFERENCE_TIME rt)
{
- m_pCluster = m_pSegment->Child(0x1F43B675);
- m_pBlock.Free();
-
- if (rt > 0) {
- rt += m_pFile->m_rtOffset;
-
- MatroskaReader::QWORD lastCueClusterPosition = (MatroskaReader::QWORD)-1;
-
- Segment& s = m_pFile->m_segment;
-
- UINT64 TrackNumber = s.GetMasterTrack();
-
- POSITION pos1 = s.Cues.GetHeadPosition();
- while (pos1) {
- Cue* pCue = s.Cues.GetNext(pos1);
-
- POSITION pos2 = pCue->CuePoints.GetTailPosition();
- while (pos2) {
- CuePoint* pCuePoint = pCue->CuePoints.GetPrev(pos2);
-
- if (rt < s.GetRefTime(pCuePoint->CueTime)) {
- continue;
- }
-
- POSITION pos3 = pCuePoint->CueTrackPositions.GetHeadPosition();
- while (pos3) {
- CueTrackPosition* pCueTrackPositions = pCuePoint->CueTrackPositions.GetNext(pos3);
-
- if (TrackNumber != pCueTrackPositions->CueTrack) {
- continue;
- }
-
- if (lastCueClusterPosition == pCueTrackPositions->CueClusterPosition) {
- continue;
- }
-
- lastCueClusterPosition = pCueTrackPositions->CueClusterPosition;
-
- m_pCluster->SeekTo(m_pSegment->m_start + pCueTrackPositions->CueClusterPosition);
- m_pCluster->Parse();
-
- bool fFoundKeyFrame = false;
- /*
- if (pCueTrackPositions->CueBlockNumber > 0)
- {
- // TODO: CueBlockNumber only tells the block num of the track and not for all mixed in the cluster
- m_nLastBlock = (int)pCueTrackPositions->CueBlockNumber;
- fFoundKeyFrame = true;
- }
- else
- */
- {
- Cluster c;
- c.ParseTimeCode(m_pCluster);
-
- if (CAutoPtr<CMatroskaNode> pBlock = m_pCluster->GetFirstBlock()) {
- bool fPassedCueTime = false;
-
- do {
- CBlockGroupNode bgn;
-
- if (pBlock->m_id == 0xA0) {
- bgn.Parse(pBlock, true);
- } else if (pBlock->m_id == 0xA3) {
- CAutoPtr<BlockGroup> bg(DNew BlockGroup());
- bg->Block.Parse(pBlock, true);
- if (!(bg->Block.Lacing & 0x80)) {
- bg->ReferenceBlock.Set(0); // not a kf
- }
- bgn.AddTail(bg);
- }
-
- POSITION pos4 = bgn.GetHeadPosition();
- while (!fPassedCueTime && pos4) {
- BlockGroup* bg = bgn.GetNext(pos4);
-
- if (bg->Block.TrackNumber == pCueTrackPositions->CueTrack && rt < s.GetRefTime(c.TimeCode + bg->Block.TimeCode)
- || rt + 5000000i64 < s.GetRefTime(c.TimeCode + bg->Block.TimeCode)) { // allow 500ms difference between tracks, just in case intreleaving wasn't that much precise
- fPassedCueTime = true;
- } else if (bg->Block.TrackNumber == pCueTrackPositions->CueTrack && !bg->ReferenceBlock.IsValid()) {
- fFoundKeyFrame = true;
- m_pBlock = pBlock->Copy();
- }
- }
- } while (!fPassedCueTime && pBlock->NextBlock());
- }
- }
-
- if (fFoundKeyFrame) {
- pos1 = pos2 = pos3 = NULL;
- }
- }
- }
- }
-
- if (!m_pBlock) {
- m_pCluster = m_pSegment->Child(0x1F43B675);
- }
- }
+ m_pCluster = m_pSegment->Child(0x1F43B675);
+ m_pBlock.Free();
+
+ if (rt > 0) {
+ rt += m_pFile->m_rtOffset;
+
+ MatroskaReader::QWORD lastCueClusterPosition = (MatroskaReader::QWORD) - 1;
+
+ Segment& s = m_pFile->m_segment;
+
+ UINT64 TrackNumber = s.GetMasterTrack();
+
+ POSITION pos1 = s.Cues.GetHeadPosition();
+ while (pos1) {
+ Cue* pCue = s.Cues.GetNext(pos1);
+
+ POSITION pos2 = pCue->CuePoints.GetTailPosition();
+ while (pos2) {
+ CuePoint* pCuePoint = pCue->CuePoints.GetPrev(pos2);
+
+ if (rt < s.GetRefTime(pCuePoint->CueTime)) {
+ continue;
+ }
+
+ POSITION pos3 = pCuePoint->CueTrackPositions.GetHeadPosition();
+ while (pos3) {
+ CueTrackPosition* pCueTrackPositions = pCuePoint->CueTrackPositions.GetNext(pos3);
+
+ if (TrackNumber != pCueTrackPositions->CueTrack) {
+ continue;
+ }
+
+ if (lastCueClusterPosition == pCueTrackPositions->CueClusterPosition) {
+ continue;
+ }
+
+ lastCueClusterPosition = pCueTrackPositions->CueClusterPosition;
+
+ m_pCluster->SeekTo(m_pSegment->m_start + pCueTrackPositions->CueClusterPosition);
+ m_pCluster->Parse();
+
+ bool fFoundKeyFrame = false;
+ /*
+ if (pCueTrackPositions->CueBlockNumber > 0)
+ {
+ // TODO: CueBlockNumber only tells the block num of the track and not for all mixed in the cluster
+ m_nLastBlock = (int)pCueTrackPositions->CueBlockNumber;
+ fFoundKeyFrame = true;
+ }
+ else
+ */
+ {
+ Cluster c;
+ c.ParseTimeCode(m_pCluster);
+
+ if (CAutoPtr<CMatroskaNode> pBlock = m_pCluster->GetFirstBlock()) {
+ bool fPassedCueTime = false;
+
+ do {
+ CBlockGroupNode bgn;
+
+ if (pBlock->m_id == 0xA0) {
+ bgn.Parse(pBlock, true);
+ } else if (pBlock->m_id == 0xA3) {
+ CAutoPtr<BlockGroup> bg(DNew BlockGroup());
+ bg->Block.Parse(pBlock, true);
+ if (!(bg->Block.Lacing & 0x80)) {
+ bg->ReferenceBlock.Set(0); // not a kf
+ }
+ bgn.AddTail(bg);
+ }
+
+ POSITION pos4 = bgn.GetHeadPosition();
+ while (!fPassedCueTime && pos4) {
+ BlockGroup* bg = bgn.GetNext(pos4);
+
+ if (bg->Block.TrackNumber == pCueTrackPositions->CueTrack && rt < s.GetRefTime(c.TimeCode + bg->Block.TimeCode)
+ || rt + 5000000i64 < s.GetRefTime(c.TimeCode + bg->Block.TimeCode)) { // allow 500ms difference between tracks, just in case intreleaving wasn't that much precise
+ fPassedCueTime = true;
+ } else if (bg->Block.TrackNumber == pCueTrackPositions->CueTrack && !bg->ReferenceBlock.IsValid()) {
+ fFoundKeyFrame = true;
+ m_pBlock = pBlock->Copy();
+ }
+ }
+ } while (!fPassedCueTime && pBlock->NextBlock());
+ }
+ }
+
+ if (fFoundKeyFrame) {
+ pos1 = pos2 = pos3 = NULL;
+ }
+ }
+ }
+ }
+
+ if (!m_pBlock) {
+ m_pCluster = m_pSegment->Child(0x1F43B675);
+ }
+ }
}
bool CMatroskaSplitterFilter::DemuxLoop()
{
- HRESULT hr = S_OK;
-
- SendVorbisHeaderSample(); // HACK: init vorbis decoder with the headers
-
- do {
- Cluster c;
- c.ParseTimeCode(m_pCluster);
-
- if (!m_pBlock) {
- m_pBlock = m_pCluster->GetFirstBlock();
- }
- if (!m_pBlock) {
- continue;
- }
-
- do {
- CBlockGroupNode bgn;
-
- if (m_pBlock->m_id == 0xA0) {
- bgn.Parse(m_pBlock, true);
- } else if (m_pBlock->m_id == 0xA3) {
- CAutoPtr<BlockGroup> bg(DNew BlockGroup());
- bg->Block.Parse(m_pBlock, true);
- if (!(bg->Block.Lacing & 0x80)) {
- bg->ReferenceBlock.Set(0); // not a kf
- }
- bgn.AddTail(bg);
- }
-
- while (bgn.GetCount() && SUCCEEDED(hr)) {
- CAutoPtr<MatroskaPacket> p(DNew MatroskaPacket());
- p->bg = bgn.RemoveHead();
-
- p->bSyncPoint = !p->bg->ReferenceBlock.IsValid();
- p->TrackNumber = (DWORD)p->bg->Block.TrackNumber;
-
- TrackEntry* pTE = NULL;
-
- if (!m_pTrackEntryMap.Lookup (p->TrackNumber, pTE) || !pTE) {
- continue;
- }
-
- p->rtStart = m_pFile->m_segment.GetRefTime((REFERENCE_TIME)c.TimeCode + p->bg->Block.TimeCode);
- p->rtStop = p->rtStart + (p->bg->BlockDuration.IsValid() ? m_pFile->m_segment.GetRefTime(p->bg->BlockDuration) : 1);
-
- // Fix subtitle with duration = 0
- if (pTE->TrackType == TrackEntry::TypeSubtitle && !p->bg->BlockDuration.IsValid()) {
- p->bg->BlockDuration.Set(1); // just setting it to be valid
- p->rtStop = p->rtStart;
- }
-
- POSITION pos = p->bg->Block.BlockData.GetHeadPosition();
- while (pos) {
- CBinary* pb = p->bg->Block.BlockData.GetNext(pos);
- pTE->Expand(*pb, ContentEncoding::AllFrameContents);
- }
-
- // HACK
- p->rtStart -= m_pFile->m_rtOffset;
- p->rtStop -= m_pFile->m_rtOffset;
-
- hr = DeliverPacket(p);
- }
- } while (m_pBlock->NextBlock() && SUCCEEDED(hr) && !CheckRequest(NULL));
-
- m_pBlock.Free();
- } while (m_pFile->GetPos() < (__int64)(m_pFile->m_segment.pos + m_pFile->m_segment.len)
- && m_pCluster->Next(true) && SUCCEEDED(hr) && !CheckRequest(NULL));
-
- m_pCluster.Free();
-
- return true;
+ HRESULT hr = S_OK;
+
+ SendVorbisHeaderSample(); // HACK: init vorbis decoder with the headers
+
+ do {
+ Cluster c;
+ c.ParseTimeCode(m_pCluster);
+
+ if (!m_pBlock) {
+ m_pBlock = m_pCluster->GetFirstBlock();
+ }
+ if (!m_pBlock) {
+ continue;
+ }
+
+ do {
+ CBlockGroupNode bgn;
+
+ if (m_pBlock->m_id == 0xA0) {
+ bgn.Parse(m_pBlock, true);
+ } else if (m_pBlock->m_id == 0xA3) {
+ CAutoPtr<BlockGroup> bg(DNew BlockGroup());
+ bg->Block.Parse(m_pBlock, true);
+ if (!(bg->Block.Lacing & 0x80)) {
+ bg->ReferenceBlock.Set(0); // not a kf
+ }
+ bgn.AddTail(bg);
+ }
+
+ while (bgn.GetCount() && SUCCEEDED(hr)) {
+ CAutoPtr<MatroskaPacket> p(DNew MatroskaPacket());
+ p->bg = bgn.RemoveHead();
+
+ p->bSyncPoint = !p->bg->ReferenceBlock.IsValid();
+ p->TrackNumber = (DWORD)p->bg->Block.TrackNumber;
+
+ TrackEntry* pTE = NULL;
+
+ if (!m_pTrackEntryMap.Lookup(p->TrackNumber, pTE) || !pTE) {
+ continue;
+ }
+
+ p->rtStart = m_pFile->m_segment.GetRefTime((REFERENCE_TIME)c.TimeCode + p->bg->Block.TimeCode);
+ p->rtStop = p->rtStart + (p->bg->BlockDuration.IsValid() ? m_pFile->m_segment.GetRefTime(p->bg->BlockDuration) : 1);
+
+ // Fix subtitle with duration = 0
+ if (pTE->TrackType == TrackEntry::TypeSubtitle && !p->bg->BlockDuration.IsValid()) {
+ p->bg->BlockDuration.Set(1); // just setting it to be valid
+ p->rtStop = p->rtStart;
+ }
+
+ POSITION pos = p->bg->Block.BlockData.GetHeadPosition();
+ while (pos) {
+ CBinary* pb = p->bg->Block.BlockData.GetNext(pos);
+ pTE->Expand(*pb, ContentEncoding::AllFrameContents);
+ }
+
+ // HACK
+ p->rtStart -= m_pFile->m_rtOffset;
+ p->rtStop -= m_pFile->m_rtOffset;
+
+ hr = DeliverPacket(p);
+ }
+ } while (m_pBlock->NextBlock() && SUCCEEDED(hr) && !CheckRequest(NULL));
+
+ m_pBlock.Free();
+ } while (m_pFile->GetPos() < (__int64)(m_pFile->m_segment.pos + m_pFile->m_segment.len)
+ && m_pCluster->Next(true) && SUCCEEDED(hr) && !CheckRequest(NULL));
+
+ m_pCluster.Free();
+
+ return true;
}
// IKeyFrameInfo
STDMETHODIMP CMatroskaSplitterFilter::GetKeyFrameCount(UINT& nKFs)
{
- if (!m_pFile) {
- return E_UNEXPECTED;
- }
+ if (!m_pFile) {
+ return E_UNEXPECTED;
+ }
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- nKFs = 0;
+ nKFs = 0;
- POSITION pos = m_pFile->m_segment.Cues.GetHeadPosition();
- while (pos) {
- nKFs += (UINT)m_pFile->m_segment.Cues.GetNext(pos)->CuePoints.GetCount();
- }
+ POSITION pos = m_pFile->m_segment.Cues.GetHeadPosition();
+ while (pos) {
+ nKFs += (UINT)m_pFile->m_segment.Cues.GetNext(pos)->CuePoints.GetCount();
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CMatroskaSplitterFilter::GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs)
{
- CheckPointer(pFormat, E_POINTER);
- CheckPointer(pKFs, E_POINTER);
+ CheckPointer(pFormat, E_POINTER);
+ CheckPointer(pKFs, E_POINTER);
- if (!m_pFile) {
- return E_UNEXPECTED;
- }
- if (*pFormat != TIME_FORMAT_MEDIA_TIME) {
- return E_INVALIDARG;
- }
+ if (!m_pFile) {
+ return E_UNEXPECTED;
+ }
+ if (*pFormat != TIME_FORMAT_MEDIA_TIME) {
+ return E_INVALIDARG;
+ }
- UINT nKFsTmp = 0;
+ UINT nKFsTmp = 0;
- POSITION pos1 = m_pFile->m_segment.Cues.GetHeadPosition();
- while (pos1 && nKFsTmp < nKFs) {
- Cue* pCue = m_pFile->m_segment.Cues.GetNext(pos1);
+ POSITION pos1 = m_pFile->m_segment.Cues.GetHeadPosition();
+ while (pos1 && nKFsTmp < nKFs) {
+ Cue* pCue = m_pFile->m_segment.Cues.GetNext(pos1);
- POSITION pos2 = pCue->CuePoints.GetHeadPosition();
- while (pos2 && nKFsTmp < nKFs) {
- pKFs[nKFsTmp++] = m_pFile->m_segment.GetRefTime(pCue->CuePoints.GetNext(pos2)->CueTime);
- }
- }
+ POSITION pos2 = pCue->CuePoints.GetHeadPosition();
+ while (pos2 && nKFsTmp < nKFs) {
+ pKFs[nKFsTmp++] = m_pFile->m_segment.GetRefTime(pCue->CuePoints.GetNext(pos2)->CueTime);
+ }
+ }
- nKFs = nKFsTmp;
+ nKFs = nKFsTmp;
- return S_OK;
+ return S_OK;
}
//
@@ -1353,10 +1361,10 @@ STDMETHODIMP CMatroskaSplitterFilter::GetKeyFrames(const GUID* pFormat, REFERENC
//
CMatroskaSourceFilter::CMatroskaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CMatroskaSplitterFilter(pUnk, phr)
+ : CMatroskaSplitterFilter(pUnk, phr)
{
- m_clsid = __uuidof(this);
- m_pInput.Free();
+ m_clsid = __uuidof(this);
+ m_pInput.Free();
}
//
@@ -1364,12 +1372,12 @@ CMatroskaSourceFilter::CMatroskaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
//
CMatroskaSplitterOutputPin::CMatroskaSplitterOutputPin(
- unsigned int nMinCache, REFERENCE_TIME rtDefaultDuration,
- CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBaseSplitterOutputPin(mts, pName, pFilter, pLock, phr)
- , m_nMinCache(nMinCache), m_rtDefaultDuration(rtDefaultDuration)
+ unsigned int nMinCache, REFERENCE_TIME rtDefaultDuration,
+ CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
+ : CBaseSplitterOutputPin(mts, pName, pFilter, pLock, phr)
+ , m_nMinCache(nMinCache), m_rtDefaultDuration(rtDefaultDuration)
{
- m_nMinCache = 1;//max(m_nMinCache, 1);
+ m_nMinCache = 1;//max(m_nMinCache, 1);
}
CMatroskaSplitterOutputPin::~CMatroskaSplitterOutputPin()
@@ -1378,281 +1386,281 @@ CMatroskaSplitterOutputPin::~CMatroskaSplitterOutputPin()
HRESULT CMatroskaSplitterOutputPin::DeliverEndFlush()
{
- {
- CAutoLock cAutoLock(&m_csQueue);
- m_packets.RemoveAll();
- m_rob.RemoveAll();
- m_tos.RemoveAll();
- }
-
- return __super::DeliverEndFlush();
+ {
+ CAutoLock cAutoLock(&m_csQueue);
+ m_packets.RemoveAll();
+ m_rob.RemoveAll();
+ m_tos.RemoveAll();
+ }
+
+ return __super::DeliverEndFlush();
}
HRESULT CMatroskaSplitterOutputPin::DeliverEndOfStream()
{
- CAutoLock cAutoLock(&m_csQueue);
-
- // send out the last remaining packets from the queue
-
- while (m_rob.GetCount()) {
- MatroskaPacket* mp = m_rob.RemoveHead();
- if (m_rob.GetCount() && !mp->bg->BlockDuration.IsValid()) {
- mp->rtStop = m_rob.GetHead()->rtStart;
- } else if (m_rob.GetCount() == 0 && m_rtDefaultDuration > 0) {
- mp->rtStop = mp->rtStart + m_rtDefaultDuration;
- }
-
- timeoverride to = {mp->rtStart, mp->rtStop};
- m_tos.AddTail(to);
- }
-
- while (m_packets.GetCount()) {
- HRESULT hr = DeliverBlock(m_packets.RemoveHead());
- if (hr != S_OK) {
- return hr;
- }
- }
-
- return __super::DeliverEndOfStream();
+ CAutoLock cAutoLock(&m_csQueue);
+
+ // send out the last remaining packets from the queue
+
+ while (m_rob.GetCount()) {
+ MatroskaPacket* mp = m_rob.RemoveHead();
+ if (m_rob.GetCount() && !mp->bg->BlockDuration.IsValid()) {
+ mp->rtStop = m_rob.GetHead()->rtStart;
+ } else if (m_rob.GetCount() == 0 && m_rtDefaultDuration > 0) {
+ mp->rtStop = mp->rtStart + m_rtDefaultDuration;
+ }
+
+ timeoverride to = {mp->rtStart, mp->rtStop};
+ m_tos.AddTail(to);
+ }
+
+ while (m_packets.GetCount()) {
+ HRESULT hr = DeliverBlock(m_packets.RemoveHead());
+ if (hr != S_OK) {
+ return hr;
+ }
+ }
+
+ return __super::DeliverEndOfStream();
}
HRESULT CMatroskaSplitterOutputPin::DeliverPacket(CAutoPtr<Packet> p)
{
- MatroskaPacket* mp = dynamic_cast<MatroskaPacket*>(p.m_p);
- if (!mp) {
- return __super::DeliverPacket(p);
- }
-
- // don't try to understand what's happening here, it's magic
-
- CAutoLock cAutoLock(&m_csQueue);
-
- CAutoPtr<MatroskaPacket> p2;
- p.Detach();
- p2.Attach(mp);
- m_packets.AddTail(p2);
-
- POSITION pos = m_rob.GetTailPosition();
- _ASSERTE(m_nMinCache > 0);
- for (int i = m_nMinCache - 1; i > 0 && pos && mp->bg->ReferencePriority < m_rob.GetAt(pos)->bg->ReferencePriority; --i) {
- m_rob.GetPrev(pos);
- }
-
- if (!pos) {
- m_rob.AddHead(mp);
- } else {
- m_rob.InsertAfter(pos, mp);
- }
-
- mp = NULL;
-
- if (m_rob.GetCount() == m_nMinCache + 1) {
- ASSERT(m_nMinCache > 0);
- pos = m_rob.GetHeadPosition();
- MatroskaPacket* mp1 = m_rob.GetNext(pos);
- MatroskaPacket* mp2 = m_rob.GetNext(pos);
- if (!mp1->bg->BlockDuration.IsValid()) {
- mp1->bg->BlockDuration.Set(1); // just to set it valid
-
- if (mp1->rtStart >= mp2->rtStart) {
- /* CString str;
- str.Format(_T("mp1->rtStart (%I64d) >= mp2->rtStart (%I64d)!!!\n"), mp1->rtStart, mp2->rtStart);
- AfxMessageBox(str);
- */
- // TRACE(_T("mp1->rtStart (%I64d) >= mp2->rtStart (%I64d)!!!\n"), mp1->rtStart, mp2->rtStart);
- } else {
- mp1->rtStop = mp2->rtStart;
- }
- }
- }
-
- while (m_packets.GetCount()) {
- mp = m_packets.GetHead();
- if (!mp->bg->BlockDuration.IsValid()) {
- break;
- }
-
- mp = m_rob.RemoveHead();
- timeoverride to = {mp->rtStart, mp->rtStop};
- m_tos.AddTail(to);
-
- HRESULT hr = DeliverBlock(m_packets.RemoveHead());
- if (hr != S_OK) {
- return hr;
- }
- }
-
- return S_OK;
+ MatroskaPacket* mp = dynamic_cast<MatroskaPacket*>(p.m_p);
+ if (!mp) {
+ return __super::DeliverPacket(p);
+ }
+
+ // don't try to understand what's happening here, it's magic
+
+ CAutoLock cAutoLock(&m_csQueue);
+
+ CAutoPtr<MatroskaPacket> p2;
+ p.Detach();
+ p2.Attach(mp);
+ m_packets.AddTail(p2);
+
+ POSITION pos = m_rob.GetTailPosition();
+ _ASSERTE(m_nMinCache > 0);
+ for (int i = m_nMinCache - 1; i > 0 && pos && mp->bg->ReferencePriority < m_rob.GetAt(pos)->bg->ReferencePriority; --i) {
+ m_rob.GetPrev(pos);
+ }
+
+ if (!pos) {
+ m_rob.AddHead(mp);
+ } else {
+ m_rob.InsertAfter(pos, mp);
+ }
+
+ mp = NULL;
+
+ if (m_rob.GetCount() == m_nMinCache + 1) {
+ ASSERT(m_nMinCache > 0);
+ pos = m_rob.GetHeadPosition();
+ MatroskaPacket* mp1 = m_rob.GetNext(pos);
+ MatroskaPacket* mp2 = m_rob.GetNext(pos);
+ if (!mp1->bg->BlockDuration.IsValid()) {
+ mp1->bg->BlockDuration.Set(1); // just to set it valid
+
+ if (mp1->rtStart >= mp2->rtStart) {
+ /* CString str;
+ str.Format(_T("mp1->rtStart (%I64d) >= mp2->rtStart (%I64d)!!!\n"), mp1->rtStart, mp2->rtStart);
+ AfxMessageBox(str);
+ */
+ // TRACE(_T("mp1->rtStart (%I64d) >= mp2->rtStart (%I64d)!!!\n"), mp1->rtStart, mp2->rtStart);
+ } else {
+ mp1->rtStop = mp2->rtStart;
+ }
+ }
+ }
+
+ while (m_packets.GetCount()) {
+ mp = m_packets.GetHead();
+ if (!mp->bg->BlockDuration.IsValid()) {
+ break;
+ }
+
+ mp = m_rob.RemoveHead();
+ timeoverride to = {mp->rtStart, mp->rtStop};
+ m_tos.AddTail(to);
+
+ HRESULT hr = DeliverBlock(m_packets.RemoveHead());
+ if (hr != S_OK) {
+ return hr;
+ }
+ }
+
+ return S_OK;
}
HRESULT CMatroskaSplitterOutputPin::DeliverBlock(MatroskaPacket* p)
{
- HRESULT hr = S_FALSE;
+ HRESULT hr = S_FALSE;
- if (m_tos.GetCount()) {
- timeoverride to = m_tos.RemoveHead();
+ if (m_tos.GetCount()) {
+ timeoverride to = m_tos.RemoveHead();
#if defined(_DEBUG) && 0
- TRACE(_T("(track=%d) %I64d, %I64d -> %I64d, %I64d (buffcnt=%d)\n"),
- p->TrackNumber, p->rtStart, p->rtStop, to.rtStart, to.rtStop,
- QueueCount());
+ TRACE(_T("(track=%d) %I64d, %I64d -> %I64d, %I64d (buffcnt=%d)\n"),
+ p->TrackNumber, p->rtStart, p->rtStop, to.rtStart, to.rtStop,
+ QueueCount());
#endif
- p->rtStart = to.rtStart;
- p->rtStop = to.rtStop;
- }
-
- REFERENCE_TIME
- rtStart = p->rtStart,
- rtDelta = (p->rtStop - p->rtStart) / p->bg->Block.BlockData.GetCount(),
- rtStop = p->rtStart + rtDelta;
-
- POSITION pos = p->bg->Block.BlockData.GetHeadPosition();
- while (pos) {
- CAutoPtr<Packet> tmp(DNew Packet());
- tmp->TrackNumber = p->TrackNumber;
- tmp->bDiscontinuity = p->bDiscontinuity;
- tmp->bSyncPoint = p->bSyncPoint;
- tmp->rtStart = rtStart;
- tmp->rtStop = rtStop;
- tmp->Copy(*p->bg->Block.BlockData.GetNext(pos));
- if (S_OK != (hr = DeliverPacket(tmp))) {
- break;
- }
-
- rtStart += rtDelta;
- rtStop += rtDelta;
-
- p->bSyncPoint = false;
- p->bDiscontinuity = false;
- }
-
- if (m_mt.subtype == FOURCCMap(WAVE_FORMAT_WAVPACK4)) {
- POSITION pos = p->bg->ba.bm.GetHeadPosition();
- while (pos) {
- const BlockMore* bm = p->bg->ba.bm.GetNext(pos);
- CAutoPtr<Packet> tmp(DNew Packet());
- tmp->TrackNumber = p->TrackNumber;
- tmp->bDiscontinuity = false;
- tmp->bSyncPoint = false;
- tmp->rtStart = p->rtStart;
- tmp->rtStop = p->rtStop;
- tmp->Copy(bm->BlockAdditional);
- if (S_OK != (hr = DeliverPacket(tmp))) {
- break;
- }
- }
- }
-
- return hr;
+ p->rtStart = to.rtStart;
+ p->rtStop = to.rtStop;
+ }
+
+ REFERENCE_TIME
+ rtStart = p->rtStart,
+ rtDelta = (p->rtStop - p->rtStart) / p->bg->Block.BlockData.GetCount(),
+ rtStop = p->rtStart + rtDelta;
+
+ POSITION pos = p->bg->Block.BlockData.GetHeadPosition();
+ while (pos) {
+ CAutoPtr<Packet> tmp(DNew Packet());
+ tmp->TrackNumber = p->TrackNumber;
+ tmp->bDiscontinuity = p->bDiscontinuity;
+ tmp->bSyncPoint = p->bSyncPoint;
+ tmp->rtStart = rtStart;
+ tmp->rtStop = rtStop;
+ tmp->Copy(*p->bg->Block.BlockData.GetNext(pos));
+ if (S_OK != (hr = DeliverPacket(tmp))) {
+ break;
+ }
+
+ rtStart += rtDelta;
+ rtStop += rtDelta;
+
+ p->bSyncPoint = false;
+ p->bDiscontinuity = false;
+ }
+
+ if (m_mt.subtype == FOURCCMap(WAVE_FORMAT_WAVPACK4)) {
+ POSITION pos = p->bg->ba.bm.GetHeadPosition();
+ while (pos) {
+ const BlockMore* bm = p->bg->ba.bm.GetNext(pos);
+ CAutoPtr<Packet> tmp(DNew Packet());
+ tmp->TrackNumber = p->TrackNumber;
+ tmp->bDiscontinuity = false;
+ tmp->bSyncPoint = false;
+ tmp->rtStart = p->rtStart;
+ tmp->rtStop = p->rtStop;
+ tmp->Copy(bm->BlockAdditional);
+ if (S_OK != (hr = DeliverPacket(tmp))) {
+ break;
+ }
+ }
+ }
+
+ return hr;
}
// ITrackInfo
TrackEntry* CMatroskaSplitterFilter::GetTrackEntryAt(UINT aTrackIdx)
{
- if (aTrackIdx >= m_pOrderedTrackArray.GetCount()) {
- return NULL;
- }
- return m_pOrderedTrackArray[aTrackIdx];
+ if (aTrackIdx >= m_pOrderedTrackArray.GetCount()) {
+ return NULL;
+ }
+ return m_pOrderedTrackArray[aTrackIdx];
}
STDMETHODIMP_(UINT) CMatroskaSplitterFilter::GetTrackCount()
{
- return (UINT)m_pTrackEntryMap.GetCount();
+ return (UINT)m_pTrackEntryMap.GetCount();
}
STDMETHODIMP_(BOOL) CMatroskaSplitterFilter::GetTrackInfo(UINT aTrackIdx, struct TrackElement* pStructureToFill)
{
- TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
- if (pTE == NULL) {
- return FALSE;
- }
-
- pStructureToFill->FlagDefault = !!pTE->FlagDefault;
- pStructureToFill->FlagForced = !!pTE->FlagForced;
- pStructureToFill->FlagLacing = !!pTE->FlagLacing;
- strncpy_s(pStructureToFill->Language, pTE->Language, 3);
- if (pStructureToFill->Language[0] == '\0') {
- strncpy_s(pStructureToFill->Language, "eng", 3);
- }
- pStructureToFill->Language[3] = '\0';
- pStructureToFill->MaxCache = (UINT)pTE->MaxCache;
- pStructureToFill->MinCache = (UINT)pTE->MinCache;
- pStructureToFill->Type = (BYTE)pTE->TrackType;
- return TRUE;
+ TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
+ if (pTE == NULL) {
+ return FALSE;
+ }
+
+ pStructureToFill->FlagDefault = !!pTE->FlagDefault;
+ pStructureToFill->FlagForced = !!pTE->FlagForced;
+ pStructureToFill->FlagLacing = !!pTE->FlagLacing;
+ strncpy_s(pStructureToFill->Language, pTE->Language, 3);
+ if (pStructureToFill->Language[0] == '\0') {
+ strncpy_s(pStructureToFill->Language, "eng", 3);
+ }
+ pStructureToFill->Language[3] = '\0';
+ pStructureToFill->MaxCache = (UINT)pTE->MaxCache;
+ pStructureToFill->MinCache = (UINT)pTE->MinCache;
+ pStructureToFill->Type = (BYTE)pTE->TrackType;
+ return TRUE;
}
STDMETHODIMP_(BOOL) CMatroskaSplitterFilter::GetTrackExtendedInfo(UINT aTrackIdx, void* pStructureToFill)
{
- TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
- if (pTE == NULL) {
- return FALSE;
- }
-
- if (pTE->TrackType == TrackEntry::TypeVideo) {
- TrackExtendedInfoVideo* pTEIV = (TrackExtendedInfoVideo*)pStructureToFill;
- pTEIV->AspectRatioType = (BYTE)pTE->v.AspectRatioType;
- pTEIV->DisplayUnit = (BYTE)pTE->v.DisplayUnit;
- pTEIV->DisplayWidth = (UINT)pTE->v.DisplayWidth;
- pTEIV->DisplayHeight = (UINT)pTE->v.DisplayHeight;
- pTEIV->Interlaced = !!pTE->v.FlagInterlaced;
- pTEIV->PixelWidth = (UINT)pTE->v.PixelWidth;
- pTEIV->PixelHeight = (UINT)pTE->v.PixelHeight;
- } else if (pTE->TrackType == TrackEntry::TypeAudio) {
- TrackExtendedInfoAudio* pTEIA = (TrackExtendedInfoAudio*)pStructureToFill;
- pTEIA->BitDepth = (UINT)pTE->a.BitDepth;
- pTEIA->Channels = (UINT)pTE->a.Channels;
- pTEIA->OutputSamplingFrequency = (FLOAT)pTE->a.OutputSamplingFrequency;
- pTEIA->SamplingFreq = (FLOAT)pTE->a.SamplingFrequency;
- } else {
- return FALSE;
- }
-
- return TRUE;
+ TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
+ if (pTE == NULL) {
+ return FALSE;
+ }
+
+ if (pTE->TrackType == TrackEntry::TypeVideo) {
+ TrackExtendedInfoVideo* pTEIV = (TrackExtendedInfoVideo*)pStructureToFill;
+ pTEIV->AspectRatioType = (BYTE)pTE->v.AspectRatioType;
+ pTEIV->DisplayUnit = (BYTE)pTE->v.DisplayUnit;
+ pTEIV->DisplayWidth = (UINT)pTE->v.DisplayWidth;
+ pTEIV->DisplayHeight = (UINT)pTE->v.DisplayHeight;
+ pTEIV->Interlaced = !!pTE->v.FlagInterlaced;
+ pTEIV->PixelWidth = (UINT)pTE->v.PixelWidth;
+ pTEIV->PixelHeight = (UINT)pTE->v.PixelHeight;
+ } else if (pTE->TrackType == TrackEntry::TypeAudio) {
+ TrackExtendedInfoAudio* pTEIA = (TrackExtendedInfoAudio*)pStructureToFill;
+ pTEIA->BitDepth = (UINT)pTE->a.BitDepth;
+ pTEIA->Channels = (UINT)pTE->a.Channels;
+ pTEIA->OutputSamplingFrequency = (FLOAT)pTE->a.OutputSamplingFrequency;
+ pTEIA->SamplingFreq = (FLOAT)pTE->a.SamplingFrequency;
+ } else {
+ return FALSE;
+ }
+
+ return TRUE;
}
STDMETHODIMP_(BSTR) CMatroskaSplitterFilter::GetTrackName(UINT aTrackIdx)
{
- TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
- if (pTE == NULL) {
- return NULL;
- }
- return pTE->Name.AllocSysString();
+ TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
+ if (pTE == NULL) {
+ return NULL;
+ }
+ return pTE->Name.AllocSysString();
}
STDMETHODIMP_(BSTR) CMatroskaSplitterFilter::GetTrackCodecID(UINT aTrackIdx)
{
- TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
- if (pTE == NULL) {
- return NULL;
- }
- return pTE->CodecID.ToString().AllocSysString();
+ TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
+ if (pTE == NULL) {
+ return NULL;
+ }
+ return pTE->CodecID.ToString().AllocSysString();
}
STDMETHODIMP_(BSTR) CMatroskaSplitterFilter::GetTrackCodecName(UINT aTrackIdx)
{
- TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
- if (pTE == NULL) {
- return NULL;
- }
- return pTE->CodecName.AllocSysString();
+ TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
+ if (pTE == NULL) {
+ return NULL;
+ }
+ return pTE->CodecName.AllocSysString();
}
STDMETHODIMP_(BSTR) CMatroskaSplitterFilter::GetTrackCodecInfoURL(UINT aTrackIdx)
{
- TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
- if (pTE == NULL) {
- return NULL;
- }
- return pTE->CodecInfoURL.AllocSysString();
+ TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
+ if (pTE == NULL) {
+ return NULL;
+ }
+ return pTE->CodecInfoURL.AllocSysString();
}
STDMETHODIMP_(BSTR) CMatroskaSplitterFilter::GetTrackCodecDownloadURL(UINT aTrackIdx)
{
- TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
- if (pTE == NULL) {
- return NULL;
- }
- return pTE->CodecDownloadURL.AllocSysString();
+ TrackEntry* pTE = GetTrackEntryAt(aTrackIdx);
+ if (pTE == NULL) {
+ return NULL;
+ }
+ return pTE->CodecDownloadURL.AllocSysString();
}
diff --git a/src/filters/parser/MatroskaSplitter/MatroskaSplitter.h b/src/filters/parser/MatroskaSplitter/MatroskaSplitter.h
index a6843bce8..959e33995 100644
--- a/src/filters/parser/MatroskaSplitter/MatroskaSplitter.h
+++ b/src/filters/parser/MatroskaSplitter/MatroskaSplitter.h
@@ -35,99 +35,99 @@
class MatroskaPacket : public Packet
{
protected:
- int GetDataSize() {
- size_t size = 0;
- POSITION pos = bg->Block.BlockData.GetHeadPosition();
- while (pos) {
- size += bg->Block.BlockData.GetNext(pos)->GetCount();
- }
- return (int)size;
- }
+ int GetDataSize() {
+ size_t size = 0;
+ POSITION pos = bg->Block.BlockData.GetHeadPosition();
+ while (pos) {
+ size += bg->Block.BlockData.GetNext(pos)->GetCount();
+ }
+ return (int)size;
+ }
public:
- CAutoPtr<MatroskaReader::BlockGroup> bg;
+ CAutoPtr<MatroskaReader::BlockGroup> bg;
};
class CMatroskaSplitterOutputPin : public CBaseSplitterOutputPin
{
- HRESULT DeliverBlock(MatroskaPacket* p);
+ HRESULT DeliverBlock(MatroskaPacket* p);
- unsigned int m_nMinCache;
- REFERENCE_TIME m_rtDefaultDuration;
+ unsigned int m_nMinCache;
+ REFERENCE_TIME m_rtDefaultDuration;
- CCritSec m_csQueue;
- CAutoPtrList<MatroskaPacket> m_packets;
- CAtlList<MatroskaPacket*> m_rob;
+ CCritSec m_csQueue;
+ CAutoPtrList<MatroskaPacket> m_packets;
+ CAtlList<MatroskaPacket*> m_rob;
- typedef struct {
- REFERENCE_TIME rtStart, rtStop;
- } timeoverride;
- CAtlList<timeoverride> m_tos;
+ typedef struct {
+ REFERENCE_TIME rtStart, rtStop;
+ } timeoverride;
+ CAtlList<timeoverride> m_tos;
protected:
- HRESULT DeliverPacket(CAutoPtr<Packet> p);
+ HRESULT DeliverPacket(CAutoPtr<Packet> p);
public:
- CMatroskaSplitterOutputPin(
- unsigned int nMinCache, REFERENCE_TIME rtDefaultDuration,
- CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- virtual ~CMatroskaSplitterOutputPin();
+ CMatroskaSplitterOutputPin(
+ unsigned int nMinCache, REFERENCE_TIME rtDefaultDuration,
+ CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ virtual ~CMatroskaSplitterOutputPin();
- HRESULT DeliverEndFlush();
- HRESULT DeliverEndOfStream();
+ HRESULT DeliverEndFlush();
+ HRESULT DeliverEndOfStream();
};
class __declspec(uuid("149D2E01-C32E-4939-80F6-C07B81015A7A"))
- CMatroskaSplitterFilter : public CBaseSplitterFilter, public ITrackInfo
+ CMatroskaSplitterFilter : public CBaseSplitterFilter, public ITrackInfo
{
- void SetupChapters(LPCSTR lng, MatroskaReader::ChapterAtom* parent, int level = 0);
- void InstallFonts();
- void SendVorbisHeaderSample();
+ void SetupChapters(LPCSTR lng, MatroskaReader::ChapterAtom* parent, int level = 0);
+ void InstallFonts();
+ void SendVorbisHeaderSample();
- CAutoPtr<MatroskaReader::CMatroskaNode> m_pSegment, m_pCluster, m_pBlock;
+ CAutoPtr<MatroskaReader::CMatroskaNode> m_pSegment, m_pCluster, m_pBlock;
protected:
- CAutoPtr<MatroskaReader::CMatroskaFile> m_pFile;
- HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
+ CAutoPtr<MatroskaReader::CMatroskaFile> m_pFile;
+ HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
- CAtlMap<DWORD, MatroskaReader::TrackEntry*> m_pTrackEntryMap;
- CAtlArray<MatroskaReader::TrackEntry* > m_pOrderedTrackArray;
- MatroskaReader::TrackEntry* GetTrackEntryAt(UINT aTrackIdx);
+ CAtlMap<DWORD, MatroskaReader::TrackEntry*> m_pTrackEntryMap;
+ CAtlArray<MatroskaReader::TrackEntry* > m_pOrderedTrackArray;
+ MatroskaReader::TrackEntry* GetTrackEntryAt(UINT aTrackIdx);
- bool DemuxInit();
- void DemuxSeek(REFERENCE_TIME rt);
- bool DemuxLoop();
+ bool DemuxInit();
+ void DemuxSeek(REFERENCE_TIME rt);
+ bool DemuxLoop();
public:
- CMatroskaSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
- virtual ~CMatroskaSplitterFilter();
+ CMatroskaSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ virtual ~CMatroskaSplitterFilter();
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // CBaseFilter
+ // CBaseFilter
- STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
+ STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
- // IKeyFrameInfo
+ // IKeyFrameInfo
- STDMETHODIMP GetKeyFrameCount(UINT& nKFs);
- STDMETHODIMP GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
+ STDMETHODIMP GetKeyFrameCount(UINT& nKFs);
+ STDMETHODIMP GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
- // ITrackInfo
+ // 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);
+ 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);
};
class __declspec(uuid("0A68C3B5-9164-4a54-AFAF-995B2FF0E0D4"))
- CMatroskaSourceFilter : public CMatroskaSplitterFilter
+ CMatroskaSourceFilter : public CMatroskaSplitterFilter
{
public:
- CMatroskaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ CMatroskaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
};
diff --git a/src/filters/parser/MpaSplitter/MpaSplitter.cpp b/src/filters/parser/MpaSplitter/MpaSplitter.cpp
index 4a76ee4ac..ae738753d 100644
--- a/src/filters/parser/MpaSplitter/MpaSplitter.cpp
+++ b/src/filters/parser/MpaSplitter/MpaSplitter.cpp
@@ -32,40 +32,40 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG1Audio},
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL}
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG1Audio},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL}
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CMpaSplitterFilter), MpaSplitterName, MERIT_NORMAL+1, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CMpaSourceFilter), MpaSourceName, MERIT_NORMAL+1, 0, NULL, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CMpaSplitterFilter), MpaSplitterName, MERIT_NORMAL + 1, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CMpaSourceFilter), MpaSourceName, MERIT_NORMAL + 1, 0, NULL, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CMpaSplitterFilter>, NULL, &sudFilter[0]},
- {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CMpaSourceFilter>, NULL, &sudFilter[1]},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CMpaSplitterFilter>, NULL, &sudFilter[0]},
+ {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CMpaSourceFilter>, NULL, &sudFilter[1]},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- CAtlList<CString> chkbytes;
- chkbytes.AddTail(_T("0,2,FFE0,FFE0"));
- chkbytes.AddTail(_T("0,10,FFFFFF00000080808080,49443300000000000000"));
- RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_MPEG1Audio, chkbytes, NULL);
+ CAtlList<CString> chkbytes;
+ chkbytes.AddTail(_T("0,2,FFE0,FFE0"));
+ chkbytes.AddTail(_T("0,10,FFFFFF00000080808080,49443300000000000000"));
+ RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_MPEG1Audio, chkbytes, NULL);
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -79,150 +79,150 @@ CFilterApp theApp;
//
CMpaSplitterFilter::CMpaSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CBaseSplitterFilter(NAME("CMpaSplitterFilter"), pUnk, phr, __uuidof(this))
+ : CBaseSplitterFilter(NAME("CMpaSplitterFilter"), pUnk, phr, __uuidof(this))
{
}
STDMETHODIMP CMpaSplitterFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
STDMETHODIMP CMpaSplitterFilter::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
-
- if (m_pName && m_pName[0]==L'M' && m_pName[1]==L'P' && m_pName[2]==L'C') {
- (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
- } else {
- wcscpy_s(pInfo->achName, MpaSourceName);
- }
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+
+ if (m_pName && m_pName[0] == L'M' && m_pName[1] == L'P' && m_pName[2] == L'C') {
+ (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
+ } else {
+ wcscpy_s(pInfo->achName, MpaSourceName);
+ }
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
HRESULT CMpaSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
{
- CheckPointer(pAsyncReader, E_POINTER);
-
- HRESULT hr = E_FAIL;
-
- m_pFile.Free();
-
- m_pFile.Attach(DNew CMpaSplitterFile(pAsyncReader, hr));
- if (!m_pFile) {
- return E_OUTOFMEMORY;
- }
- if (FAILED(hr)) {
- m_pFile.Free();
- return hr;
- }
-
- CAtlArray<CMediaType> mts;
- mts.Add(m_pFile->GetMediaType());
-
- CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CBaseSplitterOutputPin(mts, L"Audio", this, this, &hr));
- AddOutputPin(0, pPinOut);
-
- m_rtNewStart = m_rtCurrent = 0;
- m_rtNewStop = m_rtStop = m_rtDuration = m_pFile->GetDuration();
-
- CStringW str, title;
- if (m_pFile->m_tags.Lookup('TIT2', str)) {
- title = str;
- }
- if (m_pFile->m_tags.Lookup('TYER', str) && !title.IsEmpty() && !str.IsEmpty()) {
- title += L" (" + str + L")";
- }
- if (!title.IsEmpty()) {
- SetProperty(L"TITL", title);
- }
- if (m_pFile->m_tags.Lookup('TPE1', str)) {
- SetProperty(L"AUTH", str);
- }
- if (m_pFile->m_tags.Lookup('TCOP', str)) {
- SetProperty(L"CPYR", str);
- }
- if (m_pFile->m_tags.Lookup('COMM', str)) {
- SetProperty(L"DESC", str);
- }
-
- return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
+ CheckPointer(pAsyncReader, E_POINTER);
+
+ HRESULT hr = E_FAIL;
+
+ m_pFile.Free();
+
+ m_pFile.Attach(DNew CMpaSplitterFile(pAsyncReader, hr));
+ if (!m_pFile) {
+ return E_OUTOFMEMORY;
+ }
+ if (FAILED(hr)) {
+ m_pFile.Free();
+ return hr;
+ }
+
+ CAtlArray<CMediaType> mts;
+ mts.Add(m_pFile->GetMediaType());
+
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CBaseSplitterOutputPin(mts, L"Audio", this, this, &hr));
+ AddOutputPin(0, pPinOut);
+
+ m_rtNewStart = m_rtCurrent = 0;
+ m_rtNewStop = m_rtStop = m_rtDuration = m_pFile->GetDuration();
+
+ CStringW str, title;
+ if (m_pFile->m_tags.Lookup('TIT2', str)) {
+ title = str;
+ }
+ if (m_pFile->m_tags.Lookup('TYER', str) && !title.IsEmpty() && !str.IsEmpty()) {
+ title += L" (" + str + L")";
+ }
+ if (!title.IsEmpty()) {
+ SetProperty(L"TITL", title);
+ }
+ if (m_pFile->m_tags.Lookup('TPE1', str)) {
+ SetProperty(L"AUTH", str);
+ }
+ if (m_pFile->m_tags.Lookup('TCOP', str)) {
+ SetProperty(L"CPYR", str);
+ }
+ if (m_pFile->m_tags.Lookup('COMM', str)) {
+ SetProperty(L"DESC", str);
+ }
+
+ return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
}
STDMETHODIMP CMpaSplitterFilter::GetDuration(LONGLONG* pDuration)
{
- CheckPointer(pDuration, E_POINTER);
- CheckPointer(m_pFile, VFW_E_NOT_CONNECTED);
+ CheckPointer(pDuration, E_POINTER);
+ CheckPointer(m_pFile, VFW_E_NOT_CONNECTED);
- *pDuration = m_pFile->GetDuration();
+ *pDuration = m_pFile->GetDuration();
- return S_OK;
+ return S_OK;
}
bool CMpaSplitterFilter::DemuxInit()
{
- SetThreadName((DWORD)-1, "CMpaSplitterFilter");
- if (!m_pFile) {
- return false;
- }
+ SetThreadName((DWORD) - 1, "CMpaSplitterFilter");
+ if (!m_pFile) {
+ return false;
+ }
- // TODO
+ // TODO
- return true;
+ return true;
}
void CMpaSplitterFilter::DemuxSeek(REFERENCE_TIME rt)
{
- __int64 startpos = m_pFile->GetStartPos();
- __int64 endpos = m_pFile->GetEndPos();
+ __int64 startpos = m_pFile->GetStartPos();
+ __int64 endpos = m_pFile->GetEndPos();
- if (rt <= 0 || m_pFile->GetDuration() <= 0) {
- m_pFile->Seek(startpos);
- m_rtStart = 0;
- } else {
- m_pFile->Seek(startpos + (__int64)((1.0 * rt / m_pFile->GetDuration()) * (endpos - startpos)));
- m_rtStart = rt;
- }
+ if (rt <= 0 || m_pFile->GetDuration() <= 0) {
+ m_pFile->Seek(startpos);
+ m_rtStart = 0;
+ } else {
+ m_pFile->Seek(startpos + (__int64)((1.0 * rt / m_pFile->GetDuration()) * (endpos - startpos)));
+ m_rtStart = rt;
+ }
}
bool CMpaSplitterFilter::DemuxLoop()
{
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- int FrameSize;
- REFERENCE_TIME rtDuration;
+ int FrameSize;
+ REFERENCE_TIME rtDuration;
- while (SUCCEEDED(hr) && !CheckRequest(NULL) && m_pFile->GetPos() < m_pFile->GetEndPos() - 9) {
- if (!m_pFile->Sync(FrameSize, rtDuration)) {
- Sleep(1);
- continue;
- }
+ while (SUCCEEDED(hr) && !CheckRequest(NULL) && m_pFile->GetPos() < m_pFile->GetEndPos() - 9) {
+ if (!m_pFile->Sync(FrameSize, rtDuration)) {
+ Sleep(1);
+ continue;
+ }
- CAutoPtr<Packet> p(DNew Packet());
- p->SetCount(FrameSize);
- m_pFile->ByteRead(p->GetData(), FrameSize);
+ CAutoPtr<Packet> p(DNew Packet());
+ p->SetCount(FrameSize);
+ m_pFile->ByteRead(p->GetData(), FrameSize);
- p->TrackNumber = 0;
- p->rtStart = m_rtStart;
- p->rtStop = m_rtStart + rtDuration;
- p->bSyncPoint = TRUE;
+ p->TrackNumber = 0;
+ p->rtStart = m_rtStart;
+ p->rtStop = m_rtStart + rtDuration;
+ p->bSyncPoint = TRUE;
- hr = DeliverPacket(p);
+ hr = DeliverPacket(p);
- m_rtStart += rtDuration;
- }
+ m_rtStart += rtDuration;
+ }
- return true;
+ return true;
}
//
@@ -230,8 +230,8 @@ bool CMpaSplitterFilter::DemuxLoop()
//
CMpaSourceFilter::CMpaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CMpaSplitterFilter(pUnk, phr)
+ : CMpaSplitterFilter(pUnk, phr)
{
- m_clsid = __uuidof(this);
- m_pInput.Free();
+ m_clsid = __uuidof(this);
+ m_pInput.Free();
}
diff --git a/src/filters/parser/MpaSplitter/MpaSplitter.h b/src/filters/parser/MpaSplitter/MpaSplitter.h
index 62e22103e..3f6e6ddbc 100644
--- a/src/filters/parser/MpaSplitter/MpaSplitter.h
+++ b/src/filters/parser/MpaSplitter/MpaSplitter.h
@@ -30,35 +30,35 @@
#define MpaSourceName L"MPC Mpa Source"
class __declspec(uuid("0E9D4BF7-CBCB-46C7-BD80-4EF223A3DC2B"))
- CMpaSplitterFilter : public CBaseSplitterFilter
+ CMpaSplitterFilter : public CBaseSplitterFilter
{
- REFERENCE_TIME m_rtStart;
+ REFERENCE_TIME m_rtStart;
protected:
- CAutoPtr<CMpaSplitterFile> m_pFile;
- HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
+ CAutoPtr<CMpaSplitterFile> m_pFile;
+ HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
- STDMETHODIMP GetDuration(LONGLONG* pDuration);
+ STDMETHODIMP GetDuration(LONGLONG* pDuration);
- bool DemuxInit();
- void DemuxSeek(REFERENCE_TIME rt);
- bool DemuxLoop();
+ bool DemuxInit();
+ void DemuxSeek(REFERENCE_TIME rt);
+ bool DemuxLoop();
public:
- CMpaSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ CMpaSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // CBaseFilter
+ // CBaseFilter
- STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
+ STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
};
class __declspec(uuid("59A0DB73-0287-4C9A-9D3C-8CFF39F8E5DB"))
- CMpaSourceFilter : public CMpaSplitterFilter
+ CMpaSourceFilter : public CMpaSplitterFilter
{
public:
- CMpaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ CMpaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
}; \ No newline at end of file
diff --git a/src/filters/parser/MpaSplitter/MpaSplitterFile.cpp b/src/filters/parser/MpaSplitter/MpaSplitterFile.cpp
index 912050406..a05a880b3 100644
--- a/src/filters/parser/MpaSplitter/MpaSplitterFile.cpp
+++ b/src/filters/parser/MpaSplitter/MpaSplitterFile.cpp
@@ -31,402 +31,403 @@
#include <moreuuids.h>
#define FRAMES_FLAG 0x0001
-#define MPA_HEADER_SIZE 4 // MPEG-Audio Header Size
+#define MPA_HEADER_SIZE 4 // MPEG-Audio Header Size
//
static const LPCTSTR s_genre[] = {
- _T("Blues"), _T("Classic Rock"), _T("Country"), _T("Dance"),
- _T("Disco"), _T("Funk"), _T("Grunge"), _T("Hip-Hop"),
- _T("Jazz"), _T("Metal"), _T("New Age"), _T("Oldies"),
- _T("Other"), _T("Pop"), _T("R&B"), _T("Rap"),
- _T("Reggae"), _T("Rock"), _T("Techno"), _T("Industrial"),
- _T("Alternative"), _T("Ska"), _T("Death Metal"), _T("Pranks"),
- _T("Soundtrack"), _T("Euro-Techno"), _T("Ambient"), _T("Trip-Hop"),
- _T("Vocal"), _T("Jazz+Funk"), _T("Fusion"), _T("Trance"),
- _T("Classical"), _T("Instrumental"), _T("Acid"), _T("House"),
- _T("Game"), _T("Sound Clip"), _T("Gospel"), _T("Noise"),
- _T("Alternative Rock"), _T("Bass"), _T("Soul"), _T("Punk"),
- _T("Space"), _T("Meditative"), _T("Instrumental Pop"), _T("Instrumental Rock"),
- _T("Ethnic"), _T("Gothic"), _T("Darkwave"), _T("Techno-Industrial"),
- _T("Electronic"), _T("Pop-Folk"), _T("Eurodance"), _T("Dream"),
- _T("Southern Rock"), _T("Comedy"), _T("Cult"), _T("Gangsta"),
- _T("Top 40"), _T("Christian Rap"), _T("Pop/Funk"), _T("Jungle"),
- _T("Native US"), _T("Cabaret"), _T("New Wave"), _T("Psychadelic"),
- _T("Rave"), _T("Showtunes"), _T("Trailer"), _T("Lo-Fi"),
- _T("Tribal"), _T("Acid Punk"), _T("Acid Jazz"), _T("Polka"),
- _T("Retro"), _T("Musical"), _T("Rock & Roll"), _T("Hard Rock"),
- _T("Folk"), _T("Folk-Rock"), _T("National Folk"), _T("Swing"),
- _T("Fast Fusion"), _T("Bebob"), _T("Latin"), _T("Revival"),
- _T("Celtic"), _T("Bluegrass"), _T("Avantgarde"), _T("Gothic Rock"),
- _T("Progressive Rock"), _T("Psychedelic Rock"), _T("Symphonic Rock"), _T("Slow Rock"),
- _T("Big Band"), _T("Chorus"), _T("Easy Listening"), _T("Acoustic"),
- _T("Humour"), _T("Speech"), _T("Chanson"), _T("Opera"),
- _T("Chamber Music"), _T("Sonata"), _T("Symphony"), _T("Booty Bass"),
- _T("Primus"), _T("Porn Groove"), _T("Satire"), _T("Slow Jam"),
- _T("Club"), _T("Tango"), _T("Samba"), _T("Folklore"),
- _T("Ballad"), _T("Power Ballad"), _T("Rhytmic Soul"), _T("Freestyle"),
- _T("Duet"), _T("Punk Rock"), _T("Drum Solo"), _T("Acapella"),
- _T("Euro-House"), _T("Dance Hall"), _T("Goa"), _T("Drum & Bass"),
- _T("Club-House"), _T("Hardcore"), _T("Terror"), _T("Indie"),
- _T("BritPop"), _T("Negerpunk"), _T("Polsk Punk"), _T("Beat"),
- _T("Christian Gangsta"), _T("Heavy Metal"), _T("Black Metal"),
- _T("Crossover"), _T("Contemporary C"), _T("Christian Rock"), _T("Merengue"), _T("Salsa"),
- _T("Thrash Metal"), _T("Anime"), _T("JPop"), _T("SynthPop"),
+ _T("Blues"), _T("Classic Rock"), _T("Country"), _T("Dance"),
+ _T("Disco"), _T("Funk"), _T("Grunge"), _T("Hip-Hop"),
+ _T("Jazz"), _T("Metal"), _T("New Age"), _T("Oldies"),
+ _T("Other"), _T("Pop"), _T("R&B"), _T("Rap"),
+ _T("Reggae"), _T("Rock"), _T("Techno"), _T("Industrial"),
+ _T("Alternative"), _T("Ska"), _T("Death Metal"), _T("Pranks"),
+ _T("Soundtrack"), _T("Euro-Techno"), _T("Ambient"), _T("Trip-Hop"),
+ _T("Vocal"), _T("Jazz+Funk"), _T("Fusion"), _T("Trance"),
+ _T("Classical"), _T("Instrumental"), _T("Acid"), _T("House"),
+ _T("Game"), _T("Sound Clip"), _T("Gospel"), _T("Noise"),
+ _T("Alternative Rock"), _T("Bass"), _T("Soul"), _T("Punk"),
+ _T("Space"), _T("Meditative"), _T("Instrumental Pop"), _T("Instrumental Rock"),
+ _T("Ethnic"), _T("Gothic"), _T("Darkwave"), _T("Techno-Industrial"),
+ _T("Electronic"), _T("Pop-Folk"), _T("Eurodance"), _T("Dream"),
+ _T("Southern Rock"), _T("Comedy"), _T("Cult"), _T("Gangsta"),
+ _T("Top 40"), _T("Christian Rap"), _T("Pop/Funk"), _T("Jungle"),
+ _T("Native US"), _T("Cabaret"), _T("New Wave"), _T("Psychadelic"),
+ _T("Rave"), _T("Showtunes"), _T("Trailer"), _T("Lo-Fi"),
+ _T("Tribal"), _T("Acid Punk"), _T("Acid Jazz"), _T("Polka"),
+ _T("Retro"), _T("Musical"), _T("Rock & Roll"), _T("Hard Rock"),
+ _T("Folk"), _T("Folk-Rock"), _T("National Folk"), _T("Swing"),
+ _T("Fast Fusion"), _T("Bebob"), _T("Latin"), _T("Revival"),
+ _T("Celtic"), _T("Bluegrass"), _T("Avantgarde"), _T("Gothic Rock"),
+ _T("Progressive Rock"), _T("Psychedelic Rock"), _T("Symphonic Rock"), _T("Slow Rock"),
+ _T("Big Band"), _T("Chorus"), _T("Easy Listening"), _T("Acoustic"),
+ _T("Humour"), _T("Speech"), _T("Chanson"), _T("Opera"),
+ _T("Chamber Music"), _T("Sonata"), _T("Symphony"), _T("Booty Bass"),
+ _T("Primus"), _T("Porn Groove"), _T("Satire"), _T("Slow Jam"),
+ _T("Club"), _T("Tango"), _T("Samba"), _T("Folklore"),
+ _T("Ballad"), _T("Power Ballad"), _T("Rhytmic Soul"), _T("Freestyle"),
+ _T("Duet"), _T("Punk Rock"), _T("Drum Solo"), _T("Acapella"),
+ _T("Euro-House"), _T("Dance Hall"), _T("Goa"), _T("Drum & Bass"),
+ _T("Club-House"), _T("Hardcore"), _T("Terror"), _T("Indie"),
+ _T("BritPop"), _T("Negerpunk"), _T("Polsk Punk"), _T("Beat"),
+ _T("Christian Gangsta"), _T("Heavy Metal"), _T("Black Metal"),
+ _T("Crossover"), _T("Contemporary C"), _T("Christian Rock"), _T("Merengue"), _T("Salsa"),
+ _T("Thrash Metal"), _T("Anime"), _T("JPop"), _T("SynthPop"),
};
//
CMpaSplitterFile::CMpaSplitterFile(IAsyncReader* pAsyncReader, HRESULT& hr)
- : CBaseSplitterFileEx(pAsyncReader, hr, DEFAULT_CACHE_LENGTH, false)
- , m_mode(none)
- , m_rtDuration(0)
- , m_startpos(0)
- , m_endpos(0)
- , m_totalbps(0)
- , m_bIsVBR(false)
+ : CBaseSplitterFileEx(pAsyncReader, hr, DEFAULT_CACHE_LENGTH, false)
+ , m_mode(none)
+ , m_rtDuration(0)
+ , m_startpos(0)
+ , m_endpos(0)
+ , m_totalbps(0)
+ , m_bIsVBR(false)
{
- if (SUCCEEDED(hr)) {
- hr = Init();
- }
+ if (SUCCEEDED(hr)) {
+ hr = Init();
+ }
}
HRESULT CMpaSplitterFile::Init()
{
- m_startpos = 0;
- m_endpos = GetLength();
-
- Seek(0);
-
- // some files can be determined as Mpeg Audio
- if ((BitRead(24, true) == 0x000001) || // ?
- (BitRead(32, true) == 'RIFF') || // skip AVI and WAV files
- (BitRead(24, true) == 'AMV')) { // skip MTV files (.amv .mtv)
- return E_FAIL;
- }
-
- if (m_endpos > 128 && IsRandomAccess()) {
- Seek(m_endpos - 128);
-
- if (BitRead(24) == 'TAG') {
- m_endpos -= 128;
-
- CStringA str;
-
- // title
- ByteRead((BYTE*)str.GetBufferSetLength(30), 30);
- m_tags['TIT2'] = CStringW(str).Trim();
-
- // artist
- ByteRead((BYTE*)str.GetBufferSetLength(30), 30);
- m_tags['TPE1'] = CStringW(str).Trim();
-
- // album
- ByteRead((BYTE*)str.GetBufferSetLength(30), 30);
- m_tags['TALB'] = CStringW(str).Trim();
-
- // year
- ByteRead((BYTE*)str.GetBufferSetLength(4), 4);
- m_tags['TYER'] = CStringW(str).Trim();
-
- // comment
- ByteRead((BYTE*)str.GetBufferSetLength(30), 30);
- m_tags['COMM'] = CStringW(str).Trim();
-
- // track
- LPCSTR s = str;
- if (s[28] == 0 && s[29] != 0) {
- m_tags['TRCK'].Format(L"%d", s[29]);
- }
-
- // genre
- BYTE genre = (BYTE)BitRead(8);
- if (genre < _countof(s_genre)) {
- m_tags['TCON'] = CStringW(s_genre[genre]);
- }
- }
- }
-
- Seek(0);
-
- bool MP3_find = false;
-
- while (BitRead(24, true) == 'ID3') {
- MP3_find = true;
-
- BitRead(24);
-
- BYTE major = (BYTE)BitRead(8);
- BYTE revision = (BYTE)BitRead(8);
- UNREFERENCED_PARAMETER(revision);
-
- BYTE flags = (BYTE)BitRead(8);
- UNREFERENCED_PARAMETER(flags);
- DWORD size = 0;
- if (BitRead(1) != 0) {
- return E_FAIL;
- }
- size |= BitRead(7) << 21;
- if (BitRead(1) != 0) {
- return E_FAIL;
- }
- size |= BitRead(7) << 14;
- if (BitRead(1) != 0) {
- return E_FAIL;
- }
- size |= BitRead(7) << 7;
- if (BitRead(1) != 0) {
- return E_FAIL;
- }
- size |= BitRead(7);
-
- m_startpos = GetPos() + size;
-
- // TODO: read extended header
-
- if (major <= 4) {
- __int64 pos = GetPos();
-
- while (pos < m_startpos) {
- Seek(pos);
-
- DWORD tag = (DWORD)BitRead(32);
- DWORD size = 0;
- size |= BitRead(8) << 24;
- size |= BitRead(8) << 16;
- size |= BitRead(8) << 8;
- size |= BitRead(8);
- WORD flags = (WORD)BitRead(16);
- UNREFERENCED_PARAMETER(flags);
-
- pos += 4+4+2+size;
-
- if (!size || pos >= m_startpos) {
- break;
- }
-
- if (tag == 'TIT2'
- || tag == 'TPE1'
- || tag == 'TALB'
- || tag == 'TYER'
- || tag == 'COMM'
- || tag == 'TRCK') {
- BYTE encoding = (BYTE)BitRead(8);
- size--;
-
- WORD bom = (WORD)BitRead(16, true);
-
- CStringA str;
- CStringW wstr;
-
- if (encoding > 0 && size >= 2 && bom == 0xfffe) {
- BitRead(16);
- size = (size - 2) / 2;
- ByteRead((BYTE*)wstr.GetBufferSetLength(size), size*2);
- m_tags[tag] = wstr.Trim();
- } else if (encoding > 0 && size >= 2 && bom == 0xfeff) {
- BitRead(16);
- size = (size - 2) / 2;
- ByteRead((BYTE*)wstr.GetBufferSetLength(size), size*2);
- for (int i = 0, j = wstr.GetLength(); i < j; i++) {
- wstr.SetAt(i, (wstr[i]<<8)|(wstr[i]>>8));
- }
- m_tags[tag] = wstr.Trim();
- } else {
- ByteRead((BYTE*)str.GetBufferSetLength(size), size);
- m_tags[tag] = (encoding > 0 ? UTF8To16(str) : CStringW(str)).Trim();
- }
- }
- }
- }
-
- Seek(m_startpos);
-
- for (int i = 0; i < (1<<20) && m_startpos < m_endpos && BitRead(8, true) == 0; i++) {
- BitRead(8), m_startpos++;
- }
- }
-
- int searchlen = 0;
- __int64 startpos = 0;
- __int64 syncpos = 0;
-
- __int64 startpos_mp3 = m_startpos;
- while (m_mode == none) {
- if (!MP3_find && GetPos() >= 2048) {
- break;
- }
- searchlen = (int)min(m_endpos - startpos_mp3, 512);
- Seek(startpos_mp3);
-
- // If we fail to see sync bytes, we reposition here and search again
- syncpos = startpos_mp3 + searchlen;
-
- // Check for a valid MPA header
- if (Read(m_mpahdr, searchlen, true, &m_mt)) {
- m_mode = mpa;
-
- syncpos = GetPos();
- startpos = syncpos - 4;
-
- // make sure the first frame is followed by another of the same kind (validates m_mpahdr basically)
- Seek(startpos + m_mpahdr.FrameSize);
- if (!Sync(4)) {
- m_mode = none;
- } else {
- break;
- }
- }
-
- // If we have enough room to search for a valid header, then skip ahead and try again
- if (m_endpos - syncpos >= 8) {
- startpos_mp3 = syncpos;
- } else {
- break;
- }
- }
-
- searchlen = (int)min(m_endpos - m_startpos, m_startpos > 0 ? 512 : 7);
- Seek(m_startpos);
-
- if (m_mode == none && Read(m_aachdr, searchlen, &m_mt)) {
- m_mode = mp4a;
-
- startpos = GetPos() - (m_aachdr.fcrc?7:9);
-
- // make sure the first frame is followed by another of the same kind (validates m_aachdr basically)
- Seek(startpos + m_aachdr.aac_frame_length);
- if (!Sync(9)) {
- m_mode = none;
- }
- }
-
- if (m_mode == none) {
- return E_FAIL;
- }
-
- m_startpos = startpos;
-
- if (m_mode == mpa) {
- DWORD m_dwFrames = 0; // total number of frames
- Seek(m_startpos + MPA_HEADER_SIZE + 32);
- if (BitRead(32, true) == 'Xing' || BitRead(32, true) == 'Info') {
- BitRead(32); // Skip ID tag
- DWORD dwFlags = (DWORD)BitRead(32);
- // extract total number of frames in file
- if (dwFlags & FRAMES_FLAG)
- m_dwFrames = (DWORD)BitRead(32);
-
- } else if (BitRead(32, true) == 'VBRI') {
- BitRead(32); // Skip ID tag
- // extract all fields from header (all mandatory)
- BitRead(16); // version
- BitRead(16); // delay
- BitRead(16); // quality
- BitRead(32); // bytes
- m_dwFrames = (DWORD)BitRead(32); // extract total number of frames in file
- }
-
- if (m_dwFrames) {
-
- bool l3ext = m_mpahdr.layer == 3 && !(m_mpahdr.version&1);
- DWORD m_dwSamplesPerFrame = m_mpahdr.layer == 1 ? 384 : l3ext ? 576 : 1152;
-
- m_bIsVBR = true;
- m_rtDuration = 10000000i64 * (m_dwFrames * m_dwSamplesPerFrame / m_mpahdr.nSamplesPerSec);
- }
- }
-
- Seek(m_startpos);
-
- int FrameSize;
- REFERENCE_TIME rtFrameDur, rtPrevDur = -1;
- clock_t start = clock();
- int i = 0;
- while (Sync(FrameSize, rtFrameDur) && (clock() - start) < CLOCKS_PER_SEC) {
- TRACE(_T("%I64d\n"), m_rtDuration);
- Seek(GetPos() + FrameSize);
- i = rtPrevDur == m_rtDuration ? i+1 : 0;
- if (i == 10) {
- break;
- }
- rtPrevDur = m_rtDuration;
- }
-
- return S_OK;
+ m_startpos = 0;
+ m_endpos = GetLength();
+
+ Seek(0);
+
+ // some files can be determined as Mpeg Audio
+ if ((BitRead(24, true) == 0x000001) || // ?
+ (BitRead(32, true) == 'RIFF') || // skip AVI and WAV files
+ (BitRead(24, true) == 'AMV')) { // skip MTV files (.amv .mtv)
+ return E_FAIL;
+ }
+
+ if (m_endpos > 128 && IsRandomAccess()) {
+ Seek(m_endpos - 128);
+
+ if (BitRead(24) == 'TAG') {
+ m_endpos -= 128;
+
+ CStringA str;
+
+ // title
+ ByteRead((BYTE*)str.GetBufferSetLength(30), 30);
+ m_tags['TIT2'] = CStringW(str).Trim();
+
+ // artist
+ ByteRead((BYTE*)str.GetBufferSetLength(30), 30);
+ m_tags['TPE1'] = CStringW(str).Trim();
+
+ // album
+ ByteRead((BYTE*)str.GetBufferSetLength(30), 30);
+ m_tags['TALB'] = CStringW(str).Trim();
+
+ // year
+ ByteRead((BYTE*)str.GetBufferSetLength(4), 4);
+ m_tags['TYER'] = CStringW(str).Trim();
+
+ // comment
+ ByteRead((BYTE*)str.GetBufferSetLength(30), 30);
+ m_tags['COMM'] = CStringW(str).Trim();
+
+ // track
+ LPCSTR s = str;
+ if (s[28] == 0 && s[29] != 0) {
+ m_tags['TRCK'].Format(L"%d", s[29]);
+ }
+
+ // genre
+ BYTE genre = (BYTE)BitRead(8);
+ if (genre < _countof(s_genre)) {
+ m_tags['TCON'] = CStringW(s_genre[genre]);
+ }
+ }
+ }
+
+ Seek(0);
+
+ bool MP3_find = false;
+
+ while (BitRead(24, true) == 'ID3') {
+ MP3_find = true;
+
+ BitRead(24);
+
+ BYTE major = (BYTE)BitRead(8);
+ BYTE revision = (BYTE)BitRead(8);
+ UNREFERENCED_PARAMETER(revision);
+
+ BYTE flags = (BYTE)BitRead(8);
+ UNREFERENCED_PARAMETER(flags);
+ DWORD size = 0;
+ if (BitRead(1) != 0) {
+ return E_FAIL;
+ }
+ size |= BitRead(7) << 21;
+ if (BitRead(1) != 0) {
+ return E_FAIL;
+ }
+ size |= BitRead(7) << 14;
+ if (BitRead(1) != 0) {
+ return E_FAIL;
+ }
+ size |= BitRead(7) << 7;
+ if (BitRead(1) != 0) {
+ return E_FAIL;
+ }
+ size |= BitRead(7);
+
+ m_startpos = GetPos() + size;
+
+ // TODO: read extended header
+
+ if (major <= 4) {
+ __int64 pos = GetPos();
+
+ while (pos < m_startpos) {
+ Seek(pos);
+
+ DWORD tag = (DWORD)BitRead(32);
+ DWORD size = 0;
+ size |= BitRead(8) << 24;
+ size |= BitRead(8) << 16;
+ size |= BitRead(8) << 8;
+ size |= BitRead(8);
+ WORD flags = (WORD)BitRead(16);
+ UNREFERENCED_PARAMETER(flags);
+
+ pos += 4 + 4 + 2 + size;
+
+ if (!size || pos >= m_startpos) {
+ break;
+ }
+
+ if (tag == 'TIT2'
+ || tag == 'TPE1'
+ || tag == 'TALB'
+ || tag == 'TYER'
+ || tag == 'COMM'
+ || tag == 'TRCK') {
+ BYTE encoding = (BYTE)BitRead(8);
+ size--;
+
+ WORD bom = (WORD)BitRead(16, true);
+
+ CStringA str;
+ CStringW wstr;
+
+ if (encoding > 0 && size >= 2 && bom == 0xfffe) {
+ BitRead(16);
+ size = (size - 2) / 2;
+ ByteRead((BYTE*)wstr.GetBufferSetLength(size), size * 2);
+ m_tags[tag] = wstr.Trim();
+ } else if (encoding > 0 && size >= 2 && bom == 0xfeff) {
+ BitRead(16);
+ size = (size - 2) / 2;
+ ByteRead((BYTE*)wstr.GetBufferSetLength(size), size * 2);
+ for (int i = 0, j = wstr.GetLength(); i < j; i++) {
+ wstr.SetAt(i, (wstr[i] << 8) | (wstr[i] >> 8));
+ }
+ m_tags[tag] = wstr.Trim();
+ } else {
+ ByteRead((BYTE*)str.GetBufferSetLength(size), size);
+ m_tags[tag] = (encoding > 0 ? UTF8To16(str) : CStringW(str)).Trim();
+ }
+ }
+ }
+ }
+
+ Seek(m_startpos);
+
+ for (int i = 0; i < (1 << 20) && m_startpos < m_endpos && BitRead(8, true) == 0; i++) {
+ BitRead(8), m_startpos++;
+ }
+ }
+
+ int searchlen = 0;
+ __int64 startpos = 0;
+ __int64 syncpos = 0;
+
+ __int64 startpos_mp3 = m_startpos;
+ while (m_mode == none) {
+ if (!MP3_find && GetPos() >= 2048) {
+ break;
+ }
+ searchlen = (int)min(m_endpos - startpos_mp3, 512);
+ Seek(startpos_mp3);
+
+ // If we fail to see sync bytes, we reposition here and search again
+ syncpos = startpos_mp3 + searchlen;
+
+ // Check for a valid MPA header
+ if (Read(m_mpahdr, searchlen, true, &m_mt)) {
+ m_mode = mpa;
+
+ syncpos = GetPos();
+ startpos = syncpos - 4;
+
+ // make sure the first frame is followed by another of the same kind (validates m_mpahdr basically)
+ Seek(startpos + m_mpahdr.FrameSize);
+ if (!Sync(4)) {
+ m_mode = none;
+ } else {
+ break;
+ }
+ }
+
+ // If we have enough room to search for a valid header, then skip ahead and try again
+ if (m_endpos - syncpos >= 8) {
+ startpos_mp3 = syncpos;
+ } else {
+ break;
+ }
+ }
+
+ searchlen = (int)min(m_endpos - m_startpos, m_startpos > 0 ? 512 : 7);
+ Seek(m_startpos);
+
+ if (m_mode == none && Read(m_aachdr, searchlen, &m_mt)) {
+ m_mode = mp4a;
+
+ startpos = GetPos() - (m_aachdr.fcrc ? 7 : 9);
+
+ // make sure the first frame is followed by another of the same kind (validates m_aachdr basically)
+ Seek(startpos + m_aachdr.aac_frame_length);
+ if (!Sync(9)) {
+ m_mode = none;
+ }
+ }
+
+ if (m_mode == none) {
+ return E_FAIL;
+ }
+
+ m_startpos = startpos;
+
+ if (m_mode == mpa) {
+ DWORD m_dwFrames = 0; // total number of frames
+ Seek(m_startpos + MPA_HEADER_SIZE + 32);
+ if (BitRead(32, true) == 'Xing' || BitRead(32, true) == 'Info') {
+ BitRead(32); // Skip ID tag
+ DWORD dwFlags = (DWORD)BitRead(32);
+ // extract total number of frames in file
+ if (dwFlags & FRAMES_FLAG) {
+ m_dwFrames = (DWORD)BitRead(32);
+ }
+
+ } else if (BitRead(32, true) == 'VBRI') {
+ BitRead(32); // Skip ID tag
+ // extract all fields from header (all mandatory)
+ BitRead(16); // version
+ BitRead(16); // delay
+ BitRead(16); // quality
+ BitRead(32); // bytes
+ m_dwFrames = (DWORD)BitRead(32); // extract total number of frames in file
+ }
+
+ if (m_dwFrames) {
+
+ bool l3ext = m_mpahdr.layer == 3 && !(m_mpahdr.version & 1);
+ DWORD m_dwSamplesPerFrame = m_mpahdr.layer == 1 ? 384 : l3ext ? 576 : 1152;
+
+ m_bIsVBR = true;
+ m_rtDuration = 10000000i64 * (m_dwFrames * m_dwSamplesPerFrame / m_mpahdr.nSamplesPerSec);
+ }
+ }
+
+ Seek(m_startpos);
+
+ int FrameSize;
+ REFERENCE_TIME rtFrameDur, rtPrevDur = -1;
+ clock_t start = clock();
+ int i = 0;
+ while (Sync(FrameSize, rtFrameDur) && (clock() - start) < CLOCKS_PER_SEC) {
+ TRACE(_T("%I64d\n"), m_rtDuration);
+ Seek(GetPos() + FrameSize);
+ i = rtPrevDur == m_rtDuration ? i + 1 : 0;
+ if (i == 10) {
+ break;
+ }
+ rtPrevDur = m_rtDuration;
+ }
+
+ return S_OK;
}
bool CMpaSplitterFile::Sync(int limit)
{
- int FrameSize;
- REFERENCE_TIME rtDuration;
- return Sync(FrameSize, rtDuration, limit);
+ int FrameSize;
+ REFERENCE_TIME rtDuration;
+ return Sync(FrameSize, rtDuration, limit);
}
bool CMpaSplitterFile::Sync(int& FrameSize, REFERENCE_TIME& rtDuration, int limit)
{
- __int64 endpos = min(m_endpos, GetPos() + limit);
-
- if (m_mode == mpa) {
- while (GetPos() <= endpos - 4) {
- mpahdr h;
-
- if (Read(h, (int)(endpos - GetPos()), true)) {
- if (m_mpahdr.version == h.version
- && m_mpahdr.layer == h.layer
- && m_mpahdr.channels == h.channels) {
- Seek(GetPos() - 4);
- AdjustDuration(h.nBytesPerSec);
-
- FrameSize = h.FrameSize;
- rtDuration = h.rtDuration;
-
- return true;
- }
- } else {
- break;
- }
- }
- } else if (m_mode == mp4a) {
- while (GetPos() <= endpos - 9) {
- aachdr h;
-
- if (Read(h, (int)(endpos - GetPos()))) {
- if (m_aachdr.version == h.version
- && m_aachdr.layer == h.layer
- && m_aachdr.channels == h.channels) {
- Seek(GetPos() - (h.fcrc?7:9));
- AdjustDuration(h.nBytesPerSec);
- Seek(GetPos() + (h.fcrc?7:9));
-
- FrameSize = h.FrameSize;
- rtDuration = h.rtDuration;
-
- return true;
- }
- } else {
- break;
- }
- }
- }
-
- return false;
+ __int64 endpos = min(m_endpos, GetPos() + limit);
+
+ if (m_mode == mpa) {
+ while (GetPos() <= endpos - 4) {
+ mpahdr h;
+
+ if (Read(h, (int)(endpos - GetPos()), true)) {
+ if (m_mpahdr.version == h.version
+ && m_mpahdr.layer == h.layer
+ && m_mpahdr.channels == h.channels) {
+ Seek(GetPos() - 4);
+ AdjustDuration(h.nBytesPerSec);
+
+ FrameSize = h.FrameSize;
+ rtDuration = h.rtDuration;
+
+ return true;
+ }
+ } else {
+ break;
+ }
+ }
+ } else if (m_mode == mp4a) {
+ while (GetPos() <= endpos - 9) {
+ aachdr h;
+
+ if (Read(h, (int)(endpos - GetPos()))) {
+ if (m_aachdr.version == h.version
+ && m_aachdr.layer == h.layer
+ && m_aachdr.channels == h.channels) {
+ Seek(GetPos() - (h.fcrc ? 7 : 9));
+ AdjustDuration(h.nBytesPerSec);
+ Seek(GetPos() + (h.fcrc ? 7 : 9));
+
+ FrameSize = h.FrameSize;
+ rtDuration = h.rtDuration;
+
+ return true;
+ }
+ } else {
+ break;
+ }
+ }
+ }
+
+ return false;
}
void CMpaSplitterFile::AdjustDuration(int nBytesPerSec)
{
- ASSERT(nBytesPerSec);
-
- if (!m_bIsVBR) {
- int rValue;
- if (!m_pos2bps.Lookup(GetPos(), rValue)) {
- m_totalbps += nBytesPerSec;
- if (!m_totalbps) {
- return;
- }
- m_pos2bps.SetAt(GetPos(), nBytesPerSec);
- __int64 avgbps = m_totalbps / m_pos2bps.GetCount();
- m_rtDuration = 10000000i64 * (m_endpos - m_startpos) / avgbps;
- }
- }
+ ASSERT(nBytesPerSec);
+
+ if (!m_bIsVBR) {
+ int rValue;
+ if (!m_pos2bps.Lookup(GetPos(), rValue)) {
+ m_totalbps += nBytesPerSec;
+ if (!m_totalbps) {
+ return;
+ }
+ m_pos2bps.SetAt(GetPos(), nBytesPerSec);
+ __int64 avgbps = m_totalbps / m_pos2bps.GetCount();
+ m_rtDuration = 10000000i64 * (m_endpos - m_startpos) / avgbps;
+ }
+ }
}
diff --git a/src/filters/parser/MpaSplitter/MpaSplitterFile.h b/src/filters/parser/MpaSplitter/MpaSplitterFile.h
index 3870090e7..31cc43844 100644
--- a/src/filters/parser/MpaSplitter/MpaSplitterFile.h
+++ b/src/filters/parser/MpaSplitter/MpaSplitterFile.h
@@ -27,42 +27,42 @@
class CMpaSplitterFile : public CBaseSplitterFileEx
{
- CMediaType m_mt;
- REFERENCE_TIME m_rtDuration;
+ CMediaType m_mt;
+ REFERENCE_TIME m_rtDuration;
- enum {none, mpa, mp4a} m_mode;
+ enum {none, mpa, mp4a} m_mode;
- mpahdr m_mpahdr;
- aachdr m_aachdr;
- __int64 m_startpos, m_endpos;
+ mpahdr m_mpahdr;
+ aachdr m_aachdr;
+ __int64 m_startpos, m_endpos;
- __int64 m_totalbps;
- CRBMap<__int64, int> m_pos2bps;
+ __int64 m_totalbps;
+ CRBMap<__int64, int> m_pos2bps;
- HRESULT Init();
- void AdjustDuration(int nBytesPerSec);
+ HRESULT Init();
+ void AdjustDuration(int nBytesPerSec);
- bool m_bIsVBR;
+ bool m_bIsVBR;
public:
- CMpaSplitterFile(IAsyncReader* pAsyncReader, HRESULT& hr);
+ CMpaSplitterFile(IAsyncReader* pAsyncReader, HRESULT& hr);
- CAtlMap<DWORD, CStringW> m_tags;
+ CAtlMap<DWORD, CStringW> m_tags;
- const CMediaType& GetMediaType() {
- return m_mt;
- }
- REFERENCE_TIME GetDuration() {
- return IsRandomAccess() ? m_rtDuration : 0;
- }
+ const CMediaType& GetMediaType() {
+ return m_mt;
+ }
+ REFERENCE_TIME GetDuration() {
+ return IsRandomAccess() ? m_rtDuration : 0;
+ }
- __int64 GetStartPos() {
- return m_startpos;
- }
- __int64 GetEndPos() {
- return m_endpos;
- }
+ __int64 GetStartPos() {
+ return m_startpos;
+ }
+ __int64 GetEndPos() {
+ return m_endpos;
+ }
- bool Sync(int limit = 0x2000);
- bool Sync(int& FrameSize, REFERENCE_TIME& rtDuration, int limit = 0x2000);
+ bool Sync(int limit = 0x2000);
+ bool Sync(int& FrameSize, REFERENCE_TIME& rtDuration, int limit = 0x2000);
};
diff --git a/src/filters/parser/MpegSplitter/IMpegSplitterFilter.h b/src/filters/parser/MpegSplitter/IMpegSplitterFilter.h
index 1329a5207..5c2544706 100644
--- a/src/filters/parser/MpegSplitter/IMpegSplitterFilter.h
+++ b/src/filters/parser/MpegSplitter/IMpegSplitterFilter.h
@@ -25,31 +25,31 @@
interface __declspec(uuid("1DC9C085-04AC-4BB8-B2BD-C49A4D30B104"))
IMpegSplitterFilter :
public IUnknown {
- STDMETHOD(Apply()) = 0;
+ STDMETHOD(Apply()) = 0;
- STDMETHOD(SetFastStreamChange(BOOL nValue)) = 0;
- STDMETHOD_(BOOL, GetFastStreamChange()) = 0;
+ STDMETHOD(SetFastStreamChange(BOOL nValue)) = 0;
+ STDMETHOD_(BOOL, GetFastStreamChange()) = 0;
- STDMETHOD(SetForcedSub(BOOL nValue)) = 0;
- STDMETHOD_(BOOL, GetForcedSub()) = 0;
+ STDMETHOD(SetForcedSub(BOOL nValue)) = 0;
+ STDMETHOD_(BOOL, GetForcedSub()) = 0;
- STDMETHOD(SetTrackPriority(BOOL nValue)) = 0;
- STDMETHOD_(BOOL, GetTrackPriority()) = 0;
+ STDMETHOD(SetTrackPriority(BOOL nValue)) = 0;
+ STDMETHOD_(BOOL, GetTrackPriority()) = 0;
- STDMETHOD(SetAudioLanguageOrder(WCHAR *nValue)) = 0;
- STDMETHOD_(WCHAR *, GetAudioLanguageOrder()) = 0;
+ STDMETHOD(SetAudioLanguageOrder(WCHAR * nValue)) = 0;
+ STDMETHOD_(WCHAR*, GetAudioLanguageOrder()) = 0;
- STDMETHOD(SetSubtitlesLanguageOrder(WCHAR *nValue)) = 0;
- STDMETHOD_(WCHAR *, GetSubtitlesLanguageOrder()) = 0;
+ STDMETHOD(SetSubtitlesLanguageOrder(WCHAR * nValue)) = 0;
+ STDMETHOD_(WCHAR*, GetSubtitlesLanguageOrder()) = 0;
- STDMETHOD(SetVC1_GuidFlag(int nValue)) = 0;
- STDMETHOD_(int, GetVC1_GuidFlag()) = 0;
+ STDMETHOD(SetVC1_GuidFlag(int nValue)) = 0;
+ STDMETHOD_(int, GetVC1_GuidFlag()) = 0;
- STDMETHOD(SetTrueHD(int nValue)) = 0;
- STDMETHOD_(int, GetTrueHD()) = 0;
+ STDMETHOD(SetTrueHD(int nValue)) = 0;
+ STDMETHOD_(int, GetTrueHD()) = 0;
- STDMETHOD(SetAlternativeDuration(BOOL nValue)) = 0;
- STDMETHOD_(BOOL, GetAlternativeDuration()) = 0;
+ STDMETHOD(SetAlternativeDuration(BOOL nValue)) = 0;
+ STDMETHOD_(BOOL, GetAlternativeDuration()) = 0;
- STDMETHOD_(int, GetMPEGType()) = 0;
+ STDMETHOD_(int, GetMPEGType()) = 0;
};
diff --git a/src/filters/parser/MpegSplitter/MpegSplitter.cpp b/src/filters/parser/MpegSplitter/MpegSplitter.cpp
index c450fc225..58532cd4a 100644
--- a/src/filters/parser/MpegSplitter/MpegSplitter.cpp
+++ b/src/filters/parser/MpegSplitter/MpegSplitter.cpp
@@ -33,86 +33,84 @@
#include "../../../mpc-hc/SettingsDefines.h"
-TCHAR* MPEG2_Profile[]=
-{
- L"0",
- L"High Profile",
- L"Spatially Scalable Profile",
- L"SNR Scalable Profile",
- L"Main Profile",
- L"Simple Profile",
- L"6",
- L"7",
+TCHAR* MPEG2_Profile[] = {
+ L"0",
+ L"High Profile",
+ L"Spatially Scalable Profile",
+ L"SNR Scalable Profile",
+ L"Main Profile",
+ L"Simple Profile",
+ L"6",
+ L"7",
};
-TCHAR* MPEG2_Level[]=
-{
- L"0",
- L"1",
- L"2",
- L"3",
- L"High Level",
- L"4",
- L"High1440 Level",
- L"5",
- L"Main Level",
- L"6",
- L"Low Level",
- L"7",
- L"8",
- L"9",
- L"10",
- L"11",
+TCHAR* MPEG2_Level[] = {
+ L"0",
+ L"1",
+ L"2",
+ L"3",
+ L"High Level",
+ L"4",
+ L"High1440 Level",
+ L"5",
+ L"Main Level",
+ L"6",
+ L"Low Level",
+ L"7",
+ L"8",
+ L"9",
+ L"10",
+ L"11",
};
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG1System},
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG2_PROGRAM},
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG2_TRANSPORT},
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG2_PVA},
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG1System},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG2_PROGRAM},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG2_TRANSPORT},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG2_PVA},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL},
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL},
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CMpegSplitterFilter), MpegSplitterName, MERIT_NORMAL+1, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CMpegSourceFilter), MpegSourceName, MERIT_UNLIKELY, 0, NULL, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CMpegSplitterFilter), MpegSplitterName, MERIT_NORMAL + 1, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CMpegSourceFilter), MpegSourceName, MERIT_UNLIKELY, 0, NULL, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CMpegSplitterFilter>, NULL, &sudFilter[0]},
- {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CMpegSourceFilter>, NULL, &sudFilter[1]},
- {L"CMpegSplitterPropertyPage", &__uuidof(CMpegSplitterSettingsWnd), CreateInstance<CInternalPropertyPageTempl<CMpegSplitterSettingsWnd> >},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CMpegSplitterFilter>, NULL, &sudFilter[0]},
+ {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CMpegSourceFilter>, NULL, &sudFilter[1]},
+ {L"CMpegSplitterPropertyPage", &__uuidof(CMpegSplitterSettingsWnd), CreateInstance<CInternalPropertyPageTempl<CMpegSplitterSettingsWnd> >},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- DeleteRegKey(_T("Media Type\\Extensions\\"), _T(".ts"));
+ DeleteRegKey(_T("Media Type\\Extensions\\"), _T(".ts"));
- RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_MPEG1System, _T("0,16,FFFFFFFFF100010001800001FFFFFFFF,000001BA2100010001800001000001BB"), NULL);
- RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_MPEG2_PROGRAM, _T("0,5,FFFFFFFFC0,000001BA40"), NULL);
- RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_MPEG2_PVA, _T("0,8,fffffc00ffe00000,4156000055000000"), NULL);
+ RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_MPEG1System, _T("0,16,FFFFFFFFF100010001800001FFFFFFFF,000001BA2100010001800001000001BB"), NULL);
+ RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_MPEG2_PROGRAM, _T("0,5,FFFFFFFFC0,000001BA40"), NULL);
+ RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_MPEG2_PVA, _T("0,8,fffffc00ffe00000,4156000055000000"), NULL);
- CAtlList<CString> chkbytes;
- chkbytes.AddTail(_T("0,1,,47,188,1,,47,376,1,,47"));
- chkbytes.AddTail(_T("4,1,,47,196,1,,47,388,1,,47"));
- chkbytes.AddTail(_T("0,4,,54467263,1660,1,,47")); // TFrc
- RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_MPEG2_TRANSPORT, chkbytes, NULL);
+ CAtlList<CString> chkbytes;
+ chkbytes.AddTail(_T("0,1,,47,188,1,,47,376,1,,47"));
+ chkbytes.AddTail(_T("4,1,,47,196,1,,47,388,1,,47"));
+ chkbytes.AddTail(_T("0,4,,54467263,1660,1,,47")); // TFrc
+ RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_MPEG2_TRANSPORT, chkbytes, NULL);
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -122,366 +120,366 @@ CFilterApp theApp;
#endif
template <typename t_CType>
-t_CType GetFormatHelper(t_CType &_pInfo, const CMediaType *_pFormat)
+t_CType GetFormatHelper(t_CType& _pInfo, const CMediaType* _pFormat)
{
- ASSERT(_pFormat->cbFormat >= sizeof(*_pInfo));
- _pInfo = (t_CType)_pFormat->pbFormat;
- return _pInfo;
+ ASSERT(_pFormat->cbFormat >= sizeof(*_pInfo));
+ _pInfo = (t_CType)_pFormat->pbFormat;
+ return _pInfo;
}
static int GetHighestBitSet32(unsigned long _Value)
{
- unsigned long Ret;
- unsigned char bNonZero = _BitScanReverse(&Ret, _Value);
- if (bNonZero) {
- return Ret;
- } else {
- return -1;
- }
+ unsigned long Ret;
+ unsigned char bNonZero = _BitScanReverse(&Ret, _Value);
+ if (bNonZero) {
+ return Ret;
+ } else {
+ return -1;
+ }
}
CString FormatBitrate(double _Bitrate)
{
- CString Temp;
- if (_Bitrate > 20000000) { // More than 2 mbit
- Temp.Format(L"%.2f mbit/s", double(_Bitrate)/1000000.0);
- } else {
- Temp.Format(L"%.1f kbit/s", double(_Bitrate)/1000.0);
- }
-
- return Temp;
+ CString Temp;
+ if (_Bitrate > 20000000) { // More than 2 mbit
+ Temp.Format(L"%.2f mbit/s", double(_Bitrate) / 1000000.0);
+ } else {
+ Temp.Format(L"%.1f kbit/s", double(_Bitrate) / 1000.0);
+ }
+
+ return Temp;
}
-CString FormatString(const wchar_t *pszFormat, ... )
+CString FormatString(const wchar_t* pszFormat, ...)
{
- CString Temp;
- ATLASSERT( AtlIsValidString( pszFormat ) );
+ CString Temp;
+ ATLASSERT(AtlIsValidString(pszFormat));
- va_list argList;
- va_start( argList, pszFormat );
- Temp.FormatV( pszFormat, argList );
- va_end( argList );
+ va_list argList;
+ va_start(argList, pszFormat);
+ Temp.FormatV(pszFormat, argList);
+ va_end(argList);
- return Temp;
+ return Temp;
}
-CString GetMediaTypeDesc(const CMediaType *_pMediaType, const CHdmvClipInfo::Stream *pClipInfo, int _PresentationType, CString lang)
+CString GetMediaTypeDesc(const CMediaType* _pMediaType, const CHdmvClipInfo::Stream* pClipInfo, int _PresentationType, CString lang)
{
- const WCHAR *pPresentationDesc = NULL;
-
- if (pClipInfo) {
- pPresentationDesc = StreamTypeToName(pClipInfo->m_Type);
- } else {
- pPresentationDesc = StreamTypeToName((PES_STREAM_TYPE)_PresentationType);
- }
-
- CString MajorType;
- CAtlList<CString> Infos;
-
- if (_pMediaType->majortype == MEDIATYPE_Video) {
- MajorType = "Video";
-
- if (pClipInfo) {
- CString name = ISO6392ToLanguage(pClipInfo->m_LanguageCode);
-
- if (!name.IsEmpty()) {
- Infos.AddTail(name);
- }
- } else {
- if (!lang.IsEmpty()) {
- Infos.AddTail(lang);
- }
- }
-
- const VIDEOINFOHEADER *pVideoInfo = NULL;
- const VIDEOINFOHEADER2 *pVideoInfo2 = NULL;
-
- if (_pMediaType->formattype == FORMAT_MPEGVideo) {
- Infos.AddTail(L"MPEG");
-
- const MPEG1VIDEOINFO *pInfo = GetFormatHelper(pInfo, _pMediaType);
-
- pVideoInfo = &pInfo->hdr;
-
- } else if (_pMediaType->formattype == FORMAT_MPEG2_VIDEO) {
- const MPEG2VIDEOINFO *pInfo = GetFormatHelper(pInfo, _pMediaType);
-
- pVideoInfo2 = &pInfo->hdr;
-
- bool bIsAVC = false;
- bool bIsMPEG2 = false;
-
- if (pInfo->hdr.bmiHeader.biCompression == '1CVA') {
- bIsAVC = true;
- Infos.AddTail(L"AVC (H.264)");
- } else if (pInfo->hdr.bmiHeader.biCompression == 'CVMA') {
- bIsAVC = true;
- Infos.AddTail(L"MVC (Full)");
- } else if (pInfo->hdr.bmiHeader.biCompression == 'CVME') {
- bIsAVC = true;
- Infos.AddTail(L"MVC (Subset)");
- } else if (pInfo->hdr.bmiHeader.biCompression == 0) {
- Infos.AddTail(L"MPEG2");
- bIsMPEG2 = true;
- } else {
- WCHAR Temp[5];
- memset(Temp, 0, sizeof(Temp));
- Temp[0] = (pInfo->hdr.bmiHeader.biCompression >> 0) & 0xFF;
- Temp[1] = (pInfo->hdr.bmiHeader.biCompression >> 8) & 0xFF;
- Temp[2] = (pInfo->hdr.bmiHeader.biCompression >> 16) & 0xFF;
- Temp[3] = (pInfo->hdr.bmiHeader.biCompression >> 24) & 0xFF;
- Infos.AddTail(Temp);
- }
-
- if (bIsMPEG2) {
- Infos.AddTail(MPEG2_Profile[pInfo->dwProfile]);
- } else if (pInfo->dwProfile) {
- if (bIsAVC) {
- switch (pInfo->dwProfile) {
- case 44:
- Infos.AddTail(L"CAVLC Profile");
- break;
- case 66:
- Infos.AddTail(L"Baseline Profile");
- break;
- case 77:
- Infos.AddTail(L"Main Profile");
- break;
- case 88:
- Infos.AddTail(L"Extended Profile");
- break;
- case 100:
- Infos.AddTail(L"High Profile");
- break;
- case 110:
- Infos.AddTail(L"High 10 Profile");
- break;
- case 118:
- Infos.AddTail(L"Multiview High Profile");
- break;
- case 122:
- Infos.AddTail(L"High 4:2:2 Profile");
- break;
- case 244:
- Infos.AddTail(L"High 4:4:4 Profile");
- break;
- case 128:
- Infos.AddTail(L"Stereo High Profile");
- break;
- default:
- Infos.AddTail(FormatString(L"Profile %d", pInfo->dwProfile));
- break;
- }
- } else {
- Infos.AddTail(FormatString(L"Profile %d", pInfo->dwProfile));
- }
- }
-
- if (bIsMPEG2) {
- Infos.AddTail(MPEG2_Level[pInfo->dwLevel]);
- } else if (pInfo->dwLevel) {
- if (bIsAVC) {
- Infos.AddTail(FormatString(L"Level %1.1f", double(pInfo->dwLevel)/10.0));
- } else {
- Infos.AddTail(FormatString(L"Level %d", pInfo->dwLevel));
- }
- }
- } else if (_pMediaType->formattype == FORMAT_VIDEOINFO2) {
- const VIDEOINFOHEADER2 *pInfo = GetFormatHelper(pInfo, _pMediaType);
-
- pVideoInfo2 = pInfo;
- bool bIsVC1 = false;
-
- DWORD CodecType = pInfo->bmiHeader.biCompression;
- if (CodecType == '1CVW') {
- bIsVC1 = true;
- Infos.AddTail(L"VC-1");
- } else if (CodecType) {
- WCHAR Temp[5];
- memset(Temp, 0, sizeof(Temp));
- Temp[0] = (CodecType >> 0) & 0xFF;
- Temp[1] = (CodecType >> 8) & 0xFF;
- Temp[2] = (CodecType >> 16) & 0xFF;
- Temp[3] = (CodecType >> 24) & 0xFF;
- Infos.AddTail(Temp);
- }
- } else if (_pMediaType->subtype == MEDIASUBTYPE_DVD_SUBPICTURE) {
- Infos.AddTail(L"DVD Sub Picture");
- } else if (_pMediaType->subtype == MEDIASUBTYPE_SVCD_SUBPICTURE) {
- Infos.AddTail(L"SVCD Sub Picture");
- } else if (_pMediaType->subtype == MEDIASUBTYPE_CVD_SUBPICTURE) {
- Infos.AddTail(L"CVD Sub Picture");
- }
-
- if (pVideoInfo2) {
- if (pVideoInfo2->bmiHeader.biWidth && pVideoInfo2->bmiHeader.biHeight) {
- Infos.AddTail(FormatString(L"%dx%d", pVideoInfo2->bmiHeader.biWidth, pVideoInfo2->bmiHeader.biHeight));
- }
- if (pVideoInfo2->AvgTimePerFrame) {
- Infos.AddTail(FormatString(L"%.3f fps", 10000000.0/double(pVideoInfo2->AvgTimePerFrame)));
- }
- if (pVideoInfo2->dwBitRate) {
- Infos.AddTail(FormatBitrate(pVideoInfo2->dwBitRate));
- }
- } else if (pVideoInfo) {
- if (pVideoInfo->bmiHeader.biWidth && pVideoInfo->bmiHeader.biHeight) {
- Infos.AddTail(FormatString(L"%dx%d", pVideoInfo->bmiHeader.biWidth, pVideoInfo->bmiHeader.biHeight));
- }
- if (pVideoInfo->AvgTimePerFrame) {
- Infos.AddTail(FormatString(L"%.3f fps", 10000000.0/double(pVideoInfo->AvgTimePerFrame)));
- }
- if (pVideoInfo->dwBitRate) {
- Infos.AddTail(FormatBitrate(pVideoInfo->dwBitRate));
- }
- }
-
- } else if (_pMediaType->majortype == MEDIATYPE_Audio) {
- MajorType = "Audio";
- if (pClipInfo) {
- CString name = ISO6392ToLanguage(pClipInfo->m_LanguageCode);
- if (!name.IsEmpty()) {
- Infos.AddTail(name);
- }
- } else {
- if (!lang.IsEmpty()) {
- Infos.AddTail(lang);
- }
- }
- if (_pMediaType->formattype == FORMAT_WaveFormatEx) {
- const WAVEFORMATEX *pInfo = GetFormatHelper(pInfo, _pMediaType);
-
- if (_pMediaType->subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO) {
- Infos.AddTail(L"DVD LPCM");
- } else if (_pMediaType->subtype == MEDIASUBTYPE_HDMV_LPCM_AUDIO) {
- const WAVEFORMATEX_HDMV_LPCM *pInfoHDMV = GetFormatHelper(pInfoHDMV, _pMediaType);
- UNREFERENCED_PARAMETER(pInfoHDMV);
- Infos.AddTail(L"HDMV LPCM");
- }
- if (_pMediaType->subtype == MEDIASUBTYPE_DOLBY_DDPLUS) {
- Infos.AddTail(L"Dolby Digital Plus");
- } else if (_pMediaType->subtype == MEDIASUBTYPE_DOLBY_TRUEHD) {
- Infos.AddTail(L"TrueHD");
- } else {
- switch (pInfo->wFormatTag) {
- case WAVE_FORMAT_PS2_PCM: {
- Infos.AddTail(L"PS2 PCM");
- }
- break;
- case WAVE_FORMAT_PS2_ADPCM: {
- Infos.AddTail(L"PS2 ADPCM");
- }
- break;
- case WAVE_FORMAT_DVD_DTS: {
- if (pPresentationDesc) {
- Infos.AddTail(pPresentationDesc);
- } else {
- Infos.AddTail(L"DTS");
- }
- }
- break;
- case WAVE_FORMAT_DOLBY_AC3: {
- if (pPresentationDesc) {
- Infos.AddTail(pPresentationDesc);
- } else {
- Infos.AddTail(L"Dolby Digital");
- }
- }
- break;
- case WAVE_FORMAT_AAC: {
- Infos.AddTail(L"AAC");
- }
- break;
- case WAVE_FORMAT_MP3: {
- Infos.AddTail(L"MP3");
- }
- break;
- case WAVE_FORMAT_MPEG: {
- const MPEG1WAVEFORMAT* pInfoMPEG1 = GetFormatHelper(pInfoMPEG1, _pMediaType);
-
- int layer = GetHighestBitSet32(pInfoMPEG1->fwHeadLayer) + 1;
- Infos.AddTail(FormatString(L"MPEG1 - Layer %d", layer));
- }
- break;
- }
- }
-
- if (pClipInfo && (pClipInfo->m_SampleRate == BDVM_SampleRate_48_192 || pClipInfo->m_SampleRate == BDVM_SampleRate_48_96)) {
- switch (pClipInfo->m_SampleRate) {
- case BDVM_SampleRate_48_192:
- Infos.AddTail(FormatString(L"192(48) kHz"));
- break;
- case BDVM_SampleRate_48_96:
- Infos.AddTail(FormatString(L"96(48) kHz"));
- break;
- }
- } else if (pInfo->nSamplesPerSec) {
- Infos.AddTail(FormatString(L"%.1f kHz", double(pInfo->nSamplesPerSec)/1000.0));
- }
- if (pInfo->nChannels) {
- Infos.AddTail(FormatString(L"%d chn", pInfo->nChannels));
- }
- if (pInfo->wBitsPerSample) {
- Infos.AddTail(FormatString(L"%d bit", pInfo->wBitsPerSample));
- }
- if (pInfo->nAvgBytesPerSec) {
- Infos.AddTail(FormatBitrate(pInfo->nAvgBytesPerSec * 8));
- }
-
- }
- } else if (_pMediaType->majortype == MEDIATYPE_Subtitle) {
- MajorType = "Subtitle";
-
- if (pPresentationDesc) {
- Infos.AddTail(pPresentationDesc);
- }
-
- if (pClipInfo) {
- CString name = ISO6392ToLanguage(pClipInfo->m_LanguageCode);
- if (!name.IsEmpty()) {
- Infos.AddHead(name);
- } else if (!lang.IsEmpty()) {
- Infos.AddHead(lang);
- }
- } else if (_pMediaType->cbFormat == sizeof(SUBTITLEINFO)) {
- const SUBTITLEINFO *pInfo = GetFormatHelper(pInfo, _pMediaType);
- CString name = ISO6392ToLanguage(pInfo->IsoLang);
-
- if (!lang.IsEmpty()) {
- Infos.AddHead(lang);
- } else if (!name.IsEmpty()) {
- Infos.AddHead(name);
- }
- if (pInfo->TrackName[0]) {
- Infos.AddTail(pInfo->TrackName);
- }
- } else if (!lang.IsEmpty()) {
- Infos.AddHead(lang);
- }
- }
-
- if (!Infos.IsEmpty()) {
- CString Ret;
-
- Ret += MajorType;
- Ret += " - ";
-
- bool bFirst = true;
-
- for (POSITION pos = Infos.GetHeadPosition(); pos; Infos.GetNext(pos)) {
- CString& String = Infos.GetAt(pos);
-
- if (bFirst) {
- Ret += String;
- } else {
- Ret += L", " + String;
- }
-
- bFirst = false;
- }
-
- return Ret;
- }
- return CString();
+ const WCHAR* pPresentationDesc = NULL;
+
+ if (pClipInfo) {
+ pPresentationDesc = StreamTypeToName(pClipInfo->m_Type);
+ } else {
+ pPresentationDesc = StreamTypeToName((PES_STREAM_TYPE)_PresentationType);
+ }
+
+ CString MajorType;
+ CAtlList<CString> Infos;
+
+ if (_pMediaType->majortype == MEDIATYPE_Video) {
+ MajorType = "Video";
+
+ if (pClipInfo) {
+ CString name = ISO6392ToLanguage(pClipInfo->m_LanguageCode);
+
+ if (!name.IsEmpty()) {
+ Infos.AddTail(name);
+ }
+ } else {
+ if (!lang.IsEmpty()) {
+ Infos.AddTail(lang);
+ }
+ }
+
+ const VIDEOINFOHEADER* pVideoInfo = NULL;
+ const VIDEOINFOHEADER2* pVideoInfo2 = NULL;
+
+ if (_pMediaType->formattype == FORMAT_MPEGVideo) {
+ Infos.AddTail(L"MPEG");
+
+ const MPEG1VIDEOINFO* pInfo = GetFormatHelper(pInfo, _pMediaType);
+
+ pVideoInfo = &pInfo->hdr;
+
+ } else if (_pMediaType->formattype == FORMAT_MPEG2_VIDEO) {
+ const MPEG2VIDEOINFO* pInfo = GetFormatHelper(pInfo, _pMediaType);
+
+ pVideoInfo2 = &pInfo->hdr;
+
+ bool bIsAVC = false;
+ bool bIsMPEG2 = false;
+
+ if (pInfo->hdr.bmiHeader.biCompression == '1CVA') {
+ bIsAVC = true;
+ Infos.AddTail(L"AVC (H.264)");
+ } else if (pInfo->hdr.bmiHeader.biCompression == 'CVMA') {
+ bIsAVC = true;
+ Infos.AddTail(L"MVC (Full)");
+ } else if (pInfo->hdr.bmiHeader.biCompression == 'CVME') {
+ bIsAVC = true;
+ Infos.AddTail(L"MVC (Subset)");
+ } else if (pInfo->hdr.bmiHeader.biCompression == 0) {
+ Infos.AddTail(L"MPEG2");
+ bIsMPEG2 = true;
+ } else {
+ WCHAR Temp[5];
+ memset(Temp, 0, sizeof(Temp));
+ Temp[0] = (pInfo->hdr.bmiHeader.biCompression >> 0) & 0xFF;
+ Temp[1] = (pInfo->hdr.bmiHeader.biCompression >> 8) & 0xFF;
+ Temp[2] = (pInfo->hdr.bmiHeader.biCompression >> 16) & 0xFF;
+ Temp[3] = (pInfo->hdr.bmiHeader.biCompression >> 24) & 0xFF;
+ Infos.AddTail(Temp);
+ }
+
+ if (bIsMPEG2) {
+ Infos.AddTail(MPEG2_Profile[pInfo->dwProfile]);
+ } else if (pInfo->dwProfile) {
+ if (bIsAVC) {
+ switch (pInfo->dwProfile) {
+ case 44:
+ Infos.AddTail(L"CAVLC Profile");
+ break;
+ case 66:
+ Infos.AddTail(L"Baseline Profile");
+ break;
+ case 77:
+ Infos.AddTail(L"Main Profile");
+ break;
+ case 88:
+ Infos.AddTail(L"Extended Profile");
+ break;
+ case 100:
+ Infos.AddTail(L"High Profile");
+ break;
+ case 110:
+ Infos.AddTail(L"High 10 Profile");
+ break;
+ case 118:
+ Infos.AddTail(L"Multiview High Profile");
+ break;
+ case 122:
+ Infos.AddTail(L"High 4:2:2 Profile");
+ break;
+ case 244:
+ Infos.AddTail(L"High 4:4:4 Profile");
+ break;
+ case 128:
+ Infos.AddTail(L"Stereo High Profile");
+ break;
+ default:
+ Infos.AddTail(FormatString(L"Profile %d", pInfo->dwProfile));
+ break;
+ }
+ } else {
+ Infos.AddTail(FormatString(L"Profile %d", pInfo->dwProfile));
+ }
+ }
+
+ if (bIsMPEG2) {
+ Infos.AddTail(MPEG2_Level[pInfo->dwLevel]);
+ } else if (pInfo->dwLevel) {
+ if (bIsAVC) {
+ Infos.AddTail(FormatString(L"Level %1.1f", double(pInfo->dwLevel) / 10.0));
+ } else {
+ Infos.AddTail(FormatString(L"Level %d", pInfo->dwLevel));
+ }
+ }
+ } else if (_pMediaType->formattype == FORMAT_VIDEOINFO2) {
+ const VIDEOINFOHEADER2* pInfo = GetFormatHelper(pInfo, _pMediaType);
+
+ pVideoInfo2 = pInfo;
+ bool bIsVC1 = false;
+
+ DWORD CodecType = pInfo->bmiHeader.biCompression;
+ if (CodecType == '1CVW') {
+ bIsVC1 = true;
+ Infos.AddTail(L"VC-1");
+ } else if (CodecType) {
+ WCHAR Temp[5];
+ memset(Temp, 0, sizeof(Temp));
+ Temp[0] = (CodecType >> 0) & 0xFF;
+ Temp[1] = (CodecType >> 8) & 0xFF;
+ Temp[2] = (CodecType >> 16) & 0xFF;
+ Temp[3] = (CodecType >> 24) & 0xFF;
+ Infos.AddTail(Temp);
+ }
+ } else if (_pMediaType->subtype == MEDIASUBTYPE_DVD_SUBPICTURE) {
+ Infos.AddTail(L"DVD Sub Picture");
+ } else if (_pMediaType->subtype == MEDIASUBTYPE_SVCD_SUBPICTURE) {
+ Infos.AddTail(L"SVCD Sub Picture");
+ } else if (_pMediaType->subtype == MEDIASUBTYPE_CVD_SUBPICTURE) {
+ Infos.AddTail(L"CVD Sub Picture");
+ }
+
+ if (pVideoInfo2) {
+ if (pVideoInfo2->bmiHeader.biWidth && pVideoInfo2->bmiHeader.biHeight) {
+ Infos.AddTail(FormatString(L"%dx%d", pVideoInfo2->bmiHeader.biWidth, pVideoInfo2->bmiHeader.biHeight));
+ }
+ if (pVideoInfo2->AvgTimePerFrame) {
+ Infos.AddTail(FormatString(L"%.3f fps", 10000000.0 / double(pVideoInfo2->AvgTimePerFrame)));
+ }
+ if (pVideoInfo2->dwBitRate) {
+ Infos.AddTail(FormatBitrate(pVideoInfo2->dwBitRate));
+ }
+ } else if (pVideoInfo) {
+ if (pVideoInfo->bmiHeader.biWidth && pVideoInfo->bmiHeader.biHeight) {
+ Infos.AddTail(FormatString(L"%dx%d", pVideoInfo->bmiHeader.biWidth, pVideoInfo->bmiHeader.biHeight));
+ }
+ if (pVideoInfo->AvgTimePerFrame) {
+ Infos.AddTail(FormatString(L"%.3f fps", 10000000.0 / double(pVideoInfo->AvgTimePerFrame)));
+ }
+ if (pVideoInfo->dwBitRate) {
+ Infos.AddTail(FormatBitrate(pVideoInfo->dwBitRate));
+ }
+ }
+
+ } else if (_pMediaType->majortype == MEDIATYPE_Audio) {
+ MajorType = "Audio";
+ if (pClipInfo) {
+ CString name = ISO6392ToLanguage(pClipInfo->m_LanguageCode);
+ if (!name.IsEmpty()) {
+ Infos.AddTail(name);
+ }
+ } else {
+ if (!lang.IsEmpty()) {
+ Infos.AddTail(lang);
+ }
+ }
+ if (_pMediaType->formattype == FORMAT_WaveFormatEx) {
+ const WAVEFORMATEX* pInfo = GetFormatHelper(pInfo, _pMediaType);
+
+ if (_pMediaType->subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO) {
+ Infos.AddTail(L"DVD LPCM");
+ } else if (_pMediaType->subtype == MEDIASUBTYPE_HDMV_LPCM_AUDIO) {
+ const WAVEFORMATEX_HDMV_LPCM* pInfoHDMV = GetFormatHelper(pInfoHDMV, _pMediaType);
+ UNREFERENCED_PARAMETER(pInfoHDMV);
+ Infos.AddTail(L"HDMV LPCM");
+ }
+ if (_pMediaType->subtype == MEDIASUBTYPE_DOLBY_DDPLUS) {
+ Infos.AddTail(L"Dolby Digital Plus");
+ } else if (_pMediaType->subtype == MEDIASUBTYPE_DOLBY_TRUEHD) {
+ Infos.AddTail(L"TrueHD");
+ } else {
+ switch (pInfo->wFormatTag) {
+ case WAVE_FORMAT_PS2_PCM: {
+ Infos.AddTail(L"PS2 PCM");
+ }
+ break;
+ case WAVE_FORMAT_PS2_ADPCM: {
+ Infos.AddTail(L"PS2 ADPCM");
+ }
+ break;
+ case WAVE_FORMAT_DVD_DTS: {
+ if (pPresentationDesc) {
+ Infos.AddTail(pPresentationDesc);
+ } else {
+ Infos.AddTail(L"DTS");
+ }
+ }
+ break;
+ case WAVE_FORMAT_DOLBY_AC3: {
+ if (pPresentationDesc) {
+ Infos.AddTail(pPresentationDesc);
+ } else {
+ Infos.AddTail(L"Dolby Digital");
+ }
+ }
+ break;
+ case WAVE_FORMAT_AAC: {
+ Infos.AddTail(L"AAC");
+ }
+ break;
+ case WAVE_FORMAT_MP3: {
+ Infos.AddTail(L"MP3");
+ }
+ break;
+ case WAVE_FORMAT_MPEG: {
+ const MPEG1WAVEFORMAT* pInfoMPEG1 = GetFormatHelper(pInfoMPEG1, _pMediaType);
+
+ int layer = GetHighestBitSet32(pInfoMPEG1->fwHeadLayer) + 1;
+ Infos.AddTail(FormatString(L"MPEG1 - Layer %d", layer));
+ }
+ break;
+ }
+ }
+
+ if (pClipInfo && (pClipInfo->m_SampleRate == BDVM_SampleRate_48_192 || pClipInfo->m_SampleRate == BDVM_SampleRate_48_96)) {
+ switch (pClipInfo->m_SampleRate) {
+ case BDVM_SampleRate_48_192:
+ Infos.AddTail(FormatString(L"192(48) kHz"));
+ break;
+ case BDVM_SampleRate_48_96:
+ Infos.AddTail(FormatString(L"96(48) kHz"));
+ break;
+ }
+ } else if (pInfo->nSamplesPerSec) {
+ Infos.AddTail(FormatString(L"%.1f kHz", double(pInfo->nSamplesPerSec) / 1000.0));
+ }
+ if (pInfo->nChannels) {
+ Infos.AddTail(FormatString(L"%d chn", pInfo->nChannels));
+ }
+ if (pInfo->wBitsPerSample) {
+ Infos.AddTail(FormatString(L"%d bit", pInfo->wBitsPerSample));
+ }
+ if (pInfo->nAvgBytesPerSec) {
+ Infos.AddTail(FormatBitrate(pInfo->nAvgBytesPerSec * 8));
+ }
+
+ }
+ } else if (_pMediaType->majortype == MEDIATYPE_Subtitle) {
+ MajorType = "Subtitle";
+
+ if (pPresentationDesc) {
+ Infos.AddTail(pPresentationDesc);
+ }
+
+ if (pClipInfo) {
+ CString name = ISO6392ToLanguage(pClipInfo->m_LanguageCode);
+ if (!name.IsEmpty()) {
+ Infos.AddHead(name);
+ } else if (!lang.IsEmpty()) {
+ Infos.AddHead(lang);
+ }
+ } else if (_pMediaType->cbFormat == sizeof(SUBTITLEINFO)) {
+ const SUBTITLEINFO* pInfo = GetFormatHelper(pInfo, _pMediaType);
+ CString name = ISO6392ToLanguage(pInfo->IsoLang);
+
+ if (!lang.IsEmpty()) {
+ Infos.AddHead(lang);
+ } else if (!name.IsEmpty()) {
+ Infos.AddHead(name);
+ }
+ if (pInfo->TrackName[0]) {
+ Infos.AddTail(pInfo->TrackName);
+ }
+ } else if (!lang.IsEmpty()) {
+ Infos.AddHead(lang);
+ }
+ }
+
+ if (!Infos.IsEmpty()) {
+ CString Ret;
+
+ Ret += MajorType;
+ Ret += " - ";
+
+ bool bFirst = true;
+
+ for (POSITION pos = Infos.GetHeadPosition(); pos; Infos.GetNext(pos)) {
+ CString& String = Infos.GetAt(pos);
+
+ if (bFirst) {
+ Ret += String;
+ } else {
+ Ret += L", " + String;
+ }
+
+ bFirst = false;
+ }
+
+ return Ret;
+ }
+ return CString();
}
//
@@ -489,1097 +487,1095 @@ CString GetMediaTypeDesc(const CMediaType *_pMediaType, const CHdmvClipInfo::Str
//
CMpegSplitterFilter::CMpegSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid)
- : CBaseSplitterFilter(NAME("CMpegSplitterFilter"), pUnk, phr, clsid)
- , m_pPipoBimbo(false)
- , m_rtPlaylistDuration(0)
- , m_csAudioLanguageOrder(_T(""))
- , m_csSubtitlesLanguageOrder(_T(""))
- , m_useFastStreamChange(true)
- , m_ForcedSub(false)
- , m_TrackPriority(false)
- , m_AC3CoreOnly(0)
- , m_nVC1_GuidFlag(1)
- , m_AlternativeDuration(false)
+ : CBaseSplitterFilter(NAME("CMpegSplitterFilter"), pUnk, phr, clsid)
+ , m_pPipoBimbo(false)
+ , m_rtPlaylistDuration(0)
+ , m_csAudioLanguageOrder(_T(""))
+ , m_csSubtitlesLanguageOrder(_T(""))
+ , m_useFastStreamChange(true)
+ , m_ForcedSub(false)
+ , m_TrackPriority(false)
+ , m_AC3CoreOnly(0)
+ , m_nVC1_GuidFlag(1)
+ , m_AlternativeDuration(false)
{
#ifdef REGISTER_FILTER
- CRegKey key;
- TCHAR buff[256];
- ULONG len;
-
- if (ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPEG Splitter"), KEY_READ)) {
- DWORD dw;
-
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("UseFastStreamChange"), dw)) {
- m_useFastStreamChange = !!dw;
- }
-
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ForcedSub"), dw)) {
- m_ForcedSub = !!dw;
- }
-
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("TrackPriority"), dw)) {
- m_TrackPriority = !!dw;
- }
-
- len = _countof(buff);
- memset(buff, 0, sizeof(buff));
- if (ERROR_SUCCESS == key.QueryStringValue(_T("AudioLanguageOrder"), buff, &len)) {
- m_csAudioLanguageOrder = CString(buff);
- }
-
- len = _countof(buff);
- memset(buff, 0, sizeof(buff));
- if (ERROR_SUCCESS == key.QueryStringValue(_T("SubtitlesLanguageOrder"), buff, &len)) {
- m_csSubtitlesLanguageOrder = CString(buff);
- }
-
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("VC1_Decoder_Output"), dw)) {
- m_nVC1_GuidFlag = dw;
- }
-
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("AC3CoreOnly"), dw)) {
- m_AC3CoreOnly = dw;
- }
-
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("AlternativeDuration"), dw)) {
- m_AlternativeDuration = !!dw;
- }
- }
+ CRegKey key;
+ TCHAR buff[256];
+ ULONG len;
+
+ if (ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPEG Splitter"), KEY_READ)) {
+ DWORD dw;
+
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("UseFastStreamChange"), dw)) {
+ m_useFastStreamChange = !!dw;
+ }
+
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ForcedSub"), dw)) {
+ m_ForcedSub = !!dw;
+ }
+
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("TrackPriority"), dw)) {
+ m_TrackPriority = !!dw;
+ }
+
+ len = _countof(buff);
+ memset(buff, 0, sizeof(buff));
+ if (ERROR_SUCCESS == key.QueryStringValue(_T("AudioLanguageOrder"), buff, &len)) {
+ m_csAudioLanguageOrder = CString(buff);
+ }
+
+ len = _countof(buff);
+ memset(buff, 0, sizeof(buff));
+ if (ERROR_SUCCESS == key.QueryStringValue(_T("SubtitlesLanguageOrder"), buff, &len)) {
+ m_csSubtitlesLanguageOrder = CString(buff);
+ }
+
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("VC1_Decoder_Output"), dw)) {
+ m_nVC1_GuidFlag = dw;
+ }
+
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("AC3CoreOnly"), dw)) {
+ m_AC3CoreOnly = dw;
+ }
+
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("AlternativeDuration"), dw)) {
+ m_AlternativeDuration = !!dw;
+ }
+ }
#else
- m_useFastStreamChange = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Splitter"), _T("UseFastStreamChange"), m_useFastStreamChange);
- m_ForcedSub = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Splitter"), _T("ForcedSub"), m_ForcedSub);
- m_TrackPriority = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Splitter"), _T("TrackPriority"), m_TrackPriority);
- m_csSubtitlesLanguageOrder = AfxGetApp()->GetProfileString(IDS_R_SETTINGS, IDS_RS_SUBTITLESLANGORDER, _T(""));
- m_csAudioLanguageOrder = AfxGetApp()->GetProfileString(IDS_R_SETTINGS, IDS_RS_AUDIOSLANGORDER, _T(""));
- m_nVC1_GuidFlag = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Splitter"), _T("VC1_Decoder_Output"), m_nVC1_GuidFlag);
- if (m_nVC1_GuidFlag<1 || m_nVC1_GuidFlag>3) m_nVC1_GuidFlag = 1;
- m_AC3CoreOnly = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Splitter"), _T("AC3CoreOnly"), m_AC3CoreOnly);
- m_AlternativeDuration = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Splitter"), _T("AlternativeDuration"), m_AlternativeDuration);
+ m_useFastStreamChange = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Splitter"), _T("UseFastStreamChange"), m_useFastStreamChange);
+ m_ForcedSub = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Splitter"), _T("ForcedSub"), m_ForcedSub);
+ m_TrackPriority = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Splitter"), _T("TrackPriority"), m_TrackPriority);
+ m_csSubtitlesLanguageOrder = AfxGetApp()->GetProfileString(IDS_R_SETTINGS, IDS_RS_SUBTITLESLANGORDER, _T(""));
+ m_csAudioLanguageOrder = AfxGetApp()->GetProfileString(IDS_R_SETTINGS, IDS_RS_AUDIOSLANGORDER, _T(""));
+ m_nVC1_GuidFlag = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Splitter"), _T("VC1_Decoder_Output"), m_nVC1_GuidFlag);
+ if (m_nVC1_GuidFlag < 1 || m_nVC1_GuidFlag > 3) { m_nVC1_GuidFlag = 1; }
+ m_AC3CoreOnly = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Splitter"), _T("AC3CoreOnly"), m_AC3CoreOnly);
+ m_AlternativeDuration = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Splitter"), _T("AlternativeDuration"), m_AlternativeDuration);
#endif
}
bool CMpegSplitterFilter::StreamIsTrueHD(const WORD pid)
{
- int iProgram = -1;
- const CHdmvClipInfo::Stream *pClipInfo;
- const CMpegSplitterFile::program * pProgram = m_pFile->FindProgram(pid, iProgram, pClipInfo);
- int StreamType = pClipInfo ? pClipInfo->m_Type : pProgram ? pProgram->streams[iProgram].type : 0;
- return (StreamType == AUDIO_STREAM_AC3_TRUE_HD);
+ int iProgram = -1;
+ const CHdmvClipInfo::Stream* pClipInfo;
+ const CMpegSplitterFile::program* pProgram = m_pFile->FindProgram(pid, iProgram, pClipInfo);
+ int StreamType = pClipInfo ? pClipInfo->m_Type : pProgram ? pProgram->streams[iProgram].type : 0;
+ return (StreamType == AUDIO_STREAM_AC3_TRUE_HD);
}
STDMETHODIMP CMpegSplitterFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
-
- return
- QI(IMpegSplitterFilter)
- QI(ISpecifyPropertyPages)
- QI(ISpecifyPropertyPages2)
- QI(IAMStreamSelect)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ CheckPointer(ppv, E_POINTER);
+
+ return
+ QI(IMpegSplitterFilter)
+ QI(ISpecifyPropertyPages)
+ QI(ISpecifyPropertyPages2)
+ QI(IAMStreamSelect)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
STDMETHODIMP CMpegSplitterFilter::GetClassID(CLSID* pClsID)
{
- CheckPointer (pClsID, E_POINTER);
-
- if (m_pPipoBimbo) {
- memcpy (pClsID, &CLSID_WMAsfReader, sizeof (GUID));
- return S_OK;
- } else {
- return __super::GetClassID(pClsID);
- }
+ CheckPointer(pClsID, E_POINTER);
+
+ if (m_pPipoBimbo) {
+ memcpy(pClsID, &CLSID_WMAsfReader, sizeof(GUID));
+ return S_OK;
+ } else {
+ return __super::GetClassID(pClsID);
+ }
}
STDMETHODIMP CMpegSplitterFilter::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
-
- if (m_pName && m_pName[0]==L'M' && m_pName[1]==L'P' && m_pName[2]==L'C') {
- (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
- } else {
- wcscpy_s(pInfo->achName, MpegSourceName);
- }
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+
+ if (m_pName && m_pName[0] == L'M' && m_pName[1] == L'P' && m_pName[2] == L'C') {
+ (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
+ } else {
+ wcscpy_s(pInfo->achName, MpegSourceName);
+ }
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
void CMpegSplitterFilter::ReadClipInfo(LPCOLESTR pszFileName)
{
- if (wcslen (pszFileName) > 0) {
- WCHAR Drive[_MAX_DRIVE];
- WCHAR Dir[_MAX_PATH];
- WCHAR Filename[_MAX_PATH];
- WCHAR Ext[_MAX_EXT];
-
- if (_wsplitpath_s (pszFileName, Drive, _countof(Drive), Dir, _countof(Dir), Filename, _countof(Filename), Ext, _countof(Ext)) == 0) {
- CString strClipInfo;
-
- _wcslwr_s(Ext, _countof(Ext));
-
- if (wcscmp(Ext, L".ssif") == 0) {
- if (Drive[0]) {
- strClipInfo.Format (_T("%s\\%s\\..\\..\\CLIPINF\\%s.clpi"), Drive, Dir, Filename);
- } else {
- strClipInfo.Format (_T("%s\\..\\..\\CLIPINF\\%s.clpi"), Dir, Filename);
- }
- } else {
- if (Drive[0]) {
- strClipInfo.Format (_T("%s\\%s\\..\\CLIPINF\\%s.clpi"), Drive, Dir, Filename);
- } else {
- strClipInfo.Format (_T("%s\\..\\CLIPINF\\%s.clpi"), Dir, Filename);
- }
- }
-
- m_ClipInfo.ReadInfo (strClipInfo);
- }
- }
+ if (wcslen(pszFileName) > 0) {
+ WCHAR Drive[_MAX_DRIVE];
+ WCHAR Dir[_MAX_PATH];
+ WCHAR Filename[_MAX_PATH];
+ WCHAR Ext[_MAX_EXT];
+
+ if (_wsplitpath_s(pszFileName, Drive, _countof(Drive), Dir, _countof(Dir), Filename, _countof(Filename), Ext, _countof(Ext)) == 0) {
+ CString strClipInfo;
+
+ _wcslwr_s(Ext, _countof(Ext));
+
+ if (wcscmp(Ext, L".ssif") == 0) {
+ if (Drive[0]) {
+ strClipInfo.Format(_T("%s\\%s\\..\\..\\CLIPINF\\%s.clpi"), Drive, Dir, Filename);
+ } else {
+ strClipInfo.Format(_T("%s\\..\\..\\CLIPINF\\%s.clpi"), Dir, Filename);
+ }
+ } else {
+ if (Drive[0]) {
+ strClipInfo.Format(_T("%s\\%s\\..\\CLIPINF\\%s.clpi"), Drive, Dir, Filename);
+ } else {
+ strClipInfo.Format(_T("%s\\..\\CLIPINF\\%s.clpi"), Dir, Filename);
+ }
+ }
+
+ m_ClipInfo.ReadInfo(strClipInfo);
+ }
+ }
}
STDMETHODIMP CMpegSplitterFilter::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt)
{
- return __super::Load (pszFileName, pmt);
+ return __super::Load(pszFileName, pmt);
}
HRESULT CMpegSplitterFilter::DemuxNextPacket(REFERENCE_TIME rtStartOffset)
{
- HRESULT hr;
- BYTE b;
-
- if (m_pFile->m_type == mpeg_ps || m_pFile->m_type == mpeg_es) {
- if (!m_pFile->NextMpegStartCode(b)) {
- return S_FALSE;
- }
-
- if (b == 0xba) { // program stream header
- CMpegSplitterFile::pshdr h;
- if (!m_pFile->Read(h)) {
- return S_FALSE;
- }
- } else if (b == 0xbb) { // program stream system header
- CMpegSplitterFile::pssyshdr h;
- if (!m_pFile->Read(h)) {
- return S_FALSE;
- }
- }
- else if ((b >= 0xbd && b < 0xf0) || (b == 0xfd)) { // pes packet
- CMpegSplitterFile::peshdr h;
-
- if (!m_pFile->Read(h, b) || !h.len) {
- return S_FALSE;
- }
-
- if (h.type == CMpegSplitterFile::mpeg2 && h.scrambling) {
- ASSERT(0);
- return E_FAIL;
- }
-
- __int64 pos = m_pFile->GetPos();
-
- DWORD TrackNumber = m_pFile->AddStream(0, b, h.id_ext, h.len);
-
- if (GetOutputPin(TrackNumber)) {
- CAutoPtr<Packet> p(DNew Packet());
-
- p->TrackNumber = TrackNumber;
- p->bSyncPoint = !!h.fpts;
- p->bAppendable = !h.fpts;
- p->rtStart = h.fpts ? (h.pts - rtStartOffset) : Packet::INVALID_TIME;
- p->rtStop = p->rtStart+1;
- p->SetCount(h.len - (size_t)(m_pFile->GetPos() - pos));
-
- m_pFile->ByteRead(p->GetData(), h.len - (m_pFile->GetPos() - pos));
-
- hr = DeliverPacket(p);
- }
- m_pFile->Seek(pos + h.len);
- }
- } else if (m_pFile->m_type == mpeg_ts) {
- CMpegSplitterFile::trhdr h;
-
- if (!m_pFile->Read(h)) {
- return S_FALSE;
- }
-
-
- __int64 pos = m_pFile->GetPos();
-
- m_pFile->UpdatePrograms(h, false);
-
- if (h.payload && ISVALIDPID(h.pid)) {
- DWORD TrackNumber = h.pid;
-
- CMpegSplitterFile::peshdr h2;
-
- if (h.payloadstart && m_pFile->NextMpegStartCode(b, 4) && m_pFile->Read(h2, b)) { // pes packet
- if (h2.type == CMpegSplitterFile::mpeg2 && h2.scrambling) {
- ASSERT(0);
- return E_FAIL;
- }
- TrackNumber = m_pFile->AddStream(h.pid, b, 0, h.bytes - (DWORD)(m_pFile->GetPos() - pos));
- }
-
- if (GetOutputPin(TrackNumber)) {
- CAutoPtr<Packet> p(DNew Packet());
-
- p->TrackNumber = TrackNumber;
- p->bSyncPoint = !!h2.fpts;
- p->bAppendable = !h2.fpts;
-
- if (h.fPCR) {
- CRefTime rtNow;
- StreamTime(rtNow);
- //TRACE ("Now=%S PCR=%S\n", ReftimeToString(rtNow.m_time), ReftimeToString(h.PCR));
- }
-
- p->rtStart = h2.fpts ? (h2.pts - rtStartOffset) : Packet::INVALID_TIME;
- p->rtStop = p->rtStart+1;
- p->SetCount(h.bytes - (size_t)(m_pFile->GetPos() - pos));
-
- int nBytes = int(h.bytes - (m_pFile->GetPos() - pos));
- m_pFile->ByteRead(p->GetData(), nBytes);
-
- hr = DeliverPacket(p);
- }
- }
-
- m_pFile->Seek(h.next);
- } else if (m_pFile->m_type == mpeg_pva) {
- CMpegSplitterFile::pvahdr h;
- if (!m_pFile->Read(h)) {
- return S_FALSE;
- }
+ HRESULT hr;
+ BYTE b;
+
+ if (m_pFile->m_type == mpeg_ps || m_pFile->m_type == mpeg_es) {
+ if (!m_pFile->NextMpegStartCode(b)) {
+ return S_FALSE;
+ }
+
+ if (b == 0xba) { // program stream header
+ CMpegSplitterFile::pshdr h;
+ if (!m_pFile->Read(h)) {
+ return S_FALSE;
+ }
+ } else if (b == 0xbb) { // program stream system header
+ CMpegSplitterFile::pssyshdr h;
+ if (!m_pFile->Read(h)) {
+ return S_FALSE;
+ }
+ } else if ((b >= 0xbd && b < 0xf0) || (b == 0xfd)) { // pes packet
+ CMpegSplitterFile::peshdr h;
+
+ if (!m_pFile->Read(h, b) || !h.len) {
+ return S_FALSE;
+ }
+
+ if (h.type == CMpegSplitterFile::mpeg2 && h.scrambling) {
+ ASSERT(0);
+ return E_FAIL;
+ }
+
+ __int64 pos = m_pFile->GetPos();
+
+ DWORD TrackNumber = m_pFile->AddStream(0, b, h.id_ext, h.len);
+
+ if (GetOutputPin(TrackNumber)) {
+ CAutoPtr<Packet> p(DNew Packet());
+
+ p->TrackNumber = TrackNumber;
+ p->bSyncPoint = !!h.fpts;
+ p->bAppendable = !h.fpts;
+ p->rtStart = h.fpts ? (h.pts - rtStartOffset) : Packet::INVALID_TIME;
+ p->rtStop = p->rtStart + 1;
+ p->SetCount(h.len - (size_t)(m_pFile->GetPos() - pos));
+
+ m_pFile->ByteRead(p->GetData(), h.len - (m_pFile->GetPos() - pos));
+
+ hr = DeliverPacket(p);
+ }
+ m_pFile->Seek(pos + h.len);
+ }
+ } else if (m_pFile->m_type == mpeg_ts) {
+ CMpegSplitterFile::trhdr h;
+
+ if (!m_pFile->Read(h)) {
+ return S_FALSE;
+ }
+
+
+ __int64 pos = m_pFile->GetPos();
+
+ m_pFile->UpdatePrograms(h, false);
+
+ if (h.payload && ISVALIDPID(h.pid)) {
+ DWORD TrackNumber = h.pid;
+
+ CMpegSplitterFile::peshdr h2;
+
+ if (h.payloadstart && m_pFile->NextMpegStartCode(b, 4) && m_pFile->Read(h2, b)) { // pes packet
+ if (h2.type == CMpegSplitterFile::mpeg2 && h2.scrambling) {
+ ASSERT(0);
+ return E_FAIL;
+ }
+ TrackNumber = m_pFile->AddStream(h.pid, b, 0, h.bytes - (DWORD)(m_pFile->GetPos() - pos));
+ }
+
+ if (GetOutputPin(TrackNumber)) {
+ CAutoPtr<Packet> p(DNew Packet());
+
+ p->TrackNumber = TrackNumber;
+ p->bSyncPoint = !!h2.fpts;
+ p->bAppendable = !h2.fpts;
+
+ if (h.fPCR) {
+ CRefTime rtNow;
+ StreamTime(rtNow);
+ //TRACE ("Now=%S PCR=%S\n", ReftimeToString(rtNow.m_time), ReftimeToString(h.PCR));
+ }
+
+ p->rtStart = h2.fpts ? (h2.pts - rtStartOffset) : Packet::INVALID_TIME;
+ p->rtStop = p->rtStart + 1;
+ p->SetCount(h.bytes - (size_t)(m_pFile->GetPos() - pos));
+
+ int nBytes = int(h.bytes - (m_pFile->GetPos() - pos));
+ m_pFile->ByteRead(p->GetData(), nBytes);
+
+ hr = DeliverPacket(p);
+ }
+ }
+
+ m_pFile->Seek(h.next);
+ } else if (m_pFile->m_type == mpeg_pva) {
+ CMpegSplitterFile::pvahdr h;
+ if (!m_pFile->Read(h)) {
+ return S_FALSE;
+ }
+
+ DWORD TrackNumber = h.streamid;
- DWORD TrackNumber = h.streamid;
-
- __int64 pos = m_pFile->GetPos();
+ __int64 pos = m_pFile->GetPos();
- if (GetOutputPin(TrackNumber)) {
- CAutoPtr<Packet> p(DNew Packet());
+ if (GetOutputPin(TrackNumber)) {
+ CAutoPtr<Packet> p(DNew Packet());
- p->TrackNumber = TrackNumber;
- p->bSyncPoint = !!h.fpts;
- p->bAppendable = !h.fpts;
- p->rtStart = h.fpts ? (h.pts - rtStartOffset) : Packet::INVALID_TIME;
- p->rtStop = p->rtStart+1;
- p->SetCount(h.length);
+ p->TrackNumber = TrackNumber;
+ p->bSyncPoint = !!h.fpts;
+ p->bAppendable = !h.fpts;
+ p->rtStart = h.fpts ? (h.pts - rtStartOffset) : Packet::INVALID_TIME;
+ p->rtStop = p->rtStart + 1;
+ p->SetCount(h.length);
- m_pFile->ByteRead(p->GetData(), h.length);
- hr = DeliverPacket(p);
- }
+ m_pFile->ByteRead(p->GetData(), h.length);
+ hr = DeliverPacket(p);
+ }
- m_pFile->Seek(pos + h.length);
- }
+ m_pFile->Seek(pos + h.length);
+ }
- return S_OK;
+ return S_OK;
}
//
HRESULT CMpegSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
{
- CheckPointer(pAsyncReader, E_POINTER);
-
- HRESULT hr = E_FAIL;
-
- m_pFile.Free();
-
- ReadClipInfo (GetPartFilename(pAsyncReader));
- m_pFile.Attach(DNew CMpegSplitterFile(pAsyncReader, hr, m_ClipInfo.IsHdmv(), m_ClipInfo, m_nVC1_GuidFlag, m_ForcedSub, m_TrackPriority, m_AC3CoreOnly, m_AlternativeDuration));
-
- if (!m_pFile) {
- return E_OUTOFMEMORY;
- }
-
- if (FAILED(hr)) {
- m_pFile.Free();
- return hr;
- }
-
- if (m_pFile->m_type == mpeg_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("");
-
- // Create
- if (m_ClipInfo.IsHdmv()) {
- for (size_t i=0; i < m_ClipInfo.GetStreamNumber(); i++) {
- CHdmvClipInfo::Stream* stream = m_ClipInfo.GetStreamByIndex (i);
- if (stream->m_Type == PRESENTATION_GRAPHICS_STREAM) {
- m_pFile->AddHdmvPGStream (stream->m_PID, stream->m_LanguageCode);
- }
- }
- }
-
- CString lang = _T("");
- CAtlList<CString> lang_list_audio;
- CAtlList<CString> lang_list_subpic;
- int Idx_audio = 99;
- int Idx_subpic = 99;
-
- if (!m_csAudioLanguageOrder.IsEmpty()) {
- int tPos = 0;
- lang = m_csAudioLanguageOrder.Tokenize(_T(",; "), tPos);
- while (tPos != -1) {
- if (!lang.IsEmpty()) lang_list_audio.AddTail(lang);
- lang = m_csAudioLanguageOrder.Tokenize(_T(",; "), tPos);
- }
- if (!lang.IsEmpty()) lang_list_audio.AddTail(lang);
- }
-
- if (!m_csSubtitlesLanguageOrder.IsEmpty()) {
- int tPos = 0;
- lang = m_csSubtitlesLanguageOrder.Tokenize(_T(",; "), tPos);
- while (tPos != -1) {
- if (!lang.IsEmpty()) lang_list_subpic.AddTail(lang);
- lang = m_csSubtitlesLanguageOrder.Tokenize(_T(",; "), tPos);
- }
- if (!lang.IsEmpty()) lang_list_subpic.AddTail(lang);
- }
-
- for (int i = 0; i < _countof(m_pFile->m_streams); i++) {
- POSITION pos = m_pFile->m_streams[i].GetHeadPosition();
- while (pos) {
- CMpegSplitterFile::stream& s = m_pFile->m_streams[i].GetNext(pos);
- CAtlArray<CMediaType> mts;
- mts.Add(s.mt);
-
- CStringW name = CMpegSplitterFile::CStreamList::ToString(i);
- CStringW str;
-
- if (i == CMpegSplitterFile::subpic && s.pid == NO_SUBTITLE_PID) {
- str = NO_SUBTITLE_NAME;
- continue;
- } else {
- int iProgram = -1;
- const CHdmvClipInfo::Stream *pClipInfo;
- const CMpegSplitterFile::program * pProgram = m_pFile->FindProgram(s.pid, iProgram, pClipInfo);
- const wchar_t *pStreamName = NULL;
- int StreamType = pClipInfo ? pClipInfo->m_Type : pProgram ? pProgram->streams[iProgram].type : 0;
- pStreamName = StreamTypeToName((PES_STREAM_TYPE)StreamType);
-
- CString lang_name = _T("");
- m_pFile->m_pPMT_Lang.Lookup(s.pid, lang_name);
-
- lang_name = pTI ? pTI->GetTrackName(s.ps1id) : lang_name;
-
- CString FormatDesc = GetMediaTypeDesc(&s.mt, pClipInfo, StreamType, lang_name);
-
- if (!FormatDesc.IsEmpty()) {
- str.Format(L"%s (%04x,%02x,%02x)", FormatDesc.GetString(), s.pid, s.pesid, s.ps1id); // TODO: make this nicer
- } else if (pStreamName) {
- str.Format(L"%s - %s (%04x,%02x,%02x)", name, pStreamName, s.pid, s.pesid, s.ps1id); // TODO: make this nicer
- } else {
- str.Format(L"%s (%04x,%02x,%02x)", name, s.pid, s.pesid, s.ps1id); // TODO: make this nicer
- }
- }
- CString str_tmp = str;
- str_tmp.MakeLower();
- if (i == CMpegSplitterFile::audio) {
- if (lang_list_audio.GetCount()>0) {
- int idx = 0;
- POSITION pos = lang_list_audio.GetHeadPosition();
- while (pos) {
- lang = lang_list_audio.GetNext(pos).MakeLower();
- if (-1 != str_tmp.Find(lang)) {
- if (idx<Idx_audio) {
- cs_audioProgram = str;
- Idx_audio = idx;
- break;
- }
- }
- idx++;
- }
- }
- if (!Idx_audio && !cs_audioProgram.IsEmpty()) break;
- }
- if (i == CMpegSplitterFile::subpic) {
- if (lang_list_subpic.GetCount()>0) {
- int idx = 0;
- POSITION pos = lang_list_subpic.GetHeadPosition();
- while (pos) {
- lang = lang_list_subpic.GetNext(pos).MakeLower();
- if (-1 != str_tmp.Find(lang)) {
- if (idx<Idx_subpic) {
- cs_subpicProgram = str;
- Idx_subpic = idx;
- break;
- }
- }
- idx++;
- }
- }
- if (!Idx_subpic && !cs_subpicProgram.IsEmpty()) break;
- }
- }
- }
-
- m_rtNewStart = m_rtCurrent = 0;
- m_rtNewStop = m_rtStop = m_rtDuration = 0;
-
- for (int i = 0; i < _countof(m_pFile->m_streams); i++) {
- POSITION pos = m_pFile->m_streams[i].GetHeadPosition();
- while (pos) {
- CMpegSplitterFile::stream& s = m_pFile->m_streams[i].GetNext(pos);
- CAtlArray<CMediaType> mts;
- mts.Add(s.mt);
-
- CStringW name = CMpegSplitterFile::CStreamList::ToString(i);
- CStringW str;
-
- if (i == CMpegSplitterFile::subpic && s.pid == NO_SUBTITLE_PID) {
- str = NO_SUBTITLE_NAME;
- } else {
- int iProgram = -1;
- const CHdmvClipInfo::Stream *pClipInfo;
- const CMpegSplitterFile::program * pProgram = m_pFile->FindProgram(s.pid, iProgram, pClipInfo);
- const wchar_t *pStreamName = NULL;
- int StreamType = pClipInfo ? pClipInfo->m_Type : pProgram ? pProgram->streams[iProgram].type : 0;
- pStreamName = StreamTypeToName((PES_STREAM_TYPE)StreamType);
-
- CString lang_name = _T("");
- m_pFile->m_pPMT_Lang.Lookup(s.pid, lang_name);
-
- lang_name = pTI ? pTI->GetTrackName(s.ps1id) : lang_name;
-
- CString FormatDesc = GetMediaTypeDesc(&s.mt, pClipInfo, StreamType, lang_name);
-
- if (!FormatDesc.IsEmpty()) {
- str.Format(L"%s (%04x,%02x,%02x)", FormatDesc.GetString(), s.pid, s.pesid, s.ps1id); // TODO: make this nicer
- } else if (pStreamName) {
- str.Format(L"%s - %s (%04x,%02x,%02x)", name, pStreamName, s.pid, s.pesid, s.ps1id); // TODO: make this nicer
- } else {
- str.Format(L"%s (%04x,%02x,%02x)", name, s.pid, s.pesid, s.ps1id); // TODO: make this nicer
- }
- }
-
- CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CMpegSplitterOutputPin(mts, str, this, this, &hr, m_pFile->m_type));
- if (i == CMpegSplitterFile::subpic) {
- (static_cast<CMpegSplitterOutputPin*>(pPinOut.m_p))->SetMaxShift (_I64_MAX);
- }
-
- if (i == CMpegSplitterFile::audio) {
- if (!cs_audioProgram.IsEmpty()) {
- if ((!cs_audioProgram.Compare(str)) && (S_OK == AddOutputPin(s, pPinOut))) {
- break;
- }
- } else {
- if (S_OK == AddOutputPin(s, pPinOut)) {
- break;
- }
- }
- }
- else if (i == CMpegSplitterFile::subpic) {
- if (!cs_subpicProgram.IsEmpty()) {
- if ((!cs_subpicProgram.Compare(str)) && (S_OK == AddOutputPin(s, pPinOut))) {
- break;
- }
- } else {
- if ((m_pFile->m_streams[CMpegSplitterFile::subpic].GetCount() == 1) && (S_OK == AddOutputPin(s, pPinOut))) {
- break;
- } else if ((s.pid != NO_SUBTITLE_PID) && (S_OK == AddOutputPin(s, pPinOut))) {
- break;
- }
- }
- } else {
- if (S_OK == AddOutputPin(s, pPinOut)) {
- break;
- }
- }
- }
- }
-
- if (m_rtPlaylistDuration) {
- m_rtNewStop = m_rtStop = m_rtDuration = m_rtPlaylistDuration;
- } else if (m_pFile->IsRandomAccess() && m_pFile->m_rate) {
- m_rtNewStop = m_rtStop = m_rtDuration = 10000000i64 * m_pFile->GetLength() / m_pFile->m_rate;
- }
-
- return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
+ CheckPointer(pAsyncReader, E_POINTER);
+
+ HRESULT hr = E_FAIL;
+
+ m_pFile.Free();
+
+ ReadClipInfo(GetPartFilename(pAsyncReader));
+ m_pFile.Attach(DNew CMpegSplitterFile(pAsyncReader, hr, m_ClipInfo.IsHdmv(), m_ClipInfo, m_nVC1_GuidFlag, m_ForcedSub, m_TrackPriority, m_AC3CoreOnly, m_AlternativeDuration));
+
+ if (!m_pFile) {
+ return E_OUTOFMEMORY;
+ }
+
+ if (FAILED(hr)) {
+ m_pFile.Free();
+ return hr;
+ }
+
+ if (m_pFile->m_type == mpeg_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("");
+
+ // Create
+ if (m_ClipInfo.IsHdmv()) {
+ for (size_t i = 0; i < m_ClipInfo.GetStreamNumber(); i++) {
+ CHdmvClipInfo::Stream* stream = m_ClipInfo.GetStreamByIndex(i);
+ if (stream->m_Type == PRESENTATION_GRAPHICS_STREAM) {
+ m_pFile->AddHdmvPGStream(stream->m_PID, stream->m_LanguageCode);
+ }
+ }
+ }
+
+ CString lang = _T("");
+ CAtlList<CString> lang_list_audio;
+ CAtlList<CString> lang_list_subpic;
+ int Idx_audio = 99;
+ int Idx_subpic = 99;
+
+ if (!m_csAudioLanguageOrder.IsEmpty()) {
+ int tPos = 0;
+ lang = m_csAudioLanguageOrder.Tokenize(_T(",; "), tPos);
+ while (tPos != -1) {
+ if (!lang.IsEmpty()) { lang_list_audio.AddTail(lang); }
+ lang = m_csAudioLanguageOrder.Tokenize(_T(",; "), tPos);
+ }
+ if (!lang.IsEmpty()) { lang_list_audio.AddTail(lang); }
+ }
+
+ if (!m_csSubtitlesLanguageOrder.IsEmpty()) {
+ int tPos = 0;
+ lang = m_csSubtitlesLanguageOrder.Tokenize(_T(",; "), tPos);
+ while (tPos != -1) {
+ if (!lang.IsEmpty()) { lang_list_subpic.AddTail(lang); }
+ lang = m_csSubtitlesLanguageOrder.Tokenize(_T(",; "), tPos);
+ }
+ if (!lang.IsEmpty()) { lang_list_subpic.AddTail(lang); }
+ }
+
+ for (int i = 0; i < _countof(m_pFile->m_streams); i++) {
+ POSITION pos = m_pFile->m_streams[i].GetHeadPosition();
+ while (pos) {
+ CMpegSplitterFile::stream& s = m_pFile->m_streams[i].GetNext(pos);
+ CAtlArray<CMediaType> mts;
+ mts.Add(s.mt);
+
+ CStringW name = CMpegSplitterFile::CStreamList::ToString(i);
+ CStringW str;
+
+ if (i == CMpegSplitterFile::subpic && s.pid == NO_SUBTITLE_PID) {
+ str = NO_SUBTITLE_NAME;
+ continue;
+ } else {
+ int iProgram = -1;
+ const CHdmvClipInfo::Stream* pClipInfo;
+ const CMpegSplitterFile::program* pProgram = m_pFile->FindProgram(s.pid, iProgram, pClipInfo);
+ const wchar_t* pStreamName = NULL;
+ int StreamType = pClipInfo ? pClipInfo->m_Type : pProgram ? pProgram->streams[iProgram].type : 0;
+ pStreamName = StreamTypeToName((PES_STREAM_TYPE)StreamType);
+
+ CString lang_name = _T("");
+ m_pFile->m_pPMT_Lang.Lookup(s.pid, lang_name);
+
+ lang_name = pTI ? pTI->GetTrackName(s.ps1id) : lang_name;
+
+ CString FormatDesc = GetMediaTypeDesc(&s.mt, pClipInfo, StreamType, lang_name);
+
+ if (!FormatDesc.IsEmpty()) {
+ str.Format(L"%s (%04x,%02x,%02x)", FormatDesc.GetString(), s.pid, s.pesid, s.ps1id); // TODO: make this nicer
+ } else if (pStreamName) {
+ str.Format(L"%s - %s (%04x,%02x,%02x)", name, pStreamName, s.pid, s.pesid, s.ps1id); // TODO: make this nicer
+ } else {
+ str.Format(L"%s (%04x,%02x,%02x)", name, s.pid, s.pesid, s.ps1id); // TODO: make this nicer
+ }
+ }
+ CString str_tmp = str;
+ str_tmp.MakeLower();
+ if (i == CMpegSplitterFile::audio) {
+ if (lang_list_audio.GetCount() > 0) {
+ int idx = 0;
+ POSITION pos = lang_list_audio.GetHeadPosition();
+ while (pos) {
+ lang = lang_list_audio.GetNext(pos).MakeLower();
+ if (-1 != str_tmp.Find(lang)) {
+ if (idx < Idx_audio) {
+ cs_audioProgram = str;
+ Idx_audio = idx;
+ break;
+ }
+ }
+ idx++;
+ }
+ }
+ if (!Idx_audio && !cs_audioProgram.IsEmpty()) { break; }
+ }
+ if (i == CMpegSplitterFile::subpic) {
+ if (lang_list_subpic.GetCount() > 0) {
+ int idx = 0;
+ POSITION pos = lang_list_subpic.GetHeadPosition();
+ while (pos) {
+ lang = lang_list_subpic.GetNext(pos).MakeLower();
+ if (-1 != str_tmp.Find(lang)) {
+ if (idx < Idx_subpic) {
+ cs_subpicProgram = str;
+ Idx_subpic = idx;
+ break;
+ }
+ }
+ idx++;
+ }
+ }
+ if (!Idx_subpic && !cs_subpicProgram.IsEmpty()) { break; }
+ }
+ }
+ }
+
+ m_rtNewStart = m_rtCurrent = 0;
+ m_rtNewStop = m_rtStop = m_rtDuration = 0;
+
+ for (int i = 0; i < _countof(m_pFile->m_streams); i++) {
+ POSITION pos = m_pFile->m_streams[i].GetHeadPosition();
+ while (pos) {
+ CMpegSplitterFile::stream& s = m_pFile->m_streams[i].GetNext(pos);
+ CAtlArray<CMediaType> mts;
+ mts.Add(s.mt);
+
+ CStringW name = CMpegSplitterFile::CStreamList::ToString(i);
+ CStringW str;
+
+ if (i == CMpegSplitterFile::subpic && s.pid == NO_SUBTITLE_PID) {
+ str = NO_SUBTITLE_NAME;
+ } else {
+ int iProgram = -1;
+ const CHdmvClipInfo::Stream* pClipInfo;
+ const CMpegSplitterFile::program* pProgram = m_pFile->FindProgram(s.pid, iProgram, pClipInfo);
+ const wchar_t* pStreamName = NULL;
+ int StreamType = pClipInfo ? pClipInfo->m_Type : pProgram ? pProgram->streams[iProgram].type : 0;
+ pStreamName = StreamTypeToName((PES_STREAM_TYPE)StreamType);
+
+ CString lang_name = _T("");
+ m_pFile->m_pPMT_Lang.Lookup(s.pid, lang_name);
+
+ lang_name = pTI ? pTI->GetTrackName(s.ps1id) : lang_name;
+
+ CString FormatDesc = GetMediaTypeDesc(&s.mt, pClipInfo, StreamType, lang_name);
+
+ if (!FormatDesc.IsEmpty()) {
+ str.Format(L"%s (%04x,%02x,%02x)", FormatDesc.GetString(), s.pid, s.pesid, s.ps1id); // TODO: make this nicer
+ } else if (pStreamName) {
+ str.Format(L"%s - %s (%04x,%02x,%02x)", name, pStreamName, s.pid, s.pesid, s.ps1id); // TODO: make this nicer
+ } else {
+ str.Format(L"%s (%04x,%02x,%02x)", name, s.pid, s.pesid, s.ps1id); // TODO: make this nicer
+ }
+ }
+
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CMpegSplitterOutputPin(mts, str, this, this, &hr, m_pFile->m_type));
+ if (i == CMpegSplitterFile::subpic) {
+ (static_cast<CMpegSplitterOutputPin*>(pPinOut.m_p))->SetMaxShift(_I64_MAX);
+ }
+
+ if (i == CMpegSplitterFile::audio) {
+ if (!cs_audioProgram.IsEmpty()) {
+ if ((!cs_audioProgram.Compare(str)) && (S_OK == AddOutputPin(s, pPinOut))) {
+ break;
+ }
+ } else {
+ if (S_OK == AddOutputPin(s, pPinOut)) {
+ break;
+ }
+ }
+ } else if (i == CMpegSplitterFile::subpic) {
+ if (!cs_subpicProgram.IsEmpty()) {
+ if ((!cs_subpicProgram.Compare(str)) && (S_OK == AddOutputPin(s, pPinOut))) {
+ break;
+ }
+ } else {
+ if ((m_pFile->m_streams[CMpegSplitterFile::subpic].GetCount() == 1) && (S_OK == AddOutputPin(s, pPinOut))) {
+ break;
+ } else if ((s.pid != NO_SUBTITLE_PID) && (S_OK == AddOutputPin(s, pPinOut))) {
+ break;
+ }
+ }
+ } else {
+ if (S_OK == AddOutputPin(s, pPinOut)) {
+ break;
+ }
+ }
+ }
+ }
+
+ if (m_rtPlaylistDuration) {
+ m_rtNewStop = m_rtStop = m_rtDuration = m_rtPlaylistDuration;
+ } else if (m_pFile->IsRandomAccess() && m_pFile->m_rate) {
+ m_rtNewStop = m_rtStop = m_rtDuration = 10000000i64 * m_pFile->GetLength() / m_pFile->m_rate;
+ }
+
+ return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
}
bool CMpegSplitterFilter::DemuxInit()
{
- SetThreadName((DWORD)-1, "CMpegSplitterFilter");
- if (!m_pFile) {
- return false;
- }
+ SetThreadName((DWORD) - 1, "CMpegSplitterFilter");
+ if (!m_pFile) {
+ return false;
+ }
- m_rtStartOffset = 0;
+ m_rtStartOffset = 0;
- return true;
+ return true;
}
void CMpegSplitterFilter::DemuxSeek(REFERENCE_TIME rt)
{
- CAtlList<CMpegSplitterFile::stream>* pMasterStream = m_pFile->GetMasterStream();
-
- if (!pMasterStream) {
- ASSERT(0);
- return;
- }
-
- if (m_pFile->IsStreaming()) {
- m_pFile->Seek(max(0, m_pFile->GetLength() - 100*1024));
- m_rtStartOffset = m_pFile->m_rtMin + m_pFile->NextPTS(pMasterStream->GetHead());
- return;
- }
-
- REFERENCE_TIME rtPreroll = 10000000;
-
- if (rt <= rtPreroll || m_rtDuration <= 0) {
- m_pFile->Seek(0);
- } else {
- __int64 len = m_pFile->GetLength();
- __int64 seekpos = (__int64)(1.0*rt/m_rtDuration*len);
- __int64 minseekpos = _I64_MAX;
-
- REFERENCE_TIME rtmax = rt - rtPreroll;
- REFERENCE_TIME rtmin = rtmax - 5000000;
-
- if (m_rtStartOffset == 0)
- for (int i = 0; i < _countof(m_pFile->m_streams)-1; i++) {
- POSITION pos = m_pFile->m_streams[i].GetHeadPosition();
- while (pos) {
- DWORD TrackNum = m_pFile->m_streams[i].GetNext(pos);
-
- CBaseSplitterOutputPin* pPin = GetOutputPin(TrackNum);
- if (pPin && pPin->IsConnected()) {
- m_pFile->Seek(seekpos);
-
- __int64 curpos = seekpos;
- REFERENCE_TIME pdt = _I64_MIN;
-
- for (int j = 0; j < 10; j++) {
- REFERENCE_TIME rt = m_pFile->NextPTS(TrackNum);
-
- if (rt < 0) {
- break;
- }
-
- REFERENCE_TIME dt = rt - rtmax;
- if (dt > 0 && dt == pdt) {
- dt = 10000000i64;
- }
-
-
- if (rtmin <= rt && rt <= rtmax || pdt > 0 && dt < 0) {
- minseekpos = min(minseekpos, curpos);
- break;
- }
-
- curpos -= (__int64)(1.0*dt/m_rtDuration*len);
- m_pFile->Seek(curpos);
-
- //pdt = dt;
- }
- }
- }
- }
-
- if (minseekpos != _I64_MAX) {
- seekpos = minseekpos;
- } else {
- // this file is probably screwed up, try plan B, seek simply by bitrate
-
- rt -= rtPreroll;
- seekpos = (__int64)(1.0*rt/m_rtDuration*len);
- m_pFile->Seek(seekpos);
- m_rtStartOffset = m_pFile->m_rtMin + m_pFile->NextPTS(pMasterStream->GetHead()) - rt;
- }
-
- m_pFile->Seek(seekpos);
- }
+ CAtlList<CMpegSplitterFile::stream>* pMasterStream = m_pFile->GetMasterStream();
+
+ if (!pMasterStream) {
+ ASSERT(0);
+ return;
+ }
+
+ if (m_pFile->IsStreaming()) {
+ m_pFile->Seek(max(0, m_pFile->GetLength() - 100 * 1024));
+ m_rtStartOffset = m_pFile->m_rtMin + m_pFile->NextPTS(pMasterStream->GetHead());
+ return;
+ }
+
+ REFERENCE_TIME rtPreroll = 10000000;
+
+ if (rt <= rtPreroll || m_rtDuration <= 0) {
+ m_pFile->Seek(0);
+ } else {
+ __int64 len = m_pFile->GetLength();
+ __int64 seekpos = (__int64)(1.0 * rt / m_rtDuration * len);
+ __int64 minseekpos = _I64_MAX;
+
+ REFERENCE_TIME rtmax = rt - rtPreroll;
+ REFERENCE_TIME rtmin = rtmax - 5000000;
+
+ if (m_rtStartOffset == 0)
+ for (int i = 0; i < _countof(m_pFile->m_streams) - 1; i++) {
+ POSITION pos = m_pFile->m_streams[i].GetHeadPosition();
+ while (pos) {
+ DWORD TrackNum = m_pFile->m_streams[i].GetNext(pos);
+
+ CBaseSplitterOutputPin* pPin = GetOutputPin(TrackNum);
+ if (pPin && pPin->IsConnected()) {
+ m_pFile->Seek(seekpos);
+
+ __int64 curpos = seekpos;
+ REFERENCE_TIME pdt = _I64_MIN;
+
+ for (int j = 0; j < 10; j++) {
+ REFERENCE_TIME rt = m_pFile->NextPTS(TrackNum);
+
+ if (rt < 0) {
+ break;
+ }
+
+ REFERENCE_TIME dt = rt - rtmax;
+ if (dt > 0 && dt == pdt) {
+ dt = 10000000i64;
+ }
+
+
+ if (rtmin <= rt && rt <= rtmax || pdt > 0 && dt < 0) {
+ minseekpos = min(minseekpos, curpos);
+ break;
+ }
+
+ curpos -= (__int64)(1.0 * dt / m_rtDuration * len);
+ m_pFile->Seek(curpos);
+
+ //pdt = dt;
+ }
+ }
+ }
+ }
+
+ if (minseekpos != _I64_MAX) {
+ seekpos = minseekpos;
+ } else {
+ // this file is probably screwed up, try plan B, seek simply by bitrate
+
+ rt -= rtPreroll;
+ seekpos = (__int64)(1.0 * rt / m_rtDuration * len);
+ m_pFile->Seek(seekpos);
+ m_rtStartOffset = m_pFile->m_rtMin + m_pFile->NextPTS(pMasterStream->GetHead()) - rt;
+ }
+
+ m_pFile->Seek(seekpos);
+ }
}
bool CMpegSplitterFilter::DemuxLoop()
{
- REFERENCE_TIME rtStartOffset = m_rtStartOffset ? m_rtStartOffset : m_pFile->m_rtMin;
+ REFERENCE_TIME rtStartOffset = m_rtStartOffset ? m_rtStartOffset : m_pFile->m_rtMin;
- HRESULT hr = S_OK;
- while (SUCCEEDED(hr) && !CheckRequest(NULL)) {
- if ((hr = m_pFile->HasMoreData(1024*500)) == S_OK)
- if ((hr = DemuxNextPacket(rtStartOffset)) == S_FALSE) {
- Sleep(1);
- }
- }
+ HRESULT hr = S_OK;
+ while (SUCCEEDED(hr) && !CheckRequest(NULL)) {
+ if ((hr = m_pFile->HasMoreData(1024 * 500)) == S_OK)
+ if ((hr = DemuxNextPacket(rtStartOffset)) == S_FALSE) {
+ Sleep(1);
+ }
+ }
- return true;
+ return true;
}
bool CMpegSplitterFilter::BuildPlaylist(LPCTSTR pszFileName, CAtlList<CHdmvClipInfo::PlaylistItem>& Items)
{
- m_rtPlaylistDuration = 0;
- return SUCCEEDED (m_ClipInfo.ReadPlaylist (pszFileName, m_rtPlaylistDuration, Items)) ? true : false;
+ m_rtPlaylistDuration = 0;
+ return SUCCEEDED(m_ClipInfo.ReadPlaylist(pszFileName, m_rtPlaylistDuration, Items)) ? true : false;
}
bool CMpegSplitterFilter::BuildChapters(LPCTSTR pszFileName, CAtlList<CHdmvClipInfo::PlaylistItem>& PlaylistItems, CAtlList<CHdmvClipInfo::PlaylistChapter>& Items)
{
- return SUCCEEDED (m_ClipInfo.ReadChapters (pszFileName, PlaylistItems, Items)) ? true : false;
+ return SUCCEEDED(m_ClipInfo.ReadChapters(pszFileName, PlaylistItems, Items)) ? true : false;
}
// IAMStreamSelect
STDMETHODIMP CMpegSplitterFilter::Count(DWORD* pcStreams)
{
- CheckPointer(pcStreams, E_POINTER);
+ CheckPointer(pcStreams, E_POINTER);
- *pcStreams = 0;
+ *pcStreams = 0;
- for (int i = 0; i < _countof(m_pFile->m_streams); i++) {
- (*pcStreams) += m_pFile->m_streams[i].GetCount();
- }
+ for (int i = 0; i < _countof(m_pFile->m_streams); i++) {
+ (*pcStreams) += m_pFile->m_streams[i].GetCount();
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CMpegSplitterFilter::Enable(long lIndex, DWORD dwFlags)
{
- if (!(dwFlags & AMSTREAMSELECTENABLE_ENABLE)) {
- return E_NOTIMPL;
- }
+ if (!(dwFlags & AMSTREAMSELECTENABLE_ENABLE)) {
+ return E_NOTIMPL;
+ }
- for (int i = 0, j = 0; i < _countof(m_pFile->m_streams); i++) {
- int cnt = m_pFile->m_streams[i].GetCount();
+ for (int i = 0, j = 0; i < _countof(m_pFile->m_streams); i++) {
+ int cnt = m_pFile->m_streams[i].GetCount();
- if (lIndex >= j && lIndex < j+cnt) {
- lIndex -= j;
+ if (lIndex >= j && lIndex < j + cnt) {
+ lIndex -= j;
- POSITION pos = m_pFile->m_streams[i].FindIndex(lIndex);
- if (!pos) {
- return E_UNEXPECTED;
- }
+ POSITION pos = m_pFile->m_streams[i].FindIndex(lIndex);
+ if (!pos) {
+ return E_UNEXPECTED;
+ }
- CMpegSplitterFile::stream& to = m_pFile->m_streams[i].GetAt(pos);
+ CMpegSplitterFile::stream& to = m_pFile->m_streams[i].GetAt(pos);
- pos = m_pFile->m_streams[i].GetHeadPosition();
- while (pos) {
- CMpegSplitterFile::stream& from = m_pFile->m_streams[i].GetNext(pos);
- if (!GetOutputPin(from)) {
- continue;
- }
+ pos = m_pFile->m_streams[i].GetHeadPosition();
+ while (pos) {
+ CMpegSplitterFile::stream& from = m_pFile->m_streams[i].GetNext(pos);
+ if (!GetOutputPin(from)) {
+ continue;
+ }
- if (m_useFastStreamChange) {
- PauseGraph;
- ResumeGraph;
- }
+ if (m_useFastStreamChange) {
+ PauseGraph;
+ ResumeGraph;
+ }
- HRESULT hr;
- if (FAILED(hr = RenameOutputPin(from, to, &to.mt))) {
- return hr;
- }
+ HRESULT hr;
+ if (FAILED(hr = RenameOutputPin(from, to, &to.mt))) {
+ return hr;
+ }
#if 0
- // Don't rename other pin for Hdmv!
- int iProgram;
- const CHdmvClipInfo::Stream *pClipInfo;
- const CMpegSplitterFile::program* p = m_pFile->FindProgram(to.pid, iProgram, pClipInfo);
-
- if (p!=NULL && !m_ClipInfo.IsHdmv() && !m_pFile->IsHdmv()) {
- for (int k = 0; k < _countof(m_pFile->m_streams); k++) {
- if (k == i) {
- continue;
- }
-
- pos = m_pFile->m_streams[k].GetHeadPosition();
- while (pos) {
- CMpegSplitterFile::stream& from = m_pFile->m_streams[k].GetNext(pos);
- if (!GetOutputPin(from)) {
- continue;
- }
-
- for (int l = 0; l < _countof(p->streams); l++) {
- if (const CMpegSplitterFile::stream* s = m_pFile->m_streams[k].FindStream(p->streams[l].pid)) {
- if (from != *s) {
- hr = RenameOutputPin(from, *s, &s->mt);
- }
- break;
- }
- }
- }
- }
- }
+ // Don't rename other pin for Hdmv!
+ int iProgram;
+ const CHdmvClipInfo::Stream* pClipInfo;
+ const CMpegSplitterFile::program* p = m_pFile->FindProgram(to.pid, iProgram, pClipInfo);
+
+ if (p != NULL && !m_ClipInfo.IsHdmv() && !m_pFile->IsHdmv()) {
+ for (int k = 0; k < _countof(m_pFile->m_streams); k++) {
+ if (k == i) {
+ continue;
+ }
+
+ pos = m_pFile->m_streams[k].GetHeadPosition();
+ while (pos) {
+ CMpegSplitterFile::stream& from = m_pFile->m_streams[k].GetNext(pos);
+ if (!GetOutputPin(from)) {
+ continue;
+ }
+
+ for (int l = 0; l < _countof(p->streams); l++) {
+ if (const CMpegSplitterFile::stream* s = m_pFile->m_streams[k].FindStream(p->streams[l].pid)) {
+ if (from != *s) {
+ hr = RenameOutputPin(from, *s, &s->mt);
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
#endif
- return S_OK;
- }
- }
+ return S_OK;
+ }
+ }
- j += cnt;
- }
+ j += cnt;
+ }
- return S_FALSE;
+ return S_FALSE;
}
-LONGLONG GetMediaTypeQuality(const CMediaType *_pMediaType, int _PresentationFormat)
+LONGLONG GetMediaTypeQuality(const CMediaType* _pMediaType, int _PresentationFormat)
{
- if (_pMediaType->formattype == FORMAT_WaveFormatEx) {
- __int64 Ret = 0;
-
- const WAVEFORMATEX *pInfo = GetFormatHelper(pInfo, _pMediaType);
- int TypePriority = 0;
-
- if (_pMediaType->subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO) {
- TypePriority = 12;
- } else if (_pMediaType->subtype == MEDIASUBTYPE_HDMV_LPCM_AUDIO) {
- TypePriority = 12;
- } else {
- if (_PresentationFormat == AUDIO_STREAM_DTS_HD_MASTER_AUDIO) {
- TypePriority = 12;
- } else if (_PresentationFormat == AUDIO_STREAM_DTS_HD) {
- TypePriority = 11;
- } else if (_PresentationFormat == AUDIO_STREAM_AC3_TRUE_HD) {
- TypePriority = 12;
- } else if (_PresentationFormat == AUDIO_STREAM_AC3_PLUS) {
- TypePriority = 10;
- } else {
- switch (pInfo->wFormatTag) {
- case WAVE_FORMAT_PS2_PCM: {
- TypePriority = 12;
- }
- break;
- case WAVE_FORMAT_PS2_ADPCM: {
- TypePriority = 4;
- }
- break;
- case WAVE_FORMAT_DVD_DTS: {
- TypePriority = 9;
- }
- break;
- case WAVE_FORMAT_DOLBY_AC3: {
- TypePriority = 8;
- }
- break;
- case WAVE_FORMAT_AAC: {
- TypePriority = 7;
- }
- break;
- case WAVE_FORMAT_MP3: {
- TypePriority = 6;
- }
- break;
- case WAVE_FORMAT_MPEG: {
- TypePriority = 5;
- }
- break;
- }
- }
- }
-
- Ret += __int64(TypePriority) * 100000000i64 * 1000000000i64;
-
- Ret += __int64(pInfo->nChannels) * 1000000i64 * 1000000000i64;
- Ret += __int64(pInfo->nSamplesPerSec) * 10i64 * 1000000000i64;
- Ret += __int64(pInfo->wBitsPerSample) * 10000000i64;
- Ret += __int64(pInfo->nAvgBytesPerSec);
-
- return Ret;
- }
-
- return 0;
+ if (_pMediaType->formattype == FORMAT_WaveFormatEx) {
+ __int64 Ret = 0;
+
+ const WAVEFORMATEX* pInfo = GetFormatHelper(pInfo, _pMediaType);
+ int TypePriority = 0;
+
+ if (_pMediaType->subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO) {
+ TypePriority = 12;
+ } else if (_pMediaType->subtype == MEDIASUBTYPE_HDMV_LPCM_AUDIO) {
+ TypePriority = 12;
+ } else {
+ if (_PresentationFormat == AUDIO_STREAM_DTS_HD_MASTER_AUDIO) {
+ TypePriority = 12;
+ } else if (_PresentationFormat == AUDIO_STREAM_DTS_HD) {
+ TypePriority = 11;
+ } else if (_PresentationFormat == AUDIO_STREAM_AC3_TRUE_HD) {
+ TypePriority = 12;
+ } else if (_PresentationFormat == AUDIO_STREAM_AC3_PLUS) {
+ TypePriority = 10;
+ } else {
+ switch (pInfo->wFormatTag) {
+ case WAVE_FORMAT_PS2_PCM: {
+ TypePriority = 12;
+ }
+ break;
+ case WAVE_FORMAT_PS2_ADPCM: {
+ TypePriority = 4;
+ }
+ break;
+ case WAVE_FORMAT_DVD_DTS: {
+ TypePriority = 9;
+ }
+ break;
+ case WAVE_FORMAT_DOLBY_AC3: {
+ TypePriority = 8;
+ }
+ break;
+ case WAVE_FORMAT_AAC: {
+ TypePriority = 7;
+ }
+ break;
+ case WAVE_FORMAT_MP3: {
+ TypePriority = 6;
+ }
+ break;
+ case WAVE_FORMAT_MPEG: {
+ TypePriority = 5;
+ }
+ break;
+ }
+ }
+ }
+
+ Ret += __int64(TypePriority) * 100000000i64 * 1000000000i64;
+
+ Ret += __int64(pInfo->nChannels) * 1000000i64 * 1000000000i64;
+ Ret += __int64(pInfo->nSamplesPerSec) * 10i64 * 1000000000i64;
+ Ret += __int64(pInfo->wBitsPerSample) * 10000000i64;
+ Ret += __int64(pInfo->nAvgBytesPerSec);
+
+ return Ret;
+ }
+
+ return 0;
}
-bool CMpegSplitterFile::stream::operator < (const stream &_Other) const
+bool CMpegSplitterFile::stream::operator < (const stream& _Other) const
{
- if (mt.majortype == MEDIATYPE_Audio && _Other.mt.majortype == MEDIATYPE_Audio) {
- int iProgram0;
- const CHdmvClipInfo::Stream *pClipInfo0;
- const CMpegSplitterFile::program * pProgram0 = m_pFile->FindProgram(pid, iProgram0, pClipInfo0);
- int StreamType0 = pClipInfo0 ? pClipInfo0->m_Type : pProgram0 ? pProgram0->streams[iProgram0].type : 0;
- int iProgram1;
- const CHdmvClipInfo::Stream *pClipInfo1;
- const CMpegSplitterFile::program * pProgram1 = m_pFile->FindProgram(_Other.pid, iProgram1, pClipInfo1);
- int StreamType1 = pClipInfo1 ? pClipInfo1->m_Type : pProgram1 ? pProgram1->streams[iProgram1].type : 0;
-
- if (mt.formattype == FORMAT_WaveFormatEx && _Other.mt.formattype != FORMAT_WaveFormatEx) {
- return true;
- }
- if (mt.formattype != FORMAT_WaveFormatEx && _Other.mt.formattype == FORMAT_WaveFormatEx) {
- return false;
- }
-
- LONGLONG Quality0 = GetMediaTypeQuality(&mt, StreamType0);
- LONGLONG Quality1 = GetMediaTypeQuality(&_Other.mt, StreamType1);
- if (Quality0 > Quality1) {
- return true;
- }
- if (Quality0 < Quality1) {
- return false;
- }
- }
- DWORD DefaultFirst = *this;
- DWORD DefaultSecond = _Other;
- return DefaultFirst < DefaultSecond;
+ if (mt.majortype == MEDIATYPE_Audio && _Other.mt.majortype == MEDIATYPE_Audio) {
+ int iProgram0;
+ const CHdmvClipInfo::Stream* pClipInfo0;
+ const CMpegSplitterFile::program* pProgram0 = m_pFile->FindProgram(pid, iProgram0, pClipInfo0);
+ int StreamType0 = pClipInfo0 ? pClipInfo0->m_Type : pProgram0 ? pProgram0->streams[iProgram0].type : 0;
+ int iProgram1;
+ const CHdmvClipInfo::Stream* pClipInfo1;
+ const CMpegSplitterFile::program* pProgram1 = m_pFile->FindProgram(_Other.pid, iProgram1, pClipInfo1);
+ int StreamType1 = pClipInfo1 ? pClipInfo1->m_Type : pProgram1 ? pProgram1->streams[iProgram1].type : 0;
+
+ if (mt.formattype == FORMAT_WaveFormatEx && _Other.mt.formattype != FORMAT_WaveFormatEx) {
+ return true;
+ }
+ if (mt.formattype != FORMAT_WaveFormatEx && _Other.mt.formattype == FORMAT_WaveFormatEx) {
+ return false;
+ }
+
+ LONGLONG Quality0 = GetMediaTypeQuality(&mt, StreamType0);
+ LONGLONG Quality1 = GetMediaTypeQuality(&_Other.mt, StreamType1);
+ if (Quality0 > Quality1) {
+ return true;
+ }
+ if (Quality0 < Quality1) {
+ return false;
+ }
+ }
+ DWORD DefaultFirst = *this;
+ DWORD DefaultSecond = _Other;
+ return DefaultFirst < DefaultSecond;
}
STDMETHODIMP CMpegSplitterFilter::Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD* pdwFlags, LCID* plcid, DWORD* pdwGroup, WCHAR** ppszName, IUnknown** ppObject, IUnknown** ppUnk)
{
- for (int i = 0, j = 0; i < _countof(m_pFile->m_streams); i++) {
- int cnt = m_pFile->m_streams[i].GetCount();
-
- if (lIndex >= j && lIndex < j+cnt) {
- lIndex -= j;
-
- POSITION pos = m_pFile->m_streams[i].FindIndex(lIndex);
- if (!pos) {
- return E_UNEXPECTED;
- }
-
- CMpegSplitterFile::stream& s = m_pFile->m_streams[i].GetAt(pos);
- CHdmvClipInfo::Stream* pStream = m_ClipInfo.FindStream (s.pid);
-
- if (ppmt) {
- *ppmt = CreateMediaType(&s.mt);
- }
- if (pdwFlags) {
- *pdwFlags = GetOutputPin(s) ? (AMSTREAMSELECTINFO_ENABLED|AMSTREAMSELECTINFO_EXCLUSIVE) : 0;
- }
- if (plcid) {
- *plcid = pStream ? pStream->m_LCID : 0;
- }
- if (pdwGroup) {
- *pdwGroup = i;
- }
- if (ppObject) {
- *ppObject = NULL;
- }
- if (ppUnk) {
- *ppUnk = NULL;
- }
-
- if (ppszName) {
- CStringW name = CMpegSplitterFile::CStreamList::ToString(i);
-
- CStringW str;
-
- if (i == CMpegSplitterFile::subpic && s.pid == NO_SUBTITLE_PID) {
- str = NO_SUBTITLE_NAME;
- if (plcid) {
- *plcid = (LCID)LCID_NOSUBTITLES;
- }
- } else {
- int iProgram;
- const CHdmvClipInfo::Stream *pClipInfo;
- const CMpegSplitterFile::program * pProgram = m_pFile->FindProgram(s.pid, iProgram, pClipInfo);
- const wchar_t *pStreamName = NULL;
- int StreamType = pClipInfo ? pClipInfo->m_Type : pProgram ? pProgram->streams[iProgram].type : 0;
- pStreamName = StreamTypeToName((PES_STREAM_TYPE)StreamType);
-
- CString lang_name = _T("");
- m_pFile->m_pPMT_Lang.Lookup(s.pid, lang_name);
-
- lang_name = pTI ? pTI->GetTrackName(s.ps1id) : lang_name;
-
- CString FormatDesc = GetMediaTypeDesc(&s.mt, pClipInfo, StreamType, lang_name);
-
- if (!FormatDesc.IsEmpty()) {
- str.Format(L"%s (%04x,%02x,%02x)", FormatDesc.GetString(), s.pid, s.pesid, s.ps1id); // TODO: make this nicer
- } else if (pStreamName) {
- str.Format(L"%s - %s (%04x,%02x,%02x)", name, pStreamName, s.pid, s.pesid, s.ps1id); // TODO: make this nicer
- } else {
- str.Format(L"%s (%04x,%02x,%02x)", name, s.pid, s.pesid, s.ps1id); // TODO: make this nicer
- }
- }
-
- *ppszName = (WCHAR*)CoTaskMemAlloc((str.GetLength()+1)*sizeof(WCHAR));
- if (*ppszName == NULL) {
- return E_OUTOFMEMORY;
- }
-
- wcscpy_s(*ppszName, str.GetLength()+1, str);
- }
- }
-
- j += cnt;
- }
-
- return S_OK;
+ for (int i = 0, j = 0; i < _countof(m_pFile->m_streams); i++) {
+ int cnt = m_pFile->m_streams[i].GetCount();
+
+ if (lIndex >= j && lIndex < j + cnt) {
+ lIndex -= j;
+
+ POSITION pos = m_pFile->m_streams[i].FindIndex(lIndex);
+ if (!pos) {
+ return E_UNEXPECTED;
+ }
+
+ CMpegSplitterFile::stream& s = m_pFile->m_streams[i].GetAt(pos);
+ CHdmvClipInfo::Stream* pStream = m_ClipInfo.FindStream(s.pid);
+
+ if (ppmt) {
+ *ppmt = CreateMediaType(&s.mt);
+ }
+ if (pdwFlags) {
+ *pdwFlags = GetOutputPin(s) ? (AMSTREAMSELECTINFO_ENABLED | AMSTREAMSELECTINFO_EXCLUSIVE) : 0;
+ }
+ if (plcid) {
+ *plcid = pStream ? pStream->m_LCID : 0;
+ }
+ if (pdwGroup) {
+ *pdwGroup = i;
+ }
+ if (ppObject) {
+ *ppObject = NULL;
+ }
+ if (ppUnk) {
+ *ppUnk = NULL;
+ }
+
+ if (ppszName) {
+ CStringW name = CMpegSplitterFile::CStreamList::ToString(i);
+
+ CStringW str;
+
+ if (i == CMpegSplitterFile::subpic && s.pid == NO_SUBTITLE_PID) {
+ str = NO_SUBTITLE_NAME;
+ if (plcid) {
+ *plcid = (LCID)LCID_NOSUBTITLES;
+ }
+ } else {
+ int iProgram;
+ const CHdmvClipInfo::Stream* pClipInfo;
+ const CMpegSplitterFile::program* pProgram = m_pFile->FindProgram(s.pid, iProgram, pClipInfo);
+ const wchar_t* pStreamName = NULL;
+ int StreamType = pClipInfo ? pClipInfo->m_Type : pProgram ? pProgram->streams[iProgram].type : 0;
+ pStreamName = StreamTypeToName((PES_STREAM_TYPE)StreamType);
+
+ CString lang_name = _T("");
+ m_pFile->m_pPMT_Lang.Lookup(s.pid, lang_name);
+
+ lang_name = pTI ? pTI->GetTrackName(s.ps1id) : lang_name;
+
+ CString FormatDesc = GetMediaTypeDesc(&s.mt, pClipInfo, StreamType, lang_name);
+
+ if (!FormatDesc.IsEmpty()) {
+ str.Format(L"%s (%04x,%02x,%02x)", FormatDesc.GetString(), s.pid, s.pesid, s.ps1id); // TODO: make this nicer
+ } else if (pStreamName) {
+ str.Format(L"%s - %s (%04x,%02x,%02x)", name, pStreamName, s.pid, s.pesid, s.ps1id); // TODO: make this nicer
+ } else {
+ str.Format(L"%s (%04x,%02x,%02x)", name, s.pid, s.pesid, s.ps1id); // TODO: make this nicer
+ }
+ }
+
+ *ppszName = (WCHAR*)CoTaskMemAlloc((str.GetLength() + 1) * sizeof(WCHAR));
+ if (*ppszName == NULL) {
+ return E_OUTOFMEMORY;
+ }
+
+ wcscpy_s(*ppszName, str.GetLength() + 1, str);
+ }
+ }
+
+ j += cnt;
+ }
+
+ return S_OK;
}
// ISpecifyPropertyPages2
STDMETHODIMP CMpegSplitterFilter::GetPages(CAUUID* pPages)
{
- CheckPointer(pPages, E_POINTER);
+ CheckPointer(pPages, E_POINTER);
- pPages->cElems = 1;
- pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID) * pPages->cElems);
- pPages->pElems[0] = __uuidof(CMpegSplitterSettingsWnd);
+ pPages->cElems = 1;
+ pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID) * pPages->cElems);
+ pPages->pElems[0] = __uuidof(CMpegSplitterSettingsWnd);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CMpegSplitterFilter::CreatePage(const GUID& guid, IPropertyPage** ppPage)
{
- CheckPointer(ppPage, E_POINTER);
+ CheckPointer(ppPage, E_POINTER);
- if (*ppPage != NULL) {
- return E_INVALIDARG;
- }
+ if (*ppPage != NULL) {
+ return E_INVALIDARG;
+ }
- HRESULT hr;
+ HRESULT hr;
- if (guid == __uuidof(CMpegSplitterSettingsWnd)) {
- (*ppPage = DNew CInternalPropertyPageTempl<CMpegSplitterSettingsWnd>(NULL, &hr))->AddRef();
- }
+ if (guid == __uuidof(CMpegSplitterSettingsWnd)) {
+ (*ppPage = DNew CInternalPropertyPageTempl<CMpegSplitterSettingsWnd>(NULL, &hr))->AddRef();
+ }
- return *ppPage ? S_OK : E_FAIL;
+ return *ppPage ? S_OK : E_FAIL;
}
// IMpegSplitterFilter
STDMETHODIMP CMpegSplitterFilter::Apply()
{
#ifdef REGISTER_FILTER
- CRegKey key;
- if (ERROR_SUCCESS == key.Create(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPEG Splitter"))) {
- key.SetDWORDValue(_T("UseFastStreamChange"), m_useFastStreamChange);
- key.SetDWORDValue(_T("ForcedSub"), m_ForcedSub);
- key.SetDWORDValue(_T("TrackPriority"), m_TrackPriority);
- key.SetStringValue(_T("AudioLanguageOrder"), m_csAudioLanguageOrder);
- key.SetStringValue(_T("SubtitlesLanguageOrder"), m_csSubtitlesLanguageOrder);
- key.SetDWORDValue(_T("VC1_Decoder_Output"), m_nVC1_GuidFlag);
- key.SetDWORDValue(_T("AC3CoreOnly"), m_AC3CoreOnly);
- key.SetDWORDValue(_T("AlternativeDuration"), m_AlternativeDuration);
- }
+ CRegKey key;
+ if (ERROR_SUCCESS == key.Create(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPEG Splitter"))) {
+ key.SetDWORDValue(_T("UseFastStreamChange"), m_useFastStreamChange);
+ key.SetDWORDValue(_T("ForcedSub"), m_ForcedSub);
+ key.SetDWORDValue(_T("TrackPriority"), m_TrackPriority);
+ key.SetStringValue(_T("AudioLanguageOrder"), m_csAudioLanguageOrder);
+ key.SetStringValue(_T("SubtitlesLanguageOrder"), m_csSubtitlesLanguageOrder);
+ key.SetDWORDValue(_T("VC1_Decoder_Output"), m_nVC1_GuidFlag);
+ key.SetDWORDValue(_T("AC3CoreOnly"), m_AC3CoreOnly);
+ key.SetDWORDValue(_T("AlternativeDuration"), m_AlternativeDuration);
+ }
#else
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Splitter"), _T("UseFastStreamChange"), m_useFastStreamChange);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Splitter"), _T("ForcedSub"), m_ForcedSub);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Splitter"), _T("TrackPriority"), m_TrackPriority);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Splitter"), _T("VC1_Decoder_Output"), m_nVC1_GuidFlag);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Splitter"), _T("AC3CoreOnly"), m_AC3CoreOnly);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Splitter"), _T("AlternativeDuration"), m_AlternativeDuration);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Splitter"), _T("UseFastStreamChange"), m_useFastStreamChange);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Splitter"), _T("ForcedSub"), m_ForcedSub);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Splitter"), _T("TrackPriority"), m_TrackPriority);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Splitter"), _T("VC1_Decoder_Output"), m_nVC1_GuidFlag);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Splitter"), _T("AC3CoreOnly"), m_AC3CoreOnly);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Splitter"), _T("AlternativeDuration"), m_AlternativeDuration);
#endif
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CMpegSplitterFilter::SetFastStreamChange(BOOL nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_useFastStreamChange = !!nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_useFastStreamChange = !!nValue;
+ return S_OK;
}
STDMETHODIMP_(BOOL) CMpegSplitterFilter::GetFastStreamChange()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_useFastStreamChange;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_useFastStreamChange;
}
STDMETHODIMP CMpegSplitterFilter::SetForcedSub(BOOL nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_ForcedSub = !!nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_ForcedSub = !!nValue;
+ return S_OK;
}
STDMETHODIMP_(BOOL) CMpegSplitterFilter::GetForcedSub()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_ForcedSub;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_ForcedSub;
}
STDMETHODIMP CMpegSplitterFilter::SetTrackPriority(BOOL nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_TrackPriority = !!nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_TrackPriority = !!nValue;
+ return S_OK;
}
STDMETHODIMP_(BOOL) CMpegSplitterFilter::GetTrackPriority()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_TrackPriority;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_TrackPriority;
}
-STDMETHODIMP CMpegSplitterFilter::SetAudioLanguageOrder(WCHAR *nValue)
+STDMETHODIMP CMpegSplitterFilter::SetAudioLanguageOrder(WCHAR* nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_csAudioLanguageOrder = nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_csAudioLanguageOrder = nValue;
+ return S_OK;
}
-STDMETHODIMP_(WCHAR *) CMpegSplitterFilter::GetAudioLanguageOrder()
+STDMETHODIMP_(WCHAR*) CMpegSplitterFilter::GetAudioLanguageOrder()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_csAudioLanguageOrder.GetBuffer();
+ CAutoLock cAutoLock(&m_csProps);
+ return m_csAudioLanguageOrder.GetBuffer();
}
-STDMETHODIMP CMpegSplitterFilter::SetSubtitlesLanguageOrder(WCHAR *nValue)
+STDMETHODIMP CMpegSplitterFilter::SetSubtitlesLanguageOrder(WCHAR* nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_csSubtitlesLanguageOrder = nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_csSubtitlesLanguageOrder = nValue;
+ return S_OK;
}
-STDMETHODIMP_(WCHAR *) CMpegSplitterFilter::GetSubtitlesLanguageOrder()
+STDMETHODIMP_(WCHAR*) CMpegSplitterFilter::GetSubtitlesLanguageOrder()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_csSubtitlesLanguageOrder.GetBuffer();
+ CAutoLock cAutoLock(&m_csProps);
+ return m_csSubtitlesLanguageOrder.GetBuffer();
}
STDMETHODIMP CMpegSplitterFilter::SetVC1_GuidFlag(int nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_nVC1_GuidFlag = nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_nVC1_GuidFlag = nValue;
+ return S_OK;
}
STDMETHODIMP_(int) CMpegSplitterFilter::GetVC1_GuidFlag()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_nVC1_GuidFlag;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_nVC1_GuidFlag;
}
STDMETHODIMP CMpegSplitterFilter::SetTrueHD(int nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_AC3CoreOnly = nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_AC3CoreOnly = nValue;
+ return S_OK;
}
STDMETHODIMP_(int) CMpegSplitterFilter::GetTrueHD()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_AC3CoreOnly;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_AC3CoreOnly;
}
STDMETHODIMP CMpegSplitterFilter::SetAlternativeDuration(BOOL nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_AlternativeDuration = !!nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_AlternativeDuration = !!nValue;
+ return S_OK;
}
STDMETHODIMP_(BOOL) CMpegSplitterFilter::GetAlternativeDuration()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_AlternativeDuration;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_AlternativeDuration;
}
STDMETHODIMP_(int) CMpegSplitterFilter::GetMPEGType()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_pFile->m_type;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_pFile->m_type;
}
//
// CMpegSourceFilter
//
CMpegSourceFilter::CMpegSourceFilter(LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid)
- : CMpegSplitterFilter(pUnk, phr, clsid)
+ : CMpegSplitterFilter(pUnk, phr, clsid)
{
- m_pInput.Free();
+ m_pInput.Free();
}
//
@@ -1587,13 +1583,13 @@ CMpegSourceFilter::CMpegSourceFilter(LPUNKNOWN pUnk, HRESULT* phr, const CLSID&
//
CMpegSplitterOutputPin::CMpegSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr, int type)
- : CBaseSplitterOutputPin(mts, pName, pFilter, pLock, phr)
- , m_fHasAccessUnitDelimiters(false)
- , m_rtMaxShift(50000000)
- , m_bFilterDTSMA(false)
- , m_type(type)
- , DD_reset(false)
- , m_bFlushed(false)
+ : CBaseSplitterOutputPin(mts, pName, pFilter, pLock, phr)
+ , m_fHasAccessUnitDelimiters(false)
+ , m_rtMaxShift(50000000)
+ , m_bFilterDTSMA(false)
+ , m_type(type)
+ , DD_reset(false)
+ , m_bFlushed(false)
{
}
@@ -1603,522 +1599,522 @@ CMpegSplitterOutputPin::~CMpegSplitterOutputPin()
HRESULT CMpegSplitterOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- {
- CAutoLock cAutoLock(this);
+ {
+ CAutoLock cAutoLock(this);
- m_rtPrev = Packet::INVALID_TIME;
- m_rtOffset = 0;
- }
+ m_rtPrev = Packet::INVALID_TIME;
+ m_rtOffset = 0;
+ }
- return __super::DeliverNewSegment(tStart, tStop, dRate);
+ return __super::DeliverNewSegment(tStart, tStop, dRate);
}
HRESULT CMpegSplitterOutputPin::DeliverEndFlush()
{
- {
- CAutoLock cAutoLock(this);
+ {
+ CAutoLock cAutoLock(this);
- m_p.Free();
- m_pl.RemoveAll();
- DD_reset = true;
- m_bFlushed = true;
- }
+ m_p.Free();
+ m_pl.RemoveAll();
+ DD_reset = true;
+ m_bFlushed = true;
+ }
- return __super::DeliverEndFlush();
+ return __super::DeliverEndFlush();
}
#define MOVE_TO_H264_START_CODE(b, e) while (b <= e-4 && !((*(DWORD *)b == 0x01000000) || ((*(DWORD *)b & 0x00FFFFFF) == 0x00010000))) b++; if ((b <= e-4) && *(DWORD *)b == 0x01000000) b++;
HRESULT CMpegSplitterOutputPin::DeliverPacket(CAutoPtr<Packet> p)
{
- CAutoLock cAutoLock(this);
-
- if (p->rtStart != Packet::INVALID_TIME) {
- REFERENCE_TIME rt = p->rtStart + m_rtOffset;
-
- // Filter invalid PTS (if too different from previous packet)
- if (m_rtPrev != Packet::INVALID_TIME)
- if (_abs64(rt - m_rtPrev) > m_rtMaxShift) {
- m_rtOffset += m_rtPrev - rt;
- }
-
- p->rtStart += m_rtOffset;
- p->rtStop += m_rtOffset;
-
- m_rtPrev = p->rtStart;
- }
-
- if (p->pmt) {
- if (*((CMediaType *)p->pmt) != m_mt) {
- SetMediaType ((CMediaType*)p->pmt);
- }
- }
-
- if (m_mt.subtype == MEDIASUBTYPE_AAC) { // special code for aac, the currently available decoders only like whole frame samples
- if (m_p && m_p->GetCount() == 1 && m_p->GetAt(0) == 0xff && !(!p->IsEmpty() && (p->GetAt(0) & 0xf6) == 0xf0)) {
- m_p.Free();
- }
-
- if (!m_p) {
- BYTE* base = p->GetData();
- BYTE* s = base;
- BYTE* e = s + p->GetCount();
-
- for (; s < e; s++) {
- if (*s != 0xff) {
- continue;
- }
-
- if (s == e-1 || (s[1]&0xf6) == 0xf0) {
- memmove(base, s, e - s);
- p->SetCount(e - s);
- m_p = p;
- break;
- }
- }
- } else {
- m_p->Append(*p);
- }
-
- while (m_p && m_p->GetCount() > 9) {
- BYTE* base = m_p->GetData();
- BYTE* s = base;
- BYTE* e = s + m_p->GetCount();
- int len = ((s[3]&3)<<11)|(s[4]<<3)|(s[5]>>5);
- bool crc = !(s[1]&1);
- s += 7;
- len -= 7;
- if (crc) {
- s += 2, len -= 2;
- }
-
- if (e - s < len) {
- break;
- }
-
- if (len <= 0 || e - s >= len + 2 && (s[len] != 0xff || (s[len+1]&0xf6) != 0xf0)) {
- m_p.Free();
- break;
- }
-
- CAutoPtr<Packet> p2(DNew Packet());
-
- p2->TrackNumber = m_p->TrackNumber;
- p2->bDiscontinuity |= m_p->bDiscontinuity;
- m_p->bDiscontinuity = false;
-
- p2->bSyncPoint = m_p->rtStart != Packet::INVALID_TIME;
- p2->rtStart = m_p->rtStart;
- m_p->rtStart = Packet::INVALID_TIME;
-
- p2->rtStop = m_p->rtStop;
- m_p->rtStop = Packet::INVALID_TIME;
- p2->pmt = m_p->pmt;
- m_p->pmt = NULL;
- p2->SetData(s, len);
-
- s += len;
- memmove(base, s, e - s);
- m_p->SetCount(e - s);
-
- HRESULT hr = __super::DeliverPacket(p2);
- if (hr != S_OK) {
- return hr;
- }
- }
-
- if (m_p && p) {
- if (!m_p->bDiscontinuity) {
- m_p->bDiscontinuity = p->bDiscontinuity;
- }
- if (!m_p->bSyncPoint) {
- m_p->bSyncPoint = p->bSyncPoint;
- }
- if (m_p->rtStart == Packet::INVALID_TIME) {
- m_p->rtStart = p->rtStart, m_p->rtStop = p->rtStop;
- }
- if (m_p->pmt) {
- DeleteMediaType(m_p->pmt);
- }
-
- m_p->pmt = p->pmt;
- p->pmt = NULL;
- }
-
- return S_OK;
- } else if (m_mt.subtype == FOURCCMap('1CVA') || m_mt.subtype == FOURCCMap('1cva') || m_mt.subtype == FOURCCMap('CVMA') || m_mt.subtype == FOURCCMap('CVME')) {
- if (!m_p) {
- m_p.Attach(DNew Packet());
- m_p->TrackNumber = p->TrackNumber;
- m_p->bDiscontinuity = p->bDiscontinuity;
- p->bDiscontinuity = FALSE;
-
- m_p->bSyncPoint = p->bSyncPoint;
- p->bSyncPoint = FALSE;
-
- m_p->rtStart = p->rtStart;
- p->rtStart = Packet::INVALID_TIME;
-
- m_p->rtStop = p->rtStop;
- p->rtStop = Packet::INVALID_TIME;
- }
-
- m_p->Append(*p);
-
- BYTE* start = m_p->GetData();
- BYTE* end = start + m_p->GetCount();
-
- MOVE_TO_H264_START_CODE(start, end);
-
- while (start <= end-4) {
- BYTE* next = start+1;
-
- MOVE_TO_H264_START_CODE(next, end);
-
- if (next >= end-4) {
- break;
- }
-
- int size = next - start;
-
- CH264Nalu Nalu;
- Nalu.SetBuffer (start, size, 0);
-
- CAutoPtr<Packet> p2;
-
- while (Nalu.ReadNext()) {
- DWORD dwNalLength =
- ((Nalu.GetDataLength() >> 24) & 0x000000ff) |
- ((Nalu.GetDataLength() >> 8) & 0x0000ff00) |
- ((Nalu.GetDataLength() << 8) & 0x00ff0000) |
- ((Nalu.GetDataLength() << 24) & 0xff000000);
-
- CAutoPtr<Packet> p3(DNew Packet());
-
- p3->SetCount (Nalu.GetDataLength()+sizeof(dwNalLength));
- memcpy (p3->GetData(), &dwNalLength, sizeof(dwNalLength));
- memcpy (p3->GetData()+sizeof(dwNalLength), Nalu.GetDataBuffer(), Nalu.GetDataLength());
-
- if (p2 == NULL) {
- p2 = p3;
- } else {
- p2->Append(*p3);
- }
- }
- start = next;
-
- if (!p2) {
- continue;
- }
-
- p2->TrackNumber = m_p->TrackNumber;
- p2->bDiscontinuity = m_p->bDiscontinuity;
- m_p->bDiscontinuity = FALSE;
-
- p2->bSyncPoint = m_p->bSyncPoint;
- m_p->bSyncPoint = FALSE;
-
- p2->rtStart = m_p->rtStart;
- m_p->rtStart = Packet::INVALID_TIME;
- p2->rtStop = m_p->rtStop;
- m_p->rtStop = Packet::INVALID_TIME;
-
- p2->pmt = m_p->pmt;
- m_p->pmt = NULL;
-
- m_pl.AddTail(p2);
-
- if (p->rtStart != Packet::INVALID_TIME) {
- m_p->rtStart = p->rtStart;
- m_p->rtStop = p->rtStop;
- p->rtStart = Packet::INVALID_TIME;
- }
- if (p->bDiscontinuity) {
- m_p->bDiscontinuity = p->bDiscontinuity;
- p->bDiscontinuity = FALSE;
- }
- if (p->bSyncPoint) {
- m_p->bSyncPoint = p->bSyncPoint;
- p->bSyncPoint = FALSE;
- }
- if (m_p->pmt) {
- DeleteMediaType(m_p->pmt);
- }
-
- m_p->pmt = p->pmt;
- p->pmt = NULL;
- }
- if (start > m_p->GetData()) {
- m_p->RemoveAt(0, start - m_p->GetData());
- }
-
- REFERENCE_TIME rtStart = Packet::INVALID_TIME, rtStop = Packet::INVALID_TIME;
-
- for (POSITION pos = m_pl.GetHeadPosition(); pos; m_pl.GetNext(pos)) {
- if (pos == m_pl.GetHeadPosition()) {
- continue;
- }
-
- Packet* pPacket = m_pl.GetAt(pos);
- BYTE* pData = pPacket->GetData();
-
- if ((pData[4]&0x1f) == 0x09) {
- m_fHasAccessUnitDelimiters = true;
- }
-
- if ((pData[4]&0x1f) == 0x09 || (!m_fHasAccessUnitDelimiters && pPacket->rtStart != Packet::INVALID_TIME)) {
- if (pPacket->rtStart == Packet::INVALID_TIME && rtStart != Packet::INVALID_TIME) {
- pPacket->rtStart = rtStart;
- pPacket->rtStop = rtStop;
- }
-
- p = m_pl.RemoveHead();
-
- while (pos != m_pl.GetHeadPosition()) {
- CAutoPtr<Packet> p2 = m_pl.RemoveHead();
- p->Append(*p2);
- }
-
- HRESULT hr = __super::DeliverPacket(p);
- if (hr != S_OK) {
- return hr;
- }
- } else if (rtStart == Packet::INVALID_TIME) {
- rtStart = pPacket->rtStart;
- rtStop = pPacket->rtStop;
- }
- }
-
- return S_OK;
- } else if (m_mt.subtype == FOURCCMap('1CVW') || m_mt.subtype == FOURCCMap('1cvw') ||
- m_mt.subtype == MEDIASUBTYPE_WVC1_CYBERLINK || m_mt.subtype == MEDIASUBTYPE_WVC1_ARCSOFT) { // just like aac, this has to be starting nalus, more can be packed together
- if (!m_p) {
- m_p.Attach(DNew Packet());
- m_p->TrackNumber = p->TrackNumber;
- m_p->bDiscontinuity = p->bDiscontinuity;
- p->bDiscontinuity = FALSE;
-
- m_p->bSyncPoint = p->bSyncPoint;
- p->bSyncPoint = FALSE;
-
- m_p->rtStart = p->rtStart;
- p->rtStart = Packet::INVALID_TIME;
-
- m_p->rtStop = p->rtStop;
- p->rtStop = Packet::INVALID_TIME;
- }
-
- m_p->Append(*p);
-
- BYTE* start = m_p->GetData();
- BYTE* end = start + m_p->GetCount();
-
- bool bSeqFound = false;
- while (start <= end-4) {
- if (*(DWORD*)start == 0x0D010000) {
- bSeqFound = true;
- break;
- } else if (*(DWORD*)start == 0x0F010000) {
- break;
- }
- start++;
- }
-
- while (start <= end-4) {
- BYTE* next = start+1;
-
- while (next <= end-4) {
- if (*(DWORD*)next == 0x0D010000) {
- if (bSeqFound) {
- break;
- }
- bSeqFound = true;
- } else if (*(DWORD*)next == 0x0F010000) {
- break;
- }
- next++;
- }
-
- if (next >= end-4) {
- break;
- }
-
- int size = next - start - 4;
- UNREFERENCED_PARAMETER(size);
-
- CAutoPtr<Packet> p2(DNew Packet());
- p2->TrackNumber = m_p->TrackNumber;
- p2->bDiscontinuity = m_p->bDiscontinuity;
- m_p->bDiscontinuity = FALSE;
-
- p2->bSyncPoint = m_p->bSyncPoint;
- m_p->bSyncPoint = FALSE;
-
- p2->rtStart = m_p->rtStart;
- m_p->rtStart = Packet::INVALID_TIME;
-
- p2->rtStop = m_p->rtStop;
- m_p->rtStop = Packet::INVALID_TIME;
-
- p2->pmt = m_p->pmt;
- m_p->pmt = NULL;
-
- p2->SetData(start, next - start);
-
- HRESULT hr = __super::DeliverPacket(p2);
- if (hr != S_OK) {
- return hr;
- }
-
- if (p->rtStart != Packet::INVALID_TIME) {
- m_p->rtStart = p->rtStop; //p->rtStart; //Sebastiii for enable VC1 decoding in FFDshow (no more shutter)
- m_p->rtStop = p->rtStop;
- p->rtStart = Packet::INVALID_TIME;
- }
- if (p->bDiscontinuity) {
- m_p->bDiscontinuity = p->bDiscontinuity;
- p->bDiscontinuity = FALSE;
- }
- if (p->bSyncPoint) {
- m_p->bSyncPoint = p->bSyncPoint;
- p->bSyncPoint = FALSE;
- }
- if (m_p->pmt) {
- DeleteMediaType(m_p->pmt);
- }
-
- m_p->pmt = p->pmt;
- p->pmt = NULL;
-
- start = next;
- bSeqFound = (*(DWORD*)start == 0x0D010000);
- }
-
- if (start > m_p->GetData()) {
- m_p->RemoveAt(0, start - m_p->GetData());
- }
-
- return S_OK;
- }
- // DTS HD MA data is causing trouble with some filters, lets just remove it
- else if (m_bFilterDTSMA && ((m_mt.subtype == MEDIASUBTYPE_DTS || m_mt.subtype == MEDIASUBTYPE_WAVE_DTS))) {
- if (p->GetCount() < 4 && !p->pmt) {
- return S_OK; // Should be invalid packet
- }
- BYTE* hdr = p->GetData();
-
- int Type;
- // 16 bits big endian bitstream
- if (hdr[0] == 0x7f && hdr[1] == 0xfe &&
- hdr[2] == 0x80 && hdr[3] == 0x01) {
- Type = 16 + 32;
- }
-
- // 16 bits low endian bitstream
- else if (hdr[0] == 0xfe && hdr[1] == 0x7f &&
- hdr[2] == 0x01 && hdr[3] == 0x80) {
- Type = 16;
- }
-
- // 14 bits big endian bitstream
- else if (hdr[0] == 0x1f && hdr[1] == 0xff &&
- hdr[2] == 0xe8 && hdr[3] == 0x00 &&
- hdr[4] == 0x07 && (hdr[5] & 0xf0) == 0xf0) {
- Type = 14 + 32;
- }
-
- // 14 bits low endian bitstream
- else if (hdr[0] == 0xff && hdr[1] == 0x1f &&
- hdr[2] == 0x00 && hdr[3] == 0xe8 &&
- (hdr[4] & 0xf0) == 0xf0 && hdr[5] == 0x07) {
- Type = 14;
- }
-
- // no sync
- else if (!p->pmt) {
- return S_OK;
- }
- // HDMV LPCM
- } else if (m_mt.subtype == MEDIASUBTYPE_HDMV_LPCM_AUDIO) {
- if (!m_p) {
- m_p.Attach(DNew Packet());
- }
- m_p->Append(*p);
-
- if (m_p->GetCount() < 4) {
- m_p.Free();
- return S_OK; // Should be invalid packet
- }
-
- BYTE* start = m_p->GetData();
- int samplerate, channels;
- size_t header_size = ParseHdmvLPCMHeader(start, &samplerate, &channels);
- if (!header_size || header_size > m_p->GetCount()) {
- if (!header_size) {
- m_p.Free();
- }
- return S_OK;
- }
-
- if (!p->pmt && m_bFlushed) {
- p->pmt = CreateMediaType(&m_mt);
- m_bFlushed = false;
- }
- p->SetData(start + 4, m_p->GetCount() - 4);
- m_p.Free();
- // Dolby_AC3
- } else if ((m_type == mpeg_ts) &&
- (m_mt.subtype == MEDIASUBTYPE_DOLBY_AC3) &&
- (static_cast<CMpegSplitterFilter*>(m_pFilter))->StreamIsTrueHD(p->TrackNumber) &&
- (static_cast<CMpegSplitterFilter*>(m_pFilter))->GetTrueHD() != 2) {
- if (p->GetCount() < 8) {
- return S_OK; // Should be invalid packet
- }
- BYTE* start = p->GetData();
- if (*(WORD*)start != 0x770b) { // skip none AC3
- return S_OK;
- }
- // TrueHD
- } else if (m_mt.subtype == MEDIASUBTYPE_DOLBY_TRUEHD && (static_cast<CMpegSplitterFilter*>(m_pFilter))->GetTrueHD() != 2) {
- if (p->GetCount() < 8) {
- return S_OK; // Should be invalid packet
- }
- BYTE* start = p->GetData();
- if (*(WORD*)start == 0x770b) { // skip AC3
- return S_OK;
- }
- if (DD_reset || p->rtStart == 0) {
- p->bDiscontinuity = true;
- DD_reset = false;
- }
- } else {
- m_p.Free();
- m_pl.RemoveAll();
- }
-
- return __super::DeliverPacket(p);
+ CAutoLock cAutoLock(this);
+
+ if (p->rtStart != Packet::INVALID_TIME) {
+ REFERENCE_TIME rt = p->rtStart + m_rtOffset;
+
+ // Filter invalid PTS (if too different from previous packet)
+ if (m_rtPrev != Packet::INVALID_TIME)
+ if (_abs64(rt - m_rtPrev) > m_rtMaxShift) {
+ m_rtOffset += m_rtPrev - rt;
+ }
+
+ p->rtStart += m_rtOffset;
+ p->rtStop += m_rtOffset;
+
+ m_rtPrev = p->rtStart;
+ }
+
+ if (p->pmt) {
+ if (*((CMediaType*)p->pmt) != m_mt) {
+ SetMediaType((CMediaType*)p->pmt);
+ }
+ }
+
+ if (m_mt.subtype == MEDIASUBTYPE_AAC) { // special code for aac, the currently available decoders only like whole frame samples
+ if (m_p && m_p->GetCount() == 1 && m_p->GetAt(0) == 0xff && !(!p->IsEmpty() && (p->GetAt(0) & 0xf6) == 0xf0)) {
+ m_p.Free();
+ }
+
+ if (!m_p) {
+ BYTE* base = p->GetData();
+ BYTE* s = base;
+ BYTE* e = s + p->GetCount();
+
+ for (; s < e; s++) {
+ if (*s != 0xff) {
+ continue;
+ }
+
+ if (s == e - 1 || (s[1] & 0xf6) == 0xf0) {
+ memmove(base, s, e - s);
+ p->SetCount(e - s);
+ m_p = p;
+ break;
+ }
+ }
+ } else {
+ m_p->Append(*p);
+ }
+
+ while (m_p && m_p->GetCount() > 9) {
+ BYTE* base = m_p->GetData();
+ BYTE* s = base;
+ BYTE* e = s + m_p->GetCount();
+ int len = ((s[3] & 3) << 11) | (s[4] << 3) | (s[5] >> 5);
+ bool crc = !(s[1] & 1);
+ s += 7;
+ len -= 7;
+ if (crc) {
+ s += 2, len -= 2;
+ }
+
+ if (e - s < len) {
+ break;
+ }
+
+ if (len <= 0 || e - s >= len + 2 && (s[len] != 0xff || (s[len + 1] & 0xf6) != 0xf0)) {
+ m_p.Free();
+ break;
+ }
+
+ CAutoPtr<Packet> p2(DNew Packet());
+
+ p2->TrackNumber = m_p->TrackNumber;
+ p2->bDiscontinuity |= m_p->bDiscontinuity;
+ m_p->bDiscontinuity = false;
+
+ p2->bSyncPoint = m_p->rtStart != Packet::INVALID_TIME;
+ p2->rtStart = m_p->rtStart;
+ m_p->rtStart = Packet::INVALID_TIME;
+
+ p2->rtStop = m_p->rtStop;
+ m_p->rtStop = Packet::INVALID_TIME;
+ p2->pmt = m_p->pmt;
+ m_p->pmt = NULL;
+ p2->SetData(s, len);
+
+ s += len;
+ memmove(base, s, e - s);
+ m_p->SetCount(e - s);
+
+ HRESULT hr = __super::DeliverPacket(p2);
+ if (hr != S_OK) {
+ return hr;
+ }
+ }
+
+ if (m_p && p) {
+ if (!m_p->bDiscontinuity) {
+ m_p->bDiscontinuity = p->bDiscontinuity;
+ }
+ if (!m_p->bSyncPoint) {
+ m_p->bSyncPoint = p->bSyncPoint;
+ }
+ if (m_p->rtStart == Packet::INVALID_TIME) {
+ m_p->rtStart = p->rtStart, m_p->rtStop = p->rtStop;
+ }
+ if (m_p->pmt) {
+ DeleteMediaType(m_p->pmt);
+ }
+
+ m_p->pmt = p->pmt;
+ p->pmt = NULL;
+ }
+
+ return S_OK;
+ } else if (m_mt.subtype == FOURCCMap('1CVA') || m_mt.subtype == FOURCCMap('1cva') || m_mt.subtype == FOURCCMap('CVMA') || m_mt.subtype == FOURCCMap('CVME')) {
+ if (!m_p) {
+ m_p.Attach(DNew Packet());
+ m_p->TrackNumber = p->TrackNumber;
+ m_p->bDiscontinuity = p->bDiscontinuity;
+ p->bDiscontinuity = FALSE;
+
+ m_p->bSyncPoint = p->bSyncPoint;
+ p->bSyncPoint = FALSE;
+
+ m_p->rtStart = p->rtStart;
+ p->rtStart = Packet::INVALID_TIME;
+
+ m_p->rtStop = p->rtStop;
+ p->rtStop = Packet::INVALID_TIME;
+ }
+
+ m_p->Append(*p);
+
+ BYTE* start = m_p->GetData();
+ BYTE* end = start + m_p->GetCount();
+
+ MOVE_TO_H264_START_CODE(start, end);
+
+ while (start <= end - 4) {
+ BYTE* next = start + 1;
+
+ MOVE_TO_H264_START_CODE(next, end);
+
+ if (next >= end - 4) {
+ break;
+ }
+
+ int size = next - start;
+
+ CH264Nalu Nalu;
+ Nalu.SetBuffer(start, size, 0);
+
+ CAutoPtr<Packet> p2;
+
+ while (Nalu.ReadNext()) {
+ DWORD dwNalLength =
+ ((Nalu.GetDataLength() >> 24) & 0x000000ff) |
+ ((Nalu.GetDataLength() >> 8) & 0x0000ff00) |
+ ((Nalu.GetDataLength() << 8) & 0x00ff0000) |
+ ((Nalu.GetDataLength() << 24) & 0xff000000);
+
+ CAutoPtr<Packet> p3(DNew Packet());
+
+ p3->SetCount(Nalu.GetDataLength() + sizeof(dwNalLength));
+ memcpy(p3->GetData(), &dwNalLength, sizeof(dwNalLength));
+ memcpy(p3->GetData() + sizeof(dwNalLength), Nalu.GetDataBuffer(), Nalu.GetDataLength());
+
+ if (p2 == NULL) {
+ p2 = p3;
+ } else {
+ p2->Append(*p3);
+ }
+ }
+ start = next;
+
+ if (!p2) {
+ continue;
+ }
+
+ p2->TrackNumber = m_p->TrackNumber;
+ p2->bDiscontinuity = m_p->bDiscontinuity;
+ m_p->bDiscontinuity = FALSE;
+
+ p2->bSyncPoint = m_p->bSyncPoint;
+ m_p->bSyncPoint = FALSE;
+
+ p2->rtStart = m_p->rtStart;
+ m_p->rtStart = Packet::INVALID_TIME;
+ p2->rtStop = m_p->rtStop;
+ m_p->rtStop = Packet::INVALID_TIME;
+
+ p2->pmt = m_p->pmt;
+ m_p->pmt = NULL;
+
+ m_pl.AddTail(p2);
+
+ if (p->rtStart != Packet::INVALID_TIME) {
+ m_p->rtStart = p->rtStart;
+ m_p->rtStop = p->rtStop;
+ p->rtStart = Packet::INVALID_TIME;
+ }
+ if (p->bDiscontinuity) {
+ m_p->bDiscontinuity = p->bDiscontinuity;
+ p->bDiscontinuity = FALSE;
+ }
+ if (p->bSyncPoint) {
+ m_p->bSyncPoint = p->bSyncPoint;
+ p->bSyncPoint = FALSE;
+ }
+ if (m_p->pmt) {
+ DeleteMediaType(m_p->pmt);
+ }
+
+ m_p->pmt = p->pmt;
+ p->pmt = NULL;
+ }
+ if (start > m_p->GetData()) {
+ m_p->RemoveAt(0, start - m_p->GetData());
+ }
+
+ REFERENCE_TIME rtStart = Packet::INVALID_TIME, rtStop = Packet::INVALID_TIME;
+
+ for (POSITION pos = m_pl.GetHeadPosition(); pos; m_pl.GetNext(pos)) {
+ if (pos == m_pl.GetHeadPosition()) {
+ continue;
+ }
+
+ Packet* pPacket = m_pl.GetAt(pos);
+ BYTE* pData = pPacket->GetData();
+
+ if ((pData[4] & 0x1f) == 0x09) {
+ m_fHasAccessUnitDelimiters = true;
+ }
+
+ if ((pData[4] & 0x1f) == 0x09 || (!m_fHasAccessUnitDelimiters && pPacket->rtStart != Packet::INVALID_TIME)) {
+ if (pPacket->rtStart == Packet::INVALID_TIME && rtStart != Packet::INVALID_TIME) {
+ pPacket->rtStart = rtStart;
+ pPacket->rtStop = rtStop;
+ }
+
+ p = m_pl.RemoveHead();
+
+ while (pos != m_pl.GetHeadPosition()) {
+ CAutoPtr<Packet> p2 = m_pl.RemoveHead();
+ p->Append(*p2);
+ }
+
+ HRESULT hr = __super::DeliverPacket(p);
+ if (hr != S_OK) {
+ return hr;
+ }
+ } else if (rtStart == Packet::INVALID_TIME) {
+ rtStart = pPacket->rtStart;
+ rtStop = pPacket->rtStop;
+ }
+ }
+
+ return S_OK;
+ } else if (m_mt.subtype == FOURCCMap('1CVW') || m_mt.subtype == FOURCCMap('1cvw') ||
+ m_mt.subtype == MEDIASUBTYPE_WVC1_CYBERLINK || m_mt.subtype == MEDIASUBTYPE_WVC1_ARCSOFT) { // just like aac, this has to be starting nalus, more can be packed together
+ if (!m_p) {
+ m_p.Attach(DNew Packet());
+ m_p->TrackNumber = p->TrackNumber;
+ m_p->bDiscontinuity = p->bDiscontinuity;
+ p->bDiscontinuity = FALSE;
+
+ m_p->bSyncPoint = p->bSyncPoint;
+ p->bSyncPoint = FALSE;
+
+ m_p->rtStart = p->rtStart;
+ p->rtStart = Packet::INVALID_TIME;
+
+ m_p->rtStop = p->rtStop;
+ p->rtStop = Packet::INVALID_TIME;
+ }
+
+ m_p->Append(*p);
+
+ BYTE* start = m_p->GetData();
+ BYTE* end = start + m_p->GetCount();
+
+ bool bSeqFound = false;
+ while (start <= end - 4) {
+ if (*(DWORD*)start == 0x0D010000) {
+ bSeqFound = true;
+ break;
+ } else if (*(DWORD*)start == 0x0F010000) {
+ break;
+ }
+ start++;
+ }
+
+ while (start <= end - 4) {
+ BYTE* next = start + 1;
+
+ while (next <= end - 4) {
+ if (*(DWORD*)next == 0x0D010000) {
+ if (bSeqFound) {
+ break;
+ }
+ bSeqFound = true;
+ } else if (*(DWORD*)next == 0x0F010000) {
+ break;
+ }
+ next++;
+ }
+
+ if (next >= end - 4) {
+ break;
+ }
+
+ int size = next - start - 4;
+ UNREFERENCED_PARAMETER(size);
+
+ CAutoPtr<Packet> p2(DNew Packet());
+ p2->TrackNumber = m_p->TrackNumber;
+ p2->bDiscontinuity = m_p->bDiscontinuity;
+ m_p->bDiscontinuity = FALSE;
+
+ p2->bSyncPoint = m_p->bSyncPoint;
+ m_p->bSyncPoint = FALSE;
+
+ p2->rtStart = m_p->rtStart;
+ m_p->rtStart = Packet::INVALID_TIME;
+
+ p2->rtStop = m_p->rtStop;
+ m_p->rtStop = Packet::INVALID_TIME;
+
+ p2->pmt = m_p->pmt;
+ m_p->pmt = NULL;
+
+ p2->SetData(start, next - start);
+
+ HRESULT hr = __super::DeliverPacket(p2);
+ if (hr != S_OK) {
+ return hr;
+ }
+
+ if (p->rtStart != Packet::INVALID_TIME) {
+ m_p->rtStart = p->rtStop; //p->rtStart; //Sebastiii for enable VC1 decoding in FFDshow (no more shutter)
+ m_p->rtStop = p->rtStop;
+ p->rtStart = Packet::INVALID_TIME;
+ }
+ if (p->bDiscontinuity) {
+ m_p->bDiscontinuity = p->bDiscontinuity;
+ p->bDiscontinuity = FALSE;
+ }
+ if (p->bSyncPoint) {
+ m_p->bSyncPoint = p->bSyncPoint;
+ p->bSyncPoint = FALSE;
+ }
+ if (m_p->pmt) {
+ DeleteMediaType(m_p->pmt);
+ }
+
+ m_p->pmt = p->pmt;
+ p->pmt = NULL;
+
+ start = next;
+ bSeqFound = (*(DWORD*)start == 0x0D010000);
+ }
+
+ if (start > m_p->GetData()) {
+ m_p->RemoveAt(0, start - m_p->GetData());
+ }
+
+ return S_OK;
+ }
+ // DTS HD MA data is causing trouble with some filters, lets just remove it
+ else if (m_bFilterDTSMA && ((m_mt.subtype == MEDIASUBTYPE_DTS || m_mt.subtype == MEDIASUBTYPE_WAVE_DTS))) {
+ if (p->GetCount() < 4 && !p->pmt) {
+ return S_OK; // Should be invalid packet
+ }
+ BYTE* hdr = p->GetData();
+
+ int Type;
+ // 16 bits big endian bitstream
+ if (hdr[0] == 0x7f && hdr[1] == 0xfe &&
+ hdr[2] == 0x80 && hdr[3] == 0x01) {
+ Type = 16 + 32;
+ }
+
+ // 16 bits low endian bitstream
+ else if (hdr[0] == 0xfe && hdr[1] == 0x7f &&
+ hdr[2] == 0x01 && hdr[3] == 0x80) {
+ Type = 16;
+ }
+
+ // 14 bits big endian bitstream
+ else if (hdr[0] == 0x1f && hdr[1] == 0xff &&
+ hdr[2] == 0xe8 && hdr[3] == 0x00 &&
+ hdr[4] == 0x07 && (hdr[5] & 0xf0) == 0xf0) {
+ Type = 14 + 32;
+ }
+
+ // 14 bits low endian bitstream
+ else if (hdr[0] == 0xff && hdr[1] == 0x1f &&
+ hdr[2] == 0x00 && hdr[3] == 0xe8 &&
+ (hdr[4] & 0xf0) == 0xf0 && hdr[5] == 0x07) {
+ Type = 14;
+ }
+
+ // no sync
+ else if (!p->pmt) {
+ return S_OK;
+ }
+ // HDMV LPCM
+ } else if (m_mt.subtype == MEDIASUBTYPE_HDMV_LPCM_AUDIO) {
+ if (!m_p) {
+ m_p.Attach(DNew Packet());
+ }
+ m_p->Append(*p);
+
+ if (m_p->GetCount() < 4) {
+ m_p.Free();
+ return S_OK; // Should be invalid packet
+ }
+
+ BYTE* start = m_p->GetData();
+ int samplerate, channels;
+ size_t header_size = ParseHdmvLPCMHeader(start, &samplerate, &channels);
+ if (!header_size || header_size > m_p->GetCount()) {
+ if (!header_size) {
+ m_p.Free();
+ }
+ return S_OK;
+ }
+
+ if (!p->pmt && m_bFlushed) {
+ p->pmt = CreateMediaType(&m_mt);
+ m_bFlushed = false;
+ }
+ p->SetData(start + 4, m_p->GetCount() - 4);
+ m_p.Free();
+ // Dolby_AC3
+ } else if ((m_type == mpeg_ts) &&
+ (m_mt.subtype == MEDIASUBTYPE_DOLBY_AC3) &&
+ (static_cast<CMpegSplitterFilter*>(m_pFilter))->StreamIsTrueHD(p->TrackNumber) &&
+ (static_cast<CMpegSplitterFilter*>(m_pFilter))->GetTrueHD() != 2) {
+ if (p->GetCount() < 8) {
+ return S_OK; // Should be invalid packet
+ }
+ BYTE* start = p->GetData();
+ if (*(WORD*)start != 0x770b) { // skip none AC3
+ return S_OK;
+ }
+ // TrueHD
+ } else if (m_mt.subtype == MEDIASUBTYPE_DOLBY_TRUEHD && (static_cast<CMpegSplitterFilter*>(m_pFilter))->GetTrueHD() != 2) {
+ if (p->GetCount() < 8) {
+ return S_OK; // Should be invalid packet
+ }
+ BYTE* start = p->GetData();
+ if (*(WORD*)start == 0x770b) { // skip AC3
+ return S_OK;
+ }
+ if (DD_reset || p->rtStart == 0) {
+ p->bDiscontinuity = true;
+ DD_reset = false;
+ }
+ } else {
+ m_p.Free();
+ m_pl.RemoveAll();
+ }
+
+ return __super::DeliverPacket(p);
}
STDMETHODIMP CMpegSplitterOutputPin::Connect(IPin* pReceivePin, const AM_MEDIA_TYPE* pmt)
{
- HRESULT hr;
- PIN_INFO PinInfo;
- GUID FilterClsid;
-
- if (SUCCEEDED (pReceivePin->QueryPinInfo (&PinInfo))) {
- if (SUCCEEDED (PinInfo.pFilter->GetClassID(&FilterClsid))) {
- if (FilterClsid == CLSID_DMOWrapperFilter) {
- (static_cast<CMpegSplitterFilter*>(m_pFilter))->SetPipo(true);
- }
- // AC3 Filter did not support DTS-MA
- else if (FilterClsid == CLSID_AC3Filter) {
- m_bFilterDTSMA = true;
- }
- }
- PinInfo.pFilter->Release();
- }
-
- hr = __super::Connect (pReceivePin, pmt);
- (static_cast<CMpegSplitterFilter*>(m_pFilter))->SetPipo(false);
- return hr;
+ HRESULT hr;
+ PIN_INFO PinInfo;
+ GUID FilterClsid;
+
+ if (SUCCEEDED(pReceivePin->QueryPinInfo(&PinInfo))) {
+ if (SUCCEEDED(PinInfo.pFilter->GetClassID(&FilterClsid))) {
+ if (FilterClsid == CLSID_DMOWrapperFilter) {
+ (static_cast<CMpegSplitterFilter*>(m_pFilter))->SetPipo(true);
+ }
+ // AC3 Filter did not support DTS-MA
+ else if (FilterClsid == CLSID_AC3Filter) {
+ m_bFilterDTSMA = true;
+ }
+ }
+ PinInfo.pFilter->Release();
+ }
+
+ hr = __super::Connect(pReceivePin, pmt);
+ (static_cast<CMpegSplitterFilter*>(m_pFilter))->SetPipo(false);
+ return hr;
}
diff --git a/src/filters/parser/MpegSplitter/MpegSplitter.h b/src/filters/parser/MpegSplitter/MpegSplitter.h
index a7f9d5082..ef12de2d4 100644
--- a/src/filters/parser/MpegSplitter/MpegSplitter.h
+++ b/src/filters/parser/MpegSplitter/MpegSplitter.h
@@ -53,121 +53,121 @@
class __declspec(uuid("DC257063-045F-4BE2-BD5B-E12279C464F0"))
- CMpegSplitterFilter
- : public CBaseSplitterFilter
- , public IAMStreamSelect
- , public ISpecifyPropertyPages2
- , public IMpegSplitterFilter
+ CMpegSplitterFilter
+ : public CBaseSplitterFilter
+ , public IAMStreamSelect
+ , public ISpecifyPropertyPages2
+ , public IMpegSplitterFilter
{
- REFERENCE_TIME m_rtStartOffset;
- bool m_pPipoBimbo;
- CHdmvClipInfo m_ClipInfo;
+ REFERENCE_TIME m_rtStartOffset;
+ bool m_pPipoBimbo;
+ CHdmvClipInfo m_ClipInfo;
protected:
- CAutoPtr<CMpegSplitterFile> m_pFile;
- CComQIPtr<ITrackInfo> pTI;
+ CAutoPtr<CMpegSplitterFile> m_pFile;
+ CComQIPtr<ITrackInfo> pTI;
- HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
- void ReadClipInfo(LPCOLESTR pszFileName);
+ HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
+ void ReadClipInfo(LPCOLESTR pszFileName);
- bool DemuxInit();
- void DemuxSeek(REFERENCE_TIME rt);
- bool DemuxLoop();
- bool BuildPlaylist(LPCTSTR pszFileName, CAtlList<CHdmvClipInfo::PlaylistItem>& files);
- bool BuildChapters(LPCTSTR pszFileName, CAtlList<CHdmvClipInfo::PlaylistItem>& PlaylistItems, CAtlList<CHdmvClipInfo::PlaylistChapter>& Items);
+ bool DemuxInit();
+ void DemuxSeek(REFERENCE_TIME rt);
+ bool DemuxLoop();
+ bool BuildPlaylist(LPCTSTR pszFileName, CAtlList<CHdmvClipInfo::PlaylistItem>& files);
+ bool BuildChapters(LPCTSTR pszFileName, CAtlList<CHdmvClipInfo::PlaylistItem>& PlaylistItems, CAtlList<CHdmvClipInfo::PlaylistChapter>& Items);
- HRESULT DemuxNextPacket(REFERENCE_TIME rtStartOffset);
+ HRESULT DemuxNextPacket(REFERENCE_TIME rtStartOffset);
- REFERENCE_TIME m_rtPlaylistDuration;
+ REFERENCE_TIME m_rtPlaylistDuration;
private:
- CString m_csAudioLanguageOrder, m_csSubtitlesLanguageOrder;
- bool m_useFastStreamChange, m_ForcedSub, m_TrackPriority, m_AlternativeDuration;
- int m_nVC1_GuidFlag, m_AC3CoreOnly;
- CCritSec m_csProps;
+ CString m_csAudioLanguageOrder, m_csSubtitlesLanguageOrder;
+ bool m_useFastStreamChange, m_ForcedSub, m_TrackPriority, m_AlternativeDuration;
+ int m_nVC1_GuidFlag, m_AC3CoreOnly;
+ CCritSec m_csProps;
public:
- CMpegSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid = __uuidof(CMpegSplitterFilter));
- void SetPipo(bool bPipo) { m_pPipoBimbo = bPipo; };
+ CMpegSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid = __uuidof(CMpegSplitterFilter));
+ void SetPipo(bool bPipo) { m_pPipoBimbo = bPipo; };
- bool StreamIsTrueHD(const WORD pid);
+ bool StreamIsTrueHD(const WORD pid);
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- STDMETHODIMP GetClassID(CLSID* pClsID);
- STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ STDMETHODIMP GetClassID(CLSID* pClsID);
+ STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
- // CBaseFilter
+ // CBaseFilter
- STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
+ STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
- // IAMStreamSelect
+ // IAMStreamSelect
- STDMETHODIMP Count(DWORD* pcStreams);
- STDMETHODIMP Enable(long lIndex, DWORD dwFlags);
- STDMETHODIMP Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD* pdwFlags, LCID* plcid, DWORD* pdwGroup, WCHAR** ppszName, IUnknown** ppObject, IUnknown** ppUnk);
+ STDMETHODIMP Count(DWORD* pcStreams);
+ STDMETHODIMP Enable(long lIndex, DWORD dwFlags);
+ STDMETHODIMP Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD* pdwFlags, LCID* plcid, DWORD* pdwGroup, WCHAR** ppszName, IUnknown** ppObject, IUnknown** ppUnk);
- // ISpecifyPropertyPages2
+ // ISpecifyPropertyPages2
- STDMETHODIMP GetPages(CAUUID* pPages);
- STDMETHODIMP CreatePage(const GUID& guid, IPropertyPage** ppPage);
+ STDMETHODIMP GetPages(CAUUID* pPages);
+ STDMETHODIMP CreatePage(const GUID& guid, IPropertyPage** ppPage);
- // IMpegSplitterFilter
- STDMETHODIMP Apply();
+ // IMpegSplitterFilter
+ STDMETHODIMP Apply();
- STDMETHODIMP SetFastStreamChange(BOOL nValue);
- STDMETHODIMP_(BOOL) GetFastStreamChange();
+ STDMETHODIMP SetFastStreamChange(BOOL nValue);
+ STDMETHODIMP_(BOOL) GetFastStreamChange();
- STDMETHODIMP SetForcedSub(BOOL nValue);
- STDMETHODIMP_(BOOL) GetForcedSub();
+ STDMETHODIMP SetForcedSub(BOOL nValue);
+ STDMETHODIMP_(BOOL) GetForcedSub();
- STDMETHODIMP SetTrackPriority(BOOL nValue);
- STDMETHODIMP_(BOOL) GetTrackPriority();
+ STDMETHODIMP SetTrackPriority(BOOL nValue);
+ STDMETHODIMP_(BOOL) GetTrackPriority();
- STDMETHODIMP SetAudioLanguageOrder(WCHAR *nValue);
- STDMETHODIMP_(WCHAR *) GetAudioLanguageOrder();
+ STDMETHODIMP SetAudioLanguageOrder(WCHAR* nValue);
+ STDMETHODIMP_(WCHAR*) GetAudioLanguageOrder();
- STDMETHODIMP SetSubtitlesLanguageOrder(WCHAR *nValue);
- STDMETHODIMP_(WCHAR *) GetSubtitlesLanguageOrder();
+ STDMETHODIMP SetSubtitlesLanguageOrder(WCHAR* nValue);
+ STDMETHODIMP_(WCHAR*) GetSubtitlesLanguageOrder();
- STDMETHODIMP SetVC1_GuidFlag(int nValue);
- STDMETHODIMP_(int) GetVC1_GuidFlag();
+ STDMETHODIMP SetVC1_GuidFlag(int nValue);
+ STDMETHODIMP_(int) GetVC1_GuidFlag();
- STDMETHODIMP SetTrueHD(int nValue);
- STDMETHODIMP_(int) GetTrueHD();
+ STDMETHODIMP SetTrueHD(int nValue);
+ STDMETHODIMP_(int) GetTrueHD();
- STDMETHODIMP SetAlternativeDuration(BOOL nValue);
- STDMETHODIMP_(BOOL) GetAlternativeDuration();
+ STDMETHODIMP SetAlternativeDuration(BOOL nValue);
+ STDMETHODIMP_(BOOL) GetAlternativeDuration();
- STDMETHODIMP_(int) GetMPEGType();
+ STDMETHODIMP_(int) GetMPEGType();
};
class __declspec(uuid("1365BE7A-C86A-473C-9A41-C0A6E82C9FA3"))
- CMpegSourceFilter : public CMpegSplitterFilter
+ CMpegSourceFilter : public CMpegSplitterFilter
{
public:
- CMpegSourceFilter(LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid = __uuidof(CMpegSourceFilter));
+ CMpegSourceFilter(LPUNKNOWN pUnk, HRESULT* phr, const CLSID& clsid = __uuidof(CMpegSourceFilter));
};
class CMpegSplitterOutputPin : public CBaseSplitterOutputPin, protected CCritSec
{
- CAutoPtr<Packet> m_p;
- CAutoPtrList<Packet> m_pl;
- REFERENCE_TIME m_rtPrev, m_rtOffset, m_rtMaxShift;
- bool m_fHasAccessUnitDelimiters;
- bool m_bFilterDTSMA;
- bool DD_reset;
- bool m_bFlushed;
- int m_type;
+ CAutoPtr<Packet> m_p;
+ CAutoPtrList<Packet> m_pl;
+ REFERENCE_TIME m_rtPrev, m_rtOffset, m_rtMaxShift;
+ bool m_fHasAccessUnitDelimiters;
+ bool m_bFilterDTSMA;
+ bool DD_reset;
+ bool m_bFlushed;
+ int m_type;
protected:
- HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
- HRESULT DeliverPacket(CAutoPtr<Packet> p);
- HRESULT DeliverEndFlush();
+ HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT DeliverPacket(CAutoPtr<Packet> p);
+ HRESULT DeliverEndFlush();
public:
- CMpegSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr, int type);
- virtual ~CMpegSplitterOutputPin();
- STDMETHODIMP Connect(IPin* pReceivePin, const AM_MEDIA_TYPE* pmt);
- void SetMaxShift(REFERENCE_TIME rtMaxShift) { m_rtMaxShift = rtMaxShift; };
+ CMpegSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr, int type);
+ virtual ~CMpegSplitterOutputPin();
+ STDMETHODIMP Connect(IPin* pReceivePin, const AM_MEDIA_TYPE* pmt);
+ void SetMaxShift(REFERENCE_TIME rtMaxShift) { m_rtMaxShift = rtMaxShift; };
};
diff --git a/src/filters/parser/MpegSplitter/MpegSplitterFile.cpp b/src/filters/parser/MpegSplitter/MpegSplitterFile.cpp
index ecacdf03b..599f00f6a 100644
--- a/src/filters/parser/MpegSplitter/MpegSplitterFile.cpp
+++ b/src/filters/parser/MpegSplitter/MpegSplitterFile.cpp
@@ -33,486 +33,485 @@
#define MEGABYTE 1024*1024
-CMpegSplitterFile::CMpegSplitterFile(IAsyncReader* pAsyncReader, HRESULT& hr, bool bIsHdmv, CHdmvClipInfo &ClipInfo, int guid_flag, bool ForcedSub, bool TrackPriority, int AC3CoreOnly, bool AlternativeDuration)
- : CBaseSplitterFileEx(pAsyncReader, hr, DEFAULT_CACHE_LENGTH, false, true)
- , m_type(mpeg_us)
- , m_rate(0)
- , m_rtMin(0), m_rtMax(0)
- , m_posMin(0), m_posMax(0)
- , m_bIsHdmv(bIsHdmv)
- , m_ClipInfo(ClipInfo)
- , m_nVC1_GuidFlag(guid_flag)
- , m_ForcedSub(ForcedSub)
- , m_TrackPriority(TrackPriority)
- , m_AC3CoreOnly(AC3CoreOnly)
- , m_AlternativeDuration(AlternativeDuration)
- , m_init(false)
+CMpegSplitterFile::CMpegSplitterFile(IAsyncReader* pAsyncReader, HRESULT& hr, bool bIsHdmv, CHdmvClipInfo& ClipInfo, int guid_flag, bool ForcedSub, bool TrackPriority, int AC3CoreOnly, bool AlternativeDuration)
+ : CBaseSplitterFileEx(pAsyncReader, hr, DEFAULT_CACHE_LENGTH, false, true)
+ , m_type(mpeg_us)
+ , m_rate(0)
+ , m_rtMin(0), m_rtMax(0)
+ , m_posMin(0), m_posMax(0)
+ , m_bIsHdmv(bIsHdmv)
+ , m_ClipInfo(ClipInfo)
+ , m_nVC1_GuidFlag(guid_flag)
+ , m_ForcedSub(ForcedSub)
+ , m_TrackPriority(TrackPriority)
+ , m_AC3CoreOnly(AC3CoreOnly)
+ , m_AlternativeDuration(AlternativeDuration)
+ , m_init(false)
{
- if (SUCCEEDED(hr)) {
- hr = Init(pAsyncReader);
- }
+ if (SUCCEEDED(hr)) {
+ hr = Init(pAsyncReader);
+ }
}
HRESULT CMpegSplitterFile::Init(IAsyncReader* pAsyncReader)
{
- HRESULT hr;
-
- // get the type first
-
- m_type = mpeg_us;
-
- Seek(0);
-
- if (m_type == mpeg_us) {
- if (BitRead(32, true) == 'TFrc') {
- Seek(0x67c);
- }
- int cnt = 0, limit = 4;
- for (trhdr h; cnt < limit && Read(h); cnt++) {
- Seek(h.next);
- }
- if (cnt >= limit) {
- m_type = mpeg_ts;
- }
- }
-
- Seek(0);
-
- if (m_type == mpeg_us) {
- if (BitRead(32, true) == 'TFrc') {
- Seek(0xE80);
- }
- int cnt = 0, limit = 4;
- for (trhdr h; cnt < limit && Read(h); cnt++) {
- Seek(h.next);
- }
- if (cnt >= limit) {
- m_type = mpeg_ts;
- }
- }
-
- Seek(0);
-
- if (m_type == mpeg_us) {
- int cnt = 0, limit = 4;
- for (pvahdr h; cnt < limit && Read(h); cnt++) {
- Seek(GetPos() + h.length);
- }
- if (cnt >= limit) {
- m_type = mpeg_pva;
- }
- }
-
- Seek(0);
-
- if (m_type == mpeg_us) {
- BYTE b;
- for (int i = 0; (i < 4 || GetPos() < 65536) && m_type == mpeg_us && NextMpegStartCode(b); i++) {
- if (b == 0xba) {
- pshdr h;
- if (Read(h)) {
- m_type = mpeg_ps;
- m_rate = int(h.bitrate/8);
- break;
- }
- } else if ((b&0xe0) == 0xc0 // audio, 110xxxxx, mpeg1/2/3
- || (b&0xf0) == 0xe0 // video, 1110xxxx, mpeg1/2
- // || (b&0xbd) == 0xbd) // private stream 1, 0xbd, ac3/dts/lpcm/subpic
- || b == 0xbd) { // private stream 1, 0xbd, ac3/dts/lpcm/subpic
- peshdr h;
- if (Read(h, b) && BitRead(24, true) == 0x000001) {
- m_type = mpeg_es;
- }
- }
- }
- }
-
- Seek(0);
-
- if (m_type == mpeg_us) {
- return E_FAIL;
- }
-
- // min/max pts & bitrate
- m_rtMin = m_posMin = _I64_MAX;
- m_rtMax = m_posMax = 0;
-
- m_init = true;
-
- if (IsRandomAccess() || IsStreaming()) {
- if (IsStreaming()) {
- for (int i = 0; i < 20 || i < 50 && S_OK != HasMoreData(1024*100, 100); i++) {
- ;
- }
- }
-
- SearchPrograms(0, min(GetLength(), MEGABYTE*5)); // max 5Mb for search a valid Program Map Table
-
- CAtlList<__int64> fps;
- for (int i = 0, j = 5; i <= j; i++) {
- fps.AddTail(i*GetLength()/j);
- }
-
- for (__int64 pfp = 0; fps.GetCount(); ) {
- __int64 fp = fps.RemoveHead();
- fp = min(GetLength() - MEGABYTE/8, fp);
- fp = max(pfp, fp);
- __int64 nfp = fp + (pfp == 0 ? 10*MEGABYTE : MEGABYTE/8);
- if (FAILED(hr = SearchStreams(fp, nfp, pAsyncReader))) {
- return hr;
- }
- pfp = nfp;
- }
- } else {
- if (FAILED(hr = SearchStreams(0, MEGABYTE/8, pAsyncReader))) {
- return hr;
- }
- }
-
- if (m_type == mpeg_ts) {
- if (IsRandomAccess() || IsStreaming()) {
- if (IsStreaming()) {
- for (int i = 0; i < 20 || i < 50 && S_OK != HasMoreData(1024*100, 100); i++) {
- ;
- }
- }
-
- CAtlList<__int64> fps;
- for (int i = 0, j = 5; i <= j; i++) {
- fps.AddTail(i*GetLength()/j);
- }
-
- for (__int64 pfp = 0; fps.GetCount(); ) {
- __int64 fp = fps.RemoveHead();
- fp = min(GetLength() - MEGABYTE/8, fp);
- fp = max(pfp, fp);
- __int64 nfp = fp + (pfp == 0 ? 10*MEGABYTE : MEGABYTE/8);
- if (FAILED(hr = SearchStreams(fp, nfp, pAsyncReader, TRUE))) {
- return hr;
- }
- pfp = nfp;
- }
- } else {
- if (FAILED(hr = SearchStreams(0, MEGABYTE/8, pAsyncReader, TRUE))) {
- return hr;
- }
- }
- }
-
- if (m_posMax - m_posMin <= 0 || m_rtMax - m_rtMin <= 0) {
- return E_FAIL;
- }
-
- m_init = false;
-
- int indicated_rate = m_rate;
- int detected_rate = int(m_rtMax > m_rtMin ? 10000000i64 * (m_posMax - m_posMin) / (m_rtMax - m_rtMin) : 0);
-
- m_rate = detected_rate ? detected_rate : m_rate;
+ HRESULT hr;
+
+ // get the type first
+
+ m_type = mpeg_us;
+
+ Seek(0);
+
+ if (m_type == mpeg_us) {
+ if (BitRead(32, true) == 'TFrc') {
+ Seek(0x67c);
+ }
+ int cnt = 0, limit = 4;
+ for (trhdr h; cnt < limit && Read(h); cnt++) {
+ Seek(h.next);
+ }
+ if (cnt >= limit) {
+ m_type = mpeg_ts;
+ }
+ }
+
+ Seek(0);
+
+ if (m_type == mpeg_us) {
+ if (BitRead(32, true) == 'TFrc') {
+ Seek(0xE80);
+ }
+ int cnt = 0, limit = 4;
+ for (trhdr h; cnt < limit && Read(h); cnt++) {
+ Seek(h.next);
+ }
+ if (cnt >= limit) {
+ m_type = mpeg_ts;
+ }
+ }
+
+ Seek(0);
+
+ if (m_type == mpeg_us) {
+ int cnt = 0, limit = 4;
+ for (pvahdr h; cnt < limit && Read(h); cnt++) {
+ Seek(GetPos() + h.length);
+ }
+ if (cnt >= limit) {
+ m_type = mpeg_pva;
+ }
+ }
+
+ Seek(0);
+
+ if (m_type == mpeg_us) {
+ BYTE b;
+ for (int i = 0; (i < 4 || GetPos() < 65536) && m_type == mpeg_us && NextMpegStartCode(b); i++) {
+ if (b == 0xba) {
+ pshdr h;
+ if (Read(h)) {
+ m_type = mpeg_ps;
+ m_rate = int(h.bitrate / 8);
+ break;
+ }
+ } else if ((b & 0xe0) == 0xc0 // audio, 110xxxxx, mpeg1/2/3
+ || (b & 0xf0) == 0xe0 // video, 1110xxxx, mpeg1/2
+ // || (b&0xbd) == 0xbd) // private stream 1, 0xbd, ac3/dts/lpcm/subpic
+ || b == 0xbd) { // private stream 1, 0xbd, ac3/dts/lpcm/subpic
+ peshdr h;
+ if (Read(h, b) && BitRead(24, true) == 0x000001) {
+ m_type = mpeg_es;
+ }
+ }
+ }
+ }
+
+ Seek(0);
+
+ if (m_type == mpeg_us) {
+ return E_FAIL;
+ }
+
+ // min/max pts & bitrate
+ m_rtMin = m_posMin = _I64_MAX;
+ m_rtMax = m_posMax = 0;
+
+ m_init = true;
+
+ if (IsRandomAccess() || IsStreaming()) {
+ if (IsStreaming()) {
+ for (int i = 0; i < 20 || i < 50 && S_OK != HasMoreData(1024 * 100, 100); i++) {
+ ;
+ }
+ }
+
+ SearchPrograms(0, min(GetLength(), MEGABYTE * 5)); // max 5Mb for search a valid Program Map Table
+
+ CAtlList<__int64> fps;
+ for (int i = 0, j = 5; i <= j; i++) {
+ fps.AddTail(i * GetLength() / j);
+ }
+
+ for (__int64 pfp = 0; fps.GetCount();) {
+ __int64 fp = fps.RemoveHead();
+ fp = min(GetLength() - MEGABYTE / 8, fp);
+ fp = max(pfp, fp);
+ __int64 nfp = fp + (pfp == 0 ? 10 * MEGABYTE : MEGABYTE / 8);
+ if (FAILED(hr = SearchStreams(fp, nfp, pAsyncReader))) {
+ return hr;
+ }
+ pfp = nfp;
+ }
+ } else {
+ if (FAILED(hr = SearchStreams(0, MEGABYTE / 8, pAsyncReader))) {
+ return hr;
+ }
+ }
+
+ if (m_type == mpeg_ts) {
+ if (IsRandomAccess() || IsStreaming()) {
+ if (IsStreaming()) {
+ for (int i = 0; i < 20 || i < 50 && S_OK != HasMoreData(1024 * 100, 100); i++) {
+ ;
+ }
+ }
+
+ CAtlList<__int64> fps;
+ for (int i = 0, j = 5; i <= j; i++) {
+ fps.AddTail(i * GetLength() / j);
+ }
+
+ for (__int64 pfp = 0; fps.GetCount();) {
+ __int64 fp = fps.RemoveHead();
+ fp = min(GetLength() - MEGABYTE / 8, fp);
+ fp = max(pfp, fp);
+ __int64 nfp = fp + (pfp == 0 ? 10 * MEGABYTE : MEGABYTE / 8);
+ if (FAILED(hr = SearchStreams(fp, nfp, pAsyncReader, TRUE))) {
+ return hr;
+ }
+ pfp = nfp;
+ }
+ } else {
+ if (FAILED(hr = SearchStreams(0, MEGABYTE / 8, pAsyncReader, TRUE))) {
+ return hr;
+ }
+ }
+ }
+
+ if (m_posMax - m_posMin <= 0 || m_rtMax - m_rtMin <= 0) {
+ return E_FAIL;
+ }
+
+ m_init = false;
+
+ int indicated_rate = m_rate;
+ int detected_rate = int(m_rtMax > m_rtMin ? 10000000i64 * (m_posMax - m_posMin) / (m_rtMax - m_rtMin) : 0);
+
+ m_rate = detected_rate ? detected_rate : m_rate;
#if (0)
- // normally "detected" should always be less than "indicated", but sometimes it can be a few percent higher (+10% is allowed here)
- // (update: also allowing +/-50k/s)
- if (indicated_rate == 0 || ((float)detected_rate / indicated_rate) < 1.1 || abs(detected_rate - indicated_rate) < 50*1024) {
- m_rate = detected_rate;
- } else {
- ; // TODO: in this case disable seeking, or try doing something less drastical...
- }
+ // normally "detected" should always be less than "indicated", but sometimes it can be a few percent higher (+10% is allowed here)
+ // (update: also allowing +/-50k/s)
+ if (indicated_rate == 0 || ((float)detected_rate / indicated_rate) < 1.1 || abs(detected_rate - indicated_rate) < 50 * 1024) {
+ m_rate = detected_rate;
+ } else {
+ ; // TODO: in this case disable seeking, or try doing something less drastical...
+ }
#endif
- // Add fake Subtitle stream ...
- if (m_type == mpeg_ts) {
- if (m_streams[video].GetCount()) {
- if (!m_bIsHdmv && m_streams[subpic].GetCount()) {
- stream s;
- s.pid = NO_SUBTITLE_PID;
- s.mt.majortype = m_streams[subpic].GetHead().mt.majortype;
- s.mt.subtype = m_streams[subpic].GetHead().mt.subtype;
- s.mt.formattype = m_streams[subpic].GetHead().mt.formattype;
- m_streams[subpic].Insert(s, this);
- } else {
- AddHdmvPGStream(NO_SUBTITLE_PID, "---");
- }
- }
- } else {
- if (m_streams[video].GetCount() && m_streams[subpic].GetCount()) {
- stream s;
- s.pid = NO_SUBTITLE_PID;
- s.mt.majortype = m_streams[subpic].GetHead().mt.majortype;
- s.mt.subtype = m_streams[subpic].GetHead().mt.subtype;
- s.mt.formattype = m_streams[subpic].GetHead().mt.formattype;
- m_streams[subpic].Insert(s, this);
- }
- }
-
- Seek(0);
-
- return S_OK;
+ // Add fake Subtitle stream ...
+ if (m_type == mpeg_ts) {
+ if (m_streams[video].GetCount()) {
+ if (!m_bIsHdmv && m_streams[subpic].GetCount()) {
+ stream s;
+ s.pid = NO_SUBTITLE_PID;
+ s.mt.majortype = m_streams[subpic].GetHead().mt.majortype;
+ s.mt.subtype = m_streams[subpic].GetHead().mt.subtype;
+ s.mt.formattype = m_streams[subpic].GetHead().mt.formattype;
+ m_streams[subpic].Insert(s, this);
+ } else {
+ AddHdmvPGStream(NO_SUBTITLE_PID, "---");
+ }
+ }
+ } else {
+ if (m_streams[video].GetCount() && m_streams[subpic].GetCount()) {
+ stream s;
+ s.pid = NO_SUBTITLE_PID;
+ s.mt.majortype = m_streams[subpic].GetHead().mt.majortype;
+ s.mt.subtype = m_streams[subpic].GetHead().mt.subtype;
+ s.mt.formattype = m_streams[subpic].GetHead().mt.formattype;
+ m_streams[subpic].Insert(s, this);
+ }
+ }
+
+ Seek(0);
+
+ return S_OK;
}
void CMpegSplitterFile::OnComplete(IAsyncReader* pAsyncReader)
{
- __int64 pos = GetPos();
+ __int64 pos = GetPos();
- if (SUCCEEDED(SearchStreams(GetLength() - 500*1024, GetLength(), pAsyncReader, TRUE))) {
- int indicated_rate = m_rate;
- int detected_rate = int(m_rtMax > m_rtMin ? 10000000i64 * (m_posMax - m_posMin) / (m_rtMax - m_rtMin) : 0);
+ if (SUCCEEDED(SearchStreams(GetLength() - 500 * 1024, GetLength(), pAsyncReader, TRUE))) {
+ int indicated_rate = m_rate;
+ int detected_rate = int(m_rtMax > m_rtMin ? 10000000i64 * (m_posMax - m_posMin) / (m_rtMax - m_rtMin) : 0);
- m_rate = detected_rate ? detected_rate : m_rate;
+ m_rate = detected_rate ? detected_rate : m_rate;
#if (0)
- // normally "detected" should always be less than "indicated", but sometimes it can be a few percent higher (+10% is allowed here)
- // (update: also allowing +/-50k/s)
- if (indicated_rate == 0 || ((float)detected_rate / indicated_rate) < 1.1 || abs(detected_rate - indicated_rate) < 50*1024) {
- m_rate = detected_rate;
- } else {
- ; // TODO: in this case disable seeking, or try doing something less drastical...
- }
+ // normally "detected" should always be less than "indicated", but sometimes it can be a few percent higher (+10% is allowed here)
+ // (update: also allowing +/-50k/s)
+ if (indicated_rate == 0 || ((float)detected_rate / indicated_rate) < 1.1 || abs(detected_rate - indicated_rate) < 50 * 1024) {
+ m_rate = detected_rate;
+ } else {
+ ; // TODO: in this case disable seeking, or try doing something less drastical...
+ }
#endif
- }
+ }
- Seek(pos);
+ Seek(pos);
}
REFERENCE_TIME CMpegSplitterFile::NextPTS(DWORD TrackNum)
{
- REFERENCE_TIME rt = -1;
- __int64 rtpos = -1;
-
- BYTE b;
-
- while (GetRemaining()) {
- if (m_type == mpeg_ps || m_type == mpeg_es) {
- if (!NextMpegStartCode(b)) { // continue;
- ASSERT(0);
- break;
- }
-
- rtpos = GetPos()-4;
-
- if ((b >= 0xbd && b < 0xf0) || (b == 0xfd)) {
- peshdr h;
- if (!Read(h, b) || !h.len) {
- continue;
- }
-
- __int64 pos = GetPos();
-
- if (h.fpts && AddStream(0, b, h.id_ext, h.len) == TrackNum) {
- //ASSERT(h.pts >= m_rtMin && h.pts <= m_rtMax);
- rt = h.pts;
- break;
- }
-
- Seek(pos + h.len);
- }
- } else if (m_type == mpeg_ts) {
- trhdr h;
- if (!Read(h)) {
- continue;
- }
-
- rtpos = GetPos()-4;
-
- if (h.payload && h.payloadstart && ISVALIDPID(h.pid)) {
- peshdr h2;
- if (NextMpegStartCode(b, 4) && Read(h2, b)) { // pes packet
- if (h2.fpts && AddStream(h.pid, b, 0, DWORD(h.bytes - (GetPos() - rtpos)) == TrackNum)) {
- //ASSERT(h2.pts >= m_rtMin && h2.pts <= m_rtMax);
- rt = h2.pts;
- break;
- }
- }
- }
-
- Seek(h.next);
- } else if (m_type == mpeg_pva) {
- pvahdr h;
- if (!Read(h)) {
- continue;
- }
-
- if (h.fpts) {
- rt = h.pts;
- break;
- }
- }
- }
-
- if (rtpos >= 0) {
- Seek(rtpos);
- }
- if (rt >= 0) {
- rt -= m_rtMin;
- }
-
- return rt;
+ REFERENCE_TIME rt = -1;
+ __int64 rtpos = -1;
+
+ BYTE b;
+
+ while (GetRemaining()) {
+ if (m_type == mpeg_ps || m_type == mpeg_es) {
+ if (!NextMpegStartCode(b)) { // continue;
+ ASSERT(0);
+ break;
+ }
+
+ rtpos = GetPos() - 4;
+
+ if ((b >= 0xbd && b < 0xf0) || (b == 0xfd)) {
+ peshdr h;
+ if (!Read(h, b) || !h.len) {
+ continue;
+ }
+
+ __int64 pos = GetPos();
+
+ if (h.fpts && AddStream(0, b, h.id_ext, h.len) == TrackNum) {
+ //ASSERT(h.pts >= m_rtMin && h.pts <= m_rtMax);
+ rt = h.pts;
+ break;
+ }
+
+ Seek(pos + h.len);
+ }
+ } else if (m_type == mpeg_ts) {
+ trhdr h;
+ if (!Read(h)) {
+ continue;
+ }
+
+ rtpos = GetPos() - 4;
+
+ if (h.payload && h.payloadstart && ISVALIDPID(h.pid)) {
+ peshdr h2;
+ if (NextMpegStartCode(b, 4) && Read(h2, b)) { // pes packet
+ if (h2.fpts && AddStream(h.pid, b, 0, DWORD(h.bytes - (GetPos() - rtpos)) == TrackNum)) {
+ //ASSERT(h2.pts >= m_rtMin && h2.pts <= m_rtMax);
+ rt = h2.pts;
+ break;
+ }
+ }
+ }
+
+ Seek(h.next);
+ } else if (m_type == mpeg_pva) {
+ pvahdr h;
+ if (!Read(h)) {
+ continue;
+ }
+
+ if (h.fpts) {
+ rt = h.pts;
+ break;
+ }
+ }
+ }
+
+ if (rtpos >= 0) {
+ Seek(rtpos);
+ }
+ if (rt >= 0) {
+ rt -= m_rtMin;
+ }
+
+ return rt;
}
void CMpegSplitterFile::SearchPrograms(__int64 start, __int64 stop)
{
- if (m_type != mpeg_ts) {
- return;
- }
-
- Seek(start);
- stop = min(stop, GetLength());
-
- while (GetPos() < stop) {
- trhdr h;
- if (!Read(h)) {
- continue;
- }
-
- UpdatePrograms(h);
- Seek(h.next);
- }
+ if (m_type != mpeg_ts) {
+ return;
+ }
+
+ Seek(start);
+ stop = min(stop, GetLength());
+
+ while (GetPos() < stop) {
+ trhdr h;
+ if (!Read(h)) {
+ continue;
+ }
+
+ UpdatePrograms(h);
+ Seek(h.next);
+ }
}
HRESULT CMpegSplitterFile::SearchStreams(__int64 start, __int64 stop, IAsyncReader* pAsyncReader, BOOL CalcDuration)
{
- Seek(start);
- stop = min(stop, GetLength());
-
- while (GetPos() < stop) {
- BYTE b;
-
- if (m_type == mpeg_ps || m_type == mpeg_es) {
- if (!NextMpegStartCode(b)) {
- continue;
- }
-
- if (b == 0xba) { // program stream header
- pshdr h;
- if (!Read(h)) {
- continue;
- }
- m_rate = int(h.bitrate/8);
- } else if (b == 0xbb) { // program stream system header
- pssyshdr h;
- if (!Read(h)) {
- continue;
- }
- }
- else if ((b >= 0xbd && b < 0xf0) || (b == 0xfd)) { // pes packet
- peshdr h;
- if (!Read(h, b)) {
- continue;
- }
-
- if (h.type == mpeg2 && h.scrambling) {
- ASSERT(0);
- return E_FAIL;
- }
-
- if (h.fpts) {
- if (m_rtMin == _I64_MAX) {
- m_rtMin = h.pts;
- m_posMin = GetPos();
- TRACE ("m_rtMin(SearchStreams)=%S\n", ReftimeToString(m_rtMin));
- }
- if (m_rtMin < h.pts && m_rtMax < h.pts) {
- m_rtMax = h.pts;
- m_posMax = GetPos();
- TRACE ("m_rtMax(SearchStreams)=%S\n", ReftimeToString(m_rtMax));
- }
- }
-
- __int64 pos = GetPos();
- AddStream(0, b, h.id_ext, h.len);
- if (h.len) {
- Seek(pos + h.len);
- }
- }
- } else if (m_type == mpeg_ts) {
- trhdr h;
- if (!Read(h)) {
- continue;
- }
-
- __int64 pos = GetPos();
-
- //UpdatePrograms(h);
-
- if (h.payload && ISVALIDPID(h.pid)) {
- peshdr h2;
- if (h.payloadstart && NextMpegStartCode(b, 4) && Read(h2, b)) { // pes packet
- if (h2.type == mpeg2 && h2.scrambling) {
- ASSERT(0);
- return E_FAIL;
- }
-
- if (h2.fpts && CalcDuration && (m_AlternativeDuration || (GetMasterStream() && GetMasterStream()->GetHead() == h.pid))) {
- if ((m_rtMin == _I64_MAX) || (m_rtMin > h2.pts)) {
- m_rtMin = h2.pts;
- m_posMin = GetPos();
- TRACE ("m_rtMin(SearchStreams)=%S, PID=%d\n", ReftimeToString(m_rtMin), h.pid);
- }
-
- if (m_rtMin < h2.pts && m_rtMax < h2.pts) {
- m_rtMax = h2.pts;
- m_posMax = GetPos();
- TRACE ("m_rtMax(SearchStreams)=%S, PID=%d\n", ReftimeToString(m_rtMax), h.pid);
- // Ugly code : to support BRD H264 seamless playback, CMultiFiles need to update m_rtPTSOffset variable
- // each time a new part is open...
- // use this code only if Blu-ray is detected
- if (m_ClipInfo.IsHdmv()) {
- for (size_t i=0; i<m_ClipInfo.GetStreamNumber(); i++) {
- CHdmvClipInfo::Stream* stream = m_ClipInfo.GetStreamByIndex(i);
- if (stream->m_Type == VIDEO_STREAM_H264 && m_rtMin == 116506666) {
- CComQIPtr<ISyncReader> pReader = pAsyncReader;
- if (pReader) pReader->SetPTSOffset (&m_rtPTSOffset);
- //TRACE ("UPDATE m_rtPTSOffset(SearchStreams)=%S\n", ReftimeToString(m_rtPTSOffset));
- //TRACE ("m_rtMin(Boucle)=%S\n", ReftimeToString(m_rtMin));
- //TRACE ("stream=%d\n", stream->m_Type);
- //TRACE ("m_rtMax(Boucle)=%S\n", ReftimeToString(m_rtMax));
- //TRACE ("m_rtMax - m_rtMin(Boucle)=%S\n", ReftimeToString(m_rtMax - m_rtMin));
- }
- }
- }
- }
- }
- } else {
- b = 0;
- }
-
- if (!CalcDuration) {
- AddStream(h.pid, b, 0, DWORD(h.bytes - (GetPos() - pos)));
- }
- }
-
- Seek(h.next);
- } else if (m_type == mpeg_pva) {
- pvahdr h;
- if (!Read(h)) {
- continue;
- }
-
- if (h.fpts) {
- if (m_rtMin == _I64_MAX) {
- m_rtMin = h.pts;
- m_posMin = GetPos();
- }
-
- if (m_rtMin < h.pts && m_rtMax < h.pts) {
- m_rtMax = h.pts;
- m_posMax = GetPos();
- }
- }
-
- __int64 pos = GetPos();
-
- if (h.streamid == 1) {
- AddStream(h.streamid, 0xe0, 0, h.length);
- } else if (h.streamid == 2) {
- AddStream(h.streamid, 0xc0, 0, h.length);
- }
-
- if (h.length) {
- Seek(pos + h.length);
- }
- }
- }
-
- return S_OK;
+ Seek(start);
+ stop = min(stop, GetLength());
+
+ while (GetPos() < stop) {
+ BYTE b;
+
+ if (m_type == mpeg_ps || m_type == mpeg_es) {
+ if (!NextMpegStartCode(b)) {
+ continue;
+ }
+
+ if (b == 0xba) { // program stream header
+ pshdr h;
+ if (!Read(h)) {
+ continue;
+ }
+ m_rate = int(h.bitrate / 8);
+ } else if (b == 0xbb) { // program stream system header
+ pssyshdr h;
+ if (!Read(h)) {
+ continue;
+ }
+ } else if ((b >= 0xbd && b < 0xf0) || (b == 0xfd)) { // pes packet
+ peshdr h;
+ if (!Read(h, b)) {
+ continue;
+ }
+
+ if (h.type == mpeg2 && h.scrambling) {
+ ASSERT(0);
+ return E_FAIL;
+ }
+
+ if (h.fpts) {
+ if (m_rtMin == _I64_MAX) {
+ m_rtMin = h.pts;
+ m_posMin = GetPos();
+ TRACE("m_rtMin(SearchStreams)=%S\n", ReftimeToString(m_rtMin));
+ }
+ if (m_rtMin < h.pts && m_rtMax < h.pts) {
+ m_rtMax = h.pts;
+ m_posMax = GetPos();
+ TRACE("m_rtMax(SearchStreams)=%S\n", ReftimeToString(m_rtMax));
+ }
+ }
+
+ __int64 pos = GetPos();
+ AddStream(0, b, h.id_ext, h.len);
+ if (h.len) {
+ Seek(pos + h.len);
+ }
+ }
+ } else if (m_type == mpeg_ts) {
+ trhdr h;
+ if (!Read(h)) {
+ continue;
+ }
+
+ __int64 pos = GetPos();
+
+ //UpdatePrograms(h);
+
+ if (h.payload && ISVALIDPID(h.pid)) {
+ peshdr h2;
+ if (h.payloadstart && NextMpegStartCode(b, 4) && Read(h2, b)) { // pes packet
+ if (h2.type == mpeg2 && h2.scrambling) {
+ ASSERT(0);
+ return E_FAIL;
+ }
+
+ if (h2.fpts && CalcDuration && (m_AlternativeDuration || (GetMasterStream() && GetMasterStream()->GetHead() == h.pid))) {
+ if ((m_rtMin == _I64_MAX) || (m_rtMin > h2.pts)) {
+ m_rtMin = h2.pts;
+ m_posMin = GetPos();
+ TRACE("m_rtMin(SearchStreams)=%S, PID=%d\n", ReftimeToString(m_rtMin), h.pid);
+ }
+
+ if (m_rtMin < h2.pts && m_rtMax < h2.pts) {
+ m_rtMax = h2.pts;
+ m_posMax = GetPos();
+ TRACE("m_rtMax(SearchStreams)=%S, PID=%d\n", ReftimeToString(m_rtMax), h.pid);
+ // Ugly code : to support BRD H264 seamless playback, CMultiFiles need to update m_rtPTSOffset variable
+ // each time a new part is open...
+ // use this code only if Blu-ray is detected
+ if (m_ClipInfo.IsHdmv()) {
+ for (size_t i = 0; i < m_ClipInfo.GetStreamNumber(); i++) {
+ CHdmvClipInfo::Stream* stream = m_ClipInfo.GetStreamByIndex(i);
+ if (stream->m_Type == VIDEO_STREAM_H264 && m_rtMin == 116506666) {
+ CComQIPtr<ISyncReader> pReader = pAsyncReader;
+ if (pReader) { pReader->SetPTSOffset(&m_rtPTSOffset); }
+ //TRACE ("UPDATE m_rtPTSOffset(SearchStreams)=%S\n", ReftimeToString(m_rtPTSOffset));
+ //TRACE ("m_rtMin(Boucle)=%S\n", ReftimeToString(m_rtMin));
+ //TRACE ("stream=%d\n", stream->m_Type);
+ //TRACE ("m_rtMax(Boucle)=%S\n", ReftimeToString(m_rtMax));
+ //TRACE ("m_rtMax - m_rtMin(Boucle)=%S\n", ReftimeToString(m_rtMax - m_rtMin));
+ }
+ }
+ }
+ }
+ }
+ } else {
+ b = 0;
+ }
+
+ if (!CalcDuration) {
+ AddStream(h.pid, b, 0, DWORD(h.bytes - (GetPos() - pos)));
+ }
+ }
+
+ Seek(h.next);
+ } else if (m_type == mpeg_pva) {
+ pvahdr h;
+ if (!Read(h)) {
+ continue;
+ }
+
+ if (h.fpts) {
+ if (m_rtMin == _I64_MAX) {
+ m_rtMin = h.pts;
+ m_posMin = GetPos();
+ }
+
+ if (m_rtMin < h.pts && m_rtMax < h.pts) {
+ m_rtMax = h.pts;
+ m_posMax = GetPos();
+ }
+ }
+
+ __int64 pos = GetPos();
+
+ if (h.streamid == 1) {
+ AddStream(h.streamid, 0xe0, 0, h.length);
+ } else if (h.streamid == 2) {
+ AddStream(h.streamid, 0xc0, 0, h.length);
+ }
+
+ if (h.length) {
+ Seek(pos + h.length);
+ }
+ }
+ }
+
+ return S_OK;
}
#define IsMpegAudio(stream_type) (stream_type == AUDIO_STREAM_MPEG1 || stream_type == AUDIO_STREAM_MPEG2)
@@ -527,590 +526,594 @@ HRESULT CMpegSplitterFile::SearchStreams(__int64 start, __int64 stop, IAsyncRead
DWORD CMpegSplitterFile::AddStream(WORD pid, BYTE pesid, BYTE ps1id, DWORD len)
{
- if (pid) {
- if (pesid) {
- m_pid2pes[pid] = pesid;
- } else {
- m_pid2pes.Lookup(pid, pesid);
- }
- }
-
- stream s;
- s.pid = pid;
- s.pesid = pesid;
- s.ps1id = ps1id;
-
- const __int64 start = GetPos();
- int type = unknown;
-
- if (pesid >= 0xe0 && pesid < 0xf0) { // mpeg video
-
- // MPEG2
- if (type == unknown) {
- CMpegSplitterFile::seqhdr h;
- if (!m_streams[video].Find(s) && Read(h, len, &s.mt)) {
- PES_STREAM_TYPE stream_type = INVALID;
- if (GetStreamType(s.pid, stream_type)) {
- if (IsMPEG2Video(stream_type)) {
- type = video;
- }
- } else {
- type = video;
- }
- }
- }
-
- // H.264
- if (type == unknown) {
- Seek(start);
- // PPS and SPS can be present on differents packets
- // and can also be split into multiple packets
- if (!avch.Lookup(pid))
- memset(&avch[pid], 0, sizeof(CMpegSplitterFile::avchdr));
+ if (pid) {
+ if (pesid) {
+ m_pid2pes[pid] = pesid;
+ } else {
+ m_pid2pes.Lookup(pid, pesid);
+ }
+ }
+
+ stream s;
+ s.pid = pid;
+ s.pesid = pesid;
+ s.ps1id = ps1id;
+
+ const __int64 start = GetPos();
+ int type = unknown;
+
+ if (pesid >= 0xe0 && pesid < 0xf0) { // mpeg video
+
+ // MPEG2
+ if (type == unknown) {
+ CMpegSplitterFile::seqhdr h;
+ if (!m_streams[video].Find(s) && Read(h, len, &s.mt)) {
+ PES_STREAM_TYPE stream_type = INVALID;
+ if (GetStreamType(s.pid, stream_type)) {
+ if (IsMPEG2Video(stream_type)) {
+ type = video;
+ }
+ } else {
+ type = video;
+ }
+ }
+ }
+
+ // H.264
+ if (type == unknown) {
+ Seek(start);
+ // PPS and SPS can be present on differents packets
+ // and can also be split into multiple packets
+ if (!avch.Lookup(pid)) {
+ memset(&avch[pid], 0, sizeof(CMpegSplitterFile::avchdr));
+ }
#if defined(MVC_SUPPORT)
- if (!m_streams[video].Find(s) && !m_streams[stereo].Find(s) && Read(avch[pid], len, &s.mt))
- {
- if (avch[pid].spspps[index_subsetsps].complete)
- type = stereo;
- else
- type = video;
- }
+ if (!m_streams[video].Find(s) && !m_streams[stereo].Find(s) && Read(avch[pid], len, &s.mt)) {
+ if (avch[pid].spspps[index_subsetsps].complete) {
+ type = stereo;
+ } else {
+ type = video;
+ }
+ }
#else
- if (!m_streams[video].Find(s) && Read(avch[pid], len, &s.mt)) {
- PES_STREAM_TYPE stream_type = INVALID;
- if (GetStreamType(s.pid, stream_type)) {
- if (IsH264Video(stream_type)) {
- type = video;
- }
- } else {
- type = video;
- }
- }
+ if (!m_streams[video].Find(s) && Read(avch[pid], len, &s.mt)) {
+ PES_STREAM_TYPE stream_type = INVALID;
+ if (GetStreamType(s.pid, stream_type)) {
+ if (IsH264Video(stream_type)) {
+ type = video;
+ }
+ } else {
+ type = video;
+ }
+ }
#endif
- }
- } else if (pesid >= 0xc0 && pesid < 0xe0) { // mpeg audio
-
- // MPEG Audio
- if (type == unknown) {
- CMpegSplitterFile::aachdr h;
- if (!m_streams[audio].Find(s) && Read(h, len, &s.mt, m_type)) {
- PES_STREAM_TYPE stream_type = INVALID;
- if (GetStreamType(s.pid, stream_type)) {
- if (IsAACAudio(stream_type)) {
- type = audio;
- }
- } else {
- type = audio;
- }
- }
- }
-
- // AAC
- if (type == unknown) {
- Seek(start);
- CMpegSplitterFile::mpahdr h;
- if (!m_streams[audio].Find(s) && Read(h, len, false, &s.mt)) {
- PES_STREAM_TYPE stream_type = INVALID;
- if (GetStreamType(s.pid, stream_type)) {
- if (IsMpegAudio(stream_type)) {
- type = audio;
- }
- } else {
- type = audio;
- }
- }
- }
- } else if (pesid == 0xbd || pesid == 0xfd) { // private stream 1
- if (s.pid) {
- if (!m_streams[audio].Find(s) && !m_streams[video].Find(s)) {
-
- // AC3, E-AC3, TrueHD
- if (type == unknown) {
- CMpegSplitterFile::ac3hdr h;
- if (Read(h, len, &s.mt, true, (m_AC3CoreOnly == 1))) {
- PES_STREAM_TYPE stream_type = INVALID;
- if (GetStreamType(s.pid, stream_type)) {
- if (IsAC3Audio(stream_type)) {
- type = audio;
- }
- } else {
- type = audio;
- }
- }
- }
-
- // DTS, DTS HD, DTS HD MA
- if (type == unknown) {
- Seek(start);
- CMpegSplitterFile::dtshdr h;
- if (Read(h, len, &s.mt, false)) {
- type = audio;
- }
- }
-
- // VC1
- if (type == unknown) {
- Seek(start);
- CMpegSplitterFile::vc1hdr h;
- if (!m_streams[video].Find(s) && Read(h, len, &s.mt, m_nVC1_GuidFlag)) {
- PES_STREAM_TYPE stream_type = INVALID;
- if (GetStreamType(s.pid, stream_type)) {
- if (IsVC1Video(stream_type)) {
- type = video;
- }
- } else {
- type = video;
- }
- }
- }
-
- // DVB subtitles
- if (type == unknown) {
- Seek(start);
- CMpegSplitterFile::dvbsub h;
- if (!m_streams[video].Find(s) && Read(h, len, &s.mt)) {
- type = subpic;
- }
- }
-
- int iProgram;
- const CHdmvClipInfo::Stream *pClipInfo;
- const program* pProgram = FindProgram (s.pid, iProgram, pClipInfo);
- if ((type == unknown) && (pProgram != NULL)) {
- PES_STREAM_TYPE StreamType = INVALID;
-
- Seek(start);
- StreamType = pProgram->streams[iProgram].type;
-
- switch (StreamType) {
- case AUDIO_STREAM_LPCM : {
- CMpegSplitterFile::hdmvlpcmhdr h;
- if (!m_streams[audio].Find(s) && Read(h, &s.mt)) {
- type = audio;
- }
- }
- break;
- case PRESENTATION_GRAPHICS_STREAM : {
- CMpegSplitterFile::hdmvsubhdr h;
- if (!m_streams[subpic].Find(s) && Read(h, &s.mt, pClipInfo ? pClipInfo->m_LanguageCode : NULL)) {
- m_bIsHdmv = true;
- type = subpic;
- }
- }
- break;
- }
- }
- } else if ((m_AC3CoreOnly != 1) && m_init) {
- int iProgram;
- const CHdmvClipInfo::Stream *pClipInfo;
- const program* pProgram = FindProgram (s.pid, iProgram, pClipInfo);
- if ((type == unknown) && (pProgram != NULL) && AUDIO_STREAM_AC3_TRUE_HD == pProgram->streams[iProgram].type) {
- const stream* source = m_streams[audio].FindStream(s.pid);
- if (source && source->mt.subtype == MEDIASUBTYPE_DOLBY_AC3) {
- CMpegSplitterFile::ac3hdr h;
- if (Read(h, len, &s.mt, false, (m_AC3CoreOnly == 1)) && s.mt.subtype == MEDIASUBTYPE_DOLBY_TRUEHD) {
- m_streams[audio].Replace((stream&)*source, s, this);
- }
- }
- }
- }
- } else if (pesid == 0xfd) {
- CMpegSplitterFile::vc1hdr h;
- if (!m_streams[video].Find(s) && Read(h, len, &s.mt, m_nVC1_GuidFlag)) {
- type = video;
- }
- } else {
- BYTE b = (BYTE)BitRead(8, true);
- WORD w = (WORD)BitRead(16, true);
- DWORD dw = (DWORD)BitRead(32, true);
-
- if (b >= 0x80 && b < 0x88 || w == 0x0b77) { // ac3
- s.ps1id = (b >= 0x80 && b < 0x88) ? (BYTE)(BitRead(32) >> 24) : 0x80;
-
- CMpegSplitterFile::ac3hdr h;
- if (!m_streams[audio].Find(s) && Read(h, len, &s.mt)) {
- type = audio;
- }
- } else if (b >= 0x88 && b < 0x90 || dw == 0x7ffe8001) { // dts
- s.ps1id = (b >= 0x88 && b < 0x90) ? (BYTE)(BitRead(32) >> 24) : 0x88;
-
- CMpegSplitterFile::dtshdr h;
- if (!m_streams[audio].Find(s) && Read(h, len, &s.mt)) {
- type = audio;
- }
- } else if (b >= 0xa0 && b < 0xa8) { // lpcm
- s.ps1id = (BYTE)BitRead(8);
-
- do {
- // DVD-Audio LPCM
- if (b == 0xa0) {
- BitRead(8); // Continuity Counter - counts from 0x00 to 0x1f and then wraps to 0x00.
- DWORD headersize = (DWORD)BitRead(16); // LPCM_header_length
- if (headersize >= 8 && headersize+4 < len) {
- CMpegSplitterFile::dvdalpcmhdr h;
- if (Read(h, len-4, &s.mt)) {
- Seek(start + 4 + headersize);
- type = audio;
- break;
- }
- }
- }
- // DVD-Audio MLP
- else if (b == 0xa1 && len > 10) {
- BYTE counter = (BYTE)BitRead(8); // Continuity Counter: 0x00..0x1f or 0x20..0x3f or 0x40..0x5f
- BitRead(8); // some unknown data
- DWORD headersize = (DWORD)BitRead(8); // MLP_header_length (always equal 6?)
- BitRead(32); // some unknown data
- WORD unknown1 = (WORD)BitRead(16); // 0x0000 or 0x0400
- if (counter <= 0x5f && headersize == 6 && (unknown1 == 0x0000 || unknown1 == 0x0400)) { // Maybe it's MLP?
- // MLP header may be missing in the first package
- CMpegSplitterFile::mlphdr h;
- if (!m_streams[audio].Find(s) && Read(h, len-10, &s.mt, true)) {
- // This is exactly the MLP.
- Seek(start + 10);
- type = audio;
- }
- Seek(start + 10);
- break;
- }
- }
-
- // DVD LPCM
- if (m_streams[audio].Find(s)) {
- Seek(start + 7);
- } else {
- Seek(start + 4);
- CMpegSplitterFile::lpcmhdr h;
- if (Read(h, &s.mt)) {
- type = audio;
- }
- }
- } while (false);
- } else if (b >= 0x20 && b < 0x40) { // DVD subpic
- s.ps1id = (BYTE)BitRead(8);
-
- CMpegSplitterFile::dvdspuhdr h;
- if (!m_streams[subpic].Find(s) && Read(h, &s.mt)) {
- type = subpic;
- }
- } else if (b >= 0x70 && b < 0x80) { // SVCD subpic
- s.ps1id = (BYTE)BitRead(8);
-
- CMpegSplitterFile::svcdspuhdr h;
- if (!m_streams[subpic].Find(s) && Read(h, &s.mt)) {
- type = subpic;
- }
- } else if (b >= 0x00 && b < 0x10) { // CVD subpic
- s.ps1id = (BYTE)BitRead(8);
-
- CMpegSplitterFile::cvdspuhdr h;
- if (!m_streams[subpic].Find(s) && Read(h, &s.mt)) {
- type = subpic;
- }
- } else if (w == 0xffa0 || w == 0xffa1) { // ps2-mpg audio
- s.ps1id = (BYTE)BitRead(8);
- s.pid = (WORD)((BitRead(8) << 8) | BitRead(16)); // pid = 0xa000 | track id
-
- CMpegSplitterFile::ps2audhdr h;
- if (!m_streams[audio].Find(s) && Read(h, &s.mt)) {
- type = audio;
- }
- } else if (w == 0xff90) { // ps2-mpg ac3 or subtitles
- s.ps1id = (BYTE)BitRead(8);
- s.pid = (WORD)((BitRead(8) << 8) | BitRead(16)); // pid = 0x9000 | track id
-
- w = (WORD)BitRead(16, true);
-
- if (w == 0x0b77) {
- CMpegSplitterFile::ac3hdr h;
- if (!m_streams[audio].Find(s) && Read(h, len, &s.mt)) {
- type = audio;
- }
- } else if (w == 0x0000) { // usually zero...
- CMpegSplitterFile::ps2subhdr h;
- if (!m_streams[subpic].Find(s) && Read(h, &s.mt)) {
- type = subpic;
- }
- }
- } else if (b >= 0xc0 && b < 0xcf) { // dolby digital/dolby digital +
- s.ps1id = (BYTE)BitRead(8);
- // skip audio header - 3-byte
- BitRead(8);
- BitRead(8);
- BitRead(8);
- CMpegSplitterFile::ac3hdr h;
- if (!m_streams[audio].Find(s) && Read(h, len, &s.mt)) {
- type = audio;
- }
- } else if (b >= 0xb0 && b < 0xbf) { // truehd
- s.ps1id = (BYTE)BitRead(8);
- // skip audio header - 3-byte
- BitRead(8);
- BitRead(8);
- BitRead(8);
- // TrueHD audio has a 4-byte header
- BitRead(8);
- CMpegSplitterFile::ac3hdr h;
- if (!m_streams[audio].Find(s) && Read(h, len, &s.mt, false, false)) {
- type = audio;
- }
- }
- }
- } else if (pesid == 0xbe) { // padding
- } else if (pesid == 0xbf) { // private stream 2
- }
-
- if (type != unknown && !m_streams[type].Find(s)) {
- if (s.pid) {
- for (int i = 0; i < unknown; i++) {
- if (m_streams[i].Find(s)) {
- return s;
- }
- }
- }
-
- m_streams[type].Insert(s, this);
- }
-
- return s;
+ }
+ } else if (pesid >= 0xc0 && pesid < 0xe0) { // mpeg audio
+
+ // MPEG Audio
+ if (type == unknown) {
+ CMpegSplitterFile::aachdr h;
+ if (!m_streams[audio].Find(s) && Read(h, len, &s.mt, m_type)) {
+ PES_STREAM_TYPE stream_type = INVALID;
+ if (GetStreamType(s.pid, stream_type)) {
+ if (IsAACAudio(stream_type)) {
+ type = audio;
+ }
+ } else {
+ type = audio;
+ }
+ }
+ }
+
+ // AAC
+ if (type == unknown) {
+ Seek(start);
+ CMpegSplitterFile::mpahdr h;
+ if (!m_streams[audio].Find(s) && Read(h, len, false, &s.mt)) {
+ PES_STREAM_TYPE stream_type = INVALID;
+ if (GetStreamType(s.pid, stream_type)) {
+ if (IsMpegAudio(stream_type)) {
+ type = audio;
+ }
+ } else {
+ type = audio;
+ }
+ }
+ }
+ } else if (pesid == 0xbd || pesid == 0xfd) { // private stream 1
+ if (s.pid) {
+ if (!m_streams[audio].Find(s) && !m_streams[video].Find(s)) {
+
+ // AC3, E-AC3, TrueHD
+ if (type == unknown) {
+ CMpegSplitterFile::ac3hdr h;
+ if (Read(h, len, &s.mt, true, (m_AC3CoreOnly == 1))) {
+ PES_STREAM_TYPE stream_type = INVALID;
+ if (GetStreamType(s.pid, stream_type)) {
+ if (IsAC3Audio(stream_type)) {
+ type = audio;
+ }
+ } else {
+ type = audio;
+ }
+ }
+ }
+
+ // DTS, DTS HD, DTS HD MA
+ if (type == unknown) {
+ Seek(start);
+ CMpegSplitterFile::dtshdr h;
+ if (Read(h, len, &s.mt, false)) {
+ type = audio;
+ }
+ }
+
+ // VC1
+ if (type == unknown) {
+ Seek(start);
+ CMpegSplitterFile::vc1hdr h;
+ if (!m_streams[video].Find(s) && Read(h, len, &s.mt, m_nVC1_GuidFlag)) {
+ PES_STREAM_TYPE stream_type = INVALID;
+ if (GetStreamType(s.pid, stream_type)) {
+ if (IsVC1Video(stream_type)) {
+ type = video;
+ }
+ } else {
+ type = video;
+ }
+ }
+ }
+
+ // DVB subtitles
+ if (type == unknown) {
+ Seek(start);
+ CMpegSplitterFile::dvbsub h;
+ if (!m_streams[video].Find(s) && Read(h, len, &s.mt)) {
+ type = subpic;
+ }
+ }
+
+ int iProgram;
+ const CHdmvClipInfo::Stream* pClipInfo;
+ const program* pProgram = FindProgram(s.pid, iProgram, pClipInfo);
+ if ((type == unknown) && (pProgram != NULL)) {
+ PES_STREAM_TYPE StreamType = INVALID;
+
+ Seek(start);
+ StreamType = pProgram->streams[iProgram].type;
+
+ switch (StreamType) {
+ case AUDIO_STREAM_LPCM : {
+ CMpegSplitterFile::hdmvlpcmhdr h;
+ if (!m_streams[audio].Find(s) && Read(h, &s.mt)) {
+ type = audio;
+ }
+ }
+ break;
+ case PRESENTATION_GRAPHICS_STREAM : {
+ CMpegSplitterFile::hdmvsubhdr h;
+ if (!m_streams[subpic].Find(s) && Read(h, &s.mt, pClipInfo ? pClipInfo->m_LanguageCode : NULL)) {
+ m_bIsHdmv = true;
+ type = subpic;
+ }
+ }
+ break;
+ }
+ }
+ } else if ((m_AC3CoreOnly != 1) && m_init) {
+ int iProgram;
+ const CHdmvClipInfo::Stream* pClipInfo;
+ const program* pProgram = FindProgram(s.pid, iProgram, pClipInfo);
+ if ((type == unknown) && (pProgram != NULL) && AUDIO_STREAM_AC3_TRUE_HD == pProgram->streams[iProgram].type) {
+ const stream* source = m_streams[audio].FindStream(s.pid);
+ if (source && source->mt.subtype == MEDIASUBTYPE_DOLBY_AC3) {
+ CMpegSplitterFile::ac3hdr h;
+ if (Read(h, len, &s.mt, false, (m_AC3CoreOnly == 1)) && s.mt.subtype == MEDIASUBTYPE_DOLBY_TRUEHD) {
+ m_streams[audio].Replace((stream&)*source, s, this);
+ }
+ }
+ }
+ }
+ } else if (pesid == 0xfd) {
+ CMpegSplitterFile::vc1hdr h;
+ if (!m_streams[video].Find(s) && Read(h, len, &s.mt, m_nVC1_GuidFlag)) {
+ type = video;
+ }
+ } else {
+ BYTE b = (BYTE)BitRead(8, true);
+ WORD w = (WORD)BitRead(16, true);
+ DWORD dw = (DWORD)BitRead(32, true);
+
+ if (b >= 0x80 && b < 0x88 || w == 0x0b77) { // ac3
+ s.ps1id = (b >= 0x80 && b < 0x88) ? (BYTE)(BitRead(32) >> 24) : 0x80;
+
+ CMpegSplitterFile::ac3hdr h;
+ if (!m_streams[audio].Find(s) && Read(h, len, &s.mt)) {
+ type = audio;
+ }
+ } else if (b >= 0x88 && b < 0x90 || dw == 0x7ffe8001) { // dts
+ s.ps1id = (b >= 0x88 && b < 0x90) ? (BYTE)(BitRead(32) >> 24) : 0x88;
+
+ CMpegSplitterFile::dtshdr h;
+ if (!m_streams[audio].Find(s) && Read(h, len, &s.mt)) {
+ type = audio;
+ }
+ } else if (b >= 0xa0 && b < 0xa8) { // lpcm
+ s.ps1id = (BYTE)BitRead(8);
+
+ do {
+ // DVD-Audio LPCM
+ if (b == 0xa0) {
+ BitRead(8); // Continuity Counter - counts from 0x00 to 0x1f and then wraps to 0x00.
+ DWORD headersize = (DWORD)BitRead(16); // LPCM_header_length
+ if (headersize >= 8 && headersize + 4 < len) {
+ CMpegSplitterFile::dvdalpcmhdr h;
+ if (Read(h, len - 4, &s.mt)) {
+ Seek(start + 4 + headersize);
+ type = audio;
+ break;
+ }
+ }
+ }
+ // DVD-Audio MLP
+ else if (b == 0xa1 && len > 10) {
+ BYTE counter = (BYTE)BitRead(8); // Continuity Counter: 0x00..0x1f or 0x20..0x3f or 0x40..0x5f
+ BitRead(8); // some unknown data
+ DWORD headersize = (DWORD)BitRead(8); // MLP_header_length (always equal 6?)
+ BitRead(32); // some unknown data
+ WORD unknown1 = (WORD)BitRead(16); // 0x0000 or 0x0400
+ if (counter <= 0x5f && headersize == 6 && (unknown1 == 0x0000 || unknown1 == 0x0400)) { // Maybe it's MLP?
+ // MLP header may be missing in the first package
+ CMpegSplitterFile::mlphdr h;
+ if (!m_streams[audio].Find(s) && Read(h, len - 10, &s.mt, true)) {
+ // This is exactly the MLP.
+ Seek(start + 10);
+ type = audio;
+ }
+ Seek(start + 10);
+ break;
+ }
+ }
+
+ // DVD LPCM
+ if (m_streams[audio].Find(s)) {
+ Seek(start + 7);
+ } else {
+ Seek(start + 4);
+ CMpegSplitterFile::lpcmhdr h;
+ if (Read(h, &s.mt)) {
+ type = audio;
+ }
+ }
+ } while (false);
+ } else if (b >= 0x20 && b < 0x40) { // DVD subpic
+ s.ps1id = (BYTE)BitRead(8);
+
+ CMpegSplitterFile::dvdspuhdr h;
+ if (!m_streams[subpic].Find(s) && Read(h, &s.mt)) {
+ type = subpic;
+ }
+ } else if (b >= 0x70 && b < 0x80) { // SVCD subpic
+ s.ps1id = (BYTE)BitRead(8);
+
+ CMpegSplitterFile::svcdspuhdr h;
+ if (!m_streams[subpic].Find(s) && Read(h, &s.mt)) {
+ type = subpic;
+ }
+ } else if (b >= 0x00 && b < 0x10) { // CVD subpic
+ s.ps1id = (BYTE)BitRead(8);
+
+ CMpegSplitterFile::cvdspuhdr h;
+ if (!m_streams[subpic].Find(s) && Read(h, &s.mt)) {
+ type = subpic;
+ }
+ } else if (w == 0xffa0 || w == 0xffa1) { // ps2-mpg audio
+ s.ps1id = (BYTE)BitRead(8);
+ s.pid = (WORD)((BitRead(8) << 8) | BitRead(16)); // pid = 0xa000 | track id
+
+ CMpegSplitterFile::ps2audhdr h;
+ if (!m_streams[audio].Find(s) && Read(h, &s.mt)) {
+ type = audio;
+ }
+ } else if (w == 0xff90) { // ps2-mpg ac3 or subtitles
+ s.ps1id = (BYTE)BitRead(8);
+ s.pid = (WORD)((BitRead(8) << 8) | BitRead(16)); // pid = 0x9000 | track id
+
+ w = (WORD)BitRead(16, true);
+
+ if (w == 0x0b77) {
+ CMpegSplitterFile::ac3hdr h;
+ if (!m_streams[audio].Find(s) && Read(h, len, &s.mt)) {
+ type = audio;
+ }
+ } else if (w == 0x0000) { // usually zero...
+ CMpegSplitterFile::ps2subhdr h;
+ if (!m_streams[subpic].Find(s) && Read(h, &s.mt)) {
+ type = subpic;
+ }
+ }
+ } else if (b >= 0xc0 && b < 0xcf) { // dolby digital/dolby digital +
+ s.ps1id = (BYTE)BitRead(8);
+ // skip audio header - 3-byte
+ BitRead(8);
+ BitRead(8);
+ BitRead(8);
+ CMpegSplitterFile::ac3hdr h;
+ if (!m_streams[audio].Find(s) && Read(h, len, &s.mt)) {
+ type = audio;
+ }
+ } else if (b >= 0xb0 && b < 0xbf) { // truehd
+ s.ps1id = (BYTE)BitRead(8);
+ // skip audio header - 3-byte
+ BitRead(8);
+ BitRead(8);
+ BitRead(8);
+ // TrueHD audio has a 4-byte header
+ BitRead(8);
+ CMpegSplitterFile::ac3hdr h;
+ if (!m_streams[audio].Find(s) && Read(h, len, &s.mt, false, false)) {
+ type = audio;
+ }
+ }
+ }
+ } else if (pesid == 0xbe) { // padding
+ } else if (pesid == 0xbf) { // private stream 2
+ }
+
+ if (type != unknown && !m_streams[type].Find(s)) {
+ if (s.pid) {
+ for (int i = 0; i < unknown; i++) {
+ if (m_streams[i].Find(s)) {
+ return s;
+ }
+ }
+ }
+
+ m_streams[type].Insert(s, this);
+ }
+
+ return s;
}
void CMpegSplitterFile::AddHdmvPGStream(WORD pid, const char* language_code)
{
- stream s;
+ stream s;
- s.pid = pid;
- s.pesid = 0xbd;
+ s.pid = pid;
+ s.pesid = 0xbd;
- CMpegSplitterFile::hdmvsubhdr h;
- if (!m_streams[subpic].Find(s) && Read(h, &s.mt, language_code)) {
- m_streams[subpic].Insert(s, this);
- }
+ CMpegSplitterFile::hdmvsubhdr h;
+ if (!m_streams[subpic].Find(s) && Read(h, &s.mt, language_code)) {
+ m_streams[subpic].Insert(s, this);
+ }
}
CAtlList<CMpegSplitterFile::stream>* CMpegSplitterFile::GetMasterStream()
{
- return
- !m_streams[video].IsEmpty() ? &m_streams[video] :
- !m_streams[audio].IsEmpty() ? &m_streams[audio] :
- !m_streams[subpic].IsEmpty() ? &m_streams[subpic] :
+ return
+ !m_streams[video].IsEmpty() ? &m_streams[video] :
+ !m_streams[audio].IsEmpty() ? &m_streams[audio] :
+ !m_streams[subpic].IsEmpty() ? &m_streams[subpic] :
#if defined(MVC_SUPPORT)
- !m_streams[stereo].IsEmpty() ? &m_streams[stereo] :
+ !m_streams[stereo].IsEmpty() ? &m_streams[stereo] :
#endif
- NULL;
+ NULL;
}
void CMpegSplitterFile::UpdatePrograms(const trhdr& h, bool UpdateLang)
{
- CAutoLock cAutoLock(&m_csProps);
-
- if (h.payload && h.payloadstart && h.pid == 0) {
- trsechdr h2;
- if (Read(h2) && h2.table_id == 0) {
- CAtlMap<WORD, bool> newprograms;
-
- int len = h2.section_length;
- len -= 5+4;
-
- for (int i = len/4; i > 0; i--) {
- WORD program_number = (WORD)BitRead(16);
- BYTE reserved = (BYTE)BitRead(3);
- WORD pid = (WORD)BitRead(13);
- UNREFERENCED_PARAMETER(reserved);
- if (program_number != 0) {
- m_programs[pid].program_number = program_number;
- newprograms[program_number] = true;
- }
- }
-
- POSITION pos = m_programs.GetStartPosition();
- while (pos) {
- const CAtlMap<WORD, program>::CPair* pPair = m_programs.GetNext(pos);
-
- if (!newprograms.Lookup(pPair->m_value.program_number)) {
- m_programs.RemoveKey(pPair->m_key);
- }
- }
- }
- } else if (CAtlMap<WORD, program>::CPair* pPair = m_programs.Lookup(h.pid)) {
- if (h.payload && h.payloadstart) {
- trsechdr h2;
- if (Read(h2) && h2.table_id == 2) {
- int len = h2.section_length;
- len -= 5+4;
-
- BYTE buffer[1024];
- ByteRead(buffer, len);
- CGolombBuffer gb(buffer, len);
-
- int max_len = h.bytes - 9;
-
- if (len > max_len) {
- memset(pPair->m_value.ts_buffer, 0, sizeof(pPair->m_value.ts_buffer));
- pPair->m_value.ts_len_cur = max_len;
- pPair->m_value.ts_len_packet = len;
- memcpy(pPair->m_value.ts_buffer, buffer, max_len);
- } else {
- CGolombBuffer gb(buffer, len);
- UpdatePrograms(gb, h.pid, UpdateLang);
- }
- }
- } else {
- if (pPair->m_value.ts_len_cur > 0) {
- int len = pPair->m_value.ts_len_packet - pPair->m_value.ts_len_cur;
- if (len > h.bytes) {
- ByteRead(pPair->m_value.ts_buffer + pPair->m_value.ts_len_cur, h.bytes);
- pPair->m_value.ts_len_cur += h.bytes;
- } else {
- ByteRead(pPair->m_value.ts_buffer + pPair->m_value.ts_len_cur, pPair->m_value.ts_len_packet - pPair->m_value.ts_len_cur);
- CGolombBuffer gb(pPair->m_value.ts_buffer, pPair->m_value.ts_len_packet);
- UpdatePrograms(gb, h.pid, UpdateLang);
- }
- }
- }
- }
+ CAutoLock cAutoLock(&m_csProps);
+
+ if (h.payload && h.payloadstart && h.pid == 0) {
+ trsechdr h2;
+ if (Read(h2) && h2.table_id == 0) {
+ CAtlMap<WORD, bool> newprograms;
+
+ int len = h2.section_length;
+ len -= 5 + 4;
+
+ for (int i = len / 4; i > 0; i--) {
+ WORD program_number = (WORD)BitRead(16);
+ BYTE reserved = (BYTE)BitRead(3);
+ WORD pid = (WORD)BitRead(13);
+ UNREFERENCED_PARAMETER(reserved);
+ if (program_number != 0) {
+ m_programs[pid].program_number = program_number;
+ newprograms[program_number] = true;
+ }
+ }
+
+ POSITION pos = m_programs.GetStartPosition();
+ while (pos) {
+ const CAtlMap<WORD, program>::CPair* pPair = m_programs.GetNext(pos);
+
+ if (!newprograms.Lookup(pPair->m_value.program_number)) {
+ m_programs.RemoveKey(pPair->m_key);
+ }
+ }
+ }
+ } else if (CAtlMap<WORD, program>::CPair* pPair = m_programs.Lookup(h.pid)) {
+ if (h.payload && h.payloadstart) {
+ trsechdr h2;
+ if (Read(h2) && h2.table_id == 2) {
+ int len = h2.section_length;
+ len -= 5 + 4;
+
+ BYTE buffer[1024];
+ ByteRead(buffer, len);
+ CGolombBuffer gb(buffer, len);
+
+ int max_len = h.bytes - 9;
+
+ if (len > max_len) {
+ memset(pPair->m_value.ts_buffer, 0, sizeof(pPair->m_value.ts_buffer));
+ pPair->m_value.ts_len_cur = max_len;
+ pPair->m_value.ts_len_packet = len;
+ memcpy(pPair->m_value.ts_buffer, buffer, max_len);
+ } else {
+ CGolombBuffer gb(buffer, len);
+ UpdatePrograms(gb, h.pid, UpdateLang);
+ }
+ }
+ } else {
+ if (pPair->m_value.ts_len_cur > 0) {
+ int len = pPair->m_value.ts_len_packet - pPair->m_value.ts_len_cur;
+ if (len > h.bytes) {
+ ByteRead(pPair->m_value.ts_buffer + pPair->m_value.ts_len_cur, h.bytes);
+ pPair->m_value.ts_len_cur += h.bytes;
+ } else {
+ ByteRead(pPair->m_value.ts_buffer + pPair->m_value.ts_len_cur, pPair->m_value.ts_len_packet - pPair->m_value.ts_len_cur);
+ CGolombBuffer gb(pPair->m_value.ts_buffer, pPair->m_value.ts_len_packet);
+ UpdatePrograms(gb, h.pid, UpdateLang);
+ }
+ }
+ }
+ }
}
void CMpegSplitterFile::UpdatePrograms(CGolombBuffer gb, WORD pid, bool UpdateLang)
{
- if (CAtlMap<WORD, program>::CPair* pPair = m_programs.Lookup(pid))
- {
- memset(pPair->m_value.streams, 0, sizeof(pPair->m_value.streams));
-
- int len = gb.GetSize();
-
- BYTE reserved1 = (BYTE)gb.BitRead(3);
- WORD PCR_PID = (WORD)gb.BitRead(13);
- BYTE reserved2 = (BYTE)gb.BitRead(4);
- WORD program_info_length = (WORD)gb.BitRead(12);
- UNREFERENCED_PARAMETER(reserved1);
- UNREFERENCED_PARAMETER(PCR_PID);
- UNREFERENCED_PARAMETER(reserved2);
-
- len -= (4 + program_info_length);
- if (len <= 0)
- return;
-
- while (program_info_length-- > 0) {
- gb.BitRead(8);
- }
-
- for (int i = 0; i < _countof(pPair->m_value.streams) && len >= 5; i++) {
- BYTE stream_type = (BYTE)gb.BitRead(8);
- BYTE nreserved1 = (BYTE)gb.BitRead(3);
- WORD pid = (WORD)gb.BitRead(13);
- BYTE nreserved2 = (BYTE)gb.BitRead(4);
- WORD ES_info_length = (WORD)gb.BitRead(12);
- UNREFERENCED_PARAMETER(nreserved1);
- UNREFERENCED_PARAMETER(nreserved2);
-
- pPair->m_value.streams[i].pid = pid;
- pPair->m_value.streams[i].type = (PES_STREAM_TYPE)stream_type;
-
- if (m_ForcedSub) {
- if (stream_type == PRESENTATION_GRAPHICS_STREAM) {
- stream s;
- s.pid = pid;
- CMpegSplitterFile::hdmvsubhdr hdr;
- if (Read(hdr, &s.mt, NULL)) {
- if (!m_streams[subpic].Find(s)) {
- m_streams[subpic].Insert(s, this);
- }
- }
- }
- }
-
- len -= (5 + ES_info_length);
- if (len < 0)
- break;
- if (ES_info_length<=2)
- continue;
-
- if (UpdateLang) {
- int info_length = ES_info_length;
- for (;;) {
- BYTE descriptor_tag = (BYTE)gb.BitRead(8);
- BYTE descriptor_length = (BYTE)gb.BitRead(8);
- info_length -= (2 + descriptor_length);
- if (info_length < 0)
- break;
- char ch[4];
- switch (descriptor_tag) {
- case 0x0a: // ISO 639 language descriptor
- case 0x56: // Teletext descriptor
- case 0x59: // Subtitling descriptor
- gb.ReadBuffer((BYTE *)ch, 3);
- ch[3] = 0;
- for (int i = 3; i < descriptor_length; i++) {
- gb.BitRead(8);
- }
- if (!(ch[0] == 'u' && ch[1] == 'n' && ch[2] == 'd')) {
- m_pPMT_Lang[pid] = ISO6392ToLanguage(ch);
- }
- break;
- default:
- for (int i = 0; i < descriptor_length; i++) {
- gb.BitRead(8);
- }
- break;
- }
- if (info_length<=2) break;
- }
- } else {
- while (ES_info_length-- > 0) {
- gb.BitRead(8);
- }
- }
- }
- pPair->m_value.ts_len_cur = 0;
- pPair->m_value.ts_len_packet = 0;
- }
+ if (CAtlMap<WORD, program>::CPair* pPair = m_programs.Lookup(pid)) {
+ memset(pPair->m_value.streams, 0, sizeof(pPair->m_value.streams));
+
+ int len = gb.GetSize();
+
+ BYTE reserved1 = (BYTE)gb.BitRead(3);
+ WORD PCR_PID = (WORD)gb.BitRead(13);
+ BYTE reserved2 = (BYTE)gb.BitRead(4);
+ WORD program_info_length = (WORD)gb.BitRead(12);
+ UNREFERENCED_PARAMETER(reserved1);
+ UNREFERENCED_PARAMETER(PCR_PID);
+ UNREFERENCED_PARAMETER(reserved2);
+
+ len -= (4 + program_info_length);
+ if (len <= 0) {
+ return;
+ }
+
+ while (program_info_length-- > 0) {
+ gb.BitRead(8);
+ }
+
+ for (int i = 0; i < _countof(pPair->m_value.streams) && len >= 5; i++) {
+ BYTE stream_type = (BYTE)gb.BitRead(8);
+ BYTE nreserved1 = (BYTE)gb.BitRead(3);
+ WORD pid = (WORD)gb.BitRead(13);
+ BYTE nreserved2 = (BYTE)gb.BitRead(4);
+ WORD ES_info_length = (WORD)gb.BitRead(12);
+ UNREFERENCED_PARAMETER(nreserved1);
+ UNREFERENCED_PARAMETER(nreserved2);
+
+ pPair->m_value.streams[i].pid = pid;
+ pPair->m_value.streams[i].type = (PES_STREAM_TYPE)stream_type;
+
+ if (m_ForcedSub) {
+ if (stream_type == PRESENTATION_GRAPHICS_STREAM) {
+ stream s;
+ s.pid = pid;
+ CMpegSplitterFile::hdmvsubhdr hdr;
+ if (Read(hdr, &s.mt, NULL)) {
+ if (!m_streams[subpic].Find(s)) {
+ m_streams[subpic].Insert(s, this);
+ }
+ }
+ }
+ }
+
+ len -= (5 + ES_info_length);
+ if (len < 0) {
+ break;
+ }
+ if (ES_info_length <= 2) {
+ continue;
+ }
+
+ if (UpdateLang) {
+ int info_length = ES_info_length;
+ for (;;) {
+ BYTE descriptor_tag = (BYTE)gb.BitRead(8);
+ BYTE descriptor_length = (BYTE)gb.BitRead(8);
+ info_length -= (2 + descriptor_length);
+ if (info_length < 0) {
+ break;
+ }
+ char ch[4];
+ switch (descriptor_tag) {
+ case 0x0a: // ISO 639 language descriptor
+ case 0x56: // Teletext descriptor
+ case 0x59: // Subtitling descriptor
+ gb.ReadBuffer((BYTE*)ch, 3);
+ ch[3] = 0;
+ for (int i = 3; i < descriptor_length; i++) {
+ gb.BitRead(8);
+ }
+ if (!(ch[0] == 'u' && ch[1] == 'n' && ch[2] == 'd')) {
+ m_pPMT_Lang[pid] = ISO6392ToLanguage(ch);
+ }
+ break;
+ default:
+ for (int i = 0; i < descriptor_length; i++) {
+ gb.BitRead(8);
+ }
+ break;
+ }
+ if (info_length <= 2) { break; }
+ }
+ } else {
+ while (ES_info_length-- > 0) {
+ gb.BitRead(8);
+ }
+ }
+ }
+ pPair->m_value.ts_len_cur = 0;
+ pPair->m_value.ts_len_packet = 0;
+ }
}
-uint32 SwapLE(const uint32 &_Value)
+uint32 SwapLE(const uint32& _Value)
{
- return (_Value & 0xFF) << 24 | ((_Value>>8) & 0xFF) << 16 | ((_Value>>16) & 0xFF) << 8 | ((_Value>>24) & 0xFF) << 0;
+ return (_Value & 0xFF) << 24 | ((_Value >> 8) & 0xFF) << 16 | ((_Value >> 16) & 0xFF) << 8 | ((_Value >> 24) & 0xFF) << 0;
}
-uint16 SwapLE(const uint16 &_Value)
+uint16 SwapLE(const uint16& _Value)
{
- return (_Value & 0xFF) << 8 | ((_Value>>8) & 0xFF) << 0;
+ return (_Value & 0xFF) << 8 | ((_Value >> 8) & 0xFF) << 0;
}
-const CMpegSplitterFile::program* CMpegSplitterFile::FindProgram(WORD pid, int &iStream, const CHdmvClipInfo::Stream * &_pClipInfo)
+const CMpegSplitterFile::program* CMpegSplitterFile::FindProgram(WORD pid, int& iStream, const CHdmvClipInfo::Stream*& _pClipInfo)
{
- _pClipInfo = m_ClipInfo.FindStream(pid);
+ _pClipInfo = m_ClipInfo.FindStream(pid);
- iStream = -1;
+ iStream = -1;
- POSITION pos = m_programs.GetStartPosition();
+ POSITION pos = m_programs.GetStartPosition();
- while (pos) {
- program* p = &m_programs.GetNextValue(pos);
+ while (pos) {
+ program* p = &m_programs.GetNextValue(pos);
- for (int i = 0; i < _countof(p->streams); i++) {
- if (p->streams[i].pid == pid) {
- iStream = i;
- return p;
- }
- }
- }
+ for (int i = 0; i < _countof(p->streams); i++) {
+ if (p->streams[i].pid == pid) {
+ iStream = i;
+ return p;
+ }
+ }
+ }
- return NULL;
+ return NULL;
}
-bool CMpegSplitterFile::GetStreamType(WORD pid, PES_STREAM_TYPE &stream_type)
+bool CMpegSplitterFile::GetStreamType(WORD pid, PES_STREAM_TYPE& stream_type)
{
- int iProgram;
- const CHdmvClipInfo::Stream *pClipInfo;
- const program* pProgram = FindProgram (pid, iProgram, pClipInfo);
- if (pProgram) {
- stream_type = pProgram->streams[iProgram].type;
-
- if (stream_type != INVALID) {
- return true;
- }
- }
-
- return false;
+ int iProgram;
+ const CHdmvClipInfo::Stream* pClipInfo;
+ const program* pProgram = FindProgram(pid, iProgram, pClipInfo);
+ if (pProgram) {
+ stream_type = pProgram->streams[iProgram].type;
+
+ if (stream_type != INVALID) {
+ return true;
+ }
+ }
+
+ return false;
} \ No newline at end of file
diff --git a/src/filters/parser/MpegSplitter/MpegSplitterFile.h b/src/filters/parser/MpegSplitter/MpegSplitterFile.h
index c5f00887c..ce5ede555 100644
--- a/src/filters/parser/MpegSplitter/MpegSplitterFile.h
+++ b/src/filters/parser/MpegSplitter/MpegSplitterFile.h
@@ -37,150 +37,150 @@
class CMpegSplitterFile : public CBaseSplitterFileEx
{
- CAtlMap<WORD, BYTE> m_pid2pes;
- CAtlMap<WORD, CMpegSplitterFile::avchdr> avch;
- bool m_bIsHdmv;
- bool m_init;
+ CAtlMap<WORD, BYTE> m_pid2pes;
+ CAtlMap<WORD, CMpegSplitterFile::avchdr> avch;
+ bool m_bIsHdmv;
+ bool m_init;
- HRESULT Init(IAsyncReader* pAsyncReader);
+ HRESULT Init(IAsyncReader* pAsyncReader);
- void OnComplete(IAsyncReader* pAsyncReader);
+ void OnComplete(IAsyncReader* pAsyncReader);
public:
- CHdmvClipInfo &m_ClipInfo;
- CMpegSplitterFile(IAsyncReader* pAsyncReader, HRESULT& hr, bool bIsHdmv, CHdmvClipInfo &ClipInfo, int guid_flag, bool ForcedSub, bool TrackPriority, int AC3CoreOnly, bool m_AlternativeDuration);
-
- REFERENCE_TIME NextPTS(DWORD TrackNum);
-
- CCritSec m_csProps;
-
- MPEG_TYPES m_type;
-
- REFERENCE_TIME m_rtMin, m_rtMax;
- __int64 m_posMin, m_posMax;
- int m_rate; // byte/sec
-
- int m_nVC1_GuidFlag, m_AC3CoreOnly;
- bool m_ForcedSub, m_TrackPriority, m_AlternativeDuration;
-
- struct stream {
- CMpegSplitterFile *m_pFile;
- CMediaType mt;
- WORD pid;
- BYTE pesid, ps1id;
- bool operator < (const stream &_Other) const;
- struct stream() {
- pid = pesid = ps1id = 0;
- }
- operator DWORD() const {
- return pid ? pid : ((pesid<<8)|ps1id);
- }
- bool operator == (const struct stream& s) const {
- return (DWORD)*this == (DWORD)s;
- }
- };
-
- enum {video, audio, subpic,
+ CHdmvClipInfo& m_ClipInfo;
+ CMpegSplitterFile(IAsyncReader* pAsyncReader, HRESULT& hr, bool bIsHdmv, CHdmvClipInfo& ClipInfo, int guid_flag, bool ForcedSub, bool TrackPriority, int AC3CoreOnly, bool m_AlternativeDuration);
+
+ REFERENCE_TIME NextPTS(DWORD TrackNum);
+
+ CCritSec m_csProps;
+
+ MPEG_TYPES m_type;
+
+ REFERENCE_TIME m_rtMin, m_rtMax;
+ __int64 m_posMin, m_posMax;
+ int m_rate; // byte/sec
+
+ int m_nVC1_GuidFlag, m_AC3CoreOnly;
+ bool m_ForcedSub, m_TrackPriority, m_AlternativeDuration;
+
+ struct stream {
+ CMpegSplitterFile* m_pFile;
+ CMediaType mt;
+ WORD pid;
+ BYTE pesid, ps1id;
+ bool operator < (const stream& _Other) const;
+ struct stream() {
+ pid = pesid = ps1id = 0;
+ }
+ operator DWORD() const {
+ return pid ? pid : ((pesid << 8) | ps1id);
+ }
+ bool operator == (const struct stream& s) const {
+ return (DWORD) * this == (DWORD)s;
+ }
+ };
+
+ enum {video, audio, subpic,
#if defined(MVC_SUPPORT)
- stereo,
+ stereo,
#endif
- unknown
- };
-
- class CStreamList : public CAtlList<stream>
- {
- public:
- void Insert(stream& s, CMpegSplitterFile *_pFile) {
- s.m_pFile = _pFile;
- if (_pFile->m_TrackPriority) {
- for (POSITION pos = GetHeadPosition(); pos; GetNext(pos)) {
- stream& s2 = GetAt(pos);
- if (s < s2) {
- InsertBefore(pos, s);
- return;
- }
- }
- AddTail(s);
- } else {
- AddTail(s);
- if (GetCount() > 1) {
- for (size_t j=0; j<GetCount(); j++) {
- for (size_t i=0; i<GetCount()-1; i++) {
- if (GetAt(FindIndex(i)) > GetAt(FindIndex(i+1))) {
- SwapElements(FindIndex(i), FindIndex(i+1));
- }
- }
- }
- }
- }
- }
-
- void Replace(stream& source, stream& dest, CMpegSplitterFile *_pFile) {
- source.m_pFile = _pFile;
- dest.m_pFile = _pFile;
- for (POSITION pos = GetHeadPosition(); pos; GetNext(pos)) {
- stream& s = GetAt(pos);
- if (source == s) {
- SetAt(pos, dest);
- return;
- }
- }
- }
-
- static CStringW ToString(int type) {
- return
- type == video ? L"Video" :
- type == audio ? L"Audio" :
- type == subpic ? L"Subtitle" :
+ unknown
+ };
+
+ class CStreamList : public CAtlList<stream>
+ {
+ public:
+ void Insert(stream& s, CMpegSplitterFile* _pFile) {
+ s.m_pFile = _pFile;
+ if (_pFile->m_TrackPriority) {
+ for (POSITION pos = GetHeadPosition(); pos; GetNext(pos)) {
+ stream& s2 = GetAt(pos);
+ if (s < s2) {
+ InsertBefore(pos, s);
+ return;
+ }
+ }
+ AddTail(s);
+ } else {
+ AddTail(s);
+ if (GetCount() > 1) {
+ for (size_t j = 0; j < GetCount(); j++) {
+ for (size_t i = 0; i < GetCount() - 1; i++) {
+ if (GetAt(FindIndex(i)) > GetAt(FindIndex(i + 1))) {
+ SwapElements(FindIndex(i), FindIndex(i + 1));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ void Replace(stream& source, stream& dest, CMpegSplitterFile* _pFile) {
+ source.m_pFile = _pFile;
+ dest.m_pFile = _pFile;
+ for (POSITION pos = GetHeadPosition(); pos; GetNext(pos)) {
+ stream& s = GetAt(pos);
+ if (source == s) {
+ SetAt(pos, dest);
+ return;
+ }
+ }
+ }
+
+ static CStringW ToString(int type) {
+ return
+ type == video ? L"Video" :
+ type == audio ? L"Audio" :
+ type == subpic ? L"Subtitle" :
#if defined(MVC_SUPPORT)
- type == stereo ? L"Stereo" :
+ type == stereo ? L"Stereo" :
#endif
- L"Unknown";
- }
-
- const stream* FindStream(int pid) {
- for (POSITION pos = GetHeadPosition(); pos; GetNext(pos)) {
- const stream& s = GetAt(pos);
- if (s.pid == pid) {
- return &s;
- }
- }
-
- return NULL;
- }
-
- } m_streams[unknown];
-
- HRESULT SearchStreams(__int64 start, __int64 stop, IAsyncReader* pAsyncReader, BOOL CalcDuration = FALSE);
- DWORD AddStream(WORD pid, BYTE pesid, BYTE ps1id, DWORD len);
- void AddHdmvPGStream(WORD pid, const char* language_code);
- CAtlList<stream>* GetMasterStream();
- bool IsHdmv() { return m_bIsHdmv; };
-
- struct program {
- WORD program_number;
- struct stream {
- WORD pid;
- PES_STREAM_TYPE type;
-
- };
- stream streams[64];
- struct program() {
- memset(this, 0, sizeof(*this));
- }
-
- BYTE ts_buffer[1024];
- WORD ts_len_cur, ts_len_packet;
- };
-
- CAtlMap<WORD, program> m_programs;
-
- void SearchPrograms(__int64 start, __int64 stop);
- void UpdatePrograms(const trhdr& h, bool UpdateLang = true);
- void UpdatePrograms(CGolombBuffer gb, WORD pid, bool UpdateLang = true);
- const program* FindProgram(WORD pid, int &iStream, const CHdmvClipInfo::Stream * &_pClipInfo);
-
- CAtlMap<DWORD, CString> m_pPMT_Lang;
-
- bool GetStreamType(WORD pid, PES_STREAM_TYPE &stream_type);
+ L"Unknown";
+ }
+
+ const stream* FindStream(int pid) {
+ for (POSITION pos = GetHeadPosition(); pos; GetNext(pos)) {
+ const stream& s = GetAt(pos);
+ if (s.pid == pid) {
+ return &s;
+ }
+ }
+
+ return NULL;
+ }
+
+ } m_streams[unknown];
+
+ HRESULT SearchStreams(__int64 start, __int64 stop, IAsyncReader* pAsyncReader, BOOL CalcDuration = FALSE);
+ DWORD AddStream(WORD pid, BYTE pesid, BYTE ps1id, DWORD len);
+ void AddHdmvPGStream(WORD pid, const char* language_code);
+ CAtlList<stream>* GetMasterStream();
+ bool IsHdmv() { return m_bIsHdmv; };
+
+ struct program {
+ WORD program_number;
+ struct stream {
+ WORD pid;
+ PES_STREAM_TYPE type;
+
+ };
+ stream streams[64];
+ struct program() {
+ memset(this, 0, sizeof(*this));
+ }
+
+ BYTE ts_buffer[1024];
+ WORD ts_len_cur, ts_len_packet;
+ };
+
+ CAtlMap<WORD, program> m_programs;
+
+ void SearchPrograms(__int64 start, __int64 stop);
+ void UpdatePrograms(const trhdr& h, bool UpdateLang = true);
+ void UpdatePrograms(CGolombBuffer gb, WORD pid, bool UpdateLang = true);
+ const program* FindProgram(WORD pid, int& iStream, const CHdmvClipInfo::Stream*& _pClipInfo);
+
+ CAtlMap<DWORD, CString> m_pPMT_Lang;
+
+ bool GetStreamType(WORD pid, PES_STREAM_TYPE& stream_type);
};
diff --git a/src/filters/parser/MpegSplitter/MpegSplitterSettingsWnd.cpp b/src/filters/parser/MpegSplitter/MpegSplitterSettingsWnd.cpp
index ec08f301c..c38e54499 100644
--- a/src/filters/parser/MpegSplitter/MpegSplitterSettingsWnd.cpp
+++ b/src/filters/parser/MpegSplitter/MpegSplitterSettingsWnd.cpp
@@ -28,8 +28,8 @@
#define ResStr(id) CString(MAKEINTRESOURCE(id))
-#define LEFT_SPACING 25
-#define VERTICAL_SPACING 25
+#define LEFT_SPACING 25
+#define VERTICAL_SPACING 25
CMpegSplitterSettingsWnd::CMpegSplitterSettingsWnd(void)
{
@@ -37,97 +37,97 @@ CMpegSplitterSettingsWnd::CMpegSplitterSettingsWnd(void)
bool CMpegSplitterSettingsWnd::OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks)
{
- ASSERT(!m_pMSF);
+ ASSERT(!m_pMSF);
- m_pMSF.Release();
+ m_pMSF.Release();
- POSITION pos = pUnks.GetHeadPosition();
- while (pos && !(m_pMSF = pUnks.GetNext(pos))) {
- ;
- }
+ POSITION pos = pUnks.GetHeadPosition();
+ while (pos && !(m_pMSF = pUnks.GetNext(pos))) {
+ ;
+ }
- if (!m_pMSF) {
- return false;
- }
+ if (!m_pMSF) {
+ return false;
+ }
- return true;
+ return true;
}
void CMpegSplitterSettingsWnd::OnDisconnect()
{
- m_pMSF.Release();
+ m_pMSF.Release();
}
bool CMpegSplitterSettingsWnd::OnActivate()
{
- int nPosY = 10;
-
- m_grpDefault.Create (ResStr(IDS_OPTIONS_CAPTION), WS_VISIBLE|WS_CHILD | BS_GROUPBOX, CRect (10, nPosY, 320, nPosY+310), this, (UINT)IDC_STATIC);
-
- nPosY += VERTICAL_SPACING;
- m_cbFastStreamChange.Create (ResStr(IDS_MPEGSPLITTER_FSTREAM_CHANGE), WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX|BS_LEFTTEXT, CRect (LEFT_SPACING, nPosY, 305, nPosY+15), this, IDC_PP_FAST_STREAM_SELECT);
-
- nPosY += VERTICAL_SPACING;
- m_cbForcedSub.Create (ResStr(IDS_MPEGSPLITTER_SUB_FORCING), WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX|BS_LEFTTEXT, CRect (LEFT_SPACING, nPosY, 305, nPosY+15), this, IDC_PP_SUBTITLE_FORCED);
-
- nPosY += VERTICAL_SPACING;
- m_cbTrackPriority.Create (ResStr(IDS_MPEGSPLITTER_TRACKS_ORDER), WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX|BS_LEFTTEXT, CRect (LEFT_SPACING, nPosY, 305, nPosY+15), this, IDC_PP_TRACK_PRIORITY);
-
- nPosY += VERTICAL_SPACING;
- m_cbAlternativeDuration.Create (ResStr(IDS_MPEGSPLITTER_ALT_DUR_CALC), WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX|BS_LEFTTEXT, CRect (LEFT_SPACING, nPosY, 305, nPosY+15), this, IDC_PP_ALTERNATIVE_DURATION);
-
- nPosY += VERTICAL_SPACING;
- m_txtAudioLanguageOrder.Create (ResStr(IDS_MPEGSPLITTER_LANG_ORDER), WS_VISIBLE|WS_CHILD, CRect (LEFT_SPACING, nPosY, 200, nPosY+15), this, (UINT)IDC_STATIC);
- nPosY += 15;
- m_edtAudioLanguageOrder.CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""), WS_CHILD|WS_VISIBLE|WS_TABSTOP, CRect (LEFT_SPACING, nPosY, 305, nPosY+20), this, IDC_PP_AUDIO_LANGUAGE_ORDER);
-
- nPosY += VERTICAL_SPACING;
- m_txtSubtitlesLanguageOrder.Create (ResStr(IDS_MPEGSPLITTER_SUB_ORDER), WS_VISIBLE|WS_CHILD, CRect (LEFT_SPACING, nPosY, 200, nPosY+15), this, (UINT)IDC_STATIC);
- nPosY += 15;
- m_edtSubtitlesLanguageOrder.CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""), WS_CHILD|WS_VISIBLE|WS_TABSTOP, CRect (LEFT_SPACING, nPosY, 305, nPosY+20), this, IDC_PP_SUBTITLES_LANGUAGE_ORDER);
-
- nPosY += VERTICAL_SPACING;
- m_txtVC1_GuidFlag.Create (ResStr(IDS_MPEGSPLITTER_VC1_GUIDFLAG), WS_VISIBLE|WS_CHILD, CRect (LEFT_SPACING, nPosY, 200, nPosY+15), this, (UINT)IDC_STATIC);
- nPosY += 15;
- m_cbVC1_GuidFlag.Create (WS_VISIBLE|WS_CHILD|CBS_DROPDOWNLIST|WS_VSCROLL, CRect (LEFT_SPACING, nPosY, 305, nPosY+20), this, IDC_PP_VC1_GUIDFLAG);
- m_cbVC1_GuidFlag.AddString (_T("Default"));
- m_cbVC1_GuidFlag.AddString (_T("Cyberlink VC-1 Decoder"));
- m_cbVC1_GuidFlag.AddString (_T("ArcSoft VC-1 Decoder"));
-
- SetClassLongPtr(GetDlgItem(IDC_PP_VC1_GUIDFLAG)->m_hWnd, GCLP_HCURSOR, (LONG_PTR)AfxGetApp()->LoadStandardCursor(IDC_HAND));
-
- nPosY += VERTICAL_SPACING + 5;
- m_grpTrueHD.Create (ResStr(IDS_MPEGSPLITTER_TRUEHD_OUTPUT), WS_VISIBLE|WS_CHILD | BS_GROUPBOX, CRect (LEFT_SPACING, nPosY, 305, nPosY+50), this, (UINT)IDC_STATIC);
-
- nPosY += VERTICAL_SPACING - 5;
- m_cbTrueHD.Create (_T("TrueHD"), WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON|BS_TOP|BS_MULTILINE|WS_GROUP, CRect (LEFT_SPACING + 15, nPosY, LEFT_SPACING + 15 + 80, nPosY+20), this, IDC_PP_TRUEHD);
- m_cbAC3Core.Create (_T("AC-3 core"), WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON|BS_TOP|BS_MULTILINE, CRect (LEFT_SPACING + 15 + 85, nPosY, LEFT_SPACING + 15 + 165, nPosY+20), this, IDC_PP_AC3CORE);
- m_cbAsIs.Create (ResStr(IDS_MPEGSPLITTER_THD_NOSPLIT), WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTORADIOBUTTON|BS_TOP|BS_MULTILINE, CRect (LEFT_SPACING + 15 + 170, nPosY, LEFT_SPACING + 15 + 260, nPosY+20), this, IDC_PP_ASIS);
-
- if (m_pMSF) {
- m_cbFastStreamChange.SetCheck(m_pMSF->GetFastStreamChange());
- m_cbForcedSub.SetCheck(m_pMSF->GetForcedSub());
- m_cbTrackPriority.SetCheck(m_pMSF->GetTrackPriority());
- m_edtAudioLanguageOrder.SetWindowText(m_pMSF->GetAudioLanguageOrder());
- m_edtSubtitlesLanguageOrder.SetWindowText(m_pMSF->GetSubtitlesLanguageOrder());
- m_cbVC1_GuidFlag.SetCurSel(m_pMSF->GetVC1_GuidFlag() - 1);
- m_cbTrueHD.SetCheck (m_pMSF->GetTrueHD() == 0);
- m_cbAC3Core.SetCheck(m_pMSF->GetTrueHD() == 1);
- m_cbAsIs.SetCheck (!m_cbTrueHD.GetCheck() && !m_cbAC3Core.GetCheck());
- m_cbAlternativeDuration.SetCheck(m_pMSF->GetAlternativeDuration());
- }
+ int nPosY = 10;
+
+ m_grpDefault.Create(ResStr(IDS_OPTIONS_CAPTION), WS_VISIBLE | WS_CHILD | BS_GROUPBOX, CRect(10, nPosY, 320, nPosY + 310), this, (UINT)IDC_STATIC);
+
+ nPosY += VERTICAL_SPACING;
+ m_cbFastStreamChange.Create(ResStr(IDS_MPEGSPLITTER_FSTREAM_CHANGE), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_AUTOCHECKBOX | BS_LEFTTEXT, CRect(LEFT_SPACING, nPosY, 305, nPosY + 15), this, IDC_PP_FAST_STREAM_SELECT);
+
+ nPosY += VERTICAL_SPACING;
+ m_cbForcedSub.Create(ResStr(IDS_MPEGSPLITTER_SUB_FORCING), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_AUTOCHECKBOX | BS_LEFTTEXT, CRect(LEFT_SPACING, nPosY, 305, nPosY + 15), this, IDC_PP_SUBTITLE_FORCED);
+
+ nPosY += VERTICAL_SPACING;
+ m_cbTrackPriority.Create(ResStr(IDS_MPEGSPLITTER_TRACKS_ORDER), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_AUTOCHECKBOX | BS_LEFTTEXT, CRect(LEFT_SPACING, nPosY, 305, nPosY + 15), this, IDC_PP_TRACK_PRIORITY);
+
+ nPosY += VERTICAL_SPACING;
+ m_cbAlternativeDuration.Create(ResStr(IDS_MPEGSPLITTER_ALT_DUR_CALC), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_AUTOCHECKBOX | BS_LEFTTEXT, CRect(LEFT_SPACING, nPosY, 305, nPosY + 15), this, IDC_PP_ALTERNATIVE_DURATION);
+
+ nPosY += VERTICAL_SPACING;
+ m_txtAudioLanguageOrder.Create(ResStr(IDS_MPEGSPLITTER_LANG_ORDER), WS_VISIBLE | WS_CHILD, CRect(LEFT_SPACING, nPosY, 200, nPosY + 15), this, (UINT)IDC_STATIC);
+ nPosY += 15;
+ m_edtAudioLanguageOrder.CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""), WS_CHILD | WS_VISIBLE | WS_TABSTOP, CRect(LEFT_SPACING, nPosY, 305, nPosY + 20), this, IDC_PP_AUDIO_LANGUAGE_ORDER);
+
+ nPosY += VERTICAL_SPACING;
+ m_txtSubtitlesLanguageOrder.Create(ResStr(IDS_MPEGSPLITTER_SUB_ORDER), WS_VISIBLE | WS_CHILD, CRect(LEFT_SPACING, nPosY, 200, nPosY + 15), this, (UINT)IDC_STATIC);
+ nPosY += 15;
+ m_edtSubtitlesLanguageOrder.CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""), WS_CHILD | WS_VISIBLE | WS_TABSTOP, CRect(LEFT_SPACING, nPosY, 305, nPosY + 20), this, IDC_PP_SUBTITLES_LANGUAGE_ORDER);
+
+ nPosY += VERTICAL_SPACING;
+ m_txtVC1_GuidFlag.Create(ResStr(IDS_MPEGSPLITTER_VC1_GUIDFLAG), WS_VISIBLE | WS_CHILD, CRect(LEFT_SPACING, nPosY, 200, nPosY + 15), this, (UINT)IDC_STATIC);
+ nPosY += 15;
+ m_cbVC1_GuidFlag.Create(WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST | WS_VSCROLL, CRect(LEFT_SPACING, nPosY, 305, nPosY + 20), this, IDC_PP_VC1_GUIDFLAG);
+ m_cbVC1_GuidFlag.AddString(_T("Default"));
+ m_cbVC1_GuidFlag.AddString(_T("Cyberlink VC-1 Decoder"));
+ m_cbVC1_GuidFlag.AddString(_T("ArcSoft VC-1 Decoder"));
+
+ SetClassLongPtr(GetDlgItem(IDC_PP_VC1_GUIDFLAG)->m_hWnd, GCLP_HCURSOR, (LONG_PTR)AfxGetApp()->LoadStandardCursor(IDC_HAND));
+
+ nPosY += VERTICAL_SPACING + 5;
+ m_grpTrueHD.Create(ResStr(IDS_MPEGSPLITTER_TRUEHD_OUTPUT), WS_VISIBLE | WS_CHILD | BS_GROUPBOX, CRect(LEFT_SPACING, nPosY, 305, nPosY + 50), this, (UINT)IDC_STATIC);
+
+ nPosY += VERTICAL_SPACING - 5;
+ m_cbTrueHD.Create(_T("TrueHD"), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_AUTORADIOBUTTON | BS_TOP | BS_MULTILINE | WS_GROUP, CRect(LEFT_SPACING + 15, nPosY, LEFT_SPACING + 15 + 80, nPosY + 20), this, IDC_PP_TRUEHD);
+ m_cbAC3Core.Create(_T("AC-3 core"), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_AUTORADIOBUTTON | BS_TOP | BS_MULTILINE, CRect(LEFT_SPACING + 15 + 85, nPosY, LEFT_SPACING + 15 + 165, nPosY + 20), this, IDC_PP_AC3CORE);
+ m_cbAsIs.Create(ResStr(IDS_MPEGSPLITTER_THD_NOSPLIT), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_AUTORADIOBUTTON | BS_TOP | BS_MULTILINE, CRect(LEFT_SPACING + 15 + 170, nPosY, LEFT_SPACING + 15 + 260, nPosY + 20), this, IDC_PP_ASIS);
+
+ if (m_pMSF) {
+ m_cbFastStreamChange.SetCheck(m_pMSF->GetFastStreamChange());
+ m_cbForcedSub.SetCheck(m_pMSF->GetForcedSub());
+ m_cbTrackPriority.SetCheck(m_pMSF->GetTrackPriority());
+ m_edtAudioLanguageOrder.SetWindowText(m_pMSF->GetAudioLanguageOrder());
+ m_edtSubtitlesLanguageOrder.SetWindowText(m_pMSF->GetSubtitlesLanguageOrder());
+ m_cbVC1_GuidFlag.SetCurSel(m_pMSF->GetVC1_GuidFlag() - 1);
+ m_cbTrueHD.SetCheck(m_pMSF->GetTrueHD() == 0);
+ m_cbAC3Core.SetCheck(m_pMSF->GetTrueHD() == 1);
+ m_cbAsIs.SetCheck(!m_cbTrueHD.GetCheck() && !m_cbAC3Core.GetCheck());
+ m_cbAlternativeDuration.SetCheck(m_pMSF->GetAlternativeDuration());
+ }
#ifndef REGISTER_FILTER
- m_edtAudioLanguageOrder.EnableWindow(FALSE);
- m_edtSubtitlesLanguageOrder.EnableWindow(FALSE);
+ m_edtAudioLanguageOrder.EnableWindow(FALSE);
+ m_edtSubtitlesLanguageOrder.EnableWindow(FALSE);
#endif
- for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
- pWnd->SetFont(&m_font, FALSE);
- }
+ for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
+ pWnd->SetFont(&m_font, FALSE);
+ }
- return true;
+ return true;
}
void CMpegSplitterSettingsWnd::OnDeactivate()
@@ -136,27 +136,27 @@ void CMpegSplitterSettingsWnd::OnDeactivate()
bool CMpegSplitterSettingsWnd::OnApply()
{
- OnDeactivate();
+ OnDeactivate();
- if (m_pMSF) {
- m_pMSF->SetFastStreamChange(m_cbFastStreamChange.GetCheck());
- m_pMSF->SetForcedSub(m_cbForcedSub.GetCheck());
- m_pMSF->SetTrackPriority(m_cbTrackPriority.GetCheck());
- m_pMSF->SetVC1_GuidFlag(m_cbVC1_GuidFlag.GetCurSel() + 1);
- m_pMSF->SetTrueHD(m_cbTrueHD.GetCheck() ? 0 : m_cbAC3Core.GetCheck() ? 1 : 2);
- m_pMSF->SetAlternativeDuration(m_cbAlternativeDuration.GetCheck());
+ if (m_pMSF) {
+ m_pMSF->SetFastStreamChange(m_cbFastStreamChange.GetCheck());
+ m_pMSF->SetForcedSub(m_cbForcedSub.GetCheck());
+ m_pMSF->SetTrackPriority(m_cbTrackPriority.GetCheck());
+ m_pMSF->SetVC1_GuidFlag(m_cbVC1_GuidFlag.GetCurSel() + 1);
+ m_pMSF->SetTrueHD(m_cbTrueHD.GetCheck() ? 0 : m_cbAC3Core.GetCheck() ? 1 : 2);
+ m_pMSF->SetAlternativeDuration(m_cbAlternativeDuration.GetCheck());
#ifdef REGISTER_FILTER
- CString str = _T("");
- m_edtAudioLanguageOrder.GetWindowText(str);
- m_pMSF->SetAudioLanguageOrder(str.GetBuffer());
- m_edtSubtitlesLanguageOrder.GetWindowText(str);
- m_pMSF->SetSubtitlesLanguageOrder(str.GetBuffer());
+ CString str = _T("");
+ m_edtAudioLanguageOrder.GetWindowText(str);
+ m_pMSF->SetAudioLanguageOrder(str.GetBuffer());
+ m_edtSubtitlesLanguageOrder.GetWindowText(str);
+ m_pMSF->SetSubtitlesLanguageOrder(str.GetBuffer());
#endif
- m_pMSF->Apply();
- }
+ m_pMSF->Apply();
+ }
- return true;
+ return true;
}
BEGIN_MESSAGE_MAP(CMpegSplitterSettingsWnd, CInternalPropertyPageWnd)
diff --git a/src/filters/parser/MpegSplitter/MpegSplitterSettingsWnd.h b/src/filters/parser/MpegSplitter/MpegSplitterSettingsWnd.h
index 81689c897..c70d892d2 100644
--- a/src/filters/parser/MpegSplitter/MpegSplitterSettingsWnd.h
+++ b/src/filters/parser/MpegSplitter/MpegSplitterSettingsWnd.h
@@ -27,56 +27,56 @@
#include <afxcmn.h>
class __declspec(uuid("44FCB62D-3AEB-401C-A7E1-8A984C017923"))
- CMpegSplitterSettingsWnd : public CInternalPropertyPageWnd
+ CMpegSplitterSettingsWnd : public CInternalPropertyPageWnd
{
private :
- CComQIPtr<IMpegSplitterFilter> m_pMSF;
+ CComQIPtr<IMpegSplitterFilter> m_pMSF;
- CButton m_grpDefault;
- CButton m_cbFastStreamChange;
- CButton m_cbForcedSub;
- CButton m_cbTrackPriority;
- CButton m_cbAlternativeDuration;
- CStatic m_txtAudioLanguageOrder;
- CEdit m_edtAudioLanguageOrder;
- CStatic m_txtSubtitlesLanguageOrder;
- CEdit m_edtSubtitlesLanguageOrder;
- CStatic m_txtVC1_GuidFlag;
- CComboBox m_cbVC1_GuidFlag;
+ CButton m_grpDefault;
+ CButton m_cbFastStreamChange;
+ CButton m_cbForcedSub;
+ CButton m_cbTrackPriority;
+ CButton m_cbAlternativeDuration;
+ CStatic m_txtAudioLanguageOrder;
+ CEdit m_edtAudioLanguageOrder;
+ CStatic m_txtSubtitlesLanguageOrder;
+ CEdit m_edtSubtitlesLanguageOrder;
+ CStatic m_txtVC1_GuidFlag;
+ CComboBox m_cbVC1_GuidFlag;
- CButton m_grpTrueHD;
- CButton m_cbTrueHD;
- CButton m_cbAC3Core;
- CButton m_cbAsIs;
+ CButton m_grpTrueHD;
+ CButton m_cbTrueHD;
+ CButton m_cbAC3Core;
+ CButton m_cbAsIs;
- enum {
- IDC_PP_FAST_STREAM_SELECT = 10000,
- IDC_PP_SUBTITLE_FORCED,
- IDC_PP_TRACK_PRIORITY,
- IDC_PP_AUDIO_LANGUAGE_ORDER,
- IDC_PP_SUBTITLES_LANGUAGE_ORDER,
- IDC_PP_VC1_GUIDFLAG,
- IDC_PP_TRUEHD,
- IDC_PP_AC3CORE,
- IDC_PP_ASIS,
- IDC_PP_ALTERNATIVE_DURATION
- };
+ enum {
+ IDC_PP_FAST_STREAM_SELECT = 10000,
+ IDC_PP_SUBTITLE_FORCED,
+ IDC_PP_TRACK_PRIORITY,
+ IDC_PP_AUDIO_LANGUAGE_ORDER,
+ IDC_PP_SUBTITLES_LANGUAGE_ORDER,
+ IDC_PP_VC1_GUIDFLAG,
+ IDC_PP_TRUEHD,
+ IDC_PP_AC3CORE,
+ IDC_PP_ASIS,
+ IDC_PP_ALTERNATIVE_DURATION
+ };
public:
- CMpegSplitterSettingsWnd(void);
+ CMpegSplitterSettingsWnd(void);
- bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
- void OnDisconnect();
- bool OnActivate();
- void OnDeactivate();
- bool OnApply();
+ bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
+ void OnDisconnect();
+ bool OnActivate();
+ void OnDeactivate();
+ bool OnApply();
- static LPCTSTR GetWindowTitle() {
- return _T("Settings");
- }
- static CSize GetWindowSize() {
- return CSize(320, 310);
- }
+ static LPCTSTR GetWindowTitle() {
+ return _T("Settings");
+ }
+ static CSize GetWindowSize() {
+ return CSize(320, 310);
+ }
- DECLARE_MESSAGE_MAP()
+ DECLARE_MESSAGE_MAP()
};
diff --git a/src/filters/parser/OggSplitter/OggFile.cpp b/src/filters/parser/OggSplitter/OggFile.cpp
index ad28f38e5..028233db7 100644
--- a/src/filters/parser/OggSplitter/OggFile.cpp
+++ b/src/filters/parser/OggSplitter/OggFile.cpp
@@ -25,82 +25,82 @@
#include "OggFile.h"
COggFile::COggFile(IAsyncReader* pAsyncReader, HRESULT& hr)
- : CBaseSplitterFile(pAsyncReader, hr, DEFAULT_CACHE_LENGTH, false)
+ : CBaseSplitterFile(pAsyncReader, hr, DEFAULT_CACHE_LENGTH, false)
{
- if (FAILED(hr)) {
- return;
- }
- hr = Init();
+ if (FAILED(hr)) {
+ return;
+ }
+ hr = Init();
}
HRESULT COggFile::Init()
{
- Seek(0);
- if (!Sync()) {
- return E_FAIL;
- }
+ Seek(0);
+ if (!Sync()) {
+ return E_FAIL;
+ }
- return S_OK;
+ return S_OK;
}
bool COggFile::Sync(HANDLE hBreak)
{
- __int64 start = GetPos();
+ __int64 start = GetPos();
- DWORD dw;
- for (__int64 i = 0, j = hBreak ? GetLength() - start : 65536;
- i < j && S_OK == ByteRead((BYTE*)&dw, sizeof(dw))
- && ((i&0xffff) || !hBreak || WaitForSingleObject(hBreak, 0) != WAIT_OBJECT_0);
- i++, Seek(start + i)) {
- if (dw == 'SggO') {
- Seek(start + i);
- return true;
- }
- }
+ DWORD dw;
+ for (__int64 i = 0, j = hBreak ? GetLength() - start : 65536;
+ i < j && S_OK == ByteRead((BYTE*)&dw, sizeof(dw))
+ && ((i & 0xffff) || !hBreak || WaitForSingleObject(hBreak, 0) != WAIT_OBJECT_0);
+ i++, Seek(start + i)) {
+ if (dw == 'SggO') {
+ Seek(start + i);
+ return true;
+ }
+ }
- Seek(start);
+ Seek(start);
- return false;
+ return false;
}
bool COggFile::Read(OggPageHeader& hdr, HANDLE hBreak)
{
- return Sync(hBreak) && S_OK == ByteRead((BYTE*)&hdr, sizeof(hdr)) && hdr.capture_pattern == 'SggO';
+ return Sync(hBreak) && S_OK == ByteRead((BYTE*)&hdr, sizeof(hdr)) && hdr.capture_pattern == 'SggO';
}
bool COggFile::Read(OggPage& page, bool fFull, HANDLE hBreak)
{
- memset(&page.m_hdr, 0, sizeof(page.m_hdr));
- page.m_lens.RemoveAll();
- page.SetCount(0);
+ memset(&page.m_hdr, 0, sizeof(page.m_hdr));
+ page.m_lens.RemoveAll();
+ page.SetCount(0);
- if (!Read(page.m_hdr, hBreak)) {
- return false;
- }
+ if (!Read(page.m_hdr, hBreak)) {
+ return false;
+ }
- int pagelen = 0, packetlen = 0;
- for (BYTE i = 0; i < page.m_hdr.number_page_segments; i++) {
- BYTE b;
- if (S_OK != ByteRead(&b, 1)) {
- return false;
- }
- packetlen += b;
- if (1/*b < 0xff*/) {
- page.m_lens.AddTail(packetlen);
- pagelen += packetlen;
- packetlen = 0;
- }
- }
+ int pagelen = 0, packetlen = 0;
+ for (BYTE i = 0; i < page.m_hdr.number_page_segments; i++) {
+ BYTE b;
+ if (S_OK != ByteRead(&b, 1)) {
+ return false;
+ }
+ packetlen += b;
+ if (1/*b < 0xff*/) {
+ page.m_lens.AddTail(packetlen);
+ pagelen += packetlen;
+ packetlen = 0;
+ }
+ }
- if (fFull) {
- page.SetCount(pagelen);
- if (S_OK != ByteRead(page.GetData(), page.GetCount())) {
- return false;
- }
- } else {
- Seek(GetPos() + pagelen);
- page.m_lens.RemoveAll();
- }
+ if (fFull) {
+ page.SetCount(pagelen);
+ if (S_OK != ByteRead(page.GetData(), page.GetCount())) {
+ return false;
+ }
+ } else {
+ Seek(GetPos() + pagelen);
+ page.m_lens.RemoveAll();
+ }
- return true;
+ return true;
}
diff --git a/src/filters/parser/OggSplitter/OggFile.h b/src/filters/parser/OggSplitter/OggFile.h
index 971b3daf9..82752ad35 100644
--- a/src/filters/parser/OggSplitter/OggFile.h
+++ b/src/filters/parser/OggSplitter/OggFile.h
@@ -28,72 +28,72 @@
#pragma pack(push, 1)
struct OggPageHeader {
- DWORD capture_pattern;
- BYTE stream_structure_version;
- BYTE header_type_flag;
- enum {continued=1, first=2, last=4};
- __int64 granule_position;
- DWORD bitstream_serial_number;
- DWORD page_sequence_number;
- DWORD CRC_checksum;
- BYTE number_page_segments;
+ DWORD capture_pattern;
+ BYTE stream_structure_version;
+ BYTE header_type_flag;
+ enum {continued = 1, first = 2, last = 4};
+ __int64 granule_position;
+ DWORD bitstream_serial_number;
+ DWORD page_sequence_number;
+ DWORD CRC_checksum;
+ BYTE number_page_segments;
};
struct OggVorbisIdHeader {
- DWORD vorbis_version;
- BYTE audio_channels;
- DWORD audio_sample_rate;
- DWORD bitrate_maximum;
- DWORD bitrate_nominal;
- DWORD bitrate_minimum;
- BYTE blocksize_0:4;
- BYTE blocksize_1:4;
- BYTE framing_flag;
+ DWORD vorbis_version;
+ BYTE audio_channels;
+ DWORD audio_sample_rate;
+ DWORD bitrate_maximum;
+ DWORD bitrate_nominal;
+ DWORD bitrate_minimum;
+ BYTE blocksize_0: 4;
+ BYTE blocksize_1: 4;
+ BYTE framing_flag;
};
struct OggVideoHeader {
- DWORD w, h;
+ DWORD w, h;
};
struct OggAudioHeader {
- WORD nChannels, nBlockAlign;
- DWORD nAvgBytesPerSec;
+ WORD nChannels, nBlockAlign;
+ DWORD nAvgBytesPerSec;
};
struct OggStreamHeader {
- char streamtype[8], subtype[4];
- DWORD size;
- __int64 time_unit, samples_per_unit;
- DWORD default_len;
- DWORD buffersize;
- WORD bps;
- WORD alignmentfix1;
- union {
- OggVideoHeader v;
- OggAudioHeader a;
- };
- DWORD alignmentfix2;
+ char streamtype[8], subtype[4];
+ DWORD size;
+ __int64 time_unit, samples_per_unit;
+ DWORD default_len;
+ DWORD buffersize;
+ WORD bps;
+ WORD alignmentfix1;
+ union {
+ OggVideoHeader v;
+ OggAudioHeader a;
+ };
+ DWORD alignmentfix2;
};
#pragma pack(pop)
class OggPage : public CAtlArray<BYTE>
{
public:
- OggPageHeader m_hdr;
- CAtlList<int> m_lens;
- OggPage() {
- memset(&m_hdr, 0, sizeof(m_hdr));
- }
+ OggPageHeader m_hdr;
+ CAtlList<int> m_lens;
+ OggPage() {
+ memset(&m_hdr, 0, sizeof(m_hdr));
+ }
};
class COggFile : public CBaseSplitterFile
{
- HRESULT Init();
+ HRESULT Init();
public:
- COggFile(IAsyncReader* pAsyncReader, HRESULT& hr);
+ COggFile(IAsyncReader* pAsyncReader, HRESULT& hr);
- bool Sync(HANDLE hBreak = NULL);
- bool Read(OggPageHeader& hdr, HANDLE hBreak = NULL);
- bool Read(OggPage& page, bool fFull = true, HANDLE hBreak = NULL);
+ bool Sync(HANDLE hBreak = NULL);
+ bool Read(OggPageHeader& hdr, HANDLE hBreak = NULL);
+ bool Read(OggPage& page, bool fFull = true, HANDLE hBreak = NULL);
};
diff --git a/src/filters/parser/OggSplitter/OggSplitter.cpp b/src/filters/parser/OggSplitter/OggSplitter.cpp
index fc161b4fb..f304b5fd7 100644
--- a/src/filters/parser/OggSplitter/OggSplitter.cpp
+++ b/src/filters/parser/OggSplitter/OggSplitter.cpp
@@ -39,42 +39,42 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(COggSplitterFilter), OggSplitterName, MERIT_NORMAL+1, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
- {&__uuidof(COggSourceFilter), OggSourceName, MERIT_NORMAL+1, 0, NULL, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(COggSplitterFilter), OggSplitterName, MERIT_NORMAL + 1, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(COggSourceFilter), OggSourceName, MERIT_NORMAL + 1, 0, NULL, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<COggSplitterFilter>, NULL, &sudFilter[0]},
- {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<COggSourceFilter>, NULL, &sudFilter[1]},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<COggSplitterFilter>, NULL, &sudFilter[0]},
+ {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<COggSourceFilter>, NULL, &sudFilter[1]},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- RegisterSourceFilter(
- CLSID_AsyncReader,
- MEDIASUBTYPE_Ogg,
- _T("0,4,,4F676753"), // OggS
- _T(".ogg"), _T(".ogm"), NULL);
+ RegisterSourceFilter(
+ CLSID_AsyncReader,
+ MEDIASUBTYPE_Ogg,
+ _T("0,4,,4F676753"), // OggS
+ _T(".ogg"), _T(".ogm"), NULL);
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- UnRegisterSourceFilter(MEDIASUBTYPE_Ogg);
+ UnRegisterSourceFilter(MEDIASUBTYPE_Ogg);
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -89,49 +89,49 @@ CFilterApp theApp;
class bitstream
{
- BYTE* m_p;
- int m_len, m_pos;
+ BYTE* m_p;
+ int m_len, m_pos;
public:
- bitstream(BYTE* p, int len, bool rev = false) : m_p(p), m_len(len*8) {
- m_pos = !rev ? 0 : len*8;
- }
- bool hasbits(int cnt) {
- int pos = m_pos+cnt;
- return (pos >= 0 && pos < m_len);
- }
- unsigned int showbits(int cnt) { // a bit unclean, but works and can read backwards too! :P
- if (!hasbits(cnt)) {
- ASSERT(0);
- return 0;
- }
- unsigned int ret = 0, off = 0;
- BYTE* p = m_p;
- if (cnt < 0) {
- p += (m_pos+cnt)>>3;
- off = (m_pos+cnt)&7;
- cnt = abs(cnt);
- ret = (*p++&(~0<<off))>>off;
- off = 8 - off;
- cnt -= off;
- } else {
- p += m_pos>>3;
- off = m_pos&7;
- ret = (*p++>>off)&((1<<min(cnt,8))-1);
- off = 0;
- cnt -= 8 - off;
- }
- while (cnt > 0) {
- ret |= (*p++&((1<<min(cnt,8))-1)) << off;
- off += 8;
- cnt -= 8;
- }
- return ret;
- }
- unsigned int getbits(int cnt) {
- unsigned int ret = showbits(cnt);
- m_pos += cnt;
- return ret;
- }
+ bitstream(BYTE* p, int len, bool rev = false) : m_p(p), m_len(len * 8) {
+ m_pos = !rev ? 0 : len * 8;
+ }
+ bool hasbits(int cnt) {
+ int pos = m_pos + cnt;
+ return (pos >= 0 && pos < m_len);
+ }
+ unsigned int showbits(int cnt) { // a bit unclean, but works and can read backwards too! :P
+ if (!hasbits(cnt)) {
+ ASSERT(0);
+ return 0;
+ }
+ unsigned int ret = 0, off = 0;
+ BYTE* p = m_p;
+ if (cnt < 0) {
+ p += (m_pos + cnt) >> 3;
+ off = (m_pos + cnt) & 7;
+ cnt = abs(cnt);
+ ret = (*p++ & (~0 << off)) >> off;
+ off = 8 - off;
+ cnt -= off;
+ } else {
+ p += m_pos >> 3;
+ off = m_pos & 7;
+ ret = (*p++ >> off) & ((1 << min(cnt, 8)) - 1);
+ off = 0;
+ cnt -= 8 - off;
+ }
+ while (cnt > 0) {
+ ret |= (*p++ & ((1 << min(cnt, 8)) - 1)) << off;
+ off += 8;
+ cnt -= 8;
+ }
+ return ret;
+ }
+ unsigned int getbits(int cnt) {
+ unsigned int ret = showbits(cnt);
+ m_pos += cnt;
+ return ret;
+ }
};
//
@@ -139,7 +139,7 @@ public:
//
COggSplitterFilter::COggSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CBaseSplitterFilter(NAME("COggSplitterFilter"), pUnk, phr, __uuidof(this))
+ : CBaseSplitterFilter(NAME("COggSplitterFilter"), pUnk, phr, __uuidof(this))
{
}
@@ -149,436 +149,436 @@ COggSplitterFilter::~COggSplitterFilter()
STDMETHODIMP COggSplitterFilter::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
-
- if (m_pName && m_pName[0]==L'M' && m_pName[1]==L'P' && m_pName[2]==L'C') {
- (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
- } else {
- wcscpy_s(pInfo->achName, OggSourceName);
- }
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+
+ if (m_pName && m_pName[0] == L'M' && m_pName[1] == L'P' && m_pName[2] == L'C') {
+ (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
+ } else {
+ wcscpy_s(pInfo->achName, OggSourceName);
+ }
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
HRESULT COggSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
{
- CheckPointer(pAsyncReader, E_POINTER);
-
- HRESULT hr = E_FAIL;
-
- m_pFile.Free();
-
- m_pFile.Attach(DNew COggFile(pAsyncReader, hr));
- if (!m_pFile) {
- return E_OUTOFMEMORY;
- }
- if (FAILED(hr)) {
- m_pFile.Free();
- return hr;
- }
-
- m_rtNewStart = m_rtCurrent = 0;
- m_rtNewStop = m_rtStop = 0;
-
- m_rtDuration = 0;
-
- m_pFile->Seek(0);
- OggPage page;
- for (int i = 0, nWaitForMore = 0; m_pFile->Read(page), i<100; i++) {
- BYTE* p = page.GetData();
- if (!p) {
- break;
- }
-
- if (!(page.m_hdr.header_type_flag & OggPageHeader::continued)) {
- if (!memcmp(p, "fishead", 7) || !memcmp(p, "fisbone", 7)) {
- continue;
- }
-
- BYTE type = *p++;
-
- CStringW name;
- name.Format(L"Stream %d", i);
-
- HRESULT hr;
-
- if (type >= 0x80 && type <= 0x82 && !memcmp(p, "theora", 6)) {
- if (type == 0x80) {
- name.Format(L"Theora %d", i);
- CAutoPtr<CBaseSplitterOutputPin> pPinOut;
- pPinOut.Attach(DNew COggTheoraOutputPin(page.GetData(), name, this, this, &hr));
- AddOutputPin(page.m_hdr.bitstream_serial_number, pPinOut);
- nWaitForMore++;
- }
- } else if (type == 1 && (page.m_hdr.header_type_flag & OggPageHeader::first)) {
- CAutoPtr<CBaseSplitterOutputPin> pPinOut;
-
- if (!memcmp(p, "vorbis", 6)) {
- name.Format(L"Vorbis %d", i);
- pPinOut.Attach(DNew COggVorbisOutputPin((OggVorbisIdHeader*)(p+6), name, this, this, &hr));
- nWaitForMore++;
- } else if (!memcmp(p, "video", 5)) {
- name.Format(L"Video %d", i);
- pPinOut.Attach(DNew COggVideoOutputPin((OggStreamHeader*)p, name, this, this, &hr));
- } else if (!memcmp(p, "audio", 5)) {
- name.Format(L"Audio %d", i);
- pPinOut.Attach(DNew COggAudioOutputPin((OggStreamHeader*)p, name, this, this, &hr));
- } else if (!memcmp(p, "text", 4)) {
- name.Format(L"Text %d", i);
- pPinOut.Attach(DNew COggTextOutputPin((OggStreamHeader*)p, name, this, this, &hr));
- } else if (!memcmp(p, "Direct Show Samples embedded in Ogg", 35)) {
- name.Format(L"DirectShow %d", i);
- pPinOut.Attach(DNew COggDirectShowOutputPin((AM_MEDIA_TYPE*)(p+35+sizeof(GUID)), name, this, this, &hr));
- }
-
- AddOutputPin(page.m_hdr.bitstream_serial_number, pPinOut);
- } else if (type == 3 && !memcmp(p, "vorbis", 6)) {
- if (COggSplitterOutputPin* pOggPin =
- dynamic_cast<COggSplitterOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number))) {
- pOggPin->AddComment(p+6, page.GetCount()-6-1);
- }
- } else if (type == 0x7F && page.GetCount()>12 && *(long*)(p+8) == 0x43614C66) { // Flac
- // Ogg Flac : method 1
- CAutoPtr<CBaseSplitterOutputPin> pPinOut;
- name.Format(L"FLAC %d", i);
- pPinOut.Attach(DNew COggFlacOutputPin(p+12, page.GetCount()-14, name, this, this, &hr));
- AddOutputPin(page.m_hdr.bitstream_serial_number, pPinOut);
- } else if (*(long*)(p-1) == 0x43614C66) {
- //bFlac = true;
- //nWaitForMore++;
- if (m_pFile->Read(page)) {
- CAutoPtr<CBaseSplitterOutputPin> pPinOut;
- name.Format(L"FLAC %d", i);
- p = page.GetData();
- pPinOut.Attach(DNew COggFlacOutputPin(p, page.GetCount(), name, this, this, &hr));
- AddOutputPin(page.m_hdr.bitstream_serial_number, pPinOut);
- }
- } else if (!(type&1) && nWaitForMore == 0) {
- break;
- }
- }
-
- if (COggTheoraOutputPin* p = dynamic_cast<COggTheoraOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number))) {
- p->UnpackInitPage(page);
- if (p->IsInitialized()) {
- nWaitForMore--;
- }
- }
-
- if (COggVorbisOutputPin* p = dynamic_cast<COggVorbisOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number))) {
- p->UnpackInitPage(page);
- if (p->IsInitialized()) {
- nWaitForMore--;
- }
- }
- }
-
- if (m_pOutputs.IsEmpty()) {
- return E_FAIL;
- }
-
- if (m_pFile->IsRandomAccess()) {
- m_pFile->Seek(max(m_pFile->GetLength()-65536, 0));
-
- OggPage page;
- while (m_pFile->Read(page)) {
- COggSplitterOutputPin* pOggPin = dynamic_cast<COggSplitterOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number));
- if (!pOggPin || page.m_hdr.granule_position == -1) {
- continue;
- }
- REFERENCE_TIME rt = pOggPin->GetRefTime(page.m_hdr.granule_position);
- m_rtDuration = max(rt, m_rtDuration);
- }
- }
-
- m_rtNewStart = m_rtCurrent = 0;
- m_rtNewStop = m_rtStop = m_rtDuration;
-
- // comments
-
- {
- CAtlMap<CStringW, CStringW, CStringElementTraits<CStringW> > tagmap;
- tagmap[L"TITLE"] = L"TITL";
- tagmap[L"ARTIST"] = L"AUTH"; // not quite
- tagmap[L"COPYRIGHT"] = L"CPYR";
- tagmap[L"DESCRIPTION"] = L"DESC";
-
- POSITION pos2 = tagmap.GetStartPosition();
- while (pos2) {
- CStringW oggtag, dsmtag;
- tagmap.GetNextAssoc(pos2, oggtag, dsmtag);
-
- POSITION pos = m_pOutputs.GetHeadPosition();
- while (pos) {
- COggSplitterOutputPin* pOggPin = dynamic_cast<COggSplitterOutputPin*>((CBaseOutputPin*)m_pOutputs.GetNext(pos));
- if (!pOggPin) {
- continue;
- }
-
- CStringW value = pOggPin->GetComment(oggtag);
- if (!value.IsEmpty()) {
- SetProperty(dsmtag, value);
- break;
- }
- }
- }
-
- POSITION pos = m_pOutputs.GetHeadPosition();
- while (pos && !ChapGetCount()) {
- COggSplitterOutputPin* pOggPin = dynamic_cast<COggSplitterOutputPin*>((CBaseOutputPin*)m_pOutputs.GetNext(pos));
- if (!pOggPin) {
- continue;
- }
-
- for (int i = 1; pOggPin; i++) {
- CStringW key;
- key.Format(L"CHAPTER%02d", i);
- CStringW time = pOggPin->GetComment(key);
- if (time.IsEmpty()) {
- break;
- }
- key.Format(L"CHAPTER%02dNAME", i);
- CStringW name = pOggPin->GetComment(key);
- if (name.IsEmpty()) {
- name.Format(L"Chapter %d", i);
- }
- int h, m, s, ms;
- WCHAR c;
- if (7 != swscanf_s(time, L"%d%c%d%c%d%c%d", &h, &c, sizeof(WCHAR),
- &m, &c, sizeof(WCHAR), &s, &c, sizeof(WCHAR), &ms)) {
- break;
- }
- REFERENCE_TIME rt = ((((REFERENCE_TIME)h*60+m)*60+s)*1000+ms)*10000;
- ChapAppend(rt, name);
- }
- }
- }
-
- return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
+ CheckPointer(pAsyncReader, E_POINTER);
+
+ HRESULT hr = E_FAIL;
+
+ m_pFile.Free();
+
+ m_pFile.Attach(DNew COggFile(pAsyncReader, hr));
+ if (!m_pFile) {
+ return E_OUTOFMEMORY;
+ }
+ if (FAILED(hr)) {
+ m_pFile.Free();
+ return hr;
+ }
+
+ m_rtNewStart = m_rtCurrent = 0;
+ m_rtNewStop = m_rtStop = 0;
+
+ m_rtDuration = 0;
+
+ m_pFile->Seek(0);
+ OggPage page;
+ for (int i = 0, nWaitForMore = 0; m_pFile->Read(page), i < 100; i++) {
+ BYTE* p = page.GetData();
+ if (!p) {
+ break;
+ }
+
+ if (!(page.m_hdr.header_type_flag & OggPageHeader::continued)) {
+ if (!memcmp(p, "fishead", 7) || !memcmp(p, "fisbone", 7)) {
+ continue;
+ }
+
+ BYTE type = *p++;
+
+ CStringW name;
+ name.Format(L"Stream %d", i);
+
+ HRESULT hr;
+
+ if (type >= 0x80 && type <= 0x82 && !memcmp(p, "theora", 6)) {
+ if (type == 0x80) {
+ name.Format(L"Theora %d", i);
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut;
+ pPinOut.Attach(DNew COggTheoraOutputPin(page.GetData(), name, this, this, &hr));
+ AddOutputPin(page.m_hdr.bitstream_serial_number, pPinOut);
+ nWaitForMore++;
+ }
+ } else if (type == 1 && (page.m_hdr.header_type_flag & OggPageHeader::first)) {
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut;
+
+ if (!memcmp(p, "vorbis", 6)) {
+ name.Format(L"Vorbis %d", i);
+ pPinOut.Attach(DNew COggVorbisOutputPin((OggVorbisIdHeader*)(p + 6), name, this, this, &hr));
+ nWaitForMore++;
+ } else if (!memcmp(p, "video", 5)) {
+ name.Format(L"Video %d", i);
+ pPinOut.Attach(DNew COggVideoOutputPin((OggStreamHeader*)p, name, this, this, &hr));
+ } else if (!memcmp(p, "audio", 5)) {
+ name.Format(L"Audio %d", i);
+ pPinOut.Attach(DNew COggAudioOutputPin((OggStreamHeader*)p, name, this, this, &hr));
+ } else if (!memcmp(p, "text", 4)) {
+ name.Format(L"Text %d", i);
+ pPinOut.Attach(DNew COggTextOutputPin((OggStreamHeader*)p, name, this, this, &hr));
+ } else if (!memcmp(p, "Direct Show Samples embedded in Ogg", 35)) {
+ name.Format(L"DirectShow %d", i);
+ pPinOut.Attach(DNew COggDirectShowOutputPin((AM_MEDIA_TYPE*)(p + 35 + sizeof(GUID)), name, this, this, &hr));
+ }
+
+ AddOutputPin(page.m_hdr.bitstream_serial_number, pPinOut);
+ } else if (type == 3 && !memcmp(p, "vorbis", 6)) {
+ if (COggSplitterOutputPin* pOggPin =
+ dynamic_cast<COggSplitterOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number))) {
+ pOggPin->AddComment(p + 6, page.GetCount() - 6 - 1);
+ }
+ } else if (type == 0x7F && page.GetCount() > 12 && *(long*)(p + 8) == 0x43614C66) { // Flac
+ // Ogg Flac : method 1
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut;
+ name.Format(L"FLAC %d", i);
+ pPinOut.Attach(DNew COggFlacOutputPin(p + 12, page.GetCount() - 14, name, this, this, &hr));
+ AddOutputPin(page.m_hdr.bitstream_serial_number, pPinOut);
+ } else if (*(long*)(p - 1) == 0x43614C66) {
+ //bFlac = true;
+ //nWaitForMore++;
+ if (m_pFile->Read(page)) {
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut;
+ name.Format(L"FLAC %d", i);
+ p = page.GetData();
+ pPinOut.Attach(DNew COggFlacOutputPin(p, page.GetCount(), name, this, this, &hr));
+ AddOutputPin(page.m_hdr.bitstream_serial_number, pPinOut);
+ }
+ } else if (!(type & 1) && nWaitForMore == 0) {
+ break;
+ }
+ }
+
+ if (COggTheoraOutputPin* p = dynamic_cast<COggTheoraOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number))) {
+ p->UnpackInitPage(page);
+ if (p->IsInitialized()) {
+ nWaitForMore--;
+ }
+ }
+
+ if (COggVorbisOutputPin* p = dynamic_cast<COggVorbisOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number))) {
+ p->UnpackInitPage(page);
+ if (p->IsInitialized()) {
+ nWaitForMore--;
+ }
+ }
+ }
+
+ if (m_pOutputs.IsEmpty()) {
+ return E_FAIL;
+ }
+
+ if (m_pFile->IsRandomAccess()) {
+ m_pFile->Seek(max(m_pFile->GetLength() - 65536, 0));
+
+ OggPage page;
+ while (m_pFile->Read(page)) {
+ COggSplitterOutputPin* pOggPin = dynamic_cast<COggSplitterOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number));
+ if (!pOggPin || page.m_hdr.granule_position == -1) {
+ continue;
+ }
+ REFERENCE_TIME rt = pOggPin->GetRefTime(page.m_hdr.granule_position);
+ m_rtDuration = max(rt, m_rtDuration);
+ }
+ }
+
+ m_rtNewStart = m_rtCurrent = 0;
+ m_rtNewStop = m_rtStop = m_rtDuration;
+
+ // comments
+
+ {
+ CAtlMap<CStringW, CStringW, CStringElementTraits<CStringW> > tagmap;
+ tagmap[L"TITLE"] = L"TITL";
+ tagmap[L"ARTIST"] = L"AUTH"; // not quite
+ tagmap[L"COPYRIGHT"] = L"CPYR";
+ tagmap[L"DESCRIPTION"] = L"DESC";
+
+ POSITION pos2 = tagmap.GetStartPosition();
+ while (pos2) {
+ CStringW oggtag, dsmtag;
+ tagmap.GetNextAssoc(pos2, oggtag, dsmtag);
+
+ POSITION pos = m_pOutputs.GetHeadPosition();
+ while (pos) {
+ COggSplitterOutputPin* pOggPin = dynamic_cast<COggSplitterOutputPin*>((CBaseOutputPin*)m_pOutputs.GetNext(pos));
+ if (!pOggPin) {
+ continue;
+ }
+
+ CStringW value = pOggPin->GetComment(oggtag);
+ if (!value.IsEmpty()) {
+ SetProperty(dsmtag, value);
+ break;
+ }
+ }
+ }
+
+ POSITION pos = m_pOutputs.GetHeadPosition();
+ while (pos && !ChapGetCount()) {
+ COggSplitterOutputPin* pOggPin = dynamic_cast<COggSplitterOutputPin*>((CBaseOutputPin*)m_pOutputs.GetNext(pos));
+ if (!pOggPin) {
+ continue;
+ }
+
+ for (int i = 1; pOggPin; i++) {
+ CStringW key;
+ key.Format(L"CHAPTER%02d", i);
+ CStringW time = pOggPin->GetComment(key);
+ if (time.IsEmpty()) {
+ break;
+ }
+ key.Format(L"CHAPTER%02dNAME", i);
+ CStringW name = pOggPin->GetComment(key);
+ if (name.IsEmpty()) {
+ name.Format(L"Chapter %d", i);
+ }
+ int h, m, s, ms;
+ WCHAR c;
+ if (7 != swscanf_s(time, L"%d%c%d%c%d%c%d", &h, &c, sizeof(WCHAR),
+ &m, &c, sizeof(WCHAR), &s, &c, sizeof(WCHAR), &ms)) {
+ break;
+ }
+ REFERENCE_TIME rt = ((((REFERENCE_TIME)h * 60 + m) * 60 + s) * 1000 + ms) * 10000;
+ ChapAppend(rt, name);
+ }
+ }
+ }
+
+ return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
}
bool COggSplitterFilter::DemuxInit()
{
- SetThreadName((DWORD)-1, "COggSplitterFilter");
- if (!m_pFile) {
- return false;
- }
+ SetThreadName((DWORD) - 1, "COggSplitterFilter");
+ if (!m_pFile) {
+ return false;
+ }
- return true;
+ return true;
}
void COggSplitterFilter::DemuxSeek(REFERENCE_TIME rt)
{
- if (rt <= 0 ) {
- m_pFile->Seek(0);
- } else if (m_rtDuration > 0) {
- // oh, the horror...
-
- __int64 len = m_pFile->GetLength();
- __int64 startpos = len * rt/m_rtDuration;
- //__int64 diff = 0;
-
- REFERENCE_TIME rtMinDiff = _I64_MAX;
-
- for (;;) {
- __int64 endpos = startpos;
- REFERENCE_TIME rtPos = -1;
-
- OggPage page;
- m_pFile->Seek(startpos);
- while (m_pFile->Read(page, false)) {
- if (page.m_hdr.granule_position == -1) {
- continue;
- }
-
- COggSplitterOutputPin* pOggPin = dynamic_cast<COggSplitterOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number));
- if (!pOggPin) {
- ASSERT(0);
- continue;
- }
-
- rtPos = pOggPin->GetRefTime(page.m_hdr.granule_position);
- endpos = m_pFile->GetPos();
-
- break;
- }
-
- __int64 rtDiff = rtPos - rt;
-
- if (rtDiff < 0) {
- rtDiff = -rtDiff;
-
- if (rtDiff < 1000000 || rtDiff >= rtMinDiff) {
- m_pFile->Seek(startpos);
- break;
- }
-
- rtMinDiff = rtDiff;
- }
-
- __int64 newpos = startpos;
-
- if (rtPos < rt && rtPos < m_rtDuration) {
- newpos = startpos + (__int64)((1.0*(rt - rtPos)/(m_rtDuration - rtPos)) * (len - startpos)) + 1024;
- if (newpos < endpos) {
- newpos = endpos + 1024;
- }
- } else if (rtPos > rt && rtPos > 0) {
- newpos = startpos - (__int64)((1.0*(rtPos - rt)/(rtPos - 0)) * (startpos - 0)) - 1024;
- if (newpos >= startpos) {
- newpos = startpos - 1024;
- }
- } else if (rtPos == rt) {
- m_pFile->Seek(startpos);
- break;
- } else {
- ASSERT(0);
- m_pFile->Seek(0);
- break;
- }
-
- //diff = newpos - startpos;
-
- startpos = max(min(newpos, len), 0);
- }
-
- m_pFile->Seek(startpos);
-
- POSITION pos = m_pOutputs.GetHeadPosition();
- while (pos) {
- COggSplitterOutputPin* pPin = dynamic_cast<COggSplitterOutputPin*>(static_cast<CBaseSplitterOutputPin*>(m_pOutputs.GetNext(pos)));
-
- if (!dynamic_cast<COggVideoOutputPin*>(pPin) && !dynamic_cast<COggTheoraOutputPin*>(pPin)) {
- continue;
- }
-
- bool fKeyFrameFound = false, fSkipKeyFrame = true;
- __int64 endpos = _I64_MAX;
-
- while (!(fKeyFrameFound && !fSkipKeyFrame) && startpos > 0) {
- OggPage page;
- while (!(fKeyFrameFound && !fSkipKeyFrame) && m_pFile->GetPos() < endpos && m_pFile->Read(page)) {
- if (page.m_hdr.granule_position == -1) {
- continue;
- }
-
- if (pPin != dynamic_cast<COggSplitterOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number))) {
- continue;
- }
-
- if (pPin->GetRefTime(page.m_hdr.granule_position) > rt) {
- break;
- }
-
- if (!fKeyFrameFound) {
- pPin->UnpackPage(page);
-
- CAutoPtr<OggPacket> p;
- while (p = pPin->GetPacket()) {
- if (p->bSyncPoint) {
- fKeyFrameFound = true;
- fSkipKeyFrame = p->fSkip;
- }
- }
-
- if (fKeyFrameFound) {
- break;
- }
- } else {
- pPin->UnpackPage(page);
-
- CAutoPtr<OggPacket> p;
- while (p = pPin->GetPacket()) {
- if (!p->fSkip) {
- fSkipKeyFrame = false;
- break;
- }
- }
- }
- }
-
- if (!(fKeyFrameFound && !fSkipKeyFrame)) {
- endpos = startpos;
- startpos = max(startpos - 10*65536, 0);
- }
-
- m_pFile->Seek(startpos);
- }
+ if (rt <= 0) {
+ m_pFile->Seek(0);
+ } else if (m_rtDuration > 0) {
+ // oh, the horror...
+
+ __int64 len = m_pFile->GetLength();
+ __int64 startpos = len * rt / m_rtDuration;
+ //__int64 diff = 0;
+
+ REFERENCE_TIME rtMinDiff = _I64_MAX;
+
+ for (;;) {
+ __int64 endpos = startpos;
+ REFERENCE_TIME rtPos = -1;
+
+ OggPage page;
+ m_pFile->Seek(startpos);
+ while (m_pFile->Read(page, false)) {
+ if (page.m_hdr.granule_position == -1) {
+ continue;
+ }
+
+ COggSplitterOutputPin* pOggPin = dynamic_cast<COggSplitterOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number));
+ if (!pOggPin) {
+ ASSERT(0);
+ continue;
+ }
+
+ rtPos = pOggPin->GetRefTime(page.m_hdr.granule_position);
+ endpos = m_pFile->GetPos();
+
+ break;
+ }
+
+ __int64 rtDiff = rtPos - rt;
+
+ if (rtDiff < 0) {
+ rtDiff = -rtDiff;
+
+ if (rtDiff < 1000000 || rtDiff >= rtMinDiff) {
+ m_pFile->Seek(startpos);
+ break;
+ }
+
+ rtMinDiff = rtDiff;
+ }
+
+ __int64 newpos = startpos;
+
+ if (rtPos < rt && rtPos < m_rtDuration) {
+ newpos = startpos + (__int64)((1.0 * (rt - rtPos) / (m_rtDuration - rtPos)) * (len - startpos)) + 1024;
+ if (newpos < endpos) {
+ newpos = endpos + 1024;
+ }
+ } else if (rtPos > rt && rtPos > 0) {
+ newpos = startpos - (__int64)((1.0 * (rtPos - rt) / (rtPos - 0)) * (startpos - 0)) - 1024;
+ if (newpos >= startpos) {
+ newpos = startpos - 1024;
+ }
+ } else if (rtPos == rt) {
+ m_pFile->Seek(startpos);
+ break;
+ } else {
+ ASSERT(0);
+ m_pFile->Seek(0);
+ break;
+ }
+
+ //diff = newpos - startpos;
+
+ startpos = max(min(newpos, len), 0);
+ }
+
+ m_pFile->Seek(startpos);
+
+ POSITION pos = m_pOutputs.GetHeadPosition();
+ while (pos) {
+ COggSplitterOutputPin* pPin = dynamic_cast<COggSplitterOutputPin*>(static_cast<CBaseSplitterOutputPin*>(m_pOutputs.GetNext(pos)));
+
+ if (!dynamic_cast<COggVideoOutputPin*>(pPin) && !dynamic_cast<COggTheoraOutputPin*>(pPin)) {
+ continue;
+ }
+
+ bool fKeyFrameFound = false, fSkipKeyFrame = true;
+ __int64 endpos = _I64_MAX;
+
+ while (!(fKeyFrameFound && !fSkipKeyFrame) && startpos > 0) {
+ OggPage page;
+ while (!(fKeyFrameFound && !fSkipKeyFrame) && m_pFile->GetPos() < endpos && m_pFile->Read(page)) {
+ if (page.m_hdr.granule_position == -1) {
+ continue;
+ }
+
+ if (pPin != dynamic_cast<COggSplitterOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number))) {
+ continue;
+ }
+
+ if (pPin->GetRefTime(page.m_hdr.granule_position) > rt) {
+ break;
+ }
+
+ if (!fKeyFrameFound) {
+ pPin->UnpackPage(page);
+
+ CAutoPtr<OggPacket> p;
+ while (p = pPin->GetPacket()) {
+ if (p->bSyncPoint) {
+ fKeyFrameFound = true;
+ fSkipKeyFrame = p->fSkip;
+ }
+ }
+
+ if (fKeyFrameFound) {
+ break;
+ }
+ } else {
+ pPin->UnpackPage(page);
+
+ CAutoPtr<OggPacket> p;
+ while (p = pPin->GetPacket()) {
+ if (!p->fSkip) {
+ fSkipKeyFrame = false;
+ break;
+ }
+ }
+ }
+ }
+
+ if (!(fKeyFrameFound && !fSkipKeyFrame)) {
+ endpos = startpos;
+ startpos = max(startpos - 10 * 65536, 0);
+ }
+
+ m_pFile->Seek(startpos);
+ }
#ifdef _DEBUG
- // verify kf
+ // verify kf
- {
- fKeyFrameFound = false;
+ {
+ fKeyFrameFound = false;
- OggPage page;
- while (!fKeyFrameFound && m_pFile->Read(page)) {
- if (page.m_hdr.granule_position == -1) {
- continue;
- }
+ OggPage page;
+ while (!fKeyFrameFound && m_pFile->Read(page)) {
+ if (page.m_hdr.granule_position == -1) {
+ continue;
+ }
- if (pPin != dynamic_cast<COggSplitterOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number))) {
- continue;
- }
+ if (pPin != dynamic_cast<COggSplitterOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number))) {
+ continue;
+ }
- REFERENCE_TIME rtPos = pPin->GetRefTime(page.m_hdr.granule_position);
- if (rtPos > rt) {
- break;
- }
+ REFERENCE_TIME rtPos = pPin->GetRefTime(page.m_hdr.granule_position);
+ if (rtPos > rt) {
+ break;
+ }
- pPin->UnpackPage(page);
+ pPin->UnpackPage(page);
- CAutoPtr<OggPacket> p;
- while (p = pPin->GetPacket()) {
- if (p->bSyncPoint) {
- fKeyFrameFound = true;
- break;
- }
- }
- }
+ CAutoPtr<OggPacket> p;
+ while (p = pPin->GetPacket()) {
+ if (p->bSyncPoint) {
+ fKeyFrameFound = true;
+ break;
+ }
+ }
+ }
- ASSERT(fKeyFrameFound);
+ ASSERT(fKeyFrameFound);
- m_pFile->Seek(startpos);
- }
+ m_pFile->Seek(startpos);
+ }
#endif
- break;
- }
- }
+ break;
+ }
+ }
}
bool COggSplitterFilter::DemuxLoop()
{
- HRESULT hr = S_OK;
-
- OggPage page;
- while (SUCCEEDED(hr) && !CheckRequest(NULL) && m_pFile->Read(page, true, GetRequestHandle())) {
- COggSplitterOutputPin* pOggPin = dynamic_cast<COggSplitterOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number));
- if (!pOggPin) {
- ASSERT(0);
- continue;
- }
- if (!pOggPin->IsConnected()) {
- continue;
- }
- if (FAILED(hr = pOggPin->UnpackPage(page))) {
- ASSERT(0);
- break;
- }
- CAutoPtr<OggPacket> p;
- while (!CheckRequest(NULL) && SUCCEEDED(hr) && (p = pOggPin->GetPacket())) {
- if (!p->fSkip) {
- hr = DeliverPacket(p);
- }
- }
- }
-
- return true;
+ HRESULT hr = S_OK;
+
+ OggPage page;
+ while (SUCCEEDED(hr) && !CheckRequest(NULL) && m_pFile->Read(page, true, GetRequestHandle())) {
+ COggSplitterOutputPin* pOggPin = dynamic_cast<COggSplitterOutputPin*>(GetOutputPin(page.m_hdr.bitstream_serial_number));
+ if (!pOggPin) {
+ ASSERT(0);
+ continue;
+ }
+ if (!pOggPin->IsConnected()) {
+ continue;
+ }
+ if (FAILED(hr = pOggPin->UnpackPage(page))) {
+ ASSERT(0);
+ break;
+ }
+ CAutoPtr<OggPacket> p;
+ while (!CheckRequest(NULL) && SUCCEEDED(hr) && (p = pOggPin->GetPacket())) {
+ if (!p->fSkip) {
+ hr = DeliverPacket(p);
+ }
+ }
+ }
+
+ return true;
}
//
@@ -586,10 +586,10 @@ bool COggSplitterFilter::DemuxLoop()
//
COggSourceFilter::COggSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : COggSplitterFilter(pUnk, phr)
+ : COggSplitterFilter(pUnk, phr)
{
- m_clsid = __uuidof(this);
- m_pInput.Free();
+ m_clsid = __uuidof(this);
+ m_pInput.Free();
}
//
@@ -597,187 +597,187 @@ COggSourceFilter::COggSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
//
COggSplitterOutputPin::COggSplitterOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBaseSplitterOutputPin(pName, pFilter, pLock, phr)
+ : CBaseSplitterOutputPin(pName, pFilter, pLock, phr)
{
- ResetState((DWORD)-1);
+ ResetState((DWORD) - 1);
}
void COggSplitterOutputPin::AddComment(BYTE* p, int len)
{
- bitstream bs(p, len);
- bs.getbits(bs.getbits(32)*8);
- for (int n = bs.getbits(32); n-- > 0; ) {
- CStringA str;
- for (int len = bs.getbits(32); len-- > 0; ) {
- str += (CHAR)bs.getbits(8);
- }
-
- CAtlList<CStringA> sl;
- Explode(str, sl, '=', 2);
- if (sl.GetCount() == 2) {
- CAutoPtr<CComment> p(DNew CComment(UTF8To16(sl.GetHead()), UTF8To16(sl.GetTail())));
-
- if (p->m_key == L"LANGUAGE") {
- CString lang = ISO6392ToLanguage(sl.GetTail()), iso6392 = LanguageToISO6392(CString(p->m_value));
-
- if (p->m_value.GetLength() == 3 && !lang.IsEmpty()) {
- SetName(CStringW(lang));
- SetProperty(L"LANG", p->m_value);
- } else if (!iso6392.IsEmpty()) {
- SetName(p->m_value);
- SetProperty(L"LANG", CStringW(iso6392));
- } else {
- SetName(p->m_value);
- SetProperty(L"NAME", p->m_value);
- }
- }
-
- m_pComments.AddTail(p);
- }
- }
- ASSERT(bs.getbits(1) == 1);
+ bitstream bs(p, len);
+ bs.getbits(bs.getbits(32) * 8);
+ for (int n = bs.getbits(32); n-- > 0;) {
+ CStringA str;
+ for (int len = bs.getbits(32); len-- > 0;) {
+ str += (CHAR)bs.getbits(8);
+ }
+
+ CAtlList<CStringA> sl;
+ Explode(str, sl, '=', 2);
+ if (sl.GetCount() == 2) {
+ CAutoPtr<CComment> p(DNew CComment(UTF8To16(sl.GetHead()), UTF8To16(sl.GetTail())));
+
+ if (p->m_key == L"LANGUAGE") {
+ CString lang = ISO6392ToLanguage(sl.GetTail()), iso6392 = LanguageToISO6392(CString(p->m_value));
+
+ if (p->m_value.GetLength() == 3 && !lang.IsEmpty()) {
+ SetName(CStringW(lang));
+ SetProperty(L"LANG", p->m_value);
+ } else if (!iso6392.IsEmpty()) {
+ SetName(p->m_value);
+ SetProperty(L"LANG", CStringW(iso6392));
+ } else {
+ SetName(p->m_value);
+ SetProperty(L"NAME", p->m_value);
+ }
+ }
+
+ m_pComments.AddTail(p);
+ }
+ }
+ ASSERT(bs.getbits(1) == 1);
}
CStringW COggSplitterOutputPin::GetComment(CStringW key)
{
- key.MakeUpper();
- CAtlList<CStringW> sl;
- POSITION pos = m_pComments.GetHeadPosition();
- while (pos) {
- CComment* p = m_pComments.GetNext(pos);
- if (key == p->m_key) {
- sl.AddTail(p->m_value);
- }
- }
- return Implode(sl, ';');
+ key.MakeUpper();
+ CAtlList<CStringW> sl;
+ POSITION pos = m_pComments.GetHeadPosition();
+ while (pos) {
+ CComment* p = m_pComments.GetNext(pos);
+ if (key == p->m_key) {
+ sl.AddTail(p->m_value);
+ }
+ }
+ return Implode(sl, ';');
}
void COggSplitterOutputPin::ResetState(DWORD seqnum)
{
- CAutoLock csAutoLock(&m_csPackets);
- m_packets.RemoveAll();
- m_lastpacket.Free();
- m_lastseqnum = seqnum;
- m_rtLast = 0;
- m_fSkip = true;
+ CAutoLock csAutoLock(&m_csPackets);
+ m_packets.RemoveAll();
+ m_lastpacket.Free();
+ m_lastseqnum = seqnum;
+ m_rtLast = 0;
+ m_fSkip = true;
}
HRESULT COggSplitterOutputPin::UnpackPage(OggPage& page)
{
- if (m_lastseqnum != page.m_hdr.page_sequence_number - 1) {
- ResetState(page.m_hdr.page_sequence_number);
- return S_FALSE; // FIXME
- } else {
- m_lastseqnum = page.m_hdr.page_sequence_number;
- }
-
- POSITION first = page.m_lens.GetHeadPosition();
- while (first && page.m_lens.GetAt(first) == 255) {
- page.m_lens.GetNext(first);
- }
- if (!first) {
- first = page.m_lens.GetTailPosition();
- }
-
- POSITION last = page.m_lens.GetTailPosition();
- while (last && page.m_lens.GetAt(last) == 255) {
- page.m_lens.GetPrev(last);
- }
- if (!last) {
- last = page.m_lens.GetTailPosition();
- }
-
- BYTE* pData = page.GetData();
-
- int i = 0, j = 0, len = 0;
-
- for (POSITION pos = page.m_lens.GetHeadPosition(); pos; page.m_lens.GetNext(pos)) {
- len = page.m_lens.GetAt(pos);
- j += len;
-
- if (len < 255 || pos == page.m_lens.GetTailPosition()) {
- if (first == pos && (page.m_hdr.header_type_flag & OggPageHeader::continued)) {
- // ASSERT(m_lastpacket);
-
- if (m_lastpacket) {
- int size = m_lastpacket->GetCount();
- m_lastpacket->SetCount(size + j-i);
- memcpy(m_lastpacket->GetData() + size, pData + i, j-i);
-
- CAutoLock csAutoLock(&m_csPackets);
-
- if (len < 255) {
- m_packets.AddTail(m_lastpacket);
- }
- }
- } else {
- CAutoPtr<OggPacket> p(DNew OggPacket());
-
- if (last == pos && page.m_hdr.granule_position != -1) {
- p->bDiscontinuity = m_fSkip;
- REFERENCE_TIME rtLast = m_rtLast;
- m_rtLast = GetRefTime(page.m_hdr.granule_position);
- // some bad encodings have a +/-1 frame difference from the normal timeline,
- // but these seem to cancel eachother out nicely so we can just ignore them
- // to make it play a bit more smooth.
- if (abs(rtLast - m_rtLast) == GetRefTime(1)) {
- m_rtLast = rtLast; // FIXME
- }
- m_fSkip = false;
- }
-
- p->TrackNumber = page.m_hdr.bitstream_serial_number;
-
- if (S_OK == UnpackPacket(p, pData + i, j-i)) {
- //if (p->TrackNumber == 1)
- //TRACE(_T("[%d]: %d, %I64d -> %I64d (skip=%d, disc=%d, sync=%d)\n"),
- // (int)p->TrackNumber, p->GetCount(), p->rtStart, p->rtStop,
- // (int)m_fSkip, (int)p->bDiscontinuity, (int)p->bSyncPoint);
-
- if (p->rtStart <= p->rtStop && p->rtStop <= p->rtStart + 10000000i64*60) {
- CAutoLock csAutoLock(&m_csPackets);
-
- m_rtLast = p->rtStop;
- p->fSkip = m_fSkip;
-
- if (len < 255) {
- m_packets.AddTail(p);
- } else {
- m_lastpacket = p;
- }
- } else {
- ASSERT(0);
- }
- }
- }
-
- i = j;
- }
- }
-
- return S_OK;
+ if (m_lastseqnum != page.m_hdr.page_sequence_number - 1) {
+ ResetState(page.m_hdr.page_sequence_number);
+ return S_FALSE; // FIXME
+ } else {
+ m_lastseqnum = page.m_hdr.page_sequence_number;
+ }
+
+ POSITION first = page.m_lens.GetHeadPosition();
+ while (first && page.m_lens.GetAt(first) == 255) {
+ page.m_lens.GetNext(first);
+ }
+ if (!first) {
+ first = page.m_lens.GetTailPosition();
+ }
+
+ POSITION last = page.m_lens.GetTailPosition();
+ while (last && page.m_lens.GetAt(last) == 255) {
+ page.m_lens.GetPrev(last);
+ }
+ if (!last) {
+ last = page.m_lens.GetTailPosition();
+ }
+
+ BYTE* pData = page.GetData();
+
+ int i = 0, j = 0, len = 0;
+
+ for (POSITION pos = page.m_lens.GetHeadPosition(); pos; page.m_lens.GetNext(pos)) {
+ len = page.m_lens.GetAt(pos);
+ j += len;
+
+ if (len < 255 || pos == page.m_lens.GetTailPosition()) {
+ if (first == pos && (page.m_hdr.header_type_flag & OggPageHeader::continued)) {
+ // ASSERT(m_lastpacket);
+
+ if (m_lastpacket) {
+ int size = m_lastpacket->GetCount();
+ m_lastpacket->SetCount(size + j - i);
+ memcpy(m_lastpacket->GetData() + size, pData + i, j - i);
+
+ CAutoLock csAutoLock(&m_csPackets);
+
+ if (len < 255) {
+ m_packets.AddTail(m_lastpacket);
+ }
+ }
+ } else {
+ CAutoPtr<OggPacket> p(DNew OggPacket());
+
+ if (last == pos && page.m_hdr.granule_position != -1) {
+ p->bDiscontinuity = m_fSkip;
+ REFERENCE_TIME rtLast = m_rtLast;
+ m_rtLast = GetRefTime(page.m_hdr.granule_position);
+ // some bad encodings have a +/-1 frame difference from the normal timeline,
+ // but these seem to cancel eachother out nicely so we can just ignore them
+ // to make it play a bit more smooth.
+ if (abs(rtLast - m_rtLast) == GetRefTime(1)) {
+ m_rtLast = rtLast; // FIXME
+ }
+ m_fSkip = false;
+ }
+
+ p->TrackNumber = page.m_hdr.bitstream_serial_number;
+
+ if (S_OK == UnpackPacket(p, pData + i, j - i)) {
+ //if (p->TrackNumber == 1)
+ //TRACE(_T("[%d]: %d, %I64d -> %I64d (skip=%d, disc=%d, sync=%d)\n"),
+ // (int)p->TrackNumber, p->GetCount(), p->rtStart, p->rtStop,
+ // (int)m_fSkip, (int)p->bDiscontinuity, (int)p->bSyncPoint);
+
+ if (p->rtStart <= p->rtStop && p->rtStop <= p->rtStart + 10000000i64 * 60) {
+ CAutoLock csAutoLock(&m_csPackets);
+
+ m_rtLast = p->rtStop;
+ p->fSkip = m_fSkip;
+
+ if (len < 255) {
+ m_packets.AddTail(p);
+ } else {
+ m_lastpacket = p;
+ }
+ } else {
+ ASSERT(0);
+ }
+ }
+ }
+
+ i = j;
+ }
+ }
+
+ return S_OK;
}
CAutoPtr<OggPacket> COggSplitterOutputPin::GetPacket()
{
- CAutoPtr<OggPacket> p;
- CAutoLock csAutoLock(&m_csPackets);
- if (m_packets.GetCount()) {
- p = m_packets.RemoveHead();
- }
- return p;
+ CAutoPtr<OggPacket> p;
+ CAutoLock csAutoLock(&m_csPackets);
+ if (m_packets.GetCount()) {
+ p = m_packets.RemoveHead();
+ }
+ return p;
}
HRESULT COggSplitterOutputPin::DeliverEndFlush()
{
- ResetState();
- return __super::DeliverEndFlush();
+ ResetState();
+ return __super::DeliverEndFlush();
}
HRESULT COggSplitterOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- ResetState();
- return __super::DeliverNewSegment(tStart, tStop, dRate);
+ ResetState();
+ return __super::DeliverNewSegment(tStart, tStop, dRate);
}
//
@@ -785,149 +785,149 @@ HRESULT COggSplitterOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENC
//
COggVorbisOutputPin::COggVorbisOutputPin(OggVorbisIdHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : COggSplitterOutputPin(pName, pFilter, pLock, phr)
+ : COggSplitterOutputPin(pName, pFilter, pLock, phr)
{
- m_audio_sample_rate = h->audio_sample_rate;
- m_blocksize[0] = 1<<h->blocksize_0;
- m_blocksize[1] = 1<<h->blocksize_1;
- m_lastblocksize = 0;
-
- CMediaType mt;
-
- mt.InitMediaType();
- mt.majortype = MEDIATYPE_Audio;
- mt.subtype = MEDIASUBTYPE_Vorbis;
- mt.formattype = FORMAT_VorbisFormat;
- VORBISFORMAT* vf = (VORBISFORMAT*)mt.AllocFormatBuffer(sizeof(VORBISFORMAT));
- memset(mt.Format(), 0, mt.FormatLength());
- vf->nChannels = h->audio_channels;
- vf->nSamplesPerSec = h->audio_sample_rate;
- vf->nAvgBitsPerSec = h->bitrate_nominal;
- vf->nMinBitsPerSec = h->bitrate_minimum;
- vf->nMaxBitsPerSec = h->bitrate_maximum;
- vf->fQuality = -1;
- mt.SetSampleSize(8192);
- m_mts.Add(mt);
-
- mt.InitMediaType();
- mt.majortype = MEDIATYPE_Audio;
- mt.subtype = MEDIASUBTYPE_Vorbis2;
- mt.formattype = FORMAT_VorbisFormat2;
- VORBISFORMAT2* vf2 = (VORBISFORMAT2*)mt.AllocFormatBuffer(sizeof(VORBISFORMAT2));
- memset(mt.Format(), 0, mt.FormatLength());
- vf2->Channels = h->audio_channels;
- vf2->SamplesPerSec = h->audio_sample_rate;
- mt.SetSampleSize(8192);
- m_mts.InsertAt(0, mt);
+ m_audio_sample_rate = h->audio_sample_rate;
+ m_blocksize[0] = 1 << h->blocksize_0;
+ m_blocksize[1] = 1 << h->blocksize_1;
+ m_lastblocksize = 0;
+
+ CMediaType mt;
+
+ mt.InitMediaType();
+ mt.majortype = MEDIATYPE_Audio;
+ mt.subtype = MEDIASUBTYPE_Vorbis;
+ mt.formattype = FORMAT_VorbisFormat;
+ VORBISFORMAT* vf = (VORBISFORMAT*)mt.AllocFormatBuffer(sizeof(VORBISFORMAT));
+ memset(mt.Format(), 0, mt.FormatLength());
+ vf->nChannels = h->audio_channels;
+ vf->nSamplesPerSec = h->audio_sample_rate;
+ vf->nAvgBitsPerSec = h->bitrate_nominal;
+ vf->nMinBitsPerSec = h->bitrate_minimum;
+ vf->nMaxBitsPerSec = h->bitrate_maximum;
+ vf->fQuality = -1;
+ mt.SetSampleSize(8192);
+ m_mts.Add(mt);
+
+ mt.InitMediaType();
+ mt.majortype = MEDIATYPE_Audio;
+ mt.subtype = MEDIASUBTYPE_Vorbis2;
+ mt.formattype = FORMAT_VorbisFormat2;
+ VORBISFORMAT2* vf2 = (VORBISFORMAT2*)mt.AllocFormatBuffer(sizeof(VORBISFORMAT2));
+ memset(mt.Format(), 0, mt.FormatLength());
+ vf2->Channels = h->audio_channels;
+ vf2->SamplesPerSec = h->audio_sample_rate;
+ mt.SetSampleSize(8192);
+ m_mts.InsertAt(0, mt);
}
HRESULT COggVorbisOutputPin::UnpackInitPage(OggPage& page)
{
- HRESULT hr = __super::UnpackPage(page);
-
- while (m_packets.GetCount()) {
- Packet* p = m_packets.GetHead();
-
- if (p->GetCount() >= 6 && p->GetAt(0) == 0x05) {
- // yeah, right, we are going to be parsing this backwards! :P
- bitstream bs(p->GetData(), p->GetCount(), true);
- while (bs.hasbits(-1) && bs.getbits(-1) != 1) {
- ;
- }
- for (int cnt = 0; bs.hasbits(-8-16-16-1-6); cnt++) {
- unsigned int modes = bs.showbits(-6) + 1;
-
- unsigned int mapping = bs.getbits(-8);
- unsigned int transformtype = bs.getbits(-16);
- unsigned int windowtype = bs.getbits(-16);
- unsigned int blockflag = bs.getbits(-1);
- UNREFERENCED_PARAMETER(mapping);
-
- if (transformtype != 0 || windowtype != 0) {
- ASSERT(modes == cnt);
- UNREFERENCED_PARAMETER(modes);
- break;
- }
-
- m_blockflags.InsertAt(0, !!blockflag);
- }
- }
-
- int cnt = m_initpackets.GetCount();
- if (cnt <= 3 && (p->GetCount() >= 6 && p->GetAt(0) == 1+cnt*2)) {
- VORBISFORMAT2* vf2 = (VORBISFORMAT2*)m_mts[0].Format();
- vf2->HeaderSize[cnt] = p->GetCount();
- int len = m_mts[0].FormatLength();
- memcpy(m_mts[0].ReallocFormatBuffer(len + p->GetCount()) + len, p->GetData(), p->GetCount());
- }
-
- m_initpackets.AddTail(m_packets.RemoveHead());
- }
-
- return hr;
+ HRESULT hr = __super::UnpackPage(page);
+
+ while (m_packets.GetCount()) {
+ Packet* p = m_packets.GetHead();
+
+ if (p->GetCount() >= 6 && p->GetAt(0) == 0x05) {
+ // yeah, right, we are going to be parsing this backwards! :P
+ bitstream bs(p->GetData(), p->GetCount(), true);
+ while (bs.hasbits(-1) && bs.getbits(-1) != 1) {
+ ;
+ }
+ for (int cnt = 0; bs.hasbits(-8 - 16 - 16 - 1 - 6); cnt++) {
+ unsigned int modes = bs.showbits(-6) + 1;
+
+ unsigned int mapping = bs.getbits(-8);
+ unsigned int transformtype = bs.getbits(-16);
+ unsigned int windowtype = bs.getbits(-16);
+ unsigned int blockflag = bs.getbits(-1);
+ UNREFERENCED_PARAMETER(mapping);
+
+ if (transformtype != 0 || windowtype != 0) {
+ ASSERT(modes == cnt);
+ UNREFERENCED_PARAMETER(modes);
+ break;
+ }
+
+ m_blockflags.InsertAt(0, !!blockflag);
+ }
+ }
+
+ int cnt = m_initpackets.GetCount();
+ if (cnt <= 3 && (p->GetCount() >= 6 && p->GetAt(0) == 1 + cnt * 2)) {
+ VORBISFORMAT2* vf2 = (VORBISFORMAT2*)m_mts[0].Format();
+ vf2->HeaderSize[cnt] = p->GetCount();
+ int len = m_mts[0].FormatLength();
+ memcpy(m_mts[0].ReallocFormatBuffer(len + p->GetCount()) + len, p->GetData(), p->GetCount());
+ }
+
+ m_initpackets.AddTail(m_packets.RemoveHead());
+ }
+
+ return hr;
}
REFERENCE_TIME COggVorbisOutputPin::GetRefTime(__int64 granule_position)
{
- REFERENCE_TIME rt = granule_position * 10000000 / m_audio_sample_rate;
- return rt;
+ REFERENCE_TIME rt = granule_position * 10000000 / m_audio_sample_rate;
+ return rt;
}
HRESULT COggVorbisOutputPin::UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len)
{
- if (len > 0 && m_blockflags.GetCount()) {
- bitstream bs(pData, len);
- if (bs.getbits(1) == 0) {
- int x = m_blockflags.GetCount()-1, n = 0;
- while (x) {
- n++;
- x >>= 1;
- }
- DWORD blocksize = m_blocksize[m_blockflags[bs.getbits(n)]?1:0];
- if (m_lastblocksize) {
- m_rtLast += GetRefTime((m_lastblocksize + blocksize) >> 2);
- }
- m_lastblocksize = blocksize;
- }
- }
-
- p->bSyncPoint = TRUE;
- p->rtStart = m_rtLast;
- p->rtStop = m_rtLast+1;
- p->SetData(pData, len);
-
- return S_OK;
+ if (len > 0 && m_blockflags.GetCount()) {
+ bitstream bs(pData, len);
+ if (bs.getbits(1) == 0) {
+ int x = m_blockflags.GetCount() - 1, n = 0;
+ while (x) {
+ n++;
+ x >>= 1;
+ }
+ DWORD blocksize = m_blocksize[m_blockflags[bs.getbits(n)] ? 1 : 0];
+ if (m_lastblocksize) {
+ m_rtLast += GetRefTime((m_lastblocksize + blocksize) >> 2);
+ }
+ m_lastblocksize = blocksize;
+ }
+ }
+
+ p->bSyncPoint = TRUE;
+ p->rtStart = m_rtLast;
+ p->rtStop = m_rtLast + 1;
+ p->SetData(pData, len);
+
+ return S_OK;
}
HRESULT COggVorbisOutputPin::DeliverPacket(CAutoPtr<OggPacket> p)
{
- if (p->GetCount() > 0 && (p->GetAt(0)&1)) {
- return S_OK;
- }
+ if (p->GetCount() > 0 && (p->GetAt(0) & 1)) {
+ return S_OK;
+ }
- return __super::DeliverPacket(p);
+ return __super::DeliverPacket(p);
}
HRESULT COggVorbisOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- HRESULT hr = __super::DeliverNewSegment(tStart, tStop, dRate);
-
- m_lastblocksize = 0;
-
- if (m_mt.subtype == MEDIASUBTYPE_Vorbis) {
- POSITION pos = m_initpackets.GetHeadPosition();
- while (pos) {
- Packet* pi = m_initpackets.GetNext(pos);
- CAutoPtr<OggPacket> p(DNew OggPacket());
- p->TrackNumber = pi->TrackNumber;
- p->bDiscontinuity = p->bSyncPoint = FALSE;//TRUE;
- p->rtStart = p->rtStop = 0;
- p->Copy(*pi);
- __super::DeliverPacket(p);
- }
- }
-
- return hr;
+ HRESULT hr = __super::DeliverNewSegment(tStart, tStop, dRate);
+
+ m_lastblocksize = 0;
+
+ if (m_mt.subtype == MEDIASUBTYPE_Vorbis) {
+ POSITION pos = m_initpackets.GetHeadPosition();
+ while (pos) {
+ Packet* pi = m_initpackets.GetNext(pos);
+ CAutoPtr<OggPacket> p(DNew OggPacket());
+ p->TrackNumber = pi->TrackNumber;
+ p->bDiscontinuity = p->bSyncPoint = FALSE;//TRUE;
+ p->rtStart = p->rtStop = 0;
+ p->Copy(*pi);
+ __super::DeliverPacket(p);
+ }
+ }
+
+ return hr;
}
//
@@ -935,156 +935,156 @@ HRESULT COggVorbisOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_
//
COggFlacOutputPin::COggFlacOutputPin(BYTE* h, int nCount, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : COggSplitterOutputPin(pName, pFilter, pLock, phr)
+ : COggSplitterOutputPin(pName, pFilter, pLock, phr)
{
- CGolombBuffer Buffer(h, nCount);
-
- Buffer.BitRead(1); // Last-metadata-block flag
-
- if (Buffer.BitRead(7) != 0) { // Should be a STREAMINFO block
- if (phr) {
- *phr = VFW_E_INVALID_FILE_FORMAT;
- }
- return;
- }
-
- Buffer.BitRead(24); // Length (in bytes) of metadata to follow
- Buffer.ReadShort(); // m_nMinBlocksize
- Buffer.ReadShort(); // m_nMaxBlocksize
- Buffer.BitRead(24); // m_nMinFrameSize
- Buffer.BitRead(24); // m_nMaxFrameSize
- m_nSamplesPerSec = (int)Buffer.BitRead(20);
- m_nChannels = (int)Buffer.BitRead(3) + 1;
- m_wBitsPerSample = (WORD)Buffer.BitRead(5) + 1;
- Buffer.BitRead(36); // m_i64TotalNumSamples
- m_nAvgBytesPerSec = (m_nChannels * (m_wBitsPerSample >> 3)) * m_nSamplesPerSec;
-
- CMediaType mt;
-
- mt.majortype = MEDIATYPE_Audio;
- mt.subtype = MEDIASUBTYPE_FLAC_FRAMED;
- mt.formattype = FORMAT_WaveFormatEx;
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX));
- memset(wfe, 0, sizeof(WAVEFORMATEX));
- wfe->cbSize = sizeof(WAVEFORMATEX);
- wfe->wFormatTag = WAVE_FORMAT_FLAC;
- wfe->nSamplesPerSec = m_nSamplesPerSec;
- wfe->nAvgBytesPerSec = m_nAvgBytesPerSec;
- wfe->nChannels = m_nChannels;
- wfe->nBlockAlign = 1;
- wfe->wBitsPerSample = m_wBitsPerSample;
-
- m_mts.InsertAt(0, mt);
- *phr = S_OK;
+ CGolombBuffer Buffer(h, nCount);
+
+ Buffer.BitRead(1); // Last-metadata-block flag
+
+ if (Buffer.BitRead(7) != 0) { // Should be a STREAMINFO block
+ if (phr) {
+ *phr = VFW_E_INVALID_FILE_FORMAT;
+ }
+ return;
+ }
+
+ Buffer.BitRead(24); // Length (in bytes) of metadata to follow
+ Buffer.ReadShort(); // m_nMinBlocksize
+ Buffer.ReadShort(); // m_nMaxBlocksize
+ Buffer.BitRead(24); // m_nMinFrameSize
+ Buffer.BitRead(24); // m_nMaxFrameSize
+ m_nSamplesPerSec = (int)Buffer.BitRead(20);
+ m_nChannels = (int)Buffer.BitRead(3) + 1;
+ m_wBitsPerSample = (WORD)Buffer.BitRead(5) + 1;
+ Buffer.BitRead(36); // m_i64TotalNumSamples
+ m_nAvgBytesPerSec = (m_nChannels * (m_wBitsPerSample >> 3)) * m_nSamplesPerSec;
+
+ CMediaType mt;
+
+ mt.majortype = MEDIATYPE_Audio;
+ mt.subtype = MEDIASUBTYPE_FLAC_FRAMED;
+ mt.formattype = FORMAT_WaveFormatEx;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX));
+ memset(wfe, 0, sizeof(WAVEFORMATEX));
+ wfe->cbSize = sizeof(WAVEFORMATEX);
+ wfe->wFormatTag = WAVE_FORMAT_FLAC;
+ wfe->nSamplesPerSec = m_nSamplesPerSec;
+ wfe->nAvgBytesPerSec = m_nAvgBytesPerSec;
+ wfe->nChannels = m_nChannels;
+ wfe->nBlockAlign = 1;
+ wfe->wBitsPerSample = m_wBitsPerSample;
+
+ m_mts.InsertAt(0, mt);
+ *phr = S_OK;
}
REFERENCE_TIME COggFlacOutputPin::GetRefTime(__int64 granule_position)
{
- REFERENCE_TIME rt = (granule_position * UNITS) / m_nSamplesPerSec;
- return rt;
+ REFERENCE_TIME rt = (granule_position * UNITS) / m_nSamplesPerSec;
+ return rt;
}
HRESULT COggFlacOutputPin::UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len)
{
- if (pData[0] != 0xFF || (pData[1] & 0xFE) != 0xF8) {
- return S_FALSE;
- }
+ if (pData[0] != 0xFF || (pData[1] & 0xFE) != 0xF8) {
+ return S_FALSE;
+ }
- p->bSyncPoint = TRUE;
- p->rtStart = m_rtLast;
- p->rtStop = m_rtLast+1; // TODO : find packet duration !
- p->SetData(pData, len);
+ p->bSyncPoint = TRUE;
+ p->rtStart = m_rtLast;
+ p->rtStop = m_rtLast + 1; // TODO : find packet duration !
+ p->SetData(pData, len);
- return S_OK;
+ return S_OK;
}
HRESULT COggFlacOutputPin::DeliverPacket(CAutoPtr<OggPacket> p)
{
- if (p->GetCount() > 0 && (p->GetAt(0)&1)) {
- return S_OK;
- }
+ if (p->GetCount() > 0 && (p->GetAt(0) & 1)) {
+ return S_OK;
+ }
- return __super::DeliverPacket(p);
+ return __super::DeliverPacket(p);
}
HRESULT COggFlacOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- HRESULT hr = __super::DeliverNewSegment(tStart, tStop, dRate);
-
- m_lastblocksize = 0;
-
- if (m_mt.subtype == MEDIASUBTYPE_FLAC_FRAMED) {
- POSITION pos = m_initpackets.GetHeadPosition();
- while (pos) {
- Packet* pi = m_initpackets.GetNext(pos);
- CAutoPtr<OggPacket> p(DNew OggPacket());
- p->TrackNumber = pi->TrackNumber;
- p->bDiscontinuity = p->bSyncPoint = FALSE;//TRUE;
- p->rtStart = p->rtStop = 0;
- p->Copy(*pi);
- __super::DeliverPacket(p);
- }
- }
-
- return hr;
+ HRESULT hr = __super::DeliverNewSegment(tStart, tStop, dRate);
+
+ m_lastblocksize = 0;
+
+ if (m_mt.subtype == MEDIASUBTYPE_FLAC_FRAMED) {
+ POSITION pos = m_initpackets.GetHeadPosition();
+ while (pos) {
+ Packet* pi = m_initpackets.GetNext(pos);
+ CAutoPtr<OggPacket> p(DNew OggPacket());
+ p->TrackNumber = pi->TrackNumber;
+ p->bDiscontinuity = p->bSyncPoint = FALSE;//TRUE;
+ p->rtStart = p->rtStop = 0;
+ p->Copy(*pi);
+ __super::DeliverPacket(p);
+ }
+ }
+
+ return hr;
}
//
// COggDirectShowOutputPin
//
COggDirectShowOutputPin::COggDirectShowOutputPin(AM_MEDIA_TYPE* pmt, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : COggSplitterOutputPin(pName, pFilter, pLock, phr)
+ : COggSplitterOutputPin(pName, pFilter, pLock, phr)
{
- CMediaType mt;
- memcpy((AM_MEDIA_TYPE*)&mt, pmt, FIELD_OFFSET(AM_MEDIA_TYPE, pUnk));
- mt.SetFormat((BYTE*)(pmt+1), pmt->cbFormat);
- mt.SetSampleSize(1);
- if (mt.majortype == MEDIATYPE_Video) { // TODO: find samples for audio and find out what to return in GetRefTime...
- m_mts.Add(mt);
- }
+ CMediaType mt;
+ memcpy((AM_MEDIA_TYPE*)&mt, pmt, FIELD_OFFSET(AM_MEDIA_TYPE, pUnk));
+ mt.SetFormat((BYTE*)(pmt + 1), pmt->cbFormat);
+ mt.SetSampleSize(1);
+ if (mt.majortype == MEDIATYPE_Video) { // TODO: find samples for audio and find out what to return in GetRefTime...
+ m_mts.Add(mt);
+ }
}
REFERENCE_TIME COggDirectShowOutputPin::GetRefTime(__int64 granule_position)
{
- REFERENCE_TIME rt = 0;
+ REFERENCE_TIME rt = 0;
- if (m_mt.majortype == MEDIATYPE_Video) {
- rt = granule_position * ((VIDEOINFOHEADER*)m_mt.Format())->AvgTimePerFrame;
- } else if (m_mt.majortype == MEDIATYPE_Audio) {
- rt = granule_position; // ((WAVEFORMATEX*)m_mt.Format())-> // TODO
- }
+ if (m_mt.majortype == MEDIATYPE_Video) {
+ rt = granule_position * ((VIDEOINFOHEADER*)m_mt.Format())->AvgTimePerFrame;
+ } else if (m_mt.majortype == MEDIATYPE_Audio) {
+ rt = granule_position; // ((WAVEFORMATEX*)m_mt.Format())-> // TODO
+ }
- return rt;
+ return rt;
}
HRESULT COggDirectShowOutputPin::UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len)
{
- int i = 0;
+ int i = 0;
- BYTE hdr = pData[i++];
+ BYTE hdr = pData[i++];
- if (!(hdr&1)) {
- // TODO: verify if this was still present in the old format (haven't found one sample yet)
- BYTE nLenBytes = (hdr>>6)|((hdr&2)<<1);
- __int64 Length = 0;
- for (int j = 0; j < nLenBytes; j++) {
- Length |= (__int64)pData[i++] << (j << 3);
- }
+ if (!(hdr & 1)) {
+ // TODO: verify if this was still present in the old format (haven't found one sample yet)
+ BYTE nLenBytes = (hdr >> 6) | ((hdr & 2) << 1);
+ __int64 Length = 0;
+ for (int j = 0; j < nLenBytes; j++) {
+ Length |= (__int64)pData[i++] << (j << 3);
+ }
- if (len < i) {
- ASSERT(0);
- return E_FAIL;
- }
+ if (len < i) {
+ ASSERT(0);
+ return E_FAIL;
+ }
- p->bSyncPoint = !!(hdr&8);
- p->rtStart = m_rtLast;
- p->rtStop = m_rtLast + (nLenBytes ? GetRefTime(Length) : GetRefTime(1));
- p->SetData(&pData[i], len - i);
+ p->bSyncPoint = !!(hdr & 8);
+ p->rtStart = m_rtLast;
+ p->rtStop = m_rtLast + (nLenBytes ? GetRefTime(Length) : GetRefTime(1));
+ p->SetData(&pData[i], len - i);
- return S_OK;
- }
+ return S_OK;
+ }
- return S_FALSE;
+ return S_FALSE;
}
//
@@ -1092,45 +1092,45 @@ HRESULT COggDirectShowOutputPin::UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pDat
//
COggStreamOutputPin::COggStreamOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : COggSplitterOutputPin(pName, pFilter, pLock, phr)
+ : COggSplitterOutputPin(pName, pFilter, pLock, phr)
{
- m_time_unit = h->time_unit;
- m_samples_per_unit = h->samples_per_unit;
- m_default_len = h->default_len;
+ m_time_unit = h->time_unit;
+ m_samples_per_unit = h->samples_per_unit;
+ m_default_len = h->default_len;
}
REFERENCE_TIME COggStreamOutputPin::GetRefTime(__int64 granule_position)
{
- return granule_position * m_time_unit / m_samples_per_unit;
+ return granule_position * m_time_unit / m_samples_per_unit;
}
HRESULT COggStreamOutputPin::UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len)
{
- int i = 0;
+ int i = 0;
- BYTE hdr = pData[i++];
+ BYTE hdr = pData[i++];
- if (!(hdr&1)) {
- BYTE nLenBytes = (hdr>>6)|((hdr&2)<<1);
- __int64 Length = 0;
- for (int j = 0; j < nLenBytes; j++) {
- Length |= (__int64)pData[i++] << (j << 3);
- }
+ if (!(hdr & 1)) {
+ BYTE nLenBytes = (hdr >> 6) | ((hdr & 2) << 1);
+ __int64 Length = 0;
+ for (int j = 0; j < nLenBytes; j++) {
+ Length |= (__int64)pData[i++] << (j << 3);
+ }
- if (len < i) {
- ASSERT(0);
- return E_FAIL;
- }
+ if (len < i) {
+ ASSERT(0);
+ return E_FAIL;
+ }
- p->bSyncPoint = !!(hdr&8);
- p->rtStart = m_rtLast;
- p->rtStop = m_rtLast + (nLenBytes ? GetRefTime(Length) : GetRefTime(m_default_len));
- p->SetData(&pData[i], len - i);
+ p->bSyncPoint = !!(hdr & 8);
+ p->rtStart = m_rtLast;
+ p->rtStop = m_rtLast + (nLenBytes ? GetRefTime(Length) : GetRefTime(m_default_len));
+ p->SetData(&pData[i], len - i);
- return S_OK;
- }
+ return S_OK;
+ }
- return S_FALSE;
+ return S_FALSE;
}
//
@@ -1138,44 +1138,44 @@ HRESULT COggStreamOutputPin::UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, i
//
COggVideoOutputPin::COggVideoOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : COggStreamOutputPin(h, pName, pFilter, pLock, phr)
+ : COggStreamOutputPin(h, pName, pFilter, pLock, phr)
{
- int extra = (int)h->size - sizeof(OggStreamHeader);
- extra = max(extra, 0);
-
- CMediaType mt;
- mt.majortype = MEDIATYPE_Video;
- mt.subtype = FOURCCMap(MAKEFOURCC(h->subtype[0],h->subtype[1],h->subtype[2],h->subtype[3]));
- mt.formattype = FORMAT_VideoInfo;
- VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + extra);
- memset(mt.Format(), 0, mt.FormatLength());
- memcpy(mt.Format() + sizeof(VIDEOINFOHEADER), h+1, extra);
- pvih->AvgTimePerFrame = h->time_unit / h->samples_per_unit;
- pvih->bmiHeader.biWidth = h->v.w;
- pvih->bmiHeader.biHeight = h->v.h;
- pvih->bmiHeader.biBitCount = (WORD)h->bps;
- pvih->bmiHeader.biCompression = mt.subtype.Data1;
- switch (pvih->bmiHeader.biCompression) {
- case BI_RGB:
- case BI_BITFIELDS:
- mt.subtype =
- pvih->bmiHeader.biBitCount == 1 ? MEDIASUBTYPE_RGB1 :
- pvih->bmiHeader.biBitCount == 4 ? MEDIASUBTYPE_RGB4 :
- pvih->bmiHeader.biBitCount == 8 ? MEDIASUBTYPE_RGB8 :
- pvih->bmiHeader.biBitCount == 16 ? MEDIASUBTYPE_RGB565 :
- pvih->bmiHeader.biBitCount == 24 ? MEDIASUBTYPE_RGB24 :
- pvih->bmiHeader.biBitCount == 32 ? MEDIASUBTYPE_RGB32 :
- MEDIASUBTYPE_NULL;
- break;
- case BI_RLE8:
- mt.subtype = MEDIASUBTYPE_RGB8;
- break;
- case BI_RLE4:
- mt.subtype = MEDIASUBTYPE_RGB4;
- break;
- }
- mt.SetSampleSize(max(h->buffersize, 1));
- m_mts.Add(mt);
+ int extra = (int)h->size - sizeof(OggStreamHeader);
+ extra = max(extra, 0);
+
+ CMediaType mt;
+ mt.majortype = MEDIATYPE_Video;
+ mt.subtype = FOURCCMap(MAKEFOURCC(h->subtype[0], h->subtype[1], h->subtype[2], h->subtype[3]));
+ mt.formattype = FORMAT_VideoInfo;
+ VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + extra);
+ memset(mt.Format(), 0, mt.FormatLength());
+ memcpy(mt.Format() + sizeof(VIDEOINFOHEADER), h + 1, extra);
+ pvih->AvgTimePerFrame = h->time_unit / h->samples_per_unit;
+ pvih->bmiHeader.biWidth = h->v.w;
+ pvih->bmiHeader.biHeight = h->v.h;
+ pvih->bmiHeader.biBitCount = (WORD)h->bps;
+ pvih->bmiHeader.biCompression = mt.subtype.Data1;
+ switch (pvih->bmiHeader.biCompression) {
+ case BI_RGB:
+ case BI_BITFIELDS:
+ mt.subtype =
+ pvih->bmiHeader.biBitCount == 1 ? MEDIASUBTYPE_RGB1 :
+ pvih->bmiHeader.biBitCount == 4 ? MEDIASUBTYPE_RGB4 :
+ pvih->bmiHeader.biBitCount == 8 ? MEDIASUBTYPE_RGB8 :
+ pvih->bmiHeader.biBitCount == 16 ? MEDIASUBTYPE_RGB565 :
+ pvih->bmiHeader.biBitCount == 24 ? MEDIASUBTYPE_RGB24 :
+ pvih->bmiHeader.biBitCount == 32 ? MEDIASUBTYPE_RGB32 :
+ MEDIASUBTYPE_NULL;
+ break;
+ case BI_RLE8:
+ mt.subtype = MEDIASUBTYPE_RGB8;
+ break;
+ case BI_RLE4:
+ mt.subtype = MEDIASUBTYPE_RGB4;
+ break;
+ }
+ mt.SetSampleSize(max(h->buffersize, 1));
+ m_mts.Add(mt);
}
//
@@ -1183,27 +1183,27 @@ COggVideoOutputPin::COggVideoOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseF
//
COggAudioOutputPin::COggAudioOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : COggStreamOutputPin(h, pName, pFilter, pLock, phr)
+ : COggStreamOutputPin(h, pName, pFilter, pLock, phr)
{
- int extra = (int)h->size - sizeof(OggStreamHeader);
- extra = max(extra, 0);
-
- CMediaType mt;
- mt.majortype = MEDIATYPE_Audio;
- mt.subtype = FOURCCMap(strtol(CStringA(h->subtype, 4), NULL, 16));
- mt.formattype = FORMAT_WaveFormatEx;
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX) + extra);
- memset(mt.Format(), 0, mt.FormatLength());
- memcpy(mt.Format() + sizeof(WAVEFORMATEX), h+1, extra);
- wfe->cbSize = extra;
- wfe->wFormatTag = (WORD)mt.subtype.Data1;
- wfe->nChannels = h->a.nChannels;
- wfe->nSamplesPerSec = (DWORD)(10000000i64 * h->samples_per_unit / h->time_unit);
- wfe->wBitsPerSample = (WORD)h->bps;
- wfe->nAvgBytesPerSec = h->a.nAvgBytesPerSec; // TODO: verify for PCM
- wfe->nBlockAlign = h->a.nBlockAlign; // TODO: verify for PCM
- mt.SetSampleSize(max(h->buffersize, 1));
- m_mts.Add(mt);
+ int extra = (int)h->size - sizeof(OggStreamHeader);
+ extra = max(extra, 0);
+
+ CMediaType mt;
+ mt.majortype = MEDIATYPE_Audio;
+ mt.subtype = FOURCCMap(strtol(CStringA(h->subtype, 4), NULL, 16));
+ mt.formattype = FORMAT_WaveFormatEx;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX) + extra);
+ memset(mt.Format(), 0, mt.FormatLength());
+ memcpy(mt.Format() + sizeof(WAVEFORMATEX), h + 1, extra);
+ wfe->cbSize = extra;
+ wfe->wFormatTag = (WORD)mt.subtype.Data1;
+ wfe->nChannels = h->a.nChannels;
+ wfe->nSamplesPerSec = (DWORD)(10000000i64 * h->samples_per_unit / h->time_unit);
+ wfe->wBitsPerSample = (WORD)h->bps;
+ wfe->nAvgBytesPerSec = h->a.nAvgBytesPerSec; // TODO: verify for PCM
+ wfe->nBlockAlign = h->a.nBlockAlign; // TODO: verify for PCM
+ mt.SetSampleSize(max(h->buffersize, 1));
+ m_mts.Add(mt);
}
//
@@ -1211,108 +1211,108 @@ COggAudioOutputPin::COggAudioOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseF
//
COggTextOutputPin::COggTextOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : COggStreamOutputPin(h, pName, pFilter, pLock, phr)
+ : COggStreamOutputPin(h, pName, pFilter, pLock, phr)
{
- CMediaType mt;
- mt.majortype = MEDIATYPE_Text;
- mt.subtype = MEDIASUBTYPE_NULL;
- mt.formattype = FORMAT_None;
- mt.SetSampleSize(1);
- m_mts.Add(mt);
+ CMediaType mt;
+ mt.majortype = MEDIATYPE_Text;
+ mt.subtype = MEDIASUBTYPE_NULL;
+ mt.formattype = FORMAT_None;
+ mt.SetSampleSize(1);
+ m_mts.Add(mt);
}
// COggTheoraOutputPin
COggTheoraOutputPin::COggTheoraOutputPin(BYTE* p, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : COggSplitterOutputPin(pName, pFilter, pLock, phr)
+ : COggSplitterOutputPin(pName, pFilter, pLock, phr)
{
- CMediaType mt;
- mt.majortype = MEDIATYPE_Video;
- mt.subtype = FOURCCMap('OEHT');
- mt.formattype = FORMAT_MPEG2_VIDEO;
- MPEG2VIDEOINFO* vih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(sizeof(MPEG2VIDEOINFO));
- memset(mt.Format(), 0, mt.FormatLength());
- vih->hdr.bmiHeader.biSize = sizeof(vih->hdr.bmiHeader);
- vih->hdr.bmiHeader.biWidth = *(WORD*)&p[10] >> 4;
- vih->hdr.bmiHeader.biHeight = *(WORD*)&p[12] >> 4;
- vih->hdr.bmiHeader.biCompression = 'OEHT';
- vih->hdr.bmiHeader.biPlanes = 1;
- vih->hdr.bmiHeader.biBitCount = 24;
- m_nFpsNum = (p[22]<<24)|(p[23]<<16)|(p[24]<<8)|p[25];
- m_nFpsDenum = (p[26]<<24)|(p[27]<<16)|(p[28]<<8)|p[29];
- if (m_nFpsNum) {
- m_rtAvgTimePerFrame = (REFERENCE_TIME)(10000000.0 * m_nFpsDenum / m_nFpsNum);
- vih->hdr.AvgTimePerFrame = m_rtAvgTimePerFrame;
- }
- vih->hdr.dwPictAspectRatioX = (p[14]<<16)|(p[15]<<8)|p[16];
- vih->hdr.dwPictAspectRatioY = (p[17]<<16)|(p[18]<<8)|p[19];
-
- m_KfgShift = (((p[40]<<8)+p[41]) &0x3E0) >> 5;
- m_nIndexOffset = TH_VERSION_CHECK(p[7],p[8],p[9],3,2,1);
-
- if (m_KfgShift == 0) {
- m_KfgShift = 6; // Is it really default value ?
- }
-
- mt.bFixedSizeSamples = 0;
- m_mts.Add(mt);
+ CMediaType mt;
+ mt.majortype = MEDIATYPE_Video;
+ mt.subtype = FOURCCMap('OEHT');
+ mt.formattype = FORMAT_MPEG2_VIDEO;
+ MPEG2VIDEOINFO* vih = (MPEG2VIDEOINFO*)mt.AllocFormatBuffer(sizeof(MPEG2VIDEOINFO));
+ memset(mt.Format(), 0, mt.FormatLength());
+ vih->hdr.bmiHeader.biSize = sizeof(vih->hdr.bmiHeader);
+ vih->hdr.bmiHeader.biWidth = *(WORD*)&p[10] >> 4;
+ vih->hdr.bmiHeader.biHeight = *(WORD*)&p[12] >> 4;
+ vih->hdr.bmiHeader.biCompression = 'OEHT';
+ vih->hdr.bmiHeader.biPlanes = 1;
+ vih->hdr.bmiHeader.biBitCount = 24;
+ m_nFpsNum = (p[22] << 24) | (p[23] << 16) | (p[24] << 8) | p[25];
+ m_nFpsDenum = (p[26] << 24) | (p[27] << 16) | (p[28] << 8) | p[29];
+ if (m_nFpsNum) {
+ m_rtAvgTimePerFrame = (REFERENCE_TIME)(10000000.0 * m_nFpsDenum / m_nFpsNum);
+ vih->hdr.AvgTimePerFrame = m_rtAvgTimePerFrame;
+ }
+ vih->hdr.dwPictAspectRatioX = (p[14] << 16) | (p[15] << 8) | p[16];
+ vih->hdr.dwPictAspectRatioY = (p[17] << 16) | (p[18] << 8) | p[19];
+
+ m_KfgShift = (((p[40] << 8) + p[41]) & 0x3E0) >> 5;
+ m_nIndexOffset = TH_VERSION_CHECK(p[7], p[8], p[9], 3, 2, 1);
+
+ if (m_KfgShift == 0) {
+ m_KfgShift = 6; // Is it really default value ?
+ }
+
+ mt.bFixedSizeSamples = 0;
+ m_mts.Add(mt);
}
HRESULT COggTheoraOutputPin::UnpackInitPage(OggPage& page)
{
- HRESULT hr = __super::UnpackPage(page);
-
- while (m_packets.GetCount()) {
- Packet* p = m_packets.GetHead();
-
- CMediaType& mt = m_mts[0];
- int size = p->GetCount();
- ASSERT(size <= 0xffff);
- MPEG2VIDEOINFO* vih = (MPEG2VIDEOINFO*)mt.ReallocFormatBuffer(
- FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) +
- ((MPEG2VIDEOINFO*)mt.Format())->cbSequenceHeader +
- 2 + size);
- *(WORD*)((BYTE*)vih->dwSequenceHeader + vih->cbSequenceHeader) = (size>>8)|(size<<8);
- memcpy((BYTE*)vih->dwSequenceHeader + vih->cbSequenceHeader + 2, p->GetData(), size);
- vih->cbSequenceHeader += 2 + size;
-
- m_initpackets.AddTail(m_packets.RemoveHead());
- }
-
- return hr;
+ HRESULT hr = __super::UnpackPage(page);
+
+ while (m_packets.GetCount()) {
+ Packet* p = m_packets.GetHead();
+
+ CMediaType& mt = m_mts[0];
+ int size = p->GetCount();
+ ASSERT(size <= 0xffff);
+ MPEG2VIDEOINFO* vih = (MPEG2VIDEOINFO*)mt.ReallocFormatBuffer(
+ FIELD_OFFSET(MPEG2VIDEOINFO, dwSequenceHeader) +
+ ((MPEG2VIDEOINFO*)mt.Format())->cbSequenceHeader +
+ 2 + size);
+ *(WORD*)((BYTE*)vih->dwSequenceHeader + vih->cbSequenceHeader) = (size >> 8) | (size << 8);
+ memcpy((BYTE*)vih->dwSequenceHeader + vih->cbSequenceHeader + 2, p->GetData(), size);
+ vih->cbSequenceHeader += 2 + size;
+
+ m_initpackets.AddTail(m_packets.RemoveHead());
+ }
+
+ return hr;
}
REFERENCE_TIME COggTheoraOutputPin::GetRefTime(__int64 granule_position)
{
- LONGLONG iframe;
- LONGLONG pframe;
-
- iframe=granule_position>>m_KfgShift;
- pframe=granule_position-(iframe<<m_KfgShift);
- /*3.2.0 streams store the frame index in the granule position.
- 3.2.1 and later store the frame count.
- We return the index, so adjust the value if we have a 3.2.1 or later
- stream.*/
-
- REFERENCE_TIME rt = 0;
- rt = (iframe+pframe-m_nIndexOffset) * m_rtAvgTimePerFrame;
- return rt;
+ LONGLONG iframe;
+ LONGLONG pframe;
+
+ iframe = granule_position >> m_KfgShift;
+ pframe = granule_position - (iframe << m_KfgShift);
+ /*3.2.0 streams store the frame index in the granule position.
+ 3.2.1 and later store the frame count.
+ We return the index, so adjust the value if we have a 3.2.1 or later
+ stream.*/
+
+ REFERENCE_TIME rt = 0;
+ rt = (iframe + pframe - m_nIndexOffset) * m_rtAvgTimePerFrame;
+ return rt;
}
HRESULT COggTheoraOutputPin::UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len)
{
- if (!pData) {
- return E_FAIL;
- }
+ if (!pData) {
+ return E_FAIL;
+ }
- p->bSyncPoint = len > 0 ? !(*pData & 0x40) : TRUE;
- p->rtStart = m_rtLast;
- p->rtStop = m_rtLast+1;
- p->SetData(pData, len);
+ p->bSyncPoint = len > 0 ? !(*pData & 0x40) : TRUE;
+ p->rtStart = m_rtLast;
+ p->rtStop = m_rtLast + 1;
+ p->SetData(pData, len);
- if (!(*pData & 0x80) && m_mt.majortype == MEDIATYPE_Video) {
- p->rtStop = p->rtStart + ((MPEG2VIDEOINFO*)m_mt.Format())->hdr.AvgTimePerFrame;
- }
+ if (!(*pData & 0x80) && m_mt.majortype == MEDIATYPE_Video) {
+ p->rtStop = p->rtStart + ((MPEG2VIDEOINFO*)m_mt.Format())->hdr.AvgTimePerFrame;
+ }
- return S_OK;
+ return S_OK;
}
diff --git a/src/filters/parser/OggSplitter/OggSplitter.h b/src/filters/parser/OggSplitter/OggSplitter.h
index b9f9b78c1..cd24cce82 100644
--- a/src/filters/parser/OggSplitter/OggSplitter.h
+++ b/src/filters/parser/OggSplitter/OggSplitter.h
@@ -34,183 +34,183 @@
class OggPacket : public Packet
{
public:
- OggPacket() {
- fSkip = false;
- }
- bool fSkip;
+ OggPacket() {
+ fSkip = false;
+ }
+ bool fSkip;
};
class COggSplitterOutputPin : public CBaseSplitterOutputPin
{
- class CComment
- {
- public:
- CStringW m_key, m_value;
- CComment(CStringW key, CStringW value) : m_key(key), m_value(value) {
- m_key.MakeUpper();
- }
- };
+ class CComment
+ {
+ public:
+ CStringW m_key, m_value;
+ CComment(CStringW key, CStringW value) : m_key(key), m_value(value) {
+ m_key.MakeUpper();
+ }
+ };
- CAutoPtrList<CComment> m_pComments;
+ CAutoPtrList<CComment> m_pComments;
protected:
- CCritSec m_csPackets;
- CAutoPtrList<OggPacket> m_packets;
- CAutoPtr<OggPacket> m_lastpacket;
- DWORD m_lastseqnum;
- REFERENCE_TIME m_rtLast;
- bool m_fSkip;
+ CCritSec m_csPackets;
+ CAutoPtrList<OggPacket> m_packets;
+ CAutoPtr<OggPacket> m_lastpacket;
+ DWORD m_lastseqnum;
+ REFERENCE_TIME m_rtLast;
+ bool m_fSkip;
- void ResetState(DWORD seqnum = -1);
+ void ResetState(DWORD seqnum = -1);
public:
- COggSplitterOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ COggSplitterOutputPin(LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- void AddComment(BYTE* p, int len);
- CStringW GetComment(CStringW key);
+ void AddComment(BYTE* p, int len);
+ CStringW GetComment(CStringW key);
- HRESULT UnpackPage(OggPage& page);
- virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len) = 0;
- virtual REFERENCE_TIME GetRefTime(__int64 granule_position) = 0;
- CAutoPtr<OggPacket> GetPacket();
+ HRESULT UnpackPage(OggPage& page);
+ virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len) = 0;
+ virtual REFERENCE_TIME GetRefTime(__int64 granule_position) = 0;
+ CAutoPtr<OggPacket> GetPacket();
- HRESULT DeliverEndFlush();
- HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT DeliverEndFlush();
+ HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
};
class COggVorbisOutputPin : public COggSplitterOutputPin
{
- CAutoPtrList<OggPacket> m_initpackets;
+ CAutoPtrList<OggPacket> m_initpackets;
- DWORD m_audio_sample_rate;
- DWORD m_blocksize[2], m_lastblocksize;
- CAtlArray<bool> m_blockflags;
+ DWORD m_audio_sample_rate;
+ DWORD m_blocksize[2], m_lastblocksize;
+ CAtlArray<bool> m_blockflags;
- virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
- virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
+ virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
+ virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
- HRESULT DeliverPacket(CAutoPtr<OggPacket> p);
- HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT DeliverPacket(CAutoPtr<OggPacket> p);
+ HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
public:
- COggVorbisOutputPin(OggVorbisIdHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ COggVorbisOutputPin(OggVorbisIdHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- HRESULT UnpackInitPage(OggPage& page);
- bool IsInitialized() {
- return m_initpackets.GetCount() >= 3;
- }
+ HRESULT UnpackInitPage(OggPage& page);
+ bool IsInitialized() {
+ return m_initpackets.GetCount() >= 3;
+ }
};
class COggFlacOutputPin : public COggSplitterOutputPin
{
- CAutoPtrList<OggPacket> m_initpackets;
+ CAutoPtrList<OggPacket> m_initpackets;
- int m_nSamplesPerSec;
- int m_nChannels;
- WORD m_wBitsPerSample;
- int m_nAvgBytesPerSec;
+ int m_nSamplesPerSec;
+ int m_nChannels;
+ WORD m_wBitsPerSample;
+ int m_nAvgBytesPerSec;
- DWORD m_blocksize[2], m_lastblocksize;
- CAtlArray<bool> m_blockflags;
+ DWORD m_blocksize[2], m_lastblocksize;
+ CAtlArray<bool> m_blockflags;
- virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
- virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
+ virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
+ virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
- HRESULT DeliverPacket(CAutoPtr<OggPacket> p);
- HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT DeliverPacket(CAutoPtr<OggPacket> p);
+ HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
public:
- COggFlacOutputPin(BYTE* h, int nCount, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ COggFlacOutputPin(BYTE* h, int nCount, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- bool IsInitialized() {
- return m_initpackets.GetCount() >= 3;
- }
+ bool IsInitialized() {
+ return m_initpackets.GetCount() >= 3;
+ }
};
class COggDirectShowOutputPin : public COggSplitterOutputPin
{
- virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
- virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
+ virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
+ virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
public:
- COggDirectShowOutputPin(AM_MEDIA_TYPE* pmt, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ COggDirectShowOutputPin(AM_MEDIA_TYPE* pmt, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
};
class COggStreamOutputPin : public COggSplitterOutputPin
{
- __int64 m_time_unit, m_samples_per_unit;
- DWORD m_default_len;
+ __int64 m_time_unit, m_samples_per_unit;
+ DWORD m_default_len;
- virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
- virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
+ virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
+ virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
public:
- COggStreamOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ COggStreamOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
};
class COggVideoOutputPin : public COggStreamOutputPin
{
public:
- COggVideoOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ COggVideoOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
};
class COggAudioOutputPin : public COggStreamOutputPin
{
public:
- COggAudioOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ COggAudioOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
};
class COggTextOutputPin : public COggStreamOutputPin
{
public:
- COggTextOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ COggTextOutputPin(OggStreamHeader* h, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
};
class COggTheoraOutputPin : public COggSplitterOutputPin
{
- CAutoPtrList<OggPacket> m_initpackets;
- LONGLONG m_KfgShift;
- int m_nIndexOffset;
- int m_nFpsNum;
- int m_nFpsDenum;
- REFERENCE_TIME m_rtAvgTimePerFrame;
+ CAutoPtrList<OggPacket> m_initpackets;
+ LONGLONG m_KfgShift;
+ int m_nIndexOffset;
+ int m_nFpsNum;
+ int m_nFpsDenum;
+ REFERENCE_TIME m_rtAvgTimePerFrame;
- virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
- virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
+ virtual HRESULT UnpackPacket(CAutoPtr<OggPacket>& p, BYTE* pData, int len);
+ virtual REFERENCE_TIME GetRefTime(__int64 granule_position);
public:
- COggTheoraOutputPin(BYTE* p, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ COggTheoraOutputPin(BYTE* p, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- HRESULT UnpackInitPage(OggPage& page);
- bool IsInitialized() {
- return m_initpackets.GetCount() >= 3;
- }
+ HRESULT UnpackInitPage(OggPage& page);
+ bool IsInitialized() {
+ return m_initpackets.GetCount() >= 3;
+ }
};
class __declspec(uuid("9FF48807-E133-40AA-826F-9B2959E5232D"))
- COggSplitterFilter : public CBaseSplitterFilter
+ COggSplitterFilter : public CBaseSplitterFilter
{
protected:
- CAutoPtr<COggFile> m_pFile;
- HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
+ CAutoPtr<COggFile> m_pFile;
+ HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
- bool DemuxInit();
- void DemuxSeek(REFERENCE_TIME rt);
- bool DemuxLoop();
+ bool DemuxInit();
+ void DemuxSeek(REFERENCE_TIME rt);
+ bool DemuxLoop();
public:
- COggSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
- virtual ~COggSplitterFilter();
+ COggSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ virtual ~COggSplitterFilter();
- // CBaseFilter
+ // CBaseFilter
- STDMETHODIMP_(HRESULT) QueryFilterInfo(FILTER_INFO* pInfo);
+ STDMETHODIMP_(HRESULT) QueryFilterInfo(FILTER_INFO* pInfo);
};
class __declspec(uuid("6D3688CE-3E9D-42F4-92CA-8A11119D25CD"))
- COggSourceFilter : public COggSplitterFilter
+ COggSourceFilter : public COggSplitterFilter
{
public:
- COggSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ COggSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
};
diff --git a/src/filters/parser/RealMediaSplitter/RealMediaSplitter.cpp b/src/filters/parser/RealMediaSplitter/RealMediaSplitter.cpp
index 24eab18c3..5e858baac 100644
--- a/src/filters/parser/RealMediaSplitter/RealMediaSplitter.cpp
+++ b/src/filters/parser/RealMediaSplitter/RealMediaSplitter.cpp
@@ -37,55 +37,55 @@
#endif
#include <moreuuids.h>
-#define MAXPACKETS_RV MAXPACKETS*10
+#define MAXPACKETS_RV MAXPACKETS*10
template<typename T>
static void bswap(T& var)
{
- BYTE* s = (BYTE*)&var;
- for (BYTE* d = s + sizeof(var)-1; s < d; s++, d--) {
- *s ^= *d, *d ^= *s, *s ^= *d;
- }
+ BYTE* s = (BYTE*)&var;
+ for (BYTE* d = s + sizeof(var) - 1; s < d; s++, d--) {
+ *s ^= *d, *d ^= *s, *s ^= *d;
+ }
}
void rvinfo::bswap()
{
- ::bswap(dwSize);
- ::bswap(w);
- ::bswap(h);
- ::bswap(bpp);
- ::bswap(unk1);
- ::bswap(fps);
- ::bswap(type1);
- ::bswap(type2);
+ ::bswap(dwSize);
+ ::bswap(w);
+ ::bswap(h);
+ ::bswap(bpp);
+ ::bswap(unk1);
+ ::bswap(fps);
+ ::bswap(type1);
+ ::bswap(type2);
}
void rainfo::bswap()
{
- ::bswap(version1);
- ::bswap(version2);
- ::bswap(header_size);
- ::bswap(flavor);
- ::bswap(coded_frame_size);
- ::bswap(sub_packet_h);
- ::bswap(frame_size);
- ::bswap(sub_packet_size);
+ ::bswap(version1);
+ ::bswap(version2);
+ ::bswap(header_size);
+ ::bswap(flavor);
+ ::bswap(coded_frame_size);
+ ::bswap(sub_packet_h);
+ ::bswap(frame_size);
+ ::bswap(sub_packet_size);
}
void rainfo4::bswap()
{
- __super::bswap();
- ::bswap(sample_rate);
- ::bswap(sample_size);
- ::bswap(channels);
+ __super::bswap();
+ ::bswap(sample_rate);
+ ::bswap(sample_size);
+ ::bswap(channels);
}
void rainfo5::bswap()
{
- __super::bswap();
- ::bswap(sample_rate);
- ::bswap(sample_size);
- ::bswap(channels);
+ __super::bswap();
+ ::bswap(sample_rate);
+ ::bswap(sample_size);
+ ::bswap(channels);
}
using namespace RMFF;
@@ -93,79 +93,79 @@ using namespace RMFF;
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, 0, NULL}
};
const AMOVIESETUP_MEDIATYPE sudPinTypesIn2[] = {
- {&MEDIATYPE_Video, &MEDIASUBTYPE_RV20},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_RV30},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_RV40},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_RV41},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_RV20},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_RV30},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_RV40},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_RV41},
};
const AMOVIESETUP_MEDIATYPE sudPinTypesOut2[] = {
- {&MEDIATYPE_Video, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudpPins2[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn2), sudPinTypesIn2},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut2), sudPinTypesOut2}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn2), sudPinTypesIn2},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut2), sudPinTypesOut2}
};
const AMOVIESETUP_MEDIATYPE sudPinTypesIn3[] = {
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_14_4},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_28_8},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_ATRC},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_COOK},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_DNET},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_SIPR},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_AAC},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_RAAC},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_RACP},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_14_4},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_28_8},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_ATRC},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_COOK},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_DNET},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_SIPR},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_AAC},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_RAAC},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_RACP},
};
const AMOVIESETUP_MEDIATYPE sudPinTypesOut3[] = {
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM},
};
const AMOVIESETUP_PIN sudpPins3[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn3), sudPinTypesIn3},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut3), sudPinTypesOut3}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn3), sudPinTypesIn3},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut3), sudPinTypesOut3}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CRealMediaSplitterFilter), RMSplitterName, MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CRealMediaSourceFilter), RMSourceName, MERIT_NORMAL, 0, NULL, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CRealVideoDecoder), L"MPC RealVideo Decoder", MERIT_NORMAL, _countof(sudpPins2), sudpPins2, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CRealAudioDecoder), L"MPC RealAudio Decoder", MERIT_NORMAL, _countof(sudpPins3), sudpPins3, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CRealMediaSplitterFilter), RMSplitterName, MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CRealMediaSourceFilter), RMSourceName, MERIT_NORMAL, 0, NULL, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CRealVideoDecoder), L"MPC RealVideo Decoder", MERIT_NORMAL, _countof(sudpPins2), sudpPins2, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CRealAudioDecoder), L"MPC RealAudio Decoder", MERIT_NORMAL, _countof(sudpPins3), sudpPins3, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CRealMediaSplitterFilter>, NULL, &sudFilter[0]},
- {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CRealMediaSourceFilter>, NULL, &sudFilter[1]},
- {sudFilter[2].strName, sudFilter[2].clsID, CreateInstance<CRealVideoDecoder>, NULL, &sudFilter[2]},
- {sudFilter[3].strName, sudFilter[3].clsID, CreateInstance<CRealAudioDecoder>, NULL, &sudFilter[3]},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CRealMediaSplitterFilter>, NULL, &sudFilter[0]},
+ {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CRealMediaSourceFilter>, NULL, &sudFilter[1]},
+ {sudFilter[2].strName, sudFilter[2].clsID, CreateInstance<CRealVideoDecoder>, NULL, &sudFilter[2]},
+ {sudFilter[3].strName, sudFilter[3].clsID, CreateInstance<CRealAudioDecoder>, NULL, &sudFilter[3]},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_RealMedia, _T("0,4,,2E524D46"), _T(".rm"), _T(".rmvb"), _T(".ram"), NULL);
+ RegisterSourceFilter(CLSID_AsyncReader, MEDIASUBTYPE_RealMedia, _T("0,4,,2E524D46"), _T(".rm"), _T(".rmvb"), _T(".ram"), NULL);
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- UnRegisterSourceFilter(MEDIASUBTYPE_RealMedia);
+ UnRegisterSourceFilter(MEDIASUBTYPE_RealMedia);
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -179,7 +179,7 @@ CFilterApp theApp;
//
CRealMediaSplitterFilter::CRealMediaSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CBaseSplitterFilter(NAME("CRealMediaSplitterFilter"), pUnk, phr, __uuidof(this), MAXPACKETS_RV)
+ : CBaseSplitterFilter(NAME("CRealMediaSplitterFilter"), pUnk, phr, __uuidof(this), MAXPACKETS_RV)
{
}
@@ -189,612 +189,612 @@ CRealMediaSplitterFilter::~CRealMediaSplitterFilter()
STDMETHODIMP CRealMediaSplitterFilter::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
-
- if (m_pName && m_pName[0]==L'M' && m_pName[1]==L'P' && m_pName[2]==L'C') {
- (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
- } else {
- wcscpy_s(pInfo->achName, RMSourceName);
- }
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+
+ if (m_pName && m_pName[0] == L'M' && m_pName[1] == L'P' && m_pName[2] == L'C') {
+ (void)StringCchCopyW(pInfo->achName, NUMELMS(pInfo->achName), m_pName);
+ } else {
+ wcscpy_s(pInfo->achName, RMSourceName);
+ }
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
HRESULT CRealMediaSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
{
- CheckPointer(pAsyncReader, E_POINTER);
-
- {
- DWORD dw;
- if (FAILED(pAsyncReader->SyncRead(0, 4, (BYTE*)&dw)) || dw != 'FMR.') {
- return E_FAIL;
- }
- }
-
- HRESULT hr = E_FAIL;
-
- m_pFile.Free();
-
- m_pFile.Attach(DNew CRMFile(pAsyncReader, hr));
- if (!m_pFile) {
- return E_OUTOFMEMORY;
- }
- if (FAILED(hr)) {
- m_pFile.Free();
- return hr;
- }
-
- m_rtNewStart = m_rtCurrent = 0;
- m_rtNewStop = m_rtStop = 0;
-
- m_rtStop = 10000i64*m_pFile->m_p.tDuration;
-
- POSITION pos = m_pFile->m_mps.GetHeadPosition();
- while (pos) {
- MediaProperies* pmp = m_pFile->m_mps.GetNext(pos);
-
- CStringW name;
- name.Format(L"Output %02d", pmp->stream);
- if (!pmp->name.IsEmpty()) {
- name += L" (" + CStringW(pmp->name) + L")";
- }
-
- CAtlArray<CMediaType> mts;
-
- CMediaType mt;
- mt.SetSampleSize(max(pmp->maxPacketSize*16/**/, 1));
-
- if (pmp->mime == "video/x-pn-realvideo") {
- mt.majortype = MEDIATYPE_Video;
- mt.formattype = FORMAT_VideoInfo;
-
- VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + pmp->typeSpecData.GetCount());
- memset(mt.Format(), 0, mt.FormatLength());
- memcpy(pvih + 1, pmp->typeSpecData.GetData(), pmp->typeSpecData.GetCount());
-
- rvinfo rvi = *(rvinfo*)pmp->typeSpecData.GetData();
- rvi.bswap();
-
- ASSERT(rvi.dwSize >= FIELD_OFFSET(rvinfo, morewh));
- ASSERT(rvi.fcc1 == 'ODIV');
-
- mt.subtype = FOURCCMap(rvi.fcc2);
- if (rvi.fps > 0x10000) {
- pvih->AvgTimePerFrame = REFERENCE_TIME(10000000i64 / ((float)rvi.fps/0x10000));
- }
- pvih->dwBitRate = pmp->avgBitRate;
- pvih->bmiHeader.biSize = sizeof(pvih->bmiHeader);
- pvih->bmiHeader.biWidth = rvi.w;
- pvih->bmiHeader.biHeight = rvi.h;
- pvih->bmiHeader.biPlanes = 3;
- pvih->bmiHeader.biBitCount = rvi.bpp;
- pvih->bmiHeader.biCompression = rvi.fcc2;
- pvih->bmiHeader.biSizeImage = rvi.w*rvi.h*3/2;
- mts.Add(mt);
-
- BYTE* extra = pmp->typeSpecData.GetData();
- int extralen = pmp->typeSpecData.GetCount();
-
- if (extralen > 26) {
- extra += 26;
- extralen -= 26;
- VIDEOINFOHEADER* pvih2 = (VIDEOINFOHEADER*)mt.ReallocFormatBuffer(sizeof(VIDEOINFOHEADER) + extralen);
- memcpy(pvih2 + 1, extra, extralen);
- mts.InsertAt(0, mt);
- }
-
- if (pmp->width > 0 && pmp->height > 0) {
- BITMAPINFOHEADER bmi = pvih->bmiHeader;
- mt.formattype = FORMAT_VideoInfo2;
- VIDEOINFOHEADER2* pvih2 = (VIDEOINFOHEADER2*)mt.ReallocFormatBuffer(sizeof(VIDEOINFOHEADER2) + pmp->typeSpecData.GetCount());
- memset(mt.Format() + FIELD_OFFSET(VIDEOINFOHEADER2, dwInterlaceFlags), 0, mt.FormatLength() - FIELD_OFFSET(VIDEOINFOHEADER2, dwInterlaceFlags));
- memcpy(pvih2 + 1, pmp->typeSpecData.GetData(), pmp->typeSpecData.GetCount());
- pvih2->bmiHeader = bmi;
- pvih2->bmiHeader.biWidth = (DWORD)pmp->width;
- pvih2->bmiHeader.biHeight = (DWORD)pmp->height;
- pvih2->dwPictAspectRatioX = rvi.w;
- pvih2->dwPictAspectRatioY = rvi.h;
-
- mts.InsertAt(0, mt);
- }
- } else if (pmp->mime == "audio/x-pn-realaudio") {
- mt.majortype = MEDIATYPE_Audio;
- mt.formattype = FORMAT_WaveFormatEx;
- mt.bTemporalCompression = 1;
-
- WAVEFORMATEX* pwfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX) + pmp->typeSpecData.GetCount());
- memset(mt.Format(), 0, mt.FormatLength());
- memcpy(pwfe + 1, pmp->typeSpecData.GetData(), pmp->typeSpecData.GetCount());
-
- union {
- DWORD fcc;
- char fccstr[5];
- };
-
- fcc = 0;
- fccstr[4] = 0;
-
- BYTE* fmt = pmp->typeSpecData.GetData();
- for (size_t i = 0; i < pmp->typeSpecData.GetCount()-4; i++, fmt++) {
- if (fmt[0] == '.' || fmt[1] == 'r' || fmt[2] == 'a') {
- break;
- }
- }
-
- rainfo rai = *(rainfo*)fmt;
- rai.bswap();
-
- BYTE* extra = NULL;
-
- if (rai.version2 == 4) {
- rainfo4 rai4 = *(rainfo4*)fmt;
- rai4.bswap();
- pwfe->nChannels = rai4.channels;
- pwfe->wBitsPerSample = rai4.sample_size;
- pwfe->nSamplesPerSec = rai4.sample_rate;
- pwfe->nBlockAlign = rai4.frame_size;
- BYTE* p = (BYTE*)((rainfo4*)fmt+1);
- int len = *p++;
- p += len;
- len = *p++;
- ASSERT(len == 4);
- if (len == 4) {
- fcc = MAKEFOURCC(p[0],p[1],p[2],p[3]);
- }
- extra = p + len + 3;
- } else if (rai.version2 == 5) {
- rainfo5 rai5 = *(rainfo5*)fmt;
- rai5.bswap();
- pwfe->nChannels = rai5.channels;
- pwfe->wBitsPerSample = rai5.sample_size;
- pwfe->nSamplesPerSec = rai5.sample_rate;
- pwfe->nBlockAlign = rai5.frame_size;
- fcc = rai5.fourcc3;
- extra = fmt + sizeof(rainfo5) + 4;
- } else {
- continue;
- }
-
- _strupr_s(fccstr);
-
- mt.subtype = FOURCCMap(fcc);
-
- bswap(fcc);
-
- switch (fcc) {
- case '14_4':
- pwfe->wFormatTag = WAVE_FORMAT_14_4;
- break;
- case '28_8':
- pwfe->wFormatTag = WAVE_FORMAT_28_8;
- break;
- case 'ATRC':
- pwfe->wFormatTag = WAVE_FORMAT_ATRC;
- break;
- case 'COOK':
- pwfe->wFormatTag = WAVE_FORMAT_COOK;
- break;
- case 'DNET':
- pwfe->wFormatTag = WAVE_FORMAT_DNET;
- break;
- case 'SIPR':
- pwfe->wFormatTag = WAVE_FORMAT_SIPR;
- break;
- case 'RAAC':
- pwfe->wFormatTag = WAVE_FORMAT_RAAC;
- break;
- case 'RACP':
- pwfe->wFormatTag = WAVE_FORMAT_RACP;
- break;
- }
-
- if (pwfe->wFormatTag) {
- mts.Add(mt);
-
- if (fcc == 'DNET') {
- mt.subtype = FOURCCMap(pwfe->wFormatTag = WAVE_FORMAT_DOLBY_AC3);
- mts.InsertAt(0, mt);
- } else if (fcc == 'RAAC' || fcc == 'RACP') {
- mt.subtype = FOURCCMap(pwfe->wFormatTag = WAVE_FORMAT_AAC);
- int extralen = *(DWORD*)extra;
- extra += 4;
- ::bswap(extralen);
- ASSERT(*extra == 2); // always 2? why? what does it mean?
- if (*extra == 2) {
- extra++;
- extralen--;
- WAVEFORMATEX* pwfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + extralen);
- pwfe->cbSize = extralen;
- memcpy(pwfe + 1, extra, extralen);
- } else {
- WAVEFORMATEX* pwfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + 5);
- pwfe->cbSize = MakeAACInitData((BYTE*)(pwfe+1), 0, pwfe->nSamplesPerSec, pwfe->nChannels);
- }
- mts.InsertAt(0, mt);
- }
- }
- } else if (pmp->mime == "logical-fileinfo") {
- CAtlMap<CStringA, CStringA, CStringElementTraits<CStringA> > lfi;
- CStringA key, value;
-
- BYTE* p = pmp->typeSpecData.GetData();
- BYTE* end = p + pmp->typeSpecData.GetCount();
- p += 8;
-
- DWORD cnt = p <= end-4 ? *(DWORD*)p : 0;
- bswap(cnt);
- p += 4;
-
- if (cnt > 0xffff) { // different format?
- p += 2;
- cnt = p <= end-4 ? *(DWORD*)p : 0;
- bswap(cnt);
- p += 4;
- }
-
- while (p < end-4 && cnt-- > 0) {
- BYTE* base = p;
- DWORD len = *(DWORD*)p;
- bswap(len);
- p += 4;
- if (base + len > end) {
- break;
- }
-
- p++;
- WORD keylen = *(WORD*)p;
- bswap(keylen);
- p += 2;
- memcpy(key.GetBufferSetLength(keylen), p, keylen);
- p += keylen;
-
- p+=4;
- WORD valuelen = *(WORD*)p;
- bswap(valuelen);
- p += 2;
- memcpy(value.GetBufferSetLength(valuelen), p, valuelen);
- p += valuelen;
-
- ASSERT(p == base + len);
- p = base + len;
-
- lfi[key] = value;
- }
-
- POSITION pos = lfi.GetStartPosition();
- while (pos) {
- lfi.GetNextAssoc(pos, key, value);
-
- int n = 0;
- if (key.Find("CHAPTER") == 0 && key.Find("TIME") == key.GetLength()-4
- && (n = strtol(key.Mid(7), NULL, 10)) > 0) {
- int h, m, s, ms;
- char c;
- if (7 != sscanf_s(value, "%d%c%d%c%d%c%d", &h, &c, sizeof(CHAR),
- &m, &c, sizeof(CHAR), &s, &c, sizeof(CHAR), &ms)) {
- continue;
- }
-
- key.Format("CHAPTER%02dNAME", n);
- if (!lfi.Lookup(key, value) || value.IsEmpty()) {
- value.Format("Chapter %d", n);
- }
-
- ChapAppend(
- ((((REFERENCE_TIME)h*60+m)*60+s)*1000+ms)*10000,
- CStringW(CString(value)));
- }
- }
- }
-
- if (mts.IsEmpty()) {
- TRACE(_T("Unsupported RealMedia stream (%d): %s\n"), pmp->stream, CString(pmp->mime));
- continue;
- }
-
- HRESULT hr;
-
- CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CRealMediaSplitterOutputPin(mts, name, this, this, &hr));
- if (SUCCEEDED(AddOutputPin((DWORD)pmp->stream, pPinOut))) {
- if (!m_rtStop) {
- m_pFile->m_p.tDuration = max(m_pFile->m_p.tDuration, pmp->tDuration);
- }
- }
- }
-
- pos = m_pFile->m_subs.GetHeadPosition();
- for (DWORD stream = 0; pos; stream++) {
- CRMFile::subtitle& s = m_pFile->m_subs.GetNext(pos);
-
- CStringW name;
- name.Format(L"Subtitle %02d", stream);
- if (!s.name.IsEmpty()) {
- name += L" (" + CStringW(CString(s.name)) + L")";
- }
-
- CMediaType mt;
- mt.SetSampleSize(1);
- mt.majortype = MEDIATYPE_Text;
-
- CAtlArray<CMediaType> mts;
- mts.Add(mt);
-
- HRESULT hr;
-
- CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CRealMediaSplitterOutputPin(mts, name, this, this, &hr));
- AddOutputPin((DWORD)~stream, pPinOut);
- }
-
- m_rtDuration = m_rtNewStop = m_rtStop = 10000i64*m_pFile->m_p.tDuration;
-
- SetProperty(L"TITL", CStringW(m_pFile->m_cd.title));
- SetProperty(L"AUTH", CStringW(m_pFile->m_cd.author));
- SetProperty(L"CPYR", CStringW(m_pFile->m_cd.copyright));
- SetProperty(L"DESC", CStringW(m_pFile->m_cd.comment));
-
- return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
+ CheckPointer(pAsyncReader, E_POINTER);
+
+ {
+ DWORD dw;
+ if (FAILED(pAsyncReader->SyncRead(0, 4, (BYTE*)&dw)) || dw != 'FMR.') {
+ return E_FAIL;
+ }
+ }
+
+ HRESULT hr = E_FAIL;
+
+ m_pFile.Free();
+
+ m_pFile.Attach(DNew CRMFile(pAsyncReader, hr));
+ if (!m_pFile) {
+ return E_OUTOFMEMORY;
+ }
+ if (FAILED(hr)) {
+ m_pFile.Free();
+ return hr;
+ }
+
+ m_rtNewStart = m_rtCurrent = 0;
+ m_rtNewStop = m_rtStop = 0;
+
+ m_rtStop = 10000i64 * m_pFile->m_p.tDuration;
+
+ POSITION pos = m_pFile->m_mps.GetHeadPosition();
+ while (pos) {
+ MediaProperies* pmp = m_pFile->m_mps.GetNext(pos);
+
+ CStringW name;
+ name.Format(L"Output %02d", pmp->stream);
+ if (!pmp->name.IsEmpty()) {
+ name += L" (" + CStringW(pmp->name) + L")";
+ }
+
+ CAtlArray<CMediaType> mts;
+
+ CMediaType mt;
+ mt.SetSampleSize(max(pmp->maxPacketSize * 16/**/, 1));
+
+ if (pmp->mime == "video/x-pn-realvideo") {
+ mt.majortype = MEDIATYPE_Video;
+ mt.formattype = FORMAT_VideoInfo;
+
+ VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)mt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER) + pmp->typeSpecData.GetCount());
+ memset(mt.Format(), 0, mt.FormatLength());
+ memcpy(pvih + 1, pmp->typeSpecData.GetData(), pmp->typeSpecData.GetCount());
+
+ rvinfo rvi = *(rvinfo*)pmp->typeSpecData.GetData();
+ rvi.bswap();
+
+ ASSERT(rvi.dwSize >= FIELD_OFFSET(rvinfo, morewh));
+ ASSERT(rvi.fcc1 == 'ODIV');
+
+ mt.subtype = FOURCCMap(rvi.fcc2);
+ if (rvi.fps > 0x10000) {
+ pvih->AvgTimePerFrame = REFERENCE_TIME(10000000i64 / ((float)rvi.fps / 0x10000));
+ }
+ pvih->dwBitRate = pmp->avgBitRate;
+ pvih->bmiHeader.biSize = sizeof(pvih->bmiHeader);
+ pvih->bmiHeader.biWidth = rvi.w;
+ pvih->bmiHeader.biHeight = rvi.h;
+ pvih->bmiHeader.biPlanes = 3;
+ pvih->bmiHeader.biBitCount = rvi.bpp;
+ pvih->bmiHeader.biCompression = rvi.fcc2;
+ pvih->bmiHeader.biSizeImage = rvi.w * rvi.h * 3 / 2;
+ mts.Add(mt);
+
+ BYTE* extra = pmp->typeSpecData.GetData();
+ int extralen = pmp->typeSpecData.GetCount();
+
+ if (extralen > 26) {
+ extra += 26;
+ extralen -= 26;
+ VIDEOINFOHEADER* pvih2 = (VIDEOINFOHEADER*)mt.ReallocFormatBuffer(sizeof(VIDEOINFOHEADER) + extralen);
+ memcpy(pvih2 + 1, extra, extralen);
+ mts.InsertAt(0, mt);
+ }
+
+ if (pmp->width > 0 && pmp->height > 0) {
+ BITMAPINFOHEADER bmi = pvih->bmiHeader;
+ mt.formattype = FORMAT_VideoInfo2;
+ VIDEOINFOHEADER2* pvih2 = (VIDEOINFOHEADER2*)mt.ReallocFormatBuffer(sizeof(VIDEOINFOHEADER2) + pmp->typeSpecData.GetCount());
+ memset(mt.Format() + FIELD_OFFSET(VIDEOINFOHEADER2, dwInterlaceFlags), 0, mt.FormatLength() - FIELD_OFFSET(VIDEOINFOHEADER2, dwInterlaceFlags));
+ memcpy(pvih2 + 1, pmp->typeSpecData.GetData(), pmp->typeSpecData.GetCount());
+ pvih2->bmiHeader = bmi;
+ pvih2->bmiHeader.biWidth = (DWORD)pmp->width;
+ pvih2->bmiHeader.biHeight = (DWORD)pmp->height;
+ pvih2->dwPictAspectRatioX = rvi.w;
+ pvih2->dwPictAspectRatioY = rvi.h;
+
+ mts.InsertAt(0, mt);
+ }
+ } else if (pmp->mime == "audio/x-pn-realaudio") {
+ mt.majortype = MEDIATYPE_Audio;
+ mt.formattype = FORMAT_WaveFormatEx;
+ mt.bTemporalCompression = 1;
+
+ WAVEFORMATEX* pwfe = (WAVEFORMATEX*)mt.AllocFormatBuffer(sizeof(WAVEFORMATEX) + pmp->typeSpecData.GetCount());
+ memset(mt.Format(), 0, mt.FormatLength());
+ memcpy(pwfe + 1, pmp->typeSpecData.GetData(), pmp->typeSpecData.GetCount());
+
+ union {
+ DWORD fcc;
+ char fccstr[5];
+ };
+
+ fcc = 0;
+ fccstr[4] = 0;
+
+ BYTE* fmt = pmp->typeSpecData.GetData();
+ for (size_t i = 0; i < pmp->typeSpecData.GetCount() - 4; i++, fmt++) {
+ if (fmt[0] == '.' || fmt[1] == 'r' || fmt[2] == 'a') {
+ break;
+ }
+ }
+
+ rainfo rai = *(rainfo*)fmt;
+ rai.bswap();
+
+ BYTE* extra = NULL;
+
+ if (rai.version2 == 4) {
+ rainfo4 rai4 = *(rainfo4*)fmt;
+ rai4.bswap();
+ pwfe->nChannels = rai4.channels;
+ pwfe->wBitsPerSample = rai4.sample_size;
+ pwfe->nSamplesPerSec = rai4.sample_rate;
+ pwfe->nBlockAlign = rai4.frame_size;
+ BYTE* p = (BYTE*)((rainfo4*)fmt + 1);
+ int len = *p++;
+ p += len;
+ len = *p++;
+ ASSERT(len == 4);
+ if (len == 4) {
+ fcc = MAKEFOURCC(p[0], p[1], p[2], p[3]);
+ }
+ extra = p + len + 3;
+ } else if (rai.version2 == 5) {
+ rainfo5 rai5 = *(rainfo5*)fmt;
+ rai5.bswap();
+ pwfe->nChannels = rai5.channels;
+ pwfe->wBitsPerSample = rai5.sample_size;
+ pwfe->nSamplesPerSec = rai5.sample_rate;
+ pwfe->nBlockAlign = rai5.frame_size;
+ fcc = rai5.fourcc3;
+ extra = fmt + sizeof(rainfo5) + 4;
+ } else {
+ continue;
+ }
+
+ _strupr_s(fccstr);
+
+ mt.subtype = FOURCCMap(fcc);
+
+ bswap(fcc);
+
+ switch (fcc) {
+ case '14_4':
+ pwfe->wFormatTag = WAVE_FORMAT_14_4;
+ break;
+ case '28_8':
+ pwfe->wFormatTag = WAVE_FORMAT_28_8;
+ break;
+ case 'ATRC':
+ pwfe->wFormatTag = WAVE_FORMAT_ATRC;
+ break;
+ case 'COOK':
+ pwfe->wFormatTag = WAVE_FORMAT_COOK;
+ break;
+ case 'DNET':
+ pwfe->wFormatTag = WAVE_FORMAT_DNET;
+ break;
+ case 'SIPR':
+ pwfe->wFormatTag = WAVE_FORMAT_SIPR;
+ break;
+ case 'RAAC':
+ pwfe->wFormatTag = WAVE_FORMAT_RAAC;
+ break;
+ case 'RACP':
+ pwfe->wFormatTag = WAVE_FORMAT_RACP;
+ break;
+ }
+
+ if (pwfe->wFormatTag) {
+ mts.Add(mt);
+
+ if (fcc == 'DNET') {
+ mt.subtype = FOURCCMap(pwfe->wFormatTag = WAVE_FORMAT_DOLBY_AC3);
+ mts.InsertAt(0, mt);
+ } else if (fcc == 'RAAC' || fcc == 'RACP') {
+ mt.subtype = FOURCCMap(pwfe->wFormatTag = WAVE_FORMAT_AAC);
+ int extralen = *(DWORD*)extra;
+ extra += 4;
+ ::bswap(extralen);
+ ASSERT(*extra == 2); // always 2? why? what does it mean?
+ if (*extra == 2) {
+ extra++;
+ extralen--;
+ WAVEFORMATEX* pwfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + extralen);
+ pwfe->cbSize = extralen;
+ memcpy(pwfe + 1, extra, extralen);
+ } else {
+ WAVEFORMATEX* pwfe = (WAVEFORMATEX*)mt.ReallocFormatBuffer(sizeof(WAVEFORMATEX) + 5);
+ pwfe->cbSize = MakeAACInitData((BYTE*)(pwfe + 1), 0, pwfe->nSamplesPerSec, pwfe->nChannels);
+ }
+ mts.InsertAt(0, mt);
+ }
+ }
+ } else if (pmp->mime == "logical-fileinfo") {
+ CAtlMap<CStringA, CStringA, CStringElementTraits<CStringA> > lfi;
+ CStringA key, value;
+
+ BYTE* p = pmp->typeSpecData.GetData();
+ BYTE* end = p + pmp->typeSpecData.GetCount();
+ p += 8;
+
+ DWORD cnt = p <= end - 4 ? *(DWORD*)p : 0;
+ bswap(cnt);
+ p += 4;
+
+ if (cnt > 0xffff) { // different format?
+ p += 2;
+ cnt = p <= end - 4 ? *(DWORD*)p : 0;
+ bswap(cnt);
+ p += 4;
+ }
+
+ while (p < end - 4 && cnt-- > 0) {
+ BYTE* base = p;
+ DWORD len = *(DWORD*)p;
+ bswap(len);
+ p += 4;
+ if (base + len > end) {
+ break;
+ }
+
+ p++;
+ WORD keylen = *(WORD*)p;
+ bswap(keylen);
+ p += 2;
+ memcpy(key.GetBufferSetLength(keylen), p, keylen);
+ p += keylen;
+
+ p += 4;
+ WORD valuelen = *(WORD*)p;
+ bswap(valuelen);
+ p += 2;
+ memcpy(value.GetBufferSetLength(valuelen), p, valuelen);
+ p += valuelen;
+
+ ASSERT(p == base + len);
+ p = base + len;
+
+ lfi[key] = value;
+ }
+
+ POSITION pos = lfi.GetStartPosition();
+ while (pos) {
+ lfi.GetNextAssoc(pos, key, value);
+
+ int n = 0;
+ if (key.Find("CHAPTER") == 0 && key.Find("TIME") == key.GetLength() - 4
+ && (n = strtol(key.Mid(7), NULL, 10)) > 0) {
+ int h, m, s, ms;
+ char c;
+ if (7 != sscanf_s(value, "%d%c%d%c%d%c%d", &h, &c, sizeof(CHAR),
+ &m, &c, sizeof(CHAR), &s, &c, sizeof(CHAR), &ms)) {
+ continue;
+ }
+
+ key.Format("CHAPTER%02dNAME", n);
+ if (!lfi.Lookup(key, value) || value.IsEmpty()) {
+ value.Format("Chapter %d", n);
+ }
+
+ ChapAppend(
+ ((((REFERENCE_TIME)h * 60 + m) * 60 + s) * 1000 + ms) * 10000,
+ CStringW(CString(value)));
+ }
+ }
+ }
+
+ if (mts.IsEmpty()) {
+ TRACE(_T("Unsupported RealMedia stream (%d): %s\n"), pmp->stream, CString(pmp->mime));
+ continue;
+ }
+
+ HRESULT hr;
+
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CRealMediaSplitterOutputPin(mts, name, this, this, &hr));
+ if (SUCCEEDED(AddOutputPin((DWORD)pmp->stream, pPinOut))) {
+ if (!m_rtStop) {
+ m_pFile->m_p.tDuration = max(m_pFile->m_p.tDuration, pmp->tDuration);
+ }
+ }
+ }
+
+ pos = m_pFile->m_subs.GetHeadPosition();
+ for (DWORD stream = 0; pos; stream++) {
+ CRMFile::subtitle& s = m_pFile->m_subs.GetNext(pos);
+
+ CStringW name;
+ name.Format(L"Subtitle %02d", stream);
+ if (!s.name.IsEmpty()) {
+ name += L" (" + CStringW(CString(s.name)) + L")";
+ }
+
+ CMediaType mt;
+ mt.SetSampleSize(1);
+ mt.majortype = MEDIATYPE_Text;
+
+ CAtlArray<CMediaType> mts;
+ mts.Add(mt);
+
+ HRESULT hr;
+
+ CAutoPtr<CBaseSplitterOutputPin> pPinOut(DNew CRealMediaSplitterOutputPin(mts, name, this, this, &hr));
+ AddOutputPin((DWORD)~stream, pPinOut);
+ }
+
+ m_rtDuration = m_rtNewStop = m_rtStop = 10000i64 * m_pFile->m_p.tDuration;
+
+ SetProperty(L"TITL", CStringW(m_pFile->m_cd.title));
+ SetProperty(L"AUTH", CStringW(m_pFile->m_cd.author));
+ SetProperty(L"CPYR", CStringW(m_pFile->m_cd.copyright));
+ SetProperty(L"DESC", CStringW(m_pFile->m_cd.comment));
+
+ return m_pOutputs.GetCount() > 0 ? S_OK : E_FAIL;
}
bool CRealMediaSplitterFilter::DemuxInit()
{
- SetThreadName((DWORD)-1, "CRealMediaSplitterFilter");
+ SetThreadName((DWORD) - 1, "CRealMediaSplitterFilter");
- if (!m_pFile) {
- return false;
- }
+ if (!m_pFile) {
+ return false;
+ }
- // reindex if needed
+ // reindex if needed
- if (m_pFile->m_irs.GetCount() == 0) {
- m_nOpenProgress = 0;
- m_rtDuration = 0;
+ if (m_pFile->m_irs.GetCount() == 0) {
+ m_nOpenProgress = 0;
+ m_rtDuration = 0;
- int stream = m_pFile->GetMasterStream();
+ int stream = m_pFile->GetMasterStream();
- UINT32 tLastStart = (UINT32)-1;
- UINT32 nPacket = 0;
+ UINT32 tLastStart = (UINT32) - 1;
+ UINT32 nPacket = 0;
- POSITION pos = m_pFile->m_dcs.GetHeadPosition();
- while (pos && !m_fAbort) {
- DataChunk* pdc = m_pFile->m_dcs.GetNext(pos);
+ POSITION pos = m_pFile->m_dcs.GetHeadPosition();
+ while (pos && !m_fAbort) {
+ DataChunk* pdc = m_pFile->m_dcs.GetNext(pos);
- m_pFile->Seek(pdc->pos);
+ m_pFile->Seek(pdc->pos);
- for (UINT32 i = 0; i < pdc->nPackets && !m_fAbort; i++, nPacket++) {
- UINT64 filepos = m_pFile->GetPos();
+ for (UINT32 i = 0; i < pdc->nPackets && !m_fAbort; i++, nPacket++) {
+ UINT64 filepos = m_pFile->GetPos();
- HRESULT hr;
+ HRESULT hr;
- MediaPacketHeader mph;
- if (S_OK != (hr = m_pFile->Read(mph, false))) {
- break;
- }
+ MediaPacketHeader mph;
+ if (S_OK != (hr = m_pFile->Read(mph, false))) {
+ break;
+ }
- m_rtDuration = max((__int64)(10000i64*mph.tStart), m_rtDuration);
+ m_rtDuration = max((__int64)(10000i64 * mph.tStart), m_rtDuration);
- if (mph.stream == stream && (mph.flags&MediaPacketHeader::PN_KEYFRAME_FLAG) && tLastStart != mph.tStart) {
- CAutoPtr<IndexRecord> pir(DNew IndexRecord);
- pir->tStart = mph.tStart;
- pir->ptrFilePos = (UINT32)filepos;
- pir->packet = nPacket;
- m_pFile->m_irs.AddTail(pir);
+ if (mph.stream == stream && (mph.flags & MediaPacketHeader::PN_KEYFRAME_FLAG) && tLastStart != mph.tStart) {
+ CAutoPtr<IndexRecord> pir(DNew IndexRecord);
+ pir->tStart = mph.tStart;
+ pir->ptrFilePos = (UINT32)filepos;
+ pir->packet = nPacket;
+ m_pFile->m_irs.AddTail(pir);
- tLastStart = mph.tStart;
- }
+ tLastStart = mph.tStart;
+ }
- m_nOpenProgress = m_pFile->GetPos()*100/m_pFile->GetLength();
+ m_nOpenProgress = m_pFile->GetPos() * 100 / m_pFile->GetLength();
- DWORD cmd;
- if (CheckRequest(&cmd)) {
- if (cmd == CMD_EXIT) {
- m_fAbort = true;
- } else {
- Reply(S_OK);
- }
- }
- }
- }
+ DWORD cmd;
+ if (CheckRequest(&cmd)) {
+ if (cmd == CMD_EXIT) {
+ m_fAbort = true;
+ } else {
+ Reply(S_OK);
+ }
+ }
+ }
+ }
- m_nOpenProgress = 100;
+ m_nOpenProgress = 100;
- if (m_fAbort) {
- m_pFile->m_irs.RemoveAll();
- }
+ if (m_fAbort) {
+ m_pFile->m_irs.RemoveAll();
+ }
- m_fAbort = false;
- }
+ m_fAbort = false;
+ }
- m_seekpos = NULL;
- m_seekpacket = 0;
- m_seekfilepos = 0;
+ m_seekpos = NULL;
+ m_seekpacket = 0;
+ m_seekfilepos = 0;
- return true;
+ return true;
}
void CRealMediaSplitterFilter::DemuxSeek(REFERENCE_TIME rt)
{
- if (rt <= 0) {
- m_seekpos = m_pFile->m_dcs.GetHeadPosition();
- m_seekpacket = 0;
- m_seekfilepos = m_pFile->m_dcs.GetHead()->pos;
- } else {
- m_seekpos = NULL;
-
- POSITION pos = m_pFile->m_irs.GetTailPosition();
- while (pos && !m_seekpos) {
- IndexRecord* pir = m_pFile->m_irs.GetPrev(pos);
- if (pir->tStart <= rt/10000) {
- m_seekpacket = pir->packet;
-
- pos = m_pFile->m_dcs.GetTailPosition();
- while (pos && !m_seekpos) {
- POSITION tmp = pos;
-
- DataChunk* pdc = m_pFile->m_dcs.GetPrev(pos);
-
- if (pdc->pos <= pir->ptrFilePos) {
- m_seekpos = tmp;
- m_seekfilepos = pir->ptrFilePos;
-
- POSITION pos = m_pFile->m_dcs.GetHeadPosition();
- while (pos != m_seekpos) {
- m_seekpacket -= m_pFile->m_dcs.GetNext(pos)->nPackets;
- }
- }
- }
-
- // search the closest keyframe to the seek time (commented out 'cause rm seems to index all of its keyframes...)
- /*
- if (m_seekpos)
- {
- DataChunk* pdc = m_pFile->m_dcs.GetAt(m_seekpos);
-
- m_pFile->Seek(m_seekfilepos);
-
- REFERENCE_TIME seektime = -1;
- UINT32 seekstream = -1;
-
- for (UINT32 i = m_seekpacket; i < pdc->nPackets; i++)
- {
- UINT64 filepos = m_pFile->GetPos();
-
- MediaPacketHeader mph;
- if (S_OK != m_pFile->Read(mph, false))
- break;
-
- if (seekstream == -1) seekstream = mph.stream;
- if (seekstream != mph.stream) continue;
-
- if (seektime == 10000i64*mph.tStart) continue;
- if (rt < 10000i64*mph.tStart) break;
-
- if ((mph.flags&MediaPacketHeader::PN_KEYFRAME_FLAG))
- {
- m_seekpacket = i;
- m_seekfilepos = filepos;
- seektime = 10000i64*mph.tStart;
- }
- }
- }
- */
- }
- }
-
- if (!m_seekpos) {
- m_seekpos = m_pFile->m_dcs.GetHeadPosition();
- m_seekpacket = 0;
- m_seekfilepos = m_pFile->m_dcs.GetAt(m_seekpos)->pos;
- }
- }
+ if (rt <= 0) {
+ m_seekpos = m_pFile->m_dcs.GetHeadPosition();
+ m_seekpacket = 0;
+ m_seekfilepos = m_pFile->m_dcs.GetHead()->pos;
+ } else {
+ m_seekpos = NULL;
+
+ POSITION pos = m_pFile->m_irs.GetTailPosition();
+ while (pos && !m_seekpos) {
+ IndexRecord* pir = m_pFile->m_irs.GetPrev(pos);
+ if (pir->tStart <= rt / 10000) {
+ m_seekpacket = pir->packet;
+
+ pos = m_pFile->m_dcs.GetTailPosition();
+ while (pos && !m_seekpos) {
+ POSITION tmp = pos;
+
+ DataChunk* pdc = m_pFile->m_dcs.GetPrev(pos);
+
+ if (pdc->pos <= pir->ptrFilePos) {
+ m_seekpos = tmp;
+ m_seekfilepos = pir->ptrFilePos;
+
+ POSITION pos = m_pFile->m_dcs.GetHeadPosition();
+ while (pos != m_seekpos) {
+ m_seekpacket -= m_pFile->m_dcs.GetNext(pos)->nPackets;
+ }
+ }
+ }
+
+ // search the closest keyframe to the seek time (commented out 'cause rm seems to index all of its keyframes...)
+ /*
+ if (m_seekpos)
+ {
+ DataChunk* pdc = m_pFile->m_dcs.GetAt(m_seekpos);
+
+ m_pFile->Seek(m_seekfilepos);
+
+ REFERENCE_TIME seektime = -1;
+ UINT32 seekstream = -1;
+
+ for (UINT32 i = m_seekpacket; i < pdc->nPackets; i++)
+ {
+ UINT64 filepos = m_pFile->GetPos();
+
+ MediaPacketHeader mph;
+ if (S_OK != m_pFile->Read(mph, false))
+ break;
+
+ if (seekstream == -1) seekstream = mph.stream;
+ if (seekstream != mph.stream) continue;
+
+ if (seektime == 10000i64*mph.tStart) continue;
+ if (rt < 10000i64*mph.tStart) break;
+
+ if ((mph.flags&MediaPacketHeader::PN_KEYFRAME_FLAG))
+ {
+ m_seekpacket = i;
+ m_seekfilepos = filepos;
+ seektime = 10000i64*mph.tStart;
+ }
+ }
+ }
+ */
+ }
+ }
+
+ if (!m_seekpos) {
+ m_seekpos = m_pFile->m_dcs.GetHeadPosition();
+ m_seekpacket = 0;
+ m_seekfilepos = m_pFile->m_dcs.GetAt(m_seekpos)->pos;
+ }
+ }
}
bool CRealMediaSplitterFilter::DemuxLoop()
{
- HRESULT hr = S_OK;
- POSITION pos;
-
- pos = m_pFile->m_subs.GetHeadPosition();
- for (DWORD stream = 0; pos && SUCCEEDED(hr) && !CheckRequest(NULL); stream++) {
- CRMFile::subtitle& s = m_pFile->m_subs.GetNext(pos);
-
- CAutoPtr<Packet> p(DNew Packet);
-
- p->TrackNumber = ~stream;
- p->bSyncPoint = TRUE;
- p->rtStart = 0;
- p->rtStop = 1;
-
- size_t count = (4+1) + (2+4+(s.name.GetLength()+1)*2) + (2+4+s.data.GetLength());
- p->SetCount(count);
- BYTE* ptr = p->GetData();
-
- strcpy_s((char*)ptr, count, "GAB2");
- ptr += 4+1;
- count -= 4+1;
-
- *(WORD*)ptr = 2;
- ptr += 2;
- count -= 2;
- *(DWORD*)ptr = (s.name.GetLength()+1)*2;
- ptr += 4;
- count -= 4;
- wcscpy_s((WCHAR*)ptr, count / 2, CStringW(s.name));
- ptr += (s.name.GetLength()+1)*2;
-
- *(WORD*)ptr = 4;
- ptr += 2;
- *(DWORD*)ptr = s.data.GetLength();
- ptr += 4;
- memcpy((char*)ptr, s.data, s.data.GetLength());
- ptr += s.name.GetLength();
-
- hr = DeliverPacket(p);
- }
-
- pos = m_seekpos;
- while (pos && SUCCEEDED(hr) && !CheckRequest(NULL)) {
- DataChunk* pdc = m_pFile->m_dcs.GetNext(pos);
-
- m_pFile->Seek(m_seekfilepos > 0 ? m_seekfilepos : pdc->pos);
-
- for (UINT32 i = m_seekpacket; i < pdc->nPackets && SUCCEEDED(hr) && !CheckRequest(NULL); i++) {
- MediaPacketHeader mph;
- if (S_OK != (hr = m_pFile->Read(mph))) {
- break;
- }
-
- CAutoPtr<Packet> p(DNew Packet);
- p->TrackNumber = mph.stream;
- p->bSyncPoint = !!(mph.flags&MediaPacketHeader::PN_KEYFRAME_FLAG);
- p->rtStart = 10000i64*(mph.tStart);
- p->rtStop = p->rtStart+1;
- p->Copy(mph.pData);
- hr = DeliverPacket(p);
- }
-
- m_seekpacket = 0;
- m_seekfilepos = 0;
- }
-
- return true;
+ HRESULT hr = S_OK;
+ POSITION pos;
+
+ pos = m_pFile->m_subs.GetHeadPosition();
+ for (DWORD stream = 0; pos && SUCCEEDED(hr) && !CheckRequest(NULL); stream++) {
+ CRMFile::subtitle& s = m_pFile->m_subs.GetNext(pos);
+
+ CAutoPtr<Packet> p(DNew Packet);
+
+ p->TrackNumber = ~stream;
+ p->bSyncPoint = TRUE;
+ p->rtStart = 0;
+ p->rtStop = 1;
+
+ size_t count = (4 + 1) + (2 + 4 + (s.name.GetLength() + 1) * 2) + (2 + 4 + s.data.GetLength());
+ p->SetCount(count);
+ BYTE* ptr = p->GetData();
+
+ strcpy_s((char*)ptr, count, "GAB2");
+ ptr += 4 + 1;
+ count -= 4 + 1;
+
+ *(WORD*)ptr = 2;
+ ptr += 2;
+ count -= 2;
+ *(DWORD*)ptr = (s.name.GetLength() + 1) * 2;
+ ptr += 4;
+ count -= 4;
+ wcscpy_s((WCHAR*)ptr, count / 2, CStringW(s.name));
+ ptr += (s.name.GetLength() + 1) * 2;
+
+ *(WORD*)ptr = 4;
+ ptr += 2;
+ *(DWORD*)ptr = s.data.GetLength();
+ ptr += 4;
+ memcpy((char*)ptr, s.data, s.data.GetLength());
+ ptr += s.name.GetLength();
+
+ hr = DeliverPacket(p);
+ }
+
+ pos = m_seekpos;
+ while (pos && SUCCEEDED(hr) && !CheckRequest(NULL)) {
+ DataChunk* pdc = m_pFile->m_dcs.GetNext(pos);
+
+ m_pFile->Seek(m_seekfilepos > 0 ? m_seekfilepos : pdc->pos);
+
+ for (UINT32 i = m_seekpacket; i < pdc->nPackets && SUCCEEDED(hr) && !CheckRequest(NULL); i++) {
+ MediaPacketHeader mph;
+ if (S_OK != (hr = m_pFile->Read(mph))) {
+ break;
+ }
+
+ CAutoPtr<Packet> p(DNew Packet);
+ p->TrackNumber = mph.stream;
+ p->bSyncPoint = !!(mph.flags & MediaPacketHeader::PN_KEYFRAME_FLAG);
+ p->rtStart = 10000i64 * (mph.tStart);
+ p->rtStop = p->rtStart + 1;
+ p->Copy(mph.pData);
+ hr = DeliverPacket(p);
+ }
+
+ m_seekpacket = 0;
+ m_seekfilepos = 0;
+ }
+
+ return true;
}
// IKeyFrameInfo
STDMETHODIMP CRealMediaSplitterFilter::GetKeyFrameCount(UINT& nKFs)
{
- if (!m_pFile) {
- return E_UNEXPECTED;
- }
- nKFs = m_pFile->m_irs.GetCount();
- return S_OK;
+ if (!m_pFile) {
+ return E_UNEXPECTED;
+ }
+ nKFs = m_pFile->m_irs.GetCount();
+ return S_OK;
}
STDMETHODIMP CRealMediaSplitterFilter::GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs)
{
- CheckPointer(pFormat, E_POINTER);
- CheckPointer(pKFs, E_POINTER);
-
- if (!m_pFile) {
- return E_UNEXPECTED;
- }
- if (*pFormat != TIME_FORMAT_MEDIA_TIME) {
- return E_INVALIDARG;
- }
-
- UINT nKFsTmp = 0;
- POSITION pos = m_pFile->m_irs.GetHeadPosition();
- for (int i = 0; pos && nKFsTmp < nKFs; i++) {
- pKFs[nKFsTmp++] = 10000i64*m_pFile->m_irs.GetNext(pos)->tStart;
- }
- nKFs = nKFsTmp;
-
- return S_OK;
+ CheckPointer(pFormat, E_POINTER);
+ CheckPointer(pKFs, E_POINTER);
+
+ if (!m_pFile) {
+ return E_UNEXPECTED;
+ }
+ if (*pFormat != TIME_FORMAT_MEDIA_TIME) {
+ return E_INVALIDARG;
+ }
+
+ UINT nKFsTmp = 0;
+ POSITION pos = m_pFile->m_irs.GetHeadPosition();
+ for (int i = 0; pos && nKFsTmp < nKFs; i++) {
+ pKFs[nKFsTmp++] = 10000i64 * m_pFile->m_irs.GetNext(pos)->tStart;
+ }
+ nKFs = nKFsTmp;
+
+ return S_OK;
}
//
@@ -802,7 +802,7 @@ STDMETHODIMP CRealMediaSplitterFilter::GetKeyFrames(const GUID* pFormat, REFEREN
//
CRealMediaSplitterOutputPin::CRealMediaSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBaseSplitterOutputPin(mts, pName, pFilter, pLock, phr, 0, MAXPACKETS_RV)
+ : CBaseSplitterOutputPin(mts, pName, pFilter, pLock, phr, 0, MAXPACKETS_RV)
{
}
@@ -812,219 +812,219 @@ CRealMediaSplitterOutputPin::~CRealMediaSplitterOutputPin()
HRESULT CRealMediaSplitterOutputPin::DeliverEndFlush()
{
- {
- CAutoLock cAutoLock(&m_csQueue);
- m_segments.Clear();
- }
+ {
+ CAutoLock cAutoLock(&m_csQueue);
+ m_segments.Clear();
+ }
- return __super::DeliverEndFlush();
+ return __super::DeliverEndFlush();
}
HRESULT CRealMediaSplitterOutputPin::DeliverSegments()
{
- HRESULT hr;
-
- if (m_segments.GetCount() == 0) {
- m_segments.Clear();
- return S_OK;
- }
-
- CAutoPtr<Packet> p(DNew Packet());
-
- p->TrackNumber = (DWORD)-1;
- p->bDiscontinuity = m_segments.fDiscontinuity;
- p->bSyncPoint = m_segments.fSyncPoint;
- p->rtStart = m_segments.rtStart;
- p->rtStop = m_segments.rtStart+1;
-
- DWORD len = 0, total = 0;
- POSITION pos = m_segments.GetHeadPosition();
- while (pos) {
- segment* s = m_segments.GetNext(pos);
- len = max(len, s->offset + s->data.GetCount());
- total += s->data.GetCount();
- }
- ASSERT(len == total);
- len += 1 + 2*4*(!m_segments.fMerged ? m_segments.GetCount() : 1);
-
- p->SetCount(len);
-
- BYTE* pData = p->GetData();
-
- *pData++ = m_segments.fMerged ? 0 : m_segments.GetCount()-1;
-
- if (m_segments.fMerged) {
- *((DWORD*)pData) = 1;
- pData += 4;
- *((DWORD*)pData) = 0;
- pData += 4;
- } else {
- pos = m_segments.GetHeadPosition();
- while (pos) {
- *((DWORD*)pData) = 1;
- pData += 4;
- *((DWORD*)pData) = m_segments.GetNext(pos)->offset;
- pData += 4;
- }
- }
-
- pos = m_segments.GetHeadPosition();
- while (pos) {
- segment* s = m_segments.GetNext(pos);
- memcpy(pData + s->offset, s->data.GetData(), s->data.GetCount());
- }
-
- hr = __super::DeliverPacket(p);
-
- m_segments.Clear();
-
- return hr;
+ HRESULT hr;
+
+ if (m_segments.GetCount() == 0) {
+ m_segments.Clear();
+ return S_OK;
+ }
+
+ CAutoPtr<Packet> p(DNew Packet());
+
+ p->TrackNumber = (DWORD) - 1;
+ p->bDiscontinuity = m_segments.fDiscontinuity;
+ p->bSyncPoint = m_segments.fSyncPoint;
+ p->rtStart = m_segments.rtStart;
+ p->rtStop = m_segments.rtStart + 1;
+
+ DWORD len = 0, total = 0;
+ POSITION pos = m_segments.GetHeadPosition();
+ while (pos) {
+ segment* s = m_segments.GetNext(pos);
+ len = max(len, s->offset + s->data.GetCount());
+ total += s->data.GetCount();
+ }
+ ASSERT(len == total);
+ len += 1 + 2 * 4 * (!m_segments.fMerged ? m_segments.GetCount() : 1);
+
+ p->SetCount(len);
+
+ BYTE* pData = p->GetData();
+
+ *pData++ = m_segments.fMerged ? 0 : m_segments.GetCount() - 1;
+
+ if (m_segments.fMerged) {
+ *((DWORD*)pData) = 1;
+ pData += 4;
+ *((DWORD*)pData) = 0;
+ pData += 4;
+ } else {
+ pos = m_segments.GetHeadPosition();
+ while (pos) {
+ *((DWORD*)pData) = 1;
+ pData += 4;
+ *((DWORD*)pData) = m_segments.GetNext(pos)->offset;
+ pData += 4;
+ }
+ }
+
+ pos = m_segments.GetHeadPosition();
+ while (pos) {
+ segment* s = m_segments.GetNext(pos);
+ memcpy(pData + s->offset, s->data.GetData(), s->data.GetCount());
+ }
+
+ hr = __super::DeliverPacket(p);
+
+ m_segments.Clear();
+
+ return hr;
}
HRESULT CRealMediaSplitterOutputPin::DeliverPacket(CAutoPtr<Packet> p)
{
- HRESULT hr = S_OK;
-
- ASSERT(p->rtStart < p->rtStop);
-
- if (m_mt.subtype == MEDIASUBTYPE_WAVE_DOLBY_AC3) {
- WORD* s = (WORD*)p->GetData();
- WORD* e = s + p->GetCount()/2;
- while (s < e) {
- bswap(*s++);
- }
- }
-
- if (m_mt.subtype == MEDIASUBTYPE_RV10 || m_mt.subtype == MEDIASUBTYPE_RV20
- || m_mt.subtype == MEDIASUBTYPE_RV30 || m_mt.subtype == MEDIASUBTYPE_RV40
- || m_mt.subtype == MEDIASUBTYPE_RV41) {
- CAutoLock cAutoLock(&m_csQueue);
-
- int len = p->GetCount();
- BYTE* pIn = p->GetData();
- BYTE* pInOrg = pIn;
-
- if (m_segments.rtStart != p->rtStart) {
- if (S_OK != (hr = DeliverSegments())) {
- return hr;
- }
- }
-
- if (!m_segments.fDiscontinuity && p->bDiscontinuity) {
- m_segments.fDiscontinuity = true;
- }
- m_segments.fSyncPoint = !!p->bSyncPoint;
- m_segments.rtStart = p->rtStart;
-
- while (pIn - pInOrg < len) {
- BYTE hdr = *pIn++;
- DWORD packetlen = 0, packetoffset = 0;
-
- if ((hdr&0xc0) == 0x40) {
- pIn++;
- packetlen = len - (pIn - pInOrg);
- } else {
- if ((hdr&0x40) == 0) {
- pIn++; //BYTE subseq = (*pIn++)&0x7f;
- }
+ HRESULT hr = S_OK;
+
+ ASSERT(p->rtStart < p->rtStop);
+
+ if (m_mt.subtype == MEDIASUBTYPE_WAVE_DOLBY_AC3) {
+ WORD* s = (WORD*)p->GetData();
+ WORD* e = s + p->GetCount() / 2;
+ while (s < e) {
+ bswap(*s++);
+ }
+ }
+
+ if (m_mt.subtype == MEDIASUBTYPE_RV10 || m_mt.subtype == MEDIASUBTYPE_RV20
+ || m_mt.subtype == MEDIASUBTYPE_RV30 || m_mt.subtype == MEDIASUBTYPE_RV40
+ || m_mt.subtype == MEDIASUBTYPE_RV41) {
+ CAutoLock cAutoLock(&m_csQueue);
+
+ int len = p->GetCount();
+ BYTE* pIn = p->GetData();
+ BYTE* pInOrg = pIn;
+
+ if (m_segments.rtStart != p->rtStart) {
+ if (S_OK != (hr = DeliverSegments())) {
+ return hr;
+ }
+ }
+
+ if (!m_segments.fDiscontinuity && p->bDiscontinuity) {
+ m_segments.fDiscontinuity = true;
+ }
+ m_segments.fSyncPoint = !!p->bSyncPoint;
+ m_segments.rtStart = p->rtStart;
+
+ while (pIn - pInOrg < len) {
+ BYTE hdr = *pIn++;
+ DWORD packetlen = 0, packetoffset = 0;
+
+ if ((hdr & 0xc0) == 0x40) {
+ pIn++;
+ packetlen = len - (pIn - pInOrg);
+ } else {
+ if ((hdr & 0x40) == 0) {
+ pIn++; //BYTE subseq = (*pIn++)&0x7f;
+ }
#define GetWORD(var) \
var = (var << 8) | (*pIn++); \
var = (var << 8) | (*pIn++);
- GetWORD(packetlen);
- if (packetlen&0x8000) {
- m_segments.fMerged = true;
- }
- if ((packetlen&0x4000) == 0) {
- GetWORD(packetlen);
- packetlen &= 0x3fffffff;
- } else {
- packetlen &= 0x3fff;
- }
-
- GetWORD(packetoffset);
- if ((packetoffset&0x4000) == 0) {
- GetWORD(packetoffset);
- packetoffset &= 0x3fffffff;
- } else {
- packetoffset &= 0x3fff;
- }
+ GetWORD(packetlen);
+ if (packetlen & 0x8000) {
+ m_segments.fMerged = true;
+ }
+ if ((packetlen & 0x4000) == 0) {
+ GetWORD(packetlen);
+ packetlen &= 0x3fffffff;
+ } else {
+ packetlen &= 0x3fff;
+ }
+
+ GetWORD(packetoffset);
+ if ((packetoffset & 0x4000) == 0) {
+ GetWORD(packetoffset);
+ packetoffset &= 0x3fffffff;
+ } else {
+ packetoffset &= 0x3fff;
+ }
#undef GetWORD
- if ((hdr&0xc0) == 0xc0) {
- m_segments.rtStart = 10000i64*packetoffset - m_rtStart, packetoffset = 0;
- } else if ((hdr&0xc0) == 0x80) {
- packetoffset = packetlen - packetoffset;
- }
-
- pIn++; //BYTE seqnum = *pIn++;
- }
-
- int len2 = min(len - (pIn - pInOrg), int(packetlen - packetoffset));
-
- CAutoPtr<segment> s(DNew segment);
- s->offset = packetoffset;
- s->data.SetCount(len2);
- memcpy(s->data.GetData(), pIn, len2);
- m_segments.AddTail(s);
-
- pIn += len2;
-
- if ((hdr&0x80) || packetoffset+len2 >= packetlen) {
- if (S_OK != (hr = DeliverSegments())) {
- return hr;
- }
- }
- }
- } else if (m_mt.subtype == MEDIASUBTYPE_RAAC || m_mt.subtype == MEDIASUBTYPE_RACP
- || m_mt.subtype == MEDIASUBTYPE_AAC) {
- BYTE* ptr = p->GetData()+2;
-
- CAtlList<WORD> sizes;
- int total = 0;
- int remaining = p->GetCount()-2;
- int expected = *(ptr-1)>>4;
-
- while (total < remaining) {
- int size = (ptr[0]<<8)|(ptr[1]);
- sizes.AddTail(size);
- total += size;
- ptr += 2;
- remaining -= 2;
- expected--;
- }
-
- ASSERT(total == remaining);
- ASSERT(expected == 0);
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
- REFERENCE_TIME rtDur = 10240000000i64/wfe->nSamplesPerSec * (wfe->cbSize>2?2:1);
- REFERENCE_TIME rtStart = p->rtStart;
- BOOL bDiscontinuity = p->bDiscontinuity;
-
- POSITION pos = sizes.GetHeadPosition();
- while (pos) {
- WORD size = sizes.GetNext(pos);
-
- CAutoPtr<Packet> p(DNew Packet);
- p->bDiscontinuity = bDiscontinuity;
- p->bSyncPoint = true;
- p->rtStart = rtStart;
- p->rtStop = rtStart += rtDur;
- p->SetData(ptr, size);
- ptr += size;
- bDiscontinuity = false;
- if (S_OK != (hr = __super::DeliverPacket(p))) {
- break;
- }
- }
- } else {
- hr = __super::DeliverPacket(p);
- }
-
- return hr;
+ if ((hdr & 0xc0) == 0xc0) {
+ m_segments.rtStart = 10000i64 * packetoffset - m_rtStart, packetoffset = 0;
+ } else if ((hdr & 0xc0) == 0x80) {
+ packetoffset = packetlen - packetoffset;
+ }
+
+ pIn++; //BYTE seqnum = *pIn++;
+ }
+
+ int len2 = min(len - (pIn - pInOrg), int(packetlen - packetoffset));
+
+ CAutoPtr<segment> s(DNew segment);
+ s->offset = packetoffset;
+ s->data.SetCount(len2);
+ memcpy(s->data.GetData(), pIn, len2);
+ m_segments.AddTail(s);
+
+ pIn += len2;
+
+ if ((hdr & 0x80) || packetoffset + len2 >= packetlen) {
+ if (S_OK != (hr = DeliverSegments())) {
+ return hr;
+ }
+ }
+ }
+ } else if (m_mt.subtype == MEDIASUBTYPE_RAAC || m_mt.subtype == MEDIASUBTYPE_RACP
+ || m_mt.subtype == MEDIASUBTYPE_AAC) {
+ BYTE* ptr = p->GetData() + 2;
+
+ CAtlList<WORD> sizes;
+ int total = 0;
+ int remaining = p->GetCount() - 2;
+ int expected = *(ptr - 1) >> 4;
+
+ while (total < remaining) {
+ int size = (ptr[0] << 8) | (ptr[1]);
+ sizes.AddTail(size);
+ total += size;
+ ptr += 2;
+ remaining -= 2;
+ expected--;
+ }
+
+ ASSERT(total == remaining);
+ ASSERT(expected == 0);
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_mt.pbFormat;
+ REFERENCE_TIME rtDur = 10240000000i64 / wfe->nSamplesPerSec * (wfe->cbSize > 2 ? 2 : 1);
+ REFERENCE_TIME rtStart = p->rtStart;
+ BOOL bDiscontinuity = p->bDiscontinuity;
+
+ POSITION pos = sizes.GetHeadPosition();
+ while (pos) {
+ WORD size = sizes.GetNext(pos);
+
+ CAutoPtr<Packet> p(DNew Packet);
+ p->bDiscontinuity = bDiscontinuity;
+ p->bSyncPoint = true;
+ p->rtStart = rtStart;
+ p->rtStop = rtStart += rtDur;
+ p->SetData(ptr, size);
+ ptr += size;
+ bDiscontinuity = false;
+ if (S_OK != (hr = __super::DeliverPacket(p))) {
+ break;
+ }
+ }
+ } else {
+ hr = __super::DeliverPacket(p);
+ }
+
+ return hr;
}
//
@@ -1032,10 +1032,10 @@ HRESULT CRealMediaSplitterOutputPin::DeliverPacket(CAutoPtr<Packet> p)
//
CRealMediaSourceFilter::CRealMediaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CRealMediaSplitterFilter(pUnk, phr)
+ : CRealMediaSplitterFilter(pUnk, phr)
{
- m_clsid = __uuidof(this);
- m_pInput.Free();
+ m_clsid = __uuidof(this);
+ m_pInput.Free();
}
//
@@ -1043,572 +1043,572 @@ CRealMediaSourceFilter::CRealMediaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr)
//
CRMFile::CRMFile(IAsyncReader* pAsyncReader, HRESULT& hr)
- : CBaseSplitterFile(pAsyncReader, hr)
+ : CBaseSplitterFile(pAsyncReader, hr)
{
- if (FAILED(hr)) {
- return;
- }
- hr = Init();
+ if (FAILED(hr)) {
+ return;
+ }
+ hr = Init();
}
template<typename T>
HRESULT CRMFile::Read(T& var)
{
- HRESULT hr = ByteRead((BYTE*)&var, sizeof(var));
- bswap(var);
- return hr;
+ HRESULT hr = ByteRead((BYTE*)&var, sizeof(var));
+ bswap(var);
+ return hr;
}
HRESULT CRMFile::Read(ChunkHdr& hdr)
{
- memset(&hdr, 0, sizeof(hdr));
- HRESULT hr;
- if (S_OK != (hr = Read(hdr.object_id))
- || S_OK != (hr = Read(hdr.size))
- || S_OK != (hr = Read(hdr.object_version))) {
- return hr;
- }
- return S_OK;
+ memset(&hdr, 0, sizeof(hdr));
+ HRESULT hr;
+ if (S_OK != (hr = Read(hdr.object_id))
+ || S_OK != (hr = Read(hdr.size))
+ || S_OK != (hr = Read(hdr.object_version))) {
+ return hr;
+ }
+ return S_OK;
}
HRESULT CRMFile::Read(MediaPacketHeader& mph, bool fFull)
{
- memset(&mph, 0, FIELD_OFFSET(MediaPacketHeader, pData));
- mph.stream = (UINT16)-1;
-
- HRESULT hr;
-
- UINT16 object_version;
- if (S_OK != (hr = Read(object_version))) {
- return hr;
- }
- if (object_version != 0 && object_version != 1) {
- return S_OK;
- }
-
- UINT8 flags;
- if (S_OK != (hr = Read(mph.len))
- || S_OK != (hr = Read(mph.stream))
- || S_OK != (hr = Read(mph.tStart))
- || S_OK != (hr = Read(mph.reserved))
- || S_OK != (hr = Read(flags))) {
- return hr;
- }
- mph.flags = (MediaPacketHeader::flag_t)flags;
-
- LONG len = mph.len;
- len -= sizeof(object_version);
- len -= FIELD_OFFSET(MediaPacketHeader, flags);
- len -= sizeof(flags);
- ASSERT(len >= 0);
- len = max(len, 0);
-
- if (fFull) {
- mph.pData.SetCount(len);
- if (mph.len > 0 && S_OK != (hr = ByteRead(mph.pData.GetData(), len))) {
- return hr;
- }
- } else {
- Seek(GetPos() + len);
- }
-
- return S_OK;
+ memset(&mph, 0, FIELD_OFFSET(MediaPacketHeader, pData));
+ mph.stream = (UINT16) - 1;
+
+ HRESULT hr;
+
+ UINT16 object_version;
+ if (S_OK != (hr = Read(object_version))) {
+ return hr;
+ }
+ if (object_version != 0 && object_version != 1) {
+ return S_OK;
+ }
+
+ UINT8 flags;
+ if (S_OK != (hr = Read(mph.len))
+ || S_OK != (hr = Read(mph.stream))
+ || S_OK != (hr = Read(mph.tStart))
+ || S_OK != (hr = Read(mph.reserved))
+ || S_OK != (hr = Read(flags))) {
+ return hr;
+ }
+ mph.flags = (MediaPacketHeader::flag_t)flags;
+
+ LONG len = mph.len;
+ len -= sizeof(object_version);
+ len -= FIELD_OFFSET(MediaPacketHeader, flags);
+ len -= sizeof(flags);
+ ASSERT(len >= 0);
+ len = max(len, 0);
+
+ if (fFull) {
+ mph.pData.SetCount(len);
+ if (mph.len > 0 && S_OK != (hr = ByteRead(mph.pData.GetData(), len))) {
+ return hr;
+ }
+ } else {
+ Seek(GetPos() + len);
+ }
+
+ return S_OK;
}
HRESULT CRMFile::Init()
{
- Seek(0);
-
- bool fFirstChunk = true;
-
- HRESULT hr;
-
- ChunkHdr hdr;
- while (GetRemaining() && S_OK == (hr = Read(hdr))) {
- __int64 pos = GetPos() - sizeof(hdr);
-
- if (fFirstChunk && hdr.object_id != '.RMF') {
- return E_FAIL;
- }
-
- fFirstChunk = false;
-
- if (pos + hdr.size > GetLength() && hdr.object_id != 'DATA') { // truncated?
- break;
- }
-
- if (hdr.object_id == 0x2E7261FD) { // '.ra+0xFD'
- return E_FAIL;
- }
-
- if (hdr.object_version == 0) {
- switch (hdr.object_id) {
- case '.RMF':
- if (S_OK != (hr = Read(m_fh.version))) {
- return hr;
- }
- if (hdr.size == 0x10) {
- WORD w = 0;
- if (S_OK != (hr = Read(w))) {
- return hr;
- }
- m_fh.nHeaders = w;
- } else if (S_OK != (hr = Read(m_fh.nHeaders))) {
- return hr;
- }
- break;
- case 'CONT':
- UINT16 slen;
- if (S_OK != (hr = Read(slen))) {
- return hr;
- }
- if (slen > 0 && S_OK != (hr = ByteRead((BYTE*)m_cd.title.GetBufferSetLength(slen), slen))) {
- return hr;
- }
- if (S_OK != (hr = Read(slen))) {
- return hr;
- }
- if (slen > 0 && S_OK != (hr = ByteRead((BYTE*)m_cd.author.GetBufferSetLength(slen), slen))) {
- return hr;
- }
- if (S_OK != (hr = Read(slen))) {
- return hr;
- }
- if (slen > 0 && S_OK != (hr = ByteRead((BYTE*)m_cd.copyright.GetBufferSetLength(slen), slen))) {
- return hr;
- }
- if (S_OK != (hr = Read(slen))) {
- return hr;
- }
- if (slen > 0 && S_OK != (hr = ByteRead((BYTE*)m_cd.comment.GetBufferSetLength(slen), slen))) {
- return hr;
- }
- break;
- case 'PROP':
- if (S_OK != (hr = Read(m_p.maxBitRate))) {
- return hr;
- }
- if (S_OK != (hr = Read(m_p.avgBitRate))) {
- return hr;
- }
- if (S_OK != (hr = Read(m_p.maxPacketSize))) {
- return hr;
- }
- if (S_OK != (hr = Read(m_p.avgPacketSize))) {
- return hr;
- }
- if (S_OK != (hr = Read(m_p.nPackets))) {
- return hr;
- }
- if (S_OK != (hr = Read(m_p.tDuration))) {
- return hr;
- }
- if (S_OK != (hr = Read(m_p.tPreroll))) {
- return hr;
- }
- if (S_OK != (hr = Read(m_p.ptrIndex))) {
- return hr;
- }
- if (S_OK != (hr = Read(m_p.ptrData))) {
- return hr;
- }
- if (S_OK != (hr = Read(m_p.nStreams))) {
- return hr;
- }
- UINT16 flags;
- if (S_OK != (hr = Read(flags))) {
- return hr;
- }
- m_p.flags = (Properies::flags_t)flags;
- break;
- case 'MDPR': {
- CAutoPtr<MediaProperies> mp(DNew MediaProperies);
- if (S_OK != (hr = Read(mp->stream))) {
- return hr;
- }
- if (S_OK != (hr = Read(mp->maxBitRate))) {
- return hr;
- }
- if (S_OK != (hr = Read(mp->avgBitRate))) {
- return hr;
- }
- if (S_OK != (hr = Read(mp->maxPacketSize))) {
- return hr;
- }
- if (S_OK != (hr = Read(mp->avgPacketSize))) {
- return hr;
- }
- if (S_OK != (hr = Read(mp->tStart))) {
- return hr;
- }
- if (S_OK != (hr = Read(mp->tPreroll))) {
- return hr;
- }
- if (S_OK != (hr = Read(mp->tDuration))) {
- return hr;
- }
- UINT8 slen;
- if (S_OK != (hr = Read(slen))) {
- return hr;
- }
- if (slen > 0 && S_OK != (hr = ByteRead((BYTE*)mp->name.GetBufferSetLength(slen), slen))) {
- return hr;
- }
- if (S_OK != (hr = Read(slen))) {
- return hr;
- }
- if (slen > 0 && S_OK != (hr = ByteRead((BYTE*)mp->mime.GetBufferSetLength(slen), slen))) {
- return hr;
- }
- UINT32 tsdlen;
- if (S_OK != (hr = Read(tsdlen))) {
- return hr;
- }
- mp->typeSpecData.SetCount(tsdlen);
- if (tsdlen > 0 && S_OK != (hr = ByteRead(mp->typeSpecData.GetData(), tsdlen))) {
- return hr;
- }
- mp->width = mp->height = 0;
- mp->interlaced = mp->top_field_first = false;
- m_mps.AddTail(mp);
- break;
- }
- case 'DATA': {
- CAutoPtr<DataChunk> dc(DNew DataChunk);
- if (S_OK != (hr = Read(dc->nPackets))) {
- return hr;
- }
- if (S_OK != (hr = Read(dc->ptrNext))) {
- return hr;
- }
- dc->pos = GetPos();
- m_dcs.AddTail(dc);
- GetDimensions();
- break;
- }
- case 'INDX': {
- IndexChunkHeader ich;
- if (S_OK != (hr = Read(ich.nIndices))) {
- return hr;
- }
- if (S_OK != (hr = Read(ich.stream))) {
- return hr;
- }
- if (S_OK != (hr = Read(ich.ptrNext))) {
- return hr;
- }
- int stream = GetMasterStream();
- while (ich.nIndices-- > 0) {
- UINT16 object_version;
- if (S_OK != (hr = Read(object_version))) {
- return hr;
- }
- if (object_version == 0) {
- CAutoPtr<IndexRecord> ir(DNew IndexRecord);
- if (S_OK != (hr = Read(ir->tStart))) {
- return hr;
- }
- if (S_OK != (hr = Read(ir->ptrFilePos))) {
- return hr;
- }
- if (S_OK != (hr = Read(ir->packet))) {
- return hr;
- }
- if (ich.stream == stream) {
- m_irs.AddTail(ir);
- }
- }
- }
- break;
- }
- case '.SUB':
- if (hdr.size > sizeof(hdr)) {
- int size = hdr.size - sizeof(hdr);
- CAutoVectorPtr<char> buff;
- if (!buff.Allocate(size)) {
- return E_OUTOFMEMORY;
- }
- char* p = buff;
- if (S_OK != (hr = ByteRead((BYTE*)p, size))) {
- return hr;
- }
- for (char* end = p + size; p < end; ) {
- subtitle s;
- s.name = p;
- p += s.name.GetLength()+1;
- CStringA len(p);
- p += len.GetLength()+1;
- s.data = CStringA(p, strtol(len, NULL, 10));
- p += s.data.GetLength();
- m_subs.AddTail(s);
- }
- }
- break;
- }
- }
-
- if (hdr.object_id == 'CONT' && BitRead(32, true) == 'DATA') {
- hdr.size = GetPos() - pos;
- }
-
- ASSERT(hdr.object_id == 'DATA'
- || GetPos() == pos + hdr.size
- || GetPos() == pos + sizeof(hdr));
-
- pos += hdr.size;
- if (pos > GetPos()) {
- Seek(pos);
- }
- }
-
- return S_OK;
+ Seek(0);
+
+ bool fFirstChunk = true;
+
+ HRESULT hr;
+
+ ChunkHdr hdr;
+ while (GetRemaining() && S_OK == (hr = Read(hdr))) {
+ __int64 pos = GetPos() - sizeof(hdr);
+
+ if (fFirstChunk && hdr.object_id != '.RMF') {
+ return E_FAIL;
+ }
+
+ fFirstChunk = false;
+
+ if (pos + hdr.size > GetLength() && hdr.object_id != 'DATA') { // truncated?
+ break;
+ }
+
+ if (hdr.object_id == 0x2E7261FD) { // '.ra+0xFD'
+ return E_FAIL;
+ }
+
+ if (hdr.object_version == 0) {
+ switch (hdr.object_id) {
+ case '.RMF':
+ if (S_OK != (hr = Read(m_fh.version))) {
+ return hr;
+ }
+ if (hdr.size == 0x10) {
+ WORD w = 0;
+ if (S_OK != (hr = Read(w))) {
+ return hr;
+ }
+ m_fh.nHeaders = w;
+ } else if (S_OK != (hr = Read(m_fh.nHeaders))) {
+ return hr;
+ }
+ break;
+ case 'CONT':
+ UINT16 slen;
+ if (S_OK != (hr = Read(slen))) {
+ return hr;
+ }
+ if (slen > 0 && S_OK != (hr = ByteRead((BYTE*)m_cd.title.GetBufferSetLength(slen), slen))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(slen))) {
+ return hr;
+ }
+ if (slen > 0 && S_OK != (hr = ByteRead((BYTE*)m_cd.author.GetBufferSetLength(slen), slen))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(slen))) {
+ return hr;
+ }
+ if (slen > 0 && S_OK != (hr = ByteRead((BYTE*)m_cd.copyright.GetBufferSetLength(slen), slen))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(slen))) {
+ return hr;
+ }
+ if (slen > 0 && S_OK != (hr = ByteRead((BYTE*)m_cd.comment.GetBufferSetLength(slen), slen))) {
+ return hr;
+ }
+ break;
+ case 'PROP':
+ if (S_OK != (hr = Read(m_p.maxBitRate))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(m_p.avgBitRate))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(m_p.maxPacketSize))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(m_p.avgPacketSize))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(m_p.nPackets))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(m_p.tDuration))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(m_p.tPreroll))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(m_p.ptrIndex))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(m_p.ptrData))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(m_p.nStreams))) {
+ return hr;
+ }
+ UINT16 flags;
+ if (S_OK != (hr = Read(flags))) {
+ return hr;
+ }
+ m_p.flags = (Properies::flags_t)flags;
+ break;
+ case 'MDPR': {
+ CAutoPtr<MediaProperies> mp(DNew MediaProperies);
+ if (S_OK != (hr = Read(mp->stream))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(mp->maxBitRate))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(mp->avgBitRate))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(mp->maxPacketSize))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(mp->avgPacketSize))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(mp->tStart))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(mp->tPreroll))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(mp->tDuration))) {
+ return hr;
+ }
+ UINT8 slen;
+ if (S_OK != (hr = Read(slen))) {
+ return hr;
+ }
+ if (slen > 0 && S_OK != (hr = ByteRead((BYTE*)mp->name.GetBufferSetLength(slen), slen))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(slen))) {
+ return hr;
+ }
+ if (slen > 0 && S_OK != (hr = ByteRead((BYTE*)mp->mime.GetBufferSetLength(slen), slen))) {
+ return hr;
+ }
+ UINT32 tsdlen;
+ if (S_OK != (hr = Read(tsdlen))) {
+ return hr;
+ }
+ mp->typeSpecData.SetCount(tsdlen);
+ if (tsdlen > 0 && S_OK != (hr = ByteRead(mp->typeSpecData.GetData(), tsdlen))) {
+ return hr;
+ }
+ mp->width = mp->height = 0;
+ mp->interlaced = mp->top_field_first = false;
+ m_mps.AddTail(mp);
+ break;
+ }
+ case 'DATA': {
+ CAutoPtr<DataChunk> dc(DNew DataChunk);
+ if (S_OK != (hr = Read(dc->nPackets))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(dc->ptrNext))) {
+ return hr;
+ }
+ dc->pos = GetPos();
+ m_dcs.AddTail(dc);
+ GetDimensions();
+ break;
+ }
+ case 'INDX': {
+ IndexChunkHeader ich;
+ if (S_OK != (hr = Read(ich.nIndices))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(ich.stream))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(ich.ptrNext))) {
+ return hr;
+ }
+ int stream = GetMasterStream();
+ while (ich.nIndices-- > 0) {
+ UINT16 object_version;
+ if (S_OK != (hr = Read(object_version))) {
+ return hr;
+ }
+ if (object_version == 0) {
+ CAutoPtr<IndexRecord> ir(DNew IndexRecord);
+ if (S_OK != (hr = Read(ir->tStart))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(ir->ptrFilePos))) {
+ return hr;
+ }
+ if (S_OK != (hr = Read(ir->packet))) {
+ return hr;
+ }
+ if (ich.stream == stream) {
+ m_irs.AddTail(ir);
+ }
+ }
+ }
+ break;
+ }
+ case '.SUB':
+ if (hdr.size > sizeof(hdr)) {
+ int size = hdr.size - sizeof(hdr);
+ CAutoVectorPtr<char> buff;
+ if (!buff.Allocate(size)) {
+ return E_OUTOFMEMORY;
+ }
+ char* p = buff;
+ if (S_OK != (hr = ByteRead((BYTE*)p, size))) {
+ return hr;
+ }
+ for (char* end = p + size; p < end;) {
+ subtitle s;
+ s.name = p;
+ p += s.name.GetLength() + 1;
+ CStringA len(p);
+ p += len.GetLength() + 1;
+ s.data = CStringA(p, strtol(len, NULL, 10));
+ p += s.data.GetLength();
+ m_subs.AddTail(s);
+ }
+ }
+ break;
+ }
+ }
+
+ if (hdr.object_id == 'CONT' && BitRead(32, true) == 'DATA') {
+ hdr.size = GetPos() - pos;
+ }
+
+ ASSERT(hdr.object_id == 'DATA'
+ || GetPos() == pos + hdr.size
+ || GetPos() == pos + sizeof(hdr));
+
+ pos += hdr.size;
+ if (pos > GetPos()) {
+ Seek(pos);
+ }
+ }
+
+ return S_OK;
}
#define GetBits(n) GetBits2(n, p, bit_offset, bit_buffer)
unsigned int GetBits2(int n, unsigned char*& p, unsigned int& bit_offset, unsigned int& bit_buffer)
{
- unsigned int ret = ((unsigned int)bit_buffer >> (32-(n)));
-
- bit_offset += n;
- bit_buffer <<= n;
- if (bit_offset > (32-16)) {
- p += bit_offset >> 3;
- bit_offset &= 7;
- bit_buffer = (unsigned int)p[0] << 24;
- bit_buffer |= (unsigned int)p[1] << 16;
- bit_buffer |= (unsigned int)p[2] << 8;
- bit_buffer |= (unsigned int)p[3];
- bit_buffer <<= bit_offset;
- }
-
- return ret;
+ unsigned int ret = ((unsigned int)bit_buffer >> (32 - (n)));
+
+ bit_offset += n;
+ bit_buffer <<= n;
+ if (bit_offset > (32 - 16)) {
+ p += bit_offset >> 3;
+ bit_offset &= 7;
+ bit_buffer = (unsigned int)p[0] << 24;
+ bit_buffer |= (unsigned int)p[1] << 16;
+ bit_buffer |= (unsigned int)p[2] << 8;
+ bit_buffer |= (unsigned int)p[3];
+ bit_buffer <<= bit_offset;
+ }
+
+ return ret;
}
void GetDimensions(unsigned char* p, unsigned int* wi, unsigned int* hi)
{
- unsigned int w, h, c;
+ unsigned int w, h, c;
- const unsigned int cw[8] = {160, 176, 240, 320, 352, 640, 704, 0};
- const unsigned int ch1[8] = {120, 132, 144, 240, 288, 480, 0, 0};
- const unsigned int ch2[4] = {180, 360, 576, 0};
+ const unsigned int cw[8] = {160, 176, 240, 320, 352, 640, 704, 0};
+ const unsigned int ch1[8] = {120, 132, 144, 240, 288, 480, 0, 0};
+ const unsigned int ch2[4] = {180, 360, 576, 0};
- unsigned int bit_offset = 0;
- unsigned int bit_buffer = *(unsigned int*)p;
- bswap(bit_buffer);
+ unsigned int bit_offset = 0;
+ unsigned int bit_buffer = *(unsigned int*)p;
+ bswap(bit_buffer);
- GetBits(13);
+ GetBits(13);
- GetBits(13);
+ GetBits(13);
- w = cw[GetBits(3)];
- if (w == 0) {
- do {
- c = GetBits(8);
- w += (c << 2);
- } while (c == 255);
- }
+ w = cw[GetBits(3)];
+ if (w == 0) {
+ do {
+ c = GetBits(8);
+ w += (c << 2);
+ } while (c == 255);
+ }
- c = GetBits(3);
+ c = GetBits(3);
- h = ch1[c];
- if (h == 0) {
- c = ((c << 1) | GetBits(1)) & 3;
+ h = ch1[c];
+ if (h == 0) {
+ c = ((c << 1) | GetBits(1)) & 3;
- h = ch2[c];
- if (h == 0) {
- do {
- c = GetBits(8);
- h += (c << 2);
- } while (c == 255);
- }
- }
+ h = ch2[c];
+ if (h == 0) {
+ do {
+ c = GetBits(8);
+ h += (c << 2);
+ } while (c == 255);
+ }
+ }
- *wi = w;
- *hi = h;
+ *wi = w;
+ *hi = h;
}
void GetDimensions_X10(unsigned char* p, unsigned int* wi, unsigned int* hi,
- bool *interlaced, bool *top_field_first, bool *repeat_field)
+ bool* interlaced, bool* top_field_first, bool* repeat_field)
{
- unsigned int w, h, c;
-
- const unsigned int cw[8] = {160, 176, 240, 320, 352, 640, 704, 0};
- const unsigned int ch1[8] = {120, 132, 144, 240, 288, 480, 0, 0};
- const unsigned int ch2[4] = {180, 360, 576, 0};
-
- unsigned int bit_offset = 0;
- unsigned int bit_buffer = *(unsigned int*)p;
- bswap(bit_buffer);
-
- GetBits(9);
-
- *interlaced = false;
- *top_field_first = false;
- *repeat_field = false;
- c = GetBits(1);
- if (c) {
- c = GetBits(1);
- if (c) {
- *interlaced = true;
- }
- c = GetBits(1);
- if (c) {
- *top_field_first = true;
- }
- c = GetBits(1);
- if (c) {
- *repeat_field = true;
- }
-
- c = GetBits(1);
- c = GetBits(1);
- if (c) {
- GetBits(2);
- }
- }
-
- GetBits(16);
-
- w = cw[GetBits(3)];
- if (w == 0) {
- do {
- c = GetBits(8);
- w += (c << 2);
- } while (c == 255);
- }
-
- c = GetBits(3);
-
- h = ch1[c];
- if (h == 0) {
- c = ((c << 1) | GetBits(1)) & 3;
-
- h = ch2[c];
- if (h == 0) {
- do {
- c = GetBits(8);
- h += (c << 2);
- } while (c == 255);
- }
- }
-
- *wi = w;
- *hi = h;
+ unsigned int w, h, c;
+
+ const unsigned int cw[8] = {160, 176, 240, 320, 352, 640, 704, 0};
+ const unsigned int ch1[8] = {120, 132, 144, 240, 288, 480, 0, 0};
+ const unsigned int ch2[4] = {180, 360, 576, 0};
+
+ unsigned int bit_offset = 0;
+ unsigned int bit_buffer = *(unsigned int*)p;
+ bswap(bit_buffer);
+
+ GetBits(9);
+
+ *interlaced = false;
+ *top_field_first = false;
+ *repeat_field = false;
+ c = GetBits(1);
+ if (c) {
+ c = GetBits(1);
+ if (c) {
+ *interlaced = true;
+ }
+ c = GetBits(1);
+ if (c) {
+ *top_field_first = true;
+ }
+ c = GetBits(1);
+ if (c) {
+ *repeat_field = true;
+ }
+
+ c = GetBits(1);
+ c = GetBits(1);
+ if (c) {
+ GetBits(2);
+ }
+ }
+
+ GetBits(16);
+
+ w = cw[GetBits(3)];
+ if (w == 0) {
+ do {
+ c = GetBits(8);
+ w += (c << 2);
+ } while (c == 255);
+ }
+
+ c = GetBits(3);
+
+ h = ch1[c];
+ if (h == 0) {
+ c = ((c << 1) | GetBits(1)) & 3;
+
+ h = ch2[c];
+ if (h == 0) {
+ do {
+ c = GetBits(8);
+ h += (c << 2);
+ } while (c == 255);
+ }
+ }
+
+ *wi = w;
+ *hi = h;
}
void CRMFile::GetDimensions()
{
- POSITION pos = m_mps.GetHeadPosition();
- while (pos) {
- UINT64 filepos = GetPos();
-
- MediaProperies* pmp = m_mps.GetNext(pos);
- if (pmp->mime == "video/x-pn-realvideo") {
- pmp->width = pmp->height = 0;
-
- rvinfo rvi = *(rvinfo*)pmp->typeSpecData.GetData();
- rvi.bswap();
-
- if (rvi.fcc2 != '04VR' && rvi.fcc2 != '14VR') {
- continue;
- }
-
- MediaPacketHeader mph;
- while (S_OK == Read(mph)) {
- if (mph.stream != pmp->stream || mph.len == 0
- || !(mph.flags&MediaPacketHeader::PN_KEYFRAME_FLAG)) {
- continue;
- }
-
- BYTE* p = mph.pData.GetData();
- BYTE* p0 = p;
- int len = mph.pData.GetCount();
-
- BYTE hdr = *p++;
- DWORD packetlen = 0, packetoffset = 0;
-
- if ((hdr&0xc0) == 0x40) {
- packetlen = len - (++p - p0);
- } else {
- if ((hdr&0x40) == 0) {
- p++;
- }
+ POSITION pos = m_mps.GetHeadPosition();
+ while (pos) {
+ UINT64 filepos = GetPos();
+
+ MediaProperies* pmp = m_mps.GetNext(pos);
+ if (pmp->mime == "video/x-pn-realvideo") {
+ pmp->width = pmp->height = 0;
+
+ rvinfo rvi = *(rvinfo*)pmp->typeSpecData.GetData();
+ rvi.bswap();
+
+ if (rvi.fcc2 != '04VR' && rvi.fcc2 != '14VR') {
+ continue;
+ }
+
+ MediaPacketHeader mph;
+ while (S_OK == Read(mph)) {
+ if (mph.stream != pmp->stream || mph.len == 0
+ || !(mph.flags & MediaPacketHeader::PN_KEYFRAME_FLAG)) {
+ continue;
+ }
+
+ BYTE* p = mph.pData.GetData();
+ BYTE* p0 = p;
+ int len = mph.pData.GetCount();
+
+ BYTE hdr = *p++;
+ DWORD packetlen = 0, packetoffset = 0;
+
+ if ((hdr & 0xc0) == 0x40) {
+ packetlen = len - (++p - p0);
+ } else {
+ if ((hdr & 0x40) == 0) {
+ p++;
+ }
#define GetWORD(var) \
var = (var << 8) | (*p++); \
var = (var << 8) | (*p++);
- GetWORD(packetlen);
- if ((packetlen&0x4000) == 0) {
- GetWORD(packetlen);
- packetlen &= 0x3fffffff;
- } else {
- packetlen &= 0x3fff;
- }
-
- GetWORD(packetoffset);
- if ((packetoffset&0x4000) == 0) {
- GetWORD(packetoffset);
- packetoffset &= 0x3fffffff;
- } else {
- packetoffset &= 0x3fff;
- }
+ GetWORD(packetlen);
+ if ((packetlen & 0x4000) == 0) {
+ GetWORD(packetlen);
+ packetlen &= 0x3fffffff;
+ } else {
+ packetlen &= 0x3fff;
+ }
+
+ GetWORD(packetoffset);
+ if ((packetoffset & 0x4000) == 0) {
+ GetWORD(packetoffset);
+ packetoffset &= 0x3fffffff;
+ } else {
+ packetoffset &= 0x3fff;
+ }
#undef GetWORD
- if ((hdr&0xc0) == 0xc0) {
- packetoffset = 0;
- } else if ((hdr&0xc0) == 0x80) {
- packetoffset = packetlen - packetoffset;
- }
+ if ((hdr & 0xc0) == 0xc0) {
+ packetoffset = 0;
+ } else if ((hdr & 0xc0) == 0x80) {
+ packetoffset = packetlen - packetoffset;
+ }
- p++;
- }
+ p++;
+ }
- len = min(len - (p - p0), int(packetlen - packetoffset));
+ len = min(len - (p - p0), int(packetlen - packetoffset));
- if (len > 0) {
- bool repeat_field;
- if (rvi.fcc2 == '14VR') {
- ::GetDimensions_X10(p, &pmp->width, &pmp->height, &pmp->interlaced, &pmp->top_field_first, &repeat_field);
- } else {
- ::GetDimensions(p, &pmp->width, &pmp->height);
- }
+ if (len > 0) {
+ bool repeat_field;
+ if (rvi.fcc2 == '14VR') {
+ ::GetDimensions_X10(p, &pmp->width, &pmp->height, &pmp->interlaced, &pmp->top_field_first, &repeat_field);
+ } else {
+ ::GetDimensions(p, &pmp->width, &pmp->height);
+ }
- if (rvi.w == pmp->width && rvi.h == pmp->height) {
- pmp->width = pmp->height = 0;
- }
+ if (rvi.w == pmp->width && rvi.h == pmp->height) {
+ pmp->width = pmp->height = 0;
+ }
- break;
- }
- }
- }
+ break;
+ }
+ }
+ }
- Seek(filepos);
- }
+ Seek(filepos);
+ }
}
int CRMFile::GetMasterStream()
{
- int s1 = -1, s2 = -1;
-
- POSITION pos = m_mps.GetHeadPosition();
- while (pos) {
- MediaProperies* pmp = m_mps.GetNext(pos);
- if (pmp->mime == "video/x-pn-realvideo") {
- s1 = pmp->stream;
- break;
- } else if (pmp->mime == "audio/x-pn-realaudio" && s2 == -1) {
- s2 = pmp->stream;
- }
- }
-
- if (s1 == -1) {
- s1 = s2;
- }
-
- return s1;
+ int s1 = -1, s2 = -1;
+
+ POSITION pos = m_mps.GetHeadPosition();
+ while (pos) {
+ MediaProperies* pmp = m_mps.GetNext(pos);
+ if (pmp->mime == "video/x-pn-realvideo") {
+ s1 = pmp->stream;
+ break;
+ } else if (pmp->mime == "audio/x-pn-realaudio" && s2 == -1) {
+ s2 = pmp->stream;
+ }
+ }
+
+ if (s1 == -1) {
+ s1 = s2;
+ }
+
+ return s1;
}
@@ -1619,465 +1619,465 @@ int CRMFile::GetMasterStream()
//
CRealVideoDecoder::CRealVideoDecoder(LPUNKNOWN lpunk, HRESULT* phr)
- : CBaseVideoFilter(NAME("CRealVideoDecoder"), lpunk, phr, __uuidof(this))
- , m_hDrvDll(NULL)
- , m_dwCookie(0)
- , m_lastBuffSizeDim(0)
+ : CBaseVideoFilter(NAME("CRealVideoDecoder"), lpunk, phr, __uuidof(this))
+ , m_hDrvDll(NULL)
+ , m_dwCookie(0)
+ , m_lastBuffSizeDim(0)
{
}
CRealVideoDecoder::~CRealVideoDecoder()
{
- if (m_hDrvDll) {
- FreeLibrary(m_hDrvDll);
- }
+ if (m_hDrvDll) {
+ FreeLibrary(m_hDrvDll);
+ }
}
HRESULT CRealVideoDecoder::InitRV(const CMediaType* pmt)
{
- FreeRV();
+ FreeRV();
- HRESULT hr = VFW_E_TYPE_NOT_ACCEPTED;
+ HRESULT hr = VFW_E_TYPE_NOT_ACCEPTED;
- rvinfo rvi = *(rvinfo*)(pmt->Format() + (pmt->formattype == FORMAT_VideoInfo ? sizeof(VIDEOINFOHEADER) : sizeof(VIDEOINFOHEADER2)));
- rvi.bswap();
+ rvinfo rvi = *(rvinfo*)(pmt->Format() + (pmt->formattype == FORMAT_VideoInfo ? sizeof(VIDEOINFOHEADER) : sizeof(VIDEOINFOHEADER2)));
+ rvi.bswap();
#pragma pack(push, 1)
- struct {
- WORD unk1, w, h, unk3;
- DWORD unk2, subformat, unk5, format;
- } i =
- {11, rvi.w, rvi.h, 0, 0, rvi.type1, 1, rvi.type2};
+ struct {
+ WORD unk1, w, h, unk3;
+ DWORD unk2, subformat, unk5, format;
+ } i =
+ {11, rvi.w, rvi.h, 0, 0, rvi.type1, 1, rvi.type2};
#pragma pack(pop)
- if (FAILED(hr = RVInit(&i, &m_dwCookie))) {
- return hr;
- }
-
- if (rvi.fcc2 <= '03VR' && rvi.type2 >= 0x20200002) {
- int nWidthHeight = (1+((rvi.type1>>16)&7));
- UINT32* pWH = DNew UINT32[nWidthHeight*2];
- pWH[0] = rvi.w;
- pWH[1] = rvi.h;
- for (int i = 2; i < nWidthHeight*2; i++) {
- pWH[i] = rvi.morewh[i-2]*4;
- }
+ if (FAILED(hr = RVInit(&i, &m_dwCookie))) {
+ return hr;
+ }
+
+ if (rvi.fcc2 <= '03VR' && rvi.type2 >= 0x20200002) {
+ int nWidthHeight = (1 + ((rvi.type1 >> 16) & 7));
+ UINT32* pWH = DNew UINT32[nWidthHeight * 2];
+ pWH[0] = rvi.w;
+ pWH[1] = rvi.h;
+ for (int i = 2; i < nWidthHeight * 2; i++) {
+ pWH[i] = rvi.morewh[i - 2] * 4;
+ }
#pragma pack(push, 1)
- struct {
- UINT32 data1;
- UINT32 data2;
- UINT32* dimensions;
- } cmsg_data =
- {0x24, nWidthHeight, pWH};
+ struct {
+ UINT32 data1;
+ UINT32 data2;
+ UINT32* dimensions;
+ } cmsg_data =
+ {0x24, nWidthHeight, pWH};
#pragma pack(pop)
- hr = RVCustomMessage(&cmsg_data, m_dwCookie);
- delete [] pWH;
- }
+ hr = RVCustomMessage(&cmsg_data, m_dwCookie);
+ delete [] pWH;
+ }
- return hr;
+ return hr;
}
void CRealVideoDecoder::FreeRV()
{
- if (m_dwCookie) {
- RVFree(m_dwCookie);
- m_dwCookie = 0;
- }
+ if (m_dwCookie) {
+ RVFree(m_dwCookie);
+ m_dwCookie = 0;
+ }
}
HRESULT CRealVideoDecoder::Transform(IMediaSample* pIn)
{
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- HRESULT hr;
+ HRESULT hr;
- BYTE* pDataIn = NULL;
- if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
- return hr;
- }
+ BYTE* pDataIn = NULL;
+ if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
+ return hr;
+ }
- long len = pIn->GetActualDataLength();
- if (len <= 0) {
- return S_OK; // nothing to do
- }
+ long len = pIn->GetActualDataLength();
+ if (len <= 0) {
+ return S_OK; // nothing to do
+ }
- REFERENCE_TIME rtStart, rtStop;
- pIn->GetTime(&rtStart, &rtStop);
+ REFERENCE_TIME rtStart, rtStop;
+ pIn->GetTime(&rtStart, &rtStop);
- rtStart += m_tStart;
+ rtStart += m_tStart;
- int offset = 1+((*pDataIn)+1)*8;
+ int offset = 1 + ((*pDataIn) + 1) * 8;
#pragma pack(push, 1)
- struct {
- DWORD len, unk1, chunks;
- DWORD* extra;
- DWORD unk2, timestamp;
- } transform_in =
- {len - offset, 0, *pDataIn, (DWORD*)(pDataIn+1), 0, (DWORD)(rtStart/10000)};
- struct {
- DWORD unk1, unk2, timestamp, w, h;
- } transform_out =
- {0,0,0,0,0};
+ struct {
+ DWORD len, unk1, chunks;
+ DWORD* extra;
+ DWORD unk2, timestamp;
+ } transform_in =
+ {len - offset, 0, *pDataIn, (DWORD*)(pDataIn + 1), 0, (DWORD)(rtStart / 10000)};
+ struct {
+ DWORD unk1, unk2, timestamp, w, h;
+ } transform_out =
+ {0, 0, 0, 0, 0};
#pragma pack(pop)
- pDataIn += offset;
-
- if (m_fDropFrames && m_timestamp+1 == transform_in.timestamp) {
- m_timestamp = transform_in.timestamp;
- return S_OK;
- }
-
-
- unsigned int tmp1, tmp2;
- bool interlaced = false, tmp3, tmp4;
- ::GetDimensions_X10(pDataIn, &tmp1, &tmp2, &interlaced, &tmp3, &tmp4);
-
- int size = tmp1*tmp2;
- if ( m_lastBuffSizeDim < size ) {
- _aligned_free(m_pI420);
- _aligned_free(m_pI420Tmp);
-
- m_lastBuffSizeDim = size;
- ATLTRACE("resize out put buff %d" ,size);
- m_pI420 = static_cast<BYTE*>(_aligned_malloc(size*3/2, 16));
- if ( m_pI420 ) {
- ATLTRACE(" m_pI420.Allocated 1" );
- memset(m_pI420, 0, size);
- ATLTRACE(" m_pI420.Allocated 2" );
- memset(m_pI420 + size, 0x80, size/2);
- ATLTRACE(" m_pI420.Allocated 3" );
- } else {
- ATLTRACE(" m_pI420.Allocate fail %d" ,size*3/2);
- return S_OK;
- }
- m_pI420Tmp = static_cast<BYTE*>(_aligned_malloc(size*3/2, 16));
- if ( m_pI420Tmp ) {
- ATLTRACE(" m_pI420Tmp.Allocated 1" );
- memset(m_pI420Tmp, 0, size);
- ATLTRACE(" m_pI420Tmp.Allocated 2" );
- memset(m_pI420Tmp + size, 0x80, size/2);
- ATLTRACE(" m_pI420Tmp.Allocated 3" );
- } else {
- ATLTRACE(" m_pI420Tmp.Allocate fail %d" ,size*3/2);
- return S_OK;
- }
- }
-
- hr = RVTransform(pDataIn, (BYTE*)m_pI420, &transform_in, &transform_out, m_dwCookie);
-
- m_timestamp = transform_in.timestamp;
-
- if (FAILED(hr)) {
- TRACE(_T("RV returned an error code!!!\n"));
- ASSERT(!(transform_out.unk1&1)); // error allowed when the "render" flag is not set
- // return hr;
- }
-
- if (pIn->IsPreroll() == S_OK || rtStart < 0 || !(transform_out.unk1&1)) {
- return S_OK;
- }
-
- CComPtr<IMediaSample> pOut;
- BYTE* pDataOut = NULL;
- if (/*FAILED(hr = GetDeliveryBuffer(transform_out.w, transform_out.h, &pOut)) // TODO
- && */ FAILED(hr = GetDeliveryBuffer(m_w, m_h, &pOut))
- || FAILED(hr = pOut->GetPointer(&pDataOut))) {
- return hr;
- }
-
- BYTE* pI420[3] = {m_pI420, m_pI420Tmp, NULL};
-
- if (interlaced) {
- int size = m_w*m_h;
- DeinterlaceBlend(pI420[1], pI420[0], m_w, m_h, m_w, m_w);
- DeinterlaceBlend(pI420[1]+size, pI420[0]+size, m_w/2, m_h/2, m_w/2, m_w/2);
- DeinterlaceBlend(pI420[1]+size*5/4, pI420[0]+size*5/4, m_w/2, m_h/2, m_w/2, m_w/2);
- pI420[2] = pI420[1], pI420[1] = pI420[0], pI420[0] = pI420[2];
- }
-
- if (transform_out.w != m_w || transform_out.h != m_h) {
- Resize(pI420[0], transform_out.w, transform_out.h, pI420[1], m_w, m_h);
- // only one of these can be true, and when it happens the result image must be in the tmp buffer
- if (transform_out.w == m_w || transform_out.h == m_h) {
- pI420[2] = pI420[1], pI420[1] = pI420[0], pI420[0] = pI420[2];
- }
- }
-
- rtStart = 10000i64*transform_out.timestamp - m_tStart;
- rtStop = rtStart + 1;
- pOut->SetTime(&rtStart, /*NULL*/&rtStop);
-
- pOut->SetDiscontinuity(pIn->IsDiscontinuity() == S_OK);
-
- CopyBuffer(pDataOut, pI420[0], m_w, m_h, m_w, MEDIASUBTYPE_I420);
-
- DbgLog((LOG_TRACE, 0, _T("V: rtStart=%I64d, rtStop=%I64d, disc=%d, sync=%d"),
- rtStart, rtStop, pOut->IsDiscontinuity() == S_OK, pOut->IsSyncPoint() == S_OK));
-
- return m_pOutput->Deliver(pOut);
+ pDataIn += offset;
+
+ if (m_fDropFrames && m_timestamp + 1 == transform_in.timestamp) {
+ m_timestamp = transform_in.timestamp;
+ return S_OK;
+ }
+
+
+ unsigned int tmp1, tmp2;
+ bool interlaced = false, tmp3, tmp4;
+ ::GetDimensions_X10(pDataIn, &tmp1, &tmp2, &interlaced, &tmp3, &tmp4);
+
+ int size = tmp1 * tmp2;
+ if (m_lastBuffSizeDim < size) {
+ _aligned_free(m_pI420);
+ _aligned_free(m_pI420Tmp);
+
+ m_lastBuffSizeDim = size;
+ ATLTRACE("resize out put buff %d" , size);
+ m_pI420 = static_cast<BYTE*>(_aligned_malloc(size * 3 / 2, 16));
+ if (m_pI420) {
+ ATLTRACE(" m_pI420.Allocated 1");
+ memset(m_pI420, 0, size);
+ ATLTRACE(" m_pI420.Allocated 2");
+ memset(m_pI420 + size, 0x80, size / 2);
+ ATLTRACE(" m_pI420.Allocated 3");
+ } else {
+ ATLTRACE(" m_pI420.Allocate fail %d" , size * 3 / 2);
+ return S_OK;
+ }
+ m_pI420Tmp = static_cast<BYTE*>(_aligned_malloc(size * 3 / 2, 16));
+ if (m_pI420Tmp) {
+ ATLTRACE(" m_pI420Tmp.Allocated 1");
+ memset(m_pI420Tmp, 0, size);
+ ATLTRACE(" m_pI420Tmp.Allocated 2");
+ memset(m_pI420Tmp + size, 0x80, size / 2);
+ ATLTRACE(" m_pI420Tmp.Allocated 3");
+ } else {
+ ATLTRACE(" m_pI420Tmp.Allocate fail %d" , size * 3 / 2);
+ return S_OK;
+ }
+ }
+
+ hr = RVTransform(pDataIn, (BYTE*)m_pI420, &transform_in, &transform_out, m_dwCookie);
+
+ m_timestamp = transform_in.timestamp;
+
+ if (FAILED(hr)) {
+ TRACE(_T("RV returned an error code!!!\n"));
+ ASSERT(!(transform_out.unk1 & 1)); // error allowed when the "render" flag is not set
+ // return hr;
+ }
+
+ if (pIn->IsPreroll() == S_OK || rtStart < 0 || !(transform_out.unk1 & 1)) {
+ return S_OK;
+ }
+
+ CComPtr<IMediaSample> pOut;
+ BYTE* pDataOut = NULL;
+ if (/*FAILED(hr = GetDeliveryBuffer(transform_out.w, transform_out.h, &pOut)) // TODO
+ && */ FAILED(hr = GetDeliveryBuffer(m_w, m_h, &pOut))
+ || FAILED(hr = pOut->GetPointer(&pDataOut))) {
+ return hr;
+ }
+
+ BYTE* pI420[3] = {m_pI420, m_pI420Tmp, NULL};
+
+ if (interlaced) {
+ int size = m_w * m_h;
+ DeinterlaceBlend(pI420[1], pI420[0], m_w, m_h, m_w, m_w);
+ DeinterlaceBlend(pI420[1] + size, pI420[0] + size, m_w / 2, m_h / 2, m_w / 2, m_w / 2);
+ DeinterlaceBlend(pI420[1] + size * 5 / 4, pI420[0] + size * 5 / 4, m_w / 2, m_h / 2, m_w / 2, m_w / 2);
+ pI420[2] = pI420[1], pI420[1] = pI420[0], pI420[0] = pI420[2];
+ }
+
+ if (transform_out.w != m_w || transform_out.h != m_h) {
+ Resize(pI420[0], transform_out.w, transform_out.h, pI420[1], m_w, m_h);
+ // only one of these can be true, and when it happens the result image must be in the tmp buffer
+ if (transform_out.w == m_w || transform_out.h == m_h) {
+ pI420[2] = pI420[1], pI420[1] = pI420[0], pI420[0] = pI420[2];
+ }
+ }
+
+ rtStart = 10000i64 * transform_out.timestamp - m_tStart;
+ rtStop = rtStart + 1;
+ pOut->SetTime(&rtStart, /*NULL*/&rtStop);
+
+ pOut->SetDiscontinuity(pIn->IsDiscontinuity() == S_OK);
+
+ CopyBuffer(pDataOut, pI420[0], m_w, m_h, m_w, MEDIASUBTYPE_I420);
+
+ DbgLog((LOG_TRACE, 0, _T("V: rtStart=%I64d, rtStop=%I64d, disc=%d, sync=%d"),
+ rtStart, rtStop, pOut->IsDiscontinuity() == S_OK, pOut->IsSyncPoint() == S_OK));
+
+ return m_pOutput->Deliver(pOut);
}
void CRealVideoDecoder::Resize(BYTE* pIn, DWORD wi, DWORD hi, BYTE* pOut, DWORD wo, DWORD ho)
{
- int si = wi*hi, so = wo*ho;
- ASSERT(((si*so)&3) == 0);
-
- if (wi < wo) {
- ResizeWidth(pIn, wi, hi, pOut, wo, ho);
- ResizeWidth(pIn + si, wi/2, hi/2, pOut + so, wo/2, ho/2);
- ResizeWidth(pIn + si + si/4, wi/2, hi/2, pOut + so + so/4, wo/2, ho/2);
- if (hi == ho) {
- return;
- }
- ResizeHeight(pOut, wo, hi, pIn, wo, ho);
- ResizeHeight(pOut + so, wo/2, hi/2, pIn + so, wo/2, ho/2);
- ResizeHeight(pOut + so + so/4, wo/2, hi/2, pIn + so + so/4, wo/2, ho/2);
- } else if (hi < ho) {
- ResizeHeight(pIn, wi, hi, pOut, wo, ho);
- ResizeHeight(pIn + si, wi/2, hi/2, pOut + so, wo/2, ho/2);
- ResizeHeight(pIn + si + si/4, wi/2, hi/2, pOut + so + so/4, wo/2, ho/2);
- if (wi == wo) {
- return;
- }
- ASSERT(0); // this is uncreachable code, but anyway... looks nice being so symmetric
- ResizeWidth(pOut, wi, ho, pIn, wo, ho);
- ResizeWidth(pOut + so, wi/2, ho/2, pIn + so, wo/2, ho/2);
- ResizeWidth(pOut + so + so/4, wi/2, ho/2, pIn + so + so/4, wo/2, ho/2);
- }
+ int si = wi * hi, so = wo * ho;
+ ASSERT(((si * so) & 3) == 0);
+
+ if (wi < wo) {
+ ResizeWidth(pIn, wi, hi, pOut, wo, ho);
+ ResizeWidth(pIn + si, wi / 2, hi / 2, pOut + so, wo / 2, ho / 2);
+ ResizeWidth(pIn + si + si / 4, wi / 2, hi / 2, pOut + so + so / 4, wo / 2, ho / 2);
+ if (hi == ho) {
+ return;
+ }
+ ResizeHeight(pOut, wo, hi, pIn, wo, ho);
+ ResizeHeight(pOut + so, wo / 2, hi / 2, pIn + so, wo / 2, ho / 2);
+ ResizeHeight(pOut + so + so / 4, wo / 2, hi / 2, pIn + so + so / 4, wo / 2, ho / 2);
+ } else if (hi < ho) {
+ ResizeHeight(pIn, wi, hi, pOut, wo, ho);
+ ResizeHeight(pIn + si, wi / 2, hi / 2, pOut + so, wo / 2, ho / 2);
+ ResizeHeight(pIn + si + si / 4, wi / 2, hi / 2, pOut + so + so / 4, wo / 2, ho / 2);
+ if (wi == wo) {
+ return;
+ }
+ ASSERT(0); // this is uncreachable code, but anyway... looks nice being so symmetric
+ ResizeWidth(pOut, wi, ho, pIn, wo, ho);
+ ResizeWidth(pOut + so, wi / 2, ho / 2, pIn + so, wo / 2, ho / 2);
+ ResizeWidth(pOut + so + so / 4, wi / 2, ho / 2, pIn + so + so / 4, wo / 2, ho / 2);
+ }
}
void CRealVideoDecoder::ResizeWidth(BYTE* pIn, DWORD wi, DWORD hi, BYTE* pOut, DWORD wo, DWORD ho)
{
- for (DWORD y = 0; y < hi; y++, pIn += wi, pOut += wo) {
- if (wi == wo) {
- memcpy(pOut, pIn, wo);
- } else {
- ResizeRow(pIn, wi, 1, pOut, wo, 1);
- }
- }
+ for (DWORD y = 0; y < hi; y++, pIn += wi, pOut += wo) {
+ if (wi == wo) {
+ memcpy(pOut, pIn, wo);
+ } else {
+ ResizeRow(pIn, wi, 1, pOut, wo, 1);
+ }
+ }
}
void CRealVideoDecoder::ResizeHeight(BYTE* pIn, DWORD wi, DWORD hi, BYTE* pOut, DWORD wo, DWORD ho)
{
- if (hi == ho) {
- memcpy(pOut, pIn, wo*ho);
- } else {
- for (DWORD x = 0; x < wo; x++, pIn++, pOut++) {
- ResizeRow(pIn, hi, wo, pOut, ho, wo);
- }
- }
+ if (hi == ho) {
+ memcpy(pOut, pIn, wo * ho);
+ } else {
+ for (DWORD x = 0; x < wo; x++, pIn++, pOut++) {
+ ResizeRow(pIn, hi, wo, pOut, ho, wo);
+ }
+ }
}
void CRealVideoDecoder::ResizeRow(BYTE* pIn, DWORD wi, DWORD dpi, BYTE* pOut, DWORD wo, DWORD dpo)
{
- ASSERT(wi < wo);
-
- if (dpo == 1) {
- for (DWORD i = 0, j = 0, dj = (wi<<16)/wo; i < wo-1; i++, pOut++, j += dj)
- // pOut[i] = pIn[j>>16];
- {
- BYTE* p = &pIn[j>>16];
- DWORD jf = j&0xffff;
- *pOut = ((p[0]*(0xffff-jf) + p[1]*jf) + 0x7fff) >> 16;
- }
-
- *pOut = pIn[wi-1];
- } else {
- for (DWORD i = 0, j = 0, dj = (wi<<16)/wo; i < wo-1; i++, pOut += dpo, j += dj)
- // *pOut = pIn[dpi*(j>>16)];
- {
- BYTE* p = &pIn[dpi*(j>>16)];
- DWORD jf = j&0xffff;
- *pOut = ((p[0]*(0xffff-jf) + p[dpi]*jf) + 0x7fff) >> 16;
- }
-
- *pOut = pIn[dpi*(wi-1)];
- }
+ ASSERT(wi < wo);
+
+ if (dpo == 1) {
+ for (DWORD i = 0, j = 0, dj = (wi << 16) / wo; i < wo - 1; i++, pOut++, j += dj)
+ // pOut[i] = pIn[j>>16];
+ {
+ BYTE* p = &pIn[j >> 16];
+ DWORD jf = j & 0xffff;
+ *pOut = ((p[0] * (0xffff - jf) + p[1] * jf) + 0x7fff) >> 16;
+ }
+
+ *pOut = pIn[wi - 1];
+ } else {
+ for (DWORD i = 0, j = 0, dj = (wi << 16) / wo; i < wo - 1; i++, pOut += dpo, j += dj)
+ // *pOut = pIn[dpi*(j>>16)];
+ {
+ BYTE* p = &pIn[dpi * (j >> 16)];
+ DWORD jf = j & 0xffff;
+ *pOut = ((p[0] * (0xffff - jf) + p[dpi] * jf) + 0x7fff) >> 16;
+ }
+
+ *pOut = pIn[dpi * (wi - 1)];
+ }
}
HRESULT CRealVideoDecoder::CheckInputType(const CMediaType* mtIn)
{
- if (mtIn->majortype != MEDIATYPE_Video
- || mtIn->subtype != MEDIASUBTYPE_RV20
- && mtIn->subtype != MEDIASUBTYPE_RV30
- && mtIn->subtype != MEDIASUBTYPE_RV40
- && mtIn->subtype != MEDIASUBTYPE_RV41) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- if (mtIn->formattype == FORMAT_VideoInfo2) {
- VIDEOINFOHEADER2* vih2 = (VIDEOINFOHEADER2*)mtIn->Format();
- if (vih2->dwPictAspectRatioX < (DWORD)vih2->bmiHeader.biWidth
- || vih2->dwPictAspectRatioY < (DWORD)vih2->bmiHeader.biHeight) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- }
-
- if (!m_pInput->IsConnected()) {
- if (m_hDrvDll) {
- FreeLibrary(m_hDrvDll);
- m_hDrvDll = NULL;
- }
-
- CAtlList<CString> paths;
- CString olddll, newdll, oldpath, newpath;
-
- olddll.Format(_T("drv%c3260.dll"), (TCHAR)((mtIn->subtype.Data1>>16)&0xff));
- newdll =
- mtIn->subtype == FOURCCMap('14VR') ? _T("drvi.dll") :
- mtIn->subtype == FOURCCMap('02VR') ? _T("drv2.dll") :
- _T("drvc.dll");
-
- CRegKey key;
- TCHAR buff[_MAX_PATH];
- ULONG len = sizeof(buff);
- if (ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, _T("Software\\RealNetworks\\Preferences\\DT_Codecs"), KEY_READ)
- && ERROR_SUCCESS == key.QueryStringValue(NULL, buff, &len) && _tcslen(buff) > 0) {
- oldpath = buff;
- TCHAR c = oldpath[oldpath.GetLength()-1];
- if (c != '\\' && c != '/') {
- oldpath += '\\';
- }
- key.Close();
- }
- len = sizeof(buff);
- if (ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, _T("Helix\\HelixSDK\\10.0\\Preferences\\DT_Codecs"), KEY_READ)
- && ERROR_SUCCESS == key.QueryStringValue(NULL, buff, &len) && _tcslen(buff) > 0) {
- newpath = buff;
- TCHAR c = newpath[newpath.GetLength()-1];
- if (c != '\\' && c != '/') {
- newpath += '\\';
- }
- key.Close();
- }
-
- if (!newpath.IsEmpty()) {
- paths.AddTail(newpath + newdll);
- }
- if (!oldpath.IsEmpty()) {
- paths.AddTail(oldpath + newdll);
- }
- paths.AddTail(newdll); // default dll paths
- if (!newpath.IsEmpty()) {
- paths.AddTail(newpath + olddll);
- }
- if (!oldpath.IsEmpty()) {
- paths.AddTail(oldpath + olddll);
- }
- paths.AddTail(olddll); // default dll paths
-
- POSITION pos = paths.GetHeadPosition();
- do {
- if (pos) {
- m_hDrvDll = LoadLibrary(paths.GetNext(pos));
- }
- } while (pos && !m_hDrvDll);
-
- if (m_hDrvDll) {
- RVCustomMessage = (PRVCustomMessage)GetProcAddress(m_hDrvDll, "RV20toYUV420CustomMessage");
- RVFree = (PRVFree)GetProcAddress(m_hDrvDll, "RV20toYUV420Free");
- RVHiveMessage = (PRVHiveMessage)GetProcAddress(m_hDrvDll, "RV20toYUV420HiveMessage");
- RVInit = (PRVInit)GetProcAddress(m_hDrvDll, "RV20toYUV420Init");
- RVTransform = (PRVTransform)GetProcAddress(m_hDrvDll, "RV20toYUV420Transform");
-
- if (!RVCustomMessage) {
- RVCustomMessage = (PRVCustomMessage)GetProcAddress(m_hDrvDll, "RV40toYUV420CustomMessage");
- }
- if (!RVFree) {
- RVFree = (PRVFree)GetProcAddress(m_hDrvDll, "RV40toYUV420Free");
- }
- if (!RVHiveMessage) {
- RVHiveMessage = (PRVHiveMessage)GetProcAddress(m_hDrvDll, "RV40toYUV420HiveMessage");
- }
- if (!RVInit) {
- RVInit = (PRVInit)GetProcAddress(m_hDrvDll, "RV40toYUV420Init");
- }
- if (!RVTransform) {
- RVTransform = (PRVTransform)GetProcAddress(m_hDrvDll, "RV40toYUV420Transform");
- }
- }
-
- if (!m_hDrvDll || !RVCustomMessage
- || !RVFree || !RVHiveMessage
- || !RVInit || !RVTransform) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- if (FAILED(InitRV(mtIn))) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- }
-
- return S_OK;
+ if (mtIn->majortype != MEDIATYPE_Video
+ || mtIn->subtype != MEDIASUBTYPE_RV20
+ && mtIn->subtype != MEDIASUBTYPE_RV30
+ && mtIn->subtype != MEDIASUBTYPE_RV40
+ && mtIn->subtype != MEDIASUBTYPE_RV41) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ if (mtIn->formattype == FORMAT_VideoInfo2) {
+ VIDEOINFOHEADER2* vih2 = (VIDEOINFOHEADER2*)mtIn->Format();
+ if (vih2->dwPictAspectRatioX < (DWORD)vih2->bmiHeader.biWidth
+ || vih2->dwPictAspectRatioY < (DWORD)vih2->bmiHeader.biHeight) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ }
+
+ if (!m_pInput->IsConnected()) {
+ if (m_hDrvDll) {
+ FreeLibrary(m_hDrvDll);
+ m_hDrvDll = NULL;
+ }
+
+ CAtlList<CString> paths;
+ CString olddll, newdll, oldpath, newpath;
+
+ olddll.Format(_T("drv%c3260.dll"), (TCHAR)((mtIn->subtype.Data1 >> 16) & 0xff));
+ newdll =
+ mtIn->subtype == FOURCCMap('14VR') ? _T("drvi.dll") :
+ mtIn->subtype == FOURCCMap('02VR') ? _T("drv2.dll") :
+ _T("drvc.dll");
+
+ CRegKey key;
+ TCHAR buff[_MAX_PATH];
+ ULONG len = sizeof(buff);
+ if (ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, _T("Software\\RealNetworks\\Preferences\\DT_Codecs"), KEY_READ)
+ && ERROR_SUCCESS == key.QueryStringValue(NULL, buff, &len) && _tcslen(buff) > 0) {
+ oldpath = buff;
+ TCHAR c = oldpath[oldpath.GetLength() - 1];
+ if (c != '\\' && c != '/') {
+ oldpath += '\\';
+ }
+ key.Close();
+ }
+ len = sizeof(buff);
+ if (ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, _T("Helix\\HelixSDK\\10.0\\Preferences\\DT_Codecs"), KEY_READ)
+ && ERROR_SUCCESS == key.QueryStringValue(NULL, buff, &len) && _tcslen(buff) > 0) {
+ newpath = buff;
+ TCHAR c = newpath[newpath.GetLength() - 1];
+ if (c != '\\' && c != '/') {
+ newpath += '\\';
+ }
+ key.Close();
+ }
+
+ if (!newpath.IsEmpty()) {
+ paths.AddTail(newpath + newdll);
+ }
+ if (!oldpath.IsEmpty()) {
+ paths.AddTail(oldpath + newdll);
+ }
+ paths.AddTail(newdll); // default dll paths
+ if (!newpath.IsEmpty()) {
+ paths.AddTail(newpath + olddll);
+ }
+ if (!oldpath.IsEmpty()) {
+ paths.AddTail(oldpath + olddll);
+ }
+ paths.AddTail(olddll); // default dll paths
+
+ POSITION pos = paths.GetHeadPosition();
+ do {
+ if (pos) {
+ m_hDrvDll = LoadLibrary(paths.GetNext(pos));
+ }
+ } while (pos && !m_hDrvDll);
+
+ if (m_hDrvDll) {
+ RVCustomMessage = (PRVCustomMessage)GetProcAddress(m_hDrvDll, "RV20toYUV420CustomMessage");
+ RVFree = (PRVFree)GetProcAddress(m_hDrvDll, "RV20toYUV420Free");
+ RVHiveMessage = (PRVHiveMessage)GetProcAddress(m_hDrvDll, "RV20toYUV420HiveMessage");
+ RVInit = (PRVInit)GetProcAddress(m_hDrvDll, "RV20toYUV420Init");
+ RVTransform = (PRVTransform)GetProcAddress(m_hDrvDll, "RV20toYUV420Transform");
+
+ if (!RVCustomMessage) {
+ RVCustomMessage = (PRVCustomMessage)GetProcAddress(m_hDrvDll, "RV40toYUV420CustomMessage");
+ }
+ if (!RVFree) {
+ RVFree = (PRVFree)GetProcAddress(m_hDrvDll, "RV40toYUV420Free");
+ }
+ if (!RVHiveMessage) {
+ RVHiveMessage = (PRVHiveMessage)GetProcAddress(m_hDrvDll, "RV40toYUV420HiveMessage");
+ }
+ if (!RVInit) {
+ RVInit = (PRVInit)GetProcAddress(m_hDrvDll, "RV40toYUV420Init");
+ }
+ if (!RVTransform) {
+ RVTransform = (PRVTransform)GetProcAddress(m_hDrvDll, "RV40toYUV420Transform");
+ }
+ }
+
+ if (!m_hDrvDll || !RVCustomMessage
+ || !RVFree || !RVHiveMessage
+ || !RVInit || !RVTransform) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ if (FAILED(InitRV(mtIn))) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ }
+
+ return S_OK;
}
HRESULT CRealVideoDecoder::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut)
{
- if (m_pOutput && m_pOutput->IsConnected()) {
- BITMAPINFOHEADER bih1, bih2;
- if (ExtractBIH(mtOut, &bih1) && ExtractBIH(&m_pOutput->CurrentMediaType(), &bih2)
- && abs(bih1.biHeight) != abs(bih2.biHeight)) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- }
-
- return __super::CheckTransform(mtIn, mtOut);
+ if (m_pOutput && m_pOutput->IsConnected()) {
+ BITMAPINFOHEADER bih1, bih2;
+ if (ExtractBIH(mtOut, &bih1) && ExtractBIH(&m_pOutput->CurrentMediaType(), &bih2)
+ && abs(bih1.biHeight) != abs(bih2.biHeight)) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ }
+
+ return __super::CheckTransform(mtIn, mtOut);
}
HRESULT CRealVideoDecoder::StartStreaming()
{
- const CMediaType& mt = m_pInput->CurrentMediaType();
- if (FAILED(InitRV(&mt))) {
- return E_FAIL;
- }
-
- int size = m_w*m_h;
- m_lastBuffSizeDim = size;
- m_pI420 = static_cast<BYTE*>(_aligned_malloc(size*3/2, 16));
- memset(m_pI420, 0, size);
- memset(m_pI420 + size, 0x80, size/2);
- m_pI420Tmp = static_cast<BYTE*>(_aligned_malloc(size*3/2, 16));
- memset(m_pI420Tmp, 0, size);
- memset(m_pI420Tmp + size, 0x80, size/2);
-
- return __super::StartStreaming();
+ const CMediaType& mt = m_pInput->CurrentMediaType();
+ if (FAILED(InitRV(&mt))) {
+ return E_FAIL;
+ }
+
+ int size = m_w * m_h;
+ m_lastBuffSizeDim = size;
+ m_pI420 = static_cast<BYTE*>(_aligned_malloc(size * 3 / 2, 16));
+ memset(m_pI420, 0, size);
+ memset(m_pI420 + size, 0x80, size / 2);
+ m_pI420Tmp = static_cast<BYTE*>(_aligned_malloc(size * 3 / 2, 16));
+ memset(m_pI420Tmp, 0, size);
+ memset(m_pI420Tmp + size, 0x80, size / 2);
+
+ return __super::StartStreaming();
}
HRESULT CRealVideoDecoder::StopStreaming()
{
- _aligned_free(m_pI420);
- _aligned_free(m_pI420Tmp);
+ _aligned_free(m_pI420);
+ _aligned_free(m_pI420Tmp);
- FreeRV();
+ FreeRV();
- return __super::StopStreaming();
+ return __super::StopStreaming();
}
HRESULT CRealVideoDecoder::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- m_timestamp = (DWORD)~0;
- m_fDropFrames = false;
+ m_timestamp = (DWORD)~0;
+ m_fDropFrames = false;
- DWORD tmp[2] = {20, 0};
- RVHiveMessage(tmp, m_dwCookie);
+ DWORD tmp[2] = {20, 0};
+ RVHiveMessage(tmp, m_dwCookie);
- m_tStart = tStart;
- return __super::NewSegment(tStart, tStop, dRate);
+ m_tStart = tStart;
+ return __super::NewSegment(tStart, tStop, dRate);
}
HRESULT CRealVideoDecoder::AlterQuality(Quality q)
{
- if (q.Late > 500*10000i64) {
- m_fDropFrames = true;
- }
- if (q.Late <= 0) {
- m_fDropFrames = false;
- }
- // TRACE(_T("CRealVideoDecoder::AlterQuality: Type=%d, Proportion=%d, Late=%I64d, TimeStamp=%I64d\n"), q.Type, q.Proportion, q.Late, q.TimeStamp);
- return E_NOTIMPL;
+ if (q.Late > 500 * 10000i64) {
+ m_fDropFrames = true;
+ }
+ if (q.Late <= 0) {
+ m_fDropFrames = false;
+ }
+ // TRACE(_T("CRealVideoDecoder::AlterQuality: Type=%d, Proportion=%d, Late=%I64d, TimeStamp=%I64d\n"), q.Type, q.Proportion, q.Late, q.TimeStamp);
+ return E_NOTIMPL;
}
/////////////////////////
@@ -2087,569 +2087,569 @@ HRESULT CRealVideoDecoder::AlterQuality(Quality q)
//
CRealAudioDecoder::CRealAudioDecoder(LPUNKNOWN lpunk, HRESULT* phr)
- : CTransformFilter(NAME("CRealAudioDecoder"), lpunk, __uuidof(this))
- , m_hDrvDll(NULL)
- , m_dwCookie(0)
+ : CTransformFilter(NAME("CRealAudioDecoder"), lpunk, __uuidof(this))
+ , m_hDrvDll(NULL)
+ , m_dwCookie(0)
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
}
CRealAudioDecoder::~CRealAudioDecoder()
{
- // FreeRA();
- if (m_hDrvDll) {
- FreeLibrary(m_hDrvDll);
- }
+ // FreeRA();
+ if (m_hDrvDll) {
+ FreeLibrary(m_hDrvDll);
+ }
}
HRESULT CRealAudioDecoder::InitRA(const CMediaType* pmt)
{
- FreeRA();
+ FreeRA();
- HRESULT hr;
+ HRESULT hr;
- if (RAOpenCodec2 && FAILED(hr = RAOpenCodec2(&m_dwCookie, m_dllpath))
- || RAOpenCodec && FAILED(hr = RAOpenCodec(&m_dwCookie))) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
+ if (RAOpenCodec2 && FAILED(hr = RAOpenCodec2(&m_dwCookie, m_dllpath))
+ || RAOpenCodec && FAILED(hr = RAOpenCodec(&m_dwCookie))) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
- WAVEFORMATEX* pwfe = (WAVEFORMATEX*)pmt->Format();
+ WAVEFORMATEX* pwfe = (WAVEFORMATEX*)pmt->Format();
- // someone might be doing cbSize = sizeof(WAVEFORMATEX), chances of
- // cbSize being really sizeof(WAVEFORMATEX) is less than this,
- // especially with our rm splitter ;)
- DWORD cbSize = pwfe->cbSize;
- if (cbSize == sizeof(WAVEFORMATEX)) {
- ASSERT(0);
- cbSize = 0;
- }
+ // someone might be doing cbSize = sizeof(WAVEFORMATEX), chances of
+ // cbSize being really sizeof(WAVEFORMATEX) is less than this,
+ // especially with our rm splitter ;)
+ DWORD cbSize = pwfe->cbSize;
+ if (cbSize == sizeof(WAVEFORMATEX)) {
+ ASSERT(0);
+ cbSize = 0;
+ }
- WORD wBitsPerSample = pwfe->wBitsPerSample;
- if (!wBitsPerSample) {
- wBitsPerSample = 16;
- }
+ WORD wBitsPerSample = pwfe->wBitsPerSample;
+ if (!wBitsPerSample) {
+ wBitsPerSample = 16;
+ }
#pragma pack(push, 1)
- struct {
- DWORD freq;
- WORD bpsample, channels, quality;
- DWORD bpframe, packetsize, extralen;
- void* extra;
- } initdata = {
- pwfe->nSamplesPerSec, wBitsPerSample, pwfe->nChannels, 100,
- 0, 0, 0, NULL
- };
+ struct {
+ DWORD freq;
+ WORD bpsample, channels, quality;
+ DWORD bpframe, packetsize, extralen;
+ void* extra;
+ } initdata = {
+ pwfe->nSamplesPerSec, wBitsPerSample, pwfe->nChannels, 100,
+ 0, 0, 0, NULL
+ };
#pragma pack(pop)
- CAutoVectorPtr<BYTE> pBuff;
-
- if (pmt->subtype == MEDIASUBTYPE_AAC) {
- pBuff.Allocate(cbSize+1);
- pBuff[0] = 0x02;
- memcpy(pBuff+1, pwfe+1, cbSize);
- initdata.extralen = cbSize+1;
- initdata.extra = pBuff;
- } else {
- if (pmt->FormatLength() <= sizeof(WAVEFORMATEX) + cbSize) { // must have type_specific_data appended
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- BYTE* fmt = pmt->Format() + sizeof(WAVEFORMATEX) + cbSize;
-
- for (int i = 0, len = pmt->FormatLength() - (sizeof(WAVEFORMATEX) + cbSize); i < len-4; i++, fmt++) {
- if (fmt[0] == '.' || fmt[1] == 'r' || fmt[2] == 'a') {
- break;
- }
- }
-
- m_rai = *(rainfo*)fmt;
- m_rai.bswap();
-
- BYTE* p;
-
- if (m_rai.version2 == 4) {
- p = (BYTE*)((rainfo4*)fmt+1);
- int len = *p++;
- p += len;
- len = *p++;
- p += len;
- ASSERT(len == 4);
- } else if (m_rai.version2 == 5) {
- p = (BYTE*)((rainfo5*)fmt+1);
- } else {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- p += 3;
- if (m_rai.version2 == 5) {
- p++;
- }
-
- initdata.bpframe = m_rai.sub_packet_size;
- initdata.packetsize = m_rai.coded_frame_size;
- initdata.extralen = min((pmt->Format() + pmt->FormatLength()) - (p + 4), (LONG)*(DWORD*)p);
- initdata.extra = p + 4;
- }
-
- if (FAILED(hr = RAInitDecoder(m_dwCookie, &initdata))) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- if (RASetPwd) {
- RASetPwd(m_dwCookie, "Ardubancel Quazanga");
- }
-
- if (RASetFlavor && FAILED(hr = RASetFlavor(m_dwCookie, m_rai.flavor))) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- return S_OK;
+ CAutoVectorPtr<BYTE> pBuff;
+
+ if (pmt->subtype == MEDIASUBTYPE_AAC) {
+ pBuff.Allocate(cbSize + 1);
+ pBuff[0] = 0x02;
+ memcpy(pBuff + 1, pwfe + 1, cbSize);
+ initdata.extralen = cbSize + 1;
+ initdata.extra = pBuff;
+ } else {
+ if (pmt->FormatLength() <= sizeof(WAVEFORMATEX) + cbSize) { // must have type_specific_data appended
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ BYTE* fmt = pmt->Format() + sizeof(WAVEFORMATEX) + cbSize;
+
+ for (int i = 0, len = pmt->FormatLength() - (sizeof(WAVEFORMATEX) + cbSize); i < len - 4; i++, fmt++) {
+ if (fmt[0] == '.' || fmt[1] == 'r' || fmt[2] == 'a') {
+ break;
+ }
+ }
+
+ m_rai = *(rainfo*)fmt;
+ m_rai.bswap();
+
+ BYTE* p;
+
+ if (m_rai.version2 == 4) {
+ p = (BYTE*)((rainfo4*)fmt + 1);
+ int len = *p++;
+ p += len;
+ len = *p++;
+ p += len;
+ ASSERT(len == 4);
+ } else if (m_rai.version2 == 5) {
+ p = (BYTE*)((rainfo5*)fmt + 1);
+ } else {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ p += 3;
+ if (m_rai.version2 == 5) {
+ p++;
+ }
+
+ initdata.bpframe = m_rai.sub_packet_size;
+ initdata.packetsize = m_rai.coded_frame_size;
+ initdata.extralen = min((pmt->Format() + pmt->FormatLength()) - (p + 4), (LONG) * (DWORD*)p);
+ initdata.extra = p + 4;
+ }
+
+ if (FAILED(hr = RAInitDecoder(m_dwCookie, &initdata))) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ if (RASetPwd) {
+ RASetPwd(m_dwCookie, "Ardubancel Quazanga");
+ }
+
+ if (RASetFlavor && FAILED(hr = RASetFlavor(m_dwCookie, m_rai.flavor))) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ return S_OK;
}
void CRealAudioDecoder::FreeRA()
{
- if (m_dwCookie) {
- RAFreeDecoder(m_dwCookie);
- RACloseCodec(m_dwCookie);
- m_dwCookie = 0;
- }
+ if (m_dwCookie) {
+ RAFreeDecoder(m_dwCookie);
+ RACloseCodec(m_dwCookie);
+ m_dwCookie = 0;
+ }
}
HRESULT CRealAudioDecoder::Receive(IMediaSample* pIn)
{
- CAutoLock cAutoLock(&m_csReceive);
-
- HRESULT hr;
-
- AM_SAMPLE2_PROPERTIES* const pProps = m_pInput->SampleProps();
- if (pProps->dwStreamId != AM_STREAM_MEDIA) {
- return m_pOutput->Deliver(pIn);
- }
-
- BYTE* pDataIn = NULL;
- if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
- return hr;
- }
- BYTE* pDataInOrg = pDataIn;
- UNREFERENCED_PARAMETER(pDataInOrg);
-
- long len = pIn->GetActualDataLength();
- if (len <= 0) {
- return S_OK;
- }
-
- REFERENCE_TIME rtStart, rtStop;
- pIn->GetTime(&rtStart, &rtStop);
- /*
- if (pIn->IsPreroll() == S_OK || rtStart < 0)
- return S_OK;
- */
-
- if (S_OK == pIn->IsSyncPoint()) {
- m_bufflen = 0;
- m_rtBuffStart = rtStart;
- m_fBuffDiscontinuity = pIn->IsDiscontinuity() == S_OK;
- }
-
- BYTE* src = NULL;
- BYTE* dst = NULL;
-
- int w = m_rai.coded_frame_size;
- int h = m_rai.sub_packet_h;
- int sps = m_rai.sub_packet_size;
-
- if (m_pInput->CurrentMediaType().subtype == MEDIASUBTYPE_RAAC
- || m_pInput->CurrentMediaType().subtype == MEDIASUBTYPE_RACP
- || m_pInput->CurrentMediaType().subtype == MEDIASUBTYPE_AAC) {
- src = pDataIn;
- dst = pDataIn + len;
- w = len;
- } else {
- memcpy(&m_buff[m_bufflen], pDataIn, len);
- m_bufflen += len;
-
- len = w*h;
-
- if (m_bufflen >= len) {
- ASSERT(m_bufflen == len);
-
- src = m_buff;
- dst = m_buff + len;
-
- if (sps > 0
- && (m_pInput->CurrentMediaType().subtype == MEDIASUBTYPE_COOK
- || m_pInput->CurrentMediaType().subtype == MEDIASUBTYPE_ATRC)) {
- for (int y = 0; y < h; y++) {
- for (int x = 0, w2 = w / sps; x < w2; x++) {
- // TRACE(_T("--- %d, %d\n"), (h*x+((h+1)/2)*(y&1)+(y>>1)), sps*(h*x+((h+1)/2)*(y&1)+(y>>1)));
- memcpy(dst + sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), src, sps);
- src += sps;
- }
- }
-
- src = m_buff + len;
- dst = m_buff + len*2;
- } else if (m_pInput->CurrentMediaType().subtype == MEDIASUBTYPE_SIPR) {
- // http://mplayerhq.hu/pipermail/mplayer-dev-eng/2002-August/010569.html
-
- static BYTE sipr_swaps[38][2]= {
- {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68},
- {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46},
- {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56},
- {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83},
- {77,80}
- };
-
- int bs=h*w*2/96; // nibbles per subpacket
- for (int n=0; n<38; n++) {
- int i=bs*sipr_swaps[n][0];
- int o=bs*sipr_swaps[n][1];
- // swap nibbles of block 'i' with 'o' TODO: optimize
- for (int j=0; j<bs; j++) {
- int x=(i&1) ? (src[(i>>1)]>>4) : (src[(i>>1)]&15);
- int y=(o&1) ? (src[(o>>1)]>>4) : (src[(o>>1)]&15);
- if (o&1) {
- src[(o>>1)]=(src[(o>>1)]&0x0F)|(x<<4);
- } else {
- src[(o>>1)]=(src[(o>>1)]&0xF0)|x;
- }
- if (i&1) {
- src[(i>>1)]=(src[(i>>1)]&0x0F)|(y<<4);
- } else {
- src[(i>>1)]=(src[(i>>1)]&0xF0)|y;
- }
- ++i;
- ++o;
- }
- }
- }
-
- m_bufflen = 0;
- }
- }
-
- rtStart = m_rtBuffStart;
-
- for (; src < dst; src += w) {
- CComPtr<IMediaSample> pOut;
- BYTE* pDataOut = NULL;
- if (FAILED(hr = m_pOutput->GetDeliveryBuffer(&pOut, NULL, NULL, 0))
- || FAILED(hr = pOut->GetPointer(&pDataOut))) {
- return hr;
- }
-
- AM_MEDIA_TYPE* pmt;
- if (SUCCEEDED(pOut->GetMediaType(&pmt)) && pmt) {
- CMediaType mt(*pmt);
- m_pOutput->SetMediaType(&mt);
- DeleteMediaType(pmt);
- }
-
- hr = RADecode(m_dwCookie, src, w, pDataOut, &len, -1);
-
- if (FAILED(hr)) {
- TRACE(_T("RA returned an error code!!!\n"));
- continue;
- // return hr;
- }
-
- WAVEFORMATEX* pwfe = (WAVEFORMATEX*)m_pOutput->CurrentMediaType().Format();
-
- rtStop = rtStart + 1000i64*len/pwfe->nAvgBytesPerSec*10000;
- pOut->SetTime(&rtStart, &rtStop);
- pOut->SetMediaTime(NULL, NULL);
-
- pOut->SetDiscontinuity(m_fBuffDiscontinuity);
- m_fBuffDiscontinuity = false;
- pOut->SetSyncPoint(TRUE);
-
- pOut->SetActualDataLength(len);
-
- DbgLog((LOG_TRACE, 0, _T("A: rtStart=%I64d, rtStop=%I64d, disc=%d, sync=%d"),
- rtStart, rtStop, pOut->IsDiscontinuity() == S_OK, pOut->IsSyncPoint() == S_OK));
-
- if (rtStart >= 0 && S_OK != (hr = m_pOutput->Deliver(pOut))) {
- return hr;
- }
-
- rtStart = rtStop;
- }
-
- m_rtBuffStart = rtStart;
-
- return S_OK;
+ CAutoLock cAutoLock(&m_csReceive);
+
+ HRESULT hr;
+
+ AM_SAMPLE2_PROPERTIES* const pProps = m_pInput->SampleProps();
+ if (pProps->dwStreamId != AM_STREAM_MEDIA) {
+ return m_pOutput->Deliver(pIn);
+ }
+
+ BYTE* pDataIn = NULL;
+ if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
+ return hr;
+ }
+ BYTE* pDataInOrg = pDataIn;
+ UNREFERENCED_PARAMETER(pDataInOrg);
+
+ long len = pIn->GetActualDataLength();
+ if (len <= 0) {
+ return S_OK;
+ }
+
+ REFERENCE_TIME rtStart, rtStop;
+ pIn->GetTime(&rtStart, &rtStop);
+ /*
+ if (pIn->IsPreroll() == S_OK || rtStart < 0)
+ return S_OK;
+ */
+
+ if (S_OK == pIn->IsSyncPoint()) {
+ m_bufflen = 0;
+ m_rtBuffStart = rtStart;
+ m_fBuffDiscontinuity = pIn->IsDiscontinuity() == S_OK;
+ }
+
+ BYTE* src = NULL;
+ BYTE* dst = NULL;
+
+ int w = m_rai.coded_frame_size;
+ int h = m_rai.sub_packet_h;
+ int sps = m_rai.sub_packet_size;
+
+ if (m_pInput->CurrentMediaType().subtype == MEDIASUBTYPE_RAAC
+ || m_pInput->CurrentMediaType().subtype == MEDIASUBTYPE_RACP
+ || m_pInput->CurrentMediaType().subtype == MEDIASUBTYPE_AAC) {
+ src = pDataIn;
+ dst = pDataIn + len;
+ w = len;
+ } else {
+ memcpy(&m_buff[m_bufflen], pDataIn, len);
+ m_bufflen += len;
+
+ len = w * h;
+
+ if (m_bufflen >= len) {
+ ASSERT(m_bufflen == len);
+
+ src = m_buff;
+ dst = m_buff + len;
+
+ if (sps > 0
+ && (m_pInput->CurrentMediaType().subtype == MEDIASUBTYPE_COOK
+ || m_pInput->CurrentMediaType().subtype == MEDIASUBTYPE_ATRC)) {
+ for (int y = 0; y < h; y++) {
+ for (int x = 0, w2 = w / sps; x < w2; x++) {
+ // TRACE(_T("--- %d, %d\n"), (h*x+((h+1)/2)*(y&1)+(y>>1)), sps*(h*x+((h+1)/2)*(y&1)+(y>>1)));
+ memcpy(dst + sps * (h * x + ((h + 1) / 2) * (y & 1) + (y >> 1)), src, sps);
+ src += sps;
+ }
+ }
+
+ src = m_buff + len;
+ dst = m_buff + len * 2;
+ } else if (m_pInput->CurrentMediaType().subtype == MEDIASUBTYPE_SIPR) {
+ // http://mplayerhq.hu/pipermail/mplayer-dev-eng/2002-August/010569.html
+
+ static BYTE sipr_swaps[38][2] = {
+ {0, 63}, {1, 22}, {2, 44}, {3, 90}, {5, 81}, {7, 31}, {8, 86}, {9, 58}, {10, 36}, {12, 68},
+ {13, 39}, {14, 73}, {15, 53}, {16, 69}, {17, 57}, {19, 88}, {20, 34}, {21, 71}, {24, 46},
+ {25, 94}, {26, 54}, {28, 75}, {29, 50}, {32, 70}, {33, 92}, {35, 74}, {38, 85}, {40, 56},
+ {42, 87}, {43, 65}, {45, 59}, {48, 79}, {49, 93}, {51, 89}, {55, 95}, {61, 76}, {67, 83},
+ {77, 80}
+ };
+
+ int bs = h * w * 2 / 96; // nibbles per subpacket
+ for (int n = 0; n < 38; n++) {
+ int i = bs * sipr_swaps[n][0];
+ int o = bs * sipr_swaps[n][1];
+ // swap nibbles of block 'i' with 'o' TODO: optimize
+ for (int j = 0; j < bs; j++) {
+ int x = (i & 1) ? (src[(i >> 1)] >> 4) : (src[(i >> 1)] & 15);
+ int y = (o & 1) ? (src[(o >> 1)] >> 4) : (src[(o >> 1)] & 15);
+ if (o & 1) {
+ src[(o >> 1)] = (src[(o >> 1)] & 0x0F) | (x << 4);
+ } else {
+ src[(o >> 1)] = (src[(o >> 1)] & 0xF0) | x;
+ }
+ if (i & 1) {
+ src[(i >> 1)] = (src[(i >> 1)] & 0x0F) | (y << 4);
+ } else {
+ src[(i >> 1)] = (src[(i >> 1)] & 0xF0) | y;
+ }
+ ++i;
+ ++o;
+ }
+ }
+ }
+
+ m_bufflen = 0;
+ }
+ }
+
+ rtStart = m_rtBuffStart;
+
+ for (; src < dst; src += w) {
+ CComPtr<IMediaSample> pOut;
+ BYTE* pDataOut = NULL;
+ if (FAILED(hr = m_pOutput->GetDeliveryBuffer(&pOut, NULL, NULL, 0))
+ || FAILED(hr = pOut->GetPointer(&pDataOut))) {
+ return hr;
+ }
+
+ AM_MEDIA_TYPE* pmt;
+ if (SUCCEEDED(pOut->GetMediaType(&pmt)) && pmt) {
+ CMediaType mt(*pmt);
+ m_pOutput->SetMediaType(&mt);
+ DeleteMediaType(pmt);
+ }
+
+ hr = RADecode(m_dwCookie, src, w, pDataOut, &len, -1);
+
+ if (FAILED(hr)) {
+ TRACE(_T("RA returned an error code!!!\n"));
+ continue;
+ // return hr;
+ }
+
+ WAVEFORMATEX* pwfe = (WAVEFORMATEX*)m_pOutput->CurrentMediaType().Format();
+
+ rtStop = rtStart + 1000i64 * len / pwfe->nAvgBytesPerSec * 10000;
+ pOut->SetTime(&rtStart, &rtStop);
+ pOut->SetMediaTime(NULL, NULL);
+
+ pOut->SetDiscontinuity(m_fBuffDiscontinuity);
+ m_fBuffDiscontinuity = false;
+ pOut->SetSyncPoint(TRUE);
+
+ pOut->SetActualDataLength(len);
+
+ DbgLog((LOG_TRACE, 0, _T("A: rtStart=%I64d, rtStop=%I64d, disc=%d, sync=%d"),
+ rtStart, rtStop, pOut->IsDiscontinuity() == S_OK, pOut->IsSyncPoint() == S_OK));
+
+ if (rtStart >= 0 && S_OK != (hr = m_pOutput->Deliver(pOut))) {
+ return hr;
+ }
+
+ rtStart = rtStop;
+ }
+
+ m_rtBuffStart = rtStart;
+
+ return S_OK;
}
HRESULT CRealAudioDecoder::CheckInputType(const CMediaType* mtIn)
{
- if (mtIn->majortype != MEDIATYPE_Audio
- || mtIn->subtype != MEDIASUBTYPE_14_4
- && mtIn->subtype != MEDIASUBTYPE_28_8
- && mtIn->subtype != MEDIASUBTYPE_ATRC
- && mtIn->subtype != MEDIASUBTYPE_COOK
- && mtIn->subtype != MEDIASUBTYPE_DNET
- && mtIn->subtype != MEDIASUBTYPE_SIPR
- && mtIn->subtype != MEDIASUBTYPE_RAAC
- && mtIn->subtype != MEDIASUBTYPE_RACP
- && mtIn->subtype != MEDIASUBTYPE_AAC) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- if (!m_pInput->IsConnected()) {
- if (m_hDrvDll) {
- FreeLibrary(m_hDrvDll);
- m_hDrvDll = NULL;
- }
-
- CAtlList<CString> paths;
- CString olddll, newdll, oldpath, newpath;
-
- TCHAR fourcc[5] = {
- (TCHAR)((mtIn->subtype.Data1>>0)&0xff),
- (TCHAR)((mtIn->subtype.Data1>>8)&0xff),
- (TCHAR)((mtIn->subtype.Data1>>16)&0xff),
- (TCHAR)((mtIn->subtype.Data1>>24)&0xff),
- 0
- };
-
- if (!_tcscmp(_T("RACP"), fourcc) || !_tcscmp(_T("\xff"), fourcc)) {
- _tcscpy_s(fourcc, _T("RAAC"));
- }
-
- olddll.Format(_T("%s3260.dll"), fourcc);
- newdll.Format(_T("%s.dll"), fourcc);
-
- CRegKey key;
- TCHAR buff[_MAX_PATH];
- ULONG len = _countof(buff);
- if (ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, _T("Software\\RealNetworks\\Preferences\\DT_Codecs"), KEY_READ)
- && ERROR_SUCCESS == key.QueryStringValue(NULL, buff, &len) && _tcslen(buff) > 0) {
- oldpath = buff;
- TCHAR c = oldpath[oldpath.GetLength()-1];
- if (c != '\\' && c != '/') {
- oldpath += '\\';
- }
- key.Close();
- }
- len = _countof(buff);
- if (ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, _T("Helix\\HelixSDK\\10.0\\Preferences\\DT_Codecs"), KEY_READ)
- && ERROR_SUCCESS == key.QueryStringValue(NULL, buff, &len) && _tcslen(buff) > 0) {
- newpath = buff;
- TCHAR c = newpath[newpath.GetLength()-1];
- if (c != '\\' && c != '/') {
- newpath += '\\';
- }
- key.Close();
- }
-
- if (!newpath.IsEmpty()) {
- paths.AddTail(newpath + newdll);
- }
- if (!oldpath.IsEmpty()) {
- paths.AddTail(oldpath + newdll);
- }
- paths.AddTail(newdll); // default dll paths
- if (!newpath.IsEmpty()) {
- paths.AddTail(newpath + olddll);
- }
- if (!oldpath.IsEmpty()) {
- paths.AddTail(oldpath + olddll);
- }
- paths.AddTail(olddll); // default dll paths
-
- POSITION pos = paths.GetHeadPosition();
- do {
- if (pos) {
- m_hDrvDll = LoadLibrary(paths.GetNext(pos));
- }
- } while (pos && !m_hDrvDll);
-
- if (m_hDrvDll) {
- RACloseCodec = (PCloseCodec)GetProcAddress(m_hDrvDll, "RACloseCodec");
- RADecode = (PDecode)GetProcAddress(m_hDrvDll, "RADecode");
- RAFlush = (PFlush)GetProcAddress(m_hDrvDll, "RAFlush");
- RAFreeDecoder = (PFreeDecoder)GetProcAddress(m_hDrvDll, "RAFreeDecoder");
- RAGetFlavorProperty = (PGetFlavorProperty)GetProcAddress(m_hDrvDll, "RAGetFlavorProperty");
- RAInitDecoder = (PInitDecoder)GetProcAddress(m_hDrvDll, "RAInitDecoder");
- RAOpenCodec = (POpenCodec)GetProcAddress(m_hDrvDll, "RAOpenCodec");
- RAOpenCodec2 = (POpenCodec2)GetProcAddress(m_hDrvDll, "RAOpenCodec2");
- RASetFlavor = (PSetFlavor)GetProcAddress(m_hDrvDll, "RASetFlavor");
- RASetDLLAccessPath = (PSetDLLAccessPath)GetProcAddress(m_hDrvDll, "RASetDLLAccessPath");
- RASetPwd = (PSetPwd)GetProcAddress(m_hDrvDll, "RASetPwd");
- }
-
- if (!m_hDrvDll || !RACloseCodec || !RADecode /*|| !RAFlush*/
- || !RAFreeDecoder || !RAGetFlavorProperty || !RAInitDecoder
- || !(RAOpenCodec || RAOpenCodec2) /*|| !RASetFlavor*/) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- if (m_hDrvDll) {
- char buff[_MAX_PATH];
- GetModuleFileNameA(m_hDrvDll, buff, _MAX_PATH);
- CPathA p(buff);
- p.RemoveFileSpec();
- p.AddBackslash();
- m_dllpath = p.m_strPath;
- if (RASetDLLAccessPath) {
- RASetDLLAccessPath("DT_Codecs=" + m_dllpath);
- }
- }
-
- if (FAILED(InitRA(mtIn))) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- }
-
- return S_OK;
+ if (mtIn->majortype != MEDIATYPE_Audio
+ || mtIn->subtype != MEDIASUBTYPE_14_4
+ && mtIn->subtype != MEDIASUBTYPE_28_8
+ && mtIn->subtype != MEDIASUBTYPE_ATRC
+ && mtIn->subtype != MEDIASUBTYPE_COOK
+ && mtIn->subtype != MEDIASUBTYPE_DNET
+ && mtIn->subtype != MEDIASUBTYPE_SIPR
+ && mtIn->subtype != MEDIASUBTYPE_RAAC
+ && mtIn->subtype != MEDIASUBTYPE_RACP
+ && mtIn->subtype != MEDIASUBTYPE_AAC) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ if (!m_pInput->IsConnected()) {
+ if (m_hDrvDll) {
+ FreeLibrary(m_hDrvDll);
+ m_hDrvDll = NULL;
+ }
+
+ CAtlList<CString> paths;
+ CString olddll, newdll, oldpath, newpath;
+
+ TCHAR fourcc[5] = {
+ (TCHAR)((mtIn->subtype.Data1 >> 0) & 0xff),
+ (TCHAR)((mtIn->subtype.Data1 >> 8) & 0xff),
+ (TCHAR)((mtIn->subtype.Data1 >> 16) & 0xff),
+ (TCHAR)((mtIn->subtype.Data1 >> 24) & 0xff),
+ 0
+ };
+
+ if (!_tcscmp(_T("RACP"), fourcc) || !_tcscmp(_T("\xff"), fourcc)) {
+ _tcscpy_s(fourcc, _T("RAAC"));
+ }
+
+ olddll.Format(_T("%s3260.dll"), fourcc);
+ newdll.Format(_T("%s.dll"), fourcc);
+
+ CRegKey key;
+ TCHAR buff[_MAX_PATH];
+ ULONG len = _countof(buff);
+ if (ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, _T("Software\\RealNetworks\\Preferences\\DT_Codecs"), KEY_READ)
+ && ERROR_SUCCESS == key.QueryStringValue(NULL, buff, &len) && _tcslen(buff) > 0) {
+ oldpath = buff;
+ TCHAR c = oldpath[oldpath.GetLength() - 1];
+ if (c != '\\' && c != '/') {
+ oldpath += '\\';
+ }
+ key.Close();
+ }
+ len = _countof(buff);
+ if (ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, _T("Helix\\HelixSDK\\10.0\\Preferences\\DT_Codecs"), KEY_READ)
+ && ERROR_SUCCESS == key.QueryStringValue(NULL, buff, &len) && _tcslen(buff) > 0) {
+ newpath = buff;
+ TCHAR c = newpath[newpath.GetLength() - 1];
+ if (c != '\\' && c != '/') {
+ newpath += '\\';
+ }
+ key.Close();
+ }
+
+ if (!newpath.IsEmpty()) {
+ paths.AddTail(newpath + newdll);
+ }
+ if (!oldpath.IsEmpty()) {
+ paths.AddTail(oldpath + newdll);
+ }
+ paths.AddTail(newdll); // default dll paths
+ if (!newpath.IsEmpty()) {
+ paths.AddTail(newpath + olddll);
+ }
+ if (!oldpath.IsEmpty()) {
+ paths.AddTail(oldpath + olddll);
+ }
+ paths.AddTail(olddll); // default dll paths
+
+ POSITION pos = paths.GetHeadPosition();
+ do {
+ if (pos) {
+ m_hDrvDll = LoadLibrary(paths.GetNext(pos));
+ }
+ } while (pos && !m_hDrvDll);
+
+ if (m_hDrvDll) {
+ RACloseCodec = (PCloseCodec)GetProcAddress(m_hDrvDll, "RACloseCodec");
+ RADecode = (PDecode)GetProcAddress(m_hDrvDll, "RADecode");
+ RAFlush = (PFlush)GetProcAddress(m_hDrvDll, "RAFlush");
+ RAFreeDecoder = (PFreeDecoder)GetProcAddress(m_hDrvDll, "RAFreeDecoder");
+ RAGetFlavorProperty = (PGetFlavorProperty)GetProcAddress(m_hDrvDll, "RAGetFlavorProperty");
+ RAInitDecoder = (PInitDecoder)GetProcAddress(m_hDrvDll, "RAInitDecoder");
+ RAOpenCodec = (POpenCodec)GetProcAddress(m_hDrvDll, "RAOpenCodec");
+ RAOpenCodec2 = (POpenCodec2)GetProcAddress(m_hDrvDll, "RAOpenCodec2");
+ RASetFlavor = (PSetFlavor)GetProcAddress(m_hDrvDll, "RASetFlavor");
+ RASetDLLAccessPath = (PSetDLLAccessPath)GetProcAddress(m_hDrvDll, "RASetDLLAccessPath");
+ RASetPwd = (PSetPwd)GetProcAddress(m_hDrvDll, "RASetPwd");
+ }
+
+ if (!m_hDrvDll || !RACloseCodec || !RADecode /*|| !RAFlush*/
+ || !RAFreeDecoder || !RAGetFlavorProperty || !RAInitDecoder
+ || !(RAOpenCodec || RAOpenCodec2) /*|| !RASetFlavor*/) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ if (m_hDrvDll) {
+ char buff[_MAX_PATH];
+ GetModuleFileNameA(m_hDrvDll, buff, _MAX_PATH);
+ CPathA p(buff);
+ p.RemoveFileSpec();
+ p.AddBackslash();
+ m_dllpath = p.m_strPath;
+ if (RASetDLLAccessPath) {
+ RASetDLLAccessPath("DT_Codecs=" + m_dllpath);
+ }
+ }
+
+ if (FAILED(InitRA(mtIn))) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ }
+
+ return S_OK;
}
HRESULT CRealAudioDecoder::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut)
{
- return mtIn->majortype == MEDIATYPE_Audio && (mtIn->subtype == MEDIASUBTYPE_14_4
- || mtIn->subtype == MEDIASUBTYPE_28_8
- || mtIn->subtype == MEDIASUBTYPE_ATRC
- || mtIn->subtype == MEDIASUBTYPE_COOK
- || mtIn->subtype == MEDIASUBTYPE_DNET
- || mtIn->subtype == MEDIASUBTYPE_SIPR
- || mtIn->subtype == MEDIASUBTYPE_RAAC
- || mtIn->subtype == MEDIASUBTYPE_RACP
- || mtIn->subtype == MEDIASUBTYPE_AAC)
- && mtOut->majortype == MEDIATYPE_Audio && mtOut->subtype == MEDIASUBTYPE_PCM
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ return mtIn->majortype == MEDIATYPE_Audio && (mtIn->subtype == MEDIASUBTYPE_14_4
+ || mtIn->subtype == MEDIASUBTYPE_28_8
+ || mtIn->subtype == MEDIASUBTYPE_ATRC
+ || mtIn->subtype == MEDIASUBTYPE_COOK
+ || mtIn->subtype == MEDIASUBTYPE_DNET
+ || mtIn->subtype == MEDIASUBTYPE_SIPR
+ || mtIn->subtype == MEDIASUBTYPE_RAAC
+ || mtIn->subtype == MEDIASUBTYPE_RACP
+ || mtIn->subtype == MEDIASUBTYPE_AAC)
+ && mtOut->majortype == MEDIATYPE_Audio && mtOut->subtype == MEDIASUBTYPE_PCM
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CRealAudioDecoder::DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties)
{
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
-
- CComPtr<IMemAllocator> pAllocatorIn;
- m_pInput->GetAllocator(&pAllocatorIn);
- if (!pAllocatorIn) {
- return E_UNEXPECTED;
- }
-
- WAVEFORMATEX* pwfe = (WAVEFORMATEX*)m_pOutput->CurrentMediaType().Format();
-
- WORD wBitsPerSample = pwfe->wBitsPerSample;
- if (!wBitsPerSample) {
- wBitsPerSample = 16;
- }
-
- // ok, maybe this is too much...
- pProperties->cBuffers = 8;
- pProperties->cbBuffer = pwfe->nChannels*pwfe->nSamplesPerSec*wBitsPerSample>>3; // nAvgBytesPerSec;
- pProperties->cbAlign = 1;
- pProperties->cbPrefix = 0;
-
- HRESULT hr;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
- return hr;
- }
-
- return (pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
- ? E_FAIL
- : NOERROR);
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
+
+ CComPtr<IMemAllocator> pAllocatorIn;
+ m_pInput->GetAllocator(&pAllocatorIn);
+ if (!pAllocatorIn) {
+ return E_UNEXPECTED;
+ }
+
+ WAVEFORMATEX* pwfe = (WAVEFORMATEX*)m_pOutput->CurrentMediaType().Format();
+
+ WORD wBitsPerSample = pwfe->wBitsPerSample;
+ if (!wBitsPerSample) {
+ wBitsPerSample = 16;
+ }
+
+ // ok, maybe this is too much...
+ pProperties->cBuffers = 8;
+ pProperties->cbBuffer = pwfe->nChannels * pwfe->nSamplesPerSec * wBitsPerSample >> 3; // nAvgBytesPerSec;
+ pProperties->cbAlign = 1;
+ pProperties->cbPrefix = 0;
+
+ HRESULT hr;
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
+
+ return (pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
+ ? E_FAIL
+ : NOERROR);
}
HRESULT CRealAudioDecoder::GetMediaType(int iPosition, CMediaType* pmt)
{
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
-
- *pmt = m_pInput->CurrentMediaType();
- pmt->subtype = MEDIASUBTYPE_PCM;
- WAVEFORMATEX* pwfe = (WAVEFORMATEX*)pmt->ReallocFormatBuffer(sizeof(WAVEFORMATEX));
-
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > (pwfe->nChannels > 2 && pwfe->nChannels <= 6 ? 1 : 0)) {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- if (!pwfe->wBitsPerSample) {
- pwfe->wBitsPerSample = 16;
- }
-
- pwfe->cbSize = 0;
- pwfe->wFormatTag = WAVE_FORMAT_PCM;
- pwfe->nBlockAlign = pwfe->nChannels*pwfe->wBitsPerSample>>3;
- pwfe->nAvgBytesPerSec = pwfe->nSamplesPerSec*pwfe->nBlockAlign;
-
- if (iPosition == 0 && pwfe->nChannels > 2 && pwfe->nChannels <= 6) {
- static DWORD chmask[] = {
- KSAUDIO_SPEAKER_DIRECTOUT,
- KSAUDIO_SPEAKER_MONO,
- KSAUDIO_SPEAKER_STEREO,
- KSAUDIO_SPEAKER_STEREO|SPEAKER_FRONT_CENTER,
- KSAUDIO_SPEAKER_QUAD,
- KSAUDIO_SPEAKER_QUAD|SPEAKER_FRONT_CENTER,
- KSAUDIO_SPEAKER_5POINT1
- };
-
- WAVEFORMATEXTENSIBLE* pwfex = (WAVEFORMATEXTENSIBLE*)pmt->ReallocFormatBuffer(sizeof(WAVEFORMATEXTENSIBLE));
- pwfex->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
- pwfex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
- pwfex->dwChannelMask = chmask[pwfex->Format.nChannels];
- pwfex->Samples.wValidBitsPerSample = pwfex->Format.wBitsPerSample;
- pwfex->SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
- }
-
- return S_OK;
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
+
+ *pmt = m_pInput->CurrentMediaType();
+ pmt->subtype = MEDIASUBTYPE_PCM;
+ WAVEFORMATEX* pwfe = (WAVEFORMATEX*)pmt->ReallocFormatBuffer(sizeof(WAVEFORMATEX));
+
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > (pwfe->nChannels > 2 && pwfe->nChannels <= 6 ? 1 : 0)) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ if (!pwfe->wBitsPerSample) {
+ pwfe->wBitsPerSample = 16;
+ }
+
+ pwfe->cbSize = 0;
+ pwfe->wFormatTag = WAVE_FORMAT_PCM;
+ pwfe->nBlockAlign = pwfe->nChannels * pwfe->wBitsPerSample >> 3;
+ pwfe->nAvgBytesPerSec = pwfe->nSamplesPerSec * pwfe->nBlockAlign;
+
+ if (iPosition == 0 && pwfe->nChannels > 2 && pwfe->nChannels <= 6) {
+ static DWORD chmask[] = {
+ KSAUDIO_SPEAKER_DIRECTOUT,
+ KSAUDIO_SPEAKER_MONO,
+ KSAUDIO_SPEAKER_STEREO,
+ KSAUDIO_SPEAKER_STEREO | SPEAKER_FRONT_CENTER,
+ KSAUDIO_SPEAKER_QUAD,
+ KSAUDIO_SPEAKER_QUAD | SPEAKER_FRONT_CENTER,
+ KSAUDIO_SPEAKER_5POINT1
+ };
+
+ WAVEFORMATEXTENSIBLE* pwfex = (WAVEFORMATEXTENSIBLE*)pmt->ReallocFormatBuffer(sizeof(WAVEFORMATEXTENSIBLE));
+ pwfex->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
+ pwfex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+ pwfex->dwChannelMask = chmask[pwfex->Format.nChannels];
+ pwfex->Samples.wValidBitsPerSample = pwfex->Format.wBitsPerSample;
+ pwfex->SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+ }
+
+ return S_OK;
}
HRESULT CRealAudioDecoder::StartStreaming()
{
- int w = m_rai.coded_frame_size;
- int h = m_rai.sub_packet_h;
- int sps = m_rai.sub_packet_size;
- UNREFERENCED_PARAMETER(sps);
+ int w = m_rai.coded_frame_size;
+ int h = m_rai.sub_packet_h;
+ int sps = m_rai.sub_packet_size;
+ UNREFERENCED_PARAMETER(sps);
- int len = w*h;
+ int len = w * h;
- m_buff.Allocate(len*2);
- m_bufflen = 0;
- m_rtBuffStart = 0;
+ m_buff.Allocate(len * 2);
+ m_bufflen = 0;
+ m_rtBuffStart = 0;
- return __super::StartStreaming();
+ return __super::StartStreaming();
}
HRESULT CRealAudioDecoder::StopStreaming()
{
- m_buff.Free();
- m_bufflen = 0;
+ m_buff.Free();
+ m_bufflen = 0;
- return __super::StopStreaming();
+ return __super::StopStreaming();
}
HRESULT CRealAudioDecoder::EndOfStream()
{
- return __super::EndOfStream();
+ return __super::EndOfStream();
}
HRESULT CRealAudioDecoder::BeginFlush()
{
- return __super::BeginFlush();
+ return __super::BeginFlush();
}
HRESULT CRealAudioDecoder::EndFlush()
{
- return __super::EndFlush();
+ return __super::EndFlush();
}
HRESULT CRealAudioDecoder::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- CAutoLock cAutoLock(&m_csReceive);
- m_tStart = tStart;
- m_bufflen = 0;
- m_rtBuffStart = 0;
- return __super::NewSegment(tStart, tStop, dRate);
+ CAutoLock cAutoLock(&m_csReceive);
+ m_tStart = tStart;
+ m_bufflen = 0;
+ m_rtBuffStart = 0;
+ return __super::NewSegment(tStart, tStop, dRate);
}
diff --git a/src/filters/parser/RealMediaSplitter/RealMediaSplitter.h b/src/filters/parser/RealMediaSplitter/RealMediaSplitter.h
index 51bdbdbb6..5e16fd241 100644
--- a/src/filters/parser/RealMediaSplitter/RealMediaSplitter.h
+++ b/src/filters/parser/RealMediaSplitter/RealMediaSplitter.h
@@ -37,316 +37,316 @@
namespace RMFF
{
- typedef struct {
- union {
- char id[4];
- UINT32 object_id;
- };
- UINT32 size;
- UINT16 object_version;
- } ChunkHdr;
- typedef struct {
- UINT32 version, nHeaders;
- } FileHdr;
- typedef struct {
- UINT32 maxBitRate, avgBitRate;
- UINT32 maxPacketSize, avgPacketSize, nPackets;
- UINT32 tDuration, tPreroll;
- UINT32 ptrIndex, ptrData;
- UINT16 nStreams;
- enum flags_t {PN_SAVE_ENABLED=1, PN_PERFECT_PLAY_ENABLED=2, PN_LIVE_BROADCAST=4} flags;
- } Properies;
- typedef struct {
- UINT16 stream;
- UINT32 maxBitRate, avgBitRate;
- UINT32 maxPacketSize, avgPacketSize;
- UINT32 tStart, tPreroll, tDuration;
- CStringA name, mime;
- CAtlArray<BYTE> typeSpecData;
- UINT32 width, height;
- bool interlaced, top_field_first;
- } MediaProperies;
- typedef struct {
- CStringA title, author, copyright, comment;
- } ContentDesc;
- typedef struct {
- UINT64 pos;
- UINT32 nPackets, ptrNext;
- } DataChunk;
- typedef struct {
- UINT16 len, stream;
- UINT32 tStart;
- UINT8 reserved;
- enum flag_t {PN_RELIABLE_FLAG=1, PN_KEYFRAME_FLAG=2} flags; // UINT8
- CAtlArray<BYTE> pData;
- } MediaPacketHeader;
- typedef struct {
- UINT32 nIndices;
- UINT16 stream;
- UINT32 ptrNext;
- } IndexChunkHeader;
- typedef struct {
- UINT32 tStart, ptrFilePos, packet;
- } IndexRecord;
+ typedef struct {
+ union {
+ char id[4];
+ UINT32 object_id;
+ };
+ UINT32 size;
+ UINT16 object_version;
+ } ChunkHdr;
+ typedef struct {
+ UINT32 version, nHeaders;
+ } FileHdr;
+ typedef struct {
+ UINT32 maxBitRate, avgBitRate;
+ UINT32 maxPacketSize, avgPacketSize, nPackets;
+ UINT32 tDuration, tPreroll;
+ UINT32 ptrIndex, ptrData;
+ UINT16 nStreams;
+ enum flags_t {PN_SAVE_ENABLED = 1, PN_PERFECT_PLAY_ENABLED = 2, PN_LIVE_BROADCAST = 4} flags;
+ } Properies;
+ typedef struct {
+ UINT16 stream;
+ UINT32 maxBitRate, avgBitRate;
+ UINT32 maxPacketSize, avgPacketSize;
+ UINT32 tStart, tPreroll, tDuration;
+ CStringA name, mime;
+ CAtlArray<BYTE> typeSpecData;
+ UINT32 width, height;
+ bool interlaced, top_field_first;
+ } MediaProperies;
+ typedef struct {
+ CStringA title, author, copyright, comment;
+ } ContentDesc;
+ typedef struct {
+ UINT64 pos;
+ UINT32 nPackets, ptrNext;
+ } DataChunk;
+ typedef struct {
+ UINT16 len, stream;
+ UINT32 tStart;
+ UINT8 reserved;
+ enum flag_t {PN_RELIABLE_FLAG = 1, PN_KEYFRAME_FLAG = 2} flags; // UINT8
+ CAtlArray<BYTE> pData;
+ } MediaPacketHeader;
+ typedef struct {
+ UINT32 nIndices;
+ UINT16 stream;
+ UINT32 ptrNext;
+ } IndexChunkHeader;
+ typedef struct {
+ UINT32 tStart, ptrFilePos, packet;
+ } IndexRecord;
}
struct rvinfo {
- DWORD dwSize, fcc1, fcc2;
- WORD w, h, bpp;
- DWORD unk1, fps, type1, type2;
- BYTE morewh[14];
- void bswap();
+ DWORD dwSize, fcc1, fcc2;
+ WORD w, h, bpp;
+ DWORD unk1, fps, type1, type2;
+ BYTE morewh[14];
+ void bswap();
};
struct rainfo {
- DWORD fourcc1; // '.', 'r', 'a', 0xfd
- WORD version1; // 4 or 5
- WORD unknown1; // 00 000
- DWORD fourcc2; // .ra4 or .ra5
- DWORD unknown2; // ???
- WORD version2; // 4 or 5
- DWORD header_size; // == 0x4e
- WORD flavor; // codec flavor id
- DWORD coded_frame_size; // coded frame size
- DWORD unknown3; // big number
- DWORD unknown4; // bigger number
- DWORD unknown5; // yet another number
- WORD sub_packet_h;
- WORD frame_size;
- WORD sub_packet_size;
- WORD unknown6; // 00 00
- void bswap();
+ DWORD fourcc1; // '.', 'r', 'a', 0xfd
+ WORD version1; // 4 or 5
+ WORD unknown1; // 00 000
+ DWORD fourcc2; // .ra4 or .ra5
+ DWORD unknown2; // ???
+ WORD version2; // 4 or 5
+ DWORD header_size; // == 0x4e
+ WORD flavor; // codec flavor id
+ DWORD coded_frame_size; // coded frame size
+ DWORD unknown3; // big number
+ DWORD unknown4; // bigger number
+ DWORD unknown5; // yet another number
+ WORD sub_packet_h;
+ WORD frame_size;
+ WORD sub_packet_size;
+ WORD unknown6; // 00 00
+ void bswap();
};
struct rainfo4 : rainfo {
- WORD sample_rate;
- WORD unknown8; // 0
- WORD sample_size;
- WORD channels;
- void bswap();
+ WORD sample_rate;
+ WORD unknown8; // 0
+ WORD sample_size;
+ WORD channels;
+ void bswap();
};
struct rainfo5 : rainfo {
- BYTE unknown7[6]; // 0, srate, 0
- WORD sample_rate;
- WORD unknown8; // 0
- WORD sample_size;
- WORD channels;
- DWORD genr; // "genr"
- DWORD fourcc3; // fourcc
- void bswap();
+ BYTE unknown7[6]; // 0, srate, 0
+ WORD sample_rate;
+ WORD unknown8; // 0
+ WORD sample_size;
+ WORD channels;
+ DWORD genr; // "genr"
+ DWORD fourcc3; // fourcc
+ void bswap();
};
#pragma pack(pop)
class CRMFile : public CBaseSplitterFile
{
- // using CBaseSplitterFile::Read;
+ // using CBaseSplitterFile::Read;
- HRESULT Init();
- void GetDimensions();
+ HRESULT Init();
+ void GetDimensions();
public:
- CRMFile(IAsyncReader* pAsyncReader, HRESULT& hr);
+ CRMFile(IAsyncReader* pAsyncReader, HRESULT& hr);
- template<typename T> HRESULT Read(T& var);
- HRESULT Read(RMFF::ChunkHdr& hdr);
- HRESULT Read(RMFF::MediaPacketHeader& mph, bool fFull = true);
+ template<typename T> HRESULT Read(T& var);
+ HRESULT Read(RMFF::ChunkHdr& hdr);
+ HRESULT Read(RMFF::MediaPacketHeader& mph, bool fFull = true);
- RMFF::FileHdr m_fh;
- RMFF::ContentDesc m_cd;
- RMFF::Properies m_p;
- CAutoPtrList<RMFF::MediaProperies> m_mps;
- CAutoPtrList<RMFF::DataChunk> m_dcs;
- CAutoPtrList<RMFF::IndexRecord> m_irs;
+ RMFF::FileHdr m_fh;
+ RMFF::ContentDesc m_cd;
+ RMFF::Properies m_p;
+ CAutoPtrList<RMFF::MediaProperies> m_mps;
+ CAutoPtrList<RMFF::DataChunk> m_dcs;
+ CAutoPtrList<RMFF::IndexRecord> m_irs;
- typedef struct {
- CStringA name, data;
- } subtitle;
- CAtlList<subtitle> m_subs;
+ typedef struct {
+ CStringA name, data;
+ } subtitle;
+ CAtlList<subtitle> m_subs;
- int GetMasterStream();
+ int GetMasterStream();
};
class CRealMediaSplitterOutputPin : public CBaseSplitterOutputPin
{
private:
- typedef struct {
- CAtlArray<BYTE> data;
- DWORD offset;
- } segment;
-
- class CSegments : public CAutoPtrList<segment>, public CCritSec
- {
- public:
- REFERENCE_TIME rtStart;
- bool fDiscontinuity, fSyncPoint, fMerged;
- void Clear() {
- CAutoLock cAutoLock(this);
- rtStart = 0;
- fDiscontinuity = fSyncPoint = fMerged = false;
- RemoveAll();
- }
- } m_segments;
-
- CCritSec m_csQueue;
-
- HRESULT DeliverSegments();
+ typedef struct {
+ CAtlArray<BYTE> data;
+ DWORD offset;
+ } segment;
+
+ class CSegments : public CAutoPtrList<segment>, public CCritSec
+ {
+ public:
+ REFERENCE_TIME rtStart;
+ bool fDiscontinuity, fSyncPoint, fMerged;
+ void Clear() {
+ CAutoLock cAutoLock(this);
+ rtStart = 0;
+ fDiscontinuity = fSyncPoint = fMerged = false;
+ RemoveAll();
+ }
+ } m_segments;
+
+ CCritSec m_csQueue;
+
+ HRESULT DeliverSegments();
protected:
- HRESULT DeliverPacket(CAutoPtr<Packet> p);
+ HRESULT DeliverPacket(CAutoPtr<Packet> p);
public:
- CRealMediaSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- virtual ~CRealMediaSplitterOutputPin();
+ CRealMediaSplitterOutputPin(CAtlArray<CMediaType>& mts, LPCWSTR pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ virtual ~CRealMediaSplitterOutputPin();
- HRESULT DeliverEndFlush();
+ HRESULT DeliverEndFlush();
};
class __declspec(uuid("E21BE468-5C18-43EB-B0CC-DB93A847D769"))
- CRealMediaSplitterFilter : public CBaseSplitterFilter
+ CRealMediaSplitterFilter : public CBaseSplitterFilter
{
protected:
- CAutoPtr<CRMFile> m_pFile;
- HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
+ CAutoPtr<CRMFile> m_pFile;
+ HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
- bool DemuxInit();
- void DemuxSeek(REFERENCE_TIME rt);
- bool DemuxLoop();
+ bool DemuxInit();
+ void DemuxSeek(REFERENCE_TIME rt);
+ bool DemuxLoop();
- POSITION m_seekpos;
- UINT32 m_seekpacket;
- UINT64 m_seekfilepos;
+ POSITION m_seekpos;
+ UINT32 m_seekpacket;
+ UINT64 m_seekfilepos;
public:
- CRealMediaSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
- virtual ~CRealMediaSplitterFilter();
+ CRealMediaSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ virtual ~CRealMediaSplitterFilter();
- // CBaseFilter
+ // CBaseFilter
- STDMETHODIMP_(HRESULT) QueryFilterInfo(FILTER_INFO* pInfo);
+ STDMETHODIMP_(HRESULT) QueryFilterInfo(FILTER_INFO* pInfo);
- // IKeyFrameInfo
+ // IKeyFrameInfo
- STDMETHODIMP_(HRESULT) GetKeyFrameCount(UINT& nKFs);
- STDMETHODIMP_(HRESULT) GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
+ STDMETHODIMP_(HRESULT) GetKeyFrameCount(UINT& nKFs);
+ STDMETHODIMP_(HRESULT) GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs);
};
class __declspec(uuid("765035B3-5944-4A94-806B-20EE3415F26F"))
- CRealMediaSourceFilter : public CRealMediaSplitterFilter
+ CRealMediaSourceFilter : public CRealMediaSplitterFilter
{
public:
- CRealMediaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ CRealMediaSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
};
////////////
class __declspec(uuid("238D0F23-5DC9-45A6-9BE2-666160C324DD"))
- CRealVideoDecoder : public CBaseVideoFilter
+ CRealVideoDecoder : public CBaseVideoFilter
{
- typedef HRESULT (WINAPI *PRVCustomMessage)(void*, DWORD);
- typedef HRESULT (WINAPI *PRVFree)(DWORD);
- typedef HRESULT (WINAPI *PRVHiveMessage)(void*, DWORD);
- typedef HRESULT (WINAPI *PRVInit)(void*, DWORD* dwCookie);
- typedef HRESULT (WINAPI *PRVTransform)(BYTE*, BYTE*, void*, void*, DWORD);
+ typedef HRESULT(WINAPI* PRVCustomMessage)(void*, DWORD);
+ typedef HRESULT(WINAPI* PRVFree)(DWORD);
+ typedef HRESULT(WINAPI* PRVHiveMessage)(void*, DWORD);
+ typedef HRESULT(WINAPI* PRVInit)(void*, DWORD* dwCookie);
+ typedef HRESULT(WINAPI* PRVTransform)(BYTE*, BYTE*, void*, void*, DWORD);
- PRVCustomMessage RVCustomMessage;
- PRVFree RVFree;
- PRVHiveMessage RVHiveMessage;
- PRVInit RVInit;
- PRVTransform RVTransform;
+ PRVCustomMessage RVCustomMessage;
+ PRVFree RVFree;
+ PRVHiveMessage RVHiveMessage;
+ PRVInit RVInit;
+ PRVTransform RVTransform;
- HMODULE m_hDrvDll;
- DWORD m_dwCookie;
- int m_lastBuffSizeDim;
+ HMODULE m_hDrvDll;
+ DWORD m_dwCookie;
+ int m_lastBuffSizeDim;
- HRESULT InitRV(const CMediaType* pmt);
- void FreeRV();
+ HRESULT InitRV(const CMediaType* pmt);
+ void FreeRV();
- REFERENCE_TIME m_tStart;
+ REFERENCE_TIME m_tStart;
- void Resize(BYTE* pIn, DWORD wi, DWORD hi, BYTE* pOut, DWORD wo, DWORD ho);
- void ResizeWidth(BYTE* pIn, DWORD wi, DWORD hi, BYTE* pOut, DWORD wo, DWORD ho);
- void ResizeHeight(BYTE* pIn, DWORD wi, DWORD hi, BYTE* pOut, DWORD wo, DWORD ho);
- void ResizeRow(BYTE* pIn, DWORD wi, DWORD dpi, BYTE* pOut, DWORD wo, DWORD dpo);
+ void Resize(BYTE* pIn, DWORD wi, DWORD hi, BYTE* pOut, DWORD wo, DWORD ho);
+ void ResizeWidth(BYTE* pIn, DWORD wi, DWORD hi, BYTE* pOut, DWORD wo, DWORD ho);
+ void ResizeHeight(BYTE* pIn, DWORD wi, DWORD hi, BYTE* pOut, DWORD wo, DWORD ho);
+ void ResizeRow(BYTE* pIn, DWORD wi, DWORD dpi, BYTE* pOut, DWORD wo, DWORD dpo);
- BYTE* m_pI420, *m_pI420Tmp;
+ BYTE* m_pI420, *m_pI420Tmp;
public:
- CRealVideoDecoder(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CRealVideoDecoder();
+ CRealVideoDecoder(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CRealVideoDecoder();
- HRESULT Transform(IMediaSample* pIn);
- HRESULT CheckInputType(const CMediaType* mtIn);
- HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
+ HRESULT Transform(IMediaSample* pIn);
+ HRESULT CheckInputType(const CMediaType* mtIn);
+ HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
- HRESULT StartStreaming();
- HRESULT StopStreaming();
+ HRESULT StartStreaming();
+ HRESULT StopStreaming();
- HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
- DWORD m_timestamp;
- bool m_fDropFrames;
- HRESULT AlterQuality(Quality q);
+ DWORD m_timestamp;
+ bool m_fDropFrames;
+ HRESULT AlterQuality(Quality q);
};
class __declspec(uuid("941A4793-A705-4312-8DFC-C11CA05F397E"))
- CRealAudioDecoder : public CTransformFilter
+ CRealAudioDecoder : public CTransformFilter
{
- typedef HRESULT (WINAPI *PCloseCodec)(DWORD);
- typedef HRESULT (WINAPI *PDecode)(DWORD,BYTE*,long,BYTE*,long*,long);
- typedef HRESULT (WINAPI *PFlush)(DWORD,DWORD,DWORD);
- typedef HRESULT (WINAPI *PFreeDecoder)(DWORD);
- typedef void* (WINAPI *PGetFlavorProperty)(void*,DWORD,DWORD,int*);
- typedef HRESULT (WINAPI *PInitDecoder)(DWORD, void*);
- typedef HRESULT (WINAPI *POpenCodec)(void*);
- typedef HRESULT (WINAPI *POpenCodec2)(void*, const char*);
- typedef HRESULT (WINAPI *PSetFlavor)(DWORD, WORD);
- typedef void (WINAPI *PSetDLLAccessPath)(const char*);
- typedef void (WINAPI *PSetPwd)(DWORD, const char*);
-
- PCloseCodec RACloseCodec;
- PDecode RADecode;
- PFlush RAFlush;
- PFreeDecoder RAFreeDecoder;
- PGetFlavorProperty RAGetFlavorProperty;
- PInitDecoder RAInitDecoder;
- POpenCodec RAOpenCodec;
- POpenCodec2 RAOpenCodec2;
- PSetFlavor RASetFlavor;
- PSetDLLAccessPath RASetDLLAccessPath;
- PSetPwd RASetPwd;
-
- CStringA m_dllpath;
- HMODULE m_hDrvDll;
- DWORD m_dwCookie;
-
- HRESULT InitRA(const CMediaType* pmt);
- void FreeRA();
-
- REFERENCE_TIME m_tStart;
-
- rainfo m_rai;
- CAutoVectorPtr<BYTE> m_buff;
- int m_bufflen;
- REFERENCE_TIME m_rtBuffStart;
- bool m_fBuffDiscontinuity;
+ typedef HRESULT(WINAPI* PCloseCodec)(DWORD);
+ typedef HRESULT(WINAPI* PDecode)(DWORD, BYTE*, long, BYTE*, long*, long);
+ typedef HRESULT(WINAPI* PFlush)(DWORD, DWORD, DWORD);
+ typedef HRESULT(WINAPI* PFreeDecoder)(DWORD);
+ typedef void* (WINAPI* PGetFlavorProperty)(void*, DWORD, DWORD, int*);
+ typedef HRESULT(WINAPI* PInitDecoder)(DWORD, void*);
+ typedef HRESULT(WINAPI* POpenCodec)(void*);
+ typedef HRESULT(WINAPI* POpenCodec2)(void*, const char*);
+ typedef HRESULT(WINAPI* PSetFlavor)(DWORD, WORD);
+ typedef void (WINAPI* PSetDLLAccessPath)(const char*);
+ typedef void (WINAPI* PSetPwd)(DWORD, const char*);
+
+ PCloseCodec RACloseCodec;
+ PDecode RADecode;
+ PFlush RAFlush;
+ PFreeDecoder RAFreeDecoder;
+ PGetFlavorProperty RAGetFlavorProperty;
+ PInitDecoder RAInitDecoder;
+ POpenCodec RAOpenCodec;
+ POpenCodec2 RAOpenCodec2;
+ PSetFlavor RASetFlavor;
+ PSetDLLAccessPath RASetDLLAccessPath;
+ PSetPwd RASetPwd;
+
+ CStringA m_dllpath;
+ HMODULE m_hDrvDll;
+ DWORD m_dwCookie;
+
+ HRESULT InitRA(const CMediaType* pmt);
+ void FreeRA();
+
+ REFERENCE_TIME m_tStart;
+
+ rainfo m_rai;
+ CAutoVectorPtr<BYTE> m_buff;
+ int m_bufflen;
+ REFERENCE_TIME m_rtBuffStart;
+ bool m_fBuffDiscontinuity;
public:
- CRealAudioDecoder(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CRealAudioDecoder();
-
- HRESULT Receive(IMediaSample* pIn);
- HRESULT CheckInputType(const CMediaType* mtIn);
- HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
- HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
-
- HRESULT StartStreaming();
- HRESULT StopStreaming();
-
- HRESULT EndOfStream();
- HRESULT BeginFlush();
- HRESULT EndFlush();
- HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ CRealAudioDecoder(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CRealAudioDecoder();
+
+ HRESULT Receive(IMediaSample* pIn);
+ HRESULT CheckInputType(const CMediaType* mtIn);
+ HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
+ HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
+
+ HRESULT StartStreaming();
+ HRESULT StopStreaming();
+
+ HRESULT EndOfStream();
+ HRESULT BeginFlush();
+ HRESULT EndFlush();
+ HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
};
diff --git a/src/filters/parser/StreamDriveThru/StreamDriveThru.cpp b/src/filters/parser/StreamDriveThru/StreamDriveThru.cpp
index 9a956754e..d14d5bb3d 100644
--- a/src/filters/parser/StreamDriveThru/StreamDriveThru.cpp
+++ b/src/filters/parser/StreamDriveThru/StreamDriveThru.cpp
@@ -28,36 +28,36 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CStreamDriveThruFilter), StreamDriveThruName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CStreamDriveThruFilter), StreamDriveThruName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CStreamDriveThruFilter>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CStreamDriveThruFilter>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -71,305 +71,305 @@ CFilterApp theApp;
//
CStreamDriveThruFilter::CStreamDriveThruFilter(LPUNKNOWN pUnk, HRESULT* phr)
- : CBaseFilter(NAME("CStreamDriveThruFilter"), pUnk, &m_csLock, __uuidof(this))
- , m_position(0)
+ : CBaseFilter(NAME("CStreamDriveThruFilter"), pUnk, &m_csLock, __uuidof(this))
+ , m_position(0)
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
- m_pInput = DNew CStreamDriveThruInputPin(NAME("CStreamDriveThruInputPin"), this, &m_csLock, phr);
- m_pOutput = DNew CStreamDriveThruOutputPin(NAME("CStreamDriveThruOutputPin"), this, &m_csLock, phr);
+ m_pInput = DNew CStreamDriveThruInputPin(NAME("CStreamDriveThruInputPin"), this, &m_csLock, phr);
+ m_pOutput = DNew CStreamDriveThruOutputPin(NAME("CStreamDriveThruOutputPin"), this, &m_csLock, phr);
- CAMThread::Create();
+ CAMThread::Create();
}
CStreamDriveThruFilter::~CStreamDriveThruFilter()
{
- CAutoLock csAutoLock(&m_csLock);
+ CAutoLock csAutoLock(&m_csLock);
- CAMThread::CallWorker(CMD_EXIT);
- CAMThread::Close();
+ CAMThread::CallWorker(CMD_EXIT);
+ CAMThread::Close();
- delete m_pInput;
- delete m_pOutput;
+ delete m_pInput;
+ delete m_pOutput;
}
STDMETHODIMP CStreamDriveThruFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(IMediaSeeking)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IMediaSeeking)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
#define PACKETSIZE 65536
DWORD CStreamDriveThruFilter::ThreadProc()
{
- for (;;) {
- DWORD cmd = GetRequest();
-
- switch (cmd) {
- default:
- case CMD_EXIT:
- Reply(S_OK);
- return 0;
- case CMD_STOP:
- Reply(S_OK);
- break;
- case CMD_PAUSE:
- Reply(S_OK);
- break;
- case CMD_RUN:
- Reply(S_OK);
-
- do {
- CComPtr<IAsyncReader> pAsyncReader;
- CComPtr<IStream> pStream;
-
- if (!m_pInput || !m_pInput->IsConnected() || FAILED(m_pInput->GetAsyncReader(&pAsyncReader))
- || !m_pOutput || !m_pOutput->IsConnected() || FAILED(m_pOutput->GetStream(&pStream))) {
- break;
- }
-
- LARGE_INTEGER li = {0};
- ULARGE_INTEGER uli = {0};
-
- if (FAILED(pStream->Seek(li, STREAM_SEEK_SET, NULL))
- || FAILED(pStream->SetSize(uli))) {
- break;
- }
-
- if (CComQIPtr<IFileSinkFilter2> pFSF = GetFilterFromPin(m_pOutput->GetConnected())) {
- pFSF->SetMode(AM_FILE_OVERWRITE);
-
- LPOLESTR pfn;
- if (SUCCEEDED(pFSF->GetCurFile(&pfn, NULL))) {
- pFSF->SetFileName(pfn, NULL);
- CoTaskMemFree(pfn);
- }
- }
-
- m_position = 0;
- BYTE buff[PACKETSIZE];
-
- do {
- while (!CheckRequest(&cmd)) {
- CAutoLock csAutoLock(&m_csLock);
-
- LONGLONG total = 0, available = 0;
- if (FAILED(pAsyncReader->Length(&total, &available)) || m_position >= total) {
- cmd = CMD_STOP;
- break;
- }
-
- LONG size = (LONG)min(PACKETSIZE, total - m_position);
- if (FAILED(pAsyncReader->SyncRead(m_position, size, buff))) {
- cmd = CMD_STOP;
- break;
- }
-
- ULONG written = 0;
- if (FAILED(pStream->Write(buff, (ULONG)size, &written)) || (ULONG)size != written) {
- cmd = CMD_STOP;
- break;
- }
-
- m_position += size;
- }
-
- if (cmd == CMD_PAUSE) {
- Reply(S_OK); // reply to CMD_PAUSE
-
- while (!CheckRequest(&cmd)) {
- Sleep(50);
- }
-
- Reply(S_OK); // reply to something
- }
- } while (cmd == CMD_RUN);
-
- uli.QuadPart = m_position;
- pStream->SetSize(uli);
-
- if (CComPtr<IPin> pPin = m_pOutput->GetConnected()) {
- pPin->EndOfStream();
- }
- } while (false);
-
- break;
- }
- }
-
- return 0;
+ for (;;) {
+ DWORD cmd = GetRequest();
+
+ switch (cmd) {
+ default:
+ case CMD_EXIT:
+ Reply(S_OK);
+ return 0;
+ case CMD_STOP:
+ Reply(S_OK);
+ break;
+ case CMD_PAUSE:
+ Reply(S_OK);
+ break;
+ case CMD_RUN:
+ Reply(S_OK);
+
+ do {
+ CComPtr<IAsyncReader> pAsyncReader;
+ CComPtr<IStream> pStream;
+
+ if (!m_pInput || !m_pInput->IsConnected() || FAILED(m_pInput->GetAsyncReader(&pAsyncReader))
+ || !m_pOutput || !m_pOutput->IsConnected() || FAILED(m_pOutput->GetStream(&pStream))) {
+ break;
+ }
+
+ LARGE_INTEGER li = {0};
+ ULARGE_INTEGER uli = {0};
+
+ if (FAILED(pStream->Seek(li, STREAM_SEEK_SET, NULL))
+ || FAILED(pStream->SetSize(uli))) {
+ break;
+ }
+
+ if (CComQIPtr<IFileSinkFilter2> pFSF = GetFilterFromPin(m_pOutput->GetConnected())) {
+ pFSF->SetMode(AM_FILE_OVERWRITE);
+
+ LPOLESTR pfn;
+ if (SUCCEEDED(pFSF->GetCurFile(&pfn, NULL))) {
+ pFSF->SetFileName(pfn, NULL);
+ CoTaskMemFree(pfn);
+ }
+ }
+
+ m_position = 0;
+ BYTE buff[PACKETSIZE];
+
+ do {
+ while (!CheckRequest(&cmd)) {
+ CAutoLock csAutoLock(&m_csLock);
+
+ LONGLONG total = 0, available = 0;
+ if (FAILED(pAsyncReader->Length(&total, &available)) || m_position >= total) {
+ cmd = CMD_STOP;
+ break;
+ }
+
+ LONG size = (LONG)min(PACKETSIZE, total - m_position);
+ if (FAILED(pAsyncReader->SyncRead(m_position, size, buff))) {
+ cmd = CMD_STOP;
+ break;
+ }
+
+ ULONG written = 0;
+ if (FAILED(pStream->Write(buff, (ULONG)size, &written)) || (ULONG)size != written) {
+ cmd = CMD_STOP;
+ break;
+ }
+
+ m_position += size;
+ }
+
+ if (cmd == CMD_PAUSE) {
+ Reply(S_OK); // reply to CMD_PAUSE
+
+ while (!CheckRequest(&cmd)) {
+ Sleep(50);
+ }
+
+ Reply(S_OK); // reply to something
+ }
+ } while (cmd == CMD_RUN);
+
+ uli.QuadPart = m_position;
+ pStream->SetSize(uli);
+
+ if (CComPtr<IPin> pPin = m_pOutput->GetConnected()) {
+ pPin->EndOfStream();
+ }
+ } while (false);
+
+ break;
+ }
+ }
+
+ return 0;
}
int CStreamDriveThruFilter::GetPinCount()
{
- return 2;
+ return 2;
}
CBasePin* CStreamDriveThruFilter::GetPin(int n)
{
- CAutoLock csAutoLock(&m_csLock);
+ CAutoLock csAutoLock(&m_csLock);
- if (n == 0) {
- return m_pInput;
- } else if (n == 1) {
- return m_pOutput;
- }
+ if (n == 0) {
+ return m_pInput;
+ } else if (n == 1) {
+ return m_pOutput;
+ }
- return NULL;
+ return NULL;
}
STDMETHODIMP CStreamDriveThruFilter::Stop()
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::Stop())) {
- return hr;
- }
+ if (FAILED(hr = __super::Stop())) {
+ return hr;
+ }
- CallWorker(CMD_STOP);
+ CallWorker(CMD_STOP);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CStreamDriveThruFilter::Pause()
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::Pause())) {
- return hr;
- }
+ if (FAILED(hr = __super::Pause())) {
+ return hr;
+ }
- CallWorker(CMD_PAUSE);
+ CallWorker(CMD_PAUSE);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CStreamDriveThruFilter::Run(REFERENCE_TIME tStart)
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::Run(tStart))) {
- return hr;
- }
+ if (FAILED(hr = __super::Run(tStart))) {
+ return hr;
+ }
- CallWorker(CMD_RUN);
+ CallWorker(CMD_RUN);
- return S_OK;
+ return S_OK;
}
// IMediaSeeking
STDMETHODIMP CStreamDriveThruFilter::GetCapabilities(DWORD* pCapabilities)
{
- return pCapabilities ? *pCapabilities = AM_SEEKING_CanGetCurrentPos|AM_SEEKING_CanGetStopPos|AM_SEEKING_CanGetDuration, S_OK : E_POINTER;
+ return pCapabilities ? *pCapabilities = AM_SEEKING_CanGetCurrentPos | AM_SEEKING_CanGetStopPos | AM_SEEKING_CanGetDuration, S_OK : E_POINTER;
}
STDMETHODIMP CStreamDriveThruFilter::CheckCapabilities(DWORD* pCapabilities)
{
- CheckPointer(pCapabilities, E_POINTER);
+ CheckPointer(pCapabilities, E_POINTER);
- if (*pCapabilities == 0) {
- return S_OK;
- }
+ if (*pCapabilities == 0) {
+ return S_OK;
+ }
- DWORD caps;
- GetCapabilities(&caps);
+ DWORD caps;
+ GetCapabilities(&caps);
- DWORD caps2 = caps & *pCapabilities;
+ DWORD caps2 = caps & *pCapabilities;
- return caps2 == 0 ? E_FAIL : caps2 == *pCapabilities ? S_OK : S_FALSE;
+ return caps2 == 0 ? E_FAIL : caps2 == *pCapabilities ? S_OK : S_FALSE;
}
STDMETHODIMP CStreamDriveThruFilter::IsFormatSupported(const GUID* pFormat)
{
- return !pFormat ? E_POINTER : *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : S_FALSE;
+ return !pFormat ? E_POINTER : *pFormat == TIME_FORMAT_MEDIA_TIME ? S_OK : S_FALSE;
}
STDMETHODIMP CStreamDriveThruFilter::QueryPreferredFormat(GUID* pFormat)
{
- return GetTimeFormat(pFormat);
+ return GetTimeFormat(pFormat);
}
STDMETHODIMP CStreamDriveThruFilter::GetTimeFormat(GUID* pFormat)
{
- return pFormat ? *pFormat = TIME_FORMAT_MEDIA_TIME, S_OK : E_POINTER;
+ return pFormat ? *pFormat = TIME_FORMAT_MEDIA_TIME, S_OK : E_POINTER;
}
STDMETHODIMP CStreamDriveThruFilter::IsUsingTimeFormat(const GUID* pFormat)
{
- return IsFormatSupported(pFormat);
+ return IsFormatSupported(pFormat);
}
STDMETHODIMP CStreamDriveThruFilter::SetTimeFormat(const GUID* pFormat)
{
- return S_OK == IsFormatSupported(pFormat) ? S_OK : E_INVALIDARG;
+ return S_OK == IsFormatSupported(pFormat) ? S_OK : E_INVALIDARG;
}
STDMETHODIMP CStreamDriveThruFilter::GetDuration(LONGLONG* pDuration)
{
- CheckPointer(pDuration, E_POINTER);
- CheckPointer(m_pInput, VFW_E_NOT_CONNECTED);
+ CheckPointer(pDuration, E_POINTER);
+ CheckPointer(m_pInput, VFW_E_NOT_CONNECTED);
- if (CComQIPtr<IAsyncReader> pAsyncReader = m_pInput->GetConnected()) {
- LONGLONG total, available;
- if (SUCCEEDED(pAsyncReader->Length(&total, &available))) {
- *pDuration = total;
- return S_OK;
- }
- }
+ if (CComQIPtr<IAsyncReader> pAsyncReader = m_pInput->GetConnected()) {
+ LONGLONG total, available;
+ if (SUCCEEDED(pAsyncReader->Length(&total, &available))) {
+ *pDuration = total;
+ return S_OK;
+ }
+ }
- return E_NOINTERFACE;
+ return E_NOINTERFACE;
}
STDMETHODIMP CStreamDriveThruFilter::GetStopPosition(LONGLONG* pStop)
{
- return GetDuration(pStop);
+ return GetDuration(pStop);
}
STDMETHODIMP CStreamDriveThruFilter::GetCurrentPosition(LONGLONG* pCurrent)
{
- return pCurrent ? *pCurrent = m_position, S_OK : E_POINTER;
+ return pCurrent ? *pCurrent = m_position, S_OK : E_POINTER;
}
STDMETHODIMP CStreamDriveThruFilter::ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CStreamDriveThruFilter::SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CStreamDriveThruFilter::GetPositions(LONGLONG* pCurrent, LONGLONG* pStop)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CStreamDriveThruFilter::GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CStreamDriveThruFilter::SetRate(double dRate)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CStreamDriveThruFilter::GetRate(double* pdRate)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CStreamDriveThruFilter::GetPreroll(LONGLONG* pllPreroll)
{
- return pllPreroll ? *pllPreroll = 0, S_OK : E_POINTER;
+ return pllPreroll ? *pllPreroll = 0, S_OK : E_POINTER;
}
//
@@ -377,7 +377,7 @@ STDMETHODIMP CStreamDriveThruFilter::GetPreroll(LONGLONG* pllPreroll)
//
CStreamDriveThruInputPin::CStreamDriveThruInputPin(TCHAR* pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBasePin(pName, pFilter, pLock, phr, L"Input", PINDIR_INPUT)
+ : CBasePin(pName, pFilter, pLock, phr, L"Input", PINDIR_INPUT)
{
}
@@ -387,83 +387,83 @@ CStreamDriveThruInputPin::~CStreamDriveThruInputPin()
HRESULT CStreamDriveThruInputPin::GetAsyncReader(IAsyncReader** ppAsyncReader)
{
- CheckPointer(ppAsyncReader, E_POINTER);
+ CheckPointer(ppAsyncReader, E_POINTER);
- *ppAsyncReader = NULL;
+ *ppAsyncReader = NULL;
- CheckPointer(m_pAsyncReader, VFW_E_NOT_CONNECTED);
+ CheckPointer(m_pAsyncReader, VFW_E_NOT_CONNECTED);
- (*ppAsyncReader = m_pAsyncReader)->AddRef();
+ (*ppAsyncReader = m_pAsyncReader)->AddRef();
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CStreamDriveThruInputPin::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CStreamDriveThruInputPin::CheckMediaType(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Stream
- ? S_OK
- : E_INVALIDARG;
+ return pmt->majortype == MEDIATYPE_Stream
+ ? S_OK
+ : E_INVALIDARG;
}
HRESULT CStreamDriveThruInputPin::CheckConnect(IPin* pPin)
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::CheckConnect(pPin))) {
- return hr;
- }
+ if (FAILED(hr = __super::CheckConnect(pPin))) {
+ return hr;
+ }
- if (!CComQIPtr<IAsyncReader>(pPin)) {
- return E_NOINTERFACE;
- }
+ if (!CComQIPtr<IAsyncReader>(pPin)) {
+ return E_NOINTERFACE;
+ }
- return S_OK;
+ return S_OK;
}
HRESULT CStreamDriveThruInputPin::BreakConnect()
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::BreakConnect())) {
- return hr;
- }
+ if (FAILED(hr = __super::BreakConnect())) {
+ return hr;
+ }
- m_pAsyncReader.Release();
+ m_pAsyncReader.Release();
- return S_OK;
+ return S_OK;
}
HRESULT CStreamDriveThruInputPin::CompleteConnect(IPin* pPin)
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::CompleteConnect(pPin))) {
- return hr;
- }
+ if (FAILED(hr = __super::CompleteConnect(pPin))) {
+ return hr;
+ }
- CheckPointer(pPin, E_POINTER);
- m_pAsyncReader = pPin;
- CheckPointer(m_pAsyncReader, E_NOINTERFACE);
+ CheckPointer(pPin, E_POINTER);
+ m_pAsyncReader = pPin;
+ CheckPointer(m_pAsyncReader, E_NOINTERFACE);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CStreamDriveThruInputPin::BeginFlush()
{
- return E_UNEXPECTED;
+ return E_UNEXPECTED;
}
STDMETHODIMP CStreamDriveThruInputPin::EndFlush()
{
- return E_UNEXPECTED;
+ return E_UNEXPECTED;
}
//
@@ -471,7 +471,7 @@ STDMETHODIMP CStreamDriveThruInputPin::EndFlush()
//
CStreamDriveThruOutputPin::CStreamDriveThruOutputPin(TCHAR* pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBaseOutputPin(pName, pFilter, pLock, phr, L"Output")
+ : CBaseOutputPin(pName, pFilter, pLock, phr, L"Output")
{
}
@@ -481,128 +481,128 @@ CStreamDriveThruOutputPin::~CStreamDriveThruOutputPin()
HRESULT CStreamDriveThruOutputPin::GetStream(IStream** ppStream)
{
- CheckPointer(ppStream, E_POINTER);
+ CheckPointer(ppStream, E_POINTER);
- *ppStream = NULL;
+ *ppStream = NULL;
- CheckPointer(m_pStream, VFW_E_NOT_CONNECTED);
+ CheckPointer(m_pStream, VFW_E_NOT_CONNECTED);
- (*ppStream = m_pStream)->AddRef();
+ (*ppStream = m_pStream)->AddRef();
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CStreamDriveThruOutputPin::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CStreamDriveThruOutputPin::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties)
{
- ASSERT(pAlloc);
- ASSERT(pProperties);
+ ASSERT(pAlloc);
+ ASSERT(pProperties);
- HRESULT hr = NOERROR;
+ HRESULT hr = NOERROR;
- pProperties->cBuffers = 1;
- pProperties->cbBuffer = PACKETSIZE;
+ pProperties->cBuffers = 1;
+ pProperties->cbBuffer = PACKETSIZE;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- if (Actual.cbBuffer < pProperties->cbBuffer) {
- return E_FAIL;
- }
- ASSERT(Actual.cBuffers == pProperties->cBuffers);
+ if (Actual.cbBuffer < pProperties->cbBuffer) {
+ return E_FAIL;
+ }
+ ASSERT(Actual.cBuffers == pProperties->cBuffers);
- return NOERROR;
+ return NOERROR;
}
HRESULT CStreamDriveThruOutputPin::CheckMediaType(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Stream
- ? S_OK
- : E_INVALIDARG;
+ return pmt->majortype == MEDIATYPE_Stream
+ ? S_OK
+ : E_INVALIDARG;
}
HRESULT CStreamDriveThruOutputPin::GetMediaType(int iPosition, CMediaType* pmt)
{
- CAutoLock cAutoLock(m_pLock);
+ CAutoLock cAutoLock(m_pLock);
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > 0) {
- return VFW_S_NO_MORE_ITEMS;
- }
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > 0) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
- pmt->majortype = MEDIATYPE_Stream;
- pmt->subtype = GUID_NULL;
- pmt->formattype = GUID_NULL;
- pmt->SetSampleSize(PACKETSIZE);
+ pmt->majortype = MEDIATYPE_Stream;
+ pmt->subtype = GUID_NULL;
+ pmt->formattype = GUID_NULL;
+ pmt->SetSampleSize(PACKETSIZE);
- return S_OK;
+ return S_OK;
}
HRESULT CStreamDriveThruOutputPin::CheckConnect(IPin* pPin)
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::CheckConnect(pPin))) {
- return hr;
- }
+ if (FAILED(hr = __super::CheckConnect(pPin))) {
+ return hr;
+ }
- if (!CComQIPtr<IStream>(pPin)) {
- return E_NOINTERFACE;
- }
+ if (!CComQIPtr<IStream>(pPin)) {
+ return E_NOINTERFACE;
+ }
- return S_OK;
+ return S_OK;
}
HRESULT CStreamDriveThruOutputPin::BreakConnect()
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::BreakConnect())) {
- return hr;
- }
+ if (FAILED(hr = __super::BreakConnect())) {
+ return hr;
+ }
- m_pStream.Release();
+ m_pStream.Release();
- return S_OK;
+ return S_OK;
}
HRESULT CStreamDriveThruOutputPin::CompleteConnect(IPin* pPin)
{
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = __super::CompleteConnect(pPin))) {
- return hr;
- }
+ if (FAILED(hr = __super::CompleteConnect(pPin))) {
+ return hr;
+ }
- CheckPointer(pPin, E_POINTER);
- m_pStream = pPin;
- CheckPointer(m_pStream, E_NOINTERFACE);
+ CheckPointer(pPin, E_POINTER);
+ m_pStream = pPin;
+ CheckPointer(m_pStream, E_NOINTERFACE);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CStreamDriveThruOutputPin::BeginFlush()
{
- return E_UNEXPECTED;
+ return E_UNEXPECTED;
}
STDMETHODIMP CStreamDriveThruOutputPin::EndFlush()
{
- return E_UNEXPECTED;
+ return E_UNEXPECTED;
}
STDMETHODIMP CStreamDriveThruOutputPin::Notify(IBaseFilter* pSender, Quality q)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
diff --git a/src/filters/parser/StreamDriveThru/StreamDriveThru.h b/src/filters/parser/StreamDriveThru/StreamDriveThru.h
index c4bb61f24..48eee3fcf 100644
--- a/src/filters/parser/StreamDriveThru/StreamDriveThru.h
+++ b/src/filters/parser/StreamDriveThru/StreamDriveThru.h
@@ -30,100 +30,100 @@
class CStreamDriveThruInputPin : public CBasePin
{
- CComQIPtr<IAsyncReader> m_pAsyncReader;
+ CComQIPtr<IAsyncReader> m_pAsyncReader;
public:
- CStreamDriveThruInputPin(TCHAR* pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- virtual ~CStreamDriveThruInputPin();
+ CStreamDriveThruInputPin(TCHAR* pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ virtual ~CStreamDriveThruInputPin();
- HRESULT GetAsyncReader(IAsyncReader** ppAsyncReader);
+ HRESULT GetAsyncReader(IAsyncReader** ppAsyncReader);
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- HRESULT CheckMediaType(const CMediaType* pmt);
+ HRESULT CheckMediaType(const CMediaType* pmt);
- HRESULT CheckConnect(IPin* pPin);
- HRESULT BreakConnect();
- HRESULT CompleteConnect(IPin* pPin);
+ HRESULT CheckConnect(IPin* pPin);
+ HRESULT BreakConnect();
+ HRESULT CompleteConnect(IPin* pPin);
- STDMETHODIMP BeginFlush();
- STDMETHODIMP EndFlush();
+ STDMETHODIMP BeginFlush();
+ STDMETHODIMP EndFlush();
};
class CStreamDriveThruOutputPin : public CBaseOutputPin
{
- CComQIPtr<IStream> m_pStream;
+ CComQIPtr<IStream> m_pStream;
public:
- CStreamDriveThruOutputPin(TCHAR* pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- virtual ~CStreamDriveThruOutputPin();
+ CStreamDriveThruOutputPin(TCHAR* pName, CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ virtual ~CStreamDriveThruOutputPin();
- HRESULT GetStream(IStream** ppStream);
+ HRESULT GetStream(IStream** ppStream);
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- HRESULT DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT CheckMediaType(const CMediaType* pmt);
- HRESULT GetMediaType(int iPosition, CMediaType* pmt);
+ HRESULT CheckMediaType(const CMediaType* pmt);
+ HRESULT GetMediaType(int iPosition, CMediaType* pmt);
- HRESULT CheckConnect(IPin* pPin);
- HRESULT BreakConnect();
- HRESULT CompleteConnect(IPin* pPin);
+ HRESULT CheckConnect(IPin* pPin);
+ HRESULT BreakConnect();
+ HRESULT CompleteConnect(IPin* pPin);
- STDMETHODIMP BeginFlush();
- STDMETHODIMP EndFlush();
+ STDMETHODIMP BeginFlush();
+ STDMETHODIMP EndFlush();
- STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
+ STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
};
class __declspec(uuid("534FE6FD-F1F0-4aec-9F45-FF397320CE33"))
- CStreamDriveThruFilter : public CBaseFilter, protected CAMThread, public IMediaSeeking
+ CStreamDriveThruFilter : public CBaseFilter, protected CAMThread, public IMediaSeeking
{
- CCritSec m_csLock;
+ CCritSec m_csLock;
- CStreamDriveThruInputPin* m_pInput;
- CStreamDriveThruOutputPin* m_pOutput;
+ CStreamDriveThruInputPin* m_pInput;
+ CStreamDriveThruOutputPin* m_pOutput;
protected:
- enum {CMD_EXIT, CMD_STOP, CMD_PAUSE, CMD_RUN};
- DWORD ThreadProc();
+ enum {CMD_EXIT, CMD_STOP, CMD_PAUSE, CMD_RUN};
+ DWORD ThreadProc();
- LONGLONG m_position;
+ LONGLONG m_position;
public:
- CStreamDriveThruFilter(LPUNKNOWN pUnk, HRESULT* phr);
- virtual ~CStreamDriveThruFilter();
-
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- int GetPinCount();
- CBasePin* GetPin(int n);
-
- STDMETHODIMP Stop();
- STDMETHODIMP Pause();
- STDMETHODIMP Run(REFERENCE_TIME tStart);
-
- // IMediaSeeking
-
- STDMETHODIMP GetCapabilities(DWORD* pCapabilities);
- STDMETHODIMP CheckCapabilities(DWORD* pCapabilities);
- STDMETHODIMP IsFormatSupported(const GUID* pFormat);
- STDMETHODIMP QueryPreferredFormat(GUID* pFormat);
- STDMETHODIMP GetTimeFormat(GUID* pFormat);
- STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
- STDMETHODIMP SetTimeFormat(const GUID* pFormat);
- STDMETHODIMP GetDuration(LONGLONG* pDuration);
- STDMETHODIMP GetStopPosition(LONGLONG* pStop);
- STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent);
- STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
- STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
- STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
- STDMETHODIMP GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest);
- STDMETHODIMP SetRate(double dRate);
- STDMETHODIMP GetRate(double* pdRate);
- STDMETHODIMP GetPreroll(LONGLONG* pllPreroll);
+ CStreamDriveThruFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ virtual ~CStreamDriveThruFilter();
+
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ int GetPinCount();
+ CBasePin* GetPin(int n);
+
+ STDMETHODIMP Stop();
+ STDMETHODIMP Pause();
+ STDMETHODIMP Run(REFERENCE_TIME tStart);
+
+ // IMediaSeeking
+
+ STDMETHODIMP GetCapabilities(DWORD* pCapabilities);
+ STDMETHODIMP CheckCapabilities(DWORD* pCapabilities);
+ STDMETHODIMP IsFormatSupported(const GUID* pFormat);
+ STDMETHODIMP QueryPreferredFormat(GUID* pFormat);
+ STDMETHODIMP GetTimeFormat(GUID* pFormat);
+ STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
+ STDMETHODIMP SetTimeFormat(const GUID* pFormat);
+ STDMETHODIMP GetDuration(LONGLONG* pDuration);
+ STDMETHODIMP GetStopPosition(LONGLONG* pStop);
+ STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent);
+ STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
+ STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags);
+ STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
+ STDMETHODIMP GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest);
+ STDMETHODIMP SetRate(double dRate);
+ STDMETHODIMP GetRate(double* pdRate);
+ STDMETHODIMP GetPreroll(LONGLONG* pllPreroll);
};
diff --git a/src/filters/reader/CDDAReader/CDDAReader.cpp b/src/filters/reader/CDDAReader/CDDAReader.cpp
index d5558e47a..5b33b21e2 100644
--- a/src/filters/reader/CDDAReader/CDDAReader.cpp
+++ b/src/filters/reader/CDDAReader/CDDAReader.cpp
@@ -29,51 +29,51 @@
#include "../../../DSUtil/DSUtil.h"
#define RAW_SECTOR_SIZE 2352
-#define MSF2UINT(hgs) ((hgs[1]*4500)+(hgs[2]*75)+(hgs[3]))
+#define MSF2UINT(hgs) ((hgs[1] * 4500) + (hgs[2] * 75) + (hgs[3]))
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_WAVE},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_WAVE},
};
const AMOVIESETUP_PIN sudOpPin[] = {
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut},
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CCDDAReader), CCDDAReaderName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CCDDAReader), CCDDAReaderName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CCDDAReader>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CCDDAReader>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{54A35221-2C8D-4a31-A5DF-6D809847E393}"),
- _T("0"), _T("0,4,,52494646,8,4,,43444441")); // "RIFFxxxxCDDA"
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{54A35221-2C8D-4a31-A5DF-6D809847E393}"),
+ _T("0"), _T("0,4,,52494646,8,4,,43444441")); // "RIFFxxxxCDDA"
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{54A35221-2C8D-4a31-A5DF-6D809847E393}"),
- _T("Source Filter"), _T("{54A35221-2C8D-4a31-A5DF-6D809847E393}"));
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{54A35221-2C8D-4a31-A5DF-6D809847E393}"),
+ _T("Source Filter"), _T("{54A35221-2C8D-4a31-A5DF-6D809847E393}"));
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".cda"),
- _T("Source Filter"), _T("{54A35221-2C8D-4a31-A5DF-6D809847E393}"));
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".cda"),
+ _T("Source Filter"), _T("{54A35221-2C8D-4a31-A5DF-6D809847E393}"));
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{54A35221-2C8D-4a31-A5DF-6D809847E393}"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".cda"));
+ DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{54A35221-2C8D-4a31-A5DF-6D809847E393}"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".cda"));
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -87,11 +87,11 @@ CFilterApp theApp;
//
CCDDAReader::CCDDAReader(IUnknown* pUnk, HRESULT* phr)
- : CAsyncReader(NAME("CCDDAReader"), pUnk, &m_stream, phr, __uuidof(this))
+ : CAsyncReader(NAME("CCDDAReader"), pUnk, &m_stream, phr, __uuidof(this))
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
}
CCDDAReader::~CCDDAReader()
@@ -100,393 +100,393 @@ CCDDAReader::~CCDDAReader()
STDMETHODIMP CCDDAReader::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(IFileSourceFilter)
- QI2(IAMMediaContent)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IFileSourceFilter)
+ QI2(IAMMediaContent)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
// IFileSourceFilter
STDMETHODIMP CCDDAReader::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt)
{
- if (!m_stream.Load(pszFileName)) {
- return E_FAIL;
- }
+ if (!m_stream.Load(pszFileName)) {
+ return E_FAIL;
+ }
- m_fn = pszFileName;
+ m_fn = pszFileName;
- CMediaType mt;
- mt.majortype = MEDIATYPE_Stream;
- mt.subtype = MEDIASUBTYPE_WAVE;
- m_mt = mt;
+ CMediaType mt;
+ mt.majortype = MEDIATYPE_Stream;
+ mt.subtype = MEDIASUBTYPE_WAVE;
+ m_mt = mt;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CCDDAReader::GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt)
{
- CheckPointer(ppszFileName, E_POINTER);
+ CheckPointer(ppszFileName, E_POINTER);
- *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength()+1)*sizeof(WCHAR));
- if (!(*ppszFileName)) {
- return E_OUTOFMEMORY;
- }
+ *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength() + 1) * sizeof(WCHAR));
+ if (!(*ppszFileName)) {
+ return E_OUTOFMEMORY;
+ }
- wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
+ wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
- return S_OK;
+ return S_OK;
}
// IAMMediaContent
STDMETHODIMP CCDDAReader::GetTypeInfoCount(UINT* pctinfo)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::get_AuthorName(BSTR* pbstrAuthorName)
{
- CheckPointer(pbstrAuthorName, E_POINTER);
- CString str = m_stream.m_trackArtist;
- if (str.IsEmpty()) {
- str = m_stream.m_discArtist;
- }
- *pbstrAuthorName = str.AllocSysString();
- return S_OK;
+ CheckPointer(pbstrAuthorName, E_POINTER);
+ CString str = m_stream.m_trackArtist;
+ if (str.IsEmpty()) {
+ str = m_stream.m_discArtist;
+ }
+ *pbstrAuthorName = str.AllocSysString();
+ return S_OK;
}
STDMETHODIMP CCDDAReader::get_Title(BSTR* pbstrTitle)
{
- CheckPointer(pbstrTitle, E_POINTER);
- CString str = m_stream.m_trackTitle;
- if (str.IsEmpty()) {
- str = m_stream.m_discTitle;
- }
- *pbstrTitle = str.AllocSysString();
- return S_OK;
+ CheckPointer(pbstrTitle, E_POINTER);
+ CString str = m_stream.m_trackTitle;
+ if (str.IsEmpty()) {
+ str = m_stream.m_discTitle;
+ }
+ *pbstrTitle = str.AllocSysString();
+ return S_OK;
}
STDMETHODIMP CCDDAReader::get_Rating(BSTR* pbstrRating)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::get_Description(BSTR* pbstrDescription)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::get_Copyright(BSTR* pbstrCopyright)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::get_BaseURL(BSTR* pbstrBaseURL)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::get_LogoURL(BSTR* pbstrLogoURL)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::get_LogoIconURL(BSTR* pbstrLogoURL)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::get_WatermarkURL(BSTR* pbstrWatermarkURL)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::get_MoreInfoURL(BSTR* pbstrMoreInfoURL)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::get_MoreInfoBannerImage(BSTR* pbstrMoreInfoBannerImage)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::get_MoreInfoBannerURL(BSTR* pbstrMoreInfoBannerURL)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CCDDAReader::get_MoreInfoText(BSTR* pbstrMoreInfoText)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// CCDDAStream
CCDDAStream::CCDDAStream()
{
- m_hDrive = INVALID_HANDLE_VALUE;
+ m_hDrive = INVALID_HANDLE_VALUE;
- m_llPosition = m_llLength = 0;
+ m_llPosition = m_llLength = 0;
- memset(&m_TOC, 0, sizeof(m_TOC));
- m_nStartSector = m_nStopSector = 0;
+ memset(&m_TOC, 0, sizeof(m_TOC));
+ m_nStartSector = m_nStopSector = 0;
- memset(&m_header, 0, sizeof(m_header));
- m_header.riff.hdr.chunkID = RIFFID;
- m_header.riff.WAVE = WAVEID;
- m_header.frm.hdr.chunkID = FormatID;
- m_header.frm.hdr.chunkSize = sizeof(m_header.frm.pcm);
- m_header.frm.pcm.wf.wFormatTag = WAVE_FORMAT_PCM;
- m_header.frm.pcm.wf.nSamplesPerSec = 44100;
- m_header.frm.pcm.wf.nChannels = 2;
- m_header.frm.pcm.wBitsPerSample = 16;
- m_header.frm.pcm.wf.nBlockAlign = m_header.frm.pcm.wf.nChannels * m_header.frm.pcm.wBitsPerSample / 8;
- m_header.frm.pcm.wf.nAvgBytesPerSec = m_header.frm.pcm.wf.nSamplesPerSec * m_header.frm.pcm.wf.nBlockAlign;
- m_header.data.hdr.chunkID = DataID;
+ memset(&m_header, 0, sizeof(m_header));
+ m_header.riff.hdr.chunkID = RIFFID;
+ m_header.riff.WAVE = WAVEID;
+ m_header.frm.hdr.chunkID = FormatID;
+ m_header.frm.hdr.chunkSize = sizeof(m_header.frm.pcm);
+ m_header.frm.pcm.wf.wFormatTag = WAVE_FORMAT_PCM;
+ m_header.frm.pcm.wf.nSamplesPerSec = 44100;
+ m_header.frm.pcm.wf.nChannels = 2;
+ m_header.frm.pcm.wBitsPerSample = 16;
+ m_header.frm.pcm.wf.nBlockAlign = m_header.frm.pcm.wf.nChannels * m_header.frm.pcm.wBitsPerSample / 8;
+ m_header.frm.pcm.wf.nAvgBytesPerSec = m_header.frm.pcm.wf.nSamplesPerSec * m_header.frm.pcm.wf.nBlockAlign;
+ m_header.data.hdr.chunkID = DataID;
}
CCDDAStream::~CCDDAStream()
{
- if (m_hDrive != INVALID_HANDLE_VALUE) {
- CloseHandle(m_hDrive);
- m_hDrive = INVALID_HANDLE_VALUE;
- }
+ if (m_hDrive != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hDrive);
+ m_hDrive = INVALID_HANDLE_VALUE;
+ }
}
bool CCDDAStream::Load(const WCHAR* fnw)
{
- CString path(fnw);
-
- int iDriveLetter = path.Find(_T(":\\"))-1;
- int iTrackIndex = CString(path).MakeLower().Find(_T(".cda"))-1;
- if (iDriveLetter < 0 || iTrackIndex <= iDriveLetter) {
- return false;
- }
-
- CString drive = CString(_T("\\\\.\\")) + path[iDriveLetter] + _T(":");
- while (iTrackIndex > 0 && _istdigit(path[iTrackIndex-1])) {
- iTrackIndex--;
- }
- if (1 != _stscanf_s(path.Mid(iTrackIndex), _T("%d"), &iTrackIndex)) {
- return false;
- }
-
- if (m_hDrive != INVALID_HANDLE_VALUE) {
- CloseHandle(m_hDrive);
- m_hDrive = INVALID_HANDLE_VALUE;
- }
-
- m_hDrive = CreateFile(drive, GENERIC_READ, FILE_SHARE_READ, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_READONLY|FILE_FLAG_SEQUENTIAL_SCAN, (HANDLE)NULL);
- if (m_hDrive == INVALID_HANDLE_VALUE) {
- return false;
- }
-
- DWORD BytesReturned;
- if (!DeviceIoControl(m_hDrive, IOCTL_CDROM_READ_TOC, NULL, 0, &m_TOC, sizeof(m_TOC), &BytesReturned, 0)
- || !(m_TOC.FirstTrack <= iTrackIndex && iTrackIndex <= m_TOC.LastTrack)) {
- CloseHandle(m_hDrive);
- m_hDrive = INVALID_HANDLE_VALUE;
- return false;
- }
-
- // MMC-3 Draft Revision 10g: Table 222 - Q Sub-channel control field
- m_TOC.TrackData[iTrackIndex-1].Control &= 5;
- if (!(m_TOC.TrackData[iTrackIndex-1].Control == 0 || m_TOC.TrackData[iTrackIndex-1].Control == 1)) {
- CloseHandle(m_hDrive);
- m_hDrive = INVALID_HANDLE_VALUE;
- return false;
- }
-
- if (m_TOC.TrackData[iTrackIndex-1].Control&8) {
- m_header.frm.pcm.wf.nChannels = 4;
- }
-
- m_nStartSector = MSF2UINT(m_TOC.TrackData[iTrackIndex-1].Address) - 150;//MSF2UINT(m_TOC.TrackData[0].Address);
- m_nStopSector = MSF2UINT(m_TOC.TrackData[iTrackIndex].Address) - 150;//MSF2UINT(m_TOC.TrackData[0].Address);
-
- m_llLength = (m_nStopSector-m_nStartSector)*RAW_SECTOR_SIZE;
-
- m_header.riff.hdr.chunkSize = (long)(m_llLength + sizeof(m_header) - 8);
- m_header.data.hdr.chunkSize = (long)(m_llLength);
-
- do {
- CDROM_READ_TOC_EX TOCEx;
- memset(&TOCEx, 0, sizeof(TOCEx));
- TOCEx.Format = CDROM_READ_TOC_EX_FORMAT_CDTEXT;
- TOCEx.SessionTrack = iTrackIndex;
- WORD size = 0;
- ASSERT(MINIMUM_CDROM_READ_TOC_EX_SIZE == sizeof(size));
- if (!DeviceIoControl(m_hDrive, IOCTL_CDROM_READ_TOC_EX, &TOCEx, sizeof(TOCEx), &size, sizeof(size), &BytesReturned, 0)) {
- break;
- }
-
- size = ((size>>8)|(size<<8)) + sizeof(size);
-
- CAutoVectorPtr<BYTE> pCDTextData;
- pCDTextData.Allocate(size);
- memset(pCDTextData, 0, size);
-
- if (!DeviceIoControl(m_hDrive, IOCTL_CDROM_READ_TOC_EX, &TOCEx, sizeof(TOCEx), pCDTextData, size, &BytesReturned, 0)) {
- break;
- }
-
- size = (WORD)(BytesReturned - sizeof(CDROM_TOC_CD_TEXT_DATA));
- CDROM_TOC_CD_TEXT_DATA_BLOCK* pDesc = ((CDROM_TOC_CD_TEXT_DATA*)(BYTE*)pCDTextData)->Descriptors;
-
- CStringArray str[16];
- for (int i = 0; i < 16; i++) {
- str[i].SetSize(1+m_TOC.LastTrack);
- }
- CString last;
-
- for (int i = 0; size >= sizeof(CDROM_TOC_CD_TEXT_DATA_BLOCK); i++, size -= sizeof(CDROM_TOC_CD_TEXT_DATA_BLOCK), pDesc++) {
- if (pDesc->TrackNumber > m_TOC.LastTrack) {
- continue;
- }
-
- const int lenU = _countof(pDesc->Text);
- const int lenW = _countof(pDesc->WText);
-
- CString text = !pDesc->Unicode
- ? CString(CStringA((CHAR*)pDesc->Text, lenU))
- : CString(CStringW((WCHAR*)pDesc->WText, lenW));
-
- int tlen = text.GetLength();
- CString tmp = (tlen < 12-1)
- ? (!pDesc->Unicode
- ? CString(CStringA((CHAR*)pDesc->Text+tlen+1, lenU-(tlen+1)))
- : CString(CStringW((WCHAR*)pDesc->WText+tlen+1, lenW-(tlen+1))))
- : _T("");
-
- if ((pDesc->PackType -= 0x80) >= 0x10) {
- continue;
- }
-
- if (pDesc->CharacterPosition == 0) {
- str[pDesc->PackType][pDesc->TrackNumber] = text;
- } else if (pDesc->CharacterPosition <= 0xf) {
- if (pDesc->CharacterPosition < 0xf && last.GetLength() > 0) {
- str[pDesc->PackType][pDesc->TrackNumber] = last + text;
- } else {
- str[pDesc->PackType][pDesc->TrackNumber] += text;
- }
- }
-
- last = tmp;
- }
-
- m_discTitle = str[0][0];
- m_trackTitle = str[0][iTrackIndex];
- m_discArtist = str[1][0];
- m_trackArtist = str[1][iTrackIndex];
- } while (0);
-
-
- return true;
+ CString path(fnw);
+
+ int iDriveLetter = path.Find(_T(":\\")) - 1;
+ int iTrackIndex = CString(path).MakeLower().Find(_T(".cda")) - 1;
+ if (iDriveLetter < 0 || iTrackIndex <= iDriveLetter) {
+ return false;
+ }
+
+ CString drive = CString(_T("\\\\.\\")) + path[iDriveLetter] + _T(":");
+ while (iTrackIndex > 0 && _istdigit(path[iTrackIndex - 1])) {
+ iTrackIndex--;
+ }
+ if (1 != _stscanf_s(path.Mid(iTrackIndex), _T("%d"), &iTrackIndex)) {
+ return false;
+ }
+
+ if (m_hDrive != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hDrive);
+ m_hDrive = INVALID_HANDLE_VALUE;
+ }
+
+ m_hDrive = CreateFile(drive, GENERIC_READ, FILE_SHARE_READ, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_READONLY | FILE_FLAG_SEQUENTIAL_SCAN, (HANDLE)NULL);
+ if (m_hDrive == INVALID_HANDLE_VALUE) {
+ return false;
+ }
+
+ DWORD BytesReturned;
+ if (!DeviceIoControl(m_hDrive, IOCTL_CDROM_READ_TOC, NULL, 0, &m_TOC, sizeof(m_TOC), &BytesReturned, 0)
+ || !(m_TOC.FirstTrack <= iTrackIndex && iTrackIndex <= m_TOC.LastTrack)) {
+ CloseHandle(m_hDrive);
+ m_hDrive = INVALID_HANDLE_VALUE;
+ return false;
+ }
+
+ // MMC-3 Draft Revision 10g: Table 222 - Q Sub-channel control field
+ m_TOC.TrackData[iTrackIndex - 1].Control &= 5;
+ if (!(m_TOC.TrackData[iTrackIndex - 1].Control == 0 || m_TOC.TrackData[iTrackIndex - 1].Control == 1)) {
+ CloseHandle(m_hDrive);
+ m_hDrive = INVALID_HANDLE_VALUE;
+ return false;
+ }
+
+ if (m_TOC.TrackData[iTrackIndex - 1].Control & 8) {
+ m_header.frm.pcm.wf.nChannels = 4;
+ }
+
+ m_nStartSector = MSF2UINT(m_TOC.TrackData[iTrackIndex - 1].Address) - 150; //MSF2UINT(m_TOC.TrackData[0].Address);
+ m_nStopSector = MSF2UINT(m_TOC.TrackData[iTrackIndex].Address) - 150;//MSF2UINT(m_TOC.TrackData[0].Address);
+
+ m_llLength = (m_nStopSector - m_nStartSector) * RAW_SECTOR_SIZE;
+
+ m_header.riff.hdr.chunkSize = (long)(m_llLength + sizeof(m_header) - 8);
+ m_header.data.hdr.chunkSize = (long)(m_llLength);
+
+ do {
+ CDROM_READ_TOC_EX TOCEx;
+ memset(&TOCEx, 0, sizeof(TOCEx));
+ TOCEx.Format = CDROM_READ_TOC_EX_FORMAT_CDTEXT;
+ TOCEx.SessionTrack = iTrackIndex;
+ WORD size = 0;
+ ASSERT(MINIMUM_CDROM_READ_TOC_EX_SIZE == sizeof(size));
+ if (!DeviceIoControl(m_hDrive, IOCTL_CDROM_READ_TOC_EX, &TOCEx, sizeof(TOCEx), &size, sizeof(size), &BytesReturned, 0)) {
+ break;
+ }
+
+ size = ((size >> 8) | (size << 8)) + sizeof(size);
+
+ CAutoVectorPtr<BYTE> pCDTextData;
+ pCDTextData.Allocate(size);
+ memset(pCDTextData, 0, size);
+
+ if (!DeviceIoControl(m_hDrive, IOCTL_CDROM_READ_TOC_EX, &TOCEx, sizeof(TOCEx), pCDTextData, size, &BytesReturned, 0)) {
+ break;
+ }
+
+ size = (WORD)(BytesReturned - sizeof(CDROM_TOC_CD_TEXT_DATA));
+ CDROM_TOC_CD_TEXT_DATA_BLOCK* pDesc = ((CDROM_TOC_CD_TEXT_DATA*)(BYTE*)pCDTextData)->Descriptors;
+
+ CStringArray str[16];
+ for (int i = 0; i < 16; i++) {
+ str[i].SetSize(1 + m_TOC.LastTrack);
+ }
+ CString last;
+
+ for (int i = 0; size >= sizeof(CDROM_TOC_CD_TEXT_DATA_BLOCK); i++, size -= sizeof(CDROM_TOC_CD_TEXT_DATA_BLOCK), pDesc++) {
+ if (pDesc->TrackNumber > m_TOC.LastTrack) {
+ continue;
+ }
+
+ const int lenU = _countof(pDesc->Text);
+ const int lenW = _countof(pDesc->WText);
+
+ CString text = !pDesc->Unicode
+ ? CString(CStringA((CHAR*)pDesc->Text, lenU))
+ : CString(CStringW((WCHAR*)pDesc->WText, lenW));
+
+ int tlen = text.GetLength();
+ CString tmp = (tlen < 12 - 1)
+ ? (!pDesc->Unicode
+ ? CString(CStringA((CHAR*)pDesc->Text + tlen + 1, lenU - (tlen + 1)))
+ : CString(CStringW((WCHAR*)pDesc->WText + tlen + 1, lenW - (tlen + 1))))
+ : _T("");
+
+ if ((pDesc->PackType -= 0x80) >= 0x10) {
+ continue;
+ }
+
+ if (pDesc->CharacterPosition == 0) {
+ str[pDesc->PackType][pDesc->TrackNumber] = text;
+ } else if (pDesc->CharacterPosition <= 0xf) {
+ if (pDesc->CharacterPosition < 0xf && last.GetLength() > 0) {
+ str[pDesc->PackType][pDesc->TrackNumber] = last + text;
+ } else {
+ str[pDesc->PackType][pDesc->TrackNumber] += text;
+ }
+ }
+
+ last = tmp;
+ }
+
+ m_discTitle = str[0][0];
+ m_trackTitle = str[0][iTrackIndex];
+ m_discArtist = str[1][0];
+ m_trackArtist = str[1][iTrackIndex];
+ } while (0);
+
+
+ return true;
}
HRESULT CCDDAStream::SetPointer(LONGLONG llPos)
{
- if (llPos < 0 || llPos > m_llLength) {
- return S_FALSE;
- }
- m_llPosition = llPos;
- return S_OK;
+ if (llPos < 0 || llPos > m_llLength) {
+ return S_FALSE;
+ }
+ m_llPosition = llPos;
+ return S_OK;
}
HRESULT CCDDAStream::Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead)
{
- CAutoLock lck(&m_csLock);
+ CAutoLock lck(&m_csLock);
- BYTE buff[RAW_SECTOR_SIZE];
+ BYTE buff[RAW_SECTOR_SIZE];
- PBYTE pbBufferOrg = pbBuffer;
- LONGLONG pos = m_llPosition;
- size_t len = (size_t)dwBytesToRead;
+ PBYTE pbBufferOrg = pbBuffer;
+ LONGLONG pos = m_llPosition;
+ size_t len = (size_t)dwBytesToRead;
- if (pos < sizeof(m_header) && len > 0) {
- size_t l = (size_t)min(len, sizeof(m_header) - pos);
- memcpy(pbBuffer, &((BYTE*)&m_header)[pos], l);
- pbBuffer += l;
- pos += l;
- len -= l;
- }
+ if (pos < sizeof(m_header) && len > 0) {
+ size_t l = (size_t)min(len, sizeof(m_header) - pos);
+ memcpy(pbBuffer, &((BYTE*)&m_header)[pos], l);
+ pbBuffer += l;
+ pos += l;
+ len -= l;
+ }
- pos -= sizeof(m_header);
+ pos -= sizeof(m_header);
- while (pos >= 0 && pos < m_llLength && len > 0) {
- RAW_READ_INFO rawreadinfo;
- rawreadinfo.SectorCount = 1;
- rawreadinfo.TrackMode = CDDA;
+ while (pos >= 0 && pos < m_llLength && len > 0) {
+ RAW_READ_INFO rawreadinfo;
+ rawreadinfo.SectorCount = 1;
+ rawreadinfo.TrackMode = CDDA;
- UINT sector = m_nStartSector + int(pos/RAW_SECTOR_SIZE);
- __int64 offset = pos%RAW_SECTOR_SIZE;
+ UINT sector = m_nStartSector + int(pos / RAW_SECTOR_SIZE);
+ __int64 offset = pos % RAW_SECTOR_SIZE;
- rawreadinfo.DiskOffset.QuadPart = sector*2048;
- DWORD BytesReturned = 0;
- BOOL b = DeviceIoControl(
- m_hDrive, IOCTL_CDROM_RAW_READ,
- &rawreadinfo, sizeof(rawreadinfo),
- buff, RAW_SECTOR_SIZE,
- &BytesReturned, 0);
- UNREFERENCED_PARAMETER(b);
+ rawreadinfo.DiskOffset.QuadPart = sector * 2048;
+ DWORD BytesReturned = 0;
+ BOOL b = DeviceIoControl(
+ m_hDrive, IOCTL_CDROM_RAW_READ,
+ &rawreadinfo, sizeof(rawreadinfo),
+ buff, RAW_SECTOR_SIZE,
+ &BytesReturned, 0);
+ UNREFERENCED_PARAMETER(b);
- size_t l = (size_t)min(min(len, size_t(RAW_SECTOR_SIZE - offset)), size_t(m_llLength - pos));
- memcpy(pbBuffer, &buff[offset], l);
+ size_t l = (size_t)min(min(len, size_t(RAW_SECTOR_SIZE - offset)), size_t(m_llLength - pos));
+ memcpy(pbBuffer, &buff[offset], l);
- pbBuffer += l;
- pos += l;
- len -= l;
- }
+ pbBuffer += l;
+ pos += l;
+ len -= l;
+ }
- if (pdwBytesRead) {
- *pdwBytesRead = pbBuffer - pbBufferOrg;
- }
- m_llPosition += pbBuffer - pbBufferOrg;
+ if (pdwBytesRead) {
+ *pdwBytesRead = pbBuffer - pbBufferOrg;
+ }
+ m_llPosition += pbBuffer - pbBufferOrg;
- return S_OK;
+ return S_OK;
}
LONGLONG CCDDAStream::Size(LONGLONG* pSizeAvailable)
{
- LONGLONG size = sizeof(m_header) + m_llLength;
- if (pSizeAvailable) {
- *pSizeAvailable = size;
- }
- return size;
+ LONGLONG size = sizeof(m_header) + m_llLength;
+ if (pSizeAvailable) {
+ *pSizeAvailable = size;
+ }
+ return size;
}
DWORD CCDDAStream::Alignment()
{
- return 1;
+ return 1;
}
void CCDDAStream::Lock()
{
- m_csLock.Lock();
+ m_csLock.Lock();
}
void CCDDAStream::Unlock()
{
- m_csLock.Unlock();
+ m_csLock.Unlock();
}
diff --git a/src/filters/reader/CDDAReader/CDDAReader.h b/src/filters/reader/CDDAReader/CDDAReader.h
index af33cae90..2ed9f2daf 100644
--- a/src/filters/reader/CDDAReader/CDDAReader.h
+++ b/src/filters/reader/CDDAReader/CDDAReader.h
@@ -33,104 +33,104 @@
#define CCDDAReaderName L"MPC CDDA Reader"
typedef struct {
- UINT chunkID;
- long chunkSize;
+ UINT chunkID;
+ long chunkSize;
} ChunkHeader;
#define RIFFID 'FFIR'
#define WAVEID 'EVAW'
typedef struct {
- ChunkHeader hdr;
- UINT WAVE;
+ ChunkHeader hdr;
+ UINT WAVE;
} RIFFChunk;
#define FormatID ' tmf'
typedef struct {
- ChunkHeader hdr;
- PCMWAVEFORMAT pcm;
+ ChunkHeader hdr;
+ PCMWAVEFORMAT pcm;
} FormatChunk;
#define DataID 'atad'
typedef struct {
- ChunkHeader hdr;
+ ChunkHeader hdr;
} DataChunk;
typedef struct {
- RIFFChunk riff;
- FormatChunk frm;
- DataChunk data;
+ RIFFChunk riff;
+ FormatChunk frm;
+ DataChunk data;
} WAVEChunck;
class CCDDAStream : public CAsyncStream
{
private:
- CCritSec m_csLock;
+ CCritSec m_csLock;
- LONGLONG m_llPosition, m_llLength;
+ LONGLONG m_llPosition, m_llLength;
- HANDLE m_hDrive;
- CDROM_TOC m_TOC;
- UINT m_nFirstSector, m_nStartSector, m_nStopSector;
+ HANDLE m_hDrive;
+ CDROM_TOC m_TOC;
+ UINT m_nFirstSector, m_nStartSector, m_nStopSector;
- WAVEChunck m_header;
+ WAVEChunck m_header;
public:
- CCDDAStream();
- virtual ~CCDDAStream();
+ CCDDAStream();
+ virtual ~CCDDAStream();
- CString m_discTitle, m_trackTitle;
- CString m_discArtist, m_trackArtist;
+ CString m_discTitle, m_trackTitle;
+ CString m_discArtist, m_trackArtist;
- bool Load(const WCHAR* fnw);
+ bool Load(const WCHAR* fnw);
- // overrides
- HRESULT SetPointer(LONGLONG llPos);
- HRESULT Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead);
- LONGLONG Size(LONGLONG* pSizeAvailable);
- DWORD Alignment();
- void Lock();
- void Unlock();
+ // overrides
+ HRESULT SetPointer(LONGLONG llPos);
+ HRESULT Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead);
+ LONGLONG Size(LONGLONG* pSizeAvailable);
+ DWORD Alignment();
+ void Lock();
+ void Unlock();
};
class __declspec(uuid("54A35221-2C8D-4a31-A5DF-6D809847E393"))
- CCDDAReader
- : public CAsyncReader
- , public IFileSourceFilter
- , public IAMMediaContent
+ CCDDAReader
+ : public CAsyncReader
+ , public IFileSourceFilter
+ , public IAMMediaContent
{
- CCDDAStream m_stream;
- CStringW m_fn;
+ CCDDAStream m_stream;
+ CStringW m_fn;
public:
- CCDDAReader(IUnknown* pUnk, HRESULT* phr);
- ~CCDDAReader();
-
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- // IFileSourceFilter
-
- STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
- STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
-
- // IAMMediaContent
-
- STDMETHODIMP GetTypeInfoCount(UINT* pctinfo);
- STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo);
- STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid);
- STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr);
-
- STDMETHODIMP get_AuthorName(BSTR* pbstrAuthorName);
- STDMETHODIMP get_Title(BSTR* pbstrTitle);
- STDMETHODIMP get_Rating(BSTR* pbstrRating);
- STDMETHODIMP get_Description(BSTR* pbstrDescription);
- STDMETHODIMP get_Copyright(BSTR* pbstrCopyright);
- STDMETHODIMP get_BaseURL(BSTR* pbstrBaseURL);
- STDMETHODIMP get_LogoURL(BSTR* pbstrLogoURL);
- STDMETHODIMP get_LogoIconURL(BSTR* pbstrLogoURL);
- STDMETHODIMP get_WatermarkURL(BSTR* pbstrWatermarkURL);
- STDMETHODIMP get_MoreInfoURL(BSTR* pbstrMoreInfoURL);
- STDMETHODIMP get_MoreInfoBannerImage(BSTR* pbstrMoreInfoBannerImage);
- STDMETHODIMP get_MoreInfoBannerURL(BSTR* pbstrMoreInfoBannerURL);
- STDMETHODIMP get_MoreInfoText(BSTR* pbstrMoreInfoText);
+ CCDDAReader(IUnknown* pUnk, HRESULT* phr);
+ ~CCDDAReader();
+
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ // IFileSourceFilter
+
+ STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
+
+ // IAMMediaContent
+
+ STDMETHODIMP GetTypeInfoCount(UINT* pctinfo);
+ STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo);
+ STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid);
+ STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr);
+
+ STDMETHODIMP get_AuthorName(BSTR* pbstrAuthorName);
+ STDMETHODIMP get_Title(BSTR* pbstrTitle);
+ STDMETHODIMP get_Rating(BSTR* pbstrRating);
+ STDMETHODIMP get_Description(BSTR* pbstrDescription);
+ STDMETHODIMP get_Copyright(BSTR* pbstrCopyright);
+ STDMETHODIMP get_BaseURL(BSTR* pbstrBaseURL);
+ STDMETHODIMP get_LogoURL(BSTR* pbstrLogoURL);
+ STDMETHODIMP get_LogoIconURL(BSTR* pbstrLogoURL);
+ STDMETHODIMP get_WatermarkURL(BSTR* pbstrWatermarkURL);
+ STDMETHODIMP get_MoreInfoURL(BSTR* pbstrMoreInfoURL);
+ STDMETHODIMP get_MoreInfoBannerImage(BSTR* pbstrMoreInfoBannerImage);
+ STDMETHODIMP get_MoreInfoBannerURL(BSTR* pbstrMoreInfoBannerURL);
+ STDMETHODIMP get_MoreInfoText(BSTR* pbstrMoreInfoText);
};
diff --git a/src/filters/reader/CDXAReader/CDXAReader.cpp b/src/filters/reader/CDXAReader/CDXAReader.cpp
index 64beb50d7..6d9e32687 100644
--- a/src/filters/reader/CDXAReader/CDXAReader.cpp
+++ b/src/filters/reader/CDXAReader/CDXAReader.cpp
@@ -33,82 +33,82 @@
/////////
static DWORD EDC_crctable[256] = {
- 0x00000000l, 0x90910101l, 0x91210201l, 0x01b00300l,
- 0x92410401l, 0x02d00500l, 0x03600600l, 0x93f10701l,
- 0x94810801l, 0x04100900l, 0x05a00a00l, 0x95310b01l,
- 0x06c00c00l, 0x96510d01l, 0x97e10e01l, 0x07700f00l,
- 0x99011001l, 0x09901100l, 0x08201200l, 0x98b11301l,
- 0x0b401400l, 0x9bd11501l, 0x9a611601l, 0x0af01700l,
- 0x0d801800l, 0x9d111901l, 0x9ca11a01l, 0x0c301b00l,
- 0x9fc11c01l, 0x0f501d00l, 0x0ee01e00l, 0x9e711f01l,
- 0x82012001l, 0x12902100l, 0x13202200l, 0x83b12301l,
- 0x10402400l, 0x80d12501l, 0x81612601l, 0x11f02700l,
- 0x16802800l, 0x86112901l, 0x87a12a01l, 0x17302b00l,
- 0x84c12c01l, 0x14502d00l, 0x15e02e00l, 0x85712f01l,
- 0x1b003000l, 0x8b913101l, 0x8a213201l, 0x1ab03300l,
- 0x89413401l, 0x19d03500l, 0x18603600l, 0x88f13701l,
- 0x8f813801l, 0x1f103900l, 0x1ea03a00l, 0x8e313b01l,
- 0x1dc03c00l, 0x8d513d01l, 0x8ce13e01l, 0x1c703f00l,
- 0xb4014001l, 0x24904100l, 0x25204200l, 0xb5b14301l,
- 0x26404400l, 0xb6d14501l, 0xb7614601l, 0x27f04700l,
- 0x20804800l, 0xb0114901l, 0xb1a14a01l, 0x21304b00l,
- 0xb2c14c01l, 0x22504d00l, 0x23e04e00l, 0xb3714f01l,
- 0x2d005000l, 0xbd915101l, 0xbc215201l, 0x2cb05300l,
- 0xbf415401l, 0x2fd05500l, 0x2e605600l, 0xbef15701l,
- 0xb9815801l, 0x29105900l, 0x28a05a00l, 0xb8315b01l,
- 0x2bc05c00l, 0xbb515d01l, 0xbae15e01l, 0x2a705f00l,
- 0x36006000l, 0xa6916101l, 0xa7216201l, 0x37b06300l,
- 0xa4416401l, 0x34d06500l, 0x35606600l, 0xa5f16701l,
- 0xa2816801l, 0x32106900l, 0x33a06a00l, 0xa3316b01l,
- 0x30c06c00l, 0xa0516d01l, 0xa1e16e01l, 0x31706f00l,
- 0xaf017001l, 0x3f907100l, 0x3e207200l, 0xaeb17301l,
- 0x3d407400l, 0xadd17501l, 0xac617601l, 0x3cf07700l,
- 0x3b807800l, 0xab117901l, 0xaaa17a01l, 0x3a307b00l,
- 0xa9c17c01l, 0x39507d00l, 0x38e07e00l, 0xa8717f01l,
- 0xd8018001l, 0x48908100l, 0x49208200l, 0xd9b18301l,
- 0x4a408400l, 0xdad18501l, 0xdb618601l, 0x4bf08700l,
- 0x4c808800l, 0xdc118901l, 0xdda18a01l, 0x4d308b00l,
- 0xdec18c01l, 0x4e508d00l, 0x4fe08e00l, 0xdf718f01l,
- 0x41009000l, 0xd1919101l, 0xd0219201l, 0x40b09300l,
- 0xd3419401l, 0x43d09500l, 0x42609600l, 0xd2f19701l,
- 0xd5819801l, 0x45109900l, 0x44a09a00l, 0xd4319b01l,
- 0x47c09c00l, 0xd7519d01l, 0xd6e19e01l, 0x46709f00l,
- 0x5a00a000l, 0xca91a101l, 0xcb21a201l, 0x5bb0a300l,
- 0xc841a401l, 0x58d0a500l, 0x5960a600l, 0xc9f1a701l,
- 0xce81a801l, 0x5e10a900l, 0x5fa0aa00l, 0xcf31ab01l,
- 0x5cc0ac00l, 0xcc51ad01l, 0xcde1ae01l, 0x5d70af00l,
- 0xc301b001l, 0x5390b100l, 0x5220b200l, 0xc2b1b301l,
- 0x5140b400l, 0xc1d1b501l, 0xc061b601l, 0x50f0b700l,
- 0x5780b800l, 0xc711b901l, 0xc6a1ba01l, 0x5630bb00l,
- 0xc5c1bc01l, 0x5550bd00l, 0x54e0be00l, 0xc471bf01l,
- 0x6c00c000l, 0xfc91c101l, 0xfd21c201l, 0x6db0c300l,
- 0xfe41c401l, 0x6ed0c500l, 0x6f60c600l, 0xfff1c701l,
- 0xf881c801l, 0x6810c900l, 0x69a0ca00l, 0xf931cb01l,
- 0x6ac0cc00l, 0xfa51cd01l, 0xfbe1ce01l, 0x6b70cf00l,
- 0xf501d001l, 0x6590d100l, 0x6420d200l, 0xf4b1d301l,
- 0x6740d400l, 0xf7d1d501l, 0xf661d601l, 0x66f0d700l,
- 0x6180d800l, 0xf111d901l, 0xf0a1da01l, 0x6030db00l,
- 0xf3c1dc01l, 0x6350dd00l, 0x62e0de00l, 0xf271df01l,
- 0xee01e001l, 0x7e90e100l, 0x7f20e200l, 0xefb1e301l,
- 0x7c40e400l, 0xecd1e501l, 0xed61e601l, 0x7df0e700l,
- 0x7a80e800l, 0xea11e901l, 0xeba1ea01l, 0x7b30eb00l,
- 0xe8c1ec01l, 0x7850ed00l, 0x79e0ee00l, 0xe971ef01l,
- 0x7700f000l, 0xe791f101l, 0xe621f201l, 0x76b0f300l,
- 0xe541f401l, 0x75d0f500l, 0x7460f600l, 0xe4f1f701l,
- 0xe381f801l, 0x7310f900l, 0x72a0fa00l, 0xe231fb01l,
- 0x71c0fc00l, 0xe151fd01l, 0xe0e1fe01l, 0x7070ff00l
+ 0x00000000l, 0x90910101l, 0x91210201l, 0x01b00300l,
+ 0x92410401l, 0x02d00500l, 0x03600600l, 0x93f10701l,
+ 0x94810801l, 0x04100900l, 0x05a00a00l, 0x95310b01l,
+ 0x06c00c00l, 0x96510d01l, 0x97e10e01l, 0x07700f00l,
+ 0x99011001l, 0x09901100l, 0x08201200l, 0x98b11301l,
+ 0x0b401400l, 0x9bd11501l, 0x9a611601l, 0x0af01700l,
+ 0x0d801800l, 0x9d111901l, 0x9ca11a01l, 0x0c301b00l,
+ 0x9fc11c01l, 0x0f501d00l, 0x0ee01e00l, 0x9e711f01l,
+ 0x82012001l, 0x12902100l, 0x13202200l, 0x83b12301l,
+ 0x10402400l, 0x80d12501l, 0x81612601l, 0x11f02700l,
+ 0x16802800l, 0x86112901l, 0x87a12a01l, 0x17302b00l,
+ 0x84c12c01l, 0x14502d00l, 0x15e02e00l, 0x85712f01l,
+ 0x1b003000l, 0x8b913101l, 0x8a213201l, 0x1ab03300l,
+ 0x89413401l, 0x19d03500l, 0x18603600l, 0x88f13701l,
+ 0x8f813801l, 0x1f103900l, 0x1ea03a00l, 0x8e313b01l,
+ 0x1dc03c00l, 0x8d513d01l, 0x8ce13e01l, 0x1c703f00l,
+ 0xb4014001l, 0x24904100l, 0x25204200l, 0xb5b14301l,
+ 0x26404400l, 0xb6d14501l, 0xb7614601l, 0x27f04700l,
+ 0x20804800l, 0xb0114901l, 0xb1a14a01l, 0x21304b00l,
+ 0xb2c14c01l, 0x22504d00l, 0x23e04e00l, 0xb3714f01l,
+ 0x2d005000l, 0xbd915101l, 0xbc215201l, 0x2cb05300l,
+ 0xbf415401l, 0x2fd05500l, 0x2e605600l, 0xbef15701l,
+ 0xb9815801l, 0x29105900l, 0x28a05a00l, 0xb8315b01l,
+ 0x2bc05c00l, 0xbb515d01l, 0xbae15e01l, 0x2a705f00l,
+ 0x36006000l, 0xa6916101l, 0xa7216201l, 0x37b06300l,
+ 0xa4416401l, 0x34d06500l, 0x35606600l, 0xa5f16701l,
+ 0xa2816801l, 0x32106900l, 0x33a06a00l, 0xa3316b01l,
+ 0x30c06c00l, 0xa0516d01l, 0xa1e16e01l, 0x31706f00l,
+ 0xaf017001l, 0x3f907100l, 0x3e207200l, 0xaeb17301l,
+ 0x3d407400l, 0xadd17501l, 0xac617601l, 0x3cf07700l,
+ 0x3b807800l, 0xab117901l, 0xaaa17a01l, 0x3a307b00l,
+ 0xa9c17c01l, 0x39507d00l, 0x38e07e00l, 0xa8717f01l,
+ 0xd8018001l, 0x48908100l, 0x49208200l, 0xd9b18301l,
+ 0x4a408400l, 0xdad18501l, 0xdb618601l, 0x4bf08700l,
+ 0x4c808800l, 0xdc118901l, 0xdda18a01l, 0x4d308b00l,
+ 0xdec18c01l, 0x4e508d00l, 0x4fe08e00l, 0xdf718f01l,
+ 0x41009000l, 0xd1919101l, 0xd0219201l, 0x40b09300l,
+ 0xd3419401l, 0x43d09500l, 0x42609600l, 0xd2f19701l,
+ 0xd5819801l, 0x45109900l, 0x44a09a00l, 0xd4319b01l,
+ 0x47c09c00l, 0xd7519d01l, 0xd6e19e01l, 0x46709f00l,
+ 0x5a00a000l, 0xca91a101l, 0xcb21a201l, 0x5bb0a300l,
+ 0xc841a401l, 0x58d0a500l, 0x5960a600l, 0xc9f1a701l,
+ 0xce81a801l, 0x5e10a900l, 0x5fa0aa00l, 0xcf31ab01l,
+ 0x5cc0ac00l, 0xcc51ad01l, 0xcde1ae01l, 0x5d70af00l,
+ 0xc301b001l, 0x5390b100l, 0x5220b200l, 0xc2b1b301l,
+ 0x5140b400l, 0xc1d1b501l, 0xc061b601l, 0x50f0b700l,
+ 0x5780b800l, 0xc711b901l, 0xc6a1ba01l, 0x5630bb00l,
+ 0xc5c1bc01l, 0x5550bd00l, 0x54e0be00l, 0xc471bf01l,
+ 0x6c00c000l, 0xfc91c101l, 0xfd21c201l, 0x6db0c300l,
+ 0xfe41c401l, 0x6ed0c500l, 0x6f60c600l, 0xfff1c701l,
+ 0xf881c801l, 0x6810c900l, 0x69a0ca00l, 0xf931cb01l,
+ 0x6ac0cc00l, 0xfa51cd01l, 0xfbe1ce01l, 0x6b70cf00l,
+ 0xf501d001l, 0x6590d100l, 0x6420d200l, 0xf4b1d301l,
+ 0x6740d400l, 0xf7d1d501l, 0xf661d601l, 0x66f0d700l,
+ 0x6180d800l, 0xf111d901l, 0xf0a1da01l, 0x6030db00l,
+ 0xf3c1dc01l, 0x6350dd00l, 0x62e0de00l, 0xf271df01l,
+ 0xee01e001l, 0x7e90e100l, 0x7f20e200l, 0xefb1e301l,
+ 0x7c40e400l, 0xecd1e501l, 0xed61e601l, 0x7df0e700l,
+ 0x7a80e800l, 0xea11e901l, 0xeba1ea01l, 0x7b30eb00l,
+ 0xe8c1ec01l, 0x7850ed00l, 0x79e0ee00l, 0xe971ef01l,
+ 0x7700f000l, 0xe791f101l, 0xe621f201l, 0x76b0f300l,
+ 0xe541f401l, 0x75d0f500l, 0x7460f600l, 0xe4f1f701l,
+ 0xe381f801l, 0x7310f900l, 0x72a0fa00l, 0xe231fb01l,
+ 0x71c0fc00l, 0xe151fd01l, 0xe0e1fe01l, 0x7070ff00l
};
static DWORD build_edc(const void* in, unsigned from, unsigned upto)
{
- const BYTE* p = (BYTE*)in + from;
- DWORD result = 0;
+ const BYTE* p = (BYTE*)in + from;
+ DWORD result = 0;
- for (; from < upto; from++) {
- result = EDC_crctable[(result ^ *p++) & 0xffL] ^ (result >> 8);
- }
+ for (; from < upto; from++) {
+ result = EDC_crctable[(result ^ *p++) & 0xffL] ^ (result >> 8);
+ }
- return result;
+ return result;
}
/////////
@@ -116,41 +116,41 @@ static DWORD build_edc(const void* in, unsigned from, unsigned upto)
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL}
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL}
};
const AMOVIESETUP_PIN sudOpPin[] = {
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CCDXAReader), CCDXAReaderName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CCDXAReader), CCDXAReaderName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CCDXAReader>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CCDXAReader>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{D367878E-F3B8-4235-A968-F378EF1B9A44}"),
- _T("0"), _T("0,4,,52494646,8,4,,43445841")); // "RIFFxxxxCDXA"
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{D367878E-F3B8-4235-A968-F378EF1B9A44}"),
+ _T("0"), _T("0,4,,52494646,8,4,,43445841")); // "RIFFxxxxCDXA"
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{D367878E-F3B8-4235-A968-F378EF1B9A44}"),
- _T("Source Filter"), _T("{D367878E-F3B8-4235-A968-F378EF1B9A44}"));
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{D367878E-F3B8-4235-A968-F378EF1B9A44}"),
+ _T("Source Filter"), _T("{D367878E-F3B8-4235-A968-F378EF1B9A44}"));
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{D367878E-F3B8-4235-A968-F378EF1B9A44}"));
+ DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{D367878E-F3B8-4235-A968-F378EF1B9A44}"));
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -164,11 +164,11 @@ CFilterApp theApp;
//
CCDXAReader::CCDXAReader(IUnknown* pUnk, HRESULT* phr)
- : CAsyncReader(NAME("CCDXAReader"), pUnk, &m_stream, phr, __uuidof(this))
+ : CAsyncReader(NAME("CCDXAReader"), pUnk, &m_stream, phr, __uuidof(this))
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
}
CCDXAReader::~CCDXAReader()
@@ -177,365 +177,365 @@ CCDXAReader::~CCDXAReader()
STDMETHODIMP CCDXAReader::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- return
- QI(IFileSourceFilter)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IFileSourceFilter)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
-STDMETHODIMP CCDXAReader::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE *pmt)
+STDMETHODIMP CCDXAReader::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt)
{
- CMediaType mt;
- m_mt = mt;
+ CMediaType mt;
+ m_mt = mt;
- if (!m_stream.Load(pszFileName)) {
- return E_FAIL;
- }
+ if (!m_stream.Load(pszFileName)) {
+ return E_FAIL;
+ }
- m_fn = pszFileName;
+ m_fn = pszFileName;
- mt.majortype = MEDIATYPE_Stream;
- mt.subtype = m_stream.m_subtype;
- m_mt = mt;
+ mt.majortype = MEDIATYPE_Stream;
+ mt.subtype = m_stream.m_subtype;
+ m_mt = mt;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CCDXAReader::GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt)
{
- if (!ppszFileName) {
- return E_POINTER;
- }
+ if (!ppszFileName) {
+ return E_POINTER;
+ }
- *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength()+1)*sizeof(WCHAR));
- if (!(*ppszFileName)) {
- return E_OUTOFMEMORY;
- }
+ *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength() + 1) * sizeof(WCHAR));
+ if (!(*ppszFileName)) {
+ return E_OUTOFMEMORY;
+ }
- wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
+ wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
- return S_OK;
+ return S_OK;
}
// CCDXAStream
CCDXAStream::CCDXAStream()
{
- m_subtype = MEDIASUBTYPE_NULL;
+ m_subtype = MEDIASUBTYPE_NULL;
- m_hFile = INVALID_HANDLE_VALUE;
+ m_hFile = INVALID_HANDLE_VALUE;
- m_llPosition = m_llLength = 0;
- m_nFirstSector = 0;
- m_nBufferedSector = -1;
+ m_llPosition = m_llLength = 0;
+ m_nFirstSector = 0;
+ m_nBufferedSector = -1;
}
CCDXAStream::~CCDXAStream()
{
- if (m_hFile != INVALID_HANDLE_VALUE) {
- CloseHandle(m_hFile);
- m_hFile = INVALID_HANDLE_VALUE;
- }
+ if (m_hFile != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hFile);
+ m_hFile = INVALID_HANDLE_VALUE;
+ }
}
bool CCDXAStream::Load(const WCHAR* fnw)
{
- if (m_hFile != INVALID_HANDLE_VALUE) {
- CloseHandle(m_hFile);
- m_hFile = INVALID_HANDLE_VALUE;
- }
-
- m_hFile = CreateFile(CString(fnw), GENERIC_READ, FILE_SHARE_READ, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_READONLY|FILE_FLAG_SEQUENTIAL_SCAN, (HANDLE)NULL);
- if (m_hFile == INVALID_HANDLE_VALUE) {
- return false;
- }
-
- BYTE hdr[RIFFCDXA_HEADER_SIZE];
- DWORD NumberOfBytesRead;
- if (!ReadFile(m_hFile, (LPVOID)hdr, RIFFCDXA_HEADER_SIZE, &NumberOfBytesRead, NULL)
- || *((DWORD*)&hdr[0]) != 'FFIR' || *((DWORD*)&hdr[8]) != 'AXDC'
- || *((DWORD*)&hdr[4]) != (*((DWORD*)&hdr[0x28])+0x24)) {
- CloseHandle(m_hFile);
- m_hFile = INVALID_HANDLE_VALUE;
- return false;
- }
-
- LARGE_INTEGER size = {0, 0};
- GetFileSizeEx(m_hFile, &size);
-
- m_llLength = int((size.QuadPart - RIFFCDXA_HEADER_SIZE) / RAW_SECTOR_SIZE) * RAW_DATA_SIZE;
-
- if (!LookForMediaSubType()) {
- m_llPosition = m_llLength = 0;
- CloseHandle(m_hFile);
- m_hFile = INVALID_HANDLE_VALUE;
- return false;
- }
-
- m_llPosition = 0;
-
- m_nBufferedSector = -1;
-
- return true;
+ if (m_hFile != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hFile);
+ m_hFile = INVALID_HANDLE_VALUE;
+ }
+
+ m_hFile = CreateFile(CString(fnw), GENERIC_READ, FILE_SHARE_READ, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_READONLY | FILE_FLAG_SEQUENTIAL_SCAN, (HANDLE)NULL);
+ if (m_hFile == INVALID_HANDLE_VALUE) {
+ return false;
+ }
+
+ BYTE hdr[RIFFCDXA_HEADER_SIZE];
+ DWORD NumberOfBytesRead;
+ if (!ReadFile(m_hFile, (LPVOID)hdr, RIFFCDXA_HEADER_SIZE, &NumberOfBytesRead, NULL)
+ || *((DWORD*)&hdr[0]) != 'FFIR' || *((DWORD*)&hdr[8]) != 'AXDC'
+ || *((DWORD*)&hdr[4]) != (*((DWORD*)&hdr[0x28]) + 0x24)) {
+ CloseHandle(m_hFile);
+ m_hFile = INVALID_HANDLE_VALUE;
+ return false;
+ }
+
+ LARGE_INTEGER size = {0, 0};
+ GetFileSizeEx(m_hFile, &size);
+
+ m_llLength = int((size.QuadPart - RIFFCDXA_HEADER_SIZE) / RAW_SECTOR_SIZE) * RAW_DATA_SIZE;
+
+ if (!LookForMediaSubType()) {
+ m_llPosition = m_llLength = 0;
+ CloseHandle(m_hFile);
+ m_hFile = INVALID_HANDLE_VALUE;
+ return false;
+ }
+
+ m_llPosition = 0;
+
+ m_nBufferedSector = -1;
+
+ return true;
}
HRESULT CCDXAStream::SetPointer(LONGLONG llPos)
{
- return (llPos >= 0 && llPos < m_llLength) ? m_llPosition = llPos, S_OK : S_FALSE;
+ return (llPos >= 0 && llPos < m_llLength) ? m_llPosition = llPos, S_OK : S_FALSE;
}
HRESULT CCDXAStream::Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead)
{
- CAutoLock lck(&m_csLock);
+ CAutoLock lck(&m_csLock);
- PBYTE pbBufferOrg = pbBuffer;
- LONGLONG pos = m_llPosition;
+ PBYTE pbBufferOrg = pbBuffer;
+ LONGLONG pos = m_llPosition;
- while (pos >= 0 && pos < m_llLength && dwBytesToRead > 0) {
- UINT sector = m_nFirstSector + int(pos/RAW_DATA_SIZE);
- __int64 offset = pos%RAW_DATA_SIZE;
+ while (pos >= 0 && pos < m_llLength && dwBytesToRead > 0) {
+ UINT sector = m_nFirstSector + int(pos / RAW_DATA_SIZE);
+ __int64 offset = pos % RAW_DATA_SIZE;
- if (m_nBufferedSector != (int)sector) {
- LARGE_INTEGER FilePointer;
- FilePointer.QuadPart = RIFFCDXA_HEADER_SIZE + sector*RAW_SECTOR_SIZE;
- SetFilePointerEx(m_hFile, FilePointer, &FilePointer, FILE_BEGIN);
+ if (m_nBufferedSector != (int)sector) {
+ LARGE_INTEGER FilePointer;
+ FilePointer.QuadPart = RIFFCDXA_HEADER_SIZE + sector * RAW_SECTOR_SIZE;
+ SetFilePointerEx(m_hFile, FilePointer, &FilePointer, FILE_BEGIN);
- memset(m_sector, 0, sizeof(m_sector));
+ memset(m_sector, 0, sizeof(m_sector));
- DWORD NumberOfBytesRead = 0;
+ DWORD NumberOfBytesRead = 0;
- int nRetries = 3;
- while (nRetries--) {
- NumberOfBytesRead = 0;
- if (!ReadFile(m_hFile, m_sector, RAW_SECTOR_SIZE, &NumberOfBytesRead, NULL)
- || NumberOfBytesRead != RAW_SECTOR_SIZE) {
- break;
- }
+ int nRetries = 3;
+ while (nRetries--) {
+ NumberOfBytesRead = 0;
+ if (!ReadFile(m_hFile, m_sector, RAW_SECTOR_SIZE, &NumberOfBytesRead, NULL)
+ || NumberOfBytesRead != RAW_SECTOR_SIZE) {
+ break;
+ }
- if (*(DWORD*)&m_sector[RAW_SECTOR_SIZE-4] == 0) { // no CRC? it happens...
- break;
- }
+ if (*(DWORD*)&m_sector[RAW_SECTOR_SIZE - 4] == 0) { // no CRC? it happens...
+ break;
+ }
- if (build_edc(m_sector, RAW_SYNC_SIZE + RAW_HEADER_SIZE, RAW_SECTOR_SIZE) == 0) {
- break;
- }
+ if (build_edc(m_sector, RAW_SYNC_SIZE + RAW_HEADER_SIZE, RAW_SECTOR_SIZE) == 0) {
+ break;
+ }
- TRACE(_T("CCDXAStream: CRC error at sector %d (fp=0x%I64x, retriesleft=%d)\n"), sector, FilePointer.QuadPart, nRetries);
- }
+ TRACE(_T("CCDXAStream: CRC error at sector %d (fp=0x%I64x, retriesleft=%d)\n"), sector, FilePointer.QuadPart, nRetries);
+ }
- m_nBufferedSector = sector;
- }
+ m_nBufferedSector = sector;
+ }
- DWORD l = (DWORD)min(dwBytesToRead, min(RAW_DATA_SIZE - offset, m_llLength - pos));
- memcpy(pbBuffer, &m_sector[RAW_SYNC_SIZE + RAW_HEADER_SIZE + RAW_SUBHEADER_SIZE + offset], l);
+ DWORD l = (DWORD)min(dwBytesToRead, min(RAW_DATA_SIZE - offset, m_llLength - pos));
+ memcpy(pbBuffer, &m_sector[RAW_SYNC_SIZE + RAW_HEADER_SIZE + RAW_SUBHEADER_SIZE + offset], l);
- pbBuffer += l;
- pos += l;
- dwBytesToRead -= l;
- }
+ pbBuffer += l;
+ pos += l;
+ dwBytesToRead -= l;
+ }
- if (pdwBytesRead) {
- *pdwBytesRead = pbBuffer - pbBufferOrg;
- }
- m_llPosition += pbBuffer - pbBufferOrg;
+ if (pdwBytesRead) {
+ *pdwBytesRead = pbBuffer - pbBufferOrg;
+ }
+ m_llPosition += pbBuffer - pbBufferOrg;
- if (dwBytesToRead != 0) {
- return S_FALSE;
- }
+ if (dwBytesToRead != 0) {
+ return S_FALSE;
+ }
- return S_OK;
+ return S_OK;
}
LONGLONG CCDXAStream::Size(LONGLONG* pSizeAvailable)
{
- if (pSizeAvailable) {
- *pSizeAvailable = m_llLength;
- }
- return m_llLength;
+ if (pSizeAvailable) {
+ *pSizeAvailable = m_llLength;
+ }
+ return m_llLength;
}
DWORD CCDXAStream::Alignment()
{
- return 1;
+ return 1;
}
void CCDXAStream::Lock()
{
- m_csLock.Lock();
+ m_csLock.Lock();
}
void CCDXAStream::Unlock()
{
- m_csLock.Unlock();
+ m_csLock.Unlock();
}
//
bool CCDXAStream::LookForMediaSubType()
{
- BYTE buff[RAW_DATA_SIZE];
-
- m_subtype = MEDIASUBTYPE_NULL;
-
- m_llPosition = 0;
-
- for (int iSectorsRead = 0;
- Read(buff, RAW_DATA_SIZE, 1, NULL) == S_OK && iSectorsRead < 1000;
- iSectorsRead++) {
- if (*((DWORD*)&buff[0]) == 0xba010000) {
- m_llPosition = 0;
- m_llLength -= iSectorsRead*RAW_DATA_SIZE;
- m_nFirstSector = iSectorsRead;
-
- if ((buff[4]&0xc4) == 0x44) {
- m_subtype = MEDIASUBTYPE_MPEG2_PROGRAM;
- } else if ((buff[4]&0xf1) == 0x21) {
- m_subtype = MEDIASUBTYPE_MPEG1System;
- }
-
- return !!(m_subtype != MEDIASUBTYPE_NULL);
- } else if (*((DWORD*)&buff[0]) == 'SggO') {
- m_llPosition = 0;
- m_llLength -= iSectorsRead*RAW_DATA_SIZE;
- m_nFirstSector = iSectorsRead;
-
- m_subtype = MEDIASUBTYPE_Ogg;
-
- return true;
- } else if (*((DWORD*)&buff[0]) == 0xA3DF451A) {
- m_llPosition = 0;
- m_llLength -= iSectorsRead*RAW_DATA_SIZE;
- m_nFirstSector = iSectorsRead;
-
- m_subtype = MEDIASUBTYPE_Matroska;
-
- return true;
- } else if (*((DWORD*)&buff[0]) == 'FMR.') {
- m_llPosition = 0;
- m_llLength -= iSectorsRead*RAW_DATA_SIZE;
- m_nFirstSector = iSectorsRead;
-
- m_subtype = MEDIASUBTYPE_RealMedia;
-
- return true;
- } else if (*((DWORD*)&buff[0]) == 'FFIR' && *((DWORD*)&buff[8]) == ' IVA') {
- m_llPosition = 0;
- m_llLength = min(m_llLength, *((DWORD*)&buff[4])+8);
- m_nFirstSector = iSectorsRead;
-
- m_subtype = MEDIASUBTYPE_Avi;
-
- return true;
- } else if (*((DWORD*)&buff[4]) == 'voom' || *((DWORD*)&buff[4]) == 'tadm'
- || *((DWORD*)&buff[4]) == 'pytf' && *((DWORD*)&buff[8]) == 'mosi' && *((DWORD*)&buff[16]) == '14pm') {
- m_llPosition = 0;
- m_llLength -= iSectorsRead*RAW_DATA_SIZE;
- m_nFirstSector = iSectorsRead;
-
- m_subtype = MEDIASUBTYPE_QTMovie;
-
- return true;
- }
- }
-
- m_llPosition = 0;
-
- CRegKey majorkey;
- CString majortype = _T("\\Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}");
- if (ERROR_SUCCESS == majorkey.Open(HKEY_CLASSES_ROOT, majortype, KEY_READ)) {
- TCHAR subtype[256+1];
- DWORD len = 256;
- for (int i = 0; ERROR_SUCCESS == majorkey.EnumKey(i, subtype, &len); i++, len = 256) {
- CRegKey subkey;
- if (ERROR_SUCCESS != subkey.Open(HKEY_CLASSES_ROOT, majortype + _T("\\") + subtype, KEY_READ)) {
- continue;
- }
-
- for (int j = 0; true; j++) {
- TCHAR number[10];
- _stprintf_s(number, _countof(number), _T("%d"), j);
-
- TCHAR pattern[256+1];
- ULONG len = 256;
- if (ERROR_SUCCESS != subkey.QueryStringValue(number, pattern, &len)) {
- break;
- }
-
- CString p = pattern;
- p += ',';
-
- __int64 offset = 0;
- DWORD cb = 0;
- CAtlArray<BYTE> mask, val;
-
- int nMatches = 0, nTries = 0;
-
- for (int k = 0, l; nTries >= 0 && (l = p.Find(',', k)) >= 0; k = l+1, nTries++) {
- CString s = p.Mid(k, l-k);
- TRACE(s + '\n');
-
- TCHAR* end = NULL;
-
- switch (nTries&3) {
- case 0:
- offset = _tcstol(s, &end, 10);
- break;
- case 1:
- cb = _tcstol(s, &end, 10);
- break;
- case 2:
- CStringToBin(s, mask);
- break;
- case 3:
- CStringToBin(s, val);
- break;
- default:
- nTries = -1;
- break;
- }
-
- if (nTries >= 0 && (nTries&3) == 3) {
- if (cb > 0 && val.GetCount() > 0 && cb == val.GetCount()) {
- if (offset >= 0 && S_OK == SetPointer(offset)
- || S_OK == SetPointer(m_llLength + offset)) {
- CAutoVectorPtr<BYTE> pData;
- if (pData.Allocate(cb)) {
- DWORD BytesRead = 0;
- if (S_OK == Read(pData, cb, 1, &BytesRead) && cb == BytesRead) {
- if (mask.GetCount() < cb) {
- size_t i = mask.GetCount();
- mask.SetCount(cb);
- for (; i < cb; i++) {
- mask[i] = 0xff;
- }
- }
-
- for (unsigned int i = 0; i < cb; i++) {
- pData[i] &= (BYTE)mask[i];
- }
-
- if (memcmp(pData, val.GetData(), cb) == 0) {
- nMatches++;
- }
- }
- }
- }
-
- offset = 0;
- cb = 0;
- mask.RemoveAll();
- val.RemoveAll();
- }
- }
- }
-
- if (nMatches > 0 && nMatches*4 == nTries) {
- m_subtype = GUIDFromCString(subtype);
- return S_OK;
- }
- }
- }
- }
-
- return false;
+ BYTE buff[RAW_DATA_SIZE];
+
+ m_subtype = MEDIASUBTYPE_NULL;
+
+ m_llPosition = 0;
+
+ for (int iSectorsRead = 0;
+ Read(buff, RAW_DATA_SIZE, 1, NULL) == S_OK && iSectorsRead < 1000;
+ iSectorsRead++) {
+ if (*((DWORD*)&buff[0]) == 0xba010000) {
+ m_llPosition = 0;
+ m_llLength -= iSectorsRead * RAW_DATA_SIZE;
+ m_nFirstSector = iSectorsRead;
+
+ if ((buff[4] & 0xc4) == 0x44) {
+ m_subtype = MEDIASUBTYPE_MPEG2_PROGRAM;
+ } else if ((buff[4] & 0xf1) == 0x21) {
+ m_subtype = MEDIASUBTYPE_MPEG1System;
+ }
+
+ return !!(m_subtype != MEDIASUBTYPE_NULL);
+ } else if (*((DWORD*)&buff[0]) == 'SggO') {
+ m_llPosition = 0;
+ m_llLength -= iSectorsRead * RAW_DATA_SIZE;
+ m_nFirstSector = iSectorsRead;
+
+ m_subtype = MEDIASUBTYPE_Ogg;
+
+ return true;
+ } else if (*((DWORD*)&buff[0]) == 0xA3DF451A) {
+ m_llPosition = 0;
+ m_llLength -= iSectorsRead * RAW_DATA_SIZE;
+ m_nFirstSector = iSectorsRead;
+
+ m_subtype = MEDIASUBTYPE_Matroska;
+
+ return true;
+ } else if (*((DWORD*)&buff[0]) == 'FMR.') {
+ m_llPosition = 0;
+ m_llLength -= iSectorsRead * RAW_DATA_SIZE;
+ m_nFirstSector = iSectorsRead;
+
+ m_subtype = MEDIASUBTYPE_RealMedia;
+
+ return true;
+ } else if (*((DWORD*)&buff[0]) == 'FFIR' && *((DWORD*)&buff[8]) == ' IVA') {
+ m_llPosition = 0;
+ m_llLength = min(m_llLength, *((DWORD*)&buff[4]) + 8);
+ m_nFirstSector = iSectorsRead;
+
+ m_subtype = MEDIASUBTYPE_Avi;
+
+ return true;
+ } else if (*((DWORD*)&buff[4]) == 'voom' || *((DWORD*)&buff[4]) == 'tadm'
+ || *((DWORD*)&buff[4]) == 'pytf' && *((DWORD*)&buff[8]) == 'mosi' && *((DWORD*)&buff[16]) == '14pm') {
+ m_llPosition = 0;
+ m_llLength -= iSectorsRead * RAW_DATA_SIZE;
+ m_nFirstSector = iSectorsRead;
+
+ m_subtype = MEDIASUBTYPE_QTMovie;
+
+ return true;
+ }
+ }
+
+ m_llPosition = 0;
+
+ CRegKey majorkey;
+ CString majortype = _T("\\Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}");
+ if (ERROR_SUCCESS == majorkey.Open(HKEY_CLASSES_ROOT, majortype, KEY_READ)) {
+ TCHAR subtype[256 + 1];
+ DWORD len = 256;
+ for (int i = 0; ERROR_SUCCESS == majorkey.EnumKey(i, subtype, &len); i++, len = 256) {
+ CRegKey subkey;
+ if (ERROR_SUCCESS != subkey.Open(HKEY_CLASSES_ROOT, majortype + _T("\\") + subtype, KEY_READ)) {
+ continue;
+ }
+
+ for (int j = 0; true; j++) {
+ TCHAR number[10];
+ _stprintf_s(number, _countof(number), _T("%d"), j);
+
+ TCHAR pattern[256 + 1];
+ ULONG len = 256;
+ if (ERROR_SUCCESS != subkey.QueryStringValue(number, pattern, &len)) {
+ break;
+ }
+
+ CString p = pattern;
+ p += ',';
+
+ __int64 offset = 0;
+ DWORD cb = 0;
+ CAtlArray<BYTE> mask, val;
+
+ int nMatches = 0, nTries = 0;
+
+ for (int k = 0, l; nTries >= 0 && (l = p.Find(',', k)) >= 0; k = l + 1, nTries++) {
+ CString s = p.Mid(k, l - k);
+ TRACE(s + '\n');
+
+ TCHAR* end = NULL;
+
+ switch (nTries & 3) {
+ case 0:
+ offset = _tcstol(s, &end, 10);
+ break;
+ case 1:
+ cb = _tcstol(s, &end, 10);
+ break;
+ case 2:
+ CStringToBin(s, mask);
+ break;
+ case 3:
+ CStringToBin(s, val);
+ break;
+ default:
+ nTries = -1;
+ break;
+ }
+
+ if (nTries >= 0 && (nTries & 3) == 3) {
+ if (cb > 0 && val.GetCount() > 0 && cb == val.GetCount()) {
+ if (offset >= 0 && S_OK == SetPointer(offset)
+ || S_OK == SetPointer(m_llLength + offset)) {
+ CAutoVectorPtr<BYTE> pData;
+ if (pData.Allocate(cb)) {
+ DWORD BytesRead = 0;
+ if (S_OK == Read(pData, cb, 1, &BytesRead) && cb == BytesRead) {
+ if (mask.GetCount() < cb) {
+ size_t i = mask.GetCount();
+ mask.SetCount(cb);
+ for (; i < cb; i++) {
+ mask[i] = 0xff;
+ }
+ }
+
+ for (unsigned int i = 0; i < cb; i++) {
+ pData[i] &= (BYTE)mask[i];
+ }
+
+ if (memcmp(pData, val.GetData(), cb) == 0) {
+ nMatches++;
+ }
+ }
+ }
+ }
+
+ offset = 0;
+ cb = 0;
+ mask.RemoveAll();
+ val.RemoveAll();
+ }
+ }
+ }
+
+ if (nMatches > 0 && nMatches * 4 == nTries) {
+ m_subtype = GUIDFromCString(subtype);
+ return S_OK;
+ }
+ }
+ }
+ }
+
+ return false;
}
diff --git a/src/filters/reader/CDXAReader/CDXAReader.h b/src/filters/reader/CDXAReader/CDXAReader.h
index bd8b22826..01a721c93 100644
--- a/src/filters/reader/CDXAReader/CDXAReader.h
+++ b/src/filters/reader/CDXAReader/CDXAReader.h
@@ -32,59 +32,59 @@
class CCDXAStream : public CAsyncStream
{
private:
- enum {
- RIFFCDXA_HEADER_SIZE = 44, // usually...
- RAW_SYNC_SIZE = 12, // 00 FF .. FF 00
- RAW_HEADER_SIZE = 4,
- RAW_SUBHEADER_SIZE = 8,
- RAW_DATA_SIZE = 2324,
- RAW_EDC_SIZE = 4,
- RAW_SECTOR_SIZE = 2352
- };
+ enum {
+ RIFFCDXA_HEADER_SIZE = 44, // usually...
+ RAW_SYNC_SIZE = 12, // 00 FF .. FF 00
+ RAW_HEADER_SIZE = 4,
+ RAW_SUBHEADER_SIZE = 8,
+ RAW_DATA_SIZE = 2324,
+ RAW_EDC_SIZE = 4,
+ RAW_SECTOR_SIZE = 2352
+ };
- CCritSec m_csLock;
+ CCritSec m_csLock;
- HANDLE m_hFile;
- LONGLONG m_llPosition, m_llLength;
- int m_nFirstSector;
+ HANDLE m_hFile;
+ LONGLONG m_llPosition, m_llLength;
+ int m_nFirstSector;
- int m_nBufferedSector;
- BYTE m_sector[RAW_SECTOR_SIZE];
+ int m_nBufferedSector;
+ BYTE m_sector[RAW_SECTOR_SIZE];
- bool LookForMediaSubType();
+ bool LookForMediaSubType();
public:
- CCDXAStream();
- virtual ~CCDXAStream();
+ CCDXAStream();
+ virtual ~CCDXAStream();
- bool Load(const WCHAR* fnw);
+ bool Load(const WCHAR* fnw);
- HRESULT SetPointer(LONGLONG llPos);
- HRESULT Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead);
- LONGLONG Size(LONGLONG* pSizeAvailable);
- DWORD Alignment();
- void Lock();
- void Unlock();
+ HRESULT SetPointer(LONGLONG llPos);
+ HRESULT Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead);
+ LONGLONG Size(LONGLONG* pSizeAvailable);
+ DWORD Alignment();
+ void Lock();
+ void Unlock();
- GUID m_subtype;
+ GUID m_subtype;
};
class __declspec(uuid("D367878E-F3B8-4235-A968-F378EF1B9A44"))
- CCDXAReader
- : public CAsyncReader
- , public IFileSourceFilter
+ CCDXAReader
+ : public CAsyncReader
+ , public IFileSourceFilter
{
- CCDXAStream m_stream;
- CStringW m_fn;
+ CCDXAStream m_stream;
+ CStringW m_fn;
public:
- CCDXAReader(IUnknown* pUnk, HRESULT* phr);
- ~CCDXAReader();
+ CCDXAReader(IUnknown* pUnk, HRESULT* phr);
+ ~CCDXAReader();
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // IFileSourceFilter
- STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
- STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
+ // IFileSourceFilter
+ STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
};
diff --git a/src/filters/reader/UDPReader/UDPReader.cpp b/src/filters/reader/UDPReader/UDPReader.cpp
index b8aceda1f..e04e78465 100644
--- a/src/filters/reader/UDPReader/UDPReader.cpp
+++ b/src/filters/reader/UDPReader/UDPReader.cpp
@@ -28,36 +28,36 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudOpPin[] = {
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CUDPReader), UDPReaderName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CUDPReader), UDPReaderName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CUDPReader>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CUDPReader>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- SetRegKeyValue(_T("udp"), 0, _T("Source Filter"), CStringFromGUID(__uuidof(CUDPReader)));
- SetRegKeyValue(_T("tévé"), 0, _T("Source Filter"), CStringFromGUID(__uuidof(CUDPReader)));
+ SetRegKeyValue(_T("udp"), 0, _T("Source Filter"), CStringFromGUID(__uuidof(CUDPReader)));
+ SetRegKeyValue(_T("tévé"), 0, _T("Source Filter"), CStringFromGUID(__uuidof(CUDPReader)));
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- // TODO
+ // TODO
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -74,11 +74,11 @@ CFilterApp theApp;
//
CUDPReader::CUDPReader(IUnknown* pUnk, HRESULT* phr)
- : CAsyncReader(NAME("CUDPReader"), pUnk, &m_stream, phr, __uuidof(this))
+ : CAsyncReader(NAME("CUDPReader"), pUnk, &m_stream, phr, __uuidof(this))
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
}
CUDPReader::~CUDPReader()
@@ -87,374 +87,374 @@ CUDPReader::~CUDPReader()
STDMETHODIMP CUDPReader::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(IFileSourceFilter)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IFileSourceFilter)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
// IFileSourceFilter
STDMETHODIMP CUDPReader::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt)
{
- if (!m_stream.Load(pszFileName)) {
- return E_FAIL;
- }
+ if (!m_stream.Load(pszFileName)) {
+ return E_FAIL;
+ }
- m_fn = pszFileName;
+ m_fn = pszFileName;
- CMediaType mt;
- mt.majortype = MEDIATYPE_Stream;
- mt.subtype = m_stream.GetSubType();
- m_mt = mt;
+ CMediaType mt;
+ mt.majortype = MEDIATYPE_Stream;
+ mt.subtype = m_stream.GetSubType();
+ m_mt = mt;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CUDPReader::GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt)
{
- if (!ppszFileName) {
- return E_POINTER;
- }
+ if (!ppszFileName) {
+ return E_POINTER;
+ }
- *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength()+1)*sizeof(WCHAR));
- if (!(*ppszFileName)) {
- return E_OUTOFMEMORY;
- }
+ *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength() + 1) * sizeof(WCHAR));
+ if (!(*ppszFileName)) {
+ return E_OUTOFMEMORY;
+ }
- wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
+ wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
- return S_OK;
+ return S_OK;
}
// CUDPStream
CUDPStream::CUDPStream()
{
- m_port = 0;
- m_socket = INVALID_SOCKET;
- m_subtype = MEDIASUBTYPE_NULL;
+ m_port = 0;
+ m_socket = INVALID_SOCKET;
+ m_subtype = MEDIASUBTYPE_NULL;
}
CUDPStream::~CUDPStream()
{
- Clear();
+ Clear();
}
void CUDPStream::Clear()
{
- if (m_socket !=INVALID_SOCKET) {
- closesocket(m_socket);
- m_socket = INVALID_SOCKET;
- }
- if (CAMThread::ThreadExists()) {
- CAMThread::CallWorker(CMD_EXIT);
- CAMThread::Close();
- }
- while (!m_packets.IsEmpty()) {
- delete m_packets.RemoveHead();
- }
- m_pos = m_len = 0;
- m_drop = false;
+ if (m_socket != INVALID_SOCKET) {
+ closesocket(m_socket);
+ m_socket = INVALID_SOCKET;
+ }
+ if (CAMThread::ThreadExists()) {
+ CAMThread::CallWorker(CMD_EXIT);
+ CAMThread::Close();
+ }
+ while (!m_packets.IsEmpty()) {
+ delete m_packets.RemoveHead();
+ }
+ m_pos = m_len = 0;
+ m_drop = false;
}
void CUDPStream::Append(BYTE* buff, int len)
{
- CAutoLock cAutoLock(&m_csLock);
-
- if (m_packets.GetCount() > 1) {
- __int64 size = m_packets.GetTail()->m_end - m_packets.GetHead()->m_start;
-
- if (!m_drop && (m_pos >= BUFF_SIZE_FIRST && size >= BUFF_SIZE_FIRST || size >= 2*BUFF_SIZE_FIRST)) {
- m_drop = true;
- TRACE(_T("DROP ON\n"));
- } else if (m_drop && size <= BUFF_SIZE_FIRST) {
- m_drop = false;
- TRACE(_T("DROP OFF\n"));
- }
-
- if (m_drop) {
- return;
- }
- }
-
- m_packets.AddTail(DNew packet_t(buff, m_len, m_len + len));
- m_len += len;
+ CAutoLock cAutoLock(&m_csLock);
+
+ if (m_packets.GetCount() > 1) {
+ __int64 size = m_packets.GetTail()->m_end - m_packets.GetHead()->m_start;
+
+ if (!m_drop && (m_pos >= BUFF_SIZE_FIRST && size >= BUFF_SIZE_FIRST || size >= 2 * BUFF_SIZE_FIRST)) {
+ m_drop = true;
+ TRACE(_T("DROP ON\n"));
+ } else if (m_drop && size <= BUFF_SIZE_FIRST) {
+ m_drop = false;
+ TRACE(_T("DROP OFF\n"));
+ }
+
+ if (m_drop) {
+ return;
+ }
+ }
+
+ m_packets.AddTail(DNew packet_t(buff, m_len, m_len + len));
+ m_len += len;
}
bool CUDPStream::Load(const WCHAR* fnw)
{
- Clear();
+ Clear();
- CStringW url = CStringW(fnw);
+ CStringW url = CStringW(fnw);
- CAtlList<CStringW> sl;
- Explode(url, sl, ':');
- if (sl.GetCount() != 3) {
- return false;
- }
+ CAtlList<CStringW> sl;
+ Explode(url, sl, ':');
+ if (sl.GetCount() != 3) {
+ return false;
+ }
- CStringW protocol = sl.RemoveHead();
- // if (protocol != L"udp") return false;
+ CStringW protocol = sl.RemoveHead();
+ // if (protocol != L"udp") return false;
- m_ip = CString(sl.RemoveHead()).TrimLeft('/');
+ m_ip = CString(sl.RemoveHead()).TrimLeft('/');
- int port = _wtoi(Explode(sl.RemoveHead(), sl, '/', 2));
- if (port < 0 || port > 0xffff) {
- return false;
- }
- m_port = port;
+ int port = _wtoi(Explode(sl.RemoveHead(), sl, '/', 2));
+ if (port < 0 || port > 0xffff) {
+ return false;
+ }
+ m_port = port;
- if (sl.GetCount() != 2 || FAILED(GUIDFromCString(CString(sl.GetTail()), m_subtype))) {
- m_subtype = MEDIASUBTYPE_NULL; // TODO: detect subtype
- }
+ if (sl.GetCount() != 2 || FAILED(GUIDFromCString(CString(sl.GetTail()), m_subtype))) {
+ m_subtype = MEDIASUBTYPE_NULL; // TODO: detect subtype
+ }
- CAMThread::Create();
- if (FAILED(CAMThread::CallWorker(CMD_RUN))) {
- Clear();
- return false;
- }
+ CAMThread::Create();
+ if (FAILED(CAMThread::CallWorker(CMD_RUN))) {
+ Clear();
+ return false;
+ }
- clock_t start = clock();
- while (clock() - start < 3000 && m_len < 1000000) {
- Sleep(100);
- }
+ clock_t start = clock();
+ while (clock() - start < 3000 && m_len < 1000000) {
+ Sleep(100);
+ }
- return true;
+ return true;
}
HRESULT CUDPStream::SetPointer(LONGLONG llPos)
{
- CAutoLock cAutoLock(&m_csLock);
+ CAutoLock cAutoLock(&m_csLock);
- if (m_packets.IsEmpty() && llPos != 0
- || !m_packets.IsEmpty() && llPos < m_packets.GetHead()->m_start
- || !m_packets.IsEmpty() && llPos > m_packets.GetTail()->m_end) {
- TRACE(_T("CUDPStream: SetPointer error\n"));
- return E_FAIL;
- }
+ if (m_packets.IsEmpty() && llPos != 0
+ || !m_packets.IsEmpty() && llPos < m_packets.GetHead()->m_start
+ || !m_packets.IsEmpty() && llPos > m_packets.GetTail()->m_end) {
+ TRACE(_T("CUDPStream: SetPointer error\n"));
+ return E_FAIL;
+ }
- m_pos = llPos;
+ m_pos = llPos;
- return S_OK;
+ return S_OK;
}
HRESULT CUDPStream::Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead)
{
- CAutoLock cAutoLock(&m_csLock);
+ CAutoLock cAutoLock(&m_csLock);
- DWORD len = dwBytesToRead;
- BYTE* ptr = pbBuffer;
+ DWORD len = dwBytesToRead;
+ BYTE* ptr = pbBuffer;
- while (len > 0 && !m_packets.IsEmpty()) {
- POSITION pos = m_packets.GetHeadPosition();
- while (pos && len > 0) {
- packet_t* p = m_packets.GetNext(pos);
+ while (len > 0 && !m_packets.IsEmpty()) {
+ POSITION pos = m_packets.GetHeadPosition();
+ while (pos && len > 0) {
+ packet_t* p = m_packets.GetNext(pos);
- if (p->m_start <= m_pos && m_pos < p->m_end) {
- DWORD size;
+ if (p->m_start <= m_pos && m_pos < p->m_end) {
+ DWORD size;
- if (m_pos < p->m_start) {
- ASSERT(0);
- size = (DWORD)min(len, p->m_start - m_pos);
- memset(ptr, 0, size);
- } else {
- size = (DWORD)min(len, p->m_end - m_pos);
- memcpy(ptr, &p->m_buff[m_pos - p->m_start], size);
- }
+ if (m_pos < p->m_start) {
+ ASSERT(0);
+ size = (DWORD)min(len, p->m_start - m_pos);
+ memset(ptr, 0, size);
+ } else {
+ size = (DWORD)min(len, p->m_end - m_pos);
+ memcpy(ptr, &p->m_buff[m_pos - p->m_start], size);
+ }
- m_pos += size;
+ m_pos += size;
- ptr += size;
- len -= size;
- }
+ ptr += size;
+ len -= size;
+ }
- if (p->m_end <= m_pos - 2048 && BUFF_SIZE_FIRST <= m_pos) {
- while (m_packets.GetHeadPosition() != pos) {
- delete m_packets.RemoveHead();
- }
- }
+ if (p->m_end <= m_pos - 2048 && BUFF_SIZE_FIRST <= m_pos) {
+ while (m_packets.GetHeadPosition() != pos) {
+ delete m_packets.RemoveHead();
+ }
+ }
- }
- }
+ }
+ }
- if (pdwBytesRead) {
- *pdwBytesRead = ptr - pbBuffer;
- }
+ if (pdwBytesRead) {
+ *pdwBytesRead = ptr - pbBuffer;
+ }
- return S_OK;
+ return S_OK;
}
LONGLONG CUDPStream::Size(LONGLONG* pSizeAvailable)
{
- CAutoLock cAutoLock(&m_csLock);
- if (pSizeAvailable) {
- *pSizeAvailable = m_len;
- }
- return 0;
+ CAutoLock cAutoLock(&m_csLock);
+ if (pSizeAvailable) {
+ *pSizeAvailable = m_len;
+ }
+ return 0;
}
DWORD CUDPStream::Alignment()
{
- return 1;
+ return 1;
}
void CUDPStream::Lock()
{
- m_csLock.Lock();
+ m_csLock.Lock();
}
void CUDPStream::Unlock()
{
- m_csLock.Unlock();
+ m_csLock.Unlock();
}
DWORD CUDPStream::ThreadProc()
{
- WSADATA wsaData;
- WSAStartup(MAKEWORD(2, 2), &wsaData);
-
- sockaddr_in addr;
- memset(&addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = htonl(INADDR_ANY);
- addr.sin_port = htons((u_short)m_port);
-
- ip_mreq imr;
- imr.imr_multiaddr.s_addr = inet_addr(CStringA(m_ip));
- imr.imr_interface.s_addr = INADDR_ANY;
-
- if ((m_socket = socket(AF_INET, SOCK_DGRAM, 0))!=INVALID_SOCKET) {
- /* u_long argp = 1;
- ioctlsocket(m_socket, FIONBIO, &argp);
- */
- DWORD dw = TRUE;
- if (setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&dw, sizeof(dw))==SOCKET_ERROR) {
- closesocket(m_socket);
- m_socket = INVALID_SOCKET;
- }
-
- if (bind(m_socket, (struct sockaddr*)&addr, sizeof(addr))==SOCKET_ERROR) {
- closesocket(m_socket);
- m_socket = INVALID_SOCKET;
- }
-
- if (IN_MULTICAST(htonl(imr.imr_multiaddr.s_addr))) {
- int ret = setsockopt(m_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&imr, sizeof(imr));
- if (ret < 0) {
- ret = ::WSAGetLastError();
- }
- ret = ret;
- }
- }
-
- SetThreadPriority(m_hThread, THREAD_PRIORITY_TIME_CRITICAL);
+ WSADATA wsaData;
+ WSAStartup(MAKEWORD(2, 2), &wsaData);
+
+ sockaddr_in addr;
+ memset(&addr, 0, sizeof(addr));
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ addr.sin_port = htons((u_short)m_port);
+
+ ip_mreq imr;
+ imr.imr_multiaddr.s_addr = inet_addr(CStringA(m_ip));
+ imr.imr_interface.s_addr = INADDR_ANY;
+
+ if ((m_socket = socket(AF_INET, SOCK_DGRAM, 0)) != INVALID_SOCKET) {
+ /* u_long argp = 1;
+ ioctlsocket(m_socket, FIONBIO, &argp);
+ */
+ DWORD dw = TRUE;
+ if (setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&dw, sizeof(dw)) == SOCKET_ERROR) {
+ closesocket(m_socket);
+ m_socket = INVALID_SOCKET;
+ }
+
+ if (bind(m_socket, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
+ closesocket(m_socket);
+ m_socket = INVALID_SOCKET;
+ }
+
+ if (IN_MULTICAST(htonl(imr.imr_multiaddr.s_addr))) {
+ int ret = setsockopt(m_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&imr, sizeof(imr));
+ if (ret < 0) {
+ ret = ::WSAGetLastError();
+ }
+ ret = ret;
+ }
+ }
+
+ SetThreadPriority(m_hThread, THREAD_PRIORITY_TIME_CRITICAL);
#ifdef _DEBUG
- FILE* dump = NULL;
- // dump = _tfopen(_T("c:\\udp.ts"), _T("wb"));
- FILE* log = NULL;
- // log = _tfopen(_T("c:\\udp.txt"), _T("wt"));
+ FILE* dump = NULL;
+ // dump = _tfopen(_T("c:\\udp.ts"), _T("wb"));
+ FILE* log = NULL;
+ // log = _tfopen(_T("c:\\udp.txt"), _T("wt"));
#endif
- for (;;) {
- DWORD cmd = GetRequest();
-
- switch (cmd) {
- default:
- case CMD_EXIT:
- if (m_socket!=INVALID_SOCKET) {
- closesocket(m_socket);
- m_socket = INVALID_SOCKET;
- }
- WSACleanup();
+ for (;;) {
+ DWORD cmd = GetRequest();
+
+ switch (cmd) {
+ default:
+ case CMD_EXIT:
+ if (m_socket != INVALID_SOCKET) {
+ closesocket(m_socket);
+ m_socket = INVALID_SOCKET;
+ }
+ WSACleanup();
#ifdef _DEBUG
- if (dump) {
- fclose(dump);
- }
- if (log) {
- fclose(log);
- }
+ if (dump) {
+ fclose(dump);
+ }
+ if (log) {
+ fclose(log);
+ }
#endif
- Reply(S_OK);
- return 0;
- case CMD_RUN:
- Reply(m_socket!=INVALID_SOCKET ? S_OK : E_FAIL);
-
- {
- char buff[65536*2];
- int buffsize = 0;
-
- for (unsigned int i = 0; ; i++) {
- if (!(i&0xff)) {
- if (CheckRequest(NULL)) {
- break;
- }
- }
-
- int fromlen = sizeof(addr);
- int len = recvfrom(m_socket, &buff[buffsize], 65536, 0, (SOCKADDR*)&addr, &fromlen);
- if (len <= 0) {
- Sleep(1);
- continue;
- }
+ Reply(S_OK);
+ return 0;
+ case CMD_RUN:
+ Reply(m_socket != INVALID_SOCKET ? S_OK : E_FAIL);
+
+ {
+ char buff[65536 * 2];
+ int buffsize = 0;
+
+ for (unsigned int i = 0; ; i++) {
+ if (!(i & 0xff)) {
+ if (CheckRequest(NULL)) {
+ break;
+ }
+ }
+
+ int fromlen = sizeof(addr);
+ int len = recvfrom(m_socket, &buff[buffsize], 65536, 0, (SOCKADDR*)&addr, &fromlen);
+ if (len <= 0) {
+ Sleep(1);
+ continue;
+ }
#ifdef _DEBUG
- if (log) {
- if (buffsize >= len && !memcmp(&buff[buffsize-len], &buff[buffsize], len)) {
- DWORD pid = ((buff[buffsize+1]<<8)|buff[buffsize+2])&0x1fff;
- DWORD counter = buff[buffsize+3]&0xf;
- _ftprintf_s(log, _T("%04d %2d DUP\n"), pid, counter);
- }
- }
+ if (log) {
+ if (buffsize >= len && !memcmp(&buff[buffsize - len], &buff[buffsize], len)) {
+ DWORD pid = ((buff[buffsize + 1] << 8) | buff[buffsize + 2]) & 0x1fff;
+ DWORD counter = buff[buffsize + 3] & 0xf;
+ _ftprintf_s(log, _T("%04d %2d DUP\n"), pid, counter);
+ }
+ }
#endif
- buffsize += len;
+ buffsize += len;
- if (buffsize >= 65536 || m_len == 0) {
+ if (buffsize >= 65536 || m_len == 0) {
#ifdef _DEBUG
- if (dump) {
- fwrite(buff, buffsize, 1, dump);
- }
-
- if (log) {
- static BYTE pid2counter[0x2000];
- static bool init = false;
- if (!init) {
- memset(pid2counter, 0, sizeof(pid2counter));
- init = true;
- }
-
- for (int i = 0; i < buffsize; i += 188) {
- DWORD pid = ((buff[i+1]<<8)|buff[i+2])&0x1fff;
- BYTE counter = buff[i+3]&0xf;
- if (pid2counter[pid] != ((counter-1+16)&15)) {
- _ftprintf_s(log, _T("%04x %2d -> %2d\n"), pid, pid2counter[pid], counter);
- }
- pid2counter[pid] = counter;
- }
- }
+ if (dump) {
+ fwrite(buff, buffsize, 1, dump);
+ }
+
+ if (log) {
+ static BYTE pid2counter[0x2000];
+ static bool init = false;
+ if (!init) {
+ memset(pid2counter, 0, sizeof(pid2counter));
+ init = true;
+ }
+
+ for (int i = 0; i < buffsize; i += 188) {
+ DWORD pid = ((buff[i + 1] << 8) | buff[i + 2]) & 0x1fff;
+ BYTE counter = buff[i + 3] & 0xf;
+ if (pid2counter[pid] != ((counter - 1 + 16) & 15)) {
+ _ftprintf_s(log, _T("%04x %2d -> %2d\n"), pid, pid2counter[pid], counter);
+ }
+ pid2counter[pid] = counter;
+ }
+ }
#endif
- Append((BYTE*)buff, buffsize);
- buffsize = 0;
- }
- }
- }
- break;
- }
- }
-
- ASSERT(0);
- return (DWORD)-1;
+ Append((BYTE*)buff, buffsize);
+ buffsize = 0;
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ ASSERT(0);
+ return (DWORD) - 1;
}
CUDPStream::packet_t::packet_t(BYTE* p, __int64 start, __int64 end)
- : m_start(start)
- , m_end(end)
+ : m_start(start)
+ , m_end(end)
{
- size_t size = (size_t)(end - start);
- m_buff = DNew BYTE[size];
- memcpy(m_buff, p, size);
+ size_t size = (size_t)(end - start);
+ m_buff = DNew BYTE[size];
+ memcpy(m_buff, p, size);
}
diff --git a/src/filters/reader/UDPReader/UDPReader.h b/src/filters/reader/UDPReader/UDPReader.h
index 1741fd77f..8cce7a74f 100644
--- a/src/filters/reader/UDPReader/UDPReader.h
+++ b/src/filters/reader/UDPReader/UDPReader.h
@@ -32,66 +32,66 @@
class CUDPStream : public CAsyncStream, public CAMThread
{
private:
- CCritSec m_csLock;
+ CCritSec m_csLock;
- class packet_t
- {
- public:
- BYTE* m_buff;
- __int64 m_start, m_end;
- packet_t(BYTE* p, __int64 start, __int64 end);
- virtual ~packet_t() {
- delete [] m_buff;
- }
- };
+ class packet_t
+ {
+ public:
+ BYTE* m_buff;
+ __int64 m_start, m_end;
+ packet_t(BYTE* p, __int64 start, __int64 end);
+ virtual ~packet_t() {
+ delete [] m_buff;
+ }
+ };
- int m_port;
- CString m_ip;
- SOCKET m_socket;
- GUID m_subtype;
- __int64 m_pos, m_len;
- bool m_drop;
- CAtlList<packet_t*> m_packets;
+ int m_port;
+ CString m_ip;
+ SOCKET m_socket;
+ GUID m_subtype;
+ __int64 m_pos, m_len;
+ bool m_drop;
+ CAtlList<packet_t*> m_packets;
- void Clear();
- void Append(BYTE* buff, int len);
+ void Clear();
+ void Append(BYTE* buff, int len);
- enum {CMD_EXIT, CMD_RUN};
- DWORD ThreadProc();
+ enum {CMD_EXIT, CMD_RUN};
+ DWORD ThreadProc();
public:
- CUDPStream();
- virtual ~CUDPStream();
+ CUDPStream();
+ virtual ~CUDPStream();
- bool Load(const WCHAR* fnw);
- const GUID& GetSubType() {
- return m_subtype;
- }
+ bool Load(const WCHAR* fnw);
+ const GUID& GetSubType() {
+ return m_subtype;
+ }
- HRESULT SetPointer(LONGLONG llPos);
- HRESULT Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead);
- LONGLONG Size(LONGLONG* pSizeAvailable);
- DWORD Alignment();
- void Lock();
- void Unlock();
+ HRESULT SetPointer(LONGLONG llPos);
+ HRESULT Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead);
+ LONGLONG Size(LONGLONG* pSizeAvailable);
+ DWORD Alignment();
+ void Lock();
+ void Unlock();
};
class __declspec(uuid("0E4221A9-9718-48D5-A5CF-4493DAD4A015"))
- CUDPReader
- : public CAsyncReader
- , public IFileSourceFilter
+ CUDPReader
+ : public CAsyncReader
+ , public IFileSourceFilter
{
- CUDPStream m_stream;
- CStringW m_fn;
+ CUDPStream m_stream;
+ CStringW m_fn;
public:
- CUDPReader(IUnknown* pUnk, HRESULT* phr);
- ~CUDPReader();
+ CUDPReader(IUnknown* pUnk, HRESULT* phr);
+ ~CUDPReader();
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // IFileSourceFilter
- STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
- STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
+ // IFileSourceFilter
+ STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
};
diff --git a/src/filters/reader/VTSReader/VTSReader.cpp b/src/filters/reader/VTSReader/VTSReader.cpp
index e6573878c..f88fadb15 100644
--- a/src/filters/reader/VTSReader/VTSReader.cpp
+++ b/src/filters/reader/VTSReader/VTSReader.cpp
@@ -29,41 +29,41 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG2_PROGRAM},
+ {&MEDIATYPE_Stream, &MEDIASUBTYPE_MPEG2_PROGRAM},
};
const AMOVIESETUP_PIN sudOpPin[] = {
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CVTSReader), VTSReaderName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CVTSReader), VTSReaderName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CVTSReader>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CVTSReader>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}"),
- _T("0"), _T("0,12,,445644564944454F2D565453")); // "DVDVIDEO-VTS"
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}"),
+ _T("0"), _T("0,12,,445644564944454F2D565453")); // "DVDVIDEO-VTS"
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}"),
- _T("Source Filter"), _T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}"));
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}"),
+ _T("Source Filter"), _T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}"));
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}"));
+ DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73}"));
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -77,11 +77,11 @@ CFilterApp theApp;
//
CVTSReader::CVTSReader(IUnknown* pUnk, HRESULT* phr)
- : CAsyncReader(NAME("CVTSReader"), pUnk, &m_stream, phr, __uuidof(this))
+ : CAsyncReader(NAME("CVTSReader"), pUnk, &m_stream, phr, __uuidof(this))
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
}
CVTSReader::~CVTSReader()
@@ -90,117 +90,117 @@ CVTSReader::~CVTSReader()
STDMETHODIMP CVTSReader::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(IFileSourceFilter)
- QI(ITrackInfo)
- QI(IDSMChapterBag)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IFileSourceFilter)
+ QI(ITrackInfo)
+ QI(IDSMChapterBag)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
STDMETHODIMP CVTSReader::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
- wcscpy_s(pInfo->achName, VTSReaderName);
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
+ wcscpy_s(pInfo->achName, VTSReaderName);
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
- return S_OK;
+ return S_OK;
}
// IFileSourceFilter
STDMETHODIMP CVTSReader::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt)
{
- if (!m_stream.Load(pszFileName)) {
- return E_FAIL;
- }
+ if (!m_stream.Load(pszFileName)) {
+ return E_FAIL;
+ }
- ChapRemoveAll();
- for (int i=0; i<m_stream.GetChaptersCount(); i++) {
- CString chap; chap.Format(_T("Chapter %d"), i+1);
- ChapAppend(m_stream.GetChapterOffset(i), chap);
- }
+ ChapRemoveAll();
+ for (int i = 0; i < m_stream.GetChaptersCount(); i++) {
+ CString chap; chap.Format(_T("Chapter %d"), i + 1);
+ ChapAppend(m_stream.GetChapterOffset(i), chap);
+ }
- m_fn = pszFileName;
+ m_fn = pszFileName;
- CMediaType mt;
- mt.majortype = MEDIATYPE_Stream;
- mt.subtype = MEDIASUBTYPE_MPEG2_PROGRAM;
- m_mt = mt;
+ CMediaType mt;
+ mt.majortype = MEDIATYPE_Stream;
+ mt.subtype = MEDIASUBTYPE_MPEG2_PROGRAM;
+ m_mt = mt;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CVTSReader::GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt)
{
- if (!ppszFileName) {
- return E_POINTER;
- }
+ if (!ppszFileName) {
+ return E_POINTER;
+ }
- *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength()+1)*sizeof(WCHAR));
- if (!(*ppszFileName)) {
- return E_OUTOFMEMORY;
- }
+ *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength() + 1) * sizeof(WCHAR));
+ if (!(*ppszFileName)) {
+ return E_OUTOFMEMORY;
+ }
- wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
+ wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
- return S_OK;
+ return S_OK;
}
// ITrackInfo
STDMETHODIMP_(UINT) CVTSReader::GetTrackCount()
{
- return 0; // Not implemented yet
+ return 0; // Not implemented yet
}
STDMETHODIMP_(BOOL) CVTSReader::GetTrackInfo(UINT aTrackIdx, struct TrackElement* pStructureToFill)
{
- return FALSE; // Not implemented yet
+ return FALSE; // Not implemented yet
}
STDMETHODIMP_(BOOL) CVTSReader::GetTrackExtendedInfo(UINT aTrackIdx, void* pStructureToFill)
{
- return FALSE; // Not implemented yet
+ return FALSE; // Not implemented yet
}
STDMETHODIMP_(BSTR) CVTSReader::GetTrackName(UINT aTrackIdx)
{
- return m_stream.GetTrackName(aTrackIdx); // return stream's language
+ return m_stream.GetTrackName(aTrackIdx); // return stream's language
}
STDMETHODIMP_(BSTR) CVTSReader::GetTrackCodecID(UINT aTrackIdx)
{
- return NULL; // Not implemented yet
+ return NULL; // Not implemented yet
}
STDMETHODIMP_(BSTR) CVTSReader::GetTrackCodecName(UINT aTrackIdx)
{
- return NULL; // Not implemented yet
+ return NULL; // Not implemented yet
}
STDMETHODIMP_(BSTR) CVTSReader::GetTrackCodecInfoURL(UINT aTrackIdx)
{
- return NULL; // Not implemented yet
+ return NULL; // Not implemented yet
}
STDMETHODIMP_(BSTR) CVTSReader::GetTrackCodecDownloadURL(UINT aTrackIdx)
{
- return NULL; // Not implemented yet
+ return NULL; // Not implemented yet
}
// CVTSStream
CVTSStream::CVTSStream() : m_off(0)
{
- m_vob.Attach(DNew CVobFile());
+ m_vob.Attach(DNew CVobFile());
}
CVTSStream::~CVTSStream()
@@ -209,87 +209,87 @@ CVTSStream::~CVTSStream()
bool CVTSStream::Load(const WCHAR* fnw)
{
- CAtlList<CString> sl;
- return (m_vob && m_vob->Open(CString(fnw), sl) /*&& m_vob->IsDVD()*/);
+ CAtlList<CString> sl;
+ return (m_vob && m_vob->Open(CString(fnw), sl) /*&& m_vob->IsDVD()*/);
}
HRESULT CVTSStream::SetPointer(LONGLONG llPos)
{
- m_off = (int)(llPos&2047);
- int lba = (int)(llPos/2048);
+ m_off = (int)(llPos & 2047);
+ int lba = (int)(llPos / 2048);
- return lba == m_vob->Seek(lba) ? S_OK : S_FALSE;
+ return lba == m_vob->Seek(lba) ? S_OK : S_FALSE;
}
HRESULT CVTSStream::Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead)
{
- CAutoLock lck(&m_csLock);
+ CAutoLock lck(&m_csLock);
- DWORD len = dwBytesToRead;
- BYTE* ptr = pbBuffer;
+ DWORD len = dwBytesToRead;
+ BYTE* ptr = pbBuffer;
- while (len > 0) {
- BYTE buff[2048];
- if (!m_vob->Read(buff)) {
- break;
- }
+ while (len > 0) {
+ BYTE buff[2048];
+ if (!m_vob->Read(buff)) {
+ break;
+ }
- int size = min(2048 - m_off, (int)min(len, 2048));
+ int size = min(2048 - m_off, (int)min(len, 2048));
- memcpy(ptr, &buff[m_off], size);
+ memcpy(ptr, &buff[m_off], size);
- m_off = (m_off + size)&2047;
+ m_off = (m_off + size) & 2047;
- if (m_off > 0) {
- m_vob->Seek(m_vob->GetPosition()-1);
- }
+ if (m_off > 0) {
+ m_vob->Seek(m_vob->GetPosition() - 1);
+ }
- ptr += size;
- len -= size;
- }
+ ptr += size;
+ len -= size;
+ }
- if (pdwBytesRead) {
- *pdwBytesRead = ptr - pbBuffer;
- }
+ if (pdwBytesRead) {
+ *pdwBytesRead = ptr - pbBuffer;
+ }
- return S_OK;
+ return S_OK;
}
LONGLONG CVTSStream::Size(LONGLONG* pSizeAvailable)
{
- LONGLONG len = 2048i64*m_vob->GetLength();
- if (pSizeAvailable) {
- *pSizeAvailable = len;
- }
- return len;
+ LONGLONG len = 2048i64 * m_vob->GetLength();
+ if (pSizeAvailable) {
+ *pSizeAvailable = len;
+ }
+ return len;
}
DWORD CVTSStream::Alignment()
{
- return 1;
+ return 1;
}
void CVTSStream::Lock()
{
- m_csLock.Lock();
+ m_csLock.Lock();
}
void CVTSStream::Unlock()
{
- m_csLock.Unlock();
+ m_csLock.Unlock();
}
BSTR CVTSStream::GetTrackName(UINT aTrackIdx)
{
- return m_vob->GetTrackName(aTrackIdx);
+ return m_vob->GetTrackName(aTrackIdx);
}
int CVTSStream::GetChaptersCount()
{
- return m_vob->GetChaptersCount();
+ return m_vob->GetChaptersCount();
}
REFERENCE_TIME CVTSStream::GetChapterOffset(UINT ChapterNumber)
{
- return m_vob->GetChapterOffset(ChapterNumber);
+ return m_vob->GetChapterOffset(ChapterNumber);
} \ No newline at end of file
diff --git a/src/filters/reader/VTSReader/VTSReader.h b/src/filters/reader/VTSReader/VTSReader.h
index 7b26839a8..6eeab899e 100644
--- a/src/filters/reader/VTSReader/VTSReader.h
+++ b/src/filters/reader/VTSReader/VTSReader.h
@@ -37,62 +37,62 @@ class CVobFile;
class CVTSStream : public CAsyncStream
{
private:
- CCritSec m_csLock;
+ CCritSec m_csLock;
- CAutoPtr<CVobFile> m_vob;
- int m_off;
+ CAutoPtr<CVobFile> m_vob;
+ int m_off;
public:
- CVTSStream();
- virtual ~CVTSStream();
+ CVTSStream();
+ virtual ~CVTSStream();
- bool Load(const WCHAR* fnw);
+ bool Load(const WCHAR* fnw);
- HRESULT SetPointer(LONGLONG llPos);
- HRESULT Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead);
- LONGLONG Size(LONGLONG* pSizeAvailable);
- DWORD Alignment();
- void Lock();
- void Unlock();
+ HRESULT SetPointer(LONGLONG llPos);
+ HRESULT Read(PBYTE pbBuffer, DWORD dwBytesToRead, BOOL bAlign, LPDWORD pdwBytesRead);
+ LONGLONG Size(LONGLONG* pSizeAvailable);
+ DWORD Alignment();
+ void Lock();
+ void Unlock();
- BSTR GetTrackName(UINT aTrackIdx);
- int GetChaptersCount();
- REFERENCE_TIME GetChapterOffset(UINT ChapterNumber);
+ BSTR GetTrackName(UINT aTrackIdx);
+ int GetChaptersCount();
+ REFERENCE_TIME GetChapterOffset(UINT ChapterNumber);
};
class __declspec(uuid("773EAEDE-D5EE-4fce-9C8F-C4F53D0A2F73"))
- CVTSReader
- : public CAsyncReader
- , public IFileSourceFilter
- , public ITrackInfo
- , public IDSMChapterBagImpl
+ CVTSReader
+ : public CAsyncReader
+ , public IFileSourceFilter
+ , public ITrackInfo
+ , public IDSMChapterBagImpl
{
- CVTSStream m_stream;
- CStringW m_fn;
+ CVTSStream m_stream;
+ CStringW m_fn;
public:
- CVTSReader(IUnknown* pUnk, HRESULT* phr);
- ~CVTSReader();
+ CVTSReader(IUnknown* pUnk, HRESULT* phr);
+ ~CVTSReader();
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // CBaseFilter
+ // CBaseFilter
- STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
+ STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
- // IFileSourceFilter
- STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
- STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
+ // IFileSourceFilter
+ STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
- // ITrackInfo
+ // 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);
+ 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);
};
diff --git a/src/filters/renderer/MpcAudioRenderer/IMpcAudioRendererFilter.h b/src/filters/renderer/MpcAudioRenderer/IMpcAudioRendererFilter.h
index 04ecf022e..f1dadae38 100644
--- a/src/filters/renderer/MpcAudioRenderer/IMpcAudioRendererFilter.h
+++ b/src/filters/renderer/MpcAudioRenderer/IMpcAudioRendererFilter.h
@@ -27,12 +27,12 @@
interface __declspec(uuid("495D2C66-D430-439b-9DEE-40F9B7929BBA"))
IMpcAudioRendererFilter :
public IUnknown {
- STDMETHOD(Apply()) = 0;
+ STDMETHOD(Apply()) = 0;
- STDMETHOD(SetWasapiMode(BOOL nValue)) = 0;
- STDMETHOD_(BOOL, GetWasapiMode()) = 0;
- STDMETHOD(SetMuteFastForward(BOOL nValue)) = 0;
- STDMETHOD_(BOOL, GetMuteFastForward()) = 0;
- STDMETHOD(SetSoundDevice(CString nValue)) = 0;
- STDMETHOD_(CString, GetSoundDevice()) = 0;
+ STDMETHOD(SetWasapiMode(BOOL nValue)) = 0;
+ STDMETHOD_(BOOL, GetWasapiMode()) = 0;
+ STDMETHOD(SetMuteFastForward(BOOL nValue)) = 0;
+ STDMETHOD_(BOOL, GetMuteFastForward()) = 0;
+ STDMETHOD(SetSoundDevice(CString nValue)) = 0;
+ STDMETHOD_(CString, GetSoundDevice()) = 0;
};
diff --git a/src/filters/renderer/MpcAudioRenderer/MpcAudioRenderer.cpp b/src/filters/renderer/MpcAudioRenderer/MpcAudioRenderer.cpp
index b973327c0..26adf5cb0 100644
--- a/src/filters/renderer/MpcAudioRenderer/MpcAudioRenderer.cpp
+++ b/src/filters/renderer/MpcAudioRenderer/MpcAudioRenderer.cpp
@@ -36,32 +36,32 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&GUID_NULL},
+ {&GUID_NULL},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CMpcAudioRenderer), MpcAudioRendererName, 0x40000001, _countof(sudpPins), sudpPins, CLSID_AudioRendererCategory},
+ {&__uuidof(CMpcAudioRenderer), MpcAudioRendererName, 0x40000001, _countof(sudpPins), sudpPins, CLSID_AudioRendererCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, &__uuidof(CMpcAudioRenderer), CreateInstance<CMpcAudioRenderer>, NULL, &sudFilter[0]},
- {L"CMpcAudioRendererPropertyPage", &__uuidof(CMpcAudioRendererSettingsWnd), CreateInstance<CInternalPropertyPageTempl<CMpcAudioRendererSettingsWnd> >},
+ {sudFilter[0].strName, &__uuidof(CMpcAudioRenderer), CreateInstance<CMpcAudioRenderer>, NULL, &sudFilter[0]},
+ {L"CMpcAudioRendererPropertyPage", &__uuidof(CMpcAudioRendererSettingsWnd), CreateInstance<CInternalPropertyPageTempl<CMpcAudioRendererSettingsWnd> >},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -73,579 +73,578 @@ CFilterApp theApp;
static GUID lpSoundGUID = {0xdef00000, 0x9c6d, 0x47ed, {0xaa, 0xf1, 0x4d, 0xda, 0x8f, 0x2b, 0x5c, 0x03}}; //DSDEVID_DefaultPlayback from dsound.h
bool CALLBACK DSEnumProc2(LPGUID lpGUID,
- LPCTSTR lpszDesc,
- LPCTSTR lpszDrvName,
- LPVOID lpContext )
+ LPCTSTR lpszDesc,
+ LPCTSTR lpszDrvName,
+ LPVOID lpContext)
{
- CString *pStr = (CString *)lpContext;
- ASSERT ( pStr );
- CString strGUID = *pStr;
-
- if (lpGUID != NULL) // NULL only for "Primary Sound Driver".
- {
- if (strGUID == lpszDesc) {
- memcpy((VOID *)&lpSoundGUID, lpGUID, sizeof(GUID));
- }
- }
-
- return TRUE;
+ CString* pStr = (CString*)lpContext;
+ ASSERT(pStr);
+ CString strGUID = *pStr;
+
+ if (lpGUID != NULL) { // NULL only for "Primary Sound Driver".
+ if (strGUID == lpszDesc) {
+ memcpy((VOID*)&lpSoundGUID, lpGUID, sizeof(GUID));
+ }
+ }
+
+ return TRUE;
}
-CMpcAudioRenderer::CMpcAudioRenderer(LPUNKNOWN punk, HRESULT *phr)
- : CBaseRenderer(__uuidof(this), MpcAudioRendererName, punk, phr)
- , m_pDSBuffer (NULL )
- , m_pSoundTouch (NULL )
- , m_pDS (NULL )
- , m_dwDSWriteOff (0 )
- , m_nDSBufSize (0 )
- , m_dRate (1.0 )
- , m_pReferenceClock (NULL )
- , m_pWaveFileFormat (NULL )
- , pMMDevice (NULL)
- , pAudioClient (NULL )
- , pRenderClient (NULL )
- , m_useWASAPI (true )
- , m_bMuteFastForward(false)
- , m_csSound_Device (_T(""))
- , nFramesInBuffer (0 )
- , hnsPeriod (0 )
- , hTask (NULL )
- , bufferSize (0)
- , isAudioClientStarted (false)
- , lastBufferTime (0)
- , hnsActualDuration (0)
- , m_lVolume(DSBVOLUME_MIN)
+CMpcAudioRenderer::CMpcAudioRenderer(LPUNKNOWN punk, HRESULT* phr)
+ : CBaseRenderer(__uuidof(this), MpcAudioRendererName, punk, phr)
+ , m_pDSBuffer(NULL)
+ , m_pSoundTouch(NULL)
+ , m_pDS(NULL)
+ , m_dwDSWriteOff(0)
+ , m_nDSBufSize(0)
+ , m_dRate(1.0)
+ , m_pReferenceClock(NULL)
+ , m_pWaveFileFormat(NULL)
+ , pMMDevice(NULL)
+ , pAudioClient(NULL)
+ , pRenderClient(NULL)
+ , m_useWASAPI(true)
+ , m_bMuteFastForward(false)
+ , m_csSound_Device(_T(""))
+ , nFramesInBuffer(0)
+ , hnsPeriod(0)
+ , hTask(NULL)
+ , bufferSize(0)
+ , isAudioClientStarted(false)
+ , lastBufferTime(0)
+ , hnsActualDuration(0)
+ , m_lVolume(DSBVOLUME_MIN)
{
- HMODULE hLib;
+ HMODULE hLib;
#ifdef REGISTER_FILTER
- CRegKey key;
- TCHAR buff[256];
- ULONG len;
-
- if (ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPC Audio Renderer"), KEY_READ)) {
- DWORD dw;
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("UseWasapi"), dw)) {
- m_useWASAPI = !!dw;
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("MuteFastForward"), dw)) {
- m_bMuteFastForward = !!dw;
- }
- len = _countof(buff);
- memset(buff, 0, sizeof(buff));
- if (ERROR_SUCCESS == key.QueryStringValue(_T("SoundDevice"), buff, &len)) {
- m_csSound_Device = CString(buff);
- }
- }
+ CRegKey key;
+ TCHAR buff[256];
+ ULONG len;
+
+ if (ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPC Audio Renderer"), KEY_READ)) {
+ DWORD dw;
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("UseWasapi"), dw)) {
+ m_useWASAPI = !!dw;
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("MuteFastForward"), dw)) {
+ m_bMuteFastForward = !!dw;
+ }
+ len = _countof(buff);
+ memset(buff, 0, sizeof(buff));
+ if (ERROR_SUCCESS == key.QueryStringValue(_T("SoundDevice"), buff, &len)) {
+ m_csSound_Device = CString(buff);
+ }
+ }
#else
- m_useWASAPI = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPC Audio Renderer"), _T("UseWasapi"), m_useWASAPI);
- m_bMuteFastForward = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPC Audio Renderer"), _T("MuteFastForward"), m_bMuteFastForward);
- m_csSound_Device = AfxGetApp()->GetProfileString(_T("Filters\\MPC Audio Renderer"), _T("SoundDevice"), _T(""));
+ m_useWASAPI = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPC Audio Renderer"), _T("UseWasapi"), m_useWASAPI);
+ m_bMuteFastForward = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPC Audio Renderer"), _T("MuteFastForward"), m_bMuteFastForward);
+ m_csSound_Device = AfxGetApp()->GetProfileString(_T("Filters\\MPC Audio Renderer"), _T("SoundDevice"), _T(""));
#endif
- m_useWASAPIAfterRestart = m_useWASAPI;
-
-
- // Load Vista specifics DLLs
- hLib = LoadLibrary (L"avrt.dll");
- if (hLib != NULL) {
- pfAvSetMmThreadCharacteristicsW = (PTR_AvSetMmThreadCharacteristicsW) GetProcAddress (hLib, "AvSetMmThreadCharacteristicsW");
- pfAvRevertMmThreadCharacteristics = (PTR_AvRevertMmThreadCharacteristics) GetProcAddress (hLib, "AvRevertMmThreadCharacteristics");
- } else {
- m_useWASAPI = false; // Wasapi not available below Vista
- }
-
- TRACE(_T("CMpcAudioRenderer constructor\n"));
- if (!m_useWASAPI) {
- DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc2, (VOID*)&m_csSound_Device);
- m_pSoundTouch = DNew soundtouch::SoundTouch();
- *phr = DirectSoundCreate8 (&lpSoundGUID, &m_pDS, NULL);
- }
+ m_useWASAPIAfterRestart = m_useWASAPI;
+
+
+ // Load Vista specifics DLLs
+ hLib = LoadLibrary(L"avrt.dll");
+ if (hLib != NULL) {
+ pfAvSetMmThreadCharacteristicsW = (PTR_AvSetMmThreadCharacteristicsW) GetProcAddress(hLib, "AvSetMmThreadCharacteristicsW");
+ pfAvRevertMmThreadCharacteristics = (PTR_AvRevertMmThreadCharacteristics) GetProcAddress(hLib, "AvRevertMmThreadCharacteristics");
+ } else {
+ m_useWASAPI = false; // Wasapi not available below Vista
+ }
+
+ TRACE(_T("CMpcAudioRenderer constructor\n"));
+ if (!m_useWASAPI) {
+ DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc2, (VOID*)&m_csSound_Device);
+ m_pSoundTouch = DNew soundtouch::SoundTouch();
+ *phr = DirectSoundCreate8(&lpSoundGUID, &m_pDS, NULL);
+ }
}
CMpcAudioRenderer::~CMpcAudioRenderer()
{
- Stop();
+ Stop();
- SAFE_DELETE (m_pSoundTouch);
- SAFE_RELEASE (m_pDSBuffer);
- SAFE_RELEASE (m_pDS);
+ SAFE_DELETE(m_pSoundTouch);
+ SAFE_RELEASE(m_pDSBuffer);
+ SAFE_RELEASE(m_pDS);
- SAFE_RELEASE (pRenderClient);
- SAFE_RELEASE (pAudioClient);
- SAFE_RELEASE (pMMDevice);
+ SAFE_RELEASE(pRenderClient);
+ SAFE_RELEASE(pAudioClient);
+ SAFE_RELEASE(pMMDevice);
- if (m_pReferenceClock) {
- SetSyncSource(NULL);
- SAFE_RELEASE (m_pReferenceClock);
- }
+ if (m_pReferenceClock) {
+ SetSyncSource(NULL);
+ SAFE_RELEASE(m_pReferenceClock);
+ }
- if (m_pWaveFileFormat) {
- BYTE *p = (BYTE *)m_pWaveFileFormat;
- SAFE_DELETE_ARRAY(p);
- }
+ if (m_pWaveFileFormat) {
+ BYTE* p = (BYTE*)m_pWaveFileFormat;
+ SAFE_DELETE_ARRAY(p);
+ }
- if (hTask != NULL && pfAvRevertMmThreadCharacteristics != NULL) {
- pfAvRevertMmThreadCharacteristics(hTask);
- }
+ if (hTask != NULL && pfAvRevertMmThreadCharacteristics != NULL) {
+ pfAvRevertMmThreadCharacteristics(hTask);
+ }
}
-HRESULT CMpcAudioRenderer::CheckInputType(const CMediaType *pmt)
+HRESULT CMpcAudioRenderer::CheckInputType(const CMediaType* pmt)
{
- return CheckMediaType(pmt);
+ return CheckMediaType(pmt);
}
-HRESULT CMpcAudioRenderer::CheckMediaType(const CMediaType *pmt)
+HRESULT CMpcAudioRenderer::CheckMediaType(const CMediaType* pmt)
{
- HRESULT hr = S_OK;
- if (pmt == NULL) {
- return E_INVALIDARG;
- }
- TRACE(_T("CMpcAudioRenderer::CheckMediaType\n"));
- WAVEFORMATEX *pwfx = (WAVEFORMATEX *) pmt->Format();
-
- if (pwfx == NULL) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- if ((pmt->majortype != MEDIATYPE_Audio ) ||
- (pmt->formattype != FORMAT_WaveFormatEx )) {
- TRACE(_T("CMpcAudioRenderer::CheckMediaType Not supported\n"));
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- if (m_useWASAPI) {
- hr=CheckAudioClient((WAVEFORMATEX *)NULL);
- if (FAILED(hr)) {
- TRACE(_T("CMpcAudioRenderer::CheckMediaType Error on check audio client\n"));
- return hr;
- }
- if (!pAudioClient) {
- TRACE(_T("CMpcAudioRenderer::CheckMediaType Error, audio client not loaded\n"));
- return VFW_E_CANNOT_CONNECT;
- }
-
- if (pAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE, pwfx, NULL) != S_OK) {
- TRACE(_T("CMpcAudioRenderer::CheckMediaType WASAPI client refused the format\n"));
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- TRACE(_T("CMpcAudioRenderer::CheckMediaType WASAPI client accepted the format\n"));
- } else if (pwfx->wFormatTag != WAVE_FORMAT_PCM) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- return S_OK;
+ HRESULT hr = S_OK;
+ if (pmt == NULL) {
+ return E_INVALIDARG;
+ }
+ TRACE(_T("CMpcAudioRenderer::CheckMediaType\n"));
+ WAVEFORMATEX* pwfx = (WAVEFORMATEX*) pmt->Format();
+
+ if (pwfx == NULL) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ if ((pmt->majortype != MEDIATYPE_Audio) ||
+ (pmt->formattype != FORMAT_WaveFormatEx)) {
+ TRACE(_T("CMpcAudioRenderer::CheckMediaType Not supported\n"));
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ if (m_useWASAPI) {
+ hr = CheckAudioClient((WAVEFORMATEX*)NULL);
+ if (FAILED(hr)) {
+ TRACE(_T("CMpcAudioRenderer::CheckMediaType Error on check audio client\n"));
+ return hr;
+ }
+ if (!pAudioClient) {
+ TRACE(_T("CMpcAudioRenderer::CheckMediaType Error, audio client not loaded\n"));
+ return VFW_E_CANNOT_CONNECT;
+ }
+
+ if (pAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE, pwfx, NULL) != S_OK) {
+ TRACE(_T("CMpcAudioRenderer::CheckMediaType WASAPI client refused the format\n"));
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ TRACE(_T("CMpcAudioRenderer::CheckMediaType WASAPI client accepted the format\n"));
+ } else if (pwfx->wFormatTag != WAVE_FORMAT_PCM) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ return S_OK;
}
-void CMpcAudioRenderer::OnReceiveFirstSample(IMediaSample *pMediaSample)
+void CMpcAudioRenderer::OnReceiveFirstSample(IMediaSample* pMediaSample)
{
- if (!m_useWASAPI) {
- ClearBuffer();
- }
+ if (!m_useWASAPI) {
+ ClearBuffer();
+ }
}
-BOOL CMpcAudioRenderer::ScheduleSample(IMediaSample *pMediaSample)
+BOOL CMpcAudioRenderer::ScheduleSample(IMediaSample* pMediaSample)
{
- REFERENCE_TIME StartSample;
- REFERENCE_TIME EndSample;
-
- // Is someone pulling our leg
- if (pMediaSample == NULL) {
- return FALSE;
- }
-
- // Get the next sample due up for rendering. If there aren't any ready
- // then GetNextSampleTimes returns an error. If there is one to be done
- // then it succeeds and yields the sample times. If it is due now then
- // it returns S_OK other if it's to be done when due it returns S_FALSE
- HRESULT hr = GetSampleTimes(pMediaSample, &StartSample, &EndSample);
- if (FAILED(hr)) {
- return FALSE;
- }
-
- // If we don't have a reference clock then we cannot set up the advise
- // time so we simply set the event indicating an image to render. This
- // will cause us to run flat out without any timing or synchronisation
- if (hr == S_OK) {
- EXECUTE_ASSERT(SetEvent((HANDLE) m_RenderEvent));
- return TRUE;
- }
-
- if (m_dRate <= 1.1) {
- ASSERT(m_dwAdvise == 0);
- ASSERT(m_pClock);
- WaitForSingleObject((HANDLE)m_RenderEvent,0);
-
- hr = m_pClock->AdviseTime( (REFERENCE_TIME) m_tStart, StartSample, (HEVENT)(HANDLE) m_RenderEvent, &m_dwAdvise);
- if (SUCCEEDED(hr)) {
- return TRUE;
- }
- } else {
- hr = DoRenderSample (pMediaSample);
- }
-
- // We could not schedule the next sample for rendering despite the fact
- // we have a valid sample here. This is a fair indication that either
- // the system clock is wrong or the time stamp for the sample is duff
- ASSERT(m_dwAdvise == 0);
-
- return FALSE;
+ REFERENCE_TIME StartSample;
+ REFERENCE_TIME EndSample;
+
+ // Is someone pulling our leg
+ if (pMediaSample == NULL) {
+ return FALSE;
+ }
+
+ // Get the next sample due up for rendering. If there aren't any ready
+ // then GetNextSampleTimes returns an error. If there is one to be done
+ // then it succeeds and yields the sample times. If it is due now then
+ // it returns S_OK other if it's to be done when due it returns S_FALSE
+ HRESULT hr = GetSampleTimes(pMediaSample, &StartSample, &EndSample);
+ if (FAILED(hr)) {
+ return FALSE;
+ }
+
+ // If we don't have a reference clock then we cannot set up the advise
+ // time so we simply set the event indicating an image to render. This
+ // will cause us to run flat out without any timing or synchronisation
+ if (hr == S_OK) {
+ EXECUTE_ASSERT(SetEvent((HANDLE) m_RenderEvent));
+ return TRUE;
+ }
+
+ if (m_dRate <= 1.1) {
+ ASSERT(m_dwAdvise == 0);
+ ASSERT(m_pClock);
+ WaitForSingleObject((HANDLE)m_RenderEvent, 0);
+
+ hr = m_pClock->AdviseTime((REFERENCE_TIME) m_tStart, StartSample, (HEVENT)(HANDLE) m_RenderEvent, &m_dwAdvise);
+ if (SUCCEEDED(hr)) {
+ return TRUE;
+ }
+ } else {
+ hr = DoRenderSample(pMediaSample);
+ }
+
+ // We could not schedule the next sample for rendering despite the fact
+ // we have a valid sample here. This is a fair indication that either
+ // the system clock is wrong or the time stamp for the sample is duff
+ ASSERT(m_dwAdvise == 0);
+
+ return FALSE;
}
-HRESULT CMpcAudioRenderer::DoRenderSample(IMediaSample *pMediaSample)
+HRESULT CMpcAudioRenderer::DoRenderSample(IMediaSample* pMediaSample)
{
- if (m_useWASAPI) {
- return DoRenderSampleWasapi(pMediaSample);
- } else {
- return DoRenderSampleDirectSound(pMediaSample);
- }
+ if (m_useWASAPI) {
+ return DoRenderSampleWasapi(pMediaSample);
+ } else {
+ return DoRenderSampleDirectSound(pMediaSample);
+ }
}
-STDMETHODIMP CMpcAudioRenderer::NonDelegatingQueryInterface(REFIID riid, void **ppv)
+STDMETHODIMP CMpcAudioRenderer::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- if (riid == IID_IReferenceClock) {
- return GetReferenceClockInterface(riid, ppv);
- } else if (riid == IID_IDispatch) {
- return GetInterface(static_cast<IDispatch*>(this), ppv);
- } else if (riid == IID_IBasicAudio) {
- return GetInterface(static_cast<IBasicAudio*>(this), ppv);
- } else if (riid == __uuidof(ISpecifyPropertyPages)) {
- return GetInterface(static_cast<ISpecifyPropertyPages*>(this), ppv);
- } else if (riid == __uuidof(ISpecifyPropertyPages2)) {
- return GetInterface(static_cast<ISpecifyPropertyPages2*>(this), ppv);
- } else if (riid == __uuidof(IMpcAudioRendererFilter)) {
- return GetInterface(static_cast<IMpcAudioRendererFilter*>(this), ppv);
- }
-
- return CBaseRenderer::NonDelegatingQueryInterface (riid, ppv);
+ if (riid == IID_IReferenceClock) {
+ return GetReferenceClockInterface(riid, ppv);
+ } else if (riid == IID_IDispatch) {
+ return GetInterface(static_cast<IDispatch*>(this), ppv);
+ } else if (riid == IID_IBasicAudio) {
+ return GetInterface(static_cast<IBasicAudio*>(this), ppv);
+ } else if (riid == __uuidof(ISpecifyPropertyPages)) {
+ return GetInterface(static_cast<ISpecifyPropertyPages*>(this), ppv);
+ } else if (riid == __uuidof(ISpecifyPropertyPages2)) {
+ return GetInterface(static_cast<ISpecifyPropertyPages2*>(this), ppv);
+ } else if (riid == __uuidof(IMpcAudioRendererFilter)) {
+ return GetInterface(static_cast<IMpcAudioRendererFilter*>(this), ppv);
+ }
+
+ return CBaseRenderer::NonDelegatingQueryInterface(riid, ppv);
}
-HRESULT CMpcAudioRenderer::SetMediaType(const CMediaType *pmt)
+HRESULT CMpcAudioRenderer::SetMediaType(const CMediaType* pmt)
{
- if (! pmt) {
- return E_POINTER;
- }
- TRACE(_T("CMpcAudioRenderer::SetMediaType\n"));
-
- if (m_useWASAPI) {
- // New media type set but render client already initialized => reset it
- if (pRenderClient!=NULL) {
- WAVEFORMATEX *pNewWf = (WAVEFORMATEX *) pmt->Format();
- TRACE(_T("CMpcAudioRenderer::SetMediaType Render client already initialized. Reinitialization...\n"));
- CheckAudioClient(pNewWf);
- }
- }
-
- if (m_pWaveFileFormat) {
- BYTE *p = (BYTE *)m_pWaveFileFormat;
- SAFE_DELETE_ARRAY(p);
- }
- m_pWaveFileFormat=NULL;
-
- WAVEFORMATEX *pwf = (WAVEFORMATEX *) pmt->Format();
- if (pwf!=NULL) {
- int size = sizeof(WAVEFORMATEX) + pwf->cbSize;
-
- m_pWaveFileFormat = (WAVEFORMATEX *)DNew BYTE[size];
- if (! m_pWaveFileFormat) {
- return E_OUTOFMEMORY;
- }
-
- memcpy(m_pWaveFileFormat, pwf, size);
-
-
- if (!m_useWASAPI && m_pSoundTouch && (pwf->nChannels <= 2)) {
- m_pSoundTouch->setSampleRate (pwf->nSamplesPerSec);
- m_pSoundTouch->setChannels (pwf->nChannels);
- m_pSoundTouch->setTempoChange (0);
- m_pSoundTouch->setPitchSemiTones(0);
- }
- }
-
- return CBaseRenderer::SetMediaType (pmt);
+ if (! pmt) {
+ return E_POINTER;
+ }
+ TRACE(_T("CMpcAudioRenderer::SetMediaType\n"));
+
+ if (m_useWASAPI) {
+ // New media type set but render client already initialized => reset it
+ if (pRenderClient != NULL) {
+ WAVEFORMATEX* pNewWf = (WAVEFORMATEX*) pmt->Format();
+ TRACE(_T("CMpcAudioRenderer::SetMediaType Render client already initialized. Reinitialization...\n"));
+ CheckAudioClient(pNewWf);
+ }
+ }
+
+ if (m_pWaveFileFormat) {
+ BYTE* p = (BYTE*)m_pWaveFileFormat;
+ SAFE_DELETE_ARRAY(p);
+ }
+ m_pWaveFileFormat = NULL;
+
+ WAVEFORMATEX* pwf = (WAVEFORMATEX*) pmt->Format();
+ if (pwf != NULL) {
+ int size = sizeof(WAVEFORMATEX) + pwf->cbSize;
+
+ m_pWaveFileFormat = (WAVEFORMATEX*)DNew BYTE[size];
+ if (! m_pWaveFileFormat) {
+ return E_OUTOFMEMORY;
+ }
+
+ memcpy(m_pWaveFileFormat, pwf, size);
+
+
+ if (!m_useWASAPI && m_pSoundTouch && (pwf->nChannels <= 2)) {
+ m_pSoundTouch->setSampleRate(pwf->nSamplesPerSec);
+ m_pSoundTouch->setChannels(pwf->nChannels);
+ m_pSoundTouch->setTempoChange(0);
+ m_pSoundTouch->setPitchSemiTones(0);
+ }
+ }
+
+ return CBaseRenderer::SetMediaType(pmt);
}
-HRESULT CMpcAudioRenderer::CompleteConnect(IPin *pReceivePin)
+HRESULT CMpcAudioRenderer::CompleteConnect(IPin* pReceivePin)
{
- HRESULT hr = S_OK;
- TRACE(_T("CMpcAudioRenderer::CompleteConnect\n"));
-
- if (!m_useWASAPI && ! m_pDS) {
- return E_FAIL;
- }
-
- if (SUCCEEDED(hr)) {
- hr = CBaseRenderer::CompleteConnect(pReceivePin);
- }
- if (SUCCEEDED(hr)) {
- hr = InitCoopLevel();
- }
-
- if (!m_useWASAPI) {
- if (SUCCEEDED(hr)) {
- hr = CreateDSBuffer();
- }
- }
- if (SUCCEEDED(hr)) {
- TRACE(_T("CMpcAudioRenderer::CompleteConnect Success\n"));
- }
- return hr;
+ HRESULT hr = S_OK;
+ TRACE(_T("CMpcAudioRenderer::CompleteConnect\n"));
+
+ if (!m_useWASAPI && ! m_pDS) {
+ return E_FAIL;
+ }
+
+ if (SUCCEEDED(hr)) {
+ hr = CBaseRenderer::CompleteConnect(pReceivePin);
+ }
+ if (SUCCEEDED(hr)) {
+ hr = InitCoopLevel();
+ }
+
+ if (!m_useWASAPI) {
+ if (SUCCEEDED(hr)) {
+ hr = CreateDSBuffer();
+ }
+ }
+ if (SUCCEEDED(hr)) {
+ TRACE(_T("CMpcAudioRenderer::CompleteConnect Success\n"));
+ }
+ return hr;
}
STDMETHODIMP CMpcAudioRenderer::Run(REFERENCE_TIME tStart)
{
- HRESULT hr;
-
- if (m_State == State_Running) {
- return NOERROR;
- }
-
- if (m_useWASAPI) {
- hr=CheckAudioClient(m_pWaveFileFormat);
- if (FAILED(hr)) {
- TRACE(_T("CMpcAudioRenderer::Run Error on check audio client\n"));
- return hr;
- }
- // Rather start the client at the last moment when the buffer is fed
- /*hr = pAudioClient->Start();
- if (FAILED (hr))
- {
- TRACE(_T("CMpcAudioRenderer::Run Start error"));
- return hr;
- }*/
- } else {
- if (m_pDSBuffer &&
- m_pPosition &&
- m_pWaveFileFormat &&
- SUCCEEDED(m_pPosition->GetRate(&m_dRate))) {
- if (m_dRate < 1.0) {
- hr = m_pDSBuffer->SetFrequency ((long)(m_pWaveFileFormat->nSamplesPerSec * m_dRate));
- if (FAILED (hr)) {
- return hr;
- }
- } else {
- hr = m_pDSBuffer->SetFrequency ((long)m_pWaveFileFormat->nSamplesPerSec);
- m_pSoundTouch->setRateChange((float)(m_dRate-1.0)*100);
-
- if (m_bMuteFastForward) {
- if (m_dRate == 1.0) {
- m_pDSBuffer->SetVolume(m_lVolume);
- } else {
- m_pDSBuffer->SetVolume(DSBVOLUME_MIN);
- }
- }
- }
- }
-
- ClearBuffer();
- }
- hr = CBaseRenderer::Run(tStart);
-
- return hr;
+ HRESULT hr;
+
+ if (m_State == State_Running) {
+ return NOERROR;
+ }
+
+ if (m_useWASAPI) {
+ hr = CheckAudioClient(m_pWaveFileFormat);
+ if (FAILED(hr)) {
+ TRACE(_T("CMpcAudioRenderer::Run Error on check audio client\n"));
+ return hr;
+ }
+ // Rather start the client at the last moment when the buffer is fed
+ /*hr = pAudioClient->Start();
+ if (FAILED (hr))
+ {
+ TRACE(_T("CMpcAudioRenderer::Run Start error"));
+ return hr;
+ }*/
+ } else {
+ if (m_pDSBuffer &&
+ m_pPosition &&
+ m_pWaveFileFormat &&
+ SUCCEEDED(m_pPosition->GetRate(&m_dRate))) {
+ if (m_dRate < 1.0) {
+ hr = m_pDSBuffer->SetFrequency((long)(m_pWaveFileFormat->nSamplesPerSec * m_dRate));
+ if (FAILED(hr)) {
+ return hr;
+ }
+ } else {
+ hr = m_pDSBuffer->SetFrequency((long)m_pWaveFileFormat->nSamplesPerSec);
+ m_pSoundTouch->setRateChange((float)(m_dRate - 1.0) * 100);
+
+ if (m_bMuteFastForward) {
+ if (m_dRate == 1.0) {
+ m_pDSBuffer->SetVolume(m_lVolume);
+ } else {
+ m_pDSBuffer->SetVolume(DSBVOLUME_MIN);
+ }
+ }
+ }
+ }
+
+ ClearBuffer();
+ }
+ hr = CBaseRenderer::Run(tStart);
+
+ return hr;
}
STDMETHODIMP CMpcAudioRenderer::Stop()
{
- if (m_pDSBuffer) {
- m_pDSBuffer->Stop();
- }
- isAudioClientStarted=false;
+ if (m_pDSBuffer) {
+ m_pDSBuffer->Stop();
+ }
+ isAudioClientStarted = false;
- return CBaseRenderer::Stop();
+ return CBaseRenderer::Stop();
};
STDMETHODIMP CMpcAudioRenderer::Pause()
{
- if (m_pDSBuffer) {
- m_pDSBuffer->Stop();
- }
- if (pAudioClient && isAudioClientStarted) {
- pAudioClient->Stop();
- }
- isAudioClientStarted=false;
-
- return CBaseRenderer::Pause();
+ if (m_pDSBuffer) {
+ m_pDSBuffer->Stop();
+ }
+ if (pAudioClient && isAudioClientStarted) {
+ pAudioClient->Stop();
+ }
+ isAudioClientStarted = false;
+
+ return CBaseRenderer::Pause();
};
// === IDispatch
-STDMETHODIMP CMpcAudioRenderer::GetTypeInfoCount(UINT * pctinfo)
+STDMETHODIMP CMpcAudioRenderer::GetTypeInfoCount(UINT* pctinfo)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CMpcAudioRenderer::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CMpcAudioRenderer::GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CMpcAudioRenderer::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// === IBasicAudio
STDMETHODIMP CMpcAudioRenderer::put_Volume(long lVolume)
{
- m_lVolume = lVolume;
- if (!m_useWASAPI && m_pDSBuffer) {
- return m_pDSBuffer->SetVolume(lVolume);
- }
+ m_lVolume = lVolume;
+ if (!m_useWASAPI && m_pDSBuffer) {
+ return m_pDSBuffer->SetVolume(lVolume);
+ }
- return S_OK;
+ return S_OK;
}
-STDMETHODIMP CMpcAudioRenderer::get_Volume(long *plVolume)
+STDMETHODIMP CMpcAudioRenderer::get_Volume(long* plVolume)
{
- if (!m_useWASAPI && m_pDSBuffer) {
- return m_pDSBuffer->GetVolume(plVolume);
- }
+ if (!m_useWASAPI && m_pDSBuffer) {
+ return m_pDSBuffer->GetVolume(plVolume);
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CMpcAudioRenderer::put_Balance(long lBalance)
{
- if (!m_useWASAPI && m_pDSBuffer) {
- return m_pDSBuffer->SetPan(lBalance);
- }
+ if (!m_useWASAPI && m_pDSBuffer) {
+ return m_pDSBuffer->SetPan(lBalance);
+ }
- return S_OK;
+ return S_OK;
}
-STDMETHODIMP CMpcAudioRenderer::get_Balance(long *plBalance)
+STDMETHODIMP CMpcAudioRenderer::get_Balance(long* plBalance)
{
- if (!m_useWASAPI && m_pDSBuffer) {
- return m_pDSBuffer->GetPan(plBalance);
- }
+ if (!m_useWASAPI && m_pDSBuffer) {
+ return m_pDSBuffer->GetPan(plBalance);
+ }
- return S_OK;
+ return S_OK;
}
// === ISpecifyPropertyPages2
STDMETHODIMP CMpcAudioRenderer::GetPages(CAUUID* pPages)
{
- CheckPointer(pPages, E_POINTER);
+ CheckPointer(pPages, E_POINTER);
- pPages->cElems = 1;
+ pPages->cElems = 1;
- pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID) * pPages->cElems);
- pPages->pElems[0] = __uuidof(CMpcAudioRendererSettingsWnd);
+ pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID) * pPages->cElems);
+ pPages->pElems[0] = __uuidof(CMpcAudioRendererSettingsWnd);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CMpcAudioRenderer::CreatePage(const GUID& guid, IPropertyPage** ppPage)
{
- CheckPointer(ppPage, E_POINTER);
+ CheckPointer(ppPage, E_POINTER);
- if (*ppPage != NULL) {
- return E_INVALIDARG;
- }
+ if (*ppPage != NULL) {
+ return E_INVALIDARG;
+ }
- HRESULT hr;
+ HRESULT hr;
- if (guid == __uuidof(CMpcAudioRendererSettingsWnd)) {
- (*ppPage = DNew CInternalPropertyPageTempl<CMpcAudioRendererSettingsWnd>(NULL, &hr))->AddRef();
- }
+ if (guid == __uuidof(CMpcAudioRendererSettingsWnd)) {
+ (*ppPage = DNew CInternalPropertyPageTempl<CMpcAudioRendererSettingsWnd>(NULL, &hr))->AddRef();
+ }
- return *ppPage ? S_OK : E_FAIL;
+ return *ppPage ? S_OK : E_FAIL;
}
// === IMpcAudioRendererFilter
STDMETHODIMP CMpcAudioRenderer::Apply()
{
#ifdef REGISTER_FILTER
- CRegKey key;
- if (ERROR_SUCCESS == key.Create(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPC Audio Renderer"))) {
- key.SetDWORDValue(_T("UseWasapi"), m_useWASAPIAfterRestart);
- key.SetDWORDValue(_T("MuteFastForward"), m_bMuteFastForward);
- key.SetStringValue(_T("SoundDevice"), m_csSound_Device);
- }
+ CRegKey key;
+ if (ERROR_SUCCESS == key.Create(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPC Audio Renderer"))) {
+ key.SetDWORDValue(_T("UseWasapi"), m_useWASAPIAfterRestart);
+ key.SetDWORDValue(_T("MuteFastForward"), m_bMuteFastForward);
+ key.SetStringValue(_T("SoundDevice"), m_csSound_Device);
+ }
#else
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Audio Renderer"), _T("UseWasapi"), m_useWASAPI);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Audio Renderer"), _T("MuteFastForward"), m_bMuteFastForward);
- AfxGetApp()->WriteProfileString(_T("Filters\\MPC Audio Renderer"), _T("SoundDevice"), m_csSound_Device);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Audio Renderer"), _T("UseWasapi"), m_useWASAPI);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Audio Renderer"), _T("MuteFastForward"), m_bMuteFastForward);
+ AfxGetApp()->WriteProfileString(_T("Filters\\MPC Audio Renderer"), _T("SoundDevice"), m_csSound_Device);
#endif
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CMpcAudioRenderer::SetWasapiMode(BOOL nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_useWASAPIAfterRestart = !!nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_useWASAPIAfterRestart = !!nValue;
+ return S_OK;
}
STDMETHODIMP_(BOOL) CMpcAudioRenderer::GetWasapiMode()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_useWASAPIAfterRestart;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_useWASAPIAfterRestart;
}
STDMETHODIMP CMpcAudioRenderer::SetMuteFastForward(BOOL nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_bMuteFastForward = !!nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_bMuteFastForward = !!nValue;
+ return S_OK;
}
STDMETHODIMP_(BOOL) CMpcAudioRenderer::GetMuteFastForward()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_bMuteFastForward;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_bMuteFastForward;
}
STDMETHODIMP CMpcAudioRenderer::SetSoundDevice(CString nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_csSound_Device = nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_csSound_Device = nValue;
+ return S_OK;
}
STDMETHODIMP_(CString) CMpcAudioRenderer::GetSoundDevice()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_csSound_Device;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_csSound_Device;
}
-HRESULT CMpcAudioRenderer::GetReferenceClockInterface(REFIID riid, void **ppv)
+HRESULT CMpcAudioRenderer::GetReferenceClockInterface(REFIID riid, void** ppv)
{
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- if (m_pReferenceClock) {
- return m_pReferenceClock->NonDelegatingQueryInterface(riid, ppv);
- }
+ if (m_pReferenceClock) {
+ return m_pReferenceClock->NonDelegatingQueryInterface(riid, ppv);
+ }
- m_pReferenceClock = DNew CBaseReferenceClock (NAME("Mpc Audio Clock"), NULL, &hr);
- if (! m_pReferenceClock) {
- return E_OUTOFMEMORY;
- }
+ m_pReferenceClock = DNew CBaseReferenceClock(NAME("Mpc Audio Clock"), NULL, &hr);
+ if (! m_pReferenceClock) {
+ return E_OUTOFMEMORY;
+ }
- m_pReferenceClock->AddRef();
+ m_pReferenceClock->AddRef();
- hr = SetSyncSource(m_pReferenceClock);
- if (FAILED(hr)) {
- SetSyncSource(NULL);
- return hr;
- }
+ hr = SetSyncSource(m_pReferenceClock);
+ if (FAILED(hr)) {
+ SetSyncSource(NULL);
+ return hr;
+ }
- return GetReferenceClockInterface(riid, ppv);
+ return GetReferenceClockInterface(riid, ppv);
}
HRESULT CMpcAudioRenderer::EndOfStream(void)
{
- if (m_pDSBuffer) {
- m_pDSBuffer->Stop();
- }
+ if (m_pDSBuffer) {
+ m_pDSBuffer->Stop();
+ }
#if !FILEWRITER
- if (pAudioClient && isAudioClientStarted) {
- pAudioClient->Stop();
- }
+ if (pAudioClient && isAudioClientStarted) {
+ pAudioClient->Stop();
+ }
#endif
- isAudioClientStarted=false;
+ isAudioClientStarted = false;
- return CBaseRenderer::EndOfStream();
+ return CBaseRenderer::EndOfStream();
}
@@ -653,674 +652,659 @@ HRESULT CMpcAudioRenderer::EndOfStream(void)
HRESULT CMpcAudioRenderer::CreateDSBuffer()
{
- if (! m_pWaveFileFormat) {
- return E_POINTER;
- }
-
- HRESULT hr = S_OK;
- LPDIRECTSOUNDBUFFER pDSBPrimary = NULL;
- DSBUFFERDESC dsbd;
- DSBUFFERDESC cDSBufferDesc;
- DSBCAPS bufferCaps;
- DWORD dwDSBufSize = m_pWaveFileFormat->nAvgBytesPerSec * 4;
-
- ZeroMemory(&bufferCaps, sizeof(bufferCaps));
- ZeroMemory(&dsbd, sizeof(DSBUFFERDESC));
-
- dsbd.dwSize = sizeof(DSBUFFERDESC);
- dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER;
- dsbd.dwBufferBytes = 0;
- dsbd.lpwfxFormat = NULL;
- if (SUCCEEDED (hr = m_pDS->CreateSoundBuffer( &dsbd, &pDSBPrimary, NULL ))) {
- hr = pDSBPrimary->SetFormat(m_pWaveFileFormat);
- ATLASSERT(SUCCEEDED(hr));
- SAFE_RELEASE (pDSBPrimary);
- }
-
-
- SAFE_RELEASE (m_pDSBuffer);
- cDSBufferDesc.dwSize = sizeof (DSBUFFERDESC);
- cDSBufferDesc.dwFlags = DSBCAPS_GLOBALFOCUS |
- DSBCAPS_GETCURRENTPOSITION2 |
- DSBCAPS_CTRLVOLUME |
- DSBCAPS_CTRLPAN |
- DSBCAPS_CTRLFREQUENCY;
- cDSBufferDesc.dwBufferBytes = dwDSBufSize;
- cDSBufferDesc.dwReserved = 0;
- cDSBufferDesc.lpwfxFormat = m_pWaveFileFormat;
- cDSBufferDesc.guid3DAlgorithm = GUID_NULL;
-
- hr = m_pDS->CreateSoundBuffer (&cDSBufferDesc, &m_pDSBuffer, NULL);
-
- m_nDSBufSize = 0;
- if (SUCCEEDED(hr)) {
- bufferCaps.dwSize = sizeof(bufferCaps);
- hr = m_pDSBuffer->GetCaps(&bufferCaps);
- }
- if (SUCCEEDED (hr)) {
- m_nDSBufSize = bufferCaps.dwBufferBytes;
- hr = ClearBuffer();
- m_pDSBuffer->SetFrequency ((long)(m_pWaveFileFormat->nSamplesPerSec * m_dRate));
- }
-
- return hr;
+ if (! m_pWaveFileFormat) {
+ return E_POINTER;
+ }
+
+ HRESULT hr = S_OK;
+ LPDIRECTSOUNDBUFFER pDSBPrimary = NULL;
+ DSBUFFERDESC dsbd;
+ DSBUFFERDESC cDSBufferDesc;
+ DSBCAPS bufferCaps;
+ DWORD dwDSBufSize = m_pWaveFileFormat->nAvgBytesPerSec * 4;
+
+ ZeroMemory(&bufferCaps, sizeof(bufferCaps));
+ ZeroMemory(&dsbd, sizeof(DSBUFFERDESC));
+
+ dsbd.dwSize = sizeof(DSBUFFERDESC);
+ dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER;
+ dsbd.dwBufferBytes = 0;
+ dsbd.lpwfxFormat = NULL;
+ if (SUCCEEDED(hr = m_pDS->CreateSoundBuffer(&dsbd, &pDSBPrimary, NULL))) {
+ hr = pDSBPrimary->SetFormat(m_pWaveFileFormat);
+ ATLASSERT(SUCCEEDED(hr));
+ SAFE_RELEASE(pDSBPrimary);
+ }
+
+
+ SAFE_RELEASE(m_pDSBuffer);
+ cDSBufferDesc.dwSize = sizeof(DSBUFFERDESC);
+ cDSBufferDesc.dwFlags = DSBCAPS_GLOBALFOCUS |
+ DSBCAPS_GETCURRENTPOSITION2 |
+ DSBCAPS_CTRLVOLUME |
+ DSBCAPS_CTRLPAN |
+ DSBCAPS_CTRLFREQUENCY;
+ cDSBufferDesc.dwBufferBytes = dwDSBufSize;
+ cDSBufferDesc.dwReserved = 0;
+ cDSBufferDesc.lpwfxFormat = m_pWaveFileFormat;
+ cDSBufferDesc.guid3DAlgorithm = GUID_NULL;
+
+ hr = m_pDS->CreateSoundBuffer(&cDSBufferDesc, &m_pDSBuffer, NULL);
+
+ m_nDSBufSize = 0;
+ if (SUCCEEDED(hr)) {
+ bufferCaps.dwSize = sizeof(bufferCaps);
+ hr = m_pDSBuffer->GetCaps(&bufferCaps);
+ }
+ if (SUCCEEDED(hr)) {
+ m_nDSBufSize = bufferCaps.dwBufferBytes;
+ hr = ClearBuffer();
+ m_pDSBuffer->SetFrequency((long)(m_pWaveFileFormat->nSamplesPerSec * m_dRate));
+ }
+
+ return hr;
}
HRESULT CMpcAudioRenderer::ClearBuffer()
{
- HRESULT hr = S_FALSE;
- VOID* pDSLockedBuffer = NULL;
- DWORD dwDSLockedSize = 0;
-
- if (m_pDSBuffer) {
- m_dwDSWriteOff = 0;
- m_pDSBuffer->SetCurrentPosition(0);
-
- hr = m_pDSBuffer->Lock (0, 0, &pDSLockedBuffer, &dwDSLockedSize, NULL, NULL, DSBLOCK_ENTIREBUFFER);
- if (SUCCEEDED (hr)) {
- memset (pDSLockedBuffer, 0, dwDSLockedSize);
- hr = m_pDSBuffer->Unlock (pDSLockedBuffer, dwDSLockedSize, NULL, NULL);
- }
- }
-
- return hr;
+ HRESULT hr = S_FALSE;
+ VOID* pDSLockedBuffer = NULL;
+ DWORD dwDSLockedSize = 0;
+
+ if (m_pDSBuffer) {
+ m_dwDSWriteOff = 0;
+ m_pDSBuffer->SetCurrentPosition(0);
+
+ hr = m_pDSBuffer->Lock(0, 0, &pDSLockedBuffer, &dwDSLockedSize, NULL, NULL, DSBLOCK_ENTIREBUFFER);
+ if (SUCCEEDED(hr)) {
+ memset(pDSLockedBuffer, 0, dwDSLockedSize);
+ hr = m_pDSBuffer->Unlock(pDSLockedBuffer, dwDSLockedSize, NULL, NULL);
+ }
+ }
+
+ return hr;
}
HRESULT CMpcAudioRenderer::InitCoopLevel()
{
- HRESULT hr = S_OK;
- IVideoWindow* pVideoWindow = NULL;
- HWND hWnd = NULL;
- CComBSTR bstrCaption;
-
- hr = m_pGraph->QueryInterface (__uuidof(IVideoWindow), (void**) &pVideoWindow);
- if (SUCCEEDED (hr)) {
- pVideoWindow->get_Owner((OAHWND*)&hWnd);
- SAFE_RELEASE (pVideoWindow);
- }
- if (!hWnd) {
- hWnd = GetTopWindow(NULL);
- }
-
- ATLASSERT(hWnd != NULL);
- if (!m_useWASAPI) {
- hr = m_pDS->SetCooperativeLevel(hWnd, DSSCL_PRIORITY);
- } else if (hTask == NULL) {
- // Ask MMCSS to temporarily boost the thread priority
- // to reduce glitches while the low-latency stream plays.
- DWORD taskIndex = 0;
-
- if (pfAvSetMmThreadCharacteristicsW) {
- hTask = pfAvSetMmThreadCharacteristicsW(_T("Pro Audio"), &taskIndex);
- TRACE(_T("CMpcAudioRenderer::InitCoopLevel Putting thread in higher priority for Wasapi mode (lowest latency)\n"));
- hr=GetLastError();
- if (hTask == NULL) {
- return hr;
- }
- }
- }
-
- return hr;
+ HRESULT hr = S_OK;
+ IVideoWindow* pVideoWindow = NULL;
+ HWND hWnd = NULL;
+ CComBSTR bstrCaption;
+
+ hr = m_pGraph->QueryInterface(__uuidof(IVideoWindow), (void**) &pVideoWindow);
+ if (SUCCEEDED(hr)) {
+ pVideoWindow->get_Owner((OAHWND*)&hWnd);
+ SAFE_RELEASE(pVideoWindow);
+ }
+ if (!hWnd) {
+ hWnd = GetTopWindow(NULL);
+ }
+
+ ATLASSERT(hWnd != NULL);
+ if (!m_useWASAPI) {
+ hr = m_pDS->SetCooperativeLevel(hWnd, DSSCL_PRIORITY);
+ } else if (hTask == NULL) {
+ // Ask MMCSS to temporarily boost the thread priority
+ // to reduce glitches while the low-latency stream plays.
+ DWORD taskIndex = 0;
+
+ if (pfAvSetMmThreadCharacteristicsW) {
+ hTask = pfAvSetMmThreadCharacteristicsW(_T("Pro Audio"), &taskIndex);
+ TRACE(_T("CMpcAudioRenderer::InitCoopLevel Putting thread in higher priority for Wasapi mode (lowest latency)\n"));
+ hr = GetLastError();
+ if (hTask == NULL) {
+ return hr;
+ }
+ }
+ }
+
+ return hr;
}
-HRESULT CMpcAudioRenderer::DoRenderSampleDirectSound(IMediaSample *pMediaSample)
+HRESULT CMpcAudioRenderer::DoRenderSampleDirectSound(IMediaSample* pMediaSample)
{
- HRESULT hr = S_OK;
- DWORD dwStatus = 0;
- const long lSize = pMediaSample->GetActualDataLength();
- DWORD dwPlayCursor = 0;
- DWORD dwWriteCursor = 0;
-
- hr = m_pDSBuffer->GetStatus(&dwStatus);
-
- if (SUCCEEDED(hr) && (dwStatus & DSBSTATUS_BUFFERLOST)) {
- hr = m_pDSBuffer->Restore();
- }
-
- if ((SUCCEEDED(hr)) && ((dwStatus & DSBSTATUS_PLAYING) != DSBSTATUS_PLAYING)) {
- hr = m_pDSBuffer->Play( 0, 0, DSBPLAY_LOOPING);
- ATLASSERT(SUCCEEDED(hr));
- }
-
- if (SUCCEEDED(hr)) {
- hr = m_pDSBuffer->GetCurrentPosition(&dwPlayCursor, &dwWriteCursor);
- }
-
- if (SUCCEEDED(hr)) {
- if ( ( (dwPlayCursor < dwWriteCursor) &&
- (
- ((m_dwDSWriteOff >= dwPlayCursor) && (m_dwDSWriteOff <= dwWriteCursor))
- ||
- ((m_dwDSWriteOff < dwPlayCursor) && (m_dwDSWriteOff + lSize >= dwPlayCursor))
- )
- )
- ||
- ( (dwWriteCursor < dwPlayCursor) &&
- (
- (m_dwDSWriteOff >= dwPlayCursor) || (m_dwDSWriteOff < dwWriteCursor)
- ) ) ) {
- m_dwDSWriteOff = dwWriteCursor;
- }
-
- if (m_dwDSWriteOff >= (DWORD)m_nDSBufSize) {
- m_dwDSWriteOff = 0;
- }
- }
-
- if (SUCCEEDED(hr)) {
- hr = WriteSampleToDSBuffer(pMediaSample, NULL);
- }
-
- return hr;
+ HRESULT hr = S_OK;
+ DWORD dwStatus = 0;
+ const long lSize = pMediaSample->GetActualDataLength();
+ DWORD dwPlayCursor = 0;
+ DWORD dwWriteCursor = 0;
+
+ hr = m_pDSBuffer->GetStatus(&dwStatus);
+
+ if (SUCCEEDED(hr) && (dwStatus & DSBSTATUS_BUFFERLOST)) {
+ hr = m_pDSBuffer->Restore();
+ }
+
+ if ((SUCCEEDED(hr)) && ((dwStatus & DSBSTATUS_PLAYING) != DSBSTATUS_PLAYING)) {
+ hr = m_pDSBuffer->Play(0, 0, DSBPLAY_LOOPING);
+ ATLASSERT(SUCCEEDED(hr));
+ }
+
+ if (SUCCEEDED(hr)) {
+ hr = m_pDSBuffer->GetCurrentPosition(&dwPlayCursor, &dwWriteCursor);
+ }
+
+ if (SUCCEEDED(hr)) {
+ if (((dwPlayCursor < dwWriteCursor) &&
+ (
+ ((m_dwDSWriteOff >= dwPlayCursor) && (m_dwDSWriteOff <= dwWriteCursor))
+ ||
+ ((m_dwDSWriteOff < dwPlayCursor) && (m_dwDSWriteOff + lSize >= dwPlayCursor))
+ )
+ )
+ ||
+ ((dwWriteCursor < dwPlayCursor) &&
+ (
+ (m_dwDSWriteOff >= dwPlayCursor) || (m_dwDSWriteOff < dwWriteCursor)
+ ))) {
+ m_dwDSWriteOff = dwWriteCursor;
+ }
+
+ if (m_dwDSWriteOff >= (DWORD)m_nDSBufSize) {
+ m_dwDSWriteOff = 0;
+ }
+ }
+
+ if (SUCCEEDED(hr)) {
+ hr = WriteSampleToDSBuffer(pMediaSample, NULL);
+ }
+
+ return hr;
}
-HRESULT CMpcAudioRenderer::WriteSampleToDSBuffer(IMediaSample *pMediaSample, bool *looped)
+HRESULT CMpcAudioRenderer::WriteSampleToDSBuffer(IMediaSample* pMediaSample, bool* looped)
{
- if (! m_pDSBuffer) {
- return E_POINTER;
- }
-
- REFERENCE_TIME rtStart = 0;
- REFERENCE_TIME rtStop = 0;
- HRESULT hr = S_OK;
- bool loop = false;
- VOID* pDSLockedBuffers[2] = { NULL, NULL };
- DWORD dwDSLockedSize[2] = { 0, 0 };
- BYTE* pMediaBuffer = NULL;
- long lSize = pMediaSample->GetActualDataLength();
-
- hr = pMediaSample->GetPointer(&pMediaBuffer);
-
- if (m_dRate > 1.0) {
- int nBytePerSample = m_pWaveFileFormat->nChannels * (m_pWaveFileFormat->wBitsPerSample/8);
- m_pSoundTouch->putSamples((const short*)pMediaBuffer, lSize / nBytePerSample);
- lSize = m_pSoundTouch->receiveSamples ((short*)pMediaBuffer, lSize / nBytePerSample) * nBytePerSample;
- }
-
- pMediaSample->GetTime (&rtStart, &rtStop);
-
- if (rtStart < 0) {
- DWORD dwPercent = (DWORD) ((-rtStart * 100) / (rtStop - rtStart));
- DWORD dwRemove = (lSize*dwPercent/100);
-
- dwRemove = (dwRemove / m_pWaveFileFormat->nBlockAlign) * m_pWaveFileFormat->nBlockAlign;
- pMediaBuffer += dwRemove;
- lSize -= dwRemove;
- }
-
- if (SUCCEEDED (hr)) {
- hr = m_pDSBuffer->Lock (m_dwDSWriteOff, lSize, &pDSLockedBuffers[0], &dwDSLockedSize[0], &pDSLockedBuffers[1], &dwDSLockedSize[1], 0 );
- }
- if (SUCCEEDED (hr)) {
- if (pDSLockedBuffers [0] != NULL) {
- memcpy(pDSLockedBuffers[0], pMediaBuffer, dwDSLockedSize[0]);
- m_dwDSWriteOff += dwDSLockedSize[0];
- }
-
- if (pDSLockedBuffers [1] != NULL) {
- memcpy(pDSLockedBuffers[1], &pMediaBuffer[dwDSLockedSize[0]], dwDSLockedSize[1]);
- m_dwDSWriteOff = dwDSLockedSize[1];
- loop = true;
- }
-
- hr = m_pDSBuffer->Unlock(pDSLockedBuffers[0], dwDSLockedSize[0], pDSLockedBuffers[1], dwDSLockedSize[1]);
- ATLASSERT (dwDSLockedSize [0] + dwDSLockedSize [1] == (DWORD)lSize);
- }
-
- if (SUCCEEDED(hr) && looped) {
- *looped = loop;
- }
-
- return hr;
+ if (! m_pDSBuffer) {
+ return E_POINTER;
+ }
+
+ REFERENCE_TIME rtStart = 0;
+ REFERENCE_TIME rtStop = 0;
+ HRESULT hr = S_OK;
+ bool loop = false;
+ VOID* pDSLockedBuffers[2] = { NULL, NULL };
+ DWORD dwDSLockedSize[2] = { 0, 0 };
+ BYTE* pMediaBuffer = NULL;
+ long lSize = pMediaSample->GetActualDataLength();
+
+ hr = pMediaSample->GetPointer(&pMediaBuffer);
+
+ if (m_dRate > 1.0) {
+ int nBytePerSample = m_pWaveFileFormat->nChannels * (m_pWaveFileFormat->wBitsPerSample / 8);
+ m_pSoundTouch->putSamples((const short*)pMediaBuffer, lSize / nBytePerSample);
+ lSize = m_pSoundTouch->receiveSamples((short*)pMediaBuffer, lSize / nBytePerSample) * nBytePerSample;
+ }
+
+ pMediaSample->GetTime(&rtStart, &rtStop);
+
+ if (rtStart < 0) {
+ DWORD dwPercent = (DWORD)((-rtStart * 100) / (rtStop - rtStart));
+ DWORD dwRemove = (lSize * dwPercent / 100);
+
+ dwRemove = (dwRemove / m_pWaveFileFormat->nBlockAlign) * m_pWaveFileFormat->nBlockAlign;
+ pMediaBuffer += dwRemove;
+ lSize -= dwRemove;
+ }
+
+ if (SUCCEEDED(hr)) {
+ hr = m_pDSBuffer->Lock(m_dwDSWriteOff, lSize, &pDSLockedBuffers[0], &dwDSLockedSize[0], &pDSLockedBuffers[1], &dwDSLockedSize[1], 0);
+ }
+ if (SUCCEEDED(hr)) {
+ if (pDSLockedBuffers [0] != NULL) {
+ memcpy(pDSLockedBuffers[0], pMediaBuffer, dwDSLockedSize[0]);
+ m_dwDSWriteOff += dwDSLockedSize[0];
+ }
+
+ if (pDSLockedBuffers [1] != NULL) {
+ memcpy(pDSLockedBuffers[1], &pMediaBuffer[dwDSLockedSize[0]], dwDSLockedSize[1]);
+ m_dwDSWriteOff = dwDSLockedSize[1];
+ loop = true;
+ }
+
+ hr = m_pDSBuffer->Unlock(pDSLockedBuffers[0], dwDSLockedSize[0], pDSLockedBuffers[1], dwDSLockedSize[1]);
+ ATLASSERT(dwDSLockedSize [0] + dwDSLockedSize [1] == (DWORD)lSize);
+ }
+
+ if (SUCCEEDED(hr) && looped) {
+ *looped = loop;
+ }
+
+ return hr;
}
#pragma endregion
#pragma region // ==== WASAPI
-HRESULT CMpcAudioRenderer::DoRenderSampleWasapi(IMediaSample *pMediaSample)
+HRESULT CMpcAudioRenderer::DoRenderSampleWasapi(IMediaSample* pMediaSample)
{
- HRESULT hr = S_OK;
- REFERENCE_TIME rtStart = 0;
- REFERENCE_TIME rtStop = 0;
- BYTE *pMediaBuffer = NULL;
- BYTE *pInputBufferPointer = NULL;
- BYTE *pInputBufferEnd = NULL;
- BYTE *pData;
- bufferSize = pMediaSample->GetActualDataLength();
- const long lSize = bufferSize;
- pMediaSample->GetTime (&rtStart, &rtStop);
-
- AM_MEDIA_TYPE *pmt;
- if (SUCCEEDED(pMediaSample->GetMediaType(&pmt)) && pmt!=NULL) {
- CMediaType mt(*pmt);
- if ((WAVEFORMATEXTENSIBLE*)mt.Format() != NULL) {
- hr=CheckAudioClient(&(((WAVEFORMATEXTENSIBLE*)mt.Format())->Format));
- } else {
- hr=CheckAudioClient((WAVEFORMATEX*)mt.Format());
- }
- if (FAILED(hr)) {
- TRACE(_T("CMpcAudioRenderer::DoRenderSampleWasapi Error while checking audio client with input media type\n"));
- return hr;
- }
- DeleteMediaType(pmt);
- pmt=NULL;
- }
-
- // Initialization
- hr = pMediaSample->GetPointer(&pMediaBuffer);
- if (FAILED (hr)) {
- return hr;
- }
-
- pInputBufferPointer=&pMediaBuffer[0];
- pInputBufferEnd=&pMediaBuffer[0]+lSize;
-
- WORD frameSize = m_pWaveFileFormat->nBlockAlign;
-
-
- // Sleep for half the buffer duration since last buffer feed
- DWORD currentTime=GetTickCount();
- if (lastBufferTime!=0 && hnsActualDuration!= 0 && lastBufferTime<currentTime && (currentTime-lastBufferTime)<hnsActualDuration) {
- hnsActualDuration=hnsActualDuration-(currentTime-lastBufferTime);
- Sleep(hnsActualDuration);
- }
-
- // Each loop fills one of the two buffers.
- while (pInputBufferPointer < pInputBufferEnd) {
- UINT32 numFramesPadding=0;
- pAudioClient->GetCurrentPadding(&numFramesPadding);
- UINT32 numFramesAvailable = nFramesInBuffer - numFramesPadding;
-
- UINT32 nAvailableBytes=numFramesAvailable*frameSize;
- UINT32 nBytesToWrite=nAvailableBytes;
- // More room than enough in the output buffer
- if (nAvailableBytes > (size_t)(pInputBufferEnd - pInputBufferPointer)) {
- nBytesToWrite=pInputBufferEnd - pInputBufferPointer;
- numFramesAvailable=(UINT32)((float)nBytesToWrite/frameSize);
- }
-
- // Grab the next empty buffer from the audio device.
- hr = pRenderClient->GetBuffer(numFramesAvailable, &pData);
- if (FAILED (hr)) {
- TRACE(_T("CMpcAudioRenderer::DoRenderSampleWasapi GetBuffer failed with size %ld : (error %lx)\n"),nFramesInBuffer,hr);
- return hr;
- }
-
- // Load the buffer with data from the audio source.
- if (pData != NULL) {
-
- memcpy(&pData[0], pInputBufferPointer, nBytesToWrite);
- pInputBufferPointer += nBytesToWrite;
- } else {
- TRACE(_T("CMpcAudioRenderer::DoRenderSampleWasapi Output buffer is NULL\n"));
- }
-
- hr = pRenderClient->ReleaseBuffer(numFramesAvailable, 0); // no flags
- if (FAILED (hr)) {
- TRACE(_T("CMpcAudioRenderer::DoRenderSampleWasapi ReleaseBuffer failed with size %ld (error %lx)\n"),nFramesInBuffer,hr);
- return hr;
- }
-
- if (!isAudioClientStarted) {
- TRACE(_T("CMpcAudioRenderer::DoRenderSampleWasapi Starting audio client\n"));
- pAudioClient->Start();
- isAudioClientStarted=true;
- }
-
- if (pInputBufferPointer >= pInputBufferEnd) {
- lastBufferTime=GetTickCount();
- // This is the duration of the filled buffer
- hnsActualDuration=(double)REFTIMES_PER_SEC * numFramesAvailable / m_pWaveFileFormat->nSamplesPerSec;
- // Sleep time is half this duration
- hnsActualDuration=(DWORD)(hnsActualDuration/REFTIMES_PER_MILLISEC/2);
- break;
- }
-
- // Buffer not completely filled, sleep for half buffer capacity duration
- hnsActualDuration=(double)REFTIMES_PER_SEC * nFramesInBuffer / m_pWaveFileFormat->nSamplesPerSec;
- // Sleep time is half this duration
- hnsActualDuration=(DWORD)(hnsActualDuration/REFTIMES_PER_MILLISEC/2);
- Sleep(hnsActualDuration);
- }
- return hr;
+ HRESULT hr = S_OK;
+ REFERENCE_TIME rtStart = 0;
+ REFERENCE_TIME rtStop = 0;
+ BYTE* pMediaBuffer = NULL;
+ BYTE* pInputBufferPointer = NULL;
+ BYTE* pInputBufferEnd = NULL;
+ BYTE* pData;
+ bufferSize = pMediaSample->GetActualDataLength();
+ const long lSize = bufferSize;
+ pMediaSample->GetTime(&rtStart, &rtStop);
+
+ AM_MEDIA_TYPE* pmt;
+ if (SUCCEEDED(pMediaSample->GetMediaType(&pmt)) && pmt != NULL) {
+ CMediaType mt(*pmt);
+ if ((WAVEFORMATEXTENSIBLE*)mt.Format() != NULL) {
+ hr = CheckAudioClient(&(((WAVEFORMATEXTENSIBLE*)mt.Format())->Format));
+ } else {
+ hr = CheckAudioClient((WAVEFORMATEX*)mt.Format());
+ }
+ if (FAILED(hr)) {
+ TRACE(_T("CMpcAudioRenderer::DoRenderSampleWasapi Error while checking audio client with input media type\n"));
+ return hr;
+ }
+ DeleteMediaType(pmt);
+ pmt = NULL;
+ }
+
+ // Initialization
+ hr = pMediaSample->GetPointer(&pMediaBuffer);
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ pInputBufferPointer = &pMediaBuffer[0];
+ pInputBufferEnd = &pMediaBuffer[0] + lSize;
+
+ WORD frameSize = m_pWaveFileFormat->nBlockAlign;
+
+
+ // Sleep for half the buffer duration since last buffer feed
+ DWORD currentTime = GetTickCount();
+ if (lastBufferTime != 0 && hnsActualDuration != 0 && lastBufferTime < currentTime && (currentTime - lastBufferTime) < hnsActualDuration) {
+ hnsActualDuration = hnsActualDuration - (currentTime - lastBufferTime);
+ Sleep(hnsActualDuration);
+ }
+
+ // Each loop fills one of the two buffers.
+ while (pInputBufferPointer < pInputBufferEnd) {
+ UINT32 numFramesPadding = 0;
+ pAudioClient->GetCurrentPadding(&numFramesPadding);
+ UINT32 numFramesAvailable = nFramesInBuffer - numFramesPadding;
+
+ UINT32 nAvailableBytes = numFramesAvailable * frameSize;
+ UINT32 nBytesToWrite = nAvailableBytes;
+ // More room than enough in the output buffer
+ if (nAvailableBytes > (size_t)(pInputBufferEnd - pInputBufferPointer)) {
+ nBytesToWrite = pInputBufferEnd - pInputBufferPointer;
+ numFramesAvailable = (UINT32)((float)nBytesToWrite / frameSize);
+ }
+
+ // Grab the next empty buffer from the audio device.
+ hr = pRenderClient->GetBuffer(numFramesAvailable, &pData);
+ if (FAILED(hr)) {
+ TRACE(_T("CMpcAudioRenderer::DoRenderSampleWasapi GetBuffer failed with size %ld : (error %lx)\n"), nFramesInBuffer, hr);
+ return hr;
+ }
+
+ // Load the buffer with data from the audio source.
+ if (pData != NULL) {
+
+ memcpy(&pData[0], pInputBufferPointer, nBytesToWrite);
+ pInputBufferPointer += nBytesToWrite;
+ } else {
+ TRACE(_T("CMpcAudioRenderer::DoRenderSampleWasapi Output buffer is NULL\n"));
+ }
+
+ hr = pRenderClient->ReleaseBuffer(numFramesAvailable, 0); // no flags
+ if (FAILED(hr)) {
+ TRACE(_T("CMpcAudioRenderer::DoRenderSampleWasapi ReleaseBuffer failed with size %ld (error %lx)\n"), nFramesInBuffer, hr);
+ return hr;
+ }
+
+ if (!isAudioClientStarted) {
+ TRACE(_T("CMpcAudioRenderer::DoRenderSampleWasapi Starting audio client\n"));
+ pAudioClient->Start();
+ isAudioClientStarted = true;
+ }
+
+ if (pInputBufferPointer >= pInputBufferEnd) {
+ lastBufferTime = GetTickCount();
+ // This is the duration of the filled buffer
+ hnsActualDuration = (double)REFTIMES_PER_SEC * numFramesAvailable / m_pWaveFileFormat->nSamplesPerSec;
+ // Sleep time is half this duration
+ hnsActualDuration = (DWORD)(hnsActualDuration / REFTIMES_PER_MILLISEC / 2);
+ break;
+ }
+
+ // Buffer not completely filled, sleep for half buffer capacity duration
+ hnsActualDuration = (double)REFTIMES_PER_SEC * nFramesInBuffer / m_pWaveFileFormat->nSamplesPerSec;
+ // Sleep time is half this duration
+ hnsActualDuration = (DWORD)(hnsActualDuration / REFTIMES_PER_MILLISEC / 2);
+ Sleep(hnsActualDuration);
+ }
+ return hr;
}
#pragma endregion
-HRESULT CMpcAudioRenderer::CheckAudioClient(WAVEFORMATEX *pWaveFormatEx)
+HRESULT CMpcAudioRenderer::CheckAudioClient(WAVEFORMATEX* pWaveFormatEx)
{
- HRESULT hr = S_OK;
- CAutoLock cAutoLock(&m_csCheck);
- TRACE(_T("CMpcAudioRenderer::CheckAudioClient\n"));
- if (pMMDevice == NULL) {
- hr = GetAudioDevice(&pMMDevice);
- }
-
- // If no WAVEFORMATEX structure provided and client already exists, return it
- if (pAudioClient != NULL && pWaveFormatEx == NULL) {
- return hr;
- }
-
- // Just create the audio client if no WAVEFORMATEX provided
- if (pAudioClient == NULL && pWaveFormatEx==NULL) {
- if (SUCCEEDED (hr)) {
- hr=CreateAudioClient(pMMDevice, &pAudioClient);
- }
- return hr;
- }
-
- // Compare the exisiting WAVEFORMATEX with the one provided
- WAVEFORMATEX *pNewWaveFormatEx = NULL;
- if (CheckFormatChanged(pWaveFormatEx, &pNewWaveFormatEx)) {
- // Format has changed, audio client has to be reinitialized
- TRACE(_T("CMpcAudioRenderer::CheckAudioClient Format changed, reinitialize the audio client\n"));
- if (m_pWaveFileFormat) {
- BYTE *p = (BYTE *)m_pWaveFileFormat;
- SAFE_DELETE_ARRAY(p);
- }
- m_pWaveFileFormat=pNewWaveFormatEx;
- hr = pAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE, pWaveFormatEx, NULL);
- if (SUCCEEDED(hr)) {
- if (pAudioClient!=NULL && isAudioClientStarted) {
- pAudioClient->Stop();
- }
- isAudioClientStarted=false;
- SAFE_RELEASE(pRenderClient);
- SAFE_RELEASE(pAudioClient);
- if (SUCCEEDED (hr)) {
- hr=CreateAudioClient(pMMDevice, &pAudioClient);
- }
- } else {
- TRACE(_T("CMpcAudioRenderer::CheckAudioClient New format not supported, accept it anyway\n"));
- return S_OK;
- }
- } else if (pRenderClient == NULL) {
- TRACE(_T("CMpcAudioRenderer::CheckAudioClient First initialization of the audio renderer\n"));
- } else {
- return hr;
- }
-
-
- SAFE_RELEASE(pRenderClient);
- if (SUCCEEDED (hr)) {
- hr=InitAudioClient(pWaveFormatEx, pAudioClient, &pRenderClient);
- }
- return hr;
+ HRESULT hr = S_OK;
+ CAutoLock cAutoLock(&m_csCheck);
+ TRACE(_T("CMpcAudioRenderer::CheckAudioClient\n"));
+ if (pMMDevice == NULL) {
+ hr = GetAudioDevice(&pMMDevice);
+ }
+
+ // If no WAVEFORMATEX structure provided and client already exists, return it
+ if (pAudioClient != NULL && pWaveFormatEx == NULL) {
+ return hr;
+ }
+
+ // Just create the audio client if no WAVEFORMATEX provided
+ if (pAudioClient == NULL && pWaveFormatEx == NULL) {
+ if (SUCCEEDED(hr)) {
+ hr = CreateAudioClient(pMMDevice, &pAudioClient);
+ }
+ return hr;
+ }
+
+ // Compare the exisiting WAVEFORMATEX with the one provided
+ WAVEFORMATEX* pNewWaveFormatEx = NULL;
+ if (CheckFormatChanged(pWaveFormatEx, &pNewWaveFormatEx)) {
+ // Format has changed, audio client has to be reinitialized
+ TRACE(_T("CMpcAudioRenderer::CheckAudioClient Format changed, reinitialize the audio client\n"));
+ if (m_pWaveFileFormat) {
+ BYTE* p = (BYTE*)m_pWaveFileFormat;
+ SAFE_DELETE_ARRAY(p);
+ }
+ m_pWaveFileFormat = pNewWaveFormatEx;
+ hr = pAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE, pWaveFormatEx, NULL);
+ if (SUCCEEDED(hr)) {
+ if (pAudioClient != NULL && isAudioClientStarted) {
+ pAudioClient->Stop();
+ }
+ isAudioClientStarted = false;
+ SAFE_RELEASE(pRenderClient);
+ SAFE_RELEASE(pAudioClient);
+ if (SUCCEEDED(hr)) {
+ hr = CreateAudioClient(pMMDevice, &pAudioClient);
+ }
+ } else {
+ TRACE(_T("CMpcAudioRenderer::CheckAudioClient New format not supported, accept it anyway\n"));
+ return S_OK;
+ }
+ } else if (pRenderClient == NULL) {
+ TRACE(_T("CMpcAudioRenderer::CheckAudioClient First initialization of the audio renderer\n"));
+ } else {
+ return hr;
+ }
+
+
+ SAFE_RELEASE(pRenderClient);
+ if (SUCCEEDED(hr)) {
+ hr = InitAudioClient(pWaveFormatEx, pAudioClient, &pRenderClient);
+ }
+ return hr;
}
-HRESULT CMpcAudioRenderer::GetAvailableAudioDevices(IMMDeviceCollection **ppMMDevices)
+HRESULT CMpcAudioRenderer::GetAvailableAudioDevices(IMMDeviceCollection** ppMMDevices)
{
- HRESULT hr;
-
- CComPtr<IMMDeviceEnumerator> enumerator;
- TRACE(_T("CMpcAudioRenderer::GetAvailableAudioDevices\n"));
- hr = enumerator.CoCreateInstance(__uuidof(MMDeviceEnumerator));
-
- if (FAILED(hr))
- {
- TRACE(_T("CMpcAudioRenderer::GetAvailableAudioDevices - failed to get MMDeviceEnumerator\n"));
- return S_FALSE;
- }
-
- //IMMDevice* pEndpoint = NULL;
- //IPropertyStore* pProps = NULL;
- //LPWSTR pwszID = NULL;
-
- enumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, ppMMDevices);
- UINT count(0);
- hr = (*ppMMDevices)->GetCount(&count);
- return hr;
+ HRESULT hr;
+
+ CComPtr<IMMDeviceEnumerator> enumerator;
+ TRACE(_T("CMpcAudioRenderer::GetAvailableAudioDevices\n"));
+ hr = enumerator.CoCreateInstance(__uuidof(MMDeviceEnumerator));
+
+ if (FAILED(hr)) {
+ TRACE(_T("CMpcAudioRenderer::GetAvailableAudioDevices - failed to get MMDeviceEnumerator\n"));
+ return S_FALSE;
+ }
+
+ //IMMDevice* pEndpoint = NULL;
+ //IPropertyStore* pProps = NULL;
+ //LPWSTR pwszID = NULL;
+
+ enumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, ppMMDevices);
+ UINT count(0);
+ hr = (*ppMMDevices)->GetCount(&count);
+ return hr;
}
-HRESULT CMpcAudioRenderer::GetAudioDevice(IMMDevice **ppMMDevice)
+HRESULT CMpcAudioRenderer::GetAudioDevice(IMMDevice** ppMMDevice)
{
- TRACE(_T("CMpcAudioRenderer::GetAudioDevice\n"));
-
- CComPtr<IMMDeviceEnumerator> enumerator;
- IMMDeviceCollection* devices;
- IPropertyStore* pProps = NULL;
- HRESULT hr = enumerator.CoCreateInstance(__uuidof(MMDeviceEnumerator));
-
- if (hr != S_OK)
- {
- TRACE(_T("CMpcAudioRenderer::GetAudioDevice - failed to create MMDeviceEnumerator!\n"));
- return hr;
- }
-
- TRACE(_T("CMpcAudioRenderer::GetAudioDevice - Target end point: %s\n"), m_csSound_Device);
-
- if (GetAvailableAudioDevices(&devices) == S_OK && devices)
- {
- UINT count(0);
- hr = devices->GetCount(&count);
- if (hr != S_OK)
- {
- TRACE(_T("CMpcAudioRenderer::GetAudioDevice - devices->GetCount failed: (0x%08x)\n"), hr);
- return hr;
- }
-
- for (ULONG i = 0 ; i < count ; i++)
- {
- LPWSTR pwszID = NULL;
- IMMDevice *endpoint = NULL;
- hr = devices->Item(i, &endpoint);
- if (hr == S_OK)
- {
- hr = endpoint->GetId(&pwszID);
- if (hr == S_OK)
- {
- if (endpoint->OpenPropertyStore(STGM_READ, &pProps) == S_OK)
- {
-
- PROPVARIANT varName;
- PropVariantInit(&varName);
-
- // Found the configured audio endpoint
- if ((pProps->GetValue(PKEY_Device_FriendlyName, &varName) == S_OK) && (m_csSound_Device == varName.pwszVal))
- {
- TRACE(_T("CMpcAudioRenderer::GetAudioDevice - devices->GetId OK, num: (%d), pwszVal: %s, pwszID: %s\n"), i, varName.pwszVal, pwszID);
- enumerator->GetDevice(pwszID, ppMMDevice);
- SAFE_RELEASE(devices);
- *(ppMMDevice) = endpoint;
- CoTaskMemFree(pwszID);
- pwszID = NULL;
- PropVariantClear(&varName);
- SAFE_RELEASE(pProps);
- return S_OK;
- }
- else
- {
- PropVariantClear(&varName);
- SAFE_RELEASE(pProps);
- SAFE_RELEASE(endpoint);
- CoTaskMemFree(pwszID);
- pwszID = NULL;
- }
- }
- }
- else
- {
- TRACE(_T("CMpcAudioRenderer::GetAudioDevice - devices->GetId failed: (0x%08x)\n"), hr);
- }
- }
- else
- {
- TRACE(_T("CMpcAudioRenderer::GetAudioDevice - devices->Item failed: (0x%08x)\n"), hr);
- }
-
- CoTaskMemFree(pwszID);
- pwszID = NULL;
- }
- }
-
- TRACE(_T("CMpcAudioRenderer::GetAudioDevice - Unable to find selected audio device, using the default end point!\n"));
- hr = enumerator->GetDefaultAudioEndpoint(eRender, eConsole, ppMMDevice);
-
- SAFE_RELEASE(devices);
-
- return hr;
+ TRACE(_T("CMpcAudioRenderer::GetAudioDevice\n"));
+
+ CComPtr<IMMDeviceEnumerator> enumerator;
+ IMMDeviceCollection* devices;
+ IPropertyStore* pProps = NULL;
+ HRESULT hr = enumerator.CoCreateInstance(__uuidof(MMDeviceEnumerator));
+
+ if (hr != S_OK) {
+ TRACE(_T("CMpcAudioRenderer::GetAudioDevice - failed to create MMDeviceEnumerator!\n"));
+ return hr;
+ }
+
+ TRACE(_T("CMpcAudioRenderer::GetAudioDevice - Target end point: %s\n"), m_csSound_Device);
+
+ if (GetAvailableAudioDevices(&devices) == S_OK && devices) {
+ UINT count(0);
+ hr = devices->GetCount(&count);
+ if (hr != S_OK) {
+ TRACE(_T("CMpcAudioRenderer::GetAudioDevice - devices->GetCount failed: (0x%08x)\n"), hr);
+ return hr;
+ }
+
+ for (ULONG i = 0 ; i < count ; i++) {
+ LPWSTR pwszID = NULL;
+ IMMDevice* endpoint = NULL;
+ hr = devices->Item(i, &endpoint);
+ if (hr == S_OK) {
+ hr = endpoint->GetId(&pwszID);
+ if (hr == S_OK) {
+ if (endpoint->OpenPropertyStore(STGM_READ, &pProps) == S_OK) {
+
+ PROPVARIANT varName;
+ PropVariantInit(&varName);
+
+ // Found the configured audio endpoint
+ if ((pProps->GetValue(PKEY_Device_FriendlyName, &varName) == S_OK) && (m_csSound_Device == varName.pwszVal)) {
+ TRACE(_T("CMpcAudioRenderer::GetAudioDevice - devices->GetId OK, num: (%d), pwszVal: %s, pwszID: %s\n"), i, varName.pwszVal, pwszID);
+ enumerator->GetDevice(pwszID, ppMMDevice);
+ SAFE_RELEASE(devices);
+ *(ppMMDevice) = endpoint;
+ CoTaskMemFree(pwszID);
+ pwszID = NULL;
+ PropVariantClear(&varName);
+ SAFE_RELEASE(pProps);
+ return S_OK;
+ } else {
+ PropVariantClear(&varName);
+ SAFE_RELEASE(pProps);
+ SAFE_RELEASE(endpoint);
+ CoTaskMemFree(pwszID);
+ pwszID = NULL;
+ }
+ }
+ } else {
+ TRACE(_T("CMpcAudioRenderer::GetAudioDevice - devices->GetId failed: (0x%08x)\n"), hr);
+ }
+ } else {
+ TRACE(_T("CMpcAudioRenderer::GetAudioDevice - devices->Item failed: (0x%08x)\n"), hr);
+ }
+
+ CoTaskMemFree(pwszID);
+ pwszID = NULL;
+ }
+ }
+
+ TRACE(_T("CMpcAudioRenderer::GetAudioDevice - Unable to find selected audio device, using the default end point!\n"));
+ hr = enumerator->GetDefaultAudioEndpoint(eRender, eConsole, ppMMDevice);
+
+ SAFE_RELEASE(devices);
+
+ return hr;
}
-bool CMpcAudioRenderer::CheckFormatChanged(WAVEFORMATEX *pWaveFormatEx, WAVEFORMATEX **ppNewWaveFormatEx)
+bool CMpcAudioRenderer::CheckFormatChanged(WAVEFORMATEX* pWaveFormatEx, WAVEFORMATEX** ppNewWaveFormatEx)
{
- bool formatChanged=false;
- if (m_pWaveFileFormat==NULL) {
- formatChanged=true;
- } else if (pWaveFormatEx->wFormatTag != m_pWaveFileFormat->wFormatTag
- || pWaveFormatEx->nChannels != m_pWaveFileFormat->nChannels
- || pWaveFormatEx->wBitsPerSample != m_pWaveFileFormat->wBitsPerSample) { // TODO : improve the checks
- formatChanged=true;
- }
-
-
- if (!formatChanged) {
- return false;
- }
-
- int size = sizeof(WAVEFORMATEX) + pWaveFormatEx->cbSize; // Always true, even for WAVEFORMATEXTENSIBLE and WAVEFORMATEXTENSIBLE_IEC61937
- *ppNewWaveFormatEx = (WAVEFORMATEX *)DNew BYTE[size];
- if (! *ppNewWaveFormatEx) {
- return false;
- }
- memcpy(*ppNewWaveFormatEx, pWaveFormatEx, size);
- return true;
+ bool formatChanged = false;
+ if (m_pWaveFileFormat == NULL) {
+ formatChanged = true;
+ } else if (pWaveFormatEx->wFormatTag != m_pWaveFileFormat->wFormatTag
+ || pWaveFormatEx->nChannels != m_pWaveFileFormat->nChannels
+ || pWaveFormatEx->wBitsPerSample != m_pWaveFileFormat->wBitsPerSample) { // TODO : improve the checks
+ formatChanged = true;
+ }
+
+
+ if (!formatChanged) {
+ return false;
+ }
+
+ int size = sizeof(WAVEFORMATEX) + pWaveFormatEx->cbSize; // Always true, even for WAVEFORMATEXTENSIBLE and WAVEFORMATEXTENSIBLE_IEC61937
+ *ppNewWaveFormatEx = (WAVEFORMATEX*)DNew BYTE[size];
+ if (! *ppNewWaveFormatEx) {
+ return false;
+ }
+ memcpy(*ppNewWaveFormatEx, pWaveFormatEx, size);
+ return true;
}
-HRESULT CMpcAudioRenderer::GetBufferSize(WAVEFORMATEX *pWaveFormatEx, REFERENCE_TIME *pHnsBufferPeriod)
+HRESULT CMpcAudioRenderer::GetBufferSize(WAVEFORMATEX* pWaveFormatEx, REFERENCE_TIME* pHnsBufferPeriod)
{
- if (pWaveFormatEx==NULL) {
- return S_OK;
- }
- if (pWaveFormatEx->cbSize <22) { //WAVEFORMATEX
- return S_OK;
- }
-
- WAVEFORMATEXTENSIBLE *wfext=(WAVEFORMATEXTENSIBLE*)pWaveFormatEx;
-
- if (bufferSize==0)
- if (wfext->SubFormat==KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_MLP) {
- bufferSize=61440;
- } else if (wfext->SubFormat==KSDATAFORMAT_SUBTYPE_IEC61937_DTS_HD) {
- bufferSize=32768;
- } else if (wfext->SubFormat==KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_DIGITAL_PLUS) {
- bufferSize=24576;
- } else if (wfext->Format.wFormatTag==WAVE_FORMAT_DOLBY_AC3_SPDIF) {
- bufferSize=6144;
- } else {
- return S_OK;
- }
-
- *pHnsBufferPeriod = (REFERENCE_TIME)( (REFERENCE_TIME)bufferSize * 10000 * 8 / ((REFERENCE_TIME)pWaveFormatEx->nChannels * pWaveFormatEx->wBitsPerSample *
- 1.0 * pWaveFormatEx->nSamplesPerSec) /*+ 0.5*/);
- *pHnsBufferPeriod *= 1000;
-
- TRACE(_T("CMpcAudioRenderer::GetBufferSize set a %lld period for a %ld buffer size\n"),*pHnsBufferPeriod,bufferSize);
-
- return S_OK;
+ if (pWaveFormatEx == NULL) {
+ return S_OK;
+ }
+ if (pWaveFormatEx->cbSize < 22) { //WAVEFORMATEX
+ return S_OK;
+ }
+
+ WAVEFORMATEXTENSIBLE* wfext = (WAVEFORMATEXTENSIBLE*)pWaveFormatEx;
+
+ if (bufferSize == 0)
+ if (wfext->SubFormat == KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_MLP) {
+ bufferSize = 61440;
+ } else if (wfext->SubFormat == KSDATAFORMAT_SUBTYPE_IEC61937_DTS_HD) {
+ bufferSize = 32768;
+ } else if (wfext->SubFormat == KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_DIGITAL_PLUS) {
+ bufferSize = 24576;
+ } else if (wfext->Format.wFormatTag == WAVE_FORMAT_DOLBY_AC3_SPDIF) {
+ bufferSize = 6144;
+ } else {
+ return S_OK;
+ }
+
+ *pHnsBufferPeriod = (REFERENCE_TIME)((REFERENCE_TIME)bufferSize * 10000 * 8 / ((REFERENCE_TIME)pWaveFormatEx->nChannels * pWaveFormatEx->wBitsPerSample *
+ 1.0 * pWaveFormatEx->nSamplesPerSec) /*+ 0.5*/);
+ *pHnsBufferPeriod *= 1000;
+
+ TRACE(_T("CMpcAudioRenderer::GetBufferSize set a %lld period for a %ld buffer size\n"), *pHnsBufferPeriod, bufferSize);
+
+ return S_OK;
}
-HRESULT CMpcAudioRenderer::InitAudioClient(WAVEFORMATEX *pWaveFormatEx, IAudioClient *pAudioClient, IAudioRenderClient **ppRenderClient)
+HRESULT CMpcAudioRenderer::InitAudioClient(WAVEFORMATEX* pWaveFormatEx, IAudioClient* pAudioClient, IAudioRenderClient** ppRenderClient)
{
- TRACE(_T("CMpcAudioRenderer::InitAudioClient\n"));
- HRESULT hr=S_OK;
- // Initialize the stream to play at the minimum latency.
- //if (SUCCEEDED (hr)) hr = pAudioClient->GetDevicePeriod(NULL, &hnsPeriod);
- hnsPeriod=500000; //50 ms is the best according to James @Slysoft
-
- hr = pAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE, pWaveFormatEx, NULL);
- if (FAILED(hr)) {
- TRACE(_T("CMpcAudioRenderer::InitAudioClient not supported (0x%08x)\n"), hr);
- } else {
- TRACE(_T("CMpcAudioRenderer::InitAudioClient format supported\n"));
- }
-
- GetBufferSize(pWaveFormatEx, &hnsPeriod);
-
- if (SUCCEEDED (hr)) hr = pAudioClient->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE,0/*AUDCLNT_STREAMFLAGS_EVENTCALLBACK*/,
- hnsPeriod,hnsPeriod,pWaveFormatEx,NULL);
- if (FAILED (hr) && hr != AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) {
- TRACE(_T("CMpcAudioRenderer::InitAudioClient failed (0x%08x)\n"), hr);
- return hr;
- }
-
- if (AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED == hr) {
- // if the buffer size was not aligned, need to do the alignment dance
- TRACE(_T("CMpcAudioRenderer::InitAudioClient Buffer size not aligned. Realigning\n"));
-
- // get the buffer size, which will be aligned
- hr = pAudioClient->GetBufferSize(&nFramesInBuffer);
-
- // throw away this IAudioClient
- pAudioClient->Release();
- pAudioClient=NULL;
-
- // calculate the new aligned periodicity
- hnsPeriod = // hns =
- (REFERENCE_TIME)(
- 10000.0 * // (hns / ms) *
- 1000 * // (ms / s) *
- nFramesInBuffer / // frames /
- pWaveFormatEx->nSamplesPerSec // (frames / s)
- + 0.5 // rounding
- );
-
- if (SUCCEEDED (hr)) {
- hr=CreateAudioClient(pMMDevice, &pAudioClient);
- }
- TRACE(_T("CMpcAudioRenderer::InitAudioClient Trying again with periodicity of %I64u hundred-nanoseconds, or %u frames.\n"), hnsPeriod, nFramesInBuffer);
- if (SUCCEEDED (hr))
- hr = pAudioClient->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE,0/*AUDCLNT_STREAMFLAGS_EVENTCALLBACK*/,
- hnsPeriod, hnsPeriod, pWaveFormatEx, NULL);
- if (FAILED(hr)) {
- TRACE(_T("CMpcAudioRenderer::InitAudioClient Failed to reinitialize the audio client\n"));
- return hr;
- }
- } // if (AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED == hr)
-
- // get the buffer size, which is aligned
- if (SUCCEEDED (hr)) {
- hr = pAudioClient->GetBufferSize(&nFramesInBuffer);
- }
-
- // calculate the new period
- if (SUCCEEDED (hr)) {
- hr = pAudioClient->GetService(__uuidof(IAudioRenderClient), (void**)(ppRenderClient));
- }
-
- if (FAILED (hr)) {
- TRACE(_T("CMpcAudioRenderer::InitAudioClient service initialization failed (0x%08x)\n"), hr);
- } else {
- TRACE(_T("CMpcAudioRenderer::InitAudioClient service initialization success\n"));
- }
-
- return hr;
+ TRACE(_T("CMpcAudioRenderer::InitAudioClient\n"));
+ HRESULT hr = S_OK;
+ // Initialize the stream to play at the minimum latency.
+ //if (SUCCEEDED (hr)) hr = pAudioClient->GetDevicePeriod(NULL, &hnsPeriod);
+ hnsPeriod = 500000; //50 ms is the best according to James @Slysoft
+
+ hr = pAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE, pWaveFormatEx, NULL);
+ if (FAILED(hr)) {
+ TRACE(_T("CMpcAudioRenderer::InitAudioClient not supported (0x%08x)\n"), hr);
+ } else {
+ TRACE(_T("CMpcAudioRenderer::InitAudioClient format supported\n"));
+ }
+
+ GetBufferSize(pWaveFormatEx, &hnsPeriod);
+
+ if (SUCCEEDED(hr)) hr = pAudioClient->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE, 0/*AUDCLNT_STREAMFLAGS_EVENTCALLBACK*/,
+ hnsPeriod, hnsPeriod, pWaveFormatEx, NULL);
+ if (FAILED(hr) && hr != AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) {
+ TRACE(_T("CMpcAudioRenderer::InitAudioClient failed (0x%08x)\n"), hr);
+ return hr;
+ }
+
+ if (AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED == hr) {
+ // if the buffer size was not aligned, need to do the alignment dance
+ TRACE(_T("CMpcAudioRenderer::InitAudioClient Buffer size not aligned. Realigning\n"));
+
+ // get the buffer size, which will be aligned
+ hr = pAudioClient->GetBufferSize(&nFramesInBuffer);
+
+ // throw away this IAudioClient
+ pAudioClient->Release();
+ pAudioClient = NULL;
+
+ // calculate the new aligned periodicity
+ hnsPeriod = // hns =
+ (REFERENCE_TIME)(
+ 10000.0 * // (hns / ms) *
+ 1000 * // (ms / s) *
+ nFramesInBuffer / // frames /
+ pWaveFormatEx->nSamplesPerSec // (frames / s)
+ + 0.5 // rounding
+ );
+
+ if (SUCCEEDED(hr)) {
+ hr = CreateAudioClient(pMMDevice, &pAudioClient);
+ }
+ TRACE(_T("CMpcAudioRenderer::InitAudioClient Trying again with periodicity of %I64u hundred-nanoseconds, or %u frames.\n"), hnsPeriod, nFramesInBuffer);
+ if (SUCCEEDED(hr))
+ hr = pAudioClient->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE, 0/*AUDCLNT_STREAMFLAGS_EVENTCALLBACK*/,
+ hnsPeriod, hnsPeriod, pWaveFormatEx, NULL);
+ if (FAILED(hr)) {
+ TRACE(_T("CMpcAudioRenderer::InitAudioClient Failed to reinitialize the audio client\n"));
+ return hr;
+ }
+ } // if (AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED == hr)
+
+ // get the buffer size, which is aligned
+ if (SUCCEEDED(hr)) {
+ hr = pAudioClient->GetBufferSize(&nFramesInBuffer);
+ }
+
+ // calculate the new period
+ if (SUCCEEDED(hr)) {
+ hr = pAudioClient->GetService(__uuidof(IAudioRenderClient), (void**)(ppRenderClient));
+ }
+
+ if (FAILED(hr)) {
+ TRACE(_T("CMpcAudioRenderer::InitAudioClient service initialization failed (0x%08x)\n"), hr);
+ } else {
+ TRACE(_T("CMpcAudioRenderer::InitAudioClient service initialization success\n"));
+ }
+
+ return hr;
}
-HRESULT CMpcAudioRenderer::CreateAudioClient(IMMDevice *pMMDevice, IAudioClient **ppAudioClient)
+HRESULT CMpcAudioRenderer::CreateAudioClient(IMMDevice* pMMDevice, IAudioClient** ppAudioClient)
{
- HRESULT hr = S_OK;
- hnsPeriod = 0;
-
- TRACE(_T("CMpcAudioRenderer::CreateAudioClient\n"));
-
- if (*ppAudioClient) {
- if (isAudioClientStarted) {
- (*ppAudioClient)->Stop();
- }
- SAFE_RELEASE(*ppAudioClient);
- isAudioClientStarted=false;
- }
-
- if (pMMDevice==NULL) {
- TRACE(_T("CMpcAudioRenderer::CreateAudioClient failed, device not loaded\n"));
- return E_FAIL;
- }
-
- hr = pMMDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, reinterpret_cast<void**>(ppAudioClient));
- if (FAILED(hr)) {
- TRACE(_T("CMpcAudioRenderer::CreateAudioClient activation failed (0x%08x)\n"), hr);
- } else {
- TRACE(_T("CMpcAudioRenderer::CreateAudioClient success\n"));
- }
- return hr;
+ HRESULT hr = S_OK;
+ hnsPeriod = 0;
+
+ TRACE(_T("CMpcAudioRenderer::CreateAudioClient\n"));
+
+ if (*ppAudioClient) {
+ if (isAudioClientStarted) {
+ (*ppAudioClient)->Stop();
+ }
+ SAFE_RELEASE(*ppAudioClient);
+ isAudioClientStarted = false;
+ }
+
+ if (pMMDevice == NULL) {
+ TRACE(_T("CMpcAudioRenderer::CreateAudioClient failed, device not loaded\n"));
+ return E_FAIL;
+ }
+
+ hr = pMMDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, reinterpret_cast<void**>(ppAudioClient));
+ if (FAILED(hr)) {
+ TRACE(_T("CMpcAudioRenderer::CreateAudioClient activation failed (0x%08x)\n"), hr);
+ } else {
+ TRACE(_T("CMpcAudioRenderer::CreateAudioClient success\n"));
+ }
+ return hr;
}
diff --git a/src/filters/renderer/MpcAudioRenderer/MpcAudioRenderer.h b/src/filters/renderer/MpcAudioRenderer/MpcAudioRenderer.h
index d012d9a78..9bd0ea496 100644
--- a/src/filters/renderer/MpcAudioRenderer/MpcAudioRenderer.h
+++ b/src/filters/renderer/MpcAudioRenderer/MpcAudioRenderer.h
@@ -25,7 +25,7 @@
#include <BaseClasses/streams.h>
#include <dsound.h>
-#include <MMReg.h> //must be before other Wasapi headers
+#include <MMReg.h> //must be before other Wasapi headers
#include <strsafe.h>
#include <mmdeviceapi.h>
#include <avrt.h>
@@ -39,124 +39,124 @@
#define MpcAudioRendererName L"MPC Audio Renderer"
// REFERENCE_TIME time units per second and per millisecond
-#define REFTIMES_PER_SEC 10000000
-#define REFTIMES_PER_MILLISEC 10000
+#define REFTIMES_PER_SEC 10000000
+#define REFTIMES_PER_MILLISEC 10000
// if you get a compilation error on AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED,
// uncomment the #define below
#define AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED AUDCLNT_ERR(0x019)
class __declspec(uuid("601D2A2B-9CDE-40bd-8650-0485E3522727"))
- CMpcAudioRenderer : public CBaseRenderer
- , public IBasicAudio
- , public ISpecifyPropertyPages2
- , public IMpcAudioRendererFilter
+ CMpcAudioRenderer : public CBaseRenderer
+ , public IBasicAudio
+ , public ISpecifyPropertyPages2
+ , public IMpcAudioRendererFilter
{
public:
- CMpcAudioRenderer(LPUNKNOWN punk, HRESULT *phr);
- virtual ~CMpcAudioRenderer();
+ CMpcAudioRenderer(LPUNKNOWN punk, HRESULT* phr);
+ virtual ~CMpcAudioRenderer();
- static const AMOVIESETUP_FILTER sudASFilter;
+ static const AMOVIESETUP_FILTER sudASFilter;
- HRESULT CheckInputType (const CMediaType* mtIn);
- virtual HRESULT CheckMediaType (const CMediaType *pmt);
- virtual HRESULT DoRenderSample (IMediaSample *pMediaSample);
- virtual void OnReceiveFirstSample (IMediaSample *pMediaSample);
- BOOL ScheduleSample (IMediaSample *pMediaSample);
- virtual HRESULT SetMediaType (const CMediaType *pmt);
- virtual HRESULT CompleteConnect (IPin *pReceivePin);
+ HRESULT CheckInputType(const CMediaType* mtIn);
+ virtual HRESULT CheckMediaType(const CMediaType* pmt);
+ virtual HRESULT DoRenderSample(IMediaSample* pMediaSample);
+ virtual void OnReceiveFirstSample(IMediaSample* pMediaSample);
+ BOOL ScheduleSample(IMediaSample* pMediaSample);
+ virtual HRESULT SetMediaType(const CMediaType* pmt);
+ virtual HRESULT CompleteConnect(IPin* pReceivePin);
- HRESULT EndOfStream(void);
+ HRESULT EndOfStream(void);
- DECLARE_IUNKNOWN
+ DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // === IMediaFilter
- STDMETHOD(Run) (REFERENCE_TIME tStart);
- STDMETHOD(Stop) ();
- STDMETHOD(Pause) ();
+ // === IMediaFilter
+ STDMETHOD(Run)(REFERENCE_TIME tStart);
+ STDMETHOD(Stop)();
+ STDMETHOD(Pause)();
- // === IDispatch (pour IBasicAudio)
- STDMETHOD(GetTypeInfoCount) (UINT * pctinfo);
- STDMETHOD(GetTypeInfo) (UINT itinfo, LCID lcid, ITypeInfo ** pptinfo);
- STDMETHOD(GetIDsOfNames) (REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid);
- STDMETHOD(Invoke) (DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr);
+ // === IDispatch (pour IBasicAudio)
+ STDMETHOD(GetTypeInfoCount)(UINT* pctinfo);
+ STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo** pptinfo);
+ STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid);
+ STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr);
- // === IBasicAudio
- STDMETHOD(put_Volume) (long lVolume);
- STDMETHOD(get_Volume) (long *plVolume);
- STDMETHOD(put_Balance) (long lBalance);
- STDMETHOD(get_Balance) (long *plBalance);
+ // === IBasicAudio
+ STDMETHOD(put_Volume)(long lVolume);
+ STDMETHOD(get_Volume)(long* plVolume);
+ STDMETHOD(put_Balance)(long lBalance);
+ STDMETHOD(get_Balance)(long* plBalance);
- // === ISpecifyPropertyPages2
- STDMETHODIMP GetPages(CAUUID* pPages);
- STDMETHODIMP CreatePage(const GUID& guid, IPropertyPage** ppPage);
+ // === ISpecifyPropertyPages2
+ STDMETHODIMP GetPages(CAUUID* pPages);
+ STDMETHODIMP CreatePage(const GUID& guid, IPropertyPage** ppPage);
- // === IMpcAudioRendererFilter
- STDMETHODIMP Apply();
- STDMETHODIMP SetWasapiMode(BOOL nValue);
- STDMETHODIMP_(BOOL) GetWasapiMode();
- STDMETHODIMP SetMuteFastForward(BOOL nValue);
- STDMETHODIMP_(BOOL) GetMuteFastForward();
- STDMETHODIMP SetSoundDevice(CString nValue);
- STDMETHODIMP_(CString) GetSoundDevice();
+ // === IMpcAudioRendererFilter
+ STDMETHODIMP Apply();
+ STDMETHODIMP SetWasapiMode(BOOL nValue);
+ STDMETHODIMP_(BOOL) GetWasapiMode();
+ STDMETHODIMP SetMuteFastForward(BOOL nValue);
+ STDMETHODIMP_(BOOL) GetMuteFastForward();
+ STDMETHODIMP SetSoundDevice(CString nValue);
+ STDMETHODIMP_(CString) GetSoundDevice();
- // CMpcAudioRenderer
+ // CMpcAudioRenderer
private:
- HRESULT DoRenderSampleDirectSound(IMediaSample *pMediaSample);
-
- HRESULT InitCoopLevel();
- HRESULT ClearBuffer();
- HRESULT CreateDSBuffer();
- HRESULT GetReferenceClockInterface(REFIID riid, void **ppv);
- HRESULT WriteSampleToDSBuffer(IMediaSample *pMediaSample, bool *looped);
-
- LPDIRECTSOUND8 m_pDS;
- LPDIRECTSOUNDBUFFER m_pDSBuffer;
- DWORD m_dwDSWriteOff;
- WAVEFORMATEX *m_pWaveFileFormat;
- int m_nDSBufSize;
- CBaseReferenceClock* m_pReferenceClock;
- double m_dRate;
- long m_lVolume;
- soundtouch::SoundTouch* m_pSoundTouch;
- CCritSec m_csProps;
-
- // CMpcAudioRenderer WASAPI methods
- HRESULT GetAvailableAudioDevices(IMMDeviceCollection **ppMMDevices);
- HRESULT GetAudioDevice(IMMDevice **ppMMDevice);
- HRESULT CreateAudioClient(IMMDevice *pMMDevice, IAudioClient **ppAudioClient);
- HRESULT InitAudioClient(WAVEFORMATEX *pWaveFormatEx, IAudioClient *pAudioClient, IAudioRenderClient **ppRenderClient);
- HRESULT CheckAudioClient(WAVEFORMATEX *pWaveFormatEx);
- bool CheckFormatChanged(WAVEFORMATEX *pWaveFormatEx, WAVEFORMATEX **ppNewWaveFormatEx);
- HRESULT DoRenderSampleWasapi(IMediaSample *pMediaSample);
- HRESULT GetBufferSize(WAVEFORMATEX *pWaveFormatEx, REFERENCE_TIME *pHnsBufferPeriod);
-
-
- // WASAPI variables
- bool m_useWASAPI;
- bool m_useWASAPIAfterRestart;
- bool m_bMuteFastForward;
- CString m_csSound_Device;
- IMMDevice *pMMDevice;
- IAudioClient *pAudioClient;
- IAudioRenderClient *pRenderClient;
- UINT32 nFramesInBuffer;
- REFERENCE_TIME hnsPeriod, hnsActualDuration;
- HANDLE hTask;
- CCritSec m_csCheck;
- UINT32 bufferSize;
- bool isAudioClientStarted;
- DWORD lastBufferTime;
-
- // AVRT.dll (Vista or greater
- typedef HANDLE (__stdcall *PTR_AvSetMmThreadCharacteristicsW)(LPCWSTR TaskName, LPDWORD TaskIndex);
- typedef BOOL (__stdcall *PTR_AvRevertMmThreadCharacteristics)(HANDLE AvrtHandle);
-
- PTR_AvSetMmThreadCharacteristicsW pfAvSetMmThreadCharacteristicsW;
- PTR_AvRevertMmThreadCharacteristics pfAvRevertMmThreadCharacteristics;
+ HRESULT DoRenderSampleDirectSound(IMediaSample* pMediaSample);
+
+ HRESULT InitCoopLevel();
+ HRESULT ClearBuffer();
+ HRESULT CreateDSBuffer();
+ HRESULT GetReferenceClockInterface(REFIID riid, void** ppv);
+ HRESULT WriteSampleToDSBuffer(IMediaSample* pMediaSample, bool* looped);
+
+ LPDIRECTSOUND8 m_pDS;
+ LPDIRECTSOUNDBUFFER m_pDSBuffer;
+ DWORD m_dwDSWriteOff;
+ WAVEFORMATEX* m_pWaveFileFormat;
+ int m_nDSBufSize;
+ CBaseReferenceClock* m_pReferenceClock;
+ double m_dRate;
+ long m_lVolume;
+ soundtouch::SoundTouch* m_pSoundTouch;
+ CCritSec m_csProps;
+
+ // CMpcAudioRenderer WASAPI methods
+ HRESULT GetAvailableAudioDevices(IMMDeviceCollection** ppMMDevices);
+ HRESULT GetAudioDevice(IMMDevice** ppMMDevice);
+ HRESULT CreateAudioClient(IMMDevice* pMMDevice, IAudioClient** ppAudioClient);
+ HRESULT InitAudioClient(WAVEFORMATEX* pWaveFormatEx, IAudioClient* pAudioClient, IAudioRenderClient** ppRenderClient);
+ HRESULT CheckAudioClient(WAVEFORMATEX* pWaveFormatEx);
+ bool CheckFormatChanged(WAVEFORMATEX* pWaveFormatEx, WAVEFORMATEX** ppNewWaveFormatEx);
+ HRESULT DoRenderSampleWasapi(IMediaSample* pMediaSample);
+ HRESULT GetBufferSize(WAVEFORMATEX* pWaveFormatEx, REFERENCE_TIME* pHnsBufferPeriod);
+
+
+ // WASAPI variables
+ bool m_useWASAPI;
+ bool m_useWASAPIAfterRestart;
+ bool m_bMuteFastForward;
+ CString m_csSound_Device;
+ IMMDevice* pMMDevice;
+ IAudioClient* pAudioClient;
+ IAudioRenderClient* pRenderClient;
+ UINT32 nFramesInBuffer;
+ REFERENCE_TIME hnsPeriod, hnsActualDuration;
+ HANDLE hTask;
+ CCritSec m_csCheck;
+ UINT32 bufferSize;
+ bool isAudioClientStarted;
+ DWORD lastBufferTime;
+
+ // AVRT.dll (Vista or greater
+ typedef HANDLE(__stdcall* PTR_AvSetMmThreadCharacteristicsW)(LPCWSTR TaskName, LPDWORD TaskIndex);
+ typedef BOOL (__stdcall* PTR_AvRevertMmThreadCharacteristics)(HANDLE AvrtHandle);
+
+ PTR_AvSetMmThreadCharacteristicsW pfAvSetMmThreadCharacteristicsW;
+ PTR_AvRevertMmThreadCharacteristics pfAvRevertMmThreadCharacteristics;
};
diff --git a/src/filters/renderer/MpcAudioRenderer/MpcAudioRendererSettingsWnd.cpp b/src/filters/renderer/MpcAudioRenderer/MpcAudioRendererSettingsWnd.cpp
index 8b9465957..0100e05ff 100644
--- a/src/filters/renderer/MpcAudioRenderer/MpcAudioRendererSettingsWnd.cpp
+++ b/src/filters/renderer/MpcAudioRenderer/MpcAudioRendererSettingsWnd.cpp
@@ -30,8 +30,8 @@
// ==>>> Resource identifier from "resource.h" present in mplayerc project!
#define ResStr(id) CString(MAKEINTRESOURCE(id))
-#define LEFT_SPACING 25
-#define VERTICAL_SPACING 25
+#define LEFT_SPACING 25
+#define VERTICAL_SPACING 25
CMpcAudioRendererSettingsWnd::CMpcAudioRendererSettingsWnd(void)
{
@@ -39,84 +39,81 @@ CMpcAudioRendererSettingsWnd::CMpcAudioRendererSettingsWnd(void)
bool CMpcAudioRendererSettingsWnd::OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks)
{
- ASSERT(!m_pMAR);
+ ASSERT(!m_pMAR);
- m_pMAR.Release();
+ m_pMAR.Release();
- POSITION pos = pUnks.GetHeadPosition();
- while (pos && !(m_pMAR = pUnks.GetNext(pos))) {
- ;
- }
+ POSITION pos = pUnks.GetHeadPosition();
+ while (pos && !(m_pMAR = pUnks.GetNext(pos))) {
+ ;
+ }
- if (!m_pMAR) {
- return false;
- }
+ if (!m_pMAR) {
+ return false;
+ }
- return true;
+ return true;
}
void CMpcAudioRendererSettingsWnd::OnDisconnect()
{
- m_pMAR.Release();
+ m_pMAR.Release();
}
bool CALLBACK DSEnumProc(LPGUID lpGUID,
- LPCTSTR lpszDesc,
- LPCTSTR lpszDrvName,
- LPVOID lpContext )
+ LPCTSTR lpszDesc,
+ LPCTSTR lpszDrvName,
+ LPVOID lpContext)
{
- CComboBox *pCombo = (CComboBox*)lpContext;
- ASSERT ( pCombo );
- LPGUID lpTemp = NULL;
-
- if (lpGUID != NULL) // NULL only for "Primary Sound Driver".
- {
- if ((lpTemp = (LPGUID)malloc(sizeof(GUID))) == NULL)
- {
- return TRUE;
- }
- memcpy(lpTemp, lpGUID, sizeof(GUID));
- }
- pCombo->AddString ( lpszDesc );
- free(lpTemp);
- return TRUE;
+ CComboBox* pCombo = (CComboBox*)lpContext;
+ ASSERT(pCombo);
+ LPGUID lpTemp = NULL;
+
+ if (lpGUID != NULL) { // NULL only for "Primary Sound Driver".
+ if ((lpTemp = (LPGUID)malloc(sizeof(GUID))) == NULL) {
+ return TRUE;
+ }
+ memcpy(lpTemp, lpGUID, sizeof(GUID));
+ }
+ pCombo->AddString(lpszDesc);
+ free(lpTemp);
+ return TRUE;
}
bool CMpcAudioRendererSettingsWnd::OnActivate()
{
- int nPosY = 10;
-
- m_grpDefault.Create (_T(""), WS_VISIBLE|WS_CHILD | BS_GROUPBOX, CRect (10, nPosY, 350, nPosY+300), this, (UINT)IDC_STATIC);
- nPosY += VERTICAL_SPACING;
- m_cbWasapiMode.Create (ResStr (IDS_ARS_WASAPI_MODE), WS_VISIBLE|WS_CHILD|BS_AUTOCHECKBOX|BS_LEFTTEXT, CRect (LEFT_SPACING, nPosY, 325, nPosY+15), this, IDC_PP_WASAPI_MODE);
- nPosY += VERTICAL_SPACING;
- m_cbMuteFastForward.Create (ResStr (IDS_ARS_MUTE_FAST_FORWARD), WS_VISIBLE|WS_CHILD|BS_AUTOCHECKBOX|BS_LEFTTEXT, CRect (LEFT_SPACING, nPosY, 325, nPosY+15), this, IDC_PP_MUTE_FAST_FORWARD);
- nPosY += VERTICAL_SPACING + 5;
- m_txtSoundDevice.Create (ResStr (IDS_ARS_SOUND_DEVICE), WS_VISIBLE|WS_CHILD, CRect (LEFT_SPACING, nPosY, 100, nPosY+15), this, (UINT)IDC_STATIC);
- m_cbSoundDevice.Create (WS_VISIBLE|WS_CHILD|CBS_DROPDOWNLIST|WS_VSCROLL, CRect (110, nPosY-4, 325, nPosY+90), this, IDC_PP_SOUND_DEVICE);
-
- SetClassLongPtr(GetDlgItem(IDC_PP_SOUND_DEVICE)->m_hWnd, GCLP_HCURSOR, (LONG_PTR)AfxGetApp()->LoadStandardCursor(IDC_HAND));
-
- DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc, (VOID*)&m_cbSoundDevice);
-
- if ( m_cbSoundDevice.GetCount() > 0 ) {
- int idx = m_cbSoundDevice.FindString(0, m_pMAR->GetSoundDevice());
- if ( idx < 0) {
- m_cbSoundDevice.SetCurSel(0);
- }
- else {
- m_cbSoundDevice.SetCurSel(m_cbSoundDevice.FindString(0, m_pMAR->GetSoundDevice()));
- }
- }
-
- m_cbWasapiMode.SetCheck(m_pMAR->GetWasapiMode());
- m_cbMuteFastForward.SetCheck(m_pMAR->GetMuteFastForward());
-
- for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
- pWnd->SetFont(&m_font, FALSE);
- }
-
- return true;
+ int nPosY = 10;
+
+ m_grpDefault.Create(_T(""), WS_VISIBLE | WS_CHILD | BS_GROUPBOX, CRect(10, nPosY, 350, nPosY + 300), this, (UINT)IDC_STATIC);
+ nPosY += VERTICAL_SPACING;
+ m_cbWasapiMode.Create(ResStr(IDS_ARS_WASAPI_MODE), WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_LEFTTEXT, CRect(LEFT_SPACING, nPosY, 325, nPosY + 15), this, IDC_PP_WASAPI_MODE);
+ nPosY += VERTICAL_SPACING;
+ m_cbMuteFastForward.Create(ResStr(IDS_ARS_MUTE_FAST_FORWARD), WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_LEFTTEXT, CRect(LEFT_SPACING, nPosY, 325, nPosY + 15), this, IDC_PP_MUTE_FAST_FORWARD);
+ nPosY += VERTICAL_SPACING + 5;
+ m_txtSoundDevice.Create(ResStr(IDS_ARS_SOUND_DEVICE), WS_VISIBLE | WS_CHILD, CRect(LEFT_SPACING, nPosY, 100, nPosY + 15), this, (UINT)IDC_STATIC);
+ m_cbSoundDevice.Create(WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST | WS_VSCROLL, CRect(110, nPosY - 4, 325, nPosY + 90), this, IDC_PP_SOUND_DEVICE);
+
+ SetClassLongPtr(GetDlgItem(IDC_PP_SOUND_DEVICE)->m_hWnd, GCLP_HCURSOR, (LONG_PTR)AfxGetApp()->LoadStandardCursor(IDC_HAND));
+
+ DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc, (VOID*)&m_cbSoundDevice);
+
+ if (m_cbSoundDevice.GetCount() > 0) {
+ int idx = m_cbSoundDevice.FindString(0, m_pMAR->GetSoundDevice());
+ if (idx < 0) {
+ m_cbSoundDevice.SetCurSel(0);
+ } else {
+ m_cbSoundDevice.SetCurSel(m_cbSoundDevice.FindString(0, m_pMAR->GetSoundDevice()));
+ }
+ }
+
+ m_cbWasapiMode.SetCheck(m_pMAR->GetWasapiMode());
+ m_cbMuteFastForward.SetCheck(m_pMAR->GetMuteFastForward());
+
+ for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
+ pWnd->SetFont(&m_font, FALSE);
+ }
+
+ return true;
}
void CMpcAudioRendererSettingsWnd::OnDeactivate()
@@ -125,21 +122,21 @@ void CMpcAudioRendererSettingsWnd::OnDeactivate()
bool CMpcAudioRendererSettingsWnd::OnApply()
{
- OnDeactivate();
-
- if (m_pMAR) {
- m_pMAR->SetWasapiMode(m_cbWasapiMode.GetCheck());
- m_pMAR->SetMuteFastForward(m_cbMuteFastForward.GetCheck());
- CString str;
- int idx = m_cbSoundDevice.GetCurSel();
- if ( !(idx < 0) ) {
- m_cbSoundDevice.GetLBText( idx, str );
- m_pMAR->SetSoundDevice(str);
- }
- m_pMAR->Apply();
- }
-
- return true;
+ OnDeactivate();
+
+ if (m_pMAR) {
+ m_pMAR->SetWasapiMode(m_cbWasapiMode.GetCheck());
+ m_pMAR->SetMuteFastForward(m_cbMuteFastForward.GetCheck());
+ CString str;
+ int idx = m_cbSoundDevice.GetCurSel();
+ if (!(idx < 0)) {
+ m_cbSoundDevice.GetLBText(idx, str);
+ m_pMAR->SetSoundDevice(str);
+ }
+ m_pMAR->Apply();
+ }
+
+ return true;
}
diff --git a/src/filters/renderer/MpcAudioRenderer/MpcAudioRendererSettingsWnd.h b/src/filters/renderer/MpcAudioRenderer/MpcAudioRendererSettingsWnd.h
index 16b4d034b..c1884249e 100644
--- a/src/filters/renderer/MpcAudioRenderer/MpcAudioRendererSettingsWnd.h
+++ b/src/filters/renderer/MpcAudioRenderer/MpcAudioRendererSettingsWnd.h
@@ -27,44 +27,44 @@
#include <afxcmn.h>
class __declspec(uuid("1E53BA32-3BCC-4dff-9342-34E46BE3F5A5"))
- CMpcAudioRendererSettingsWnd : public CInternalPropertyPageWnd
+ CMpcAudioRendererSettingsWnd : public CInternalPropertyPageWnd
{
private :
- CComQIPtr<IMpcAudioRendererFilter> m_pMAR;
+ CComQIPtr<IMpcAudioRendererFilter> m_pMAR;
- CButton m_grpDefault;
+ CButton m_grpDefault;
- CStatic m_txtWasapiMode;
- CButton m_cbWasapiMode;
- CButton m_cbMuteFastForward;
+ CStatic m_txtWasapiMode;
+ CButton m_cbWasapiMode;
+ CButton m_cbMuteFastForward;
- CStatic m_txtSoundDevice;
- CComboBox m_cbSoundDevice;
+ CStatic m_txtSoundDevice;
+ CComboBox m_cbSoundDevice;
- enum {
- IDC_PP_WASAPI_MODE = 10000,
- IDC_PP_MUTE_FAST_FORWARD,
- IDC_PP_SOUND_DEVICE,
- };
+ enum {
+ IDC_PP_WASAPI_MODE = 10000,
+ IDC_PP_MUTE_FAST_FORWARD,
+ IDC_PP_SOUND_DEVICE,
+ };
public:
- CMpcAudioRendererSettingsWnd(void);
+ CMpcAudioRendererSettingsWnd(void);
- bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
- void OnDisconnect();
- bool OnActivate();
- void OnDeactivate();
- bool OnApply();
+ bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
+ void OnDisconnect();
+ bool OnActivate();
+ void OnDeactivate();
+ bool OnApply();
- HRESULT GetAvailableAudioDevices();
+ HRESULT GetAvailableAudioDevices();
- static LPCTSTR GetWindowTitle() {
- return _T("Settings");
- }
- static CSize GetWindowSize() {
- return CSize(350, 325);
- }
+ static LPCTSTR GetWindowTitle() {
+ return _T("Settings");
+ }
+ static CSize GetWindowSize() {
+ return CSize(350, 325);
+ }
- DECLARE_MESSAGE_MAP()
+ DECLARE_MESSAGE_MAP()
};
diff --git a/src/filters/renderer/SyncClock/Interfaces.h b/src/filters/renderer/SyncClock/Interfaces.h
index 8194c1322..74b6340fb 100644
--- a/src/filters/renderer/SyncClock/Interfaces.h
+++ b/src/filters/renderer/SyncClock/Interfaces.h
@@ -28,8 +28,8 @@ MIDL_INTERFACE("A62888FB-8E37-44d2-8850-B3E3F2C1169F")
ISyncClock:
public IUnknown {
public:
- virtual HRESULT STDMETHODCALLTYPE AdjustClock(DOUBLE adjustment) = 0;
- virtual HRESULT STDMETHODCALLTYPE SetBias(DOUBLE bias) = 0;
- virtual HRESULT STDMETHODCALLTYPE GetBias(DOUBLE *bias) = 0;
- virtual HRESULT STDMETHODCALLTYPE GetStartTime(REFERENCE_TIME *startTime);
+ virtual HRESULT STDMETHODCALLTYPE AdjustClock(DOUBLE adjustment) = 0;
+ virtual HRESULT STDMETHODCALLTYPE SetBias(DOUBLE bias) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetBias(DOUBLE * bias) = 0;
+ virtual HRESULT STDMETHODCALLTYPE GetStartTime(REFERENCE_TIME * startTime);
};
diff --git a/src/filters/renderer/SyncClock/SyncClock.cpp b/src/filters/renderer/SyncClock/SyncClock.cpp
index 75b0adcc8..7688059f4 100644
--- a/src/filters/renderer/SyncClock/SyncClock.cpp
+++ b/src/filters/renderer/SyncClock/SyncClock.cpp
@@ -24,9 +24,9 @@
#include "SyncClock.h"
-CSyncClockFilter::CSyncClockFilter(LPUNKNOWN pUnk, HRESULT *phr)
- : CBaseFilter(NAME("SyncClock"), NULL, &m_Lock, CLSID_NULL)
- , m_Clock(static_cast<IBaseFilter*>(this), phr)
+CSyncClockFilter::CSyncClockFilter(LPUNKNOWN pUnk, HRESULT* phr)
+ : CBaseFilter(NAME("SyncClock"), NULL, &m_Lock, CLSID_NULL)
+ , m_Clock(static_cast<IBaseFilter*>(this), phr)
{
}
@@ -36,86 +36,86 @@ CSyncClockFilter::~CSyncClockFilter()
STDMETHODIMP CSyncClockFilter::AdjustClock(DOUBLE adjustment)
{
- m_Clock.adjustment = adjustment;
- return S_OK;
+ m_Clock.adjustment = adjustment;
+ return S_OK;
}
STDMETHODIMP CSyncClockFilter::SetBias(DOUBLE bias)
{
- m_Clock.bias = bias;
- return S_OK;
+ m_Clock.bias = bias;
+ return S_OK;
}
-STDMETHODIMP CSyncClockFilter::GetBias(DOUBLE *bias)
+STDMETHODIMP CSyncClockFilter::GetBias(DOUBLE* bias)
{
- *bias = m_Clock.bias;
- return S_OK;
+ *bias = m_Clock.bias;
+ return S_OK;
}
-STDMETHODIMP CSyncClockFilter::GetStartTime(REFERENCE_TIME *startTime)
+STDMETHODIMP CSyncClockFilter::GetStartTime(REFERENCE_TIME* startTime)
{
- *startTime = m_tStart;
- return S_OK;
+ *startTime = m_tStart;
+ return S_OK;
}
-STDMETHODIMP CSyncClockFilter::NonDelegatingQueryInterface( REFIID riid, void ** ppv )
+STDMETHODIMP CSyncClockFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
-
- if (riid == IID_IReferenceClock) {
- return GetInterface(static_cast<IReferenceClock*>(&m_Clock), ppv);
- } else if (riid == IID_ISyncClock) {
- return GetInterface(static_cast<ISyncClock*>(this), ppv);
- } else {
- return CBaseFilter::NonDelegatingQueryInterface(riid, ppv);
- }
+ CheckPointer(ppv, E_POINTER);
+
+ if (riid == IID_IReferenceClock) {
+ return GetInterface(static_cast<IReferenceClock*>(&m_Clock), ppv);
+ } else if (riid == IID_ISyncClock) {
+ return GetInterface(static_cast<ISyncClock*>(this), ppv);
+ } else {
+ return CBaseFilter::NonDelegatingQueryInterface(riid, ppv);
+ }
}
int CSyncClockFilter::GetPinCount()
{
- return 0;
+ return 0;
}
-CBasePin *CSyncClockFilter::GetPin(int i)
+CBasePin* CSyncClockFilter::GetPin(int i)
{
- UNREFERENCED_PARAMETER(i);
- return NULL;
+ UNREFERENCED_PARAMETER(i);
+ return NULL;
}
// CSyncClock methods
-CSyncClock::CSyncClock(LPUNKNOWN pUnk, HRESULT *phr)
- : CBaseReferenceClock(NAME("SyncClock"), pUnk, phr)
- , m_pCurrentRefClock(0), m_pPrevRefClock(0)
+CSyncClock::CSyncClock(LPUNKNOWN pUnk, HRESULT* phr)
+ : CBaseReferenceClock(NAME("SyncClock"), pUnk, phr)
+ , m_pCurrentRefClock(0), m_pPrevRefClock(0)
{
- QueryPerformanceFrequency((LARGE_INTEGER*)&m_llPerfFrequency);
- m_rtPrivateTime = GetTicks100ns();
- m_rtPrevTime = m_rtPrivateTime;
- adjustment = 1.0;
- bias = 1.0;
+ QueryPerformanceFrequency((LARGE_INTEGER*)&m_llPerfFrequency);
+ m_rtPrivateTime = GetTicks100ns();
+ m_rtPrevTime = m_rtPrivateTime;
+ adjustment = 1.0;
+ bias = 1.0;
}
REFERENCE_TIME CSyncClock::GetPrivateTime()
{
- CAutoLock cObjectLock(this);
+ CAutoLock cObjectLock(this);
- REFERENCE_TIME rtTime = GetTicks100ns();
+ REFERENCE_TIME rtTime = GetTicks100ns();
- REFERENCE_TIME delta = rtTime - m_rtPrevTime;
- // We ignore that rtTime may wrap around. Not gonna happen too often
- m_rtPrevTime = rtTime;
+ REFERENCE_TIME delta = rtTime - m_rtPrevTime;
+ // We ignore that rtTime may wrap around. Not gonna happen too often
+ m_rtPrevTime = rtTime;
- delta = (REFERENCE_TIME)((DOUBLE)delta * adjustment * bias);
- m_rtPrivateTime = m_rtPrivateTime + delta;
- return m_rtPrivateTime;
+ delta = (REFERENCE_TIME)((DOUBLE)delta * adjustment * bias);
+ m_rtPrivateTime = m_rtPrivateTime + delta;
+ return m_rtPrivateTime;
}
REFERENCE_TIME CSyncClock::GetTicks100ns()
{
- LONGLONG i64Ticks100ns;
- if (m_llPerfFrequency != 0) {
- QueryPerformanceCounter((LARGE_INTEGER*)&i64Ticks100ns);
- i64Ticks100ns = LONGLONG((double(i64Ticks100ns) * 10000000) / double(m_llPerfFrequency) + 0.5);
- return (REFERENCE_TIME)i64Ticks100ns;
- }
- return 0;
+ LONGLONG i64Ticks100ns;
+ if (m_llPerfFrequency != 0) {
+ QueryPerformanceCounter((LARGE_INTEGER*)&i64Ticks100ns);
+ i64Ticks100ns = LONGLONG((double(i64Ticks100ns) * 10000000) / double(m_llPerfFrequency) + 0.5);
+ return (REFERENCE_TIME)i64Ticks100ns;
+ }
+ return 0;
}
diff --git a/src/filters/renderer/SyncClock/SyncClock.h b/src/filters/renderer/SyncClock/SyncClock.h
index 1a0a24804..50de20a56 100644
--- a/src/filters/renderer/SyncClock/SyncClock.h
+++ b/src/filters/renderer/SyncClock/SyncClock.h
@@ -30,48 +30,48 @@ class CSyncClockFilter;
class CSyncClock: public CBaseReferenceClock
{
- friend class CSyncClockFilter;
+ friend class CSyncClockFilter;
public:
- CSyncClock(LPUNKNOWN pUnk, HRESULT *phr);
+ CSyncClock(LPUNKNOWN pUnk, HRESULT* phr);
- REFERENCE_TIME GetPrivateTime();
- IUnknown * pUnk() {
- return static_cast<IUnknown*>(static_cast<IReferenceClock*>(this));
- }
- DOUBLE adjustment; // For adjusting speed temporarily
- DOUBLE bias; // For changing speed permanently
+ REFERENCE_TIME GetPrivateTime();
+ IUnknown* pUnk() {
+ return static_cast<IUnknown*>(static_cast<IReferenceClock*>(this));
+ }
+ DOUBLE adjustment; // For adjusting speed temporarily
+ DOUBLE bias; // For changing speed permanently
private:
- REFERENCE_TIME m_rtPrivateTime;
- LONGLONG m_llPerfFrequency;
- REFERENCE_TIME m_rtPrevTime;
- CCritSec m_csClock;
- IReferenceClock * m_pCurrentRefClock;
- IReferenceClock * m_pPrevRefClock;
- REFERENCE_TIME GetTicks100ns();
+ REFERENCE_TIME m_rtPrivateTime;
+ LONGLONG m_llPerfFrequency;
+ REFERENCE_TIME m_rtPrevTime;
+ CCritSec m_csClock;
+ IReferenceClock* m_pCurrentRefClock;
+ IReferenceClock* m_pPrevRefClock;
+ REFERENCE_TIME GetTicks100ns();
};
class __declspec(uuid("57797fe5-ee9b-4408-98a9-20b134e7e8f0"))
- CSyncClockFilter: public ISyncClock, public CBaseFilter
+ CSyncClockFilter: public ISyncClock, public CBaseFilter
{
public:
- CSyncClockFilter(LPUNKNOWN pUnk, HRESULT *phr);
- virtual ~CSyncClockFilter();
+ CSyncClockFilter(LPUNKNOWN pUnk, HRESULT* phr);
+ virtual ~CSyncClockFilter();
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface( REFIID riid, void ** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // ISyncClock
- STDMETHODIMP AdjustClock(DOUBLE adjustment);
- STDMETHODIMP SetBias(DOUBLE bias);
- STDMETHODIMP GetBias(DOUBLE *bias);
- STDMETHODIMP GetStartTime(REFERENCE_TIME *startTime);
+ // ISyncClock
+ STDMETHODIMP AdjustClock(DOUBLE adjustment);
+ STDMETHODIMP SetBias(DOUBLE bias);
+ STDMETHODIMP GetBias(DOUBLE* bias);
+ STDMETHODIMP GetStartTime(REFERENCE_TIME* startTime);
- // CBaseFilter methods
- int GetPinCount();
- CBasePin* GetPin(int iPin);
+ // CBaseFilter methods
+ int GetPinCount();
+ CBasePin* GetPin(int iPin);
private:
- CSyncClock m_Clock;
- CCritSec m_Lock;
+ CSyncClock m_Clock;
+ CCritSec m_Lock;
};
diff --git a/src/filters/renderer/SyncClock/stdafx.h b/src/filters/renderer/SyncClock/stdafx.h
index 57e5495e4..c8671082d 100644
--- a/src/filters/renderer/SyncClock/stdafx.h
+++ b/src/filters/renderer/SyncClock/stdafx.h
@@ -25,12 +25,12 @@
#include "../../../DSUtil/SharedInclude.h"
#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#endif
-#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
+#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
#ifndef VC_EXTRALEAN
-#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
+#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#endif
#include <afx.h>
diff --git a/src/filters/renderer/VideoRenderers/AllocatorCommon.cpp b/src/filters/renderer/VideoRenderers/AllocatorCommon.cpp
index a422ca918..a21587ec5 100644
--- a/src/filters/renderer/VideoRenderers/AllocatorCommon.cpp
+++ b/src/filters/renderer/VideoRenderers/AllocatorCommon.cpp
@@ -34,296 +34,290 @@
bool IsVMR9InGraph(IFilterGraph* pFG)
{
- BeginEnumFilters(pFG, pEF, pBF)
- if (CComQIPtr<IVMRWindowlessControl9>(pBF)) {
- return true;
- }
- EndEnumFilters
- return false;
+ BeginEnumFilters(pFG, pEF, pBF)
+ if (CComQIPtr<IVMRWindowlessControl9>(pBF)) {
+ return true;
+ }
+ EndEnumFilters
+ return false;
}
//
HRESULT CreateAP9(const CLSID& clsid, HWND hWnd, bool bFullscreen, ISubPicAllocatorPresenter** ppAP)
{
- CheckPointer(ppAP, E_POINTER);
+ CheckPointer(ppAP, E_POINTER);
- *ppAP = NULL;
+ *ppAP = NULL;
- using namespace DSObjects;
+ using namespace DSObjects;
- HRESULT hr = E_FAIL;
- CString Error;
+ HRESULT hr = E_FAIL;
+ CString Error;
- if ( IsEqualCLSID(clsid, CLSID_VMR9AllocatorPresenter) ) {
- *ppAP = DNew CVMR9AllocatorPresenter(hWnd, bFullscreen, hr, Error);
- }
- else if ( IsEqualCLSID(clsid, CLSID_RM9AllocatorPresenter) ) {
- *ppAP = DNew CRM9AllocatorPresenter(hWnd, bFullscreen, hr, Error);
- }
- else if ( IsEqualCLSID(clsid, CLSID_QT9AllocatorPresenter) ) {
- *ppAP = DNew CQT9AllocatorPresenter(hWnd, bFullscreen, hr, Error);
- }
- else if ( IsEqualCLSID(clsid, CLSID_DXRAllocatorPresenter) ) {
- *ppAP = DNew CDXRAllocatorPresenter(hWnd, hr, Error);
- }
- else if ( IsEqualCLSID(clsid, CLSID_madVRAllocatorPresenter) ) {
- *ppAP = DNew CmadVRAllocatorPresenter(hWnd, hr, Error);
- }
- else {
- return E_FAIL;
- }
+ if (IsEqualCLSID(clsid, CLSID_VMR9AllocatorPresenter)) {
+ *ppAP = DNew CVMR9AllocatorPresenter(hWnd, bFullscreen, hr, Error);
+ } else if (IsEqualCLSID(clsid, CLSID_RM9AllocatorPresenter)) {
+ *ppAP = DNew CRM9AllocatorPresenter(hWnd, bFullscreen, hr, Error);
+ } else if (IsEqualCLSID(clsid, CLSID_QT9AllocatorPresenter)) {
+ *ppAP = DNew CQT9AllocatorPresenter(hWnd, bFullscreen, hr, Error);
+ } else if (IsEqualCLSID(clsid, CLSID_DXRAllocatorPresenter)) {
+ *ppAP = DNew CDXRAllocatorPresenter(hWnd, hr, Error);
+ } else if (IsEqualCLSID(clsid, CLSID_madVRAllocatorPresenter)) {
+ *ppAP = DNew CmadVRAllocatorPresenter(hWnd, hr, Error);
+ } else {
+ return E_FAIL;
+ }
- if ( *ppAP == NULL ) {
- return E_OUTOFMEMORY;
- }
+ if (*ppAP == NULL) {
+ return E_OUTOFMEMORY;
+ }
- (*ppAP)->AddRef();
+ (*ppAP)->AddRef();
- if ( FAILED(hr) ) {
- Error += L"\n";
- Error += GetWindowsErrorMessage(hr, NULL);
+ if (FAILED(hr)) {
+ Error += L"\n";
+ Error += GetWindowsErrorMessage(hr, NULL);
- MessageBox(hWnd, Error, L"Error creating DX9 allocation presenter", MB_OK | MB_ICONERROR);
- (*ppAP)->Release();
- *ppAP = NULL;
- }
- else if ( !Error.IsEmpty() ) {
- MessageBox(hWnd, Error, L"Warning creating DX9 allocation presenter", MB_OK | MB_ICONWARNING);
- }
+ MessageBox(hWnd, Error, L"Error creating DX9 allocation presenter", MB_OK | MB_ICONERROR);
+ (*ppAP)->Release();
+ *ppAP = NULL;
+ } else if (!Error.IsEmpty()) {
+ MessageBox(hWnd, Error, L"Warning creating DX9 allocation presenter", MB_OK | MB_ICONWARNING);
+ }
- return hr;
+ return hr;
}
HRESULT CreateEVR(const CLSID& clsid, HWND hWnd, bool bFullscreen, ISubPicAllocatorPresenter** ppAP)
{
- HRESULT hr = E_FAIL;
- if (clsid == CLSID_EVRAllocatorPresenter) {
- CString Error;
- *ppAP = DNew DSObjects::CEVRAllocatorPresenter(hWnd, bFullscreen, hr, Error);
- (*ppAP)->AddRef();
+ HRESULT hr = E_FAIL;
+ if (clsid == CLSID_EVRAllocatorPresenter) {
+ CString Error;
+ *ppAP = DNew DSObjects::CEVRAllocatorPresenter(hWnd, bFullscreen, hr, Error);
+ (*ppAP)->AddRef();
- if (FAILED(hr)) {
- Error += L"\n";
- Error += GetWindowsErrorMessage(hr, NULL);
- MessageBox(hWnd, Error, L"Error creating EVR Custom renderer", MB_OK | MB_ICONERROR);
- (*ppAP)->Release();
- *ppAP = NULL;
- } else if (!Error.IsEmpty()) {
- MessageBox(hWnd, Error, L"Warning creating EVR Custom renderer", MB_OK|MB_ICONWARNING);
- }
- }
+ if (FAILED(hr)) {
+ Error += L"\n";
+ Error += GetWindowsErrorMessage(hr, NULL);
+ MessageBox(hWnd, Error, L"Error creating EVR Custom renderer", MB_OK | MB_ICONERROR);
+ (*ppAP)->Release();
+ *ppAP = NULL;
+ } else if (!Error.IsEmpty()) {
+ MessageBox(hWnd, Error, L"Warning creating EVR Custom renderer", MB_OK | MB_ICONWARNING);
+ }
+ }
- return hr;
+ return hr;
}
CString GetWindowsErrorMessage(HRESULT _Error, HMODULE _Module)
{
- switch (_Error) {
- case D3DERR_WRONGTEXTUREFORMAT :
- return _T("D3DERR_WRONGTEXTUREFORMAT");
- case D3DERR_UNSUPPORTEDCOLOROPERATION :
- return _T("D3DERR_UNSUPPORTEDCOLOROPERATION");
- case D3DERR_UNSUPPORTEDCOLORARG :
- return _T("D3DERR_UNSUPPORTEDCOLORARG");
- case D3DERR_UNSUPPORTEDALPHAOPERATION :
- return _T("D3DERR_UNSUPPORTEDALPHAOPERATION");
- case D3DERR_UNSUPPORTEDALPHAARG :
- return _T("D3DERR_UNSUPPORTEDALPHAARG");
- case D3DERR_TOOMANYOPERATIONS :
- return _T("D3DERR_TOOMANYOPERATIONS");
- case D3DERR_CONFLICTINGTEXTUREFILTER :
- return _T("D3DERR_CONFLICTINGTEXTUREFILTER");
- case D3DERR_UNSUPPORTEDFACTORVALUE :
- return _T("D3DERR_UNSUPPORTEDFACTORVALUE");
- case D3DERR_CONFLICTINGRENDERSTATE :
- return _T("D3DERR_CONFLICTINGRENDERSTATE");
- case D3DERR_UNSUPPORTEDTEXTUREFILTER :
- return _T("D3DERR_UNSUPPORTEDTEXTUREFILTER");
- case D3DERR_CONFLICTINGTEXTUREPALETTE :
- return _T("D3DERR_CONFLICTINGTEXTUREPALETTE");
- case D3DERR_DRIVERINTERNALERROR :
- return _T("D3DERR_DRIVERINTERNALERROR");
- case D3DERR_NOTFOUND :
- return _T("D3DERR_NOTFOUND");
- case D3DERR_MOREDATA :
- return _T("D3DERR_MOREDATA");
- case D3DERR_DEVICELOST :
- return _T("D3DERR_DEVICELOST");
- case D3DERR_DEVICENOTRESET :
- return _T("D3DERR_DEVICENOTRESET");
- case D3DERR_NOTAVAILABLE :
- return _T("D3DERR_NOTAVAILABLE");
- case D3DERR_OUTOFVIDEOMEMORY :
- return _T("D3DERR_OUTOFVIDEOMEMORY");
- case D3DERR_INVALIDDEVICE :
- return _T("D3DERR_INVALIDDEVICE");
- case D3DERR_INVALIDCALL :
- return _T("D3DERR_INVALIDCALL");
- case D3DERR_DRIVERINVALIDCALL :
- return _T("D3DERR_DRIVERINVALIDCALL");
- case D3DERR_WASSTILLDRAWING :
- return _T("D3DERR_WASSTILLDRAWING");
- case D3DOK_NOAUTOGEN :
- return _T("D3DOK_NOAUTOGEN");
- case D3DERR_DEVICEREMOVED :
- return _T("D3DERR_DEVICEREMOVED");
- case S_NOT_RESIDENT :
- return _T("S_NOT_RESIDENT");
- case S_RESIDENT_IN_SHARED_MEMORY :
- return _T("S_RESIDENT_IN_SHARED_MEMORY");
- case S_PRESENT_MODE_CHANGED :
- return _T("S_PRESENT_MODE_CHANGED");
- case S_PRESENT_OCCLUDED :
- return _T("S_PRESENT_OCCLUDED");
- case D3DERR_DEVICEHUNG :
- return _T("D3DERR_DEVICEHUNG");
- case E_UNEXPECTED :
- return _T("E_UNEXPECTED");
- }
+ switch (_Error) {
+ case D3DERR_WRONGTEXTUREFORMAT :
+ return _T("D3DERR_WRONGTEXTUREFORMAT");
+ case D3DERR_UNSUPPORTEDCOLOROPERATION :
+ return _T("D3DERR_UNSUPPORTEDCOLOROPERATION");
+ case D3DERR_UNSUPPORTEDCOLORARG :
+ return _T("D3DERR_UNSUPPORTEDCOLORARG");
+ case D3DERR_UNSUPPORTEDALPHAOPERATION :
+ return _T("D3DERR_UNSUPPORTEDALPHAOPERATION");
+ case D3DERR_UNSUPPORTEDALPHAARG :
+ return _T("D3DERR_UNSUPPORTEDALPHAARG");
+ case D3DERR_TOOMANYOPERATIONS :
+ return _T("D3DERR_TOOMANYOPERATIONS");
+ case D3DERR_CONFLICTINGTEXTUREFILTER :
+ return _T("D3DERR_CONFLICTINGTEXTUREFILTER");
+ case D3DERR_UNSUPPORTEDFACTORVALUE :
+ return _T("D3DERR_UNSUPPORTEDFACTORVALUE");
+ case D3DERR_CONFLICTINGRENDERSTATE :
+ return _T("D3DERR_CONFLICTINGRENDERSTATE");
+ case D3DERR_UNSUPPORTEDTEXTUREFILTER :
+ return _T("D3DERR_UNSUPPORTEDTEXTUREFILTER");
+ case D3DERR_CONFLICTINGTEXTUREPALETTE :
+ return _T("D3DERR_CONFLICTINGTEXTUREPALETTE");
+ case D3DERR_DRIVERINTERNALERROR :
+ return _T("D3DERR_DRIVERINTERNALERROR");
+ case D3DERR_NOTFOUND :
+ return _T("D3DERR_NOTFOUND");
+ case D3DERR_MOREDATA :
+ return _T("D3DERR_MOREDATA");
+ case D3DERR_DEVICELOST :
+ return _T("D3DERR_DEVICELOST");
+ case D3DERR_DEVICENOTRESET :
+ return _T("D3DERR_DEVICENOTRESET");
+ case D3DERR_NOTAVAILABLE :
+ return _T("D3DERR_NOTAVAILABLE");
+ case D3DERR_OUTOFVIDEOMEMORY :
+ return _T("D3DERR_OUTOFVIDEOMEMORY");
+ case D3DERR_INVALIDDEVICE :
+ return _T("D3DERR_INVALIDDEVICE");
+ case D3DERR_INVALIDCALL :
+ return _T("D3DERR_INVALIDCALL");
+ case D3DERR_DRIVERINVALIDCALL :
+ return _T("D3DERR_DRIVERINVALIDCALL");
+ case D3DERR_WASSTILLDRAWING :
+ return _T("D3DERR_WASSTILLDRAWING");
+ case D3DOK_NOAUTOGEN :
+ return _T("D3DOK_NOAUTOGEN");
+ case D3DERR_DEVICEREMOVED :
+ return _T("D3DERR_DEVICEREMOVED");
+ case S_NOT_RESIDENT :
+ return _T("S_NOT_RESIDENT");
+ case S_RESIDENT_IN_SHARED_MEMORY :
+ return _T("S_RESIDENT_IN_SHARED_MEMORY");
+ case S_PRESENT_MODE_CHANGED :
+ return _T("S_PRESENT_MODE_CHANGED");
+ case S_PRESENT_OCCLUDED :
+ return _T("S_PRESENT_OCCLUDED");
+ case D3DERR_DEVICEHUNG :
+ return _T("D3DERR_DEVICEHUNG");
+ case E_UNEXPECTED :
+ return _T("E_UNEXPECTED");
+ }
- CString errmsg;
- LPVOID lpMsgBuf;
- if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_HMODULE,
- _Module, _Error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL)) {
- errmsg = (LPCTSTR)lpMsgBuf;
- LocalFree(lpMsgBuf);
- }
- CString Temp;
- Temp.Format(L"0x%08x ", _Error);
- return Temp + errmsg;
+ CString errmsg;
+ LPVOID lpMsgBuf;
+ if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_HMODULE,
+ _Module, _Error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL)) {
+ errmsg = (LPCTSTR)lpMsgBuf;
+ LocalFree(lpMsgBuf);
+ }
+ CString Temp;
+ Temp.Format(L"0x%08x ", _Error);
+ return Temp + errmsg;
}
-const wchar_t *GetD3DFormatStr(D3DFORMAT Format)
+const wchar_t* GetD3DFormatStr(D3DFORMAT Format)
{
- switch (Format) {
- case D3DFMT_R8G8B8 :
- return L"R8G8B8";
- case D3DFMT_A8R8G8B8 :
- return L"A8R8G8B8";
- case D3DFMT_X8R8G8B8 :
- return L"X8R8G8B8";
- case D3DFMT_R5G6B5 :
- return L"R5G6B5";
- case D3DFMT_X1R5G5B5 :
- return L"X1R5G5B5";
- case D3DFMT_A1R5G5B5 :
- return L"A1R5G5B5";
- case D3DFMT_A4R4G4B4 :
- return L"A4R4G4B4";
- case D3DFMT_R3G3B2 :
- return L"R3G3B2";
- case D3DFMT_A8 :
- return L"A8";
- case D3DFMT_A8R3G3B2 :
- return L"A8R3G3B2";
- case D3DFMT_X4R4G4B4 :
- return L"X4R4G4B4";
- case D3DFMT_A2B10G10R10:
- return L"A2B10G10R10";
- case D3DFMT_A8B8G8R8 :
- return L"A8B8G8R8";
- case D3DFMT_X8B8G8R8 :
- return L"X8B8G8R8";
- case D3DFMT_G16R16 :
- return L"G16R16";
- case D3DFMT_A2R10G10B10:
- return L"A2R10G10B10";
- case D3DFMT_A16B16G16R16 :
- return L"A16B16G16R16";
- case D3DFMT_A8P8 :
- return L"A8P8";
- case D3DFMT_P8 :
- return L"P8";
- case D3DFMT_L8 :
- return L"L8";
- case D3DFMT_A8L8 :
- return L"A8L8";
- case D3DFMT_A4L4 :
- return L"A4L4";
- case D3DFMT_V8U8 :
- return L"V8U8";
- case D3DFMT_L6V5U5 :
- return L"L6V5U5";
- case D3DFMT_X8L8V8U8 :
- return L"X8L8V8U8";
- case D3DFMT_Q8W8V8U8 :
- return L"Q8W8V8U8";
- case D3DFMT_V16U16 :
- return L"V16U16";
- case D3DFMT_A2W10V10U10:
- return L"A2W10V10U10";
- case D3DFMT_UYVY :
- return L"UYVY";
- case D3DFMT_R8G8_B8G8:
- return L"R8G8_B8G8";
- case D3DFMT_YUY2 :
- return L"YUY2";
- case D3DFMT_G8R8_G8B8:
- return L"G8R8_G8B8";
- case D3DFMT_DXT1 :
- return L"DXT1";
- case D3DFMT_DXT2 :
- return L"DXT2";
- case D3DFMT_DXT3 :
- return L"DXT3";
- case D3DFMT_DXT4 :
- return L"DXT4";
- case D3DFMT_DXT5 :
- return L"DXT5";
- case D3DFMT_D16_LOCKABLE :
- return L"D16_LOCKABLE";
- case D3DFMT_D32:
- return L"D32";
- case D3DFMT_D15S1:
- return L"D15S1";
- case D3DFMT_D24S8:
- return L"D24S8";
- case D3DFMT_D24X8:
- return L"D24X8";
- case D3DFMT_D24X4S4:
- return L"D24X4S4";
- case D3DFMT_D16:
- return L"D16";
- case D3DFMT_D32F_LOCKABLE:
- return L"D32F_LOCKABLE";
- case D3DFMT_D24FS8 :
- return L"D24FS8";
- case D3DFMT_D32_LOCKABLE :
- return L"D32_LOCKABLE";
- case D3DFMT_S8_LOCKABLE:
- return L"S8_LOCKABLE";
- case D3DFMT_L16:
- return L"L16";
- case D3DFMT_VERTEXDATA :
- return L"VERTEXDATA";
- case D3DFMT_INDEX16:
- return L"INDEX16";
- case D3DFMT_INDEX32:
- return L"INDEX32";
- case D3DFMT_Q16W16V16U16 :
- return L"Q16W16V16U16";
- case D3DFMT_MULTI2_ARGB8 :
- return L"MULTI2_ARGB8";
- case D3DFMT_R16F :
- return L"R16F";
- case D3DFMT_G16R16F:
- return L"G16R16F";
- case D3DFMT_A16B16G16R16F:
- return L"A16B16G16R16F";
- case D3DFMT_R32F :
- return L"R32F";
- case D3DFMT_G32R32F:
- return L"G32R32F";
- case D3DFMT_A32B32G32R32F:
- return L"A32B32G32R32F";
- case D3DFMT_CxV8U8 :
- return L"CxV8U8";
- case D3DFMT_A1 :
- return L"A1";
- case D3DFMT_BINARYBUFFER :
- return L"BINARYBUFFER";
- }
- return L"Unknown";
+ switch (Format) {
+ case D3DFMT_R8G8B8 :
+ return L"R8G8B8";
+ case D3DFMT_A8R8G8B8 :
+ return L"A8R8G8B8";
+ case D3DFMT_X8R8G8B8 :
+ return L"X8R8G8B8";
+ case D3DFMT_R5G6B5 :
+ return L"R5G6B5";
+ case D3DFMT_X1R5G5B5 :
+ return L"X1R5G5B5";
+ case D3DFMT_A1R5G5B5 :
+ return L"A1R5G5B5";
+ case D3DFMT_A4R4G4B4 :
+ return L"A4R4G4B4";
+ case D3DFMT_R3G3B2 :
+ return L"R3G3B2";
+ case D3DFMT_A8 :
+ return L"A8";
+ case D3DFMT_A8R3G3B2 :
+ return L"A8R3G3B2";
+ case D3DFMT_X4R4G4B4 :
+ return L"X4R4G4B4";
+ case D3DFMT_A2B10G10R10:
+ return L"A2B10G10R10";
+ case D3DFMT_A8B8G8R8 :
+ return L"A8B8G8R8";
+ case D3DFMT_X8B8G8R8 :
+ return L"X8B8G8R8";
+ case D3DFMT_G16R16 :
+ return L"G16R16";
+ case D3DFMT_A2R10G10B10:
+ return L"A2R10G10B10";
+ case D3DFMT_A16B16G16R16 :
+ return L"A16B16G16R16";
+ case D3DFMT_A8P8 :
+ return L"A8P8";
+ case D3DFMT_P8 :
+ return L"P8";
+ case D3DFMT_L8 :
+ return L"L8";
+ case D3DFMT_A8L8 :
+ return L"A8L8";
+ case D3DFMT_A4L4 :
+ return L"A4L4";
+ case D3DFMT_V8U8 :
+ return L"V8U8";
+ case D3DFMT_L6V5U5 :
+ return L"L6V5U5";
+ case D3DFMT_X8L8V8U8 :
+ return L"X8L8V8U8";
+ case D3DFMT_Q8W8V8U8 :
+ return L"Q8W8V8U8";
+ case D3DFMT_V16U16 :
+ return L"V16U16";
+ case D3DFMT_A2W10V10U10:
+ return L"A2W10V10U10";
+ case D3DFMT_UYVY :
+ return L"UYVY";
+ case D3DFMT_R8G8_B8G8:
+ return L"R8G8_B8G8";
+ case D3DFMT_YUY2 :
+ return L"YUY2";
+ case D3DFMT_G8R8_G8B8:
+ return L"G8R8_G8B8";
+ case D3DFMT_DXT1 :
+ return L"DXT1";
+ case D3DFMT_DXT2 :
+ return L"DXT2";
+ case D3DFMT_DXT3 :
+ return L"DXT3";
+ case D3DFMT_DXT4 :
+ return L"DXT4";
+ case D3DFMT_DXT5 :
+ return L"DXT5";
+ case D3DFMT_D16_LOCKABLE :
+ return L"D16_LOCKABLE";
+ case D3DFMT_D32:
+ return L"D32";
+ case D3DFMT_D15S1:
+ return L"D15S1";
+ case D3DFMT_D24S8:
+ return L"D24S8";
+ case D3DFMT_D24X8:
+ return L"D24X8";
+ case D3DFMT_D24X4S4:
+ return L"D24X4S4";
+ case D3DFMT_D16:
+ return L"D16";
+ case D3DFMT_D32F_LOCKABLE:
+ return L"D32F_LOCKABLE";
+ case D3DFMT_D24FS8 :
+ return L"D24FS8";
+ case D3DFMT_D32_LOCKABLE :
+ return L"D32_LOCKABLE";
+ case D3DFMT_S8_LOCKABLE:
+ return L"S8_LOCKABLE";
+ case D3DFMT_L16:
+ return L"L16";
+ case D3DFMT_VERTEXDATA :
+ return L"VERTEXDATA";
+ case D3DFMT_INDEX16:
+ return L"INDEX16";
+ case D3DFMT_INDEX32:
+ return L"INDEX32";
+ case D3DFMT_Q16W16V16U16 :
+ return L"Q16W16V16U16";
+ case D3DFMT_MULTI2_ARGB8 :
+ return L"MULTI2_ARGB8";
+ case D3DFMT_R16F :
+ return L"R16F";
+ case D3DFMT_G16R16F:
+ return L"G16R16F";
+ case D3DFMT_A16B16G16R16F:
+ return L"A16B16G16R16F";
+ case D3DFMT_R32F :
+ return L"R32F";
+ case D3DFMT_G32R32F:
+ return L"G32R32F";
+ case D3DFMT_A32B32G32R32F:
+ return L"A32B32G32R32F";
+ case D3DFMT_CxV8U8 :
+ return L"CxV8U8";
+ case D3DFMT_A1 :
+ return L"A1";
+ case D3DFMT_BINARYBUFFER :
+ return L"BINARYBUFFER";
+ }
+ return L"Unknown";
}
diff --git a/src/filters/renderer/VideoRenderers/AllocatorCommon.h b/src/filters/renderer/VideoRenderers/AllocatorCommon.h
index 0257f7072..a93d0e8df 100644
--- a/src/filters/renderer/VideoRenderers/AllocatorCommon.h
+++ b/src/filters/renderer/VideoRenderers/AllocatorCommon.h
@@ -31,33 +31,33 @@
// {4E4834FA-22C2-40e2-9446-F77DD05D245E}
DEFINE_GUID(CLSID_VMR9AllocatorPresenter,
- 0x4e4834fa, 0x22c2, 0x40e2, 0x94, 0x46, 0xf7, 0x7d, 0xd0, 0x5d, 0x24, 0x5e);
+ 0x4e4834fa, 0x22c2, 0x40e2, 0x94, 0x46, 0xf7, 0x7d, 0xd0, 0x5d, 0x24, 0x5e);
// {A1542F93-EB53-4e11-8D34-05C57ABA9207}
DEFINE_GUID(CLSID_RM9AllocatorPresenter,
- 0xa1542f93, 0xeb53, 0x4e11, 0x8d, 0x34, 0x5, 0xc5, 0x7a, 0xba, 0x92, 0x7);
+ 0xa1542f93, 0xeb53, 0x4e11, 0x8d, 0x34, 0x5, 0xc5, 0x7a, 0xba, 0x92, 0x7);
// {622A4032-70CE-4040-8231-0F24F2886618}
DEFINE_GUID(CLSID_QT9AllocatorPresenter,
- 0x622a4032, 0x70ce, 0x4040, 0x82, 0x31, 0xf, 0x24, 0xf2, 0x88, 0x66, 0x18);
+ 0x622a4032, 0x70ce, 0x4040, 0x82, 0x31, 0xf, 0x24, 0xf2, 0x88, 0x66, 0x18);
// {B72EBDD4-831D-440f-A656-B48F5486CD82}
DEFINE_GUID(CLSID_DXRAllocatorPresenter,
- 0xb72ebdd4, 0x831d, 0x440f, 0xa6, 0x56, 0xb4, 0x8f, 0x54, 0x86, 0xcd, 0x82);
+ 0xb72ebdd4, 0x831d, 0x440f, 0xa6, 0x56, 0xb4, 0x8f, 0x54, 0x86, 0xcd, 0x82);
// {C7ED3100-9002-4595-9DCA-B30B30413429}
DEFINE_GUID(CLSID_madVRAllocatorPresenter,
- 0xc7ed3100, 0x9002, 0x4595, 0x9d, 0xca, 0xb3, 0xb, 0x30, 0x41, 0x34, 0x29);
+ 0xc7ed3100, 0x9002, 0x4595, 0x9d, 0xca, 0xb3, 0xb, 0x30, 0x41, 0x34, 0x29);
DEFINE_GUID(CLSID_EVRAllocatorPresenter,
- 0x7612b889, 0xe070, 0x4bcc, 0xb8, 0x8, 0x91, 0xcb, 0x79, 0x41, 0x74, 0xab);
+ 0x7612b889, 0xe070, 0x4bcc, 0xb8, 0x8, 0x91, 0xcb, 0x79, 0x41, 0x74, 0xab);
extern CCritSec g_ffdshowReceive;
extern bool queue_ffdshow_support;
extern bool IsVMR9InGraph(IFilterGraph* pFG);
extern CString GetWindowsErrorMessage(HRESULT _Error, HMODULE _Module);
-extern const wchar_t *GetD3DFormatStr(D3DFORMAT Format);
+extern const wchar_t* GetD3DFormatStr(D3DFORMAT Format);
extern HRESULT CreateAP9(const CLSID& clsid, HWND hWnd, bool bFullscreen, ISubPicAllocatorPresenter** ppAP);
extern HRESULT CreateEVR(const CLSID& clsid, HWND hWnd, bool bFullscreen, ISubPicAllocatorPresenter** ppAP);
@@ -66,11 +66,11 @@ extern HRESULT CreateEVR(const CLSID& clsid, HWND hWnd, bool bFullscreen, ISubPi
// This interface is used to check version of Media Player Classic.
// {A273C7F6-25D4-46b0-B2C8-4F7FADC44E37}
DEFINE_GUID(IID_IVMRffdshow9,
- 0xa273c7f6, 0x25d4, 0x46b0, 0xb2, 0xc8, 0x4f, 0x7f, 0xad, 0xc4, 0x4e, 0x37);
+ 0xa273c7f6, 0x25d4, 0x46b0, 0xb2, 0xc8, 0x4f, 0x7f, 0xad, 0xc4, 0x4e, 0x37);
MIDL_INTERFACE("A273C7F6-25D4-46b0-B2C8-4F7FADC44E37")
IVMRffdshow9 :
public IUnknown {
public:
- virtual STDMETHODIMP support_ffdshow(void) = 0;
+ virtual STDMETHODIMP support_ffdshow(void) = 0;
};
diff --git a/src/filters/renderer/VideoRenderers/AllocatorCommon7.cpp b/src/filters/renderer/VideoRenderers/AllocatorCommon7.cpp
index 2b54dc10f..6cb275993 100644
--- a/src/filters/renderer/VideoRenderers/AllocatorCommon7.cpp
+++ b/src/filters/renderer/VideoRenderers/AllocatorCommon7.cpp
@@ -34,12 +34,12 @@
bool IsVMR7InGraph(IFilterGraph* pFG)
{
- BeginEnumFilters(pFG, pEF, pBF)
- if (CComQIPtr<IVMRWindowlessControl>(pBF)) {
- return true;
- }
- EndEnumFilters
- return false;
+ BeginEnumFilters(pFG, pEF, pBF)
+ if (CComQIPtr<IVMRWindowlessControl>(pBF)) {
+ return true;
+ }
+ EndEnumFilters
+ return false;
}
using namespace DSObjects;
@@ -48,35 +48,32 @@ using namespace DSObjects;
HRESULT CreateAP7(const CLSID& clsid, HWND hWnd, ISubPicAllocatorPresenter** ppAP)
{
- CheckPointer(ppAP, E_POINTER);
+ CheckPointer(ppAP, E_POINTER);
- *ppAP = NULL;
+ *ppAP = NULL;
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- if ( IsEqualCLSID(clsid, CLSID_VMR7AllocatorPresenter) ) {
- *ppAP = DNew CVMR7AllocatorPresenter(hWnd, hr);
- }
- else if ( IsEqualCLSID(clsid, CLSID_RM7AllocatorPresenter) ) {
- *ppAP = DNew CRM7AllocatorPresenter(hWnd, hr);
- }
- else if ( IsEqualCLSID(clsid, CLSID_QT7AllocatorPresenter) ) {
- *ppAP = DNew CQT7AllocatorPresenter(hWnd, hr);
- }
- else {
- return E_FAIL;
- }
+ if (IsEqualCLSID(clsid, CLSID_VMR7AllocatorPresenter)) {
+ *ppAP = DNew CVMR7AllocatorPresenter(hWnd, hr);
+ } else if (IsEqualCLSID(clsid, CLSID_RM7AllocatorPresenter)) {
+ *ppAP = DNew CRM7AllocatorPresenter(hWnd, hr);
+ } else if (IsEqualCLSID(clsid, CLSID_QT7AllocatorPresenter)) {
+ *ppAP = DNew CQT7AllocatorPresenter(hWnd, hr);
+ } else {
+ return E_FAIL;
+ }
- if ( *ppAP == NULL ) {
- return E_OUTOFMEMORY;
- }
+ if (*ppAP == NULL) {
+ return E_OUTOFMEMORY;
+ }
- (*ppAP)->AddRef();
+ (*ppAP)->AddRef();
- if (FAILED(hr)) {
- (*ppAP)->Release();
- *ppAP = NULL;
- }
+ if (FAILED(hr)) {
+ (*ppAP)->Release();
+ *ppAP = NULL;
+ }
- return hr;
+ return hr;
}
diff --git a/src/filters/renderer/VideoRenderers/AllocatorCommon7.h b/src/filters/renderer/VideoRenderers/AllocatorCommon7.h
index 40c9d4ee6..f8528f6a5 100644
--- a/src/filters/renderer/VideoRenderers/AllocatorCommon7.h
+++ b/src/filters/renderer/VideoRenderers/AllocatorCommon7.h
@@ -28,15 +28,15 @@
// {495CF191-810D-44c7-92C5-E7D46AE00F44}
DEFINE_GUID(CLSID_VMR7AllocatorPresenter,
- 0x495cf191, 0x810d, 0x44c7, 0x92, 0xc5, 0xe7, 0xd4, 0x6a, 0xe0, 0xf, 0x44);
+ 0x495cf191, 0x810d, 0x44c7, 0x92, 0xc5, 0xe7, 0xd4, 0x6a, 0xe0, 0xf, 0x44);
// {97B3462E-1752-4dfb-A038-271060BC7A94}
DEFINE_GUID(CLSID_RM7AllocatorPresenter,
- 0x97b3462e, 0x1752, 0x4dfb, 0xa0, 0x38, 0x27, 0x10, 0x60, 0xbc, 0x7a, 0x94);
+ 0x97b3462e, 0x1752, 0x4dfb, 0xa0, 0x38, 0x27, 0x10, 0x60, 0xbc, 0x7a, 0x94);
// {36CC5A71-441C-462a-9D10-48A19485938D}
DEFINE_GUID(CLSID_QT7AllocatorPresenter,
- 0x36cc5a71, 0x441c, 0x462a, 0x9d, 0x10, 0x48, 0xa1, 0x94, 0x85, 0x93, 0x8d);
+ 0x36cc5a71, 0x441c, 0x462a, 0x9d, 0x10, 0x48, 0xa1, 0x94, 0x85, 0x93, 0x8d);
extern HRESULT CreateAP7(const CLSID& clsid, HWND hWnd, ISubPicAllocatorPresenter** ppAP);
diff --git a/src/filters/renderer/VideoRenderers/D3DFont.cpp b/src/filters/renderer/VideoRenderers/D3DFont.cpp
index c4410557b..5e261d684 100644
--- a/src/filters/renderer/VideoRenderers/D3DFont.cpp
+++ b/src/filters/renderer/VideoRenderers/D3DFont.cpp
@@ -34,40 +34,40 @@
#define MAX_NUM_VERTICES 50*6
struct FONT2DVERTEX {
- D3DXVECTOR4 p;
- DWORD color;
- FLOAT tu, tv;
+ D3DXVECTOR4 p;
+ DWORD color;
+ FLOAT tu, tv;
};
struct FONT3DVERTEX {
- D3DXVECTOR3 p;
- D3DXVECTOR3 n;
- FLOAT tu, tv;
+ D3DXVECTOR3 p;
+ D3DXVECTOR3 n;
+ FLOAT tu, tv;
};
#define D3DFVF_FONT2DVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1)
#define D3DFVF_FONT3DVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)
-inline FONT2DVERTEX InitFont2DVertex( const D3DXVECTOR4& p, D3DCOLOR color,
- FLOAT tu, FLOAT tv )
+inline FONT2DVERTEX InitFont2DVertex(const D3DXVECTOR4& p, D3DCOLOR color,
+ FLOAT tu, FLOAT tv)
{
- FONT2DVERTEX v;
- v.p = p;
- v.color = color;
- v.tu = tu;
- v.tv = tv;
- return v;
+ FONT2DVERTEX v;
+ v.p = p;
+ v.color = color;
+ v.tu = tu;
+ v.tv = tv;
+ return v;
}
-inline FONT3DVERTEX InitFont3DVertex( const D3DXVECTOR3& p, const D3DXVECTOR3& n,
- FLOAT tu, FLOAT tv )
+inline FONT3DVERTEX InitFont3DVertex(const D3DXVECTOR3& p, const D3DXVECTOR3& n,
+ FLOAT tu, FLOAT tv)
{
- FONT3DVERTEX v;
- v.p = p;
- v.n = n;
- v.tu = tu;
- v.tv = tv;
- return v;
+ FONT3DVERTEX v;
+ v.p = p;
+ v.n = n;
+ v.tu = tu;
+ v.tv = tv;
+ return v;
}
@@ -76,20 +76,20 @@ inline FONT3DVERTEX InitFont3DVertex( const D3DXVECTOR3& p, const D3DXVECTOR3& n
// Name: CD3DFont()
// Desc: Font class constructor
//-----------------------------------------------------------------------------
-CD3DFont::CD3DFont( const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags )
+CD3DFont::CD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags)
{
- _tcsncpy_s( m_strFontName, strFontName, _countof(m_strFontName) );
- m_strFontName[_countof(m_strFontName) - 1] = _T('\0');
- m_dwFontHeight = dwHeight;
- m_dwFontFlags = dwFlags;
- m_dwSpacing = 0;
-
- m_pd3dDevice = NULL;
- m_pTexture = NULL;
- m_pVB = NULL;
-
- m_pStateBlockSaved = NULL;
- m_pStateBlockDrawText = NULL;
+ _tcsncpy_s(m_strFontName, strFontName, _countof(m_strFontName));
+ m_strFontName[_countof(m_strFontName) - 1] = _T('\0');
+ m_dwFontHeight = dwHeight;
+ m_dwFontFlags = dwFlags;
+ m_dwSpacing = 0;
+
+ m_pd3dDevice = NULL;
+ m_pTexture = NULL;
+ m_pVB = NULL;
+
+ m_pStateBlockSaved = NULL;
+ m_pStateBlockDrawText = NULL;
}
@@ -100,8 +100,8 @@ CD3DFont::CD3DFont( const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags )
//-----------------------------------------------------------------------------
CD3DFont::~CD3DFont()
{
- InvalidateDeviceObjects();
- DeleteDeviceObjects();
+ InvalidateDeviceObjects();
+ DeleteDeviceObjects();
}
@@ -111,25 +111,25 @@ CD3DFont::~CD3DFont()
// Desc: Create a font based on the current state of related member variables
// and return the handle (or null on error)
//-----------------------------------------------------------------------------
-HRESULT CD3DFont::CreateGDIFont( HDC hDC, HFONT* pFont )
+HRESULT CD3DFont::CreateGDIFont(HDC hDC, HFONT* pFont)
{
- // Create a font. By specifying ANTIALIASED_QUALITY, we might get an
- // antialiased font, but this is not guaranteed.
- INT nHeight = -MulDiv( m_dwFontHeight,
- (INT)(GetDeviceCaps(hDC, LOGPIXELSY) * m_fTextScale),
- 72 );
- DWORD dwBold = (m_dwFontFlags & D3DFONT_BOLD) ? FW_BOLD : FW_NORMAL;
- DWORD dwItalic = (m_dwFontFlags & D3DFONT_ITALIC) ? TRUE : FALSE;
- *pFont = CreateFont( nHeight, 0, 0, 0, dwBold, dwItalic,
- FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
- CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
- VARIABLE_PITCH, m_strFontName );
-
- if ( *pFont == NULL ) {
- return E_FAIL;
- }
-
- return S_OK;
+ // Create a font. By specifying ANTIALIASED_QUALITY, we might get an
+ // antialiased font, but this is not guaranteed.
+ INT nHeight = -MulDiv(m_dwFontHeight,
+ (INT)(GetDeviceCaps(hDC, LOGPIXELSY) * m_fTextScale),
+ 72);
+ DWORD dwBold = (m_dwFontFlags & D3DFONT_BOLD) ? FW_BOLD : FW_NORMAL;
+ DWORD dwItalic = (m_dwFontFlags & D3DFONT_ITALIC) ? TRUE : FALSE;
+ *pFont = CreateFont(nHeight, 0, 0, 0, dwBold, dwItalic,
+ FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
+ CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
+ VARIABLE_PITCH, m_strFontName);
+
+ if (*pFont == NULL) {
+ return E_FAIL;
+ }
+
+ return S_OK;
}
@@ -140,54 +140,54 @@ HRESULT CD3DFont::CreateGDIFont( HDC hDC, HFONT* pFont )
// provided device context. If the bMeasureOnly flag is set, no drawing
// will occur.
//-----------------------------------------------------------------------------
-HRESULT CD3DFont::PaintAlphabet( HDC hDC, BOOL bMeasureOnly )
+HRESULT CD3DFont::PaintAlphabet(HDC hDC, BOOL bMeasureOnly)
{
- SIZE size;
- TCHAR str[2] = _T("x"); // One-character, null-terminated string
-
- // Calculate the spacing between characters based on line height
- if ( 0 == GetTextExtentPoint32( hDC, str, 1, &size ) ) {
- return E_FAIL;
- }
- m_dwSpacing = (DWORD) ceil(size.cy * 0.3f);
-
- // Set the starting point for the drawing
- DWORD x = m_dwSpacing;
- DWORD y = 0;
-
- // For each character, draw text on the DC and advance the current position
- for ( char c = 32; c < 127; c++ ) {
- str[0] = c;
- if ( 0 == GetTextExtentPoint32( hDC, str, 1, &size ) ) {
- return E_FAIL;
- }
-
- if ( (DWORD)(x + size.cx + m_dwSpacing) > m_dwTexWidth ) {
- x = m_dwSpacing;
- y += size.cy + 1;
- }
-
- // Check to see if there's room to write the character here
- if ( y + size.cy > m_dwTexHeight ) {
- return D3DERR_MOREDATA;
- }
-
- if ( !bMeasureOnly ) {
- // Perform the actual drawing
- if ( 0 == ExtTextOut( hDC, x+0, y+0, ETO_OPAQUE, NULL, str, 1, NULL ) ) {
- return E_FAIL;
- }
-
- m_fTexCoords[c-32][0] = ((FLOAT)(x + 0 - m_dwSpacing))/m_dwTexWidth;
- m_fTexCoords[c-32][1] = ((FLOAT)(y + 0 + 0 ))/m_dwTexHeight;
- m_fTexCoords[c-32][2] = ((FLOAT)(x + size.cx + m_dwSpacing))/m_dwTexWidth;
- m_fTexCoords[c-32][3] = ((FLOAT)(y + size.cy + 0 ))/m_dwTexHeight;
- }
-
- x += size.cx + (2 * m_dwSpacing);
- }
-
- return S_OK;
+ SIZE size;
+ TCHAR str[2] = _T("x"); // One-character, null-terminated string
+
+ // Calculate the spacing between characters based on line height
+ if (0 == GetTextExtentPoint32(hDC, str, 1, &size)) {
+ return E_FAIL;
+ }
+ m_dwSpacing = (DWORD) ceil(size.cy * 0.3f);
+
+ // Set the starting point for the drawing
+ DWORD x = m_dwSpacing;
+ DWORD y = 0;
+
+ // For each character, draw text on the DC and advance the current position
+ for (char c = 32; c < 127; c++) {
+ str[0] = c;
+ if (0 == GetTextExtentPoint32(hDC, str, 1, &size)) {
+ return E_FAIL;
+ }
+
+ if ((DWORD)(x + size.cx + m_dwSpacing) > m_dwTexWidth) {
+ x = m_dwSpacing;
+ y += size.cy + 1;
+ }
+
+ // Check to see if there's room to write the character here
+ if (y + size.cy > m_dwTexHeight) {
+ return D3DERR_MOREDATA;
+ }
+
+ if (!bMeasureOnly) {
+ // Perform the actual drawing
+ if (0 == ExtTextOut(hDC, x + 0, y + 0, ETO_OPAQUE, NULL, str, 1, NULL)) {
+ return E_FAIL;
+ }
+
+ m_fTexCoords[c - 32][0] = ((FLOAT)(x + 0 - m_dwSpacing)) / m_dwTexWidth;
+ m_fTexCoords[c - 32][1] = ((FLOAT)(y + 0 + 0)) / m_dwTexHeight;
+ m_fTexCoords[c - 32][2] = ((FLOAT)(x + size.cx + m_dwSpacing)) / m_dwTexWidth;
+ m_fTexCoords[c - 32][3] = ((FLOAT)(y + size.cy + 0)) / m_dwTexHeight;
+ }
+
+ x += size.cx + (2 * m_dwSpacing);
+ }
+
+ return S_OK;
}
@@ -197,151 +197,151 @@ HRESULT CD3DFont::PaintAlphabet( HDC hDC, BOOL bMeasureOnly )
// Desc: Initializes device-dependent objects, including the vertex buffer used
// for rendering text and the texture map which stores the font image.
//-----------------------------------------------------------------------------
-HRESULT CD3DFont::InitDeviceObjects( LPDIRECT3DDEVICE9 pd3dDevice )
+HRESULT CD3DFont::InitDeviceObjects(LPDIRECT3DDEVICE9 pd3dDevice)
{
- HRESULT hr = S_OK;
- HFONT hFont = NULL;
- HFONT hFontOld = NULL;
- HDC hDC = NULL;
- HBITMAP hbmBitmap = NULL;
- HGDIOBJ hbmOld = NULL;
-
- // Keep a local copy of the device
- m_pd3dDevice = pd3dDevice;
-
- // Assume we will draw fonts into texture without scaling unless the
- // required texture size is found to be larger than the device max
- m_fTextScale = 1.0f;
-
- hDC = CreateCompatibleDC( NULL );
- SetMapMode( hDC, MM_TEXT );
-
- hr = CreateGDIFont( hDC, &hFont );
- if ( FAILED(hr) ) {
- goto LCleanReturn;
- }
-
- hFontOld = (HFONT) SelectObject( hDC, hFont );
-
- // Calculate the dimensions for the smallest power-of-two texture which
- // can hold all the printable characters
- m_dwTexWidth = m_dwTexHeight = 128;
- while ( D3DERR_MOREDATA == ( hr = PaintAlphabet( hDC, true ) ) ) {
- m_dwTexWidth *= 2;
- m_dwTexHeight *= 2;
- }
-
- if ( FAILED(hr) ) {
- goto LCleanReturn;
- }
-
- // If requested texture is too big, use a smaller texture and smaller font,
- // and scale up when rendering.
- D3DCAPS9 d3dCaps;
- m_pd3dDevice->GetDeviceCaps( &d3dCaps );
-
- if ( m_dwTexWidth > d3dCaps.MaxTextureWidth ) {
- m_fTextScale = (FLOAT)d3dCaps.MaxTextureWidth / (FLOAT)m_dwTexWidth;
- m_dwTexWidth = m_dwTexHeight = d3dCaps.MaxTextureWidth;
-
- bool bFirstRun = true; // Flag clear after first run
-
- do {
- // If we've already tried fitting the new text, the scale is still
- // too large. Reduce and try again.
- if ( !bFirstRun) {
- m_fTextScale *= 0.9f;
- }
-
- // The font has to be scaled to fit on the maximum texture size; our
- // current font is too big and needs to be recreated to scale.
- DeleteObject( SelectObject( hDC, hFontOld ) );
-
- hr = CreateGDIFont( hDC, &hFont );
- if ( FAILED(hr) ) {
- goto LCleanReturn;
- }
-
- hFontOld = (HFONT) SelectObject( hDC, hFont );
-
- bFirstRun = false;
- } while ( D3DERR_MOREDATA == ( hr = PaintAlphabet( hDC, true ) ) );
- }
-
-
- // Create a new texture for the font
- hr = m_pd3dDevice->CreateTexture( m_dwTexWidth, m_dwTexHeight, 1,
- 0, D3DFMT_A4R4G4B4,
- D3DPOOL_MANAGED, &m_pTexture, NULL );
- if ( FAILED(hr) ) {
- goto LCleanReturn;
- }
-
- // Prepare to create a bitmap
- DWORD* pBitmapBits;
- BITMAPINFO bmi;
- ZeroMemory( &bmi.bmiHeader, sizeof(BITMAPINFOHEADER) );
- bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi.bmiHeader.biWidth = (int)m_dwTexWidth;
- bmi.bmiHeader.biHeight = -(int)m_dwTexHeight;
- bmi.bmiHeader.biPlanes = 1;
- bmi.bmiHeader.biCompression = BI_RGB;
- bmi.bmiHeader.biBitCount = 32;
-
- // Create a bitmap for the font
- hbmBitmap = CreateDIBSection( hDC, &bmi, DIB_RGB_COLORS,
- (void**)&pBitmapBits, NULL, 0 );
-
- hbmOld = SelectObject( hDC, hbmBitmap );
-
- // Set text properties
- SetTextColor( hDC, RGB(255,255,255) );
- SetBkColor( hDC, 0x00000000 );
- SetTextAlign( hDC, TA_TOP );
-
- // Paint the alphabet onto the selected bitmap
- hr = PaintAlphabet( hDC, false );
- if ( FAILED(hr) ) {
- goto LCleanReturn;
- }
-
- // Lock the surface and write the alpha values for the set pixels
- D3DLOCKED_RECT d3dlr;
- m_pTexture->LockRect( 0, &d3dlr, 0, 0 );
- BYTE* pDstRow;
- pDstRow = (BYTE*)d3dlr.pBits;
- WORD* pDst16;
- BYTE bAlpha; // 4-bit measure of pixel intensity
- DWORD x, y;
-
- for ( y=0; y < m_dwTexHeight; y++ ) {
- pDst16 = (WORD*)pDstRow;
- for ( x=0; x < m_dwTexWidth; x++ ) {
- bAlpha = (BYTE)((pBitmapBits[m_dwTexWidth*y + x] & 0xff) >> 4);
- if (bAlpha > 0) {
- *pDst16++ = (WORD) ((bAlpha << 12) | 0x0fff);
- } else {
- *pDst16++ = 0x0000;
- }
- }
- pDstRow += d3dlr.Pitch;
- }
-
- hr = S_OK;
-
- // Done updating texture, so clean up used objects
+ HRESULT hr = S_OK;
+ HFONT hFont = NULL;
+ HFONT hFontOld = NULL;
+ HDC hDC = NULL;
+ HBITMAP hbmBitmap = NULL;
+ HGDIOBJ hbmOld = NULL;
+
+ // Keep a local copy of the device
+ m_pd3dDevice = pd3dDevice;
+
+ // Assume we will draw fonts into texture without scaling unless the
+ // required texture size is found to be larger than the device max
+ m_fTextScale = 1.0f;
+
+ hDC = CreateCompatibleDC(NULL);
+ SetMapMode(hDC, MM_TEXT);
+
+ hr = CreateGDIFont(hDC, &hFont);
+ if (FAILED(hr)) {
+ goto LCleanReturn;
+ }
+
+ hFontOld = (HFONT) SelectObject(hDC, hFont);
+
+ // Calculate the dimensions for the smallest power-of-two texture which
+ // can hold all the printable characters
+ m_dwTexWidth = m_dwTexHeight = 128;
+ while (D3DERR_MOREDATA == (hr = PaintAlphabet(hDC, true))) {
+ m_dwTexWidth *= 2;
+ m_dwTexHeight *= 2;
+ }
+
+ if (FAILED(hr)) {
+ goto LCleanReturn;
+ }
+
+ // If requested texture is too big, use a smaller texture and smaller font,
+ // and scale up when rendering.
+ D3DCAPS9 d3dCaps;
+ m_pd3dDevice->GetDeviceCaps(&d3dCaps);
+
+ if (m_dwTexWidth > d3dCaps.MaxTextureWidth) {
+ m_fTextScale = (FLOAT)d3dCaps.MaxTextureWidth / (FLOAT)m_dwTexWidth;
+ m_dwTexWidth = m_dwTexHeight = d3dCaps.MaxTextureWidth;
+
+ bool bFirstRun = true; // Flag clear after first run
+
+ do {
+ // If we've already tried fitting the new text, the scale is still
+ // too large. Reduce and try again.
+ if (!bFirstRun) {
+ m_fTextScale *= 0.9f;
+ }
+
+ // The font has to be scaled to fit on the maximum texture size; our
+ // current font is too big and needs to be recreated to scale.
+ DeleteObject(SelectObject(hDC, hFontOld));
+
+ hr = CreateGDIFont(hDC, &hFont);
+ if (FAILED(hr)) {
+ goto LCleanReturn;
+ }
+
+ hFontOld = (HFONT) SelectObject(hDC, hFont);
+
+ bFirstRun = false;
+ } while (D3DERR_MOREDATA == (hr = PaintAlphabet(hDC, true)));
+ }
+
+
+ // Create a new texture for the font
+ hr = m_pd3dDevice->CreateTexture(m_dwTexWidth, m_dwTexHeight, 1,
+ 0, D3DFMT_A4R4G4B4,
+ D3DPOOL_MANAGED, &m_pTexture, NULL);
+ if (FAILED(hr)) {
+ goto LCleanReturn;
+ }
+
+ // Prepare to create a bitmap
+ DWORD* pBitmapBits;
+ BITMAPINFO bmi;
+ ZeroMemory(&bmi.bmiHeader, sizeof(BITMAPINFOHEADER));
+ bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ bmi.bmiHeader.biWidth = (int)m_dwTexWidth;
+ bmi.bmiHeader.biHeight = -(int)m_dwTexHeight;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biCompression = BI_RGB;
+ bmi.bmiHeader.biBitCount = 32;
+
+ // Create a bitmap for the font
+ hbmBitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS,
+ (void**)&pBitmapBits, NULL, 0);
+
+ hbmOld = SelectObject(hDC, hbmBitmap);
+
+ // Set text properties
+ SetTextColor(hDC, RGB(255, 255, 255));
+ SetBkColor(hDC, 0x00000000);
+ SetTextAlign(hDC, TA_TOP);
+
+ // Paint the alphabet onto the selected bitmap
+ hr = PaintAlphabet(hDC, false);
+ if (FAILED(hr)) {
+ goto LCleanReturn;
+ }
+
+ // Lock the surface and write the alpha values for the set pixels
+ D3DLOCKED_RECT d3dlr;
+ m_pTexture->LockRect(0, &d3dlr, 0, 0);
+ BYTE* pDstRow;
+ pDstRow = (BYTE*)d3dlr.pBits;
+ WORD* pDst16;
+ BYTE bAlpha; // 4-bit measure of pixel intensity
+ DWORD x, y;
+
+ for (y = 0; y < m_dwTexHeight; y++) {
+ pDst16 = (WORD*)pDstRow;
+ for (x = 0; x < m_dwTexWidth; x++) {
+ bAlpha = (BYTE)((pBitmapBits[m_dwTexWidth * y + x] & 0xff) >> 4);
+ if (bAlpha > 0) {
+ *pDst16++ = (WORD)((bAlpha << 12) | 0x0fff);
+ } else {
+ *pDst16++ = 0x0000;
+ }
+ }
+ pDstRow += d3dlr.Pitch;
+ }
+
+ hr = S_OK;
+
+ // Done updating texture, so clean up used objects
LCleanReturn:
- if ( m_pTexture ) {
- m_pTexture->UnlockRect(0);
- }
+ if (m_pTexture) {
+ m_pTexture->UnlockRect(0);
+ }
- SelectObject( hDC, hbmOld );
- SelectObject( hDC, hFontOld );
- DeleteObject( hbmBitmap );
- DeleteObject( hFont );
- DeleteDC( hDC );
+ SelectObject(hDC, hbmOld);
+ SelectObject(hDC, hFontOld);
+ DeleteObject(hbmBitmap);
+ DeleteObject(hFont);
+ DeleteDC(hDC);
- return hr;
+ return hr;
}
@@ -352,91 +352,91 @@ LCleanReturn:
//-----------------------------------------------------------------------------
HRESULT CD3DFont::RestoreDeviceObjects()
{
- HRESULT hr;
-
- // Create vertex buffer for the letters
- int vertexSize = max( sizeof(FONT2DVERTEX), sizeof(FONT3DVERTEX ) );
- if ( FAILED( hr = m_pd3dDevice->CreateVertexBuffer( MAX_NUM_VERTICES * vertexSize,
- D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, 0,
- D3DPOOL_DEFAULT, &m_pVB, NULL ) ) ) {
- return hr;
- }
-
- bool bSupportsAlphaBlend = true;
- LPDIRECT3D9 pd3d9 = NULL;
- if ( SUCCEEDED( m_pd3dDevice->GetDirect3D( &pd3d9 ) ) ) {
- D3DCAPS9 Caps;
- D3DDISPLAYMODE Mode;
- LPDIRECT3DSURFACE9 pSurf = NULL;
- D3DSURFACE_DESC Desc;
- m_pd3dDevice->GetDeviceCaps( &Caps );
- m_pd3dDevice->GetDisplayMode( 0, &Mode );
- if ( SUCCEEDED( m_pd3dDevice->GetRenderTarget( 0, &pSurf ) ) ) {
- pSurf->GetDesc( &Desc );
- if ( FAILED( pd3d9->CheckDeviceFormat( Caps.AdapterOrdinal, Caps.DeviceType, Mode.Format,
- D3DUSAGE_RENDERTARGET | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3DRTYPE_SURFACE,
- Desc.Format ) ) ) {
- bSupportsAlphaBlend = false;
- }
- SAFE_RELEASE( pSurf );
- }
- SAFE_RELEASE( pd3d9 );
- }
-
- // Create the state blocks for rendering text
- for ( UINT which=0; which<2; which++ ) {
- m_pd3dDevice->BeginStateBlock();
- m_pd3dDevice->SetTexture( 0, m_pTexture );
-
- if ( D3DFONT_ZENABLE & m_dwFontFlags ) {
- m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
- } else {
- m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
- }
-
- if ( bSupportsAlphaBlend ) {
- m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
- m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
- m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
- } else {
- m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
- }
- m_pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
- m_pd3dDevice->SetRenderState( D3DRS_ALPHAREF, 0x08 );
- m_pd3dDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
- m_pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
- m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
- m_pd3dDevice->SetRenderState( D3DRS_STENCILENABLE, FALSE );
- m_pd3dDevice->SetRenderState( D3DRS_CLIPPING, TRUE );
- m_pd3dDevice->SetRenderState( D3DRS_CLIPPLANEENABLE, FALSE );
- m_pd3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_DISABLE );
- m_pd3dDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE );
- m_pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
- m_pd3dDevice->SetRenderState( D3DRS_COLORWRITEENABLE,
- D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN |
- D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA );
- m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
- m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
- m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
- m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
- m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
- m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
- m_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
- m_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
- m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
- m_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
- m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT );
- m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT );
- m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
-
- if ( which==0 ) {
- m_pd3dDevice->EndStateBlock( &m_pStateBlockSaved );
- } else {
- m_pd3dDevice->EndStateBlock( &m_pStateBlockDrawText );
- }
- }
-
- return S_OK;
+ HRESULT hr;
+
+ // Create vertex buffer for the letters
+ int vertexSize = max(sizeof(FONT2DVERTEX), sizeof(FONT3DVERTEX));
+ if (FAILED(hr = m_pd3dDevice->CreateVertexBuffer(MAX_NUM_VERTICES * vertexSize,
+ D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, 0,
+ D3DPOOL_DEFAULT, &m_pVB, NULL))) {
+ return hr;
+ }
+
+ bool bSupportsAlphaBlend = true;
+ LPDIRECT3D9 pd3d9 = NULL;
+ if (SUCCEEDED(m_pd3dDevice->GetDirect3D(&pd3d9))) {
+ D3DCAPS9 Caps;
+ D3DDISPLAYMODE Mode;
+ LPDIRECT3DSURFACE9 pSurf = NULL;
+ D3DSURFACE_DESC Desc;
+ m_pd3dDevice->GetDeviceCaps(&Caps);
+ m_pd3dDevice->GetDisplayMode(0, &Mode);
+ if (SUCCEEDED(m_pd3dDevice->GetRenderTarget(0, &pSurf))) {
+ pSurf->GetDesc(&Desc);
+ if (FAILED(pd3d9->CheckDeviceFormat(Caps.AdapterOrdinal, Caps.DeviceType, Mode.Format,
+ D3DUSAGE_RENDERTARGET | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3DRTYPE_SURFACE,
+ Desc.Format))) {
+ bSupportsAlphaBlend = false;
+ }
+ SAFE_RELEASE(pSurf);
+ }
+ SAFE_RELEASE(pd3d9);
+ }
+
+ // Create the state blocks for rendering text
+ for (UINT which = 0; which < 2; which++) {
+ m_pd3dDevice->BeginStateBlock();
+ m_pd3dDevice->SetTexture(0, m_pTexture);
+
+ if (D3DFONT_ZENABLE & m_dwFontFlags) {
+ m_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
+ } else {
+ m_pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
+ }
+
+ if (bSupportsAlphaBlend) {
+ m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
+ m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
+ m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
+ } else {
+ m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
+ }
+ m_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
+ m_pd3dDevice->SetRenderState(D3DRS_ALPHAREF, 0x08);
+ m_pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
+ m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
+ m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
+ m_pd3dDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE);
+ m_pd3dDevice->SetRenderState(D3DRS_CLIPPING, TRUE);
+ m_pd3dDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, FALSE);
+ m_pd3dDevice->SetRenderState(D3DRS_VERTEXBLEND, D3DVBF_DISABLE);
+ m_pd3dDevice->SetRenderState(D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE);
+ m_pd3dDevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
+ m_pd3dDevice->SetRenderState(D3DRS_COLORWRITEENABLE,
+ D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN |
+ D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA);
+ m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
+ m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
+ m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
+ m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
+ m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
+ m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
+ m_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
+ m_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
+ m_pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
+ m_pd3dDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
+ m_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
+ m_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
+ m_pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
+
+ if (which == 0) {
+ m_pd3dDevice->EndStateBlock(&m_pStateBlockSaved);
+ } else {
+ m_pd3dDevice->EndStateBlock(&m_pStateBlockDrawText);
+ }
+ }
+
+ return S_OK;
}
@@ -447,11 +447,11 @@ HRESULT CD3DFont::RestoreDeviceObjects()
//-----------------------------------------------------------------------------
HRESULT CD3DFont::InvalidateDeviceObjects()
{
- SAFE_RELEASE( m_pVB );
- SAFE_RELEASE( m_pStateBlockSaved );
- SAFE_RELEASE( m_pStateBlockDrawText );
+ SAFE_RELEASE(m_pVB);
+ SAFE_RELEASE(m_pStateBlockSaved);
+ SAFE_RELEASE(m_pStateBlockDrawText);
- return S_OK;
+ return S_OK;
}
@@ -462,10 +462,10 @@ HRESULT CD3DFont::InvalidateDeviceObjects()
//-----------------------------------------------------------------------------
HRESULT CD3DFont::DeleteDeviceObjects()
{
- SAFE_RELEASE( m_pTexture );
- m_pd3dDevice = NULL;
+ SAFE_RELEASE(m_pTexture);
+ m_pd3dDevice = NULL;
- return S_OK;
+ return S_OK;
}
@@ -474,43 +474,43 @@ HRESULT CD3DFont::DeleteDeviceObjects()
// Name: GetTextExtent()
// Desc: Get the dimensions of a text string
//-----------------------------------------------------------------------------
-HRESULT CD3DFont::GetTextExtent( const TCHAR* strText, SIZE* pSize )
+HRESULT CD3DFont::GetTextExtent(const TCHAR* strText, SIZE* pSize)
{
- if ( NULL==strText || NULL==pSize ) {
- return E_FAIL;
- }
+ if (NULL == strText || NULL == pSize) {
+ return E_FAIL;
+ }
- FLOAT fRowWidth = 0.0f;
- FLOAT fRowHeight = (m_fTexCoords[0][3]-m_fTexCoords[0][1])*m_dwTexHeight;
- FLOAT fWidth = 0.0f;
- FLOAT fHeight = fRowHeight;
+ FLOAT fRowWidth = 0.0f;
+ FLOAT fRowHeight = (m_fTexCoords[0][3] - m_fTexCoords[0][1]) * m_dwTexHeight;
+ FLOAT fWidth = 0.0f;
+ FLOAT fHeight = fRowHeight;
- while ( *strText ) {
- TCHAR c = *strText++;
+ while (*strText) {
+ TCHAR c = *strText++;
- if ( c == _T('\n') ) {
- fRowWidth = 0.0f;
- fHeight += fRowHeight;
- }
+ if (c == _T('\n')) {
+ fRowWidth = 0.0f;
+ fHeight += fRowHeight;
+ }
- if ( (c-32) < 0 || (c-32) >= 128-32 ) {
- continue;
- }
+ if ((c - 32) < 0 || (c - 32) >= 128 - 32) {
+ continue;
+ }
- FLOAT tx1 = m_fTexCoords[c-32][0];
- FLOAT tx2 = m_fTexCoords[c-32][2];
+ FLOAT tx1 = m_fTexCoords[c - 32][0];
+ FLOAT tx2 = m_fTexCoords[c - 32][2];
- fRowWidth += (tx2-tx1)*m_dwTexWidth - 2*m_dwSpacing;
+ fRowWidth += (tx2 - tx1) * m_dwTexWidth - 2 * m_dwSpacing;
- if ( fRowWidth > fWidth ) {
- fWidth = fRowWidth;
- }
- }
+ if (fRowWidth > fWidth) {
+ fWidth = fRowWidth;
+ }
+ }
- pSize->cx = (int)fWidth;
- pSize->cy = (int)fHeight;
+ pSize->cx = (int)fWidth;
+ pSize->cy = (int)fHeight;
- return S_OK;
+ return S_OK;
}
@@ -523,130 +523,130 @@ HRESULT CD3DFont::GetTextExtent( const TCHAR* strText, SIZE* pSize )
// 1/8th of the screen width. This allows you to output text at a fixed
// fraction of the viewport, even if the screen or window size changes.
//-----------------------------------------------------------------------------
-HRESULT CD3DFont::DrawTextScaled( FLOAT x, FLOAT y, FLOAT z,
- FLOAT fXScale, FLOAT fYScale, DWORD dwColor,
- const TCHAR* strText, DWORD dwFlags )
+HRESULT CD3DFont::DrawTextScaled(FLOAT x, FLOAT y, FLOAT z,
+ FLOAT fXScale, FLOAT fYScale, DWORD dwColor,
+ const TCHAR* strText, DWORD dwFlags)
{
- if ( m_pd3dDevice == NULL ) {
- return E_FAIL;
- }
-
- // Set up renderstate
- m_pStateBlockSaved->Capture();
- m_pStateBlockDrawText->Apply();
- m_pd3dDevice->SetFVF( D3DFVF_FONT2DVERTEX );
- m_pd3dDevice->SetPixelShader( NULL );
- m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof(FONT2DVERTEX) );
-
- // Set filter states
- if ( dwFlags & D3DFONT_FILTERED ) {
- m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
- m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
- }
-
- D3DVIEWPORT9 vp;
- m_pd3dDevice->GetViewport( &vp );
- FLOAT fLineHeight = ( m_fTexCoords[0][3] - m_fTexCoords[0][1] ) * m_dwTexHeight;
-
- // Center the text block in the viewport
- if ( dwFlags & D3DFONT_CENTERED_X ) {
- const TCHAR* strTextTmp = strText;
- float xFinal = 0.0f;
-
- while ( *strTextTmp ) {
- TCHAR c = *strTextTmp++;
-
- if ( c == _T('\n') ) {
- break; // Isn't supported.
- }
- if ( (c-32) < 0 || (c-32) >= 128-32 ) {
- continue;
- }
-
- FLOAT tx1 = m_fTexCoords[c-32][0];
- FLOAT tx2 = m_fTexCoords[c-32][2];
-
- FLOAT w = (tx2-tx1)*m_dwTexWidth;
-
- w *= (fXScale*vp.Height)/fLineHeight;
-
- xFinal += w - (2 * m_dwSpacing) * (fXScale*vp.Height)/fLineHeight;
- }
-
- x = -xFinal/vp.Width;
- }
- if ( dwFlags & D3DFONT_CENTERED_Y ) {
- y = -fLineHeight/vp.Height;
- }
-
- FLOAT sx = (x+1.0f)*vp.Width/2;
- FLOAT sy = (y+1.0f)*vp.Height/2;
- FLOAT sz = z;
- FLOAT rhw = 1.0f;
-
- // Adjust for character spacing
- sx -= m_dwSpacing * (fXScale*vp.Height)/fLineHeight;
- FLOAT fStartX = sx;
-
- // Fill vertex buffer
- FONT2DVERTEX* pVertices;
- DWORD dwNumTriangles = 0L;
- m_pVB->Lock( 0, 0, (void**)&pVertices, D3DLOCK_DISCARD );
-
- while ( *strText ) {
- TCHAR c = *strText++;
-
- if ( c == _T('\n') ) {
- sx = fStartX;
- sy += fYScale*vp.Height;
- }
-
- if ( (c-32) < 0 || (c-32) >= 128-32 ) {
- continue;
- }
-
- FLOAT tx1 = m_fTexCoords[c-32][0];
- FLOAT ty1 = m_fTexCoords[c-32][1];
- FLOAT tx2 = m_fTexCoords[c-32][2];
- FLOAT ty2 = m_fTexCoords[c-32][3];
-
- FLOAT w = (tx2-tx1)*m_dwTexWidth;
- FLOAT h = (ty2-ty1)*m_dwTexHeight;
-
- w *= (fXScale*vp.Height)/fLineHeight;
- h *= (fYScale*vp.Height)/fLineHeight;
-
- if ( c != _T(' ') ) {
- *pVertices++ = InitFont2DVertex( D3DXVECTOR4(sx+0-0.5f,sy+h-0.5f,sz,rhw), dwColor, tx1, ty2 );
- *pVertices++ = InitFont2DVertex( D3DXVECTOR4(sx+0-0.5f,sy+0-0.5f,sz,rhw), dwColor, tx1, ty1 );
- *pVertices++ = InitFont2DVertex( D3DXVECTOR4(sx+w-0.5f,sy+h-0.5f,sz,rhw), dwColor, tx2, ty2 );
- *pVertices++ = InitFont2DVertex( D3DXVECTOR4(sx+w-0.5f,sy+0-0.5f,sz,rhw), dwColor, tx2, ty1 );
- *pVertices++ = InitFont2DVertex( D3DXVECTOR4(sx+w-0.5f,sy+h-0.5f,sz,rhw), dwColor, tx2, ty2 );
- *pVertices++ = InitFont2DVertex( D3DXVECTOR4(sx+0-0.5f,sy+0-0.5f,sz,rhw), dwColor, tx1, ty1 );
- dwNumTriangles += 2;
-
- if ( dwNumTriangles*3 > (MAX_NUM_VERTICES-6) ) {
- // Unlock, render, and relock the vertex buffer
- m_pVB->Unlock();
- m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, dwNumTriangles );
- m_pVB->Lock( 0, 0, (void**)&pVertices, D3DLOCK_DISCARD );
- dwNumTriangles = 0L;
- }
- }
-
- sx += w - (2 * m_dwSpacing) * (fXScale*vp.Height)/fLineHeight;
- }
-
- // Unlock and render the vertex buffer
- m_pVB->Unlock();
- if ( dwNumTriangles > 0 ) {
- m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, dwNumTriangles );
- }
-
- // Restore the modified renderstates
- m_pStateBlockSaved->Apply();
-
- return S_OK;
+ if (m_pd3dDevice == NULL) {
+ return E_FAIL;
+ }
+
+ // Set up renderstate
+ m_pStateBlockSaved->Capture();
+ m_pStateBlockDrawText->Apply();
+ m_pd3dDevice->SetFVF(D3DFVF_FONT2DVERTEX);
+ m_pd3dDevice->SetPixelShader(NULL);
+ m_pd3dDevice->SetStreamSource(0, m_pVB, 0, sizeof(FONT2DVERTEX));
+
+ // Set filter states
+ if (dwFlags & D3DFONT_FILTERED) {
+ m_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
+ m_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
+ }
+
+ D3DVIEWPORT9 vp;
+ m_pd3dDevice->GetViewport(&vp);
+ FLOAT fLineHeight = (m_fTexCoords[0][3] - m_fTexCoords[0][1]) * m_dwTexHeight;
+
+ // Center the text block in the viewport
+ if (dwFlags & D3DFONT_CENTERED_X) {
+ const TCHAR* strTextTmp = strText;
+ float xFinal = 0.0f;
+
+ while (*strTextTmp) {
+ TCHAR c = *strTextTmp++;
+
+ if (c == _T('\n')) {
+ break; // Isn't supported.
+ }
+ if ((c - 32) < 0 || (c - 32) >= 128 - 32) {
+ continue;
+ }
+
+ FLOAT tx1 = m_fTexCoords[c - 32][0];
+ FLOAT tx2 = m_fTexCoords[c - 32][2];
+
+ FLOAT w = (tx2 - tx1) * m_dwTexWidth;
+
+ w *= (fXScale * vp.Height) / fLineHeight;
+
+ xFinal += w - (2 * m_dwSpacing) * (fXScale * vp.Height) / fLineHeight;
+ }
+
+ x = -xFinal / vp.Width;
+ }
+ if (dwFlags & D3DFONT_CENTERED_Y) {
+ y = -fLineHeight / vp.Height;
+ }
+
+ FLOAT sx = (x + 1.0f) * vp.Width / 2;
+ FLOAT sy = (y + 1.0f) * vp.Height / 2;
+ FLOAT sz = z;
+ FLOAT rhw = 1.0f;
+
+ // Adjust for character spacing
+ sx -= m_dwSpacing * (fXScale * vp.Height) / fLineHeight;
+ FLOAT fStartX = sx;
+
+ // Fill vertex buffer
+ FONT2DVERTEX* pVertices;
+ DWORD dwNumTriangles = 0L;
+ m_pVB->Lock(0, 0, (void**)&pVertices, D3DLOCK_DISCARD);
+
+ while (*strText) {
+ TCHAR c = *strText++;
+
+ if (c == _T('\n')) {
+ sx = fStartX;
+ sy += fYScale * vp.Height;
+ }
+
+ if ((c - 32) < 0 || (c - 32) >= 128 - 32) {
+ continue;
+ }
+
+ FLOAT tx1 = m_fTexCoords[c - 32][0];
+ FLOAT ty1 = m_fTexCoords[c - 32][1];
+ FLOAT tx2 = m_fTexCoords[c - 32][2];
+ FLOAT ty2 = m_fTexCoords[c - 32][3];
+
+ FLOAT w = (tx2 - tx1) * m_dwTexWidth;
+ FLOAT h = (ty2 - ty1) * m_dwTexHeight;
+
+ w *= (fXScale * vp.Height) / fLineHeight;
+ h *= (fYScale * vp.Height) / fLineHeight;
+
+ if (c != _T(' ')) {
+ *pVertices++ = InitFont2DVertex(D3DXVECTOR4(sx + 0 - 0.5f, sy + h - 0.5f, sz, rhw), dwColor, tx1, ty2);
+ *pVertices++ = InitFont2DVertex(D3DXVECTOR4(sx + 0 - 0.5f, sy + 0 - 0.5f, sz, rhw), dwColor, tx1, ty1);
+ *pVertices++ = InitFont2DVertex(D3DXVECTOR4(sx + w - 0.5f, sy + h - 0.5f, sz, rhw), dwColor, tx2, ty2);
+ *pVertices++ = InitFont2DVertex(D3DXVECTOR4(sx + w - 0.5f, sy + 0 - 0.5f, sz, rhw), dwColor, tx2, ty1);
+ *pVertices++ = InitFont2DVertex(D3DXVECTOR4(sx + w - 0.5f, sy + h - 0.5f, sz, rhw), dwColor, tx2, ty2);
+ *pVertices++ = InitFont2DVertex(D3DXVECTOR4(sx + 0 - 0.5f, sy + 0 - 0.5f, sz, rhw), dwColor, tx1, ty1);
+ dwNumTriangles += 2;
+
+ if (dwNumTriangles * 3 > (MAX_NUM_VERTICES - 6)) {
+ // Unlock, render, and relock the vertex buffer
+ m_pVB->Unlock();
+ m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, dwNumTriangles);
+ m_pVB->Lock(0, 0, (void**)&pVertices, D3DLOCK_DISCARD);
+ dwNumTriangles = 0L;
+ }
+ }
+
+ sx += w - (2 * m_dwSpacing) * (fXScale * vp.Height) / fLineHeight;
+ }
+
+ // Unlock and render the vertex buffer
+ m_pVB->Unlock();
+ if (dwNumTriangles > 0) {
+ m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, dwNumTriangles);
+ }
+
+ // Restore the modified renderstates
+ m_pStateBlockSaved->Apply();
+
+ return S_OK;
}
@@ -655,121 +655,121 @@ HRESULT CD3DFont::DrawTextScaled( FLOAT x, FLOAT y, FLOAT z,
// Name: DrawText()
// Desc: Draws 2D text. Note that sx and sy are in pixels
//-----------------------------------------------------------------------------
-HRESULT CD3DFont::DrawText( FLOAT sx, FLOAT sy, DWORD dwColor,
- const TCHAR* strText, DWORD dwFlags )
+HRESULT CD3DFont::DrawText(FLOAT sx, FLOAT sy, DWORD dwColor,
+ const TCHAR* strText, DWORD dwFlags)
{
- if ( m_pd3dDevice == NULL ) {
- return E_FAIL;
- }
-
- // Setup renderstate
- m_pStateBlockSaved->Capture();
- m_pStateBlockDrawText->Apply();
- m_pd3dDevice->SetFVF( D3DFVF_FONT2DVERTEX );
- m_pd3dDevice->SetPixelShader( NULL );
- m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof(FONT2DVERTEX) );
-
- // Set filter states
- if ( dwFlags & D3DFONT_FILTERED ) {
- m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
- m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
- }
-
- // Center the text block in the viewport
- if ( dwFlags & D3DFONT_CENTERED_X ) {
- D3DVIEWPORT9 vp;
- m_pd3dDevice->GetViewport( &vp );
- const TCHAR* strTextTmp = strText;
- float xFinal = 0.0f;
-
- while ( *strTextTmp ) {
- TCHAR c = *strTextTmp++;
-
- if ( c == _T('\n') ) {
- break; // Isn't supported.
- }
- if ( (c-32) < 0 || (c-32) >= 128-32 ) {
- continue;
- }
-
- FLOAT tx1 = m_fTexCoords[c-32][0];
- FLOAT tx2 = m_fTexCoords[c-32][2];
-
- FLOAT w = (tx2-tx1) * m_dwTexWidth / m_fTextScale;
-
- xFinal += w - (2 * m_dwSpacing);
- }
-
- sx = (vp.Width-xFinal)/2.0f;
- }
- if ( dwFlags & D3DFONT_CENTERED_Y ) {
- D3DVIEWPORT9 vp;
- m_pd3dDevice->GetViewport( &vp );
- float fLineHeight = ((m_fTexCoords[0][3]-m_fTexCoords[0][1])*m_dwTexHeight);
- sy = (vp.Height-fLineHeight)/2;
- }
-
- // Adjust for character spacing
- sx -= m_dwSpacing;
- FLOAT fStartX = sx;
-
- // Fill vertex buffer
- FONT2DVERTEX* pVertices = NULL;
- DWORD dwNumTriangles = 0;
- m_pVB->Lock( 0, 0, (void**)&pVertices, D3DLOCK_DISCARD );
-
- while ( *strText ) {
- TCHAR c = *strText++;
-
- if ( c == _T('\n') ) {
- sx = fStartX;
- sy += (m_fTexCoords[0][3]-m_fTexCoords[0][1])*m_dwTexHeight;
- }
-
- if ( (c-32) < 0 || (c-32) >= 128-32 ) {
- continue;
- }
-
- FLOAT tx1 = m_fTexCoords[c-32][0];
- FLOAT ty1 = m_fTexCoords[c-32][1];
- FLOAT tx2 = m_fTexCoords[c-32][2];
- FLOAT ty2 = m_fTexCoords[c-32][3];
-
- FLOAT w = (tx2-tx1) * m_dwTexWidth / m_fTextScale;
- FLOAT h = (ty2-ty1) * m_dwTexHeight / m_fTextScale;
-
- if ( c != _T(' ') ) {
- *pVertices++ = InitFont2DVertex( D3DXVECTOR4(sx+0-0.5f,sy+h-0.5f,0.9f,1.0f), dwColor, tx1, ty2 );
- *pVertices++ = InitFont2DVertex( D3DXVECTOR4(sx+0-0.5f,sy+0-0.5f,0.9f,1.0f), dwColor, tx1, ty1 );
- *pVertices++ = InitFont2DVertex( D3DXVECTOR4(sx+w-0.5f,sy+h-0.5f,0.9f,1.0f), dwColor, tx2, ty2 );
- *pVertices++ = InitFont2DVertex( D3DXVECTOR4(sx+w-0.5f,sy+0-0.5f,0.9f,1.0f), dwColor, tx2, ty1 );
- *pVertices++ = InitFont2DVertex( D3DXVECTOR4(sx+w-0.5f,sy+h-0.5f,0.9f,1.0f), dwColor, tx2, ty2 );
- *pVertices++ = InitFont2DVertex( D3DXVECTOR4(sx+0-0.5f,sy+0-0.5f,0.9f,1.0f), dwColor, tx1, ty1 );
- dwNumTriangles += 2;
-
- if ( dwNumTriangles*3 > (MAX_NUM_VERTICES-6) ) {
- // Unlock, render, and relock the vertex buffer
- m_pVB->Unlock();
- m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, dwNumTriangles );
- pVertices = NULL;
- m_pVB->Lock( 0, 0, (void**)&pVertices, D3DLOCK_DISCARD );
- dwNumTriangles = 0L;
- }
- }
-
- sx += w - (2 * m_dwSpacing);
- }
-
- // Unlock and render the vertex buffer
- m_pVB->Unlock();
- if ( dwNumTriangles > 0 ) {
- m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, dwNumTriangles );
- }
-
- // Restore the modified renderstates
- m_pStateBlockSaved->Apply();
-
- return S_OK;
+ if (m_pd3dDevice == NULL) {
+ return E_FAIL;
+ }
+
+ // Setup renderstate
+ m_pStateBlockSaved->Capture();
+ m_pStateBlockDrawText->Apply();
+ m_pd3dDevice->SetFVF(D3DFVF_FONT2DVERTEX);
+ m_pd3dDevice->SetPixelShader(NULL);
+ m_pd3dDevice->SetStreamSource(0, m_pVB, 0, sizeof(FONT2DVERTEX));
+
+ // Set filter states
+ if (dwFlags & D3DFONT_FILTERED) {
+ m_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
+ m_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
+ }
+
+ // Center the text block in the viewport
+ if (dwFlags & D3DFONT_CENTERED_X) {
+ D3DVIEWPORT9 vp;
+ m_pd3dDevice->GetViewport(&vp);
+ const TCHAR* strTextTmp = strText;
+ float xFinal = 0.0f;
+
+ while (*strTextTmp) {
+ TCHAR c = *strTextTmp++;
+
+ if (c == _T('\n')) {
+ break; // Isn't supported.
+ }
+ if ((c - 32) < 0 || (c - 32) >= 128 - 32) {
+ continue;
+ }
+
+ FLOAT tx1 = m_fTexCoords[c - 32][0];
+ FLOAT tx2 = m_fTexCoords[c - 32][2];
+
+ FLOAT w = (tx2 - tx1) * m_dwTexWidth / m_fTextScale;
+
+ xFinal += w - (2 * m_dwSpacing);
+ }
+
+ sx = (vp.Width - xFinal) / 2.0f;
+ }
+ if (dwFlags & D3DFONT_CENTERED_Y) {
+ D3DVIEWPORT9 vp;
+ m_pd3dDevice->GetViewport(&vp);
+ float fLineHeight = ((m_fTexCoords[0][3] - m_fTexCoords[0][1]) * m_dwTexHeight);
+ sy = (vp.Height - fLineHeight) / 2;
+ }
+
+ // Adjust for character spacing
+ sx -= m_dwSpacing;
+ FLOAT fStartX = sx;
+
+ // Fill vertex buffer
+ FONT2DVERTEX* pVertices = NULL;
+ DWORD dwNumTriangles = 0;
+ m_pVB->Lock(0, 0, (void**)&pVertices, D3DLOCK_DISCARD);
+
+ while (*strText) {
+ TCHAR c = *strText++;
+
+ if (c == _T('\n')) {
+ sx = fStartX;
+ sy += (m_fTexCoords[0][3] - m_fTexCoords[0][1]) * m_dwTexHeight;
+ }
+
+ if ((c - 32) < 0 || (c - 32) >= 128 - 32) {
+ continue;
+ }
+
+ FLOAT tx1 = m_fTexCoords[c - 32][0];
+ FLOAT ty1 = m_fTexCoords[c - 32][1];
+ FLOAT tx2 = m_fTexCoords[c - 32][2];
+ FLOAT ty2 = m_fTexCoords[c - 32][3];
+
+ FLOAT w = (tx2 - tx1) * m_dwTexWidth / m_fTextScale;
+ FLOAT h = (ty2 - ty1) * m_dwTexHeight / m_fTextScale;
+
+ if (c != _T(' ')) {
+ *pVertices++ = InitFont2DVertex(D3DXVECTOR4(sx + 0 - 0.5f, sy + h - 0.5f, 0.9f, 1.0f), dwColor, tx1, ty2);
+ *pVertices++ = InitFont2DVertex(D3DXVECTOR4(sx + 0 - 0.5f, sy + 0 - 0.5f, 0.9f, 1.0f), dwColor, tx1, ty1);
+ *pVertices++ = InitFont2DVertex(D3DXVECTOR4(sx + w - 0.5f, sy + h - 0.5f, 0.9f, 1.0f), dwColor, tx2, ty2);
+ *pVertices++ = InitFont2DVertex(D3DXVECTOR4(sx + w - 0.5f, sy + 0 - 0.5f, 0.9f, 1.0f), dwColor, tx2, ty1);
+ *pVertices++ = InitFont2DVertex(D3DXVECTOR4(sx + w - 0.5f, sy + h - 0.5f, 0.9f, 1.0f), dwColor, tx2, ty2);
+ *pVertices++ = InitFont2DVertex(D3DXVECTOR4(sx + 0 - 0.5f, sy + 0 - 0.5f, 0.9f, 1.0f), dwColor, tx1, ty1);
+ dwNumTriangles += 2;
+
+ if (dwNumTriangles * 3 > (MAX_NUM_VERTICES - 6)) {
+ // Unlock, render, and relock the vertex buffer
+ m_pVB->Unlock();
+ m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, dwNumTriangles);
+ pVertices = NULL;
+ m_pVB->Lock(0, 0, (void**)&pVertices, D3DLOCK_DISCARD);
+ dwNumTriangles = 0L;
+ }
+ }
+
+ sx += w - (2 * m_dwSpacing);
+ }
+
+ // Unlock and render the vertex buffer
+ m_pVB->Unlock();
+ if (dwNumTriangles > 0) {
+ m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, dwNumTriangles);
+ }
+
+ // Restore the modified renderstates
+ m_pStateBlockSaved->Apply();
+
+ return S_OK;
}
@@ -778,103 +778,103 @@ HRESULT CD3DFont::DrawText( FLOAT sx, FLOAT sy, DWORD dwColor,
// Name: Render3DText()
// Desc: Renders 3D text
//-----------------------------------------------------------------------------
-HRESULT CD3DFont::Render3DText( const TCHAR* strText, DWORD dwFlags )
+HRESULT CD3DFont::Render3DText(const TCHAR* strText, DWORD dwFlags)
{
- if ( m_pd3dDevice == NULL ) {
- return E_FAIL;
- }
-
- // Setup renderstate
- m_pStateBlockSaved->Capture();
- m_pStateBlockDrawText->Apply();
- m_pd3dDevice->SetFVF( D3DFVF_FONT3DVERTEX );
- m_pd3dDevice->SetPixelShader( NULL );
- m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof(FONT3DVERTEX) );
-
- // Set filter states
- if ( dwFlags & D3DFONT_FILTERED ) {
- m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
- m_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
- }
-
- // Position for each text element
- FLOAT x = 0.0f;
- FLOAT y = 0.0f;
-
- // Center the text block at the origin (not the viewport)
- if ( dwFlags & D3DFONT_CENTERED_X ) {
- SIZE sz;
- GetTextExtent( strText, &sz );
- x = -(((FLOAT)sz.cx)/10.0f)/2.0f;
- }
- if ( dwFlags & D3DFONT_CENTERED_Y ) {
- SIZE sz;
- GetTextExtent( strText, &sz );
- y = -(((FLOAT)sz.cy)/10.0f)/2.0f;
- }
-
- // Turn off culling for two-sided text
- if ( dwFlags & D3DFONT_TWOSIDED ) {
- m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
- }
-
- // Adjust for character spacing
- x -= m_dwSpacing / 10.0f;
- FLOAT fStartX = x;
- TCHAR c;
-
- // Fill vertex buffer
- FONT3DVERTEX* pVertices;
- DWORD dwNumTriangles = 0L;
- m_pVB->Lock( 0, 0, (void**)&pVertices, D3DLOCK_DISCARD );
-
- while ( (c = *strText++) != 0 ) {
- if ( c == '\n' ) {
- x = fStartX;
- y -= (m_fTexCoords[0][3]-m_fTexCoords[0][1])*m_dwTexHeight/10.0f;
- }
-
- if ( (c-32) < 0 || (c-32) >= 128-32 ) {
- continue;
- }
-
- FLOAT tx1 = m_fTexCoords[c-32][0];
- FLOAT ty1 = m_fTexCoords[c-32][1];
- FLOAT tx2 = m_fTexCoords[c-32][2];
- FLOAT ty2 = m_fTexCoords[c-32][3];
-
- FLOAT w = (tx2-tx1) * m_dwTexWidth / ( 10.0f * m_fTextScale );
- FLOAT h = (ty2-ty1) * m_dwTexHeight / ( 10.0f * m_fTextScale );
-
- if ( c != _T(' ') ) {
- *pVertices++ = InitFont3DVertex( D3DXVECTOR3(x+0,y+0,0), D3DXVECTOR3(0,0,-1), tx1, ty2 );
- *pVertices++ = InitFont3DVertex( D3DXVECTOR3(x+0,y+h,0), D3DXVECTOR3(0,0,-1), tx1, ty1 );
- *pVertices++ = InitFont3DVertex( D3DXVECTOR3(x+w,y+0,0), D3DXVECTOR3(0,0,-1), tx2, ty2 );
- *pVertices++ = InitFont3DVertex( D3DXVECTOR3(x+w,y+h,0), D3DXVECTOR3(0,0,-1), tx2, ty1 );
- *pVertices++ = InitFont3DVertex( D3DXVECTOR3(x+w,y+0,0), D3DXVECTOR3(0,0,-1), tx2, ty2 );
- *pVertices++ = InitFont3DVertex( D3DXVECTOR3(x+0,y+h,0), D3DXVECTOR3(0,0,-1), tx1, ty1 );
- dwNumTriangles += 2;
-
- if ( dwNumTriangles*3 > (MAX_NUM_VERTICES-6) ) {
- // Unlock, render, and relock the vertex buffer
- m_pVB->Unlock();
- m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, dwNumTriangles );
- m_pVB->Lock( 0, 0, (void**)&pVertices, D3DLOCK_DISCARD );
- dwNumTriangles = 0L;
- }
- }
-
- x += w - (2 * m_dwSpacing) / 10.0f;
- }
-
- // Unlock and render the vertex buffer
- m_pVB->Unlock();
- if ( dwNumTriangles > 0 ) {
- m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, dwNumTriangles );
- }
-
- // Restore the modified renderstates
- m_pStateBlockSaved->Apply();
-
- return S_OK;
+ if (m_pd3dDevice == NULL) {
+ return E_FAIL;
+ }
+
+ // Setup renderstate
+ m_pStateBlockSaved->Capture();
+ m_pStateBlockDrawText->Apply();
+ m_pd3dDevice->SetFVF(D3DFVF_FONT3DVERTEX);
+ m_pd3dDevice->SetPixelShader(NULL);
+ m_pd3dDevice->SetStreamSource(0, m_pVB, 0, sizeof(FONT3DVERTEX));
+
+ // Set filter states
+ if (dwFlags & D3DFONT_FILTERED) {
+ m_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
+ m_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
+ }
+
+ // Position for each text element
+ FLOAT x = 0.0f;
+ FLOAT y = 0.0f;
+
+ // Center the text block at the origin (not the viewport)
+ if (dwFlags & D3DFONT_CENTERED_X) {
+ SIZE sz;
+ GetTextExtent(strText, &sz);
+ x = -(((FLOAT)sz.cx) / 10.0f) / 2.0f;
+ }
+ if (dwFlags & D3DFONT_CENTERED_Y) {
+ SIZE sz;
+ GetTextExtent(strText, &sz);
+ y = -(((FLOAT)sz.cy) / 10.0f) / 2.0f;
+ }
+
+ // Turn off culling for two-sided text
+ if (dwFlags & D3DFONT_TWOSIDED) {
+ m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
+ }
+
+ // Adjust for character spacing
+ x -= m_dwSpacing / 10.0f;
+ FLOAT fStartX = x;
+ TCHAR c;
+
+ // Fill vertex buffer
+ FONT3DVERTEX* pVertices;
+ DWORD dwNumTriangles = 0L;
+ m_pVB->Lock(0, 0, (void**)&pVertices, D3DLOCK_DISCARD);
+
+ while ((c = *strText++) != 0) {
+ if (c == '\n') {
+ x = fStartX;
+ y -= (m_fTexCoords[0][3] - m_fTexCoords[0][1]) * m_dwTexHeight / 10.0f;
+ }
+
+ if ((c - 32) < 0 || (c - 32) >= 128 - 32) {
+ continue;
+ }
+
+ FLOAT tx1 = m_fTexCoords[c - 32][0];
+ FLOAT ty1 = m_fTexCoords[c - 32][1];
+ FLOAT tx2 = m_fTexCoords[c - 32][2];
+ FLOAT ty2 = m_fTexCoords[c - 32][3];
+
+ FLOAT w = (tx2 - tx1) * m_dwTexWidth / (10.0f * m_fTextScale);
+ FLOAT h = (ty2 - ty1) * m_dwTexHeight / (10.0f * m_fTextScale);
+
+ if (c != _T(' ')) {
+ *pVertices++ = InitFont3DVertex(D3DXVECTOR3(x + 0, y + 0, 0), D3DXVECTOR3(0, 0, -1), tx1, ty2);
+ *pVertices++ = InitFont3DVertex(D3DXVECTOR3(x + 0, y + h, 0), D3DXVECTOR3(0, 0, -1), tx1, ty1);
+ *pVertices++ = InitFont3DVertex(D3DXVECTOR3(x + w, y + 0, 0), D3DXVECTOR3(0, 0, -1), tx2, ty2);
+ *pVertices++ = InitFont3DVertex(D3DXVECTOR3(x + w, y + h, 0), D3DXVECTOR3(0, 0, -1), tx2, ty1);
+ *pVertices++ = InitFont3DVertex(D3DXVECTOR3(x + w, y + 0, 0), D3DXVECTOR3(0, 0, -1), tx2, ty2);
+ *pVertices++ = InitFont3DVertex(D3DXVECTOR3(x + 0, y + h, 0), D3DXVECTOR3(0, 0, -1), tx1, ty1);
+ dwNumTriangles += 2;
+
+ if (dwNumTriangles * 3 > (MAX_NUM_VERTICES - 6)) {
+ // Unlock, render, and relock the vertex buffer
+ m_pVB->Unlock();
+ m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, dwNumTriangles);
+ m_pVB->Lock(0, 0, (void**)&pVertices, D3DLOCK_DISCARD);
+ dwNumTriangles = 0L;
+ }
+ }
+
+ x += w - (2 * m_dwSpacing) / 10.0f;
+ }
+
+ // Unlock and render the vertex buffer
+ m_pVB->Unlock();
+ if (dwNumTriangles > 0) {
+ m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, dwNumTriangles);
+ }
+
+ // Restore the modified renderstates
+ m_pStateBlockSaved->Apply();
+
+ return S_OK;
}
diff --git a/src/filters/renderer/VideoRenderers/D3DFont.h b/src/filters/renderer/VideoRenderers/D3DFont.h
index 6402985f0..62c991631 100644
--- a/src/filters/renderer/VideoRenderers/D3DFont.h
+++ b/src/filters/renderer/VideoRenderers/D3DFont.h
@@ -37,45 +37,45 @@
class CD3DFont
{
- TCHAR m_strFontName[80]; // Font properties
- DWORD m_dwFontHeight;
- DWORD m_dwFontFlags;
+ TCHAR m_strFontName[80]; // Font properties
+ DWORD m_dwFontHeight;
+ DWORD m_dwFontFlags;
- LPDIRECT3DDEVICE9 m_pd3dDevice; // A D3DDevice used for rendering
- LPDIRECT3DTEXTURE9 m_pTexture; // The d3d texture for this font
- LPDIRECT3DVERTEXBUFFER9 m_pVB; // VertexBuffer for rendering text
- DWORD m_dwTexWidth; // Texture dimensions
- DWORD m_dwTexHeight;
- FLOAT m_fTextScale;
- FLOAT m_fTexCoords[128-32][4];
- DWORD m_dwSpacing; // Character pixel spacing per side
+ LPDIRECT3DDEVICE9 m_pd3dDevice; // A D3DDevice used for rendering
+ LPDIRECT3DTEXTURE9 m_pTexture; // The d3d texture for this font
+ LPDIRECT3DVERTEXBUFFER9 m_pVB; // VertexBuffer for rendering text
+ DWORD m_dwTexWidth; // Texture dimensions
+ DWORD m_dwTexHeight;
+ FLOAT m_fTextScale;
+ FLOAT m_fTexCoords[128 - 32][4];
+ DWORD m_dwSpacing; // Character pixel spacing per side
- // Stateblocks for setting and restoring render states
- LPDIRECT3DSTATEBLOCK9 m_pStateBlockSaved;
- LPDIRECT3DSTATEBLOCK9 m_pStateBlockDrawText;
+ // Stateblocks for setting and restoring render states
+ LPDIRECT3DSTATEBLOCK9 m_pStateBlockSaved;
+ LPDIRECT3DSTATEBLOCK9 m_pStateBlockDrawText;
- HRESULT CreateGDIFont( HDC hDC, HFONT* pFont );
- HRESULT PaintAlphabet( HDC hDC, BOOL bMeasureOnly=FALSE );
+ HRESULT CreateGDIFont(HDC hDC, HFONT* pFont);
+ HRESULT PaintAlphabet(HDC hDC, BOOL bMeasureOnly = FALSE);
public:
- // 2D and 3D text drawing functions
- HRESULT DrawText( FLOAT x, FLOAT y, DWORD dwColor,
- const TCHAR* strText, DWORD dwFlags=0L );
- HRESULT DrawTextScaled( FLOAT x, FLOAT y, FLOAT z,
- FLOAT fXScale, FLOAT fYScale, DWORD dwColor,
- const TCHAR* strText, DWORD dwFlags=0L );
- HRESULT Render3DText( const TCHAR* strText, DWORD dwFlags=0L );
+ // 2D and 3D text drawing functions
+ HRESULT DrawText(FLOAT x, FLOAT y, DWORD dwColor,
+ const TCHAR* strText, DWORD dwFlags = 0L);
+ HRESULT DrawTextScaled(FLOAT x, FLOAT y, FLOAT z,
+ FLOAT fXScale, FLOAT fYScale, DWORD dwColor,
+ const TCHAR* strText, DWORD dwFlags = 0L);
+ HRESULT Render3DText(const TCHAR* strText, DWORD dwFlags = 0L);
- // Function to get extent of text
- HRESULT GetTextExtent( const TCHAR* strText, SIZE* pSize );
+ // Function to get extent of text
+ HRESULT GetTextExtent(const TCHAR* strText, SIZE* pSize);
- // Initializing and destroying device-dependent objects
- HRESULT InitDeviceObjects( IDirect3DDevice9* pd3dDevice );
- HRESULT RestoreDeviceObjects();
- HRESULT InvalidateDeviceObjects();
- HRESULT DeleteDeviceObjects();
+ // Initializing and destroying device-dependent objects
+ HRESULT InitDeviceObjects(IDirect3DDevice9* pd3dDevice);
+ HRESULT RestoreDeviceObjects();
+ HRESULT InvalidateDeviceObjects();
+ HRESULT DeleteDeviceObjects();
- // Constructor / destructor
- CD3DFont( const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags=0L );
- ~CD3DFont();
+ // Constructor / destructor
+ CD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags = 0L);
+ ~CD3DFont();
};
diff --git a/src/filters/renderer/VideoRenderers/DX7AllocatorPresenter.cpp b/src/filters/renderer/VideoRenderers/DX7AllocatorPresenter.cpp
index 41d4c246c..9013f77c2 100644
--- a/src/filters/renderer/VideoRenderers/DX7AllocatorPresenter.cpp
+++ b/src/filters/renderer/VideoRenderers/DX7AllocatorPresenter.cpp
@@ -34,476 +34,476 @@ using namespace DSObjects;
static HRESULT TextureBlt(IDirect3DDevice7* pD3DDev, IDirectDrawSurface7* pTexture, Vector dst[4], CRect src)
{
- if (!pTexture) {
- return E_POINTER;
- }
+ if (!pTexture) {
+ return E_POINTER;
+ }
- ASSERT(pD3DDev);
- HRESULT hr;
+ ASSERT(pD3DDev);
+ HRESULT hr;
- do {
- DDSURFACEDESC2 ddsd;
- INITDDSTRUCT(ddsd);
- if (FAILED(hr = pTexture->GetSurfaceDesc(&ddsd))) {
- break;
- }
+ do {
+ DDSURFACEDESC2 ddsd;
+ INITDDSTRUCT(ddsd);
+ if (FAILED(hr = pTexture->GetSurfaceDesc(&ddsd))) {
+ break;
+ }
- float w = (float)ddsd.dwWidth;
- float h = (float)ddsd.dwHeight;
+ float w = (float)ddsd.dwWidth;
+ float h = (float)ddsd.dwHeight;
- struct {
- float x, y, z, rhw;
- float tu, tv;
- }
- pVertices[] = {
- {(float)dst[0].x, (float)dst[0].y, (float)dst[0].z, 1.0f/(float)dst[0].z, (float)src.left / w, (float)src.top / h},
- {(float)dst[1].x, (float)dst[1].y, (float)dst[1].z, 1.0f/(float)dst[1].z, (float)src.right / w, (float)src.top / h},
- {(float)dst[2].x, (float)dst[2].y, (float)dst[2].z, 1.0f/(float)dst[2].z, (float)src.left / w, (float)src.bottom / h},
- {(float)dst[3].x, (float)dst[3].y, (float)dst[3].z, 1.0f/(float)dst[3].z, (float)src.right / w, (float)src.bottom / h},
- };
+ struct {
+ float x, y, z, rhw;
+ float tu, tv;
+ }
+ pVertices[] = {
+ {(float)dst[0].x, (float)dst[0].y, (float)dst[0].z, 1.0f / (float)dst[0].z, (float)src.left / w, (float)src.top / h},
+ {(float)dst[1].x, (float)dst[1].y, (float)dst[1].z, 1.0f / (float)dst[1].z, (float)src.right / w, (float)src.top / h},
+ {(float)dst[2].x, (float)dst[2].y, (float)dst[2].z, 1.0f / (float)dst[2].z, (float)src.left / w, (float)src.bottom / h},
+ {(float)dst[3].x, (float)dst[3].y, (float)dst[3].z, 1.0f / (float)dst[3].z, (float)src.right / w, (float)src.bottom / h},
+ };
- for (int i = 0; i < _countof(pVertices); i++) {
- pVertices[i].x -= 0.5;
- pVertices[i].y -= 0.5;
- }
+ for (int i = 0; i < _countof(pVertices); i++) {
+ pVertices[i].x -= 0.5;
+ pVertices[i].y -= 0.5;
+ }
- hr = pD3DDev->SetTexture(0, pTexture);
+ hr = pD3DDev->SetTexture(0, pTexture);
- pD3DDev->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE);
- pD3DDev->SetRenderState(D3DRENDERSTATE_LIGHTING, FALSE);
- pD3DDev->SetRenderState(D3DRENDERSTATE_BLENDENABLE, FALSE);
- pD3DDev->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE, FALSE);
+ pD3DDev->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE);
+ pD3DDev->SetRenderState(D3DRENDERSTATE_LIGHTING, FALSE);
+ pD3DDev->SetRenderState(D3DRENDERSTATE_BLENDENABLE, FALSE);
+ pD3DDev->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE, FALSE);
- pD3DDev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTFG_LINEAR);
- pD3DDev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTFN_LINEAR);
- pD3DDev->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTFP_LINEAR);
+ pD3DDev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTFG_LINEAR);
+ pD3DDev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTFN_LINEAR);
+ pD3DDev->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTFP_LINEAR);
- pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESS, D3DTADDRESS_CLAMP);
+ pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESS, D3DTADDRESS_CLAMP);
- //
+ //
- if (FAILED(hr = pD3DDev->BeginScene())) {
- break;
- }
+ if (FAILED(hr = pD3DDev->BeginScene())) {
+ break;
+ }
- hr = pD3DDev->DrawPrimitive(D3DPT_TRIANGLESTRIP,
- D3DFVF_XYZRHW | D3DFVF_TEX1,
- pVertices, 4, D3DDP_WAIT);
- pD3DDev->EndScene();
+ hr = pD3DDev->DrawPrimitive(D3DPT_TRIANGLESTRIP,
+ D3DFVF_XYZRHW | D3DFVF_TEX1,
+ pVertices, 4, D3DDP_WAIT);
+ pD3DDev->EndScene();
- //
+ //
- pD3DDev->SetTexture(0, NULL);
+ pD3DDev->SetTexture(0, NULL);
- return S_OK;
- } while (0);
+ return S_OK;
+ } while (0);
- return E_FAIL;
+ return E_FAIL;
}
//
// CDX7AllocatorPresenter
//
-typedef HRESULT (WINAPI *DirectDrawCreateExPtr)( GUID FAR * lpGuid, LPVOID *lplpDD, REFIID iid,IUnknown FAR *pUnkOuter );
+typedef HRESULT(WINAPI* DirectDrawCreateExPtr)(GUID FAR* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown FAR* pUnkOuter);
CDX7AllocatorPresenter::CDX7AllocatorPresenter(HWND hWnd, HRESULT& hr)
- : CSubPicAllocatorPresenterImpl(hWnd, hr, NULL)
- , m_ScreenSize(0, 0)
+ : CSubPicAllocatorPresenterImpl(hWnd, hr, NULL)
+ , m_ScreenSize(0, 0)
{
- if (FAILED(hr)) {
- return;
- }
-
- DirectDrawCreateExPtr pDirectDrawCreateEx = NULL;
- HMODULE hDDrawLib = NULL;
-
- hDDrawLib = LoadLibrary (_T("ddraw.dll"));
- if (hDDrawLib) {
- pDirectDrawCreateEx = (DirectDrawCreateExPtr)GetProcAddress (hDDrawLib, "DirectDrawCreateEx");
- }
- if (pDirectDrawCreateEx == NULL) {
- hr = E_FAIL;
- return;
- }
-
- if (FAILED(hr = pDirectDrawCreateEx(NULL, (VOID**)&m_pDD, IID_IDirectDraw7, NULL))
- || FAILED(hr = m_pDD->SetCooperativeLevel(AfxGetMainWnd()->GetSafeHwnd(), DDSCL_NORMAL))) {
- return;
- }
-
- if (!(m_pD3D = m_pDD)) {
- hr = E_NOINTERFACE;
- return;
- }
-
- hr = CreateDevice();
- if (FAILED(hr)) {
- TRACE("CreateDevice failed: 0x%08x\n", (LONG)hr);
- }
+ if (FAILED(hr)) {
+ return;
+ }
+
+ DirectDrawCreateExPtr pDirectDrawCreateEx = NULL;
+ HMODULE hDDrawLib = NULL;
+
+ hDDrawLib = LoadLibrary(_T("ddraw.dll"));
+ if (hDDrawLib) {
+ pDirectDrawCreateEx = (DirectDrawCreateExPtr)GetProcAddress(hDDrawLib, "DirectDrawCreateEx");
+ }
+ if (pDirectDrawCreateEx == NULL) {
+ hr = E_FAIL;
+ return;
+ }
+
+ if (FAILED(hr = pDirectDrawCreateEx(NULL, (VOID**)&m_pDD, IID_IDirectDraw7, NULL))
+ || FAILED(hr = m_pDD->SetCooperativeLevel(AfxGetMainWnd()->GetSafeHwnd(), DDSCL_NORMAL))) {
+ return;
+ }
+
+ if (!(m_pD3D = m_pDD)) {
+ hr = E_NOINTERFACE;
+ return;
+ }
+
+ hr = CreateDevice();
+ if (FAILED(hr)) {
+ TRACE("CreateDevice failed: 0x%08x\n", (LONG)hr);
+ }
}
HRESULT CDX7AllocatorPresenter::CreateDevice()
{
- m_pD3DDev = NULL;
-
- m_pPrimary = NULL;
- m_pBackBuffer = NULL;
-
- DDSURFACEDESC2 ddsd;
- INITDDSTRUCT(ddsd);
- if (FAILED(m_pDD->GetDisplayMode(&ddsd)) ||
- ddsd.ddpfPixelFormat.dwRGBBitCount <= 8) {
- return DDERR_INVALIDMODE;
- }
-
- m_ScreenSize.SetSize(ddsd.dwWidth, ddsd.dwHeight);
-
- HRESULT hr;
-
- // m_pPrimary
-
- INITDDSTRUCT(ddsd);
- ddsd.dwFlags = DDSD_CAPS;
- ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
- if (FAILED(hr = m_pDD->CreateSurface(&ddsd, &m_pPrimary, NULL))) {
- return hr;
- }
-
- CComPtr<IDirectDrawClipper> pcClipper;
- if (FAILED(hr = m_pDD->CreateClipper(0, &pcClipper, NULL))) {
- return hr;
- }
- pcClipper->SetHWnd(0, m_hWnd);
- m_pPrimary->SetClipper(pcClipper);
-
- // m_pBackBuffer
-
- INITDDSTRUCT(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
- ddsd.ddsCaps.dwCaps = /*DDSCAPS_OFFSCREENPLAIN |*/ DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE;
- ddsd.dwWidth = m_ScreenSize.cx;
- ddsd.dwHeight = m_ScreenSize.cy;
- if (FAILED(hr = m_pDD->CreateSurface(&ddsd, &m_pBackBuffer, NULL))) {
- return hr;
- }
-
- pcClipper = NULL;
- if (FAILED(hr = m_pDD->CreateClipper(0, &pcClipper, NULL))) {
- return hr;
- }
- BYTE rgnDataBuffer[1024];
- HRGN hrgn = CreateRectRgn(0, 0, ddsd.dwWidth, ddsd.dwHeight);
- GetRegionData(hrgn, sizeof(rgnDataBuffer), (RGNDATA*)rgnDataBuffer);
- DeleteObject(hrgn);
- pcClipper->SetClipList((RGNDATA*)rgnDataBuffer, 0);
- m_pBackBuffer->SetClipper(pcClipper);
-
- // m_pD3DDev
-
- if (FAILED(hr = m_pD3D->CreateDevice(IID_IDirect3DHALDevice, m_pBackBuffer, &m_pD3DDev))) { // this seems to fail if the desktop size is too large (width or height >2048)
- return hr;
- }
-
- //
-
- CComPtr<ISubPicProvider> pSubPicProvider;
- if (m_pSubPicQueue) {
- m_pSubPicQueue->GetSubPicProvider(&pSubPicProvider);
- }
-
- CSize size;
- switch (GetRenderersSettings().nSPCMaxRes) {
- case 0:
- default:
- size = m_ScreenSize;
- break;
- case 1:
- size.SetSize(1024, 768);
- break;
- case 2:
- size.SetSize(800, 600);
- break;
- case 3:
- size.SetSize(640, 480);
- break;
- case 4:
- size.SetSize(512, 384);
- break;
- case 5:
- size.SetSize(384, 288);
- break;
- case 6:
- size.SetSize(2560, 1600);
- break;
- case 7:
- size.SetSize(1920, 1080);
- break;
- case 8:
- size.SetSize(1320, 900);
- break;
- case 9:
- size.SetSize(1280, 720);
- break;
- }
-
- if (m_pAllocator) {
- m_pAllocator->ChangeDevice(m_pD3DDev);
- } else {
- m_pAllocator = DNew CDX7SubPicAllocator(m_pD3DDev, size, GetRenderersSettings().fSPCPow2Tex);
- if (!m_pAllocator || FAILED(hr)) {
- return E_FAIL;
- }
- }
-
- hr = S_OK;
- m_pSubPicQueue = GetRenderersSettings().nSPCSize > 0
- ? (ISubPicQueue*)DNew CSubPicQueue(GetRenderersSettings().nSPCSize, !GetRenderersSettings().fSPCAllowAnimationWhenBuffering, m_pAllocator, &hr)
- : (ISubPicQueue*)DNew CSubPicQueueNoThread(m_pAllocator, &hr);
- if (!m_pSubPicQueue || FAILED(hr)) {
- return E_FAIL;
- }
-
- if (pSubPicProvider) {
- m_pSubPicQueue->SetSubPicProvider(pSubPicProvider);
- }
-
- return S_OK;
+ m_pD3DDev = NULL;
+
+ m_pPrimary = NULL;
+ m_pBackBuffer = NULL;
+
+ DDSURFACEDESC2 ddsd;
+ INITDDSTRUCT(ddsd);
+ if (FAILED(m_pDD->GetDisplayMode(&ddsd)) ||
+ ddsd.ddpfPixelFormat.dwRGBBitCount <= 8) {
+ return DDERR_INVALIDMODE;
+ }
+
+ m_ScreenSize.SetSize(ddsd.dwWidth, ddsd.dwHeight);
+
+ HRESULT hr;
+
+ // m_pPrimary
+
+ INITDDSTRUCT(ddsd);
+ ddsd.dwFlags = DDSD_CAPS;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
+ if (FAILED(hr = m_pDD->CreateSurface(&ddsd, &m_pPrimary, NULL))) {
+ return hr;
+ }
+
+ CComPtr<IDirectDrawClipper> pcClipper;
+ if (FAILED(hr = m_pDD->CreateClipper(0, &pcClipper, NULL))) {
+ return hr;
+ }
+ pcClipper->SetHWnd(0, m_hWnd);
+ m_pPrimary->SetClipper(pcClipper);
+
+ // m_pBackBuffer
+
+ INITDDSTRUCT(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+ ddsd.ddsCaps.dwCaps = /*DDSCAPS_OFFSCREENPLAIN |*/ DDSCAPS_VIDEOMEMORY | DDSCAPS_3DDEVICE;
+ ddsd.dwWidth = m_ScreenSize.cx;
+ ddsd.dwHeight = m_ScreenSize.cy;
+ if (FAILED(hr = m_pDD->CreateSurface(&ddsd, &m_pBackBuffer, NULL))) {
+ return hr;
+ }
+
+ pcClipper = NULL;
+ if (FAILED(hr = m_pDD->CreateClipper(0, &pcClipper, NULL))) {
+ return hr;
+ }
+ BYTE rgnDataBuffer[1024];
+ HRGN hrgn = CreateRectRgn(0, 0, ddsd.dwWidth, ddsd.dwHeight);
+ GetRegionData(hrgn, sizeof(rgnDataBuffer), (RGNDATA*)rgnDataBuffer);
+ DeleteObject(hrgn);
+ pcClipper->SetClipList((RGNDATA*)rgnDataBuffer, 0);
+ m_pBackBuffer->SetClipper(pcClipper);
+
+ // m_pD3DDev
+
+ if (FAILED(hr = m_pD3D->CreateDevice(IID_IDirect3DHALDevice, m_pBackBuffer, &m_pD3DDev))) { // this seems to fail if the desktop size is too large (width or height >2048)
+ return hr;
+ }
+
+ //
+
+ CComPtr<ISubPicProvider> pSubPicProvider;
+ if (m_pSubPicQueue) {
+ m_pSubPicQueue->GetSubPicProvider(&pSubPicProvider);
+ }
+
+ CSize size;
+ switch (GetRenderersSettings().nSPCMaxRes) {
+ case 0:
+ default:
+ size = m_ScreenSize;
+ break;
+ case 1:
+ size.SetSize(1024, 768);
+ break;
+ case 2:
+ size.SetSize(800, 600);
+ break;
+ case 3:
+ size.SetSize(640, 480);
+ break;
+ case 4:
+ size.SetSize(512, 384);
+ break;
+ case 5:
+ size.SetSize(384, 288);
+ break;
+ case 6:
+ size.SetSize(2560, 1600);
+ break;
+ case 7:
+ size.SetSize(1920, 1080);
+ break;
+ case 8:
+ size.SetSize(1320, 900);
+ break;
+ case 9:
+ size.SetSize(1280, 720);
+ break;
+ }
+
+ if (m_pAllocator) {
+ m_pAllocator->ChangeDevice(m_pD3DDev);
+ } else {
+ m_pAllocator = DNew CDX7SubPicAllocator(m_pD3DDev, size, GetRenderersSettings().fSPCPow2Tex);
+ if (!m_pAllocator || FAILED(hr)) {
+ return E_FAIL;
+ }
+ }
+
+ hr = S_OK;
+ m_pSubPicQueue = GetRenderersSettings().nSPCSize > 0
+ ? (ISubPicQueue*)DNew CSubPicQueue(GetRenderersSettings().nSPCSize, !GetRenderersSettings().fSPCAllowAnimationWhenBuffering, m_pAllocator, &hr)
+ : (ISubPicQueue*)DNew CSubPicQueueNoThread(m_pAllocator, &hr);
+ if (!m_pSubPicQueue || FAILED(hr)) {
+ return E_FAIL;
+ }
+
+ if (pSubPicProvider) {
+ m_pSubPicQueue->SetSubPicProvider(pSubPicProvider);
+ }
+
+ return S_OK;
}
HRESULT CDX7AllocatorPresenter::AllocSurfaces()
{
- CAutoLock cAutoLock(this);
-
- CRenderersSettings& s = GetRenderersSettings();
-
- m_pVideoTexture = NULL;
- m_pVideoSurface = NULL;
-
- DDSURFACEDESC2 ddsd;
- INITDDSTRUCT(ddsd);
- ddsd.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY;
- ddsd.dwWidth = m_NativeVideoSize.cx;
- ddsd.dwHeight = m_NativeVideoSize.cy;
- ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
- ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
- ddsd.ddpfPixelFormat.dwRGBBitCount = 32;
- ddsd.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
- ddsd.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
- ddsd.ddpfPixelFormat.dwBBitMask = 0x000000FF;
-
- if (s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE2D || s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D) {
- ddsd.ddsCaps.dwCaps |= DDSCAPS_TEXTURE;
- // ddsd.ddpfPixelFormat.dwFlags |= DDPF_ALPHAPIXELS;
- // ddsd.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000;
- }
-
- HRESULT hr = m_pDD->CreateSurface(&ddsd, &m_pVideoSurface, NULL);
- if (FAILED(hr)) {
- // FIXME: eh, dx9 has no problem creating a 32bpp surface under a 16bpp desktop, but dx7 fails here (textures are ok)
- DDSURFACEDESC2 ddsd2;
- INITDDSTRUCT(ddsd2);
- if (!(s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE2D || s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D)
- && SUCCEEDED(m_pDD->GetDisplayMode(&ddsd2))
- && ddsd2.ddpfPixelFormat.dwRGBBitCount == 16) {
- ddsd.ddpfPixelFormat.dwRGBBitCount = 16;
- ddsd.ddpfPixelFormat.dwRBitMask = 0x0000F800;
- ddsd.ddpfPixelFormat.dwGBitMask = 0x000007E0;
- ddsd.ddpfPixelFormat.dwBBitMask = 0x0000001F;
- hr = m_pDD->CreateSurface(&ddsd, &m_pVideoSurface, NULL);
- }
-
- if (FAILED(hr)) {
- return hr;
- }
- }
-
- if (s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D) {
- m_pVideoTexture = m_pVideoSurface;
- }
-
- DDBLTFX fx;
- INITDDSTRUCT(fx);
- fx.dwFillColor = 0;
- hr = m_pVideoSurface->Blt(NULL, NULL, NULL, DDBLT_WAIT|DDBLT_COLORFILL, &fx);
-
- return S_OK;
+ CAutoLock cAutoLock(this);
+
+ CRenderersSettings& s = GetRenderersSettings();
+
+ m_pVideoTexture = NULL;
+ m_pVideoSurface = NULL;
+
+ DDSURFACEDESC2 ddsd;
+ INITDDSTRUCT(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY;
+ ddsd.dwWidth = m_NativeVideoSize.cx;
+ ddsd.dwHeight = m_NativeVideoSize.cy;
+ ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
+ ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
+ ddsd.ddpfPixelFormat.dwRGBBitCount = 32;
+ ddsd.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
+ ddsd.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
+ ddsd.ddpfPixelFormat.dwBBitMask = 0x000000FF;
+
+ if (s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE2D || s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D) {
+ ddsd.ddsCaps.dwCaps |= DDSCAPS_TEXTURE;
+ // ddsd.ddpfPixelFormat.dwFlags |= DDPF_ALPHAPIXELS;
+ // ddsd.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000;
+ }
+
+ HRESULT hr = m_pDD->CreateSurface(&ddsd, &m_pVideoSurface, NULL);
+ if (FAILED(hr)) {
+ // FIXME: eh, dx9 has no problem creating a 32bpp surface under a 16bpp desktop, but dx7 fails here (textures are ok)
+ DDSURFACEDESC2 ddsd2;
+ INITDDSTRUCT(ddsd2);
+ if (!(s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE2D || s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D)
+ && SUCCEEDED(m_pDD->GetDisplayMode(&ddsd2))
+ && ddsd2.ddpfPixelFormat.dwRGBBitCount == 16) {
+ ddsd.ddpfPixelFormat.dwRGBBitCount = 16;
+ ddsd.ddpfPixelFormat.dwRBitMask = 0x0000F800;
+ ddsd.ddpfPixelFormat.dwGBitMask = 0x000007E0;
+ ddsd.ddpfPixelFormat.dwBBitMask = 0x0000001F;
+ hr = m_pDD->CreateSurface(&ddsd, &m_pVideoSurface, NULL);
+ }
+
+ if (FAILED(hr)) {
+ return hr;
+ }
+ }
+
+ if (s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D) {
+ m_pVideoTexture = m_pVideoSurface;
+ }
+
+ DDBLTFX fx;
+ INITDDSTRUCT(fx);
+ fx.dwFillColor = 0;
+ hr = m_pVideoSurface->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &fx);
+
+ return S_OK;
}
void CDX7AllocatorPresenter::DeleteSurfaces()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- m_pVideoTexture = NULL;
- m_pVideoSurface = NULL;
+ m_pVideoTexture = NULL;
+ m_pVideoSurface = NULL;
}
// ISubPicAllocatorPresenter
STDMETHODIMP CDX7AllocatorPresenter::CreateRenderer(IUnknown** ppRenderer)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP_(bool) CDX7AllocatorPresenter::Paint(bool fAll)
{
- if (m_bPendingResetDevice) {
- SendResetRequest();
- return false;
- }
+ if (m_bPendingResetDevice) {
+ SendResetRequest();
+ return false;
+ }
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- if (m_WindowRect.right <= m_WindowRect.left || m_WindowRect.bottom <= m_WindowRect.top
- || m_NativeVideoSize.cx <= 0 || m_NativeVideoSize.cy <= 0
- || !m_pPrimary || !m_pBackBuffer || !m_pVideoSurface) {
- return false;
- }
+ if (m_WindowRect.right <= m_WindowRect.left || m_WindowRect.bottom <= m_WindowRect.top
+ || m_NativeVideoSize.cx <= 0 || m_NativeVideoSize.cy <= 0
+ || !m_pPrimary || !m_pBackBuffer || !m_pVideoSurface) {
+ return false;
+ }
- HRESULT hr;
+ HRESULT hr;
- CRect rSrcVid(CPoint(0, 0), m_NativeVideoSize);
- CRect rDstVid(m_VideoRect);
+ CRect rSrcVid(CPoint(0, 0), m_NativeVideoSize);
+ CRect rDstVid(m_VideoRect);
- CRect rSrcPri(CPoint(0, 0), m_WindowRect.Size());
- CRect rDstPri(m_WindowRect);
- MapWindowRect(m_hWnd, HWND_DESKTOP, &rDstPri);
+ CRect rSrcPri(CPoint(0, 0), m_WindowRect.Size());
+ CRect rDstPri(m_WindowRect);
+ MapWindowRect(m_hWnd, HWND_DESKTOP, &rDstPri);
- if (fAll) {
- // clear the backbuffer
+ if (fAll) {
+ // clear the backbuffer
- CRect rl(0, 0, rDstVid.left, rSrcPri.bottom);
- CRect rr(rDstVid.right, 0, rSrcPri.right, rSrcPri.bottom);
- CRect rt(0, 0, rSrcPri.right, rDstVid.top);
- CRect rb(0, rDstVid.bottom, rSrcPri.right, rSrcPri.bottom);
+ CRect rl(0, 0, rDstVid.left, rSrcPri.bottom);
+ CRect rr(rDstVid.right, 0, rSrcPri.right, rSrcPri.bottom);
+ CRect rt(0, 0, rSrcPri.right, rDstVid.top);
+ CRect rb(0, rDstVid.bottom, rSrcPri.right, rSrcPri.bottom);
- DDBLTFX fx;
- INITDDSTRUCT(fx);
- fx.dwFillColor = 0;
- hr = m_pBackBuffer->Blt(NULL, NULL, NULL, DDBLT_WAIT|DDBLT_COLORFILL, &fx);
+ DDBLTFX fx;
+ INITDDSTRUCT(fx);
+ fx.dwFillColor = 0;
+ hr = m_pBackBuffer->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &fx);
- // paint the video on the backbuffer
+ // paint the video on the backbuffer
- if (!rDstVid.IsRectEmpty()) {
- if (m_pVideoTexture) {
- Vector v[4];
- Transform(rDstVid, v);
- hr = TextureBlt(m_pD3DDev, m_pVideoTexture, v, rSrcVid);
- } else {
- hr = m_pBackBuffer->Blt(rDstVid, m_pVideoSurface, rSrcVid, DDBLT_WAIT, NULL);
- }
- }
+ if (!rDstVid.IsRectEmpty()) {
+ if (m_pVideoTexture) {
+ Vector v[4];
+ Transform(rDstVid, v);
+ hr = TextureBlt(m_pD3DDev, m_pVideoTexture, v, rSrcVid);
+ } else {
+ hr = m_pBackBuffer->Blt(rDstVid, m_pVideoSurface, rSrcVid, DDBLT_WAIT, NULL);
+ }
+ }
- // paint the text on the backbuffer
+ // paint the text on the backbuffer
- AlphaBltSubPic(rSrcPri.Size());
- }
+ AlphaBltSubPic(rSrcPri.Size());
+ }
- // wait vsync
+ // wait vsync
- m_pDD->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, NULL);
+ m_pDD->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, NULL);
- // blt to the primary surface
+ // blt to the primary surface
- hr = m_pPrimary->Blt(rDstPri, m_pBackBuffer, rSrcPri, DDBLT_WAIT, NULL);
+ hr = m_pPrimary->Blt(rDstPri, m_pBackBuffer, rSrcPri, DDBLT_WAIT, NULL);
- if (hr == DDERR_SURFACELOST) {
- m_bPendingResetDevice = true;
- SendResetRequest();
- return false;
- }
+ if (hr == DDERR_SURFACELOST) {
+ m_bPendingResetDevice = true;
+ SendResetRequest();
+ return false;
+ }
- return true;
+ return true;
}
void CDX7AllocatorPresenter::SendResetRequest()
{
- if (!m_bDeviceResetRequested) {
- m_bDeviceResetRequested = true;
- AfxGetApp()->m_pMainWnd->PostMessage(WM_RESET_DEVICE);
- }
+ if (!m_bDeviceResetRequested) {
+ m_bDeviceResetRequested = true;
+ AfxGetApp()->m_pMainWnd->PostMessage(WM_RESET_DEVICE);
+ }
}
STDMETHODIMP_(bool) CDX7AllocatorPresenter::ResetDevice()
{
- HRESULT hr;
- DeleteSurfaces();
- if (FAILED(hr = CreateDevice()) || FAILED(hr = AllocSurfaces())) {
- //DDERR_UNSUPPORTEDMODE - 0x8876024e
- TRACE("ResetDevice failed: 0x%08x\n", (LONG)hr);
- m_bDeviceResetRequested = false;
- return false;
- }
- TRACE("ResetDevice\n");
- m_bPendingResetDevice = false;
- m_bDeviceResetRequested = false;
- return true;
+ HRESULT hr;
+ DeleteSurfaces();
+ if (FAILED(hr = CreateDevice()) || FAILED(hr = AllocSurfaces())) {
+ //DDERR_UNSUPPORTEDMODE - 0x8876024e
+ TRACE("ResetDevice failed: 0x%08x\n", (LONG)hr);
+ m_bDeviceResetRequested = false;
+ return false;
+ }
+ TRACE("ResetDevice\n");
+ m_bPendingResetDevice = false;
+ m_bDeviceResetRequested = false;
+ return true;
}
STDMETHODIMP_(bool) CDX7AllocatorPresenter::DisplayChange()
{
- return true;
+ return true;
}
STDMETHODIMP CDX7AllocatorPresenter::GetDIB(BYTE* lpDib, DWORD* size)
{
- CheckPointer(size, E_POINTER);
-
- HRESULT hr;
-
- DDSURFACEDESC2 ddsd;
- INITDDSTRUCT(ddsd);
- if (FAILED(m_pVideoSurface->GetSurfaceDesc(&ddsd))) {
- return E_FAIL;
- }
-
- if (ddsd.ddpfPixelFormat.dwRGBBitCount != 16 && ddsd.ddpfPixelFormat.dwRGBBitCount != 32) {
- return E_FAIL;
- }
-
- DWORD required = sizeof(BITMAPINFOHEADER) + (ddsd.dwWidth*ddsd.dwHeight*32>>3);
- if (!lpDib) {
- *size = required;
- return S_OK;
- }
- if (*size < required) {
- return E_OUTOFMEMORY;
- }
- *size = required;
-
- INITDDSTRUCT(ddsd);
- if (FAILED(hr = m_pVideoSurface->Lock(NULL, &ddsd, DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_NOSYSLOCK, NULL))) {
- // TODO
- return hr;
- }
-
- BITMAPINFOHEADER* bih = (BITMAPINFOHEADER*)lpDib;
- memset(bih, 0, sizeof(BITMAPINFOHEADER));
- bih->biSize = sizeof(BITMAPINFOHEADER);
- bih->biWidth = ddsd.dwWidth;
- bih->biHeight = ddsd.dwHeight;
- bih->biBitCount = 32;
- bih->biPlanes = 1;
- bih->biSizeImage = bih->biWidth*bih->biHeight*bih->biBitCount>>3;
-
- BitBltFromRGBToRGB(
- bih->biWidth, bih->biHeight,
- (BYTE*)(bih + 1), bih->biWidth*bih->biBitCount>>3, bih->biBitCount,
- (BYTE*)ddsd.lpSurface + ddsd.lPitch*(ddsd.dwHeight-1), -(int)ddsd.lPitch, ddsd.ddpfPixelFormat.dwRGBBitCount);
-
- m_pVideoSurface->Unlock(NULL);
-
- /*
- BitBltFromRGBToRGB(
- w, h,
- (BYTE*)ddsd.lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRGBBitCount,
- (BYTE*)bm.bmBits, bm.bmWidthBytes, bm.bmBitsPixel);
- m_pVideoSurfaceOff->Unlock(NULL);
- fOk = true;
- }
- */
-
- return S_OK;
+ CheckPointer(size, E_POINTER);
+
+ HRESULT hr;
+
+ DDSURFACEDESC2 ddsd;
+ INITDDSTRUCT(ddsd);
+ if (FAILED(m_pVideoSurface->GetSurfaceDesc(&ddsd))) {
+ return E_FAIL;
+ }
+
+ if (ddsd.ddpfPixelFormat.dwRGBBitCount != 16 && ddsd.ddpfPixelFormat.dwRGBBitCount != 32) {
+ return E_FAIL;
+ }
+
+ DWORD required = sizeof(BITMAPINFOHEADER) + (ddsd.dwWidth * ddsd.dwHeight * 32 >> 3);
+ if (!lpDib) {
+ *size = required;
+ return S_OK;
+ }
+ if (*size < required) {
+ return E_OUTOFMEMORY;
+ }
+ *size = required;
+
+ INITDDSTRUCT(ddsd);
+ if (FAILED(hr = m_pVideoSurface->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_READONLY | DDLOCK_NOSYSLOCK, NULL))) {
+ // TODO
+ return hr;
+ }
+
+ BITMAPINFOHEADER* bih = (BITMAPINFOHEADER*)lpDib;
+ memset(bih, 0, sizeof(BITMAPINFOHEADER));
+ bih->biSize = sizeof(BITMAPINFOHEADER);
+ bih->biWidth = ddsd.dwWidth;
+ bih->biHeight = ddsd.dwHeight;
+ bih->biBitCount = 32;
+ bih->biPlanes = 1;
+ bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount >> 3;
+
+ BitBltFromRGBToRGB(
+ bih->biWidth, bih->biHeight,
+ (BYTE*)(bih + 1), bih->biWidth * bih->biBitCount >> 3, bih->biBitCount,
+ (BYTE*)ddsd.lpSurface + ddsd.lPitch * (ddsd.dwHeight - 1), -(int)ddsd.lPitch, ddsd.ddpfPixelFormat.dwRGBBitCount);
+
+ m_pVideoSurface->Unlock(NULL);
+
+ /*
+ BitBltFromRGBToRGB(
+ w, h,
+ (BYTE*)ddsd.lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRGBBitCount,
+ (BYTE*)bm.bmBits, bm.bmWidthBytes, bm.bmBitsPixel);
+ m_pVideoSurfaceOff->Unlock(NULL);
+ fOk = true;
+ }
+ */
+
+ return S_OK;
}
diff --git a/src/filters/renderer/VideoRenderers/DX7AllocatorPresenter.h b/src/filters/renderer/VideoRenderers/DX7AllocatorPresenter.h
index 5e1ec29d2..4f098ec27 100644
--- a/src/filters/renderer/VideoRenderers/DX7AllocatorPresenter.h
+++ b/src/filters/renderer/VideoRenderers/DX7AllocatorPresenter.h
@@ -31,36 +31,36 @@
namespace DSObjects
{
- class CDX7AllocatorPresenter
- : public CSubPicAllocatorPresenterImpl
- {
- protected:
- CSize m_ScreenSize;
+ class CDX7AllocatorPresenter
+ : public CSubPicAllocatorPresenterImpl
+ {
+ protected:
+ CSize m_ScreenSize;
- CComPtr<IDirectDraw7> m_pDD;
- CComQIPtr<IDirect3D7, &IID_IDirect3D7> m_pD3D;
- CComPtr<IDirect3DDevice7> m_pD3DDev;
+ CComPtr<IDirectDraw7> m_pDD;
+ CComQIPtr<IDirect3D7, &IID_IDirect3D7> m_pD3D;
+ CComPtr<IDirect3DDevice7> m_pD3DDev;
- CComPtr<IDirectDrawSurface7> m_pPrimary;
- CComPtr<IDirectDrawSurface7> m_pBackBuffer;
- CComPtr<IDirectDrawSurface7> m_pVideoTexture;
- CComPtr<IDirectDrawSurface7> m_pVideoSurface;
+ CComPtr<IDirectDrawSurface7> m_pPrimary;
+ CComPtr<IDirectDrawSurface7> m_pBackBuffer;
+ CComPtr<IDirectDrawSurface7> m_pVideoTexture;
+ CComPtr<IDirectDrawSurface7> m_pVideoSurface;
- virtual HRESULT CreateDevice();
- virtual HRESULT AllocSurfaces();
- virtual void DeleteSurfaces();
+ virtual HRESULT CreateDevice();
+ virtual HRESULT AllocSurfaces();
+ virtual void DeleteSurfaces();
- void SendResetRequest();
+ void SendResetRequest();
- public:
- CDX7AllocatorPresenter(HWND hWnd, HRESULT& hr);
+ public:
+ CDX7AllocatorPresenter(HWND hWnd, HRESULT& hr);
- // ISubPicAllocatorPresenter
- STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
- STDMETHODIMP_(bool) Paint(bool fAll);
- STDMETHODIMP GetDIB(BYTE* lpDib, DWORD* size);
- STDMETHODIMP_(bool) ResetDevice();
- STDMETHODIMP_(bool) DisplayChange();
- };
+ // ISubPicAllocatorPresenter
+ STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
+ STDMETHODIMP_(bool) Paint(bool fAll);
+ STDMETHODIMP GetDIB(BYTE* lpDib, DWORD* size);
+ STDMETHODIMP_(bool) ResetDevice();
+ STDMETHODIMP_(bool) DisplayChange();
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/DX9AllocatorPresenter.cpp b/src/filters/renderer/VideoRenderers/DX9AllocatorPresenter.cpp
index 61f53b161..4a3585b46 100644
--- a/src/filters/renderer/VideoRenderers/DX9AllocatorPresenter.cpp
+++ b/src/filters/renderer/VideoRenderers/DX9AllocatorPresenter.cpp
@@ -37,163 +37,163 @@ bool queue_ffdshow_support = false;
// only for debugging
//#define DISABLE_USING_D3D9EX
-#define FRAMERATE_MAX_DELTA 3000
+#define FRAMERATE_MAX_DELTA 3000
using namespace DSObjects;
// CDX9AllocatorPresenter
-CDX9AllocatorPresenter::CDX9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, bool bIsEVR, CString &_Error)
- : CDX9RenderingEngine(hWnd, hr, &_Error)
- , m_RefreshRate(0)
- , m_nTearingPos(0)
- , m_nVMR9Surfaces(0)
- , m_iVMR9Surface(0)
- , m_rtTimePerFrame(0)
- , m_bInterlaced(false)
- , m_nUsedBuffer(0)
- , m_OrderedPaint(0)
- , m_bCorrectedFrameTime(0)
- , m_FrameTimeCorrection(0)
- , m_LastSampleTime(0)
- , m_LastFrameDuration(0)
- , m_bAlternativeVSync(0)
- , m_bIsEVR(bIsEVR)
- , m_VSyncMode(0)
- , m_TextScale(1.0)
- , m_MainThreadId(0)
- , m_bNeedCheckSample(true)
- , m_pDirectDraw(NULL)
- , m_hVSyncThread(NULL)
- , m_hEvtQuit(NULL)
- , m_bIsFullscreen(bFullscreen)
- , m_Decoder(_T(""))
- , m_nFrameType(PICT_NONE)
+CDX9AllocatorPresenter::CDX9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, bool bIsEVR, CString& _Error)
+ : CDX9RenderingEngine(hWnd, hr, &_Error)
+ , m_RefreshRate(0)
+ , m_nTearingPos(0)
+ , m_nVMR9Surfaces(0)
+ , m_iVMR9Surface(0)
+ , m_rtTimePerFrame(0)
+ , m_bInterlaced(false)
+ , m_nUsedBuffer(0)
+ , m_OrderedPaint(0)
+ , m_bCorrectedFrameTime(0)
+ , m_FrameTimeCorrection(0)
+ , m_LastSampleTime(0)
+ , m_LastFrameDuration(0)
+ , m_bAlternativeVSync(0)
+ , m_bIsEVR(bIsEVR)
+ , m_VSyncMode(0)
+ , m_TextScale(1.0)
+ , m_MainThreadId(0)
+ , m_bNeedCheckSample(true)
+ , m_pDirectDraw(NULL)
+ , m_hVSyncThread(NULL)
+ , m_hEvtQuit(NULL)
+ , m_bIsFullscreen(bFullscreen)
+ , m_Decoder(_T(""))
+ , m_nFrameType(PICT_NONE)
{
- HINSTANCE hDll;
-
- if (FAILED(hr)) {
- _Error += L"ISubPicAllocatorPresenterImpl failed\n";
- return;
- }
-
- m_pD3DXLoadSurfaceFromMemory = NULL;
- m_pD3DXLoadSurfaceFromSurface = NULL;
- m_pD3DXCreateLine = NULL;
- m_pD3DXCreateFont = NULL;
- m_pD3DXCreateSprite = NULL;
- hDll = GetRenderersData()->GetD3X9Dll();
- if (hDll) {
- (FARPROC&)m_pD3DXLoadSurfaceFromMemory = GetProcAddress(hDll, "D3DXLoadSurfaceFromMemory");
- (FARPROC&)m_pD3DXLoadSurfaceFromSurface = GetProcAddress(hDll, "D3DXLoadSurfaceFromSurface");
- (FARPROC&)m_pD3DXCreateLine = GetProcAddress(hDll, "D3DXCreateLine");
- (FARPROC&)m_pD3DXCreateFont = GetProcAddress(hDll, "D3DXCreateFontW");
- (FARPROC&)m_pD3DXCreateSprite = GetProcAddress(hDll, "D3DXCreateSprite");
- } else {
- _Error += L"The installed DirectX End-User Runtime is outdated. Please download and install the ";
- _Error += MPC_DX_SDK_MONTH " " MAKE_STR(MPC_DX_SDK_YEAR);
- _Error += L" release or newer in order for MPC-HC to function properly.\n";
- }
-
- m_pDwmIsCompositionEnabled = NULL;
- m_pDwmEnableComposition = NULL;
- m_hDWMAPI = LoadLibrary(L"dwmapi.dll");
- if (m_hDWMAPI) {
- (FARPROC &)m_pDwmIsCompositionEnabled = GetProcAddress(m_hDWMAPI, "DwmIsCompositionEnabled");
- (FARPROC &)m_pDwmEnableComposition = GetProcAddress(m_hDWMAPI, "DwmEnableComposition");
- }
-
- m_pDirect3DCreate9Ex = NULL;
- m_hD3D9 = LoadLibrary(L"d3d9.dll");
+ HINSTANCE hDll;
+
+ if (FAILED(hr)) {
+ _Error += L"ISubPicAllocatorPresenterImpl failed\n";
+ return;
+ }
+
+ m_pD3DXLoadSurfaceFromMemory = NULL;
+ m_pD3DXLoadSurfaceFromSurface = NULL;
+ m_pD3DXCreateLine = NULL;
+ m_pD3DXCreateFont = NULL;
+ m_pD3DXCreateSprite = NULL;
+ hDll = GetRenderersData()->GetD3X9Dll();
+ if (hDll) {
+ (FARPROC&)m_pD3DXLoadSurfaceFromMemory = GetProcAddress(hDll, "D3DXLoadSurfaceFromMemory");
+ (FARPROC&)m_pD3DXLoadSurfaceFromSurface = GetProcAddress(hDll, "D3DXLoadSurfaceFromSurface");
+ (FARPROC&)m_pD3DXCreateLine = GetProcAddress(hDll, "D3DXCreateLine");
+ (FARPROC&)m_pD3DXCreateFont = GetProcAddress(hDll, "D3DXCreateFontW");
+ (FARPROC&)m_pD3DXCreateSprite = GetProcAddress(hDll, "D3DXCreateSprite");
+ } else {
+ _Error += L"The installed DirectX End-User Runtime is outdated. Please download and install the ";
+ _Error += MPC_DX_SDK_MONTH " " MAKE_STR(MPC_DX_SDK_YEAR);
+ _Error += L" release or newer in order for MPC-HC to function properly.\n";
+ }
+
+ m_pDwmIsCompositionEnabled = NULL;
+ m_pDwmEnableComposition = NULL;
+ m_hDWMAPI = LoadLibrary(L"dwmapi.dll");
+ if (m_hDWMAPI) {
+ (FARPROC&)m_pDwmIsCompositionEnabled = GetProcAddress(m_hDWMAPI, "DwmIsCompositionEnabled");
+ (FARPROC&)m_pDwmEnableComposition = GetProcAddress(m_hDWMAPI, "DwmEnableComposition");
+ }
+
+ m_pDirect3DCreate9Ex = NULL;
+ m_hD3D9 = LoadLibrary(L"d3d9.dll");
#ifndef DISABLE_USING_D3D9EX
- if (m_hD3D9) {
- (FARPROC &)m_pDirect3DCreate9Ex = GetProcAddress(m_hD3D9, "Direct3DCreate9Ex");
- }
+ if (m_hD3D9) {
+ (FARPROC&)m_pDirect3DCreate9Ex = GetProcAddress(m_hD3D9, "Direct3DCreate9Ex");
+ }
#endif
- if (m_pDirect3DCreate9Ex) {
- m_pDirect3DCreate9Ex(D3D_SDK_VERSION, &m_pD3DEx);
- if (!m_pD3DEx) {
- m_pDirect3DCreate9Ex(D3D9b_SDK_VERSION, &m_pD3DEx);
- }
- }
- if (!m_pD3DEx) {
- m_pD3D.Attach(Direct3DCreate9(D3D_SDK_VERSION));
- if (!m_pD3D) {
- m_pD3D.Attach(Direct3DCreate9(D3D9b_SDK_VERSION));
- }
- } else {
- m_pD3D = m_pD3DEx;
- }
-
- m_DetectedFrameRate = 0.0;
- m_DetectedFrameTime = 0.0;
- m_DetectedFrameTimeStdDev = 0.0;
- m_DetectedLock = false;
- ZeroMemory(m_DetectedFrameTimeHistory, sizeof(m_DetectedFrameTimeHistory));
- ZeroMemory(m_DetectedFrameTimeHistoryHistory, sizeof(m_DetectedFrameTimeHistoryHistory));
- m_DetectedFrameTimePos = 0;
- ZeroMemory(&m_VMR9AlphaBitmap, sizeof(m_VMR9AlphaBitmap));
-
- ZeroMemory(m_ldDetectedRefreshRateList, sizeof(m_ldDetectedRefreshRateList));
- ZeroMemory(m_ldDetectedScanlineRateList, sizeof(m_ldDetectedScanlineRateList));
- m_DetectedRefreshRatePos = 0;
- m_DetectedRefreshTimePrim = 0;
- m_DetectedScanlineTime = 0;
- m_DetectedScanlineTimePrim = 0;
- m_DetectedRefreshRate = 0;
- CRenderersSettings& s = GetRenderersSettings();
-
- if (s.m_RenderSettings.iVMRDisableDesktopComposition) {
- m_bDesktopCompositionDisabled = true;
- if (m_pDwmEnableComposition) {
- m_pDwmEnableComposition(0);
- }
- } else {
- m_bDesktopCompositionDisabled = false;
- }
-
- hr = CreateDevice(_Error);
-
- memset (m_pllJitter, 0, sizeof(m_pllJitter));
- memset (m_pllSyncOffset, 0, sizeof(m_pllSyncOffset));
- m_nNextJitter = 0;
- m_nNextSyncOffset = 0;
- m_llLastPerf = 0;
- m_fAvrFps = 0.0;
- m_fJitterStdDev = 0.0;
- m_fSyncOffsetStdDev = 0.0;
- m_fSyncOffsetAvr = 0.0;
- m_bSyncStatsAvailable = false;
+ if (m_pDirect3DCreate9Ex) {
+ m_pDirect3DCreate9Ex(D3D_SDK_VERSION, &m_pD3DEx);
+ if (!m_pD3DEx) {
+ m_pDirect3DCreate9Ex(D3D9b_SDK_VERSION, &m_pD3DEx);
+ }
+ }
+ if (!m_pD3DEx) {
+ m_pD3D.Attach(Direct3DCreate9(D3D_SDK_VERSION));
+ if (!m_pD3D) {
+ m_pD3D.Attach(Direct3DCreate9(D3D9b_SDK_VERSION));
+ }
+ } else {
+ m_pD3D = m_pD3DEx;
+ }
+
+ m_DetectedFrameRate = 0.0;
+ m_DetectedFrameTime = 0.0;
+ m_DetectedFrameTimeStdDev = 0.0;
+ m_DetectedLock = false;
+ ZeroMemory(m_DetectedFrameTimeHistory, sizeof(m_DetectedFrameTimeHistory));
+ ZeroMemory(m_DetectedFrameTimeHistoryHistory, sizeof(m_DetectedFrameTimeHistoryHistory));
+ m_DetectedFrameTimePos = 0;
+ ZeroMemory(&m_VMR9AlphaBitmap, sizeof(m_VMR9AlphaBitmap));
+
+ ZeroMemory(m_ldDetectedRefreshRateList, sizeof(m_ldDetectedRefreshRateList));
+ ZeroMemory(m_ldDetectedScanlineRateList, sizeof(m_ldDetectedScanlineRateList));
+ m_DetectedRefreshRatePos = 0;
+ m_DetectedRefreshTimePrim = 0;
+ m_DetectedScanlineTime = 0;
+ m_DetectedScanlineTimePrim = 0;
+ m_DetectedRefreshRate = 0;
+ CRenderersSettings& s = GetRenderersSettings();
+
+ if (s.m_RenderSettings.iVMRDisableDesktopComposition) {
+ m_bDesktopCompositionDisabled = true;
+ if (m_pDwmEnableComposition) {
+ m_pDwmEnableComposition(0);
+ }
+ } else {
+ m_bDesktopCompositionDisabled = false;
+ }
+
+ hr = CreateDevice(_Error);
+
+ memset(m_pllJitter, 0, sizeof(m_pllJitter));
+ memset(m_pllSyncOffset, 0, sizeof(m_pllSyncOffset));
+ m_nNextJitter = 0;
+ m_nNextSyncOffset = 0;
+ m_llLastPerf = 0;
+ m_fAvrFps = 0.0;
+ m_fJitterStdDev = 0.0;
+ m_fSyncOffsetStdDev = 0.0;
+ m_fSyncOffsetAvr = 0.0;
+ m_bSyncStatsAvailable = false;
}
CDX9AllocatorPresenter::~CDX9AllocatorPresenter()
{
- if (m_bDesktopCompositionDisabled) {
- m_bDesktopCompositionDisabled = false;
- if (m_pDwmEnableComposition) {
- m_pDwmEnableComposition(1);
- }
- }
-
- StopWorkerThreads();
- m_pFont = NULL;
- m_pLine = NULL;
- m_pD3DDev = NULL;
- m_pD3DDevEx = NULL;
-
- CleanupRenderingEngine();
-
- m_pD3D = NULL;
- m_pD3DEx = NULL;
- if (m_hDWMAPI) {
- FreeLibrary(m_hDWMAPI);
- m_hDWMAPI = NULL;
- }
- if (m_hD3D9) {
- FreeLibrary(m_hD3D9);
- m_hD3D9 = NULL;
- }
+ if (m_bDesktopCompositionDisabled) {
+ m_bDesktopCompositionDisabled = false;
+ if (m_pDwmEnableComposition) {
+ m_pDwmEnableComposition(1);
+ }
+ }
+
+ StopWorkerThreads();
+ m_pFont = NULL;
+ m_pLine = NULL;
+ m_pD3DDev = NULL;
+ m_pD3DDevEx = NULL;
+
+ CleanupRenderingEngine();
+
+ m_pD3D = NULL;
+ m_pD3DEx = NULL;
+ if (m_hDWMAPI) {
+ FreeLibrary(m_hDWMAPI);
+ m_hDWMAPI = NULL;
+ }
+ if (m_hD3D9) {
+ FreeLibrary(m_hD3D9);
+ m_hD3D9 = NULL;
+ }
}
void ModerateFloat(double& Value, double Target, double& ValuePrim, double ChangeSpeed);
@@ -203,2192 +203,2192 @@ class CRandom31
{
public:
- CRandom31() {
- m_Seed = 12164;
- }
-
- void f_SetSeed(int32 _Seed) {
- m_Seed = _Seed;
- }
- int32 f_GetSeed() {
- return m_Seed;
- }
- /*
- Park and Miller's psuedo-random number generator.
- */
- int32 m_Seed;
- int32 f_Get() {
- static const int32 A = 16807;
- static const int32 M = 2147483647; // 2^31 - 1
- static const int32 q = M / A; // M / A
- static const int32 r = M % A; // M % A
- m_Seed = A * (m_Seed % q) - r * (m_Seed / q);
- if (m_Seed < 0) {
- m_Seed += M;
- }
- return m_Seed;
- }
-
- static int32 fs_Max() {
- return 2147483646;
- }
-
- double f_GetFloat() {
- return double(f_Get()) * (1.0 / double(fs_Max()));
- }
+ CRandom31() {
+ m_Seed = 12164;
+ }
+
+ void f_SetSeed(int32 _Seed) {
+ m_Seed = _Seed;
+ }
+ int32 f_GetSeed() {
+ return m_Seed;
+ }
+ /*
+ Park and Miller's psuedo-random number generator.
+ */
+ int32 m_Seed;
+ int32 f_Get() {
+ static const int32 A = 16807;
+ static const int32 M = 2147483647; // 2^31 - 1
+ static const int32 q = M / A; // M / A
+ static const int32 r = M % A; // M % A
+ m_Seed = A * (m_Seed % q) - r * (m_Seed / q);
+ if (m_Seed < 0) {
+ m_Seed += M;
+ }
+ return m_Seed;
+ }
+
+ static int32 fs_Max() {
+ return 2147483646;
+ }
+
+ double f_GetFloat() {
+ return double(f_Get()) * (1.0 / double(fs_Max()));
+ }
};
class CVSyncEstimation
{
private:
- class CHistoryEntry
- {
- public:
- CHistoryEntry() {
- m_Time = 0;
- m_ScanLine = -1;
- }
- LONGLONG m_Time;
- int m_ScanLine;
- };
-
- class CSolution
- {
- public:
- CSolution() {
- m_ScanLines = 1000;
- m_ScanLinesPerSecond = m_ScanLines * 100;
- }
- int m_ScanLines;
- double m_ScanLinesPerSecond;
- double m_SqrSum;
-
- void f_Mutate(double _Amount, CRandom31 &_Random, int _MinScans) {
- int ToDo = _Random.f_Get() % 10;
- if (ToDo == 0) {
- m_ScanLines = m_ScanLines / 2;
- } else if (ToDo == 1) {
- m_ScanLines = m_ScanLines * 2;
- }
-
- m_ScanLines = m_ScanLines * (1.0 + (_Random.f_GetFloat() * _Amount) - _Amount * 0.5);
- m_ScanLines = max(m_ScanLines, _MinScans);
-
- if (ToDo == 2) {
- m_ScanLinesPerSecond /= (_Random.f_Get() % 4) + 1;
- } else if (ToDo == 3) {
- m_ScanLinesPerSecond *= (_Random.f_Get() % 4) + 1;
- }
-
- m_ScanLinesPerSecond *= 1.0 + (_Random.f_GetFloat() * _Amount) - _Amount * 0.5;
- }
-
- void f_SpawnInto(CSolution &_Other, CRandom31 &_Random, int _MinScans) {
- _Other = *this;
- _Other.f_Mutate(_Random.f_GetFloat() * 0.1, _Random, _MinScans);
- }
-
- static int fs_Compare(const void *_pFirst, const void *_pSecond) {
- const CSolution *pFirst = (const CSolution *)_pFirst;
- const CSolution *pSecond = (const CSolution *)_pSecond;
- if (pFirst->m_SqrSum < pSecond->m_SqrSum) {
- return -1;
- } else if (pFirst->m_SqrSum > pSecond->m_SqrSum) {
- return 1;
- }
- return 0;
- }
-
-
- };
-
- enum {
- ENumHistory = 128
- };
-
- CHistoryEntry m_History[ENumHistory];
- int m_iHistory;
- CSolution m_OldSolutions[2];
-
- CRandom31 m_Random;
-
-
- double fp_GetSquareSum(double _ScansPerSecond, double _ScanLines) {
- double SquareSum = 0;
- int nHistory = min(m_nHistory, ENumHistory);
- int iHistory = m_iHistory - nHistory;
- if (iHistory < 0) {
- iHistory += ENumHistory;
- }
- for (int i = 1; i < nHistory; ++i) {
- int iHistory0 = iHistory + i - 1;
- int iHistory1 = iHistory + i;
- if (iHistory0 < 0) {
- iHistory0 += ENumHistory;
- }
- iHistory0 = iHistory0 % ENumHistory;
- iHistory1 = iHistory1 % ENumHistory;
- ASSERT(m_History[iHistory0].m_Time != 0);
- ASSERT(m_History[iHistory1].m_Time != 0);
-
- double DeltaTime = (m_History[iHistory1].m_Time - m_History[iHistory0].m_Time)/10000000.0;
- double PredictedScanLine = m_History[iHistory0].m_ScanLine + DeltaTime * _ScansPerSecond;
- PredictedScanLine = fmod(PredictedScanLine, _ScanLines);
- double Delta = (m_History[iHistory1].m_ScanLine - PredictedScanLine);
- double DeltaSqr = Delta * Delta;
- SquareSum += DeltaSqr;
- }
- return SquareSum;
- }
-
- int m_nHistory;
+ class CHistoryEntry
+ {
+ public:
+ CHistoryEntry() {
+ m_Time = 0;
+ m_ScanLine = -1;
+ }
+ LONGLONG m_Time;
+ int m_ScanLine;
+ };
+
+ class CSolution
+ {
+ public:
+ CSolution() {
+ m_ScanLines = 1000;
+ m_ScanLinesPerSecond = m_ScanLines * 100;
+ }
+ int m_ScanLines;
+ double m_ScanLinesPerSecond;
+ double m_SqrSum;
+
+ void f_Mutate(double _Amount, CRandom31& _Random, int _MinScans) {
+ int ToDo = _Random.f_Get() % 10;
+ if (ToDo == 0) {
+ m_ScanLines = m_ScanLines / 2;
+ } else if (ToDo == 1) {
+ m_ScanLines = m_ScanLines * 2;
+ }
+
+ m_ScanLines = m_ScanLines * (1.0 + (_Random.f_GetFloat() * _Amount) - _Amount * 0.5);
+ m_ScanLines = max(m_ScanLines, _MinScans);
+
+ if (ToDo == 2) {
+ m_ScanLinesPerSecond /= (_Random.f_Get() % 4) + 1;
+ } else if (ToDo == 3) {
+ m_ScanLinesPerSecond *= (_Random.f_Get() % 4) + 1;
+ }
+
+ m_ScanLinesPerSecond *= 1.0 + (_Random.f_GetFloat() * _Amount) - _Amount * 0.5;
+ }
+
+ void f_SpawnInto(CSolution& _Other, CRandom31& _Random, int _MinScans) {
+ _Other = *this;
+ _Other.f_Mutate(_Random.f_GetFloat() * 0.1, _Random, _MinScans);
+ }
+
+ static int fs_Compare(const void* _pFirst, const void* _pSecond) {
+ const CSolution* pFirst = (const CSolution*)_pFirst;
+ const CSolution* pSecond = (const CSolution*)_pSecond;
+ if (pFirst->m_SqrSum < pSecond->m_SqrSum) {
+ return -1;
+ } else if (pFirst->m_SqrSum > pSecond->m_SqrSum) {
+ return 1;
+ }
+ return 0;
+ }
+
+
+ };
+
+ enum {
+ ENumHistory = 128
+ };
+
+ CHistoryEntry m_History[ENumHistory];
+ int m_iHistory;
+ CSolution m_OldSolutions[2];
+
+ CRandom31 m_Random;
+
+
+ double fp_GetSquareSum(double _ScansPerSecond, double _ScanLines) {
+ double SquareSum = 0;
+ int nHistory = min(m_nHistory, ENumHistory);
+ int iHistory = m_iHistory - nHistory;
+ if (iHistory < 0) {
+ iHistory += ENumHistory;
+ }
+ for (int i = 1; i < nHistory; ++i) {
+ int iHistory0 = iHistory + i - 1;
+ int iHistory1 = iHistory + i;
+ if (iHistory0 < 0) {
+ iHistory0 += ENumHistory;
+ }
+ iHistory0 = iHistory0 % ENumHistory;
+ iHistory1 = iHistory1 % ENumHistory;
+ ASSERT(m_History[iHistory0].m_Time != 0);
+ ASSERT(m_History[iHistory1].m_Time != 0);
+
+ double DeltaTime = (m_History[iHistory1].m_Time - m_History[iHistory0].m_Time) / 10000000.0;
+ double PredictedScanLine = m_History[iHistory0].m_ScanLine + DeltaTime * _ScansPerSecond;
+ PredictedScanLine = fmod(PredictedScanLine, _ScanLines);
+ double Delta = (m_History[iHistory1].m_ScanLine - PredictedScanLine);
+ double DeltaSqr = Delta * Delta;
+ SquareSum += DeltaSqr;
+ }
+ return SquareSum;
+ }
+
+ int m_nHistory;
public:
- CVSyncEstimation() {
- m_iHistory = 0;
- m_nHistory = 0;
- }
-
- void f_AddSample(int _ScanLine, LONGLONG _Time) {
- m_History[m_iHistory].m_ScanLine = _ScanLine;
- m_History[m_iHistory].m_Time = _Time;
- ++m_nHistory;
- m_iHistory = (m_iHistory + 1) % ENumHistory;
- }
-
- void f_GetEstimation(double &_RefreshRate, int &_ScanLines, int _ScreenSizeY, int _WindowsRefreshRate) {
- _RefreshRate = 0;
- _ScanLines = 0;
-
- int iHistory = m_iHistory;
- // We have a full history
- if (m_nHistory > 10) {
- for (int l = 0; l < 5; ++l) {
- const int nSol = 3+5+5+3;
- CSolution Solutions[nSol];
-
- Solutions[0] = m_OldSolutions[0];
- Solutions[1] = m_OldSolutions[1];
- Solutions[2].m_ScanLines = _ScreenSizeY;
- Solutions[2].m_ScanLinesPerSecond = _ScreenSizeY * _WindowsRefreshRate;
-
- int iStart = 3;
- for (int i = iStart; i < iStart + 5; ++i) {
- Solutions[0].f_SpawnInto(Solutions[i], m_Random, _ScreenSizeY);
- }
- iStart += 5;
- for (int i = iStart; i < iStart + 5; ++i) {
- Solutions[1].f_SpawnInto(Solutions[i], m_Random, _ScreenSizeY);
- }
- iStart += 5;
- for (int i = iStart; i < iStart + 3; ++i) {
- Solutions[2].f_SpawnInto(Solutions[i], m_Random, _ScreenSizeY);
- }
-
- int Start = 2;
- if (l == 0) {
- Start = 0;
- }
- for (int i = Start; i < nSol; ++i) {
- Solutions[i].m_SqrSum = fp_GetSquareSum(Solutions[i].m_ScanLinesPerSecond, Solutions[i].m_ScanLines);
- }
-
- qsort(Solutions, nSol, sizeof(Solutions[0]), &CSolution::fs_Compare);
- for (int i = 0; i < 2; ++i) {
- m_OldSolutions[i] = Solutions[i];
- }
- }
-
- _ScanLines = m_OldSolutions[0].m_ScanLines + 0.5;
- _RefreshRate = 1.0 / (m_OldSolutions[0].m_ScanLines / m_OldSolutions[0].m_ScanLinesPerSecond);
- } else {
- m_OldSolutions[0].m_ScanLines = _ScreenSizeY;
- m_OldSolutions[1].m_ScanLines = _ScreenSizeY;
- }
- }
+ CVSyncEstimation() {
+ m_iHistory = 0;
+ m_nHistory = 0;
+ }
+
+ void f_AddSample(int _ScanLine, LONGLONG _Time) {
+ m_History[m_iHistory].m_ScanLine = _ScanLine;
+ m_History[m_iHistory].m_Time = _Time;
+ ++m_nHistory;
+ m_iHistory = (m_iHistory + 1) % ENumHistory;
+ }
+
+ void f_GetEstimation(double& _RefreshRate, int& _ScanLines, int _ScreenSizeY, int _WindowsRefreshRate) {
+ _RefreshRate = 0;
+ _ScanLines = 0;
+
+ int iHistory = m_iHistory;
+ // We have a full history
+ if (m_nHistory > 10) {
+ for (int l = 0; l < 5; ++l) {
+ const int nSol = 3 + 5 + 5 + 3;
+ CSolution Solutions[nSol];
+
+ Solutions[0] = m_OldSolutions[0];
+ Solutions[1] = m_OldSolutions[1];
+ Solutions[2].m_ScanLines = _ScreenSizeY;
+ Solutions[2].m_ScanLinesPerSecond = _ScreenSizeY * _WindowsRefreshRate;
+
+ int iStart = 3;
+ for (int i = iStart; i < iStart + 5; ++i) {
+ Solutions[0].f_SpawnInto(Solutions[i], m_Random, _ScreenSizeY);
+ }
+ iStart += 5;
+ for (int i = iStart; i < iStart + 5; ++i) {
+ Solutions[1].f_SpawnInto(Solutions[i], m_Random, _ScreenSizeY);
+ }
+ iStart += 5;
+ for (int i = iStart; i < iStart + 3; ++i) {
+ Solutions[2].f_SpawnInto(Solutions[i], m_Random, _ScreenSizeY);
+ }
+
+ int Start = 2;
+ if (l == 0) {
+ Start = 0;
+ }
+ for (int i = Start; i < nSol; ++i) {
+ Solutions[i].m_SqrSum = fp_GetSquareSum(Solutions[i].m_ScanLinesPerSecond, Solutions[i].m_ScanLines);
+ }
+
+ qsort(Solutions, nSol, sizeof(Solutions[0]), &CSolution::fs_Compare);
+ for (int i = 0; i < 2; ++i) {
+ m_OldSolutions[i] = Solutions[i];
+ }
+ }
+
+ _ScanLines = m_OldSolutions[0].m_ScanLines + 0.5;
+ _RefreshRate = 1.0 / (m_OldSolutions[0].m_ScanLines / m_OldSolutions[0].m_ScanLinesPerSecond);
+ } else {
+ m_OldSolutions[0].m_ScanLines = _ScreenSizeY;
+ m_OldSolutions[1].m_ScanLines = _ScreenSizeY;
+ }
+ }
};
#endif
void CDX9AllocatorPresenter::VSyncThread()
{
- HANDLE hEvts[] = { m_hEvtQuit};
- bool bQuit = false;
- TIMECAPS tc;
- DWORD dwResolution;
- DWORD dwUser = 0;
-
- //DWORD dwTaskIndex = 0;
- //// Tell Vista Multimedia Class Scheduler we are a playback thread (increase priority)
- //if (pfAvSetMmThreadCharacteristicsW)
- // hAvrt = pfAvSetMmThreadCharacteristicsW (L"Playback", &dwTaskIndex);
- //if (pfAvSetMmThreadPriority)
- // pfAvSetMmThreadPriority (hAvrt, AVRT_PRIORITY_HIGH /*AVRT_PRIORITY_CRITICAL*/);
-
- timeGetDevCaps(&tc, sizeof(TIMECAPS));
- dwResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
- dwUser = timeBeginPeriod(dwResolution);
- CRenderersData *pApp = GetRenderersData();
- CRenderersSettings& s = GetRenderersSettings();
-
- while (!bQuit) {
-
- DWORD dwObject = WaitForMultipleObjects (_countof(hEvts), hEvts, FALSE, 1);
- switch (dwObject) {
- case WAIT_OBJECT_0 :
- bQuit = true;
- break;
- case WAIT_TIMEOUT : {
- // Do our stuff
- if (m_pD3DDev && s.m_RenderSettings.iVMR9VSync) {
-
- int VSyncPos = GetVBlackPos();
- int WaitRange = max(m_ScreenSize.cy / 40, 5);
- int MinRange = max(min(int(0.003 * double(m_ScreenSize.cy) * double(m_RefreshRate) + 0.5), m_ScreenSize.cy/3), 5); // 1.8 ms or max 33 % of Time
-
- VSyncPos += MinRange + WaitRange;
-
- VSyncPos = VSyncPos % m_ScreenSize.cy;
- if (VSyncPos < 0) {
- VSyncPos += m_ScreenSize.cy;
- }
-
- int ScanLine = 0;
- int StartScanLine = ScanLine;
- UNREFERENCED_PARAMETER(StartScanLine);
- int LastPos = ScanLine;
- UNREFERENCED_PARAMETER(LastPos);
- ScanLine = (VSyncPos + 1) % m_ScreenSize.cy;
- if (ScanLine < 0) {
- ScanLine += m_ScreenSize.cy;
- }
- int ScanLineMiddle = ScanLine + m_ScreenSize.cy/2;
- ScanLineMiddle = ScanLineMiddle % m_ScreenSize.cy;
- if (ScanLineMiddle < 0) {
- ScanLineMiddle += m_ScreenSize.cy;
- }
-
- int ScanlineStart = ScanLine;
- bool bTakenLock;
- WaitForVBlankRange(ScanlineStart, 5, true, true, false, bTakenLock);
- LONGLONG TimeStart = pApp->GetPerfCounter();
-
- WaitForVBlankRange(ScanLineMiddle, 5, true, true, false, bTakenLock);
- LONGLONG TimeMiddle = pApp->GetPerfCounter();
-
- int ScanlineEnd = ScanLine;
- WaitForVBlankRange(ScanlineEnd, 5, true, true, false, bTakenLock);
- LONGLONG TimeEnd = pApp->GetPerfCounter();
-
- double nSeconds = double(TimeEnd - TimeStart) / 10000000.0;
- LONGLONG DiffMiddle = TimeMiddle - TimeStart;
- LONGLONG DiffEnd = TimeEnd - TimeMiddle;
- double DiffDiff;
- if (DiffEnd > DiffMiddle) {
- DiffDiff = double(DiffEnd) / double(DiffMiddle);
- } else {
- DiffDiff = double(DiffMiddle) / double(DiffEnd);
- }
- if (nSeconds > 0.003 && DiffDiff < 1.3) {
- double ScanLineSeconds;
- double nScanLines;
- if (ScanLineMiddle > ScanlineEnd) {
- ScanLineSeconds = double(TimeMiddle - TimeStart) / 10000000.0;
- nScanLines = ScanLineMiddle - ScanlineStart;
- } else {
- ScanLineSeconds = double(TimeEnd - TimeMiddle) / 10000000.0;
- nScanLines = ScanlineEnd - ScanLineMiddle;
- }
-
- double ScanLineTime = ScanLineSeconds / nScanLines;
-
- int iPos = m_DetectedRefreshRatePos % 100;
- m_ldDetectedScanlineRateList[iPos] = ScanLineTime;
- if (m_DetectedScanlineTime && ScanlineStart != ScanlineEnd) {
- int Diff = ScanlineEnd - ScanlineStart;
- nSeconds -= double(Diff) * m_DetectedScanlineTime;
- }
- m_ldDetectedRefreshRateList[iPos] = nSeconds;
- double Average = 0;
- double AverageScanline = 0;
- int nPos = min(iPos + 1, 100);
- for (int i = 0; i < nPos; ++i) {
- Average += m_ldDetectedRefreshRateList[i];
- AverageScanline += m_ldDetectedScanlineRateList[i];
- }
-
- if (nPos) {
- Average /= double(nPos);
- AverageScanline /= double(nPos);
- } else {
- Average = 0;
- AverageScanline = 0;
- }
-
- double ThisValue = Average;
-
- if (Average > 0.0 && AverageScanline > 0.0) {
- CAutoLock Lock(&m_RefreshRateLock);
- ++m_DetectedRefreshRatePos;
- if (m_DetectedRefreshTime == 0 || m_DetectedRefreshTime / ThisValue > 1.01 || m_DetectedRefreshTime / ThisValue < 0.99) {
- m_DetectedRefreshTime = ThisValue;
- m_DetectedRefreshTimePrim = 0;
- }
- if (_isnan(m_DetectedRefreshTime)) {m_DetectedRefreshTime = 0.0;}
- if (_isnan(m_DetectedRefreshTimePrim)) {m_DetectedRefreshTimePrim = 0.0;}
-
- ModerateFloat(m_DetectedRefreshTime, ThisValue, m_DetectedRefreshTimePrim, 1.5);
- if (m_DetectedRefreshTime > 0.0) {
- m_DetectedRefreshRate = 1.0/m_DetectedRefreshTime;
- } else {
- m_DetectedRefreshRate = 0.0;
- }
-
- if (m_DetectedScanlineTime == 0 || m_DetectedScanlineTime / AverageScanline > 1.01 || m_DetectedScanlineTime / AverageScanline < 0.99) {
- m_DetectedScanlineTime = AverageScanline;
- m_DetectedScanlineTimePrim = 0;
- }
- ModerateFloat(m_DetectedScanlineTime, AverageScanline, m_DetectedScanlineTimePrim, 1.5);
- if (m_DetectedScanlineTime > 0.0) {
- m_DetectedScanlinesPerFrame = m_DetectedRefreshTime / m_DetectedScanlineTime;
- } else {
- m_DetectedScanlinesPerFrame = 0;
- }
- }
- //TRACE("Refresh: %f\n", RefreshRate);
- }
- } else {
- m_DetectedRefreshRate = 0.0;
- m_DetectedScanlinesPerFrame = 0.0;
- }
- }
- break;
- }
- }
-
- timeEndPeriod (dwResolution);
- //if (pfAvRevertMmThreadCharacteristics) pfAvRevertMmThreadCharacteristics (hAvrt);
+ HANDLE hEvts[] = { m_hEvtQuit};
+ bool bQuit = false;
+ TIMECAPS tc;
+ DWORD dwResolution;
+ DWORD dwUser = 0;
+
+ //DWORD dwTaskIndex = 0;
+ //// Tell Vista Multimedia Class Scheduler we are a playback thread (increase priority)
+ //if (pfAvSetMmThreadCharacteristicsW)
+ // hAvrt = pfAvSetMmThreadCharacteristicsW (L"Playback", &dwTaskIndex);
+ //if (pfAvSetMmThreadPriority)
+ // pfAvSetMmThreadPriority (hAvrt, AVRT_PRIORITY_HIGH /*AVRT_PRIORITY_CRITICAL*/);
+
+ timeGetDevCaps(&tc, sizeof(TIMECAPS));
+ dwResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
+ dwUser = timeBeginPeriod(dwResolution);
+ CRenderersData* pApp = GetRenderersData();
+ CRenderersSettings& s = GetRenderersSettings();
+
+ while (!bQuit) {
+
+ DWORD dwObject = WaitForMultipleObjects(_countof(hEvts), hEvts, FALSE, 1);
+ switch (dwObject) {
+ case WAIT_OBJECT_0 :
+ bQuit = true;
+ break;
+ case WAIT_TIMEOUT : {
+ // Do our stuff
+ if (m_pD3DDev && s.m_RenderSettings.iVMR9VSync) {
+
+ int VSyncPos = GetVBlackPos();
+ int WaitRange = max(m_ScreenSize.cy / 40, 5);
+ int MinRange = max(min(int(0.003 * double(m_ScreenSize.cy) * double(m_RefreshRate) + 0.5), m_ScreenSize.cy / 3), 5); // 1.8 ms or max 33 % of Time
+
+ VSyncPos += MinRange + WaitRange;
+
+ VSyncPos = VSyncPos % m_ScreenSize.cy;
+ if (VSyncPos < 0) {
+ VSyncPos += m_ScreenSize.cy;
+ }
+
+ int ScanLine = 0;
+ int StartScanLine = ScanLine;
+ UNREFERENCED_PARAMETER(StartScanLine);
+ int LastPos = ScanLine;
+ UNREFERENCED_PARAMETER(LastPos);
+ ScanLine = (VSyncPos + 1) % m_ScreenSize.cy;
+ if (ScanLine < 0) {
+ ScanLine += m_ScreenSize.cy;
+ }
+ int ScanLineMiddle = ScanLine + m_ScreenSize.cy / 2;
+ ScanLineMiddle = ScanLineMiddle % m_ScreenSize.cy;
+ if (ScanLineMiddle < 0) {
+ ScanLineMiddle += m_ScreenSize.cy;
+ }
+
+ int ScanlineStart = ScanLine;
+ bool bTakenLock;
+ WaitForVBlankRange(ScanlineStart, 5, true, true, false, bTakenLock);
+ LONGLONG TimeStart = pApp->GetPerfCounter();
+
+ WaitForVBlankRange(ScanLineMiddle, 5, true, true, false, bTakenLock);
+ LONGLONG TimeMiddle = pApp->GetPerfCounter();
+
+ int ScanlineEnd = ScanLine;
+ WaitForVBlankRange(ScanlineEnd, 5, true, true, false, bTakenLock);
+ LONGLONG TimeEnd = pApp->GetPerfCounter();
+
+ double nSeconds = double(TimeEnd - TimeStart) / 10000000.0;
+ LONGLONG DiffMiddle = TimeMiddle - TimeStart;
+ LONGLONG DiffEnd = TimeEnd - TimeMiddle;
+ double DiffDiff;
+ if (DiffEnd > DiffMiddle) {
+ DiffDiff = double(DiffEnd) / double(DiffMiddle);
+ } else {
+ DiffDiff = double(DiffMiddle) / double(DiffEnd);
+ }
+ if (nSeconds > 0.003 && DiffDiff < 1.3) {
+ double ScanLineSeconds;
+ double nScanLines;
+ if (ScanLineMiddle > ScanlineEnd) {
+ ScanLineSeconds = double(TimeMiddle - TimeStart) / 10000000.0;
+ nScanLines = ScanLineMiddle - ScanlineStart;
+ } else {
+ ScanLineSeconds = double(TimeEnd - TimeMiddle) / 10000000.0;
+ nScanLines = ScanlineEnd - ScanLineMiddle;
+ }
+
+ double ScanLineTime = ScanLineSeconds / nScanLines;
+
+ int iPos = m_DetectedRefreshRatePos % 100;
+ m_ldDetectedScanlineRateList[iPos] = ScanLineTime;
+ if (m_DetectedScanlineTime && ScanlineStart != ScanlineEnd) {
+ int Diff = ScanlineEnd - ScanlineStart;
+ nSeconds -= double(Diff) * m_DetectedScanlineTime;
+ }
+ m_ldDetectedRefreshRateList[iPos] = nSeconds;
+ double Average = 0;
+ double AverageScanline = 0;
+ int nPos = min(iPos + 1, 100);
+ for (int i = 0; i < nPos; ++i) {
+ Average += m_ldDetectedRefreshRateList[i];
+ AverageScanline += m_ldDetectedScanlineRateList[i];
+ }
+
+ if (nPos) {
+ Average /= double(nPos);
+ AverageScanline /= double(nPos);
+ } else {
+ Average = 0;
+ AverageScanline = 0;
+ }
+
+ double ThisValue = Average;
+
+ if (Average > 0.0 && AverageScanline > 0.0) {
+ CAutoLock Lock(&m_RefreshRateLock);
+ ++m_DetectedRefreshRatePos;
+ if (m_DetectedRefreshTime == 0 || m_DetectedRefreshTime / ThisValue > 1.01 || m_DetectedRefreshTime / ThisValue < 0.99) {
+ m_DetectedRefreshTime = ThisValue;
+ m_DetectedRefreshTimePrim = 0;
+ }
+ if (_isnan(m_DetectedRefreshTime)) {m_DetectedRefreshTime = 0.0;}
+ if (_isnan(m_DetectedRefreshTimePrim)) {m_DetectedRefreshTimePrim = 0.0;}
+
+ ModerateFloat(m_DetectedRefreshTime, ThisValue, m_DetectedRefreshTimePrim, 1.5);
+ if (m_DetectedRefreshTime > 0.0) {
+ m_DetectedRefreshRate = 1.0 / m_DetectedRefreshTime;
+ } else {
+ m_DetectedRefreshRate = 0.0;
+ }
+
+ if (m_DetectedScanlineTime == 0 || m_DetectedScanlineTime / AverageScanline > 1.01 || m_DetectedScanlineTime / AverageScanline < 0.99) {
+ m_DetectedScanlineTime = AverageScanline;
+ m_DetectedScanlineTimePrim = 0;
+ }
+ ModerateFloat(m_DetectedScanlineTime, AverageScanline, m_DetectedScanlineTimePrim, 1.5);
+ if (m_DetectedScanlineTime > 0.0) {
+ m_DetectedScanlinesPerFrame = m_DetectedRefreshTime / m_DetectedScanlineTime;
+ } else {
+ m_DetectedScanlinesPerFrame = 0;
+ }
+ }
+ //TRACE("Refresh: %f\n", RefreshRate);
+ }
+ } else {
+ m_DetectedRefreshRate = 0.0;
+ m_DetectedScanlinesPerFrame = 0.0;
+ }
+ }
+ break;
+ }
+ }
+
+ timeEndPeriod(dwResolution);
+ //if (pfAvRevertMmThreadCharacteristics) pfAvRevertMmThreadCharacteristics (hAvrt);
}
DWORD WINAPI CDX9AllocatorPresenter::VSyncThreadStatic(LPVOID lpParam)
{
- SetThreadName((DWORD)-1, "CDX9Presenter::VSyncThread");
- CDX9AllocatorPresenter* pThis = (CDX9AllocatorPresenter*) lpParam;
- pThis->VSyncThread();
- return 0;
+ SetThreadName((DWORD) - 1, "CDX9Presenter::VSyncThread");
+ CDX9AllocatorPresenter* pThis = (CDX9AllocatorPresenter*) lpParam;
+ pThis->VSyncThread();
+ return 0;
}
void CDX9AllocatorPresenter::StartWorkerThreads()
{
- DWORD dwThreadId;
-
- if ( m_bIsEVR ) {
- m_hEvtQuit = CreateEvent( NULL, TRUE, FALSE, NULL );
- if ( m_hEvtQuit != NULL ) { // Don't create a thread with no stop switch
- m_hVSyncThread = ::CreateThread( NULL, 0, VSyncThreadStatic, (LPVOID)this, 0, &dwThreadId );
- if ( m_hVSyncThread != NULL ) {
- SetThreadPriority( m_hVSyncThread, THREAD_PRIORITY_HIGHEST );
- }
- }
- }
+ DWORD dwThreadId;
+
+ if (m_bIsEVR) {
+ m_hEvtQuit = CreateEvent(NULL, TRUE, FALSE, NULL);
+ if (m_hEvtQuit != NULL) { // Don't create a thread with no stop switch
+ m_hVSyncThread = ::CreateThread(NULL, 0, VSyncThreadStatic, (LPVOID)this, 0, &dwThreadId);
+ if (m_hVSyncThread != NULL) {
+ SetThreadPriority(m_hVSyncThread, THREAD_PRIORITY_HIGHEST);
+ }
+ }
+ }
}
void CDX9AllocatorPresenter::StopWorkerThreads()
{
- if ( m_bIsEVR ) {
- if ( m_hEvtQuit != NULL ) {
- SetEvent( m_hEvtQuit );
-
- if ( m_hVSyncThread != NULL ) {
- if ( WaitForSingleObject(m_hVSyncThread, 10000) == WAIT_TIMEOUT ) {
- ASSERT(FALSE);
- TerminateThread( m_hVSyncThread, 0xDEAD );
- }
-
- CloseHandle( m_hVSyncThread );
- m_hVSyncThread = NULL;
- }
-
- CloseHandle( m_hEvtQuit );
- m_hEvtQuit = NULL;
- }
- }
+ if (m_bIsEVR) {
+ if (m_hEvtQuit != NULL) {
+ SetEvent(m_hEvtQuit);
+
+ if (m_hVSyncThread != NULL) {
+ if (WaitForSingleObject(m_hVSyncThread, 10000) == WAIT_TIMEOUT) {
+ ASSERT(FALSE);
+ TerminateThread(m_hVSyncThread, 0xDEAD);
+ }
+
+ CloseHandle(m_hVSyncThread);
+ m_hVSyncThread = NULL;
+ }
+
+ CloseHandle(m_hEvtQuit);
+ m_hEvtQuit = NULL;
+ }
+ }
}
bool CDX9AllocatorPresenter::SettingsNeedResetDevice()
{
- CRenderersSettings& s = GetRenderersSettings();
- CRenderersSettings::CRendererSettingsEVR & New = GetRenderersSettings().m_RenderSettings;
- CRenderersSettings::CRendererSettingsEVR & Current = m_LastRendererSettings;
-
- bool bRet = false;
-
- bRet = bRet || New.fVMR9AlterativeVSync != Current.fVMR9AlterativeVSync;
- bRet = bRet || New.iVMR9VSyncAccurate != Current.iVMR9VSyncAccurate;
-
- if (m_bIsFullscreen) {
- bRet = bRet || New.iVMR9FullscreenGUISupport != Current.iVMR9FullscreenGUISupport;
- } else {
- if (Current.iVMRDisableDesktopComposition) {
- if (!m_bDesktopCompositionDisabled) {
- m_bDesktopCompositionDisabled = true;
- if (m_pDwmEnableComposition) {
- m_pDwmEnableComposition(0);
- }
- }
- } else {
- if (m_bDesktopCompositionDisabled) {
- m_bDesktopCompositionDisabled = false;
- if (m_pDwmEnableComposition) {
- m_pDwmEnableComposition(1);
- }
- }
- }
- }
-
- if (m_bIsEVR) {
- bRet = bRet || New.iEVRHighColorResolution != Current.iEVRHighColorResolution;
- bRet = bRet || New.iEVRForceInputHighColorResolution != Current.iEVRForceInputHighColorResolution;
- }
-
- m_LastRendererSettings = s.m_RenderSettings;
-
- return bRet;
+ CRenderersSettings& s = GetRenderersSettings();
+ CRenderersSettings::CRendererSettingsEVR& New = GetRenderersSettings().m_RenderSettings;
+ CRenderersSettings::CRendererSettingsEVR& Current = m_LastRendererSettings;
+
+ bool bRet = false;
+
+ bRet = bRet || New.fVMR9AlterativeVSync != Current.fVMR9AlterativeVSync;
+ bRet = bRet || New.iVMR9VSyncAccurate != Current.iVMR9VSyncAccurate;
+
+ if (m_bIsFullscreen) {
+ bRet = bRet || New.iVMR9FullscreenGUISupport != Current.iVMR9FullscreenGUISupport;
+ } else {
+ if (Current.iVMRDisableDesktopComposition) {
+ if (!m_bDesktopCompositionDisabled) {
+ m_bDesktopCompositionDisabled = true;
+ if (m_pDwmEnableComposition) {
+ m_pDwmEnableComposition(0);
+ }
+ }
+ } else {
+ if (m_bDesktopCompositionDisabled) {
+ m_bDesktopCompositionDisabled = false;
+ if (m_pDwmEnableComposition) {
+ m_pDwmEnableComposition(1);
+ }
+ }
+ }
+ }
+
+ if (m_bIsEVR) {
+ bRet = bRet || New.iEVRHighColorResolution != Current.iEVRHighColorResolution;
+ bRet = bRet || New.iEVRForceInputHighColorResolution != Current.iEVRForceInputHighColorResolution;
+ }
+
+ m_LastRendererSettings = s.m_RenderSettings;
+
+ return bRet;
}
-HRESULT CDX9AllocatorPresenter::CreateDevice(CString &_Error)
+HRESULT CDX9AllocatorPresenter::CreateDevice(CString& _Error)
{
- StopWorkerThreads();
-
- CRenderersSettings& s = GetRenderersSettings();
- CRenderersData* renderersData = GetRenderersData();
-
- m_VBlankEndWait = 0;
- m_VBlankMin = 300000;
- m_VBlankMinCalc = 300000;
- m_VBlankMax = 0;
- m_VBlankStartWait = 0;
- m_VBlankWaitTime = 0;
- m_VBlankLockTime = 0;
- m_PresentWaitTime = 0;
- m_PresentWaitTimeMin = 3000000000;
- m_PresentWaitTimeMax = 0;
-
- m_LastRendererSettings = s.m_RenderSettings;
-
- m_VBlankEndPresent = -100000;
- m_VBlankStartMeasureTime = 0;
- m_VBlankStartMeasure = 0;
-
- m_PaintTime = 0;
- m_PaintTimeMin = 3000000000;
- m_PaintTimeMax = 0;
-
- m_RasterStatusWaitTime = 0;
- m_RasterStatusWaitTimeMin = 3000000000;
- m_RasterStatusWaitTimeMax = 0;
- m_RasterStatusWaitTimeMaxCalc = 0;
-
- m_ClockDiff = 0.0;
- m_ClockDiffPrim = 0.0;
- m_ClockDiffCalc = 0.0;
-
- m_ModeratedTimeSpeed = 1.0;
- m_ModeratedTimeSpeedDiff = 0.0;
- m_ModeratedTimeSpeedPrim = 0;
- ZeroMemory(m_TimeChangeHistory, sizeof(m_TimeChangeHistory));
- ZeroMemory(m_ClockChangeHistory, sizeof(m_ClockChangeHistory));
- m_ClockTimeChangeHistoryPos = 0;
-
- m_pD3DDev = NULL;
- m_pD3DDevEx = NULL;
- m_pDirectDraw = NULL;
-
- CleanupRenderingEngine();
-
- if (!m_pD3D) {
- _Error += L"Failed to create D3D9\n";
- return E_UNEXPECTED;
- }
-
- HRESULT hr = S_OK;
- m_CurrentAdapter = GetAdapter(m_pD3D);
-
- /* // TODO : add nVidia PerfHUD !!!
-
- // Set default settings
- UINT AdapterToUse=D3DADAPTER_DEFAULT;
- D3DDEVTYPE DeviceType=D3DDEVTYPE_HAL;
-
- #if SHIPPING_VERSION
- // When building a shipping version, disable PerfHUD (opt-out)
- #else
- // Look for 'NVIDIA PerfHUD' adapter
- // If it is present, override default settings
- for (UINT Adapter=0;Adapter<g_pD3D->GetAdapterCount();Adapter++)
- {
- D3DADAPTER_IDENTIFIER9 Identifier;
- HRESULT Res;
-
- Res = g_pD3D->GetAdapterIdentifier(Adapter,0,&Identifier);
- if (strstr(Identifier.Description,"PerfHUD") != 0)
- {
- AdapterToUse=Adapter;
- DeviceType=D3DDEVTYPE_REF;
- break;
- }
- }
- #endif
-
- if (FAILED(g_pD3D->CreateDevice( AdapterToUse, DeviceType, hWnd,
- D3DCREATE_HARDWARE_VERTEXPROCESSING,
- &d3dpp, &g_pd3dDevice) ) )
- {
- return E_FAIL;
- }
- */
-
-
-//#define ENABLE_DDRAWSYNC
+ StopWorkerThreads();
+
+ CRenderersSettings& s = GetRenderersSettings();
+ CRenderersData* renderersData = GetRenderersData();
+
+ m_VBlankEndWait = 0;
+ m_VBlankMin = 300000;
+ m_VBlankMinCalc = 300000;
+ m_VBlankMax = 0;
+ m_VBlankStartWait = 0;
+ m_VBlankWaitTime = 0;
+ m_VBlankLockTime = 0;
+ m_PresentWaitTime = 0;
+ m_PresentWaitTimeMin = 3000000000;
+ m_PresentWaitTimeMax = 0;
+
+ m_LastRendererSettings = s.m_RenderSettings;
+
+ m_VBlankEndPresent = -100000;
+ m_VBlankStartMeasureTime = 0;
+ m_VBlankStartMeasure = 0;
+
+ m_PaintTime = 0;
+ m_PaintTimeMin = 3000000000;
+ m_PaintTimeMax = 0;
+
+ m_RasterStatusWaitTime = 0;
+ m_RasterStatusWaitTimeMin = 3000000000;
+ m_RasterStatusWaitTimeMax = 0;
+ m_RasterStatusWaitTimeMaxCalc = 0;
+
+ m_ClockDiff = 0.0;
+ m_ClockDiffPrim = 0.0;
+ m_ClockDiffCalc = 0.0;
+
+ m_ModeratedTimeSpeed = 1.0;
+ m_ModeratedTimeSpeedDiff = 0.0;
+ m_ModeratedTimeSpeedPrim = 0;
+ ZeroMemory(m_TimeChangeHistory, sizeof(m_TimeChangeHistory));
+ ZeroMemory(m_ClockChangeHistory, sizeof(m_ClockChangeHistory));
+ m_ClockTimeChangeHistoryPos = 0;
+
+ m_pD3DDev = NULL;
+ m_pD3DDevEx = NULL;
+ m_pDirectDraw = NULL;
+
+ CleanupRenderingEngine();
+
+ if (!m_pD3D) {
+ _Error += L"Failed to create D3D9\n";
+ return E_UNEXPECTED;
+ }
+
+ HRESULT hr = S_OK;
+ m_CurrentAdapter = GetAdapter(m_pD3D);
+
+ /* // TODO : add nVidia PerfHUD !!!
+
+ // Set default settings
+ UINT AdapterToUse=D3DADAPTER_DEFAULT;
+ D3DDEVTYPE DeviceType=D3DDEVTYPE_HAL;
+
+ #if SHIPPING_VERSION
+ // When building a shipping version, disable PerfHUD (opt-out)
+ #else
+ // Look for 'NVIDIA PerfHUD' adapter
+ // If it is present, override default settings
+ for (UINT Adapter=0;Adapter<g_pD3D->GetAdapterCount();Adapter++)
+ {
+ D3DADAPTER_IDENTIFIER9 Identifier;
+ HRESULT Res;
+
+ Res = g_pD3D->GetAdapterIdentifier(Adapter,0,&Identifier);
+ if (strstr(Identifier.Description,"PerfHUD") != 0)
+ {
+ AdapterToUse=Adapter;
+ DeviceType=D3DDEVTYPE_REF;
+ break;
+ }
+ }
+ #endif
+
+ if (FAILED(g_pD3D->CreateDevice( AdapterToUse, DeviceType, hWnd,
+ D3DCREATE_HARDWARE_VERTEXPROCESSING,
+ &d3dpp, &g_pd3dDevice) ) )
+ {
+ return E_FAIL;
+ }
+ */
+
+
+ //#define ENABLE_DDRAWSYNC
#ifdef ENABLE_DDRAWSYNC
- hr = DirectDrawCreate(NULL, &m_pDirectDraw, NULL) ;
- if (hr == S_OK) {
- hr = m_pDirectDraw->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL) ;
- }
+ hr = DirectDrawCreate(NULL, &m_pDirectDraw, NULL) ;
+ if (hr == S_OK) {
+ hr = m_pDirectDraw->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL) ;
+ }
#endif
- D3DPRESENT_PARAMETERS pp;
- ZeroMemory(&pp, sizeof(pp));
-
- BOOL bCompositionEnabled = false;
- if (m_pDwmIsCompositionEnabled) {
- m_pDwmIsCompositionEnabled(&bCompositionEnabled);
- }
-
- m_bCompositionEnabled = !!bCompositionEnabled;
- m_bAlternativeVSync = s.m_RenderSettings.fVMR9AlterativeVSync;
-
- // detect FP textures support
- renderersData->m_bFP16Support = SUCCEEDED(m_pD3D->CheckDeviceFormat(m_CurrentAdapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_QUERY_FILTER, D3DRTYPE_VOLUMETEXTURE, D3DFMT_A32B32G32R32F));
-
- // detect 10-bit textures support
- renderersData->m_b10bitSupport = SUCCEEDED(m_pD3D->CheckDeviceFormat(m_CurrentAdapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_QUERY_FILTER, D3DRTYPE_TEXTURE, D3DFMT_A2R10G10B10));
-
- // set settings that depend on hardware feature support
- m_bForceInputHighColorResolution = s.m_RenderSettings.iEVRForceInputHighColorResolution && m_bIsEVR && renderersData->m_b10bitSupport;
- m_bHighColorResolution = s.m_RenderSettings.iEVRHighColorResolution && m_bIsEVR && renderersData->m_b10bitSupport;
- m_bFullFloatingPointProcessing = s.m_RenderSettings.iVMR9FullFloatingPointProcessing && renderersData->m_bFP16Support;
- m_bHalfFloatingPointProcessing = s.m_RenderSettings.iVMR9HalfFloatingPointProcessing && renderersData->m_bFP16Support && !m_bFullFloatingPointProcessing;
-
-
- // set color formats
- if (m_bFullFloatingPointProcessing) {
- m_SurfaceType = D3DFMT_A32B32G32R32F;
- } else if (m_bHalfFloatingPointProcessing) {
- m_SurfaceType = D3DFMT_A16B16G16R16F;
- } else if (m_bForceInputHighColorResolution || m_bHighColorResolution) {
- m_SurfaceType = D3DFMT_A2R10G10B10;
- } else {
- if (m_nPCIVendor == PCIV_ATI)
- m_SurfaceType = D3DFMT_X8R8G8B8;
- else
- m_SurfaceType = D3DFMT_A8R8G8B8;
- }
-
- D3DDISPLAYMODEEX DisplayMode;
- ZeroMemory(&DisplayMode, sizeof(DisplayMode));
- DisplayMode.Size = sizeof(DisplayMode);
- D3DDISPLAYMODE d3ddm;
- ZeroMemory(&d3ddm, sizeof(d3ddm));
-
- if (m_bIsFullscreen) {
- if (m_bHighColorResolution) {
- pp.BackBufferFormat = D3DFMT_A2R10G10B10;
- } else {
- pp.BackBufferFormat = D3DFMT_X8R8G8B8;
- }
- pp.Windowed = false;
- pp.BackBufferCount = 3;
- pp.SwapEffect = D3DSWAPEFFECT_FLIP;
- // there's no Desktop composition to take care of alternative vSync in exclusive mode, alternative vSync is therefore unused
- pp.hDeviceWindow = m_hWnd;
- pp.Flags = D3DPRESENTFLAG_VIDEO;
- if (s.m_RenderSettings.iVMR9FullscreenGUISupport && !m_bHighColorResolution) {
- pp.Flags |= D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
- }
- m_D3DDevExError = L"No m_pD3DEx";
- if (m_pD3DEx) {
- m_pD3DEx->GetAdapterDisplayModeEx(m_CurrentAdapter, &DisplayMode, NULL);
-
- DisplayMode.Format = pp.BackBufferFormat;
- m_ScreenSize.SetSize(DisplayMode.Width, DisplayMode.Height);
- pp.FullScreen_RefreshRateInHz = m_RefreshRate = DisplayMode.RefreshRate;
- pp.BackBufferWidth = m_ScreenSize.cx;
- pp.BackBufferHeight = m_ScreenSize.cy;
-
- hr = m_pD3DEx->CreateDeviceEx(
- m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
- GetVertexProcessing() | D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED | D3DCREATE_ENABLE_PRESENTSTATS, //D3DCREATE_MANAGED
- &pp, &DisplayMode, &m_pD3DDevEx);
-
- m_D3DDevExError = GetWindowsErrorMessage(hr, m_hD3D9);
- if (m_pD3DDevEx) {
- m_pD3DDev = m_pD3DDevEx;
- m_BackbufferType = pp.BackBufferFormat;
- m_DisplayType = DisplayMode.Format;
- }
- }
- if (!m_pD3DDev) {
- m_pD3D->GetAdapterDisplayMode(m_CurrentAdapter, &d3ddm);
- d3ddm.Format = pp.BackBufferFormat;
- m_ScreenSize.SetSize(d3ddm.Width, d3ddm.Height);
- pp.FullScreen_RefreshRateInHz = m_RefreshRate = d3ddm.RefreshRate;
- pp.BackBufferWidth = m_ScreenSize.cx;
- pp.BackBufferHeight = m_ScreenSize.cy;
-
- hr = m_pD3D->CreateDevice(
- m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
- GetVertexProcessing() | D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED, //D3DCREATE_MANAGED
- &pp, &m_pD3DDev);
- m_DisplayType = d3ddm.Format;
- m_BackbufferType = pp.BackBufferFormat;
- }
- if (m_pD3DDev && s.m_RenderSettings.iVMR9FullscreenGUISupport && !m_bHighColorResolution) {
- m_pD3DDev->SetDialogBoxMode(true);
- //if (m_pD3DDev->SetDialogBoxMode(true) != S_OK)
- // ExitProcess(0);
- }
- } else {
- pp.Windowed = TRUE;
- pp.hDeviceWindow = m_hWnd;
- pp.SwapEffect = D3DSWAPEFFECT_COPY;
- pp.Flags = D3DPRESENTFLAG_VIDEO;
- pp.BackBufferCount = 1;
- if (bCompositionEnabled || m_bAlternativeVSync) {
- // Desktop composition takes care of the VSYNC
- pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
- }
-
- if (m_pD3DEx) {
- m_pD3DEx->GetAdapterDisplayModeEx(m_CurrentAdapter, &DisplayMode, NULL);
- m_ScreenSize.SetSize(DisplayMode.Width, DisplayMode.Height);
- m_RefreshRate = DisplayMode.RefreshRate;
- pp.BackBufferWidth = m_ScreenSize.cx;
- pp.BackBufferHeight = m_ScreenSize.cy;
-
- // We can get 0x8876086a here when switching from two displays to one display using Win + P (Windows 7)
- // Cause: We might not reinitialize dx correctly during the switch
- hr = m_pD3DEx->CreateDeviceEx(
- m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
- GetVertexProcessing() | D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED | D3DCREATE_ENABLE_PRESENTSTATS, //D3DCREATE_MANAGED
- &pp, NULL, &m_pD3DDevEx);
- if (m_pD3DDevEx) {
- m_pD3DDev = m_pD3DDevEx;
- m_DisplayType = DisplayMode.Format;
- }
- }
- if (!m_pD3DDev) {
- m_pD3D->GetAdapterDisplayMode(m_CurrentAdapter, &d3ddm);
- m_ScreenSize.SetSize(d3ddm.Width, d3ddm.Height);
- m_RefreshRate = d3ddm.RefreshRate;
- pp.BackBufferWidth = m_ScreenSize.cx;
- pp.BackBufferHeight = m_ScreenSize.cy;
-
- hr = m_pD3D->CreateDevice(
- m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
- GetVertexProcessing() | D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED, //D3DCREATE_MANAGED
- &pp, &m_pD3DDev);
- m_DisplayType = d3ddm.Format;
- }
- m_BackbufferType = pp.BackBufferFormat;
- }
-
- while (hr == D3DERR_DEVICELOST) {
- TRACE("D3DERR_DEVICELOST. Trying to Reset.\n");
- hr = m_pD3DDev->TestCooperativeLevel();
- }
- if (hr == D3DERR_DEVICENOTRESET) {
- TRACE("D3DERR_DEVICENOTRESET\n");
- hr = m_pD3DDev->Reset(&pp);
- }
-
- TRACE("CreateDevice: %d\n", (LONG)hr);
- ASSERT (SUCCEEDED (hr));
-
- m_MainThreadId = GetCurrentThreadId();
-
- if (m_pD3DDevEx) {
- m_pD3DDevEx->SetGPUThreadPriority(7);
- }
-
- if (FAILED(hr)) {
- _Error += L"CreateDevice failed\n";
- CStringW str;
- str.Format(L"Error code: 0x%X\n", hr);
- _Error += str;
-
- return hr;
- }
-
- // Get the device caps
- ZeroMemory(&m_Caps, sizeof(m_Caps));
- m_pD3DDev->GetDeviceCaps(&m_Caps);
-
- // Initialize the rendering engine
- InitRenderingEngine();
-
- CComPtr<ISubPicProvider> pSubPicProvider;
- if (m_pSubPicQueue) {
- m_pSubPicQueue->GetSubPicProvider(&pSubPicProvider);
- }
-
- CSize size;
- switch (GetRenderersSettings().nSPCMaxRes) {
- case 0:
- default:
- size = m_ScreenSize;
- break;
- case 1:
- size.SetSize(1024, 768);
- break;
- case 2:
- size.SetSize(800, 600);
- break;
- case 3:
- size.SetSize(640, 480);
- break;
- case 4:
- size.SetSize(512, 384);
- break;
- case 5:
- size.SetSize(384, 288);
- break;
- case 6:
- size.SetSize(2560, 1600);
- break;
- case 7:
- size.SetSize(1920, 1080);
- break;
- case 8:
- size.SetSize(1320, 900);
- break;
- case 9:
- size.SetSize(1280, 720);
- break;
- }
-
- if (m_pAllocator) {
- m_pAllocator->ChangeDevice(m_pD3DDev);
- } else {
- m_pAllocator = DNew CDX9SubPicAllocator(m_pD3DDev, size, GetRenderersSettings().fSPCPow2Tex, false);
- if (!m_pAllocator) {
- _Error += L"CDX9SubPicAllocator failed\n";
-
- return E_FAIL;
- }
- }
-
- hr = S_OK;
- m_pSubPicQueue = GetRenderersSettings().nSPCSize > 0
- ? (ISubPicQueue*)DNew CSubPicQueue(GetRenderersSettings().nSPCSize, !GetRenderersSettings().fSPCAllowAnimationWhenBuffering, m_pAllocator, &hr)
- : (ISubPicQueue*)DNew CSubPicQueueNoThread(m_pAllocator, &hr);
- if (!m_pSubPicQueue || FAILED(hr)) {
- _Error += L"m_pSubPicQueue failed\n";
-
- return E_FAIL;
- }
-
- if (pSubPicProvider) {
- m_pSubPicQueue->SetSubPicProvider(pSubPicProvider);
- }
-
- m_pFont = NULL;
- if (m_pD3DXCreateFont) {
- int MinSize = 1600;
- int CurrentSize = min(m_ScreenSize.cx, MinSize);
- double Scale = double(CurrentSize) / double(MinSize);
- m_TextScale = Scale;
- m_pD3DXCreateFont( m_pD3DDev, // D3D device
- (int)(-24.0*Scale), // Height
- (UINT)(-11.0*Scale), // Width
- CurrentSize < 800 ? FW_NORMAL : FW_BOLD, // Weight
- 0, // MipLevels, 0 = autogen mipmaps
- FALSE, // Italic
- DEFAULT_CHARSET, // CharSet
- OUT_DEFAULT_PRECIS, // OutputPrecision
- ANTIALIASED_QUALITY, // Quality
- FIXED_PITCH | FF_DONTCARE, // PitchAndFamily
- L"Lucida Console", // pFaceName
- &m_pFont); // ppFont
- }
-
-
- m_pSprite = NULL;
-
- if (m_pD3DXCreateSprite) {
- m_pD3DXCreateSprite( m_pD3DDev, // D3D device
- &m_pSprite);
- }
-
- m_pLine = NULL;
- if (m_pD3DXCreateLine) {
- m_pD3DXCreateLine (m_pD3DDev, &m_pLine);
- }
-
- m_LastAdapterCheck = GetRenderersData()->GetPerfCounter();
-
- StartWorkerThreads();
-
- return S_OK;
+ D3DPRESENT_PARAMETERS pp;
+ ZeroMemory(&pp, sizeof(pp));
+
+ BOOL bCompositionEnabled = false;
+ if (m_pDwmIsCompositionEnabled) {
+ m_pDwmIsCompositionEnabled(&bCompositionEnabled);
+ }
+
+ m_bCompositionEnabled = !!bCompositionEnabled;
+ m_bAlternativeVSync = s.m_RenderSettings.fVMR9AlterativeVSync;
+
+ // detect FP textures support
+ renderersData->m_bFP16Support = SUCCEEDED(m_pD3D->CheckDeviceFormat(m_CurrentAdapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_QUERY_FILTER, D3DRTYPE_VOLUMETEXTURE, D3DFMT_A32B32G32R32F));
+
+ // detect 10-bit textures support
+ renderersData->m_b10bitSupport = SUCCEEDED(m_pD3D->CheckDeviceFormat(m_CurrentAdapter, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_QUERY_FILTER, D3DRTYPE_TEXTURE, D3DFMT_A2R10G10B10));
+
+ // set settings that depend on hardware feature support
+ m_bForceInputHighColorResolution = s.m_RenderSettings.iEVRForceInputHighColorResolution && m_bIsEVR && renderersData->m_b10bitSupport;
+ m_bHighColorResolution = s.m_RenderSettings.iEVRHighColorResolution && m_bIsEVR && renderersData->m_b10bitSupport;
+ m_bFullFloatingPointProcessing = s.m_RenderSettings.iVMR9FullFloatingPointProcessing && renderersData->m_bFP16Support;
+ m_bHalfFloatingPointProcessing = s.m_RenderSettings.iVMR9HalfFloatingPointProcessing && renderersData->m_bFP16Support && !m_bFullFloatingPointProcessing;
+
+
+ // set color formats
+ if (m_bFullFloatingPointProcessing) {
+ m_SurfaceType = D3DFMT_A32B32G32R32F;
+ } else if (m_bHalfFloatingPointProcessing) {
+ m_SurfaceType = D3DFMT_A16B16G16R16F;
+ } else if (m_bForceInputHighColorResolution || m_bHighColorResolution) {
+ m_SurfaceType = D3DFMT_A2R10G10B10;
+ } else {
+ if (m_nPCIVendor == PCIV_ATI) {
+ m_SurfaceType = D3DFMT_X8R8G8B8;
+ } else {
+ m_SurfaceType = D3DFMT_A8R8G8B8;
+ }
+ }
+
+ D3DDISPLAYMODEEX DisplayMode;
+ ZeroMemory(&DisplayMode, sizeof(DisplayMode));
+ DisplayMode.Size = sizeof(DisplayMode);
+ D3DDISPLAYMODE d3ddm;
+ ZeroMemory(&d3ddm, sizeof(d3ddm));
+
+ if (m_bIsFullscreen) {
+ if (m_bHighColorResolution) {
+ pp.BackBufferFormat = D3DFMT_A2R10G10B10;
+ } else {
+ pp.BackBufferFormat = D3DFMT_X8R8G8B8;
+ }
+ pp.Windowed = false;
+ pp.BackBufferCount = 3;
+ pp.SwapEffect = D3DSWAPEFFECT_FLIP;
+ // there's no Desktop composition to take care of alternative vSync in exclusive mode, alternative vSync is therefore unused
+ pp.hDeviceWindow = m_hWnd;
+ pp.Flags = D3DPRESENTFLAG_VIDEO;
+ if (s.m_RenderSettings.iVMR9FullscreenGUISupport && !m_bHighColorResolution) {
+ pp.Flags |= D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
+ }
+ m_D3DDevExError = L"No m_pD3DEx";
+ if (m_pD3DEx) {
+ m_pD3DEx->GetAdapterDisplayModeEx(m_CurrentAdapter, &DisplayMode, NULL);
+
+ DisplayMode.Format = pp.BackBufferFormat;
+ m_ScreenSize.SetSize(DisplayMode.Width, DisplayMode.Height);
+ pp.FullScreen_RefreshRateInHz = m_RefreshRate = DisplayMode.RefreshRate;
+ pp.BackBufferWidth = m_ScreenSize.cx;
+ pp.BackBufferHeight = m_ScreenSize.cy;
+
+ hr = m_pD3DEx->CreateDeviceEx(
+ m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
+ GetVertexProcessing() | D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED | D3DCREATE_ENABLE_PRESENTSTATS, //D3DCREATE_MANAGED
+ &pp, &DisplayMode, &m_pD3DDevEx);
+
+ m_D3DDevExError = GetWindowsErrorMessage(hr, m_hD3D9);
+ if (m_pD3DDevEx) {
+ m_pD3DDev = m_pD3DDevEx;
+ m_BackbufferType = pp.BackBufferFormat;
+ m_DisplayType = DisplayMode.Format;
+ }
+ }
+ if (!m_pD3DDev) {
+ m_pD3D->GetAdapterDisplayMode(m_CurrentAdapter, &d3ddm);
+ d3ddm.Format = pp.BackBufferFormat;
+ m_ScreenSize.SetSize(d3ddm.Width, d3ddm.Height);
+ pp.FullScreen_RefreshRateInHz = m_RefreshRate = d3ddm.RefreshRate;
+ pp.BackBufferWidth = m_ScreenSize.cx;
+ pp.BackBufferHeight = m_ScreenSize.cy;
+
+ hr = m_pD3D->CreateDevice(
+ m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
+ GetVertexProcessing() | D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED, //D3DCREATE_MANAGED
+ &pp, &m_pD3DDev);
+ m_DisplayType = d3ddm.Format;
+ m_BackbufferType = pp.BackBufferFormat;
+ }
+ if (m_pD3DDev && s.m_RenderSettings.iVMR9FullscreenGUISupport && !m_bHighColorResolution) {
+ m_pD3DDev->SetDialogBoxMode(true);
+ //if (m_pD3DDev->SetDialogBoxMode(true) != S_OK)
+ // ExitProcess(0);
+ }
+ } else {
+ pp.Windowed = TRUE;
+ pp.hDeviceWindow = m_hWnd;
+ pp.SwapEffect = D3DSWAPEFFECT_COPY;
+ pp.Flags = D3DPRESENTFLAG_VIDEO;
+ pp.BackBufferCount = 1;
+ if (bCompositionEnabled || m_bAlternativeVSync) {
+ // Desktop composition takes care of the VSYNC
+ pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
+ }
+
+ if (m_pD3DEx) {
+ m_pD3DEx->GetAdapterDisplayModeEx(m_CurrentAdapter, &DisplayMode, NULL);
+ m_ScreenSize.SetSize(DisplayMode.Width, DisplayMode.Height);
+ m_RefreshRate = DisplayMode.RefreshRate;
+ pp.BackBufferWidth = m_ScreenSize.cx;
+ pp.BackBufferHeight = m_ScreenSize.cy;
+
+ // We can get 0x8876086a here when switching from two displays to one display using Win + P (Windows 7)
+ // Cause: We might not reinitialize dx correctly during the switch
+ hr = m_pD3DEx->CreateDeviceEx(
+ m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
+ GetVertexProcessing() | D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED | D3DCREATE_ENABLE_PRESENTSTATS, //D3DCREATE_MANAGED
+ &pp, NULL, &m_pD3DDevEx);
+ if (m_pD3DDevEx) {
+ m_pD3DDev = m_pD3DDevEx;
+ m_DisplayType = DisplayMode.Format;
+ }
+ }
+ if (!m_pD3DDev) {
+ m_pD3D->GetAdapterDisplayMode(m_CurrentAdapter, &d3ddm);
+ m_ScreenSize.SetSize(d3ddm.Width, d3ddm.Height);
+ m_RefreshRate = d3ddm.RefreshRate;
+ pp.BackBufferWidth = m_ScreenSize.cx;
+ pp.BackBufferHeight = m_ScreenSize.cy;
+
+ hr = m_pD3D->CreateDevice(
+ m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
+ GetVertexProcessing() | D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED, //D3DCREATE_MANAGED
+ &pp, &m_pD3DDev);
+ m_DisplayType = d3ddm.Format;
+ }
+ m_BackbufferType = pp.BackBufferFormat;
+ }
+
+ while (hr == D3DERR_DEVICELOST) {
+ TRACE("D3DERR_DEVICELOST. Trying to Reset.\n");
+ hr = m_pD3DDev->TestCooperativeLevel();
+ }
+ if (hr == D3DERR_DEVICENOTRESET) {
+ TRACE("D3DERR_DEVICENOTRESET\n");
+ hr = m_pD3DDev->Reset(&pp);
+ }
+
+ TRACE("CreateDevice: %d\n", (LONG)hr);
+ ASSERT(SUCCEEDED(hr));
+
+ m_MainThreadId = GetCurrentThreadId();
+
+ if (m_pD3DDevEx) {
+ m_pD3DDevEx->SetGPUThreadPriority(7);
+ }
+
+ if (FAILED(hr)) {
+ _Error += L"CreateDevice failed\n";
+ CStringW str;
+ str.Format(L"Error code: 0x%X\n", hr);
+ _Error += str;
+
+ return hr;
+ }
+
+ // Get the device caps
+ ZeroMemory(&m_Caps, sizeof(m_Caps));
+ m_pD3DDev->GetDeviceCaps(&m_Caps);
+
+ // Initialize the rendering engine
+ InitRenderingEngine();
+
+ CComPtr<ISubPicProvider> pSubPicProvider;
+ if (m_pSubPicQueue) {
+ m_pSubPicQueue->GetSubPicProvider(&pSubPicProvider);
+ }
+
+ CSize size;
+ switch (GetRenderersSettings().nSPCMaxRes) {
+ case 0:
+ default:
+ size = m_ScreenSize;
+ break;
+ case 1:
+ size.SetSize(1024, 768);
+ break;
+ case 2:
+ size.SetSize(800, 600);
+ break;
+ case 3:
+ size.SetSize(640, 480);
+ break;
+ case 4:
+ size.SetSize(512, 384);
+ break;
+ case 5:
+ size.SetSize(384, 288);
+ break;
+ case 6:
+ size.SetSize(2560, 1600);
+ break;
+ case 7:
+ size.SetSize(1920, 1080);
+ break;
+ case 8:
+ size.SetSize(1320, 900);
+ break;
+ case 9:
+ size.SetSize(1280, 720);
+ break;
+ }
+
+ if (m_pAllocator) {
+ m_pAllocator->ChangeDevice(m_pD3DDev);
+ } else {
+ m_pAllocator = DNew CDX9SubPicAllocator(m_pD3DDev, size, GetRenderersSettings().fSPCPow2Tex, false);
+ if (!m_pAllocator) {
+ _Error += L"CDX9SubPicAllocator failed\n";
+
+ return E_FAIL;
+ }
+ }
+
+ hr = S_OK;
+ m_pSubPicQueue = GetRenderersSettings().nSPCSize > 0
+ ? (ISubPicQueue*)DNew CSubPicQueue(GetRenderersSettings().nSPCSize, !GetRenderersSettings().fSPCAllowAnimationWhenBuffering, m_pAllocator, &hr)
+ : (ISubPicQueue*)DNew CSubPicQueueNoThread(m_pAllocator, &hr);
+ if (!m_pSubPicQueue || FAILED(hr)) {
+ _Error += L"m_pSubPicQueue failed\n";
+
+ return E_FAIL;
+ }
+
+ if (pSubPicProvider) {
+ m_pSubPicQueue->SetSubPicProvider(pSubPicProvider);
+ }
+
+ m_pFont = NULL;
+ if (m_pD3DXCreateFont) {
+ int MinSize = 1600;
+ int CurrentSize = min(m_ScreenSize.cx, MinSize);
+ double Scale = double(CurrentSize) / double(MinSize);
+ m_TextScale = Scale;
+ m_pD3DXCreateFont(m_pD3DDev, // D3D device
+ (int)(-24.0 * Scale), // Height
+ (UINT)(-11.0 * Scale), // Width
+ CurrentSize < 800 ? FW_NORMAL : FW_BOLD, // Weight
+ 0, // MipLevels, 0 = autogen mipmaps
+ FALSE, // Italic
+ DEFAULT_CHARSET, // CharSet
+ OUT_DEFAULT_PRECIS, // OutputPrecision
+ ANTIALIASED_QUALITY, // Quality
+ FIXED_PITCH | FF_DONTCARE, // PitchAndFamily
+ L"Lucida Console", // pFaceName
+ &m_pFont); // ppFont
+ }
+
+
+ m_pSprite = NULL;
+
+ if (m_pD3DXCreateSprite) {
+ m_pD3DXCreateSprite(m_pD3DDev, // D3D device
+ &m_pSprite);
+ }
+
+ m_pLine = NULL;
+ if (m_pD3DXCreateLine) {
+ m_pD3DXCreateLine(m_pD3DDev, &m_pLine);
+ }
+
+ m_LastAdapterCheck = GetRenderersData()->GetPerfCounter();
+
+ StartWorkerThreads();
+
+ return S_OK;
}
HRESULT CDX9AllocatorPresenter::AllocSurfaces()
{
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_RenderLock);
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_RenderLock);
- return CreateVideoSurfaces();
+ return CreateVideoSurfaces();
}
void CDX9AllocatorPresenter::DeleteSurfaces()
{
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_RenderLock);
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_RenderLock);
- FreeVideoSurfaces();
+ FreeVideoSurfaces();
}
UINT CDX9AllocatorPresenter::GetAdapter(IDirect3D9* pD3D, bool bGetAdapter)
{
- if (m_hWnd == NULL || pD3D == NULL) {
- return D3DADAPTER_DEFAULT;
- }
-
- m_D3D9Device = _T("");
- m_nPCIVendor = 0;
-
- CRenderersSettings& s = GetRenderersSettings();
- if (bGetAdapter && (pD3D->GetAdapterCount()>1) && (s.D3D9RenderDevice != _T(""))) {
- TCHAR strGUID[50];
- D3DADAPTER_IDENTIFIER9 adapterIdentifier;
-
- for (UINT adp = 0, num_adp = pD3D->GetAdapterCount(); adp < num_adp; ++adp) {
- if (pD3D->GetAdapterIdentifier(adp, 0, &adapterIdentifier) == S_OK) {
- if ((::StringFromGUID2(adapterIdentifier.DeviceIdentifier, strGUID, 50) > 0) && (s.D3D9RenderDevice == strGUID)) {
- m_D3D9Device = adapterIdentifier.Description;
- m_nPCIVendor = adapterIdentifier.VendorId;
- return adp;
- }
- }
- }
- }
-
- HMONITOR hMonitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
- if (hMonitor == NULL) {
- return D3DADAPTER_DEFAULT;
- }
-
- for (UINT adp = 0, num_adp = pD3D->GetAdapterCount(); adp < num_adp; ++adp) {
- HMONITOR hAdpMon = pD3D->GetAdapterMonitor(adp);
- if (hAdpMon == hMonitor) {
- if (bGetAdapter) {
- D3DADAPTER_IDENTIFIER9 adapterIdentifier;
- if (pD3D->GetAdapterIdentifier(adp, 0, &adapterIdentifier) == S_OK) {
- m_D3D9Device = adapterIdentifier.Description;
- m_nPCIVendor = adapterIdentifier.VendorId;
- }
- }
- return adp;
- }
- }
-
- return D3DADAPTER_DEFAULT;
+ if (m_hWnd == NULL || pD3D == NULL) {
+ return D3DADAPTER_DEFAULT;
+ }
+
+ m_D3D9Device = _T("");
+ m_nPCIVendor = 0;
+
+ CRenderersSettings& s = GetRenderersSettings();
+ if (bGetAdapter && (pD3D->GetAdapterCount() > 1) && (s.D3D9RenderDevice != _T(""))) {
+ TCHAR strGUID[50];
+ D3DADAPTER_IDENTIFIER9 adapterIdentifier;
+
+ for (UINT adp = 0, num_adp = pD3D->GetAdapterCount(); adp < num_adp; ++adp) {
+ if (pD3D->GetAdapterIdentifier(adp, 0, &adapterIdentifier) == S_OK) {
+ if ((::StringFromGUID2(adapterIdentifier.DeviceIdentifier, strGUID, 50) > 0) && (s.D3D9RenderDevice == strGUID)) {
+ m_D3D9Device = adapterIdentifier.Description;
+ m_nPCIVendor = adapterIdentifier.VendorId;
+ return adp;
+ }
+ }
+ }
+ }
+
+ HMONITOR hMonitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
+ if (hMonitor == NULL) {
+ return D3DADAPTER_DEFAULT;
+ }
+
+ for (UINT adp = 0, num_adp = pD3D->GetAdapterCount(); adp < num_adp; ++adp) {
+ HMONITOR hAdpMon = pD3D->GetAdapterMonitor(adp);
+ if (hAdpMon == hMonitor) {
+ if (bGetAdapter) {
+ D3DADAPTER_IDENTIFIER9 adapterIdentifier;
+ if (pD3D->GetAdapterIdentifier(adp, 0, &adapterIdentifier) == S_OK) {
+ m_D3D9Device = adapterIdentifier.Description;
+ m_nPCIVendor = adapterIdentifier.VendorId;
+ }
+ }
+ return adp;
+ }
+ }
+
+ return D3DADAPTER_DEFAULT;
}
DWORD CDX9AllocatorPresenter::GetVertexProcessing()
{
- HRESULT hr;
- D3DCAPS9 caps;
+ HRESULT hr;
+ D3DCAPS9 caps;
- hr = m_pD3D->GetDeviceCaps(m_CurrentAdapter, D3DDEVTYPE_HAL, &caps);
- if (FAILED(hr)) {
- return D3DCREATE_SOFTWARE_VERTEXPROCESSING;
- }
+ hr = m_pD3D->GetDeviceCaps(m_CurrentAdapter, D3DDEVTYPE_HAL, &caps);
+ if (FAILED(hr)) {
+ return D3DCREATE_SOFTWARE_VERTEXPROCESSING;
+ }
- if ((caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 ||
- caps.VertexShaderVersion < D3DVS_VERSION(2, 0)) {
- return D3DCREATE_SOFTWARE_VERTEXPROCESSING;
- }
+ if ((caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 ||
+ caps.VertexShaderVersion < D3DVS_VERSION(2, 0)) {
+ return D3DCREATE_SOFTWARE_VERTEXPROCESSING;
+ }
- return D3DCREATE_HARDWARE_VERTEXPROCESSING;
+ return D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
// ISubPicAllocatorPresenter
STDMETHODIMP CDX9AllocatorPresenter::CreateRenderer(IUnknown** ppRenderer)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
void CDX9AllocatorPresenter::CalculateJitter(LONGLONG PerfCounter)
{
- // Calculate the jitter!
- LONGLONG llPerf = PerfCounter;
- if ((m_rtTimePerFrame != 0) && (labs ((long)(llPerf - m_llLastPerf)) < m_rtTimePerFrame*3) ) {
- m_nNextJitter = (m_nNextJitter+1) % NB_JITTER;
- m_pllJitter[m_nNextJitter] = llPerf - m_llLastPerf;
-
- m_MaxJitter = MINLONG64;
- m_MinJitter = MAXLONG64;
-
- // Calculate the real FPS
- LONGLONG llJitterSum = 0;
- LONGLONG llJitterSumAvg = 0;
- for (int i=0; i<NB_JITTER; i++) {
- LONGLONG Jitter = m_pllJitter[i];
- llJitterSum += Jitter;
- llJitterSumAvg += Jitter;
- }
- double FrameTimeMean = double(llJitterSumAvg)/NB_JITTER;
- m_fJitterMean = FrameTimeMean;
- double DeviationSum = 0;
- for (int i=0; i<NB_JITTER; i++) {
- LONGLONG DevInt = m_pllJitter[i] - (LONGLONG)FrameTimeMean;
- double Deviation = (double)DevInt;
- DeviationSum += Deviation*Deviation;
- m_MaxJitter = max(m_MaxJitter, DevInt);
- m_MinJitter = min(m_MinJitter, DevInt);
- }
- double StdDev = sqrt(DeviationSum/NB_JITTER);
-
- m_fJitterStdDev = StdDev;
-
- m_fAvrFps = 10000000.0/(double(llJitterSum)/NB_JITTER);
- }
-
- m_llLastPerf = llPerf;
+ // Calculate the jitter!
+ LONGLONG llPerf = PerfCounter;
+ if ((m_rtTimePerFrame != 0) && (labs((long)(llPerf - m_llLastPerf)) < m_rtTimePerFrame * 3)) {
+ m_nNextJitter = (m_nNextJitter + 1) % NB_JITTER;
+ m_pllJitter[m_nNextJitter] = llPerf - m_llLastPerf;
+
+ m_MaxJitter = MINLONG64;
+ m_MinJitter = MAXLONG64;
+
+ // Calculate the real FPS
+ LONGLONG llJitterSum = 0;
+ LONGLONG llJitterSumAvg = 0;
+ for (int i = 0; i < NB_JITTER; i++) {
+ LONGLONG Jitter = m_pllJitter[i];
+ llJitterSum += Jitter;
+ llJitterSumAvg += Jitter;
+ }
+ double FrameTimeMean = double(llJitterSumAvg) / NB_JITTER;
+ m_fJitterMean = FrameTimeMean;
+ double DeviationSum = 0;
+ for (int i = 0; i < NB_JITTER; i++) {
+ LONGLONG DevInt = m_pllJitter[i] - (LONGLONG)FrameTimeMean;
+ double Deviation = (double)DevInt;
+ DeviationSum += Deviation * Deviation;
+ m_MaxJitter = max(m_MaxJitter, DevInt);
+ m_MinJitter = min(m_MinJitter, DevInt);
+ }
+ double StdDev = sqrt(DeviationSum / NB_JITTER);
+
+ m_fJitterStdDev = StdDev;
+
+ m_fAvrFps = 10000000.0 / (double(llJitterSum) / NB_JITTER);
+ }
+
+ m_llLastPerf = llPerf;
}
-bool CDX9AllocatorPresenter::GetVBlank(int &_ScanLine, int &_bInVBlank, bool _bMeasureTime)
+bool CDX9AllocatorPresenter::GetVBlank(int& _ScanLine, int& _bInVBlank, bool _bMeasureTime)
{
- LONGLONG llPerf = 0;
- if (_bMeasureTime) {
- llPerf = GetRenderersData()->GetPerfCounter();
- }
-
- int ScanLine = 0;
- _ScanLine = 0;
- _bInVBlank = 0;
-
- if (m_pDirectDraw) {
- DWORD ScanLineGet = 0;
- m_pDirectDraw->GetScanLine(&ScanLineGet);
- BOOL InVBlank;
- if (m_pDirectDraw->GetVerticalBlankStatus (&InVBlank) != S_OK) {
- return false;
- }
- ScanLine = ScanLineGet;
- _bInVBlank = InVBlank;
- if (InVBlank) {
- ScanLine = 0;
- }
- } else {
- D3DRASTER_STATUS RasterStatus;
- if (m_pD3DDev->GetRasterStatus(0, &RasterStatus) != S_OK) {
- return false;
- }
- ScanLine = RasterStatus.ScanLine;
- _bInVBlank = RasterStatus.InVBlank;
- }
- if (_bMeasureTime) {
- m_VBlankMax = max(m_VBlankMax, ScanLine);
- if (ScanLine != 0 && !_bInVBlank) {
- m_VBlankMinCalc = min(m_VBlankMinCalc, ScanLine);
- }
- m_VBlankMin = m_VBlankMax - m_ScreenSize.cy;
- }
- if (_bInVBlank) {
- _ScanLine = 0;
- } else if (m_VBlankMin != 300000) {
- _ScanLine = ScanLine - m_VBlankMin;
- } else {
- _ScanLine = ScanLine;
- }
-
- if (_bMeasureTime) {
- LONGLONG Time = GetRenderersData()->GetPerfCounter() - llPerf;
- if (Time > 5000000) { // 0.5 sec
- TRACE("GetVBlank too long (%f sec)\n", Time / 10000000.0);
- }
- m_RasterStatusWaitTimeMaxCalc = max(m_RasterStatusWaitTimeMaxCalc, Time);
- }
-
- return true;
+ LONGLONG llPerf = 0;
+ if (_bMeasureTime) {
+ llPerf = GetRenderersData()->GetPerfCounter();
+ }
+
+ int ScanLine = 0;
+ _ScanLine = 0;
+ _bInVBlank = 0;
+
+ if (m_pDirectDraw) {
+ DWORD ScanLineGet = 0;
+ m_pDirectDraw->GetScanLine(&ScanLineGet);
+ BOOL InVBlank;
+ if (m_pDirectDraw->GetVerticalBlankStatus(&InVBlank) != S_OK) {
+ return false;
+ }
+ ScanLine = ScanLineGet;
+ _bInVBlank = InVBlank;
+ if (InVBlank) {
+ ScanLine = 0;
+ }
+ } else {
+ D3DRASTER_STATUS RasterStatus;
+ if (m_pD3DDev->GetRasterStatus(0, &RasterStatus) != S_OK) {
+ return false;
+ }
+ ScanLine = RasterStatus.ScanLine;
+ _bInVBlank = RasterStatus.InVBlank;
+ }
+ if (_bMeasureTime) {
+ m_VBlankMax = max(m_VBlankMax, ScanLine);
+ if (ScanLine != 0 && !_bInVBlank) {
+ m_VBlankMinCalc = min(m_VBlankMinCalc, ScanLine);
+ }
+ m_VBlankMin = m_VBlankMax - m_ScreenSize.cy;
+ }
+ if (_bInVBlank) {
+ _ScanLine = 0;
+ } else if (m_VBlankMin != 300000) {
+ _ScanLine = ScanLine - m_VBlankMin;
+ } else {
+ _ScanLine = ScanLine;
+ }
+
+ if (_bMeasureTime) {
+ LONGLONG Time = GetRenderersData()->GetPerfCounter() - llPerf;
+ if (Time > 5000000) { // 0.5 sec
+ TRACE("GetVBlank too long (%f sec)\n", Time / 10000000.0);
+ }
+ m_RasterStatusWaitTimeMaxCalc = max(m_RasterStatusWaitTimeMaxCalc, Time);
+ }
+
+ return true;
}
-bool CDX9AllocatorPresenter::WaitForVBlankRange(int &_RasterStart, int _RasterSize, bool _bWaitIfInside, bool _bNeedAccurate, bool _bMeasure, bool &_bTakenLock)
+bool CDX9AllocatorPresenter::WaitForVBlankRange(int& _RasterStart, int _RasterSize, bool _bWaitIfInside, bool _bNeedAccurate, bool _bMeasure, bool& _bTakenLock)
{
- if (_bMeasure) {
- m_RasterStatusWaitTimeMaxCalc = 0;
- }
- bool bWaited = false;
- int ScanLine = 0;
- int InVBlank = 0;
- LONGLONG llPerf = 0;
- if (_bMeasure) {
- llPerf = GetRenderersData()->GetPerfCounter();
- }
- GetVBlank(ScanLine, InVBlank, _bMeasure);
- if (_bMeasure) {
- m_VBlankStartWait = ScanLine;
- }
-
- static bool bOneWait = true;
- if (bOneWait && _bMeasure) {
- bOneWait = false;
- // If we are already in the wanted interval we need to wait until we aren't, this improves sync when for example you are playing 23.976 Hz material on a 24 Hz refresh rate
- int nInVBlank = 0;
- for (;;) {
- if (!GetVBlank(ScanLine, InVBlank, _bMeasure)) {
- break;
- }
-
- if (InVBlank && nInVBlank == 0) {
- nInVBlank = 1;
- } else if (!InVBlank && nInVBlank == 1) {
- nInVBlank = 2;
- } else if (InVBlank && nInVBlank == 2) {
- nInVBlank = 3;
- } else if (!InVBlank && nInVBlank == 3) {
- break;
- }
- }
- }
- if (_bWaitIfInside) {
- int ScanLineDiff = long(ScanLine) - _RasterStart;
- if (ScanLineDiff > m_ScreenSize.cy / 2) {
- ScanLineDiff -= m_ScreenSize.cy;
- } else if (ScanLineDiff < -m_ScreenSize.cy / 2) {
- ScanLineDiff += m_ScreenSize.cy;
- }
-
- if (ScanLineDiff >= 0 && ScanLineDiff <= _RasterSize) {
- bWaited = true;
- // If we are already in the wanted interval we need to wait until we aren't, this improves sync when for example you are playing 23.976 Hz material on a 24 Hz refresh rate
- int LastLineDiff = ScanLineDiff;
- for (;;) {
- if (!GetVBlank(ScanLine, InVBlank, _bMeasure)) {
- break;
- }
- int ScanLineDiff = long(ScanLine) - _RasterStart;
- if (ScanLineDiff > m_ScreenSize.cy / 2) {
- ScanLineDiff -= m_ScreenSize.cy;
- } else if (ScanLineDiff < -m_ScreenSize.cy / 2) {
- ScanLineDiff += m_ScreenSize.cy;
- }
- if (!(ScanLineDiff >= 0 && ScanLineDiff <= _RasterSize) || (LastLineDiff < 0 && ScanLineDiff > 0)) {
- break;
- }
- LastLineDiff = ScanLineDiff;
- Sleep(1); // Just sleep
- }
- }
- }
- double RefreshRate = GetRefreshRate();
- LONG ScanLines = GetScanLines();
- int MinRange = max(min(int(0.0015 * double(ScanLines) * RefreshRate + 0.5), ScanLines/3), 5); // 1.5 ms or max 33 % of Time
- int NoSleepStart = _RasterStart - MinRange;
- int NoSleepRange = MinRange;
- if (NoSleepStart < 0) {
- NoSleepStart += m_ScreenSize.cy;
- }
-
- int MinRange2 = max(min(int(0.0050 * double(ScanLines) * RefreshRate + 0.5), ScanLines/3), 5); // 5 ms or max 33 % of Time
- int D3DDevLockStart = _RasterStart - MinRange2;
- int D3DDevLockRange = MinRange2;
- if (D3DDevLockStart < 0) {
- D3DDevLockStart += m_ScreenSize.cy;
- }
-
- int ScanLineDiff = ScanLine - _RasterStart;
- if (ScanLineDiff > m_ScreenSize.cy / 2) {
- ScanLineDiff -= m_ScreenSize.cy;
- } else if (ScanLineDiff < -m_ScreenSize.cy / 2) {
- ScanLineDiff += m_ScreenSize.cy;
- }
- int LastLineDiff = ScanLineDiff;
-
-
- int ScanLineDiffSleep = long(ScanLine) - NoSleepStart;
- if (ScanLineDiffSleep > m_ScreenSize.cy / 2) {
- ScanLineDiffSleep -= m_ScreenSize.cy;
- } else if (ScanLineDiffSleep < -m_ScreenSize.cy / 2) {
- ScanLineDiffSleep += m_ScreenSize.cy;
- }
- int LastLineDiffSleep = ScanLineDiffSleep;
-
-
- int ScanLineDiffLock = long(ScanLine) - D3DDevLockStart;
- if (ScanLineDiffLock > m_ScreenSize.cy / 2) {
- ScanLineDiffLock -= m_ScreenSize.cy;
- } else if (ScanLineDiffLock < -m_ScreenSize.cy / 2) {
- ScanLineDiffLock += m_ScreenSize.cy;
- }
- int LastLineDiffLock = ScanLineDiffLock;
-
- LONGLONG llPerfLock = 0;
-
- for (;;) {
- if (!GetVBlank(ScanLine, InVBlank, _bMeasure)) {
- break;
- }
- int ScanLineDiff = long(ScanLine) - _RasterStart;
- if (ScanLineDiff > m_ScreenSize.cy / 2) {
- ScanLineDiff -= m_ScreenSize.cy;
- } else if (ScanLineDiff < -m_ScreenSize.cy / 2) {
- ScanLineDiff += m_ScreenSize.cy;
- }
- if ((ScanLineDiff >= 0 && ScanLineDiff <= _RasterSize) || (LastLineDiff < 0 && ScanLineDiff > 0)) {
- break;
- }
-
- LastLineDiff = ScanLineDiff;
-
- bWaited = true;
-
- int ScanLineDiffLock = long(ScanLine) - D3DDevLockStart;
- if (ScanLineDiffLock > m_ScreenSize.cy / 2) {
- ScanLineDiffLock -= m_ScreenSize.cy;
- } else if (ScanLineDiffLock < -m_ScreenSize.cy / 2) {
- ScanLineDiffLock += m_ScreenSize.cy;
- }
-
- if (((ScanLineDiffLock >= 0 && ScanLineDiffLock <= D3DDevLockRange) || (LastLineDiffLock < 0 && ScanLineDiffLock > 0))) {
- if (!_bTakenLock && _bMeasure) {
- _bTakenLock = true;
- llPerfLock = GetRenderersData()->GetPerfCounter();
- LockD3DDevice();
- }
- }
- LastLineDiffLock = ScanLineDiffLock;
-
-
- int ScanLineDiffSleep = long(ScanLine) - NoSleepStart;
- if (ScanLineDiffSleep > m_ScreenSize.cy / 2) {
- ScanLineDiffSleep -= m_ScreenSize.cy;
- } else if (ScanLineDiffSleep < -m_ScreenSize.cy / 2) {
- ScanLineDiffSleep += m_ScreenSize.cy;
- }
-
- if (!((ScanLineDiffSleep >= 0 && ScanLineDiffSleep <= NoSleepRange) || (LastLineDiffSleep < 0 && ScanLineDiffSleep > 0)) || !_bNeedAccurate) {
- //TRACE("%d\n", RasterStatus.ScanLine);
- Sleep(1); // Don't sleep for the last 1.5 ms scan lines, so we get maximum precision
- }
- LastLineDiffSleep = ScanLineDiffSleep;
- }
- _RasterStart = ScanLine;
- if (_bMeasure) {
- m_VBlankEndWait = ScanLine;
- m_VBlankWaitTime = GetRenderersData()->GetPerfCounter() - llPerf;
-
- if (_bTakenLock) {
- m_VBlankLockTime = GetRenderersData()->GetPerfCounter() - llPerfLock;
- } else {
- m_VBlankLockTime = 0;
- }
-
- m_RasterStatusWaitTime = m_RasterStatusWaitTimeMaxCalc;
- m_RasterStatusWaitTimeMin = min(m_RasterStatusWaitTimeMin, m_RasterStatusWaitTime);
- m_RasterStatusWaitTimeMax = max(m_RasterStatusWaitTimeMax, m_RasterStatusWaitTime);
- }
-
- return bWaited;
+ if (_bMeasure) {
+ m_RasterStatusWaitTimeMaxCalc = 0;
+ }
+ bool bWaited = false;
+ int ScanLine = 0;
+ int InVBlank = 0;
+ LONGLONG llPerf = 0;
+ if (_bMeasure) {
+ llPerf = GetRenderersData()->GetPerfCounter();
+ }
+ GetVBlank(ScanLine, InVBlank, _bMeasure);
+ if (_bMeasure) {
+ m_VBlankStartWait = ScanLine;
+ }
+
+ static bool bOneWait = true;
+ if (bOneWait && _bMeasure) {
+ bOneWait = false;
+ // If we are already in the wanted interval we need to wait until we aren't, this improves sync when for example you are playing 23.976 Hz material on a 24 Hz refresh rate
+ int nInVBlank = 0;
+ for (;;) {
+ if (!GetVBlank(ScanLine, InVBlank, _bMeasure)) {
+ break;
+ }
+
+ if (InVBlank && nInVBlank == 0) {
+ nInVBlank = 1;
+ } else if (!InVBlank && nInVBlank == 1) {
+ nInVBlank = 2;
+ } else if (InVBlank && nInVBlank == 2) {
+ nInVBlank = 3;
+ } else if (!InVBlank && nInVBlank == 3) {
+ break;
+ }
+ }
+ }
+ if (_bWaitIfInside) {
+ int ScanLineDiff = long(ScanLine) - _RasterStart;
+ if (ScanLineDiff > m_ScreenSize.cy / 2) {
+ ScanLineDiff -= m_ScreenSize.cy;
+ } else if (ScanLineDiff < -m_ScreenSize.cy / 2) {
+ ScanLineDiff += m_ScreenSize.cy;
+ }
+
+ if (ScanLineDiff >= 0 && ScanLineDiff <= _RasterSize) {
+ bWaited = true;
+ // If we are already in the wanted interval we need to wait until we aren't, this improves sync when for example you are playing 23.976 Hz material on a 24 Hz refresh rate
+ int LastLineDiff = ScanLineDiff;
+ for (;;) {
+ if (!GetVBlank(ScanLine, InVBlank, _bMeasure)) {
+ break;
+ }
+ int ScanLineDiff = long(ScanLine) - _RasterStart;
+ if (ScanLineDiff > m_ScreenSize.cy / 2) {
+ ScanLineDiff -= m_ScreenSize.cy;
+ } else if (ScanLineDiff < -m_ScreenSize.cy / 2) {
+ ScanLineDiff += m_ScreenSize.cy;
+ }
+ if (!(ScanLineDiff >= 0 && ScanLineDiff <= _RasterSize) || (LastLineDiff < 0 && ScanLineDiff > 0)) {
+ break;
+ }
+ LastLineDiff = ScanLineDiff;
+ Sleep(1); // Just sleep
+ }
+ }
+ }
+ double RefreshRate = GetRefreshRate();
+ LONG ScanLines = GetScanLines();
+ int MinRange = max(min(int(0.0015 * double(ScanLines) * RefreshRate + 0.5), ScanLines / 3), 5); // 1.5 ms or max 33 % of Time
+ int NoSleepStart = _RasterStart - MinRange;
+ int NoSleepRange = MinRange;
+ if (NoSleepStart < 0) {
+ NoSleepStart += m_ScreenSize.cy;
+ }
+
+ int MinRange2 = max(min(int(0.0050 * double(ScanLines) * RefreshRate + 0.5), ScanLines / 3), 5); // 5 ms or max 33 % of Time
+ int D3DDevLockStart = _RasterStart - MinRange2;
+ int D3DDevLockRange = MinRange2;
+ if (D3DDevLockStart < 0) {
+ D3DDevLockStart += m_ScreenSize.cy;
+ }
+
+ int ScanLineDiff = ScanLine - _RasterStart;
+ if (ScanLineDiff > m_ScreenSize.cy / 2) {
+ ScanLineDiff -= m_ScreenSize.cy;
+ } else if (ScanLineDiff < -m_ScreenSize.cy / 2) {
+ ScanLineDiff += m_ScreenSize.cy;
+ }
+ int LastLineDiff = ScanLineDiff;
+
+
+ int ScanLineDiffSleep = long(ScanLine) - NoSleepStart;
+ if (ScanLineDiffSleep > m_ScreenSize.cy / 2) {
+ ScanLineDiffSleep -= m_ScreenSize.cy;
+ } else if (ScanLineDiffSleep < -m_ScreenSize.cy / 2) {
+ ScanLineDiffSleep += m_ScreenSize.cy;
+ }
+ int LastLineDiffSleep = ScanLineDiffSleep;
+
+
+ int ScanLineDiffLock = long(ScanLine) - D3DDevLockStart;
+ if (ScanLineDiffLock > m_ScreenSize.cy / 2) {
+ ScanLineDiffLock -= m_ScreenSize.cy;
+ } else if (ScanLineDiffLock < -m_ScreenSize.cy / 2) {
+ ScanLineDiffLock += m_ScreenSize.cy;
+ }
+ int LastLineDiffLock = ScanLineDiffLock;
+
+ LONGLONG llPerfLock = 0;
+
+ for (;;) {
+ if (!GetVBlank(ScanLine, InVBlank, _bMeasure)) {
+ break;
+ }
+ int ScanLineDiff = long(ScanLine) - _RasterStart;
+ if (ScanLineDiff > m_ScreenSize.cy / 2) {
+ ScanLineDiff -= m_ScreenSize.cy;
+ } else if (ScanLineDiff < -m_ScreenSize.cy / 2) {
+ ScanLineDiff += m_ScreenSize.cy;
+ }
+ if ((ScanLineDiff >= 0 && ScanLineDiff <= _RasterSize) || (LastLineDiff < 0 && ScanLineDiff > 0)) {
+ break;
+ }
+
+ LastLineDiff = ScanLineDiff;
+
+ bWaited = true;
+
+ int ScanLineDiffLock = long(ScanLine) - D3DDevLockStart;
+ if (ScanLineDiffLock > m_ScreenSize.cy / 2) {
+ ScanLineDiffLock -= m_ScreenSize.cy;
+ } else if (ScanLineDiffLock < -m_ScreenSize.cy / 2) {
+ ScanLineDiffLock += m_ScreenSize.cy;
+ }
+
+ if (((ScanLineDiffLock >= 0 && ScanLineDiffLock <= D3DDevLockRange) || (LastLineDiffLock < 0 && ScanLineDiffLock > 0))) {
+ if (!_bTakenLock && _bMeasure) {
+ _bTakenLock = true;
+ llPerfLock = GetRenderersData()->GetPerfCounter();
+ LockD3DDevice();
+ }
+ }
+ LastLineDiffLock = ScanLineDiffLock;
+
+
+ int ScanLineDiffSleep = long(ScanLine) - NoSleepStart;
+ if (ScanLineDiffSleep > m_ScreenSize.cy / 2) {
+ ScanLineDiffSleep -= m_ScreenSize.cy;
+ } else if (ScanLineDiffSleep < -m_ScreenSize.cy / 2) {
+ ScanLineDiffSleep += m_ScreenSize.cy;
+ }
+
+ if (!((ScanLineDiffSleep >= 0 && ScanLineDiffSleep <= NoSleepRange) || (LastLineDiffSleep < 0 && ScanLineDiffSleep > 0)) || !_bNeedAccurate) {
+ //TRACE("%d\n", RasterStatus.ScanLine);
+ Sleep(1); // Don't sleep for the last 1.5 ms scan lines, so we get maximum precision
+ }
+ LastLineDiffSleep = ScanLineDiffSleep;
+ }
+ _RasterStart = ScanLine;
+ if (_bMeasure) {
+ m_VBlankEndWait = ScanLine;
+ m_VBlankWaitTime = GetRenderersData()->GetPerfCounter() - llPerf;
+
+ if (_bTakenLock) {
+ m_VBlankLockTime = GetRenderersData()->GetPerfCounter() - llPerfLock;
+ } else {
+ m_VBlankLockTime = 0;
+ }
+
+ m_RasterStatusWaitTime = m_RasterStatusWaitTimeMaxCalc;
+ m_RasterStatusWaitTimeMin = min(m_RasterStatusWaitTimeMin, m_RasterStatusWaitTime);
+ m_RasterStatusWaitTimeMax = max(m_RasterStatusWaitTimeMax, m_RasterStatusWaitTime);
+ }
+
+ return bWaited;
}
int CDX9AllocatorPresenter::GetVBlackPos()
{
- CRenderersSettings& s = GetRenderersSettings();
- BOOL bCompositionEnabled = m_bCompositionEnabled;
-
- int WaitRange = max(m_ScreenSize.cy / 40, 5);
- if (!bCompositionEnabled) {
- if (m_bAlternativeVSync) {
- return s.m_RenderSettings.iVMR9VSyncOffset;
- } else {
- int MinRange = max(min(int(0.005 * double(m_ScreenSize.cy) * GetRefreshRate() + 0.5), m_ScreenSize.cy/3), 5); // 5 ms or max 33 % of Time
- int WaitFor = m_ScreenSize.cy - (MinRange + WaitRange);
- return WaitFor;
- }
- } else {
- int WaitFor = m_ScreenSize.cy / 2;
- return WaitFor;
- }
+ CRenderersSettings& s = GetRenderersSettings();
+ BOOL bCompositionEnabled = m_bCompositionEnabled;
+
+ int WaitRange = max(m_ScreenSize.cy / 40, 5);
+ if (!bCompositionEnabled) {
+ if (m_bAlternativeVSync) {
+ return s.m_RenderSettings.iVMR9VSyncOffset;
+ } else {
+ int MinRange = max(min(int(0.005 * double(m_ScreenSize.cy) * GetRefreshRate() + 0.5), m_ScreenSize.cy / 3), 5); // 5 ms or max 33 % of Time
+ int WaitFor = m_ScreenSize.cy - (MinRange + WaitRange);
+ return WaitFor;
+ }
+ } else {
+ int WaitFor = m_ScreenSize.cy / 2;
+ return WaitFor;
+ }
}
-bool CDX9AllocatorPresenter::WaitForVBlank(bool &_Waited, bool &_bTakenLock)
+bool CDX9AllocatorPresenter::WaitForVBlank(bool& _Waited, bool& _bTakenLock)
{
- CRenderersSettings& s = GetRenderersSettings();
- if (!s.m_RenderSettings.iVMR9VSync) {
- _Waited = true;
- m_VBlankWaitTime = 0;
- m_VBlankLockTime = 0;
- m_VBlankEndWait = 0;
- m_VBlankStartWait = 0;
- return true;
- }
- //_Waited = true;
- //return false;
-
- BOOL bCompositionEnabled = m_bCompositionEnabled;
- int WaitFor = GetVBlackPos();
-
- if (!bCompositionEnabled) {
- if (m_bAlternativeVSync) {
- _Waited = WaitForVBlankRange(WaitFor, 0, false, true, true, _bTakenLock);
- return false;
- } else {
- _Waited = WaitForVBlankRange(WaitFor, 0, false, s.m_RenderSettings.iVMR9VSyncAccurate, true, _bTakenLock);
- return true;
- }
- } else {
- // Instead we wait for VBlack after the present, this seems to fix the stuttering problem. It's also possible to fix by removing the Sleep above, but that isn't an option.
- WaitForVBlankRange(WaitFor, 0, false, s.m_RenderSettings.iVMR9VSyncAccurate, true, _bTakenLock);
-
- return false;
- }
+ CRenderersSettings& s = GetRenderersSettings();
+ if (!s.m_RenderSettings.iVMR9VSync) {
+ _Waited = true;
+ m_VBlankWaitTime = 0;
+ m_VBlankLockTime = 0;
+ m_VBlankEndWait = 0;
+ m_VBlankStartWait = 0;
+ return true;
+ }
+ //_Waited = true;
+ //return false;
+
+ BOOL bCompositionEnabled = m_bCompositionEnabled;
+ int WaitFor = GetVBlackPos();
+
+ if (!bCompositionEnabled) {
+ if (m_bAlternativeVSync) {
+ _Waited = WaitForVBlankRange(WaitFor, 0, false, true, true, _bTakenLock);
+ return false;
+ } else {
+ _Waited = WaitForVBlankRange(WaitFor, 0, false, s.m_RenderSettings.iVMR9VSyncAccurate, true, _bTakenLock);
+ return true;
+ }
+ } else {
+ // Instead we wait for VBlack after the present, this seems to fix the stuttering problem. It's also possible to fix by removing the Sleep above, but that isn't an option.
+ WaitForVBlankRange(WaitFor, 0, false, s.m_RenderSettings.iVMR9VSyncAccurate, true, _bTakenLock);
+
+ return false;
+ }
}
void CDX9AllocatorPresenter::UpdateAlphaBitmap()
{
- m_VMR9AlphaBitmapData.Free();
-
- if ((m_VMR9AlphaBitmap.dwFlags & VMRBITMAP_DISABLE) == 0) {
- HBITMAP hBitmap = (HBITMAP)GetCurrentObject (m_VMR9AlphaBitmap.hdc, OBJ_BITMAP);
- if (!hBitmap) {
- return;
- }
- DIBSECTION info = {0};
- if (!::GetObject(hBitmap, sizeof( DIBSECTION ), &info )) {
- return;
- }
-
- m_VMR9AlphaBitmapRect = CRect(0, 0, info.dsBm.bmWidth, info.dsBm.bmHeight);
- m_VMR9AlphaBitmapWidthBytes = info.dsBm.bmWidthBytes;
-
- if (m_VMR9AlphaBitmapData.Allocate(info.dsBm.bmWidthBytes * info.dsBm.bmHeight)) {
- memcpy((BYTE *)m_VMR9AlphaBitmapData, info.dsBm.bmBits, info.dsBm.bmWidthBytes * info.dsBm.bmHeight);
- }
- }
+ m_VMR9AlphaBitmapData.Free();
+
+ if ((m_VMR9AlphaBitmap.dwFlags & VMRBITMAP_DISABLE) == 0) {
+ HBITMAP hBitmap = (HBITMAP)GetCurrentObject(m_VMR9AlphaBitmap.hdc, OBJ_BITMAP);
+ if (!hBitmap) {
+ return;
+ }
+ DIBSECTION info = {0};
+ if (!::GetObject(hBitmap, sizeof(DIBSECTION), &info)) {
+ return;
+ }
+
+ m_VMR9AlphaBitmapRect = CRect(0, 0, info.dsBm.bmWidth, info.dsBm.bmHeight);
+ m_VMR9AlphaBitmapWidthBytes = info.dsBm.bmWidthBytes;
+
+ if (m_VMR9AlphaBitmapData.Allocate(info.dsBm.bmWidthBytes * info.dsBm.bmHeight)) {
+ memcpy((BYTE*)m_VMR9AlphaBitmapData, info.dsBm.bmBits, info.dsBm.bmWidthBytes * info.dsBm.bmHeight);
+ }
+ }
}
STDMETHODIMP_(bool) CDX9AllocatorPresenter::Paint(bool fAll)
{
- if (m_bPendingResetDevice) {
- SendResetRequest();
- return false;
- }
+ if (m_bPendingResetDevice) {
+ SendResetRequest();
+ return false;
+ }
- CRenderersSettings& s = GetRenderersSettings();
+ CRenderersSettings& s = GetRenderersSettings();
- //TRACE("Thread: %d\n", (LONG)((CRITICAL_SECTION &)m_RenderLock).OwningThread);
+ //TRACE("Thread: %d\n", (LONG)((CRITICAL_SECTION &)m_RenderLock).OwningThread);
#if 0
- if (TryEnterCriticalSection (&(CRITICAL_SECTION &)(*((CCritSec *)this)))) {
- LeaveCriticalSection((&(CRITICAL_SECTION &)(*((CCritSec *)this))));
- } else {
- __debugbreak();
- }
+ if (TryEnterCriticalSection(&(CRITICAL_SECTION&)(*((CCritSec*)this)))) {
+ LeaveCriticalSection((&(CRITICAL_SECTION&)(*((CCritSec*)this))));
+ } else {
+ __debugbreak();
+ }
#endif
- CRenderersData * pApp = GetRenderersData();
-
- LONGLONG StartPaint = pApp->GetPerfCounter();
- CAutoLock cRenderLock(&m_RenderLock);
-
- if (m_WindowRect.right <= m_WindowRect.left || m_WindowRect.bottom <= m_WindowRect.top
- || m_NativeVideoSize.cx <= 0 || m_NativeVideoSize.cy <= 0
- || !m_pVideoSurface) {
- if (m_OrderedPaint) {
- --m_OrderedPaint;
- } else {
- //TRACE("UNORDERED PAINT!!!!!!\n");
- }
-
-
- return false;
- }
-
- HRESULT hr;
-
- m_pD3DDev->BeginScene();
-
- CComPtr<IDirect3DSurface9> pBackBuffer;
- m_pD3DDev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
-
- // Clear the backbuffer
- m_pD3DDev->SetRenderTarget(0, pBackBuffer);
- hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1.0f, 0);
-
- CRect rSrcVid(CPoint(0, 0), GetVisibleVideoSize());
- CRect rDstVid(m_VideoRect);
-
- CRect rSrcPri(CPoint(0, 0), m_WindowRect.Size());
- CRect rDstPri(m_WindowRect);
-
- // Render the current video frame
- hr = RenderVideo(pBackBuffer, rSrcVid, rDstVid);
-
- if (FAILED(hr)) {
- if (m_RenderingPath == RENDERING_PATH_STRETCHRECT) {
- // Support ffdshow queueing
- // m_pD3DDev->StretchRect may fail if ffdshow is using queue output samples.
- // Here we don't want to show the black buffer.
- if (m_OrderedPaint) {
- --m_OrderedPaint;
- } else {
- //TRACE("UNORDERED PAINT!!!!!!\n");
- }
-
- return false;
- }
- }
-
- // paint the text on the backbuffer
- AlphaBltSubPic(rSrcPri.Size());
-
- // Casimir666 : show OSD
- if (m_VMR9AlphaBitmap.dwFlags & VMRBITMAP_UPDATE) {
- CAutoLock BitMapLock(&m_VMR9AlphaBitmapLock);
- CRect rcSrc (m_VMR9AlphaBitmap.rSrc);
- m_pOSDTexture = NULL;
- m_pOSDSurface = NULL;
- if ((m_VMR9AlphaBitmap.dwFlags & VMRBITMAP_DISABLE) == 0 && (BYTE *)m_VMR9AlphaBitmapData) {
- if ( (m_pD3DXLoadSurfaceFromMemory != NULL) &&
- SUCCEEDED(hr = m_pD3DDev->CreateTexture(rcSrc.Width(), rcSrc.Height(), 1,
- D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
- D3DPOOL_DEFAULT, &m_pOSDTexture, NULL)) ) {
- if (SUCCEEDED (hr = m_pOSDTexture->GetSurfaceLevel(0, &m_pOSDSurface))) {
- hr = m_pD3DXLoadSurfaceFromMemory (m_pOSDSurface,
- NULL,
- NULL,
- (BYTE *)m_VMR9AlphaBitmapData,
- D3DFMT_A8R8G8B8,
- m_VMR9AlphaBitmapWidthBytes,
- NULL,
- &m_VMR9AlphaBitmapRect,
- D3DX_FILTER_NONE,
- m_VMR9AlphaBitmap.clrSrcKey);
- }
- if (FAILED (hr)) {
- m_pOSDTexture = NULL;
- m_pOSDSurface = NULL;
- }
- }
- }
- m_VMR9AlphaBitmap.dwFlags ^= VMRBITMAP_UPDATE;
-
- }
-
- if (pApp->m_bResetStats) {
- ResetStats();
- pApp->m_bResetStats = false;
- }
-
- if (pApp->m_fDisplayStats) {
- DrawStats();
- }
-
- if (m_pOSDTexture) {
- AlphaBlt(rSrcPri, rDstPri, m_pOSDTexture);
- }
-
- m_pD3DDev->EndScene();
-
- BOOL bCompositionEnabled = m_bCompositionEnabled;
-
- bool bDoVSyncInPresent = (!bCompositionEnabled && !m_bAlternativeVSync) || !s.m_RenderSettings.iVMR9VSync;
-
- LONGLONG PresentWaitTime = 0;
-
- CComPtr<IDirect3DQuery9> pEventQuery;
-
- m_pD3DDev->CreateQuery(D3DQUERYTYPE_EVENT, &pEventQuery);
- if (pEventQuery) {
- pEventQuery->Issue(D3DISSUE_END);
- }
-
- if (s.m_RenderSettings.iVMRFlushGPUBeforeVSync && pEventQuery) {
- LONGLONG llPerf = pApp->GetPerfCounter();
- BOOL Data;
- //Sleep(5);
- LONGLONG FlushStartTime = pApp->GetPerfCounter();
- while (S_FALSE == pEventQuery->GetData( &Data, sizeof(Data), D3DGETDATA_FLUSH )) {
- if (!s.m_RenderSettings.iVMRFlushGPUWait) {
- break;
- }
- Sleep(1);
- if (pApp->GetPerfCounter() - FlushStartTime > 500000) {
- break; // timeout after 50 ms
- }
- }
- if (s.m_RenderSettings.iVMRFlushGPUWait) {
- m_WaitForGPUTime = pApp->GetPerfCounter() - llPerf;
- } else {
- m_WaitForGPUTime = 0;
- }
- } else {
- m_WaitForGPUTime = 0;
- }
-
- if (fAll) {
- m_PaintTime = (GetRenderersData()->GetPerfCounter() - StartPaint);
- m_PaintTimeMin = min(m_PaintTimeMin, m_PaintTime);
- m_PaintTimeMax = max(m_PaintTimeMax, m_PaintTime);
- }
-
- bool bWaited = false;
- bool bTakenLock = false;
- if (fAll) {
- // Only sync to refresh when redrawing all
- bool bTest = WaitForVBlank(bWaited, bTakenLock);
- ASSERT(bTest == bDoVSyncInPresent);
- if (!bDoVSyncInPresent) {
- LONGLONG Time = pApp->GetPerfCounter();
- OnVBlankFinished(fAll, Time);
- if (!m_bIsEVR || m_OrderedPaint) {
- CalculateJitter(Time);
- }
- }
- }
-
- // Create a device pointer m_pd3dDevice
-
- // Create a query object
- {
- CComPtr<IDirect3DQuery9> pEventQuery;
- m_pD3DDev->CreateQuery(D3DQUERYTYPE_EVENT, &pEventQuery);
-
- LONGLONG llPerf = pApp->GetPerfCounter();
- if (m_pD3DDevEx) {
- if (m_bIsFullscreen) {
- hr = m_pD3DDevEx->PresentEx(NULL, NULL, NULL, NULL, NULL);
- } else {
- hr = m_pD3DDevEx->PresentEx(rSrcPri, rDstPri, NULL, NULL, NULL);
- }
- } else {
- if (m_bIsFullscreen) {
- hr = m_pD3DDev->Present(NULL, NULL, NULL, NULL);
- } else {
- hr = m_pD3DDev->Present(rSrcPri, rDstPri, NULL, NULL);
- }
- }
- // Issue an End event
- if (pEventQuery) {
- pEventQuery->Issue(D3DISSUE_END);
- }
-
- BOOL Data;
-
- if (s.m_RenderSettings.iVMRFlushGPUAfterPresent && pEventQuery) {
- LONGLONG FlushStartTime = pApp->GetPerfCounter();
- while (S_FALSE == pEventQuery->GetData( &Data, sizeof(Data), D3DGETDATA_FLUSH )) {
- if (!s.m_RenderSettings.iVMRFlushGPUWait) {
- break;
- }
- if (pApp->GetPerfCounter() - FlushStartTime > 500000) {
- break; // timeout after 50 ms
- }
- }
- }
-
- int ScanLine;
- int bInVBlank;
- GetVBlank(ScanLine, bInVBlank, false);
-
- if (fAll && (!m_bIsEVR || m_OrderedPaint)) {
- m_VBlankEndPresent = ScanLine;
- }
-
- while (ScanLine == 0 || bInVBlank) {
- GetVBlank(ScanLine, bInVBlank, false);
-
- }
- m_VBlankStartMeasureTime = pApp->GetPerfCounter();
- m_VBlankStartMeasure = ScanLine;
-
- if (fAll && bDoVSyncInPresent) {
- m_PresentWaitTime = (pApp->GetPerfCounter() - llPerf) + PresentWaitTime;
- m_PresentWaitTimeMin = min(m_PresentWaitTimeMin, m_PresentWaitTime);
- m_PresentWaitTimeMax = max(m_PresentWaitTimeMax, m_PresentWaitTime);
- } else {
- m_PresentWaitTime = 0;
- m_PresentWaitTimeMin = min(m_PresentWaitTimeMin, m_PresentWaitTime);
- m_PresentWaitTimeMax = max(m_PresentWaitTimeMax, m_PresentWaitTime);
- }
- }
-
- if (bDoVSyncInPresent) {
- LONGLONG Time = pApp->GetPerfCounter();
- if (!m_bIsEVR || m_OrderedPaint) {
- CalculateJitter(Time);
- }
- OnVBlankFinished(fAll, Time);
- }
-
- if (bTakenLock) {
- UnlockD3DDevice();
- }
-
- /*if (!bWaited)
- {
- bWaited = true;
- WaitForVBlank(bWaited);
- TRACE("Double VBlank\n");
- ASSERT(bWaited);
- if (!bDoVSyncInPresent)
- {
- CalculateJitter();
- OnVBlankFinished(fAll);
- }
- }*/
-
- if (!m_bPendingResetDevice) {
- bool fResetDevice = false;
-
- if (hr == D3DERR_DEVICELOST && m_pD3DDev->TestCooperativeLevel() == D3DERR_DEVICENOTRESET) {
- TRACE("Reset Device: D3D Device Lost\n");
- fResetDevice = true;
- }
-
- //if (hr == S_PRESENT_MODE_CHANGED)
- //{
- // TRACE("Reset Device: D3D Device mode changed\n");
- // fResetDevice = true;
- //}
-
- if (SettingsNeedResetDevice()) {
- TRACE("Reset Device: settings changed\n");
- fResetDevice = true;
- }
-
- bCompositionEnabled = false;
- if (m_pDwmIsCompositionEnabled) {
- m_pDwmIsCompositionEnabled(&bCompositionEnabled);
- }
- if ((bCompositionEnabled != 0) != m_bCompositionEnabled) {
- if (m_bIsFullscreen) {
- m_bCompositionEnabled = (bCompositionEnabled != 0);
- } else {
- TRACE("Reset Device: DWM composition changed\n");
- fResetDevice = true;
- }
- }
-
- if (s.fResetDevice) {
- LONGLONG time = GetRenderersData()->GetPerfCounter();
- if (time > m_LastAdapterCheck + 20000000) { // check every 2 sec.
- m_LastAdapterCheck = time;
+ CRenderersData* pApp = GetRenderersData();
+
+ LONGLONG StartPaint = pApp->GetPerfCounter();
+ CAutoLock cRenderLock(&m_RenderLock);
+
+ if (m_WindowRect.right <= m_WindowRect.left || m_WindowRect.bottom <= m_WindowRect.top
+ || m_NativeVideoSize.cx <= 0 || m_NativeVideoSize.cy <= 0
+ || !m_pVideoSurface) {
+ if (m_OrderedPaint) {
+ --m_OrderedPaint;
+ } else {
+ //TRACE("UNORDERED PAINT!!!!!!\n");
+ }
+
+
+ return false;
+ }
+
+ HRESULT hr;
+
+ m_pD3DDev->BeginScene();
+
+ CComPtr<IDirect3DSurface9> pBackBuffer;
+ m_pD3DDev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
+
+ // Clear the backbuffer
+ m_pD3DDev->SetRenderTarget(0, pBackBuffer);
+ hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1.0f, 0);
+
+ CRect rSrcVid(CPoint(0, 0), GetVisibleVideoSize());
+ CRect rDstVid(m_VideoRect);
+
+ CRect rSrcPri(CPoint(0, 0), m_WindowRect.Size());
+ CRect rDstPri(m_WindowRect);
+
+ // Render the current video frame
+ hr = RenderVideo(pBackBuffer, rSrcVid, rDstVid);
+
+ if (FAILED(hr)) {
+ if (m_RenderingPath == RENDERING_PATH_STRETCHRECT) {
+ // Support ffdshow queueing
+ // m_pD3DDev->StretchRect may fail if ffdshow is using queue output samples.
+ // Here we don't want to show the black buffer.
+ if (m_OrderedPaint) {
+ --m_OrderedPaint;
+ } else {
+ //TRACE("UNORDERED PAINT!!!!!!\n");
+ }
+
+ return false;
+ }
+ }
+
+ // paint the text on the backbuffer
+ AlphaBltSubPic(rSrcPri.Size());
+
+ // Casimir666 : show OSD
+ if (m_VMR9AlphaBitmap.dwFlags & VMRBITMAP_UPDATE) {
+ CAutoLock BitMapLock(&m_VMR9AlphaBitmapLock);
+ CRect rcSrc(m_VMR9AlphaBitmap.rSrc);
+ m_pOSDTexture = NULL;
+ m_pOSDSurface = NULL;
+ if ((m_VMR9AlphaBitmap.dwFlags & VMRBITMAP_DISABLE) == 0 && (BYTE*)m_VMR9AlphaBitmapData) {
+ if ((m_pD3DXLoadSurfaceFromMemory != NULL) &&
+ SUCCEEDED(hr = m_pD3DDev->CreateTexture(rcSrc.Width(), rcSrc.Height(), 1,
+ D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
+ D3DPOOL_DEFAULT, &m_pOSDTexture, NULL))) {
+ if (SUCCEEDED(hr = m_pOSDTexture->GetSurfaceLevel(0, &m_pOSDSurface))) {
+ hr = m_pD3DXLoadSurfaceFromMemory(m_pOSDSurface,
+ NULL,
+ NULL,
+ (BYTE*)m_VMR9AlphaBitmapData,
+ D3DFMT_A8R8G8B8,
+ m_VMR9AlphaBitmapWidthBytes,
+ NULL,
+ &m_VMR9AlphaBitmapRect,
+ D3DX_FILTER_NONE,
+ m_VMR9AlphaBitmap.clrSrcKey);
+ }
+ if (FAILED(hr)) {
+ m_pOSDTexture = NULL;
+ m_pOSDSurface = NULL;
+ }
+ }
+ }
+ m_VMR9AlphaBitmap.dwFlags ^= VMRBITMAP_UPDATE;
+
+ }
+
+ if (pApp->m_bResetStats) {
+ ResetStats();
+ pApp->m_bResetStats = false;
+ }
+
+ if (pApp->m_fDisplayStats) {
+ DrawStats();
+ }
+
+ if (m_pOSDTexture) {
+ AlphaBlt(rSrcPri, rDstPri, m_pOSDTexture);
+ }
+
+ m_pD3DDev->EndScene();
+
+ BOOL bCompositionEnabled = m_bCompositionEnabled;
+
+ bool bDoVSyncInPresent = (!bCompositionEnabled && !m_bAlternativeVSync) || !s.m_RenderSettings.iVMR9VSync;
+
+ LONGLONG PresentWaitTime = 0;
+
+ CComPtr<IDirect3DQuery9> pEventQuery;
+
+ m_pD3DDev->CreateQuery(D3DQUERYTYPE_EVENT, &pEventQuery);
+ if (pEventQuery) {
+ pEventQuery->Issue(D3DISSUE_END);
+ }
+
+ if (s.m_RenderSettings.iVMRFlushGPUBeforeVSync && pEventQuery) {
+ LONGLONG llPerf = pApp->GetPerfCounter();
+ BOOL Data;
+ //Sleep(5);
+ LONGLONG FlushStartTime = pApp->GetPerfCounter();
+ while (S_FALSE == pEventQuery->GetData(&Data, sizeof(Data), D3DGETDATA_FLUSH)) {
+ if (!s.m_RenderSettings.iVMRFlushGPUWait) {
+ break;
+ }
+ Sleep(1);
+ if (pApp->GetPerfCounter() - FlushStartTime > 500000) {
+ break; // timeout after 50 ms
+ }
+ }
+ if (s.m_RenderSettings.iVMRFlushGPUWait) {
+ m_WaitForGPUTime = pApp->GetPerfCounter() - llPerf;
+ } else {
+ m_WaitForGPUTime = 0;
+ }
+ } else {
+ m_WaitForGPUTime = 0;
+ }
+
+ if (fAll) {
+ m_PaintTime = (GetRenderersData()->GetPerfCounter() - StartPaint);
+ m_PaintTimeMin = min(m_PaintTimeMin, m_PaintTime);
+ m_PaintTimeMax = max(m_PaintTimeMax, m_PaintTime);
+ }
+
+ bool bWaited = false;
+ bool bTakenLock = false;
+ if (fAll) {
+ // Only sync to refresh when redrawing all
+ bool bTest = WaitForVBlank(bWaited, bTakenLock);
+ ASSERT(bTest == bDoVSyncInPresent);
+ if (!bDoVSyncInPresent) {
+ LONGLONG Time = pApp->GetPerfCounter();
+ OnVBlankFinished(fAll, Time);
+ if (!m_bIsEVR || m_OrderedPaint) {
+ CalculateJitter(Time);
+ }
+ }
+ }
+
+ // Create a device pointer m_pd3dDevice
+
+ // Create a query object
+ {
+ CComPtr<IDirect3DQuery9> pEventQuery;
+ m_pD3DDev->CreateQuery(D3DQUERYTYPE_EVENT, &pEventQuery);
+
+ LONGLONG llPerf = pApp->GetPerfCounter();
+ if (m_pD3DDevEx) {
+ if (m_bIsFullscreen) {
+ hr = m_pD3DDevEx->PresentEx(NULL, NULL, NULL, NULL, NULL);
+ } else {
+ hr = m_pD3DDevEx->PresentEx(rSrcPri, rDstPri, NULL, NULL, NULL);
+ }
+ } else {
+ if (m_bIsFullscreen) {
+ hr = m_pD3DDev->Present(NULL, NULL, NULL, NULL);
+ } else {
+ hr = m_pD3DDev->Present(rSrcPri, rDstPri, NULL, NULL);
+ }
+ }
+ // Issue an End event
+ if (pEventQuery) {
+ pEventQuery->Issue(D3DISSUE_END);
+ }
+
+ BOOL Data;
+
+ if (s.m_RenderSettings.iVMRFlushGPUAfterPresent && pEventQuery) {
+ LONGLONG FlushStartTime = pApp->GetPerfCounter();
+ while (S_FALSE == pEventQuery->GetData(&Data, sizeof(Data), D3DGETDATA_FLUSH)) {
+ if (!s.m_RenderSettings.iVMRFlushGPUWait) {
+ break;
+ }
+ if (pApp->GetPerfCounter() - FlushStartTime > 500000) {
+ break; // timeout after 50 ms
+ }
+ }
+ }
+
+ int ScanLine;
+ int bInVBlank;
+ GetVBlank(ScanLine, bInVBlank, false);
+
+ if (fAll && (!m_bIsEVR || m_OrderedPaint)) {
+ m_VBlankEndPresent = ScanLine;
+ }
+
+ while (ScanLine == 0 || bInVBlank) {
+ GetVBlank(ScanLine, bInVBlank, false);
+
+ }
+ m_VBlankStartMeasureTime = pApp->GetPerfCounter();
+ m_VBlankStartMeasure = ScanLine;
+
+ if (fAll && bDoVSyncInPresent) {
+ m_PresentWaitTime = (pApp->GetPerfCounter() - llPerf) + PresentWaitTime;
+ m_PresentWaitTimeMin = min(m_PresentWaitTimeMin, m_PresentWaitTime);
+ m_PresentWaitTimeMax = max(m_PresentWaitTimeMax, m_PresentWaitTime);
+ } else {
+ m_PresentWaitTime = 0;
+ m_PresentWaitTimeMin = min(m_PresentWaitTimeMin, m_PresentWaitTime);
+ m_PresentWaitTimeMax = max(m_PresentWaitTimeMax, m_PresentWaitTime);
+ }
+ }
+
+ if (bDoVSyncInPresent) {
+ LONGLONG Time = pApp->GetPerfCounter();
+ if (!m_bIsEVR || m_OrderedPaint) {
+ CalculateJitter(Time);
+ }
+ OnVBlankFinished(fAll, Time);
+ }
+
+ if (bTakenLock) {
+ UnlockD3DDevice();
+ }
+
+ /*if (!bWaited)
+ {
+ bWaited = true;
+ WaitForVBlank(bWaited);
+ TRACE("Double VBlank\n");
+ ASSERT(bWaited);
+ if (!bDoVSyncInPresent)
+ {
+ CalculateJitter();
+ OnVBlankFinished(fAll);
+ }
+ }*/
+
+ if (!m_bPendingResetDevice) {
+ bool fResetDevice = false;
+
+ if (hr == D3DERR_DEVICELOST && m_pD3DDev->TestCooperativeLevel() == D3DERR_DEVICENOTRESET) {
+ TRACE("Reset Device: D3D Device Lost\n");
+ fResetDevice = true;
+ }
+
+ //if (hr == S_PRESENT_MODE_CHANGED)
+ //{
+ // TRACE("Reset Device: D3D Device mode changed\n");
+ // fResetDevice = true;
+ //}
+
+ if (SettingsNeedResetDevice()) {
+ TRACE("Reset Device: settings changed\n");
+ fResetDevice = true;
+ }
+
+ bCompositionEnabled = false;
+ if (m_pDwmIsCompositionEnabled) {
+ m_pDwmIsCompositionEnabled(&bCompositionEnabled);
+ }
+ if ((bCompositionEnabled != 0) != m_bCompositionEnabled) {
+ if (m_bIsFullscreen) {
+ m_bCompositionEnabled = (bCompositionEnabled != 0);
+ } else {
+ TRACE("Reset Device: DWM composition changed\n");
+ fResetDevice = true;
+ }
+ }
+
+ if (s.fResetDevice) {
+ LONGLONG time = GetRenderersData()->GetPerfCounter();
+ if (time > m_LastAdapterCheck + 20000000) { // check every 2 sec.
+ m_LastAdapterCheck = time;
#ifdef _DEBUG
- D3DDEVICE_CREATION_PARAMETERS Parameters;
- if (SUCCEEDED(m_pD3DDev->GetCreationParameters(&Parameters))) {
- ASSERT(Parameters.AdapterOrdinal == m_CurrentAdapter);
- }
+ D3DDEVICE_CREATION_PARAMETERS Parameters;
+ if (SUCCEEDED(m_pD3DDev->GetCreationParameters(&Parameters))) {
+ ASSERT(Parameters.AdapterOrdinal == m_CurrentAdapter);
+ }
#endif
- if (m_CurrentAdapter != GetAdapter(m_pD3D)) {
- TRACE("Reset Device: D3D adapter changed\n");
- fResetDevice = true;
- }
+ if (m_CurrentAdapter != GetAdapter(m_pD3D)) {
+ TRACE("Reset Device: D3D adapter changed\n");
+ fResetDevice = true;
+ }
#ifdef _DEBUG
- else {
- ASSERT(m_pD3D->GetAdapterMonitor(m_CurrentAdapter) == m_pD3D->GetAdapterMonitor(GetAdapter(m_pD3D)));
- }
+ else {
+ ASSERT(m_pD3D->GetAdapterMonitor(m_CurrentAdapter) == m_pD3D->GetAdapterMonitor(GetAdapter(m_pD3D)));
+ }
#endif
- }
- }
-
- if (fResetDevice) {
- m_bPendingResetDevice = true;
- SendResetRequest();
- }
- }
-
- if (m_OrderedPaint) {
- --m_OrderedPaint;
- } else {
- //if (m_bIsEVR)
- // TRACE("UNORDERED PAINT!!!!!!\n");
- }
- return true;
+ }
+ }
+
+ if (fResetDevice) {
+ m_bPendingResetDevice = true;
+ SendResetRequest();
+ }
+ }
+
+ if (m_OrderedPaint) {
+ --m_OrderedPaint;
+ } else {
+ //if (m_bIsEVR)
+ // TRACE("UNORDERED PAINT!!!!!!\n");
+ }
+ return true;
}
double CDX9AllocatorPresenter::GetFrameTime() const
{
- if (m_DetectedLock) {
- return m_DetectedFrameTime;
- }
+ if (m_DetectedLock) {
+ return m_DetectedFrameTime;
+ }
- return m_rtTimePerFrame / 10000000.0;
+ return m_rtTimePerFrame / 10000000.0;
}
double CDX9AllocatorPresenter::GetFrameRate() const
{
- if (m_DetectedLock) {
- return m_DetectedFrameRate;
- }
+ if (m_DetectedLock) {
+ return m_DetectedFrameRate;
+ }
- return 10000000.0 / m_rtTimePerFrame;
+ return 10000000.0 / m_rtTimePerFrame;
}
void CDX9AllocatorPresenter::SendResetRequest()
{
- if (!m_bDeviceResetRequested) {
- m_bDeviceResetRequested = true;
- AfxGetApp()->m_pMainWnd->PostMessage(WM_RESET_DEVICE);
- }
+ if (!m_bDeviceResetRequested) {
+ m_bDeviceResetRequested = true;
+ AfxGetApp()->m_pMainWnd->PostMessage(WM_RESET_DEVICE);
+ }
}
STDMETHODIMP_(bool) CDX9AllocatorPresenter::ResetDevice()
{
- TRACE("ResetDevice\n");
- _ASSERT(m_MainThreadId == GetCurrentThreadId());
- StopWorkerThreads();
-
- // In VMR-9 deleting the surfaces before we are told to is bad !
- // Can't comment out this because CDX9AllocatorPresenter is used by EVR Custom
- // Why is EVR using a presenter for DX9 anyway ?!
- DeleteSurfaces();
-
- HRESULT hr;
- CString Error;
- // TODO: Report error messages here
-
- // In VMR-9 'AllocSurfaces' call is redundant afaik because
- // 'CreateDevice' calls 'm_pIVMRSurfAllocNotify->ChangeD3DDevice' which in turn calls
- // 'CVMR9AllocatorPresenter::InitializeDevice' which calls 'AllocSurfaces'
- if (FAILED(hr = CreateDevice(Error)) || FAILED(hr = AllocSurfaces())) {
- // TODO: We should probably pause player
+ TRACE("ResetDevice\n");
+ _ASSERT(m_MainThreadId == GetCurrentThreadId());
+ StopWorkerThreads();
+
+ // In VMR-9 deleting the surfaces before we are told to is bad !
+ // Can't comment out this because CDX9AllocatorPresenter is used by EVR Custom
+ // Why is EVR using a presenter for DX9 anyway ?!
+ DeleteSurfaces();
+
+ HRESULT hr;
+ CString Error;
+ // TODO: Report error messages here
+
+ // In VMR-9 'AllocSurfaces' call is redundant afaik because
+ // 'CreateDevice' calls 'm_pIVMRSurfAllocNotify->ChangeD3DDevice' which in turn calls
+ // 'CVMR9AllocatorPresenter::InitializeDevice' which calls 'AllocSurfaces'
+ if (FAILED(hr = CreateDevice(Error)) || FAILED(hr = AllocSurfaces())) {
+ // TODO: We should probably pause player
#ifdef _DEBUG
- Error += GetWindowsErrorMessage(hr, NULL);
- TRACE("D3D Reset Error\n%ws\n\n", Error.GetBuffer());
+ Error += GetWindowsErrorMessage(hr, NULL);
+ TRACE("D3D Reset Error\n%ws\n\n", Error.GetBuffer());
#endif
- m_bDeviceResetRequested = false;
- return false;
- }
- OnResetDevice();
- m_bDeviceResetRequested = false;
- m_bPendingResetDevice = false;
-
- return true;
+ m_bDeviceResetRequested = false;
+ return false;
+ }
+ OnResetDevice();
+ m_bDeviceResetRequested = false;
+ m_bPendingResetDevice = false;
+
+ return true;
}
STDMETHODIMP_(bool) CDX9AllocatorPresenter::DisplayChange()
{
- SendResetRequest();
- return true;
+ SendResetRequest();
+ return true;
}
-void CDX9AllocatorPresenter::DrawText(const RECT &rc, const CString &strText, int _Priority)
+void CDX9AllocatorPresenter::DrawText(const RECT& rc, const CString& strText, int _Priority)
{
- if (_Priority < 1) {
- return;
- }
- int Quality = 1;
- D3DXCOLOR Color1( 1.0f, 0.2f, 0.2f, 1.0f );
- D3DXCOLOR Color0( 0.0f, 0.0f, 0.0f, 1.0f );
- RECT Rect1 = rc;
- RECT Rect2 = rc;
- if (Quality == 1) {
- OffsetRect (&Rect2 , 2, 2);
- } else {
- OffsetRect (&Rect2 , -1, -1);
- }
- if (Quality > 0) {
- m_pFont->DrawText( m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , 1, 0);
- if (Quality > 3) {
- m_pFont->DrawText( m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , 1, 0);
- if (Quality > 2) {
- m_pFont->DrawText( m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , 0, 1);
- if (Quality > 3) {
- m_pFont->DrawText( m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , 0, 1);
- if (Quality > 1) {
- m_pFont->DrawText( m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , -1, 0);
- if (Quality > 3) {
- m_pFont->DrawText( m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , -1, 0);
- if (Quality > 2) {
- m_pFont->DrawText( m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , 0, -1);
- if (Quality > 3) {
- m_pFont->DrawText( m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- m_pFont->DrawText( m_pSprite, strText, -1, &Rect1, DT_NOCLIP, Color1);
+ if (_Priority < 1) {
+ return;
+ }
+ int Quality = 1;
+ D3DXCOLOR Color1(1.0f, 0.2f, 0.2f, 1.0f);
+ D3DXCOLOR Color0(0.0f, 0.0f, 0.0f, 1.0f);
+ RECT Rect1 = rc;
+ RECT Rect2 = rc;
+ if (Quality == 1) {
+ OffsetRect(&Rect2 , 2, 2);
+ } else {
+ OffsetRect(&Rect2 , -1, -1);
+ }
+ if (Quality > 0) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , 1, 0);
+ if (Quality > 3) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , 1, 0);
+ if (Quality > 2) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , 0, 1);
+ if (Quality > 3) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , 0, 1);
+ if (Quality > 1) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , -1, 0);
+ if (Quality > 3) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , -1, 0);
+ if (Quality > 2) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , 0, -1);
+ if (Quality > 3) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect1, DT_NOCLIP, Color1);
}
void CDX9AllocatorPresenter::ResetStats()
{
- CRenderersData *pApp = GetRenderersData();
- LONGLONG Time = pApp->GetPerfCounter();
+ CRenderersData* pApp = GetRenderersData();
+ LONGLONG Time = pApp->GetPerfCounter();
- m_PaintTime = 0;
- m_PaintTimeMin = 0;
- m_PaintTimeMax = 0;
+ m_PaintTime = 0;
+ m_PaintTimeMin = 0;
+ m_PaintTimeMax = 0;
- m_RasterStatusWaitTime = 0;
- m_RasterStatusWaitTimeMin = 0;
- m_RasterStatusWaitTimeMax = 0;
+ m_RasterStatusWaitTime = 0;
+ m_RasterStatusWaitTimeMin = 0;
+ m_RasterStatusWaitTimeMax = 0;
- m_MinSyncOffset = 0;
- m_MaxSyncOffset = 0;
- m_fSyncOffsetAvr = 0;
- m_fSyncOffsetStdDev = 0;
+ m_MinSyncOffset = 0;
+ m_MaxSyncOffset = 0;
+ m_fSyncOffsetAvr = 0;
+ m_fSyncOffsetStdDev = 0;
- CalculateJitter(Time);
+ CalculateJitter(Time);
}
void CDX9AllocatorPresenter::DrawStats()
{
- CRenderersSettings& s = GetRenderersSettings();
- CRenderersData *pApp = GetRenderersData();
- int bDetailedStats = 2;
- switch (pApp->m_fDisplayStats) {
- case 1:
- bDetailedStats = 2;
- break;
- case 2:
- bDetailedStats = 1;
- break;
- case 3:
- bDetailedStats = 0;
- break;
- }
-
- LONGLONG llMaxJitter = m_MaxJitter;
- LONGLONG llMinJitter = m_MinJitter;
- LONGLONG llMaxSyncOffset = m_MaxSyncOffset;
- LONGLONG llMinSyncOffset = m_MinSyncOffset;
- RECT rc = {40, 40, 0, 0 };
- if (m_pFont && m_pSprite) {
- m_pSprite->Begin(D3DXSPRITE_ALPHABLEND);
- CString strText;
- int TextHeight = int(25.0*m_TextScale + 0.5);
- //strText.Format(L"Frame rate : %7.03f (%7.3f ms = %.03f, %s) (%7.3f ms = %.03f%s) Clock: %7.3f ms %+1.4f %% %+1.9f %+1.9f", m_fAvrFps, double(m_rtTimePerFrame) / 10000.0, 10000000.0 / (double)(m_rtTimePerFrame), m_bInterlaced ? L"I" : L"P", GetFrameTime() * 1000.0, GetFrameRate(), m_DetectedLock ? L" L" : L"", m_ClockDiff/10000.0, m_ModeratedTimeSpeed*100.0 - 100.0, m_ModeratedTimeSpeedDiff, m_ClockDiffCalc/10000.0);
- if (bDetailedStats > 1) {
- if (m_bIsEVR) {
- if (m_nFrameType != PICT_NONE) {
- strText.Format(L"Frame rate : %7.03f (%7.3f ms = %.03f, %s) (%7.3f ms = %.03f%s, %2.03f StdDev) Clock: %1.4f %%", m_fAvrFps, double(m_rtTimePerFrame) / 10000.0, 10000000.0 / (double)(m_rtTimePerFrame), m_nFrameType == PICT_FRAME ? L"P" : L"I", GetFrameTime() * 1000.0, GetFrameRate(), m_DetectedLock ? L" L" : L"", m_DetectedFrameTimeStdDev / 10000.0, m_ModeratedTimeSpeed*100.0);
- } else {
- strText.Format(L"Frame rate : %7.03f (%7.3f ms = %.03f, %s) (%7.3f ms = %.03f%s, %2.03f StdDev) Clock: %1.4f %%", m_fAvrFps, double(m_rtTimePerFrame) / 10000.0, 10000000.0 / (double)(m_rtTimePerFrame), m_bInterlaced ? L"I" : L"P", GetFrameTime() * 1000.0, GetFrameRate(), m_DetectedLock ? L" L" : L"", m_DetectedFrameTimeStdDev / 10000.0, m_ModeratedTimeSpeed*100.0);
- }
- } else {
- strText.Format(L"Frame rate : %7.03f (%7.3f ms = %.03f, %s)", m_fAvrFps, double(m_rtTimePerFrame) / 10000.0, 10000000.0 / (double)(m_rtTimePerFrame), m_bInterlaced ? L"I" : L"P");
- }
- }
- //strText.Format(L"Frame rate : %7.03f (%7.3f ms = %.03f, %s) (%7.3f ms = %.03f%s, %2.03f StdDev)", m_fAvrFps, double(m_rtTimePerFrame) / 10000.0, 10000000.0 / (double)(m_rtTimePerFrame), m_bInterlaced ? L"I" : L"P", GetFrameTime() * 1000.0, GetFrameRate(), m_DetectedLock ? L" L" : L"", m_DetectedFrameTimeStdDev / 10000.0);
- else {
- strText.Format(L"Frame rate : %7.03f (%.03f%s)", m_fAvrFps, GetFrameRate(), m_DetectedLock ? L" L" : L"");
- }
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
-
- if (m_nFrameType != PICT_NONE) {
- strText.Format(L"Frame type : %s", m_nFrameType == PICT_FRAME ? L"Progressive" : m_nFrameType == PICT_BOTTOM_FIELD ? L"Interlaced : Bottom field first" : L"Interlaced : Top field first");
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
- }
-
- if (bDetailedStats > 1) {
- strText = L"Settings : ";
-
- if (m_bIsEVR) {
- strText += "EVR ";
- } else {
- strText += "VMR9 ";
- }
-
- if (m_bIsFullscreen) {
- strText += "FS ";
- }
- if (s.m_RenderSettings.iVMR9FullscreenGUISupport) {
- strText += "FSGui ";
- }
-
- if (s.m_RenderSettings.iVMRDisableDesktopComposition) {
- strText += "DisDC ";
- }
-
- if (m_bColorManagement) {
- strText += "ColorMan ";
- }
-
- if (s.m_RenderSettings.iVMRFlushGPUBeforeVSync) {
- strText += "GPUFlushBV ";
- }
- if (s.m_RenderSettings.iVMRFlushGPUAfterPresent) {
- strText += "GPUFlushAP ";
- }
-
- if (s.m_RenderSettings.iVMRFlushGPUWait) {
- strText += "GPUFlushWt ";
- }
-
- if (s.m_RenderSettings.iVMR9VSync) {
- strText += "VS ";
- }
- if (s.m_RenderSettings.fVMR9AlterativeVSync) {
- strText += "AltVS ";
- }
- if (s.m_RenderSettings.iVMR9VSyncAccurate) {
- strText += "AccVS ";
- }
- if (s.m_RenderSettings.iVMR9VSyncOffset) {
- strText.AppendFormat(L"VSOfst(%d)", s.m_RenderSettings.iVMR9VSyncOffset);
- }
-
- if (m_bFullFloatingPointProcessing) {
- strText += "FullFP ";
- }
-
- if (m_bHalfFloatingPointProcessing) {
- strText += "HalfFP ";
- }
-
- if (m_bIsEVR) {
- if (m_bHighColorResolution) {
- strText += "10bitOut ";
- }
- if (m_bForceInputHighColorResolution) {
- strText += "For10bitIn ";
- }
- if (s.m_RenderSettings.iEVREnableFrameTimeCorrection) {
- strText += "FTC ";
- }
- if (s.m_RenderSettings.iEVROutputRange == 0) {
- strText += "0-255 ";
- } else if (s.m_RenderSettings.iEVROutputRange == 1) {
- strText += "16-235 ";
- }
- }
-
-
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
-
- }
-
- if (bDetailedStats > 1) {
- strText.Format(L"Formats : Surface %s Backbuffer %s Display %s Device %s D3DExError: %s", GetD3DFormatStr(m_SurfaceType), GetD3DFormatStr(m_BackbufferType), GetD3DFormatStr(m_DisplayType), m_pD3DDevEx ? L"D3DDevEx" : L"D3DDev", m_D3DDevExError.GetString());
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
-
- if (m_bIsEVR) {
- strText.Format(L"Refresh rate : %.05f Hz SL: %4d (%3d Hz) Last Duration: %10.6f Corrected Frame Time: %s", m_DetectedRefreshRate, int(m_DetectedScanlinesPerFrame + 0.5), m_RefreshRate, double(m_LastFrameDuration)/10000.0, m_bCorrectedFrameTime?L"Yes":L"No");
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
- }
- }
-
- if (m_bSyncStatsAvailable) {
- if (bDetailedStats > 1) {
- strText.Format(L"Sync offset : Min = %+8.3f ms, Max = %+8.3f ms, StdDev = %7.3f ms, Avr = %7.3f ms, Mode = %d", (double(llMinSyncOffset)/10000.0), (double(llMaxSyncOffset)/10000.0), m_fSyncOffsetStdDev/10000.0, m_fSyncOffsetAvr/10000.0, m_VSyncMode);
- } else {
- strText.Format(L"Sync offset : Mode = %d", m_VSyncMode);
- }
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
- }
-
- if (bDetailedStats > 1) {
- strText.Format(L"Jitter : Min = %+8.3f ms, Max = %+8.3f ms, StdDev = %7.3f ms", (double(llMinJitter)/10000.0), (double(llMaxJitter)/10000.0), m_fJitterStdDev/10000.0);
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
- }
-
- if (m_pAllocator && bDetailedStats > 1) {
- CDX9SubPicAllocator *pAlloc = (CDX9SubPicAllocator *)m_pAllocator.p;
- int nFree = 0;
- int nAlloc = 0;
- int nSubPic = 0;
- REFERENCE_TIME QueueStart = 0;
- REFERENCE_TIME QueueEnd = 0;
-
- if (m_pSubPicQueue) {
- REFERENCE_TIME QueueNow = 0;
- m_pSubPicQueue->GetStats(nSubPic, QueueNow, QueueStart, QueueEnd);
-
- if (QueueStart) {
- QueueStart -= QueueNow;
- }
-
- if (QueueEnd) {
- QueueEnd -= QueueNow;
- }
- }
-
- pAlloc->GetStats(nFree, nAlloc);
- strText.Format(L"Subtitles : Free %d Allocated %d Buffered %d QueueStart %7.3f QueueEnd %7.3f", nFree, nAlloc, nSubPic, (double(QueueStart)/10000000.0), (double(QueueEnd)/10000000.0));
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
- }
-
- if (bDetailedStats > 1) {
- if (m_VBlankEndPresent == -100000) {
- strText.Format(L"VBlank Wait : Start %4d End %4d Wait %7.3f ms Lock %7.3f ms Offset %4d Max %4d", m_VBlankStartWait, m_VBlankEndWait, (double(m_VBlankWaitTime)/10000.0), (double(m_VBlankLockTime)/10000.0), m_VBlankMin, m_VBlankMax - m_VBlankMin);
- } else {
- strText.Format(L"VBlank Wait : Start %4d End %4d Wait %7.3f ms Lock %7.3f ms Offset %4d Max %4d EndPresent %4d", m_VBlankStartWait, m_VBlankEndWait, (double(m_VBlankWaitTime)/10000.0), (double(m_VBlankLockTime)/10000.0), m_VBlankMin, m_VBlankMax - m_VBlankMin, m_VBlankEndPresent);
- }
- } else {
- if (m_VBlankEndPresent == -100000) {
- strText.Format(L"VBlank Wait : Start %4d End %4d", m_VBlankStartWait, m_VBlankEndWait);
- } else {
- strText.Format(L"VBlank Wait : Start %4d End %4d EP %4d", m_VBlankStartWait, m_VBlankEndWait, m_VBlankEndPresent);
- }
- }
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
-
- BOOL bCompositionEnabled = m_bCompositionEnabled;
-
- bool bDoVSyncInPresent = (!bCompositionEnabled && !m_bAlternativeVSync) || !s.m_RenderSettings.iVMR9VSync;
-
- if (bDetailedStats > 1 && bDoVSyncInPresent) {
- strText.Format(L"Present Wait : Wait %7.3f ms Min %7.3f ms Max %7.3f ms", (double(m_PresentWaitTime)/10000.0), (double(m_PresentWaitTimeMin)/10000.0), (double(m_PresentWaitTimeMax)/10000.0));
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
- }
-
- if (bDetailedStats > 1) {
- if (m_WaitForGPUTime) {
- strText.Format(L"Paint Time : Draw %7.3f ms Min %7.3f ms Max %7.3f ms GPU %7.3f ms", (double(m_PaintTime-m_WaitForGPUTime)/10000.0), (double(m_PaintTimeMin)/10000.0), (double(m_PaintTimeMax)/10000.0), (double(m_WaitForGPUTime)/10000.0));
- } else {
- strText.Format(L"Paint Time : Draw %7.3f ms Min %7.3f ms Max %7.3f ms", (double(m_PaintTime-m_WaitForGPUTime)/10000.0), (double(m_PaintTimeMin)/10000.0), (double(m_PaintTimeMax)/10000.0));
- }
- } else {
- if (m_WaitForGPUTime) {
- strText.Format(L"Paint Time : Draw %7.3f ms GPU %7.3f ms", (double(m_PaintTime - m_WaitForGPUTime)/10000.0), (double(m_WaitForGPUTime)/10000.0));
- } else {
- strText.Format(L"Paint Time : Draw %7.3f ms", (double(m_PaintTime - m_WaitForGPUTime)/10000.0));
- }
- }
- DrawText(rc, strText, 2);
- OffsetRect (&rc, 0, TextHeight);
-
- if (bDetailedStats > 1) {
- strText.Format(L"Raster Status: Wait %7.3f ms Min %7.3f ms Max %7.3f ms", (double(m_RasterStatusWaitTime)/10000.0), (double(m_RasterStatusWaitTimeMin)/10000.0), (double(m_RasterStatusWaitTimeMax)/10000.0));
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
- }
-
- if (bDetailedStats > 1) {
- if (m_bIsEVR) {
- strText.Format(L"Buffering : Buffered %3d Free %3d Current Surface %3d", m_nUsedBuffer, m_nNbDXSurface - m_nUsedBuffer, m_nCurSurface, m_nVMR9Surfaces, m_iVMR9Surface);
- } else {
- strText.Format(L"Buffering : VMR9Surfaces %3d VMR9Surface %3d", m_nVMR9Surfaces, m_iVMR9Surface);
- }
- } else {
- strText.Format(L"Buffered : %3d", m_nUsedBuffer);
- }
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
-
- if (bDetailedStats > 1) {
- strText.Format(L"Video size : %d x %d (AR = %d : %d)", m_NativeVideoSize.cx, m_NativeVideoSize.cy, m_AspectRatio.cx, m_AspectRatio.cy);
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
- if (m_pVideoTexture[0] || m_pVideoSurface[0]) {
- D3DSURFACE_DESC desc;
- if (m_pVideoTexture[0]) {
- m_pVideoTexture[0]->GetLevelDesc(0, &desc);
- } else if (m_pVideoSurface[0]) {
- m_pVideoSurface[0]->GetDesc(&desc);
- }
-
- if (desc.Width != (UINT)m_NativeVideoSize.cx || desc.Height != (UINT)m_NativeVideoSize.cy) {
- strText.Format(L"Texture size : %d x %d", desc.Width, desc.Height);
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
- }
- }
-
-
- strText.Format(L"%-13s: %s", GetDXVAVersion(), GetDXVADecoderDescription());
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
-
- strText.Format(L"DirectX SDK : %u", GetRenderersData()->GetDXSdkRelease());
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
-
- if (m_D3D9Device != _T("")) {
- strText = "Render device: " + m_D3D9Device;
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
- }
-
- if (m_Decoder != _T("")) {
- strText = "Decoder : " + m_Decoder;
- DrawText(rc, strText, 1);
- OffsetRect (&rc, 0, TextHeight);
- }
-
- for (int i=0; i<6; i++) {
- if (m_strStatsMsg[i][0]) {
- DrawText(rc, m_strStatsMsg[i], 1);
- OffsetRect (&rc, 0, TextHeight);
- }
- }
- }
- m_pSprite->End();
- OffsetRect(&rc, 0, TextHeight); // Extra "line feed"
- }
-
- if (m_pLine && bDetailedStats) {
- D3DXVECTOR2 Points[NB_JITTER];
- int nIndex;
-
- int StartX = 0;
- int StartY = 0;
- int ScaleX = 1;
- int ScaleY = 1;
- int DrawWidth = 625 * ScaleX + 50;
- int DrawHeight = 250 * ScaleY;
- int Alpha = 80;
- StartX = m_WindowRect.Width() - (DrawWidth + 20);
- StartY = m_WindowRect.Height() - (DrawHeight + 20);
-
- DrawRect(RGB(0,0,0), Alpha, CRect(StartX, StartY, StartX + DrawWidth, StartY + DrawHeight));
- // === Jitter Graduation
- //m_pLine->SetWidth(2.2); // Width
- //m_pLine->SetAntialias(1);
- m_pLine->SetWidth(2.5); // Width
- m_pLine->SetAntialias(1);
- //m_pLine->SetGLLines(1);
- m_pLine->Begin();
-
- for (int i=10; i<250*ScaleY; i+= 10*ScaleY) {
- Points[0].x = (FLOAT)StartX;
- Points[0].y = (FLOAT)(StartY + i);
- Points[1].x = (FLOAT)(StartX + ((i-10)%40 ? 50 : 625 * ScaleX));
- Points[1].y = (FLOAT)(StartY + i);
- if (i == 130) {
- Points[1].x += 50;
- }
- m_pLine->Draw (Points, 2, D3DCOLOR_XRGB(100,100,255));
- }
-
- // === Jitter curve
- if (m_rtTimePerFrame) {
- for (int i=0; i<NB_JITTER; i++) {
- nIndex = (m_nNextJitter+1+i) % NB_JITTER;
- if (nIndex < 0) {
- nIndex += NB_JITTER;
- }
- double Jitter = m_pllJitter[nIndex] - m_fJitterMean;
- Points[i].x = (FLOAT)(StartX + (i*5*ScaleX+5));
- Points[i].y = (FLOAT)(StartY + ((Jitter*ScaleY)/5000.0 + 125.0* ScaleY));
- }
- m_pLine->Draw (Points, NB_JITTER, D3DCOLOR_XRGB(255,100,100));
-
- if (m_bSyncStatsAvailable) {
- for (int i=0; i<NB_JITTER; i++) {
- nIndex = (m_nNextSyncOffset+1+i) % NB_JITTER;
- if (nIndex < 0) {
- nIndex += NB_JITTER;
- }
- Points[i].x = (FLOAT)(StartX + (i*5*ScaleX+5));
- Points[i].y = (FLOAT)(StartY + ((m_pllSyncOffset[nIndex]*ScaleY)/5000 + 125*ScaleY));
- }
- m_pLine->Draw (Points, NB_JITTER, D3DCOLOR_XRGB(100,200,100));
- }
- }
- m_pLine->End();
- }
-
- // === Text
+ CRenderersSettings& s = GetRenderersSettings();
+ CRenderersData* pApp = GetRenderersData();
+ int bDetailedStats = 2;
+ switch (pApp->m_fDisplayStats) {
+ case 1:
+ bDetailedStats = 2;
+ break;
+ case 2:
+ bDetailedStats = 1;
+ break;
+ case 3:
+ bDetailedStats = 0;
+ break;
+ }
+
+ LONGLONG llMaxJitter = m_MaxJitter;
+ LONGLONG llMinJitter = m_MinJitter;
+ LONGLONG llMaxSyncOffset = m_MaxSyncOffset;
+ LONGLONG llMinSyncOffset = m_MinSyncOffset;
+ RECT rc = {40, 40, 0, 0 };
+ if (m_pFont && m_pSprite) {
+ m_pSprite->Begin(D3DXSPRITE_ALPHABLEND);
+ CString strText;
+ int TextHeight = int(25.0 * m_TextScale + 0.5);
+ //strText.Format(L"Frame rate : %7.03f (%7.3f ms = %.03f, %s) (%7.3f ms = %.03f%s) Clock: %7.3f ms %+1.4f %% %+1.9f %+1.9f", m_fAvrFps, double(m_rtTimePerFrame) / 10000.0, 10000000.0 / (double)(m_rtTimePerFrame), m_bInterlaced ? L"I" : L"P", GetFrameTime() * 1000.0, GetFrameRate(), m_DetectedLock ? L" L" : L"", m_ClockDiff/10000.0, m_ModeratedTimeSpeed*100.0 - 100.0, m_ModeratedTimeSpeedDiff, m_ClockDiffCalc/10000.0);
+ if (bDetailedStats > 1) {
+ if (m_bIsEVR) {
+ if (m_nFrameType != PICT_NONE) {
+ strText.Format(L"Frame rate : %7.03f (%7.3f ms = %.03f, %s) (%7.3f ms = %.03f%s, %2.03f StdDev) Clock: %1.4f %%", m_fAvrFps, double(m_rtTimePerFrame) / 10000.0, 10000000.0 / (double)(m_rtTimePerFrame), m_nFrameType == PICT_FRAME ? L"P" : L"I", GetFrameTime() * 1000.0, GetFrameRate(), m_DetectedLock ? L" L" : L"", m_DetectedFrameTimeStdDev / 10000.0, m_ModeratedTimeSpeed * 100.0);
+ } else {
+ strText.Format(L"Frame rate : %7.03f (%7.3f ms = %.03f, %s) (%7.3f ms = %.03f%s, %2.03f StdDev) Clock: %1.4f %%", m_fAvrFps, double(m_rtTimePerFrame) / 10000.0, 10000000.0 / (double)(m_rtTimePerFrame), m_bInterlaced ? L"I" : L"P", GetFrameTime() * 1000.0, GetFrameRate(), m_DetectedLock ? L" L" : L"", m_DetectedFrameTimeStdDev / 10000.0, m_ModeratedTimeSpeed * 100.0);
+ }
+ } else {
+ strText.Format(L"Frame rate : %7.03f (%7.3f ms = %.03f, %s)", m_fAvrFps, double(m_rtTimePerFrame) / 10000.0, 10000000.0 / (double)(m_rtTimePerFrame), m_bInterlaced ? L"I" : L"P");
+ }
+ }
+ //strText.Format(L"Frame rate : %7.03f (%7.3f ms = %.03f, %s) (%7.3f ms = %.03f%s, %2.03f StdDev)", m_fAvrFps, double(m_rtTimePerFrame) / 10000.0, 10000000.0 / (double)(m_rtTimePerFrame), m_bInterlaced ? L"I" : L"P", GetFrameTime() * 1000.0, GetFrameRate(), m_DetectedLock ? L" L" : L"", m_DetectedFrameTimeStdDev / 10000.0);
+ else {
+ strText.Format(L"Frame rate : %7.03f (%.03f%s)", m_fAvrFps, GetFrameRate(), m_DetectedLock ? L" L" : L"");
+ }
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ if (m_nFrameType != PICT_NONE) {
+ strText.Format(L"Frame type : %s", m_nFrameType == PICT_FRAME ? L"Progressive" : m_nFrameType == PICT_BOTTOM_FIELD ? L"Interlaced : Bottom field first" : L"Interlaced : Top field first");
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+
+ if (bDetailedStats > 1) {
+ strText = L"Settings : ";
+
+ if (m_bIsEVR) {
+ strText += "EVR ";
+ } else {
+ strText += "VMR9 ";
+ }
+
+ if (m_bIsFullscreen) {
+ strText += "FS ";
+ }
+ if (s.m_RenderSettings.iVMR9FullscreenGUISupport) {
+ strText += "FSGui ";
+ }
+
+ if (s.m_RenderSettings.iVMRDisableDesktopComposition) {
+ strText += "DisDC ";
+ }
+
+ if (m_bColorManagement) {
+ strText += "ColorMan ";
+ }
+
+ if (s.m_RenderSettings.iVMRFlushGPUBeforeVSync) {
+ strText += "GPUFlushBV ";
+ }
+ if (s.m_RenderSettings.iVMRFlushGPUAfterPresent) {
+ strText += "GPUFlushAP ";
+ }
+
+ if (s.m_RenderSettings.iVMRFlushGPUWait) {
+ strText += "GPUFlushWt ";
+ }
+
+ if (s.m_RenderSettings.iVMR9VSync) {
+ strText += "VS ";
+ }
+ if (s.m_RenderSettings.fVMR9AlterativeVSync) {
+ strText += "AltVS ";
+ }
+ if (s.m_RenderSettings.iVMR9VSyncAccurate) {
+ strText += "AccVS ";
+ }
+ if (s.m_RenderSettings.iVMR9VSyncOffset) {
+ strText.AppendFormat(L"VSOfst(%d)", s.m_RenderSettings.iVMR9VSyncOffset);
+ }
+
+ if (m_bFullFloatingPointProcessing) {
+ strText += "FullFP ";
+ }
+
+ if (m_bHalfFloatingPointProcessing) {
+ strText += "HalfFP ";
+ }
+
+ if (m_bIsEVR) {
+ if (m_bHighColorResolution) {
+ strText += "10bitOut ";
+ }
+ if (m_bForceInputHighColorResolution) {
+ strText += "For10bitIn ";
+ }
+ if (s.m_RenderSettings.iEVREnableFrameTimeCorrection) {
+ strText += "FTC ";
+ }
+ if (s.m_RenderSettings.iEVROutputRange == 0) {
+ strText += "0-255 ";
+ } else if (s.m_RenderSettings.iEVROutputRange == 1) {
+ strText += "16-235 ";
+ }
+ }
+
+
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ }
+
+ if (bDetailedStats > 1) {
+ strText.Format(L"Formats : Surface %s Backbuffer %s Display %s Device %s D3DExError: %s", GetD3DFormatStr(m_SurfaceType), GetD3DFormatStr(m_BackbufferType), GetD3DFormatStr(m_DisplayType), m_pD3DDevEx ? L"D3DDevEx" : L"D3DDev", m_D3DDevExError.GetString());
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ if (m_bIsEVR) {
+ strText.Format(L"Refresh rate : %.05f Hz SL: %4d (%3d Hz) Last Duration: %10.6f Corrected Frame Time: %s", m_DetectedRefreshRate, int(m_DetectedScanlinesPerFrame + 0.5), m_RefreshRate, double(m_LastFrameDuration) / 10000.0, m_bCorrectedFrameTime ? L"Yes" : L"No");
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+ }
+
+ if (m_bSyncStatsAvailable) {
+ if (bDetailedStats > 1) {
+ strText.Format(L"Sync offset : Min = %+8.3f ms, Max = %+8.3f ms, StdDev = %7.3f ms, Avr = %7.3f ms, Mode = %d", (double(llMinSyncOffset) / 10000.0), (double(llMaxSyncOffset) / 10000.0), m_fSyncOffsetStdDev / 10000.0, m_fSyncOffsetAvr / 10000.0, m_VSyncMode);
+ } else {
+ strText.Format(L"Sync offset : Mode = %d", m_VSyncMode);
+ }
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+
+ if (bDetailedStats > 1) {
+ strText.Format(L"Jitter : Min = %+8.3f ms, Max = %+8.3f ms, StdDev = %7.3f ms", (double(llMinJitter) / 10000.0), (double(llMaxJitter) / 10000.0), m_fJitterStdDev / 10000.0);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+
+ if (m_pAllocator && bDetailedStats > 1) {
+ CDX9SubPicAllocator* pAlloc = (CDX9SubPicAllocator*)m_pAllocator.p;
+ int nFree = 0;
+ int nAlloc = 0;
+ int nSubPic = 0;
+ REFERENCE_TIME QueueStart = 0;
+ REFERENCE_TIME QueueEnd = 0;
+
+ if (m_pSubPicQueue) {
+ REFERENCE_TIME QueueNow = 0;
+ m_pSubPicQueue->GetStats(nSubPic, QueueNow, QueueStart, QueueEnd);
+
+ if (QueueStart) {
+ QueueStart -= QueueNow;
+ }
+
+ if (QueueEnd) {
+ QueueEnd -= QueueNow;
+ }
+ }
+
+ pAlloc->GetStats(nFree, nAlloc);
+ strText.Format(L"Subtitles : Free %d Allocated %d Buffered %d QueueStart %7.3f QueueEnd %7.3f", nFree, nAlloc, nSubPic, (double(QueueStart) / 10000000.0), (double(QueueEnd) / 10000000.0));
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+
+ if (bDetailedStats > 1) {
+ if (m_VBlankEndPresent == -100000) {
+ strText.Format(L"VBlank Wait : Start %4d End %4d Wait %7.3f ms Lock %7.3f ms Offset %4d Max %4d", m_VBlankStartWait, m_VBlankEndWait, (double(m_VBlankWaitTime) / 10000.0), (double(m_VBlankLockTime) / 10000.0), m_VBlankMin, m_VBlankMax - m_VBlankMin);
+ } else {
+ strText.Format(L"VBlank Wait : Start %4d End %4d Wait %7.3f ms Lock %7.3f ms Offset %4d Max %4d EndPresent %4d", m_VBlankStartWait, m_VBlankEndWait, (double(m_VBlankWaitTime) / 10000.0), (double(m_VBlankLockTime) / 10000.0), m_VBlankMin, m_VBlankMax - m_VBlankMin, m_VBlankEndPresent);
+ }
+ } else {
+ if (m_VBlankEndPresent == -100000) {
+ strText.Format(L"VBlank Wait : Start %4d End %4d", m_VBlankStartWait, m_VBlankEndWait);
+ } else {
+ strText.Format(L"VBlank Wait : Start %4d End %4d EP %4d", m_VBlankStartWait, m_VBlankEndWait, m_VBlankEndPresent);
+ }
+ }
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ BOOL bCompositionEnabled = m_bCompositionEnabled;
+
+ bool bDoVSyncInPresent = (!bCompositionEnabled && !m_bAlternativeVSync) || !s.m_RenderSettings.iVMR9VSync;
+
+ if (bDetailedStats > 1 && bDoVSyncInPresent) {
+ strText.Format(L"Present Wait : Wait %7.3f ms Min %7.3f ms Max %7.3f ms", (double(m_PresentWaitTime) / 10000.0), (double(m_PresentWaitTimeMin) / 10000.0), (double(m_PresentWaitTimeMax) / 10000.0));
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+
+ if (bDetailedStats > 1) {
+ if (m_WaitForGPUTime) {
+ strText.Format(L"Paint Time : Draw %7.3f ms Min %7.3f ms Max %7.3f ms GPU %7.3f ms", (double(m_PaintTime - m_WaitForGPUTime) / 10000.0), (double(m_PaintTimeMin) / 10000.0), (double(m_PaintTimeMax) / 10000.0), (double(m_WaitForGPUTime) / 10000.0));
+ } else {
+ strText.Format(L"Paint Time : Draw %7.3f ms Min %7.3f ms Max %7.3f ms", (double(m_PaintTime - m_WaitForGPUTime) / 10000.0), (double(m_PaintTimeMin) / 10000.0), (double(m_PaintTimeMax) / 10000.0));
+ }
+ } else {
+ if (m_WaitForGPUTime) {
+ strText.Format(L"Paint Time : Draw %7.3f ms GPU %7.3f ms", (double(m_PaintTime - m_WaitForGPUTime) / 10000.0), (double(m_WaitForGPUTime) / 10000.0));
+ } else {
+ strText.Format(L"Paint Time : Draw %7.3f ms", (double(m_PaintTime - m_WaitForGPUTime) / 10000.0));
+ }
+ }
+ DrawText(rc, strText, 2);
+ OffsetRect(&rc, 0, TextHeight);
+
+ if (bDetailedStats > 1) {
+ strText.Format(L"Raster Status: Wait %7.3f ms Min %7.3f ms Max %7.3f ms", (double(m_RasterStatusWaitTime) / 10000.0), (double(m_RasterStatusWaitTimeMin) / 10000.0), (double(m_RasterStatusWaitTimeMax) / 10000.0));
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+
+ if (bDetailedStats > 1) {
+ if (m_bIsEVR) {
+ strText.Format(L"Buffering : Buffered %3d Free %3d Current Surface %3d", m_nUsedBuffer, m_nNbDXSurface - m_nUsedBuffer, m_nCurSurface, m_nVMR9Surfaces, m_iVMR9Surface);
+ } else {
+ strText.Format(L"Buffering : VMR9Surfaces %3d VMR9Surface %3d", m_nVMR9Surfaces, m_iVMR9Surface);
+ }
+ } else {
+ strText.Format(L"Buffered : %3d", m_nUsedBuffer);
+ }
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ if (bDetailedStats > 1) {
+ strText.Format(L"Video size : %d x %d (AR = %d : %d)", m_NativeVideoSize.cx, m_NativeVideoSize.cy, m_AspectRatio.cx, m_AspectRatio.cy);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ if (m_pVideoTexture[0] || m_pVideoSurface[0]) {
+ D3DSURFACE_DESC desc;
+ if (m_pVideoTexture[0]) {
+ m_pVideoTexture[0]->GetLevelDesc(0, &desc);
+ } else if (m_pVideoSurface[0]) {
+ m_pVideoSurface[0]->GetDesc(&desc);
+ }
+
+ if (desc.Width != (UINT)m_NativeVideoSize.cx || desc.Height != (UINT)m_NativeVideoSize.cy) {
+ strText.Format(L"Texture size : %d x %d", desc.Width, desc.Height);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+ }
+
+
+ strText.Format(L"%-13s: %s", GetDXVAVersion(), GetDXVADecoderDescription());
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ strText.Format(L"DirectX SDK : %u", GetRenderersData()->GetDXSdkRelease());
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ if (m_D3D9Device != _T("")) {
+ strText = "Render device: " + m_D3D9Device;
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+
+ if (m_Decoder != _T("")) {
+ strText = "Decoder : " + m_Decoder;
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+
+ for (int i = 0; i < 6; i++) {
+ if (m_strStatsMsg[i][0]) {
+ DrawText(rc, m_strStatsMsg[i], 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+ }
+ }
+ m_pSprite->End();
+ OffsetRect(&rc, 0, TextHeight); // Extra "line feed"
+ }
+
+ if (m_pLine && bDetailedStats) {
+ D3DXVECTOR2 Points[NB_JITTER];
+ int nIndex;
+
+ int StartX = 0;
+ int StartY = 0;
+ int ScaleX = 1;
+ int ScaleY = 1;
+ int DrawWidth = 625 * ScaleX + 50;
+ int DrawHeight = 250 * ScaleY;
+ int Alpha = 80;
+ StartX = m_WindowRect.Width() - (DrawWidth + 20);
+ StartY = m_WindowRect.Height() - (DrawHeight + 20);
+
+ DrawRect(RGB(0, 0, 0), Alpha, CRect(StartX, StartY, StartX + DrawWidth, StartY + DrawHeight));
+ // === Jitter Graduation
+ //m_pLine->SetWidth(2.2); // Width
+ //m_pLine->SetAntialias(1);
+ m_pLine->SetWidth(2.5); // Width
+ m_pLine->SetAntialias(1);
+ //m_pLine->SetGLLines(1);
+ m_pLine->Begin();
+
+ for (int i = 10; i < 250 * ScaleY; i += 10 * ScaleY) {
+ Points[0].x = (FLOAT)StartX;
+ Points[0].y = (FLOAT)(StartY + i);
+ Points[1].x = (FLOAT)(StartX + ((i - 10) % 40 ? 50 : 625 * ScaleX));
+ Points[1].y = (FLOAT)(StartY + i);
+ if (i == 130) {
+ Points[1].x += 50;
+ }
+ m_pLine->Draw(Points, 2, D3DCOLOR_XRGB(100, 100, 255));
+ }
+
+ // === Jitter curve
+ if (m_rtTimePerFrame) {
+ for (int i = 0; i < NB_JITTER; i++) {
+ nIndex = (m_nNextJitter + 1 + i) % NB_JITTER;
+ if (nIndex < 0) {
+ nIndex += NB_JITTER;
+ }
+ double Jitter = m_pllJitter[nIndex] - m_fJitterMean;
+ Points[i].x = (FLOAT)(StartX + (i * 5 * ScaleX + 5));
+ Points[i].y = (FLOAT)(StartY + ((Jitter * ScaleY) / 5000.0 + 125.0 * ScaleY));
+ }
+ m_pLine->Draw(Points, NB_JITTER, D3DCOLOR_XRGB(255, 100, 100));
+
+ if (m_bSyncStatsAvailable) {
+ for (int i = 0; i < NB_JITTER; i++) {
+ nIndex = (m_nNextSyncOffset + 1 + i) % NB_JITTER;
+ if (nIndex < 0) {
+ nIndex += NB_JITTER;
+ }
+ Points[i].x = (FLOAT)(StartX + (i * 5 * ScaleX + 5));
+ Points[i].y = (FLOAT)(StartY + ((m_pllSyncOffset[nIndex] * ScaleY) / 5000 + 125 * ScaleY));
+ }
+ m_pLine->Draw(Points, NB_JITTER, D3DCOLOR_XRGB(100, 200, 100));
+ }
+ }
+ m_pLine->End();
+ }
+
+ // === Text
}
STDMETHODIMP CDX9AllocatorPresenter::GetDIB(BYTE* lpDib, DWORD* size)
{
- CheckPointer(size, E_POINTER);
-
- HRESULT hr;
-
- D3DSURFACE_DESC desc;
- memset(&desc, 0, sizeof(desc));
- m_pVideoSurface[m_nCurSurface]->GetDesc(&desc);
-
- DWORD required = sizeof(BITMAPINFOHEADER) + (desc.Width * desc.Height * 32 >> 3);
- if (!lpDib) {
- *size = required;
- return S_OK;
- }
- if (*size < required) {
- return E_OUTOFMEMORY;
- }
- *size = required;
-
- D3DLOCKED_RECT r;
- CComPtr<IDirect3DSurface9> pSurface;
- if (m_bFullFloatingPointProcessing || m_bHalfFloatingPointProcessing || m_bHighColorResolution) {
- CComPtr<IDirect3DSurface9> fSurface = m_pVideoSurface[m_nCurSurface];
- if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(desc.Width, desc.Height, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &fSurface, NULL))
- || FAILED(hr = m_pD3DXLoadSurfaceFromSurface(fSurface, NULL, NULL, m_pVideoSurface[m_nCurSurface], NULL, NULL, D3DX_DEFAULT, 0))) return hr;
- pSurface = fSurface;
- if (FAILED(hr = pSurface->LockRect(&r, NULL, D3DLOCK_READONLY))) {
- pSurface = NULL;
- if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(desc.Width, desc.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &pSurface, NULL))
- || FAILED(hr = m_pD3DDev->GetRenderTargetData(fSurface, pSurface))
- || FAILED(hr = pSurface->LockRect(&r, NULL, D3DLOCK_READONLY))) return hr;
- }
- }
- else {
- pSurface = m_pVideoSurface[m_nCurSurface];
- if (FAILED(hr = pSurface->LockRect(&r, NULL, D3DLOCK_READONLY))) {
- pSurface = NULL;
- if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &pSurface, NULL))
- || FAILED(hr = m_pD3DDev->GetRenderTargetData(m_pVideoSurface[m_nCurSurface], pSurface))
- || FAILED(hr = pSurface->LockRect(&r, NULL, D3DLOCK_READONLY))) return hr;
- }
- }
-
- BITMAPINFOHEADER* bih = (BITMAPINFOHEADER*)lpDib;
- memset(bih, 0, sizeof(BITMAPINFOHEADER));
- bih->biSize = sizeof(BITMAPINFOHEADER);
- bih->biWidth = desc.Width;
- bih->biHeight = desc.Height;
- bih->biBitCount = 32;
- bih->biPlanes = 1;
- bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount >> 3;
-
- BitBltFromRGBToRGB(
- bih->biWidth, bih->biHeight,
- (BYTE*)(bih + 1), bih->biWidth*bih->biBitCount>>3, bih->biBitCount,
- (BYTE*)r.pBits + r.Pitch*(desc.Height-1), -(int)r.Pitch, 32);
-
- pSurface->UnlockRect();
-
- return S_OK;
+ CheckPointer(size, E_POINTER);
+
+ HRESULT hr;
+
+ D3DSURFACE_DESC desc;
+ memset(&desc, 0, sizeof(desc));
+ m_pVideoSurface[m_nCurSurface]->GetDesc(&desc);
+
+ DWORD required = sizeof(BITMAPINFOHEADER) + (desc.Width * desc.Height * 32 >> 3);
+ if (!lpDib) {
+ *size = required;
+ return S_OK;
+ }
+ if (*size < required) {
+ return E_OUTOFMEMORY;
+ }
+ *size = required;
+
+ D3DLOCKED_RECT r;
+ CComPtr<IDirect3DSurface9> pSurface;
+ if (m_bFullFloatingPointProcessing || m_bHalfFloatingPointProcessing || m_bHighColorResolution) {
+ CComPtr<IDirect3DSurface9> fSurface = m_pVideoSurface[m_nCurSurface];
+ if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(desc.Width, desc.Height, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &fSurface, NULL))
+ || FAILED(hr = m_pD3DXLoadSurfaceFromSurface(fSurface, NULL, NULL, m_pVideoSurface[m_nCurSurface], NULL, NULL, D3DX_DEFAULT, 0))) { return hr; }
+ pSurface = fSurface;
+ if (FAILED(hr = pSurface->LockRect(&r, NULL, D3DLOCK_READONLY))) {
+ pSurface = NULL;
+ if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(desc.Width, desc.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &pSurface, NULL))
+ || FAILED(hr = m_pD3DDev->GetRenderTargetData(fSurface, pSurface))
+ || FAILED(hr = pSurface->LockRect(&r, NULL, D3DLOCK_READONLY))) { return hr; }
+ }
+ } else {
+ pSurface = m_pVideoSurface[m_nCurSurface];
+ if (FAILED(hr = pSurface->LockRect(&r, NULL, D3DLOCK_READONLY))) {
+ pSurface = NULL;
+ if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &pSurface, NULL))
+ || FAILED(hr = m_pD3DDev->GetRenderTargetData(m_pVideoSurface[m_nCurSurface], pSurface))
+ || FAILED(hr = pSurface->LockRect(&r, NULL, D3DLOCK_READONLY))) { return hr; }
+ }
+ }
+
+ BITMAPINFOHEADER* bih = (BITMAPINFOHEADER*)lpDib;
+ memset(bih, 0, sizeof(BITMAPINFOHEADER));
+ bih->biSize = sizeof(BITMAPINFOHEADER);
+ bih->biWidth = desc.Width;
+ bih->biHeight = desc.Height;
+ bih->biBitCount = 32;
+ bih->biPlanes = 1;
+ bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount >> 3;
+
+ BitBltFromRGBToRGB(
+ bih->biWidth, bih->biHeight,
+ (BYTE*)(bih + 1), bih->biWidth * bih->biBitCount >> 3, bih->biBitCount,
+ (BYTE*)r.pBits + r.Pitch * (desc.Height - 1), -(int)r.Pitch, 32);
+
+ pSurface->UnlockRect();
+
+ return S_OK;
}
STDMETHODIMP CDX9AllocatorPresenter::SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget)
{
- return SetPixelShader2(pSrcData, pTarget, false);
+ return SetPixelShader2(pSrcData, pTarget, false);
}
STDMETHODIMP CDX9AllocatorPresenter::SetPixelShader2(LPCSTR pSrcData, LPCSTR pTarget, bool bScreenSpace)
{
- CAutoLock cRenderLock(&m_RenderLock);
+ CAutoLock cRenderLock(&m_RenderLock);
- return SetCustomPixelShader(pSrcData, pTarget, bScreenSpace);
+ return SetCustomPixelShader(pSrcData, pTarget, bScreenSpace);
}
diff --git a/src/filters/renderer/VideoRenderers/DX9AllocatorPresenter.h b/src/filters/renderer/VideoRenderers/DX9AllocatorPresenter.h
index 4eee9ec68..9eec7bf06 100644
--- a/src/filters/renderer/VideoRenderers/DX9AllocatorPresenter.h
+++ b/src/filters/renderer/VideoRenderers/DX9AllocatorPresenter.h
@@ -25,11 +25,11 @@
#include "DX9RenderingEngine.h"
-#define VMRBITMAP_UPDATE 0x80000000
+#define VMRBITMAP_UPDATE 0x80000000
-#define NB_JITTER 126
+#define NB_JITTER 126
-#define PCIV_ATI 0x1002
+#define PCIV_ATI 0x1002
extern bool g_bNoDuration;
extern bool g_bExternalSubtitleTime;
@@ -37,278 +37,278 @@ extern bool g_bExternalSubtitleTime;
namespace DSObjects
{
- class CDX9AllocatorPresenter
- : public CDX9RenderingEngine
- {
- public:
- CCritSec m_VMR9AlphaBitmapLock;
- void UpdateAlphaBitmap();
- protected:
- UINT m_RefreshRate;
- bool m_bAlternativeVSync;
- bool m_bCompositionEnabled;
- bool m_bIsEVR;
- int m_OrderedPaint;
- int m_VSyncMode;
- bool m_bDesktopCompositionDisabled;
- bool m_bIsFullscreen;
- bool m_bNeedCheckSample;
- DWORD m_MainThreadId;
-
- CRenderersSettings::CRendererSettingsEVR m_LastRendererSettings;
-
- HRESULT (__stdcall * m_pDwmIsCompositionEnabled)(__out BOOL* pfEnabled);
- HRESULT (__stdcall * m_pDwmEnableComposition)(UINT uCompositionAction);
-
- HMODULE m_hDWMAPI;
-
- HRESULT (__stdcall * m_pDirect3DCreate9Ex)(UINT SDKVersion, IDirect3D9Ex**);
- HMODULE m_hD3D9;
-
- CCritSec m_RenderLock;
- CComPtr<IDirectDraw> m_pDirectDraw;
-
- void LockD3DDevice() {
- if (m_pD3DDev) {
- _RTL_CRITICAL_SECTION *pCritSec = (_RTL_CRITICAL_SECTION *)((size_t)m_pD3DDev.p + sizeof(size_t));
-
- if (!IsBadReadPtr(pCritSec, sizeof(*pCritSec)) && !IsBadWritePtr(pCritSec, sizeof(*pCritSec))
- && !IsBadReadPtr(pCritSec->DebugInfo, sizeof(*(pCritSec->DebugInfo))) && !IsBadWritePtr(pCritSec->DebugInfo, sizeof(*(pCritSec->DebugInfo)))) {
- if (pCritSec->DebugInfo->CriticalSection == pCritSec) {
- EnterCriticalSection(pCritSec);
- }
- }
- }
- }
-
- void UnlockD3DDevice() {
- if (m_pD3DDev) {
- _RTL_CRITICAL_SECTION *pCritSec = (_RTL_CRITICAL_SECTION *)((size_t)m_pD3DDev.p + sizeof(size_t));
-
- if (!IsBadReadPtr(pCritSec, sizeof(*pCritSec)) && !IsBadWritePtr(pCritSec, sizeof(*pCritSec))
- && !IsBadReadPtr(pCritSec->DebugInfo, sizeof(*(pCritSec->DebugInfo))) && !IsBadWritePtr(pCritSec->DebugInfo, sizeof(*(pCritSec->DebugInfo)))) {
- if (pCritSec->DebugInfo->CriticalSection == pCritSec) {
- LeaveCriticalSection(pCritSec);
- }
- }
- }
- }
-
- CString m_D3DDevExError;
- CComPtr<IDirect3DTexture9> m_pOSDTexture;
- CComPtr<IDirect3DSurface9> m_pOSDSurface;
- CComPtr<ID3DXLine> m_pLine;
- CComPtr<ID3DXFont> m_pFont;
- CComPtr<ID3DXSprite> m_pSprite;
-
- bool SettingsNeedResetDevice();
-
- virtual HRESULT CreateDevice(CString &_Error);
- virtual HRESULT AllocSurfaces();
- virtual void DeleteSurfaces();
-
- // Thread stuff
- HANDLE m_hEvtQuit; // Stop rendering thread event
- HANDLE m_hVSyncThread;
- static DWORD WINAPI VSyncThreadStatic(LPVOID lpParam);
- void VSyncThread();
- void StartWorkerThreads();
- void StopWorkerThreads();
-
- LONGLONG m_LastAdapterCheck;
- UINT GetAdapter(IDirect3D9 *pD3D, bool bGetAdapter = true);
- DWORD GetVertexProcessing();
-
- bool GetVBlank(int &_ScanLine, int &_bInVBlank, bool _bMeasureTime);
- bool WaitForVBlankRange(int &_RasterStart, int _RasterEnd, bool _bWaitIfInside, bool _bNeedAccurate, bool _bMeasure, bool &_bTakenLock);
- bool WaitForVBlank(bool &_Waited, bool &_bTakenLock);
- int GetVBlackPos();
- void CalculateJitter(LONGLONG PerformanceCounter);
- virtual void OnVBlankFinished(bool fAll, LONGLONG PerformanceCounter) {}
-
- // Casimir666
- typedef HRESULT (WINAPI * D3DXLoadSurfaceFromMemoryPtr)(
- LPDIRECT3DSURFACE9 pDestSurface,
- CONST PALETTEENTRY* pDestPalette,
- CONST RECT* pDestRect,
- LPCVOID pSrcMemory,
- D3DFORMAT SrcFormat,
- UINT SrcPitch,
- CONST PALETTEENTRY* pSrcPalette,
- CONST RECT* pSrcRect,
- DWORD Filter,
- D3DCOLOR ColorKey);
-
- typedef HRESULT (WINAPI * D3DXLoadSurfaceFromSurfacePtr)(
- LPDIRECT3DSURFACE9 pDestSurface,
- CONST PALETTEENTRY* pDestPalette,
- CONST RECT* pDestRect,
- LPDIRECT3DSURFACE9 pSrcSurface,
- CONST PALETTEENTRY* pSrcPalette,
- CONST RECT* pSrcRect,
- DWORD Filter,
- D3DCOLOR ColorKey);
-
- typedef HRESULT (WINAPI* D3DXCreateLinePtr) (LPDIRECT3DDEVICE9 pDevice, LPD3DXLINE* ppLine);
-
- typedef HRESULT (WINAPI* D3DXCreateFontPtr)(
- LPDIRECT3DDEVICE9 pDevice,
- int Height,
- UINT Width,
- UINT Weight,
- UINT MipLevels,
- bool Italic,
- DWORD CharSet,
- DWORD OutputPrecision,
- DWORD Quality,
- DWORD PitchAndFamily,
- LPCWSTR pFaceName,
- LPD3DXFONT* ppFont);
-
-
- void DrawText(const RECT &rc, const CString &strText, int _Priority);
- void ResetStats();
- void DrawStats();
- virtual void OnResetDevice() {};
- void SendResetRequest();
-
- double GetFrameTime() const;
- double GetFrameRate() const;
-
-
- int m_nTearingPos;
- VMR9AlphaBitmap m_VMR9AlphaBitmap;
- CAutoVectorPtr<BYTE> m_VMR9AlphaBitmapData;
- CRect m_VMR9AlphaBitmapRect;
- int m_VMR9AlphaBitmapWidthBytes;
-
- D3DXLoadSurfaceFromMemoryPtr m_pD3DXLoadSurfaceFromMemory;
- D3DXLoadSurfaceFromSurfacePtr m_pD3DXLoadSurfaceFromSurface;
- D3DXCreateLinePtr m_pD3DXCreateLine;
- D3DXCreateFontPtr m_pD3DXCreateFont;
- HRESULT (__stdcall *m_pD3DXCreateSprite)(LPDIRECT3DDEVICE9 pDevice, LPD3DXSPRITE * ppSprite);
-
-
-
- int m_nVMR9Surfaces; // Total number of DX Surfaces
- int m_iVMR9Surface;
- long m_nUsedBuffer;
-
- double m_fAvrFps; // Estimate the real FPS
- double m_fJitterStdDev; // Estimate the Jitter std dev
- double m_fJitterMean;
- double m_fSyncOffsetStdDev;
- double m_fSyncOffsetAvr;
- double m_DetectedRefreshRate;
-
- CCritSec m_RefreshRateLock;
- double m_DetectedRefreshTime;
- double m_DetectedRefreshTimePrim;
- double m_DetectedScanlineTime;
- double m_DetectedScanlineTimePrim;
- double m_DetectedScanlinesPerFrame;
-
- double GetRefreshRate() const {
- if (m_DetectedRefreshRate) {
- return m_DetectedRefreshRate;
- }
- return m_RefreshRate;
- }
-
- LONG GetScanLines() const {
- if (m_DetectedRefreshRate) {
- return (LONG)m_DetectedScanlinesPerFrame;
- }
- return m_ScreenSize.cy;
- }
-
- double m_ldDetectedRefreshRateList[100];
- double m_ldDetectedScanlineRateList[100];
- int m_DetectedRefreshRatePos;
- bool m_bSyncStatsAvailable;
- LONGLONG m_pllJitter [NB_JITTER]; // Jitter buffer for stats
- LONGLONG m_pllSyncOffset [NB_JITTER]; // Jitter buffer for stats
- LONGLONG m_llLastPerf;
- LONGLONG m_JitterStdDev;
- LONGLONG m_MaxJitter;
- LONGLONG m_MinJitter;
- LONGLONG m_MaxSyncOffset;
- LONGLONG m_MinSyncOffset;
- int m_nNextJitter;
- int m_nNextSyncOffset;
- REFERENCE_TIME m_rtTimePerFrame;
- double m_DetectedFrameRate;
- double m_DetectedFrameTime;
- double m_DetectedFrameTimeStdDev;
- bool m_DetectedLock;
- LONGLONG m_DetectedFrameTimeHistory[60];
- double m_DetectedFrameTimeHistoryHistory[500];
- int m_DetectedFrameTimePos;
- int m_bInterlaced;
- FF_FIELD_TYPE m_nFrameType;
-
- double m_TextScale;
-
- int m_VBlankEndWait;
- int m_VBlankStartWait;
- LONGLONG m_VBlankWaitTime;
- LONGLONG m_VBlankLockTime;
- int m_VBlankMin;
- int m_VBlankMinCalc;
- int m_VBlankMax;
- int m_VBlankEndPresent;
- LONGLONG m_VBlankStartMeasureTime;
- int m_VBlankStartMeasure;
-
- LONGLONG m_PresentWaitTime;
- LONGLONG m_PresentWaitTimeMin;
- LONGLONG m_PresentWaitTimeMax;
-
- LONGLONG m_PaintTime;
- LONGLONG m_PaintTimeMin;
- LONGLONG m_PaintTimeMax;
-
- LONGLONG m_WaitForGPUTime;
-
- LONGLONG m_RasterStatusWaitTime;
- LONGLONG m_RasterStatusWaitTimeMin;
- LONGLONG m_RasterStatusWaitTimeMax;
- LONGLONG m_RasterStatusWaitTimeMaxCalc;
-
- double m_ClockDiffCalc;
- double m_ClockDiffPrim;
- double m_ClockDiff;
-
- double m_TimeChangeHistory[100];
- double m_ClockChangeHistory[100];
- int m_ClockTimeChangeHistoryPos;
- double m_ModeratedTimeSpeed;
- double m_ModeratedTimeSpeedPrim;
- double m_ModeratedTimeSpeedDiff;
-
- bool m_bCorrectedFrameTime;
- int m_FrameTimeCorrection;
- LONGLONG m_LastFrameDuration;
- LONGLONG m_LastSampleTime;
-
- CString m_strStatsMsg[10];
-
- CString m_D3D9Device;
- DWORD m_nPCIVendor;
-
- CString m_Decoder;
-
- public:
- CDX9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, bool bIsEVR, CString &_Error);
- ~CDX9AllocatorPresenter();
-
- // ISubPicAllocatorPresenter
- STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
- STDMETHODIMP_(bool) Paint(bool fAll);
- STDMETHODIMP GetDIB(BYTE* lpDib, DWORD* size);
- STDMETHODIMP SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget);
- STDMETHODIMP SetPixelShader2(LPCSTR pSrcData, LPCSTR pTarget, bool bScreenSpace);
- STDMETHODIMP_(bool) ResetDevice();
- STDMETHODIMP_(bool) DisplayChange();
- };
+ class CDX9AllocatorPresenter
+ : public CDX9RenderingEngine
+ {
+ public:
+ CCritSec m_VMR9AlphaBitmapLock;
+ void UpdateAlphaBitmap();
+ protected:
+ UINT m_RefreshRate;
+ bool m_bAlternativeVSync;
+ bool m_bCompositionEnabled;
+ bool m_bIsEVR;
+ int m_OrderedPaint;
+ int m_VSyncMode;
+ bool m_bDesktopCompositionDisabled;
+ bool m_bIsFullscreen;
+ bool m_bNeedCheckSample;
+ DWORD m_MainThreadId;
+
+ CRenderersSettings::CRendererSettingsEVR m_LastRendererSettings;
+
+ HRESULT(__stdcall* m_pDwmIsCompositionEnabled)(__out BOOL* pfEnabled);
+ HRESULT(__stdcall* m_pDwmEnableComposition)(UINT uCompositionAction);
+
+ HMODULE m_hDWMAPI;
+
+ HRESULT(__stdcall* m_pDirect3DCreate9Ex)(UINT SDKVersion, IDirect3D9Ex**);
+ HMODULE m_hD3D9;
+
+ CCritSec m_RenderLock;
+ CComPtr<IDirectDraw> m_pDirectDraw;
+
+ void LockD3DDevice() {
+ if (m_pD3DDev) {
+ _RTL_CRITICAL_SECTION* pCritSec = (_RTL_CRITICAL_SECTION*)((size_t)m_pD3DDev.p + sizeof(size_t));
+
+ if (!IsBadReadPtr(pCritSec, sizeof(*pCritSec)) && !IsBadWritePtr(pCritSec, sizeof(*pCritSec))
+ && !IsBadReadPtr(pCritSec->DebugInfo, sizeof(*(pCritSec->DebugInfo))) && !IsBadWritePtr(pCritSec->DebugInfo, sizeof(*(pCritSec->DebugInfo)))) {
+ if (pCritSec->DebugInfo->CriticalSection == pCritSec) {
+ EnterCriticalSection(pCritSec);
+ }
+ }
+ }
+ }
+
+ void UnlockD3DDevice() {
+ if (m_pD3DDev) {
+ _RTL_CRITICAL_SECTION* pCritSec = (_RTL_CRITICAL_SECTION*)((size_t)m_pD3DDev.p + sizeof(size_t));
+
+ if (!IsBadReadPtr(pCritSec, sizeof(*pCritSec)) && !IsBadWritePtr(pCritSec, sizeof(*pCritSec))
+ && !IsBadReadPtr(pCritSec->DebugInfo, sizeof(*(pCritSec->DebugInfo))) && !IsBadWritePtr(pCritSec->DebugInfo, sizeof(*(pCritSec->DebugInfo)))) {
+ if (pCritSec->DebugInfo->CriticalSection == pCritSec) {
+ LeaveCriticalSection(pCritSec);
+ }
+ }
+ }
+ }
+
+ CString m_D3DDevExError;
+ CComPtr<IDirect3DTexture9> m_pOSDTexture;
+ CComPtr<IDirect3DSurface9> m_pOSDSurface;
+ CComPtr<ID3DXLine> m_pLine;
+ CComPtr<ID3DXFont> m_pFont;
+ CComPtr<ID3DXSprite> m_pSprite;
+
+ bool SettingsNeedResetDevice();
+
+ virtual HRESULT CreateDevice(CString& _Error);
+ virtual HRESULT AllocSurfaces();
+ virtual void DeleteSurfaces();
+
+ // Thread stuff
+ HANDLE m_hEvtQuit; // Stop rendering thread event
+ HANDLE m_hVSyncThread;
+ static DWORD WINAPI VSyncThreadStatic(LPVOID lpParam);
+ void VSyncThread();
+ void StartWorkerThreads();
+ void StopWorkerThreads();
+
+ LONGLONG m_LastAdapterCheck;
+ UINT GetAdapter(IDirect3D9* pD3D, bool bGetAdapter = true);
+ DWORD GetVertexProcessing();
+
+ bool GetVBlank(int& _ScanLine, int& _bInVBlank, bool _bMeasureTime);
+ bool WaitForVBlankRange(int& _RasterStart, int _RasterEnd, bool _bWaitIfInside, bool _bNeedAccurate, bool _bMeasure, bool& _bTakenLock);
+ bool WaitForVBlank(bool& _Waited, bool& _bTakenLock);
+ int GetVBlackPos();
+ void CalculateJitter(LONGLONG PerformanceCounter);
+ virtual void OnVBlankFinished(bool fAll, LONGLONG PerformanceCounter) {}
+
+ // Casimir666
+ typedef HRESULT(WINAPI* D3DXLoadSurfaceFromMemoryPtr)(
+ LPDIRECT3DSURFACE9 pDestSurface,
+ CONST PALETTEENTRY* pDestPalette,
+ CONST RECT* pDestRect,
+ LPCVOID pSrcMemory,
+ D3DFORMAT SrcFormat,
+ UINT SrcPitch,
+ CONST PALETTEENTRY* pSrcPalette,
+ CONST RECT* pSrcRect,
+ DWORD Filter,
+ D3DCOLOR ColorKey);
+
+ typedef HRESULT(WINAPI* D3DXLoadSurfaceFromSurfacePtr)(
+ LPDIRECT3DSURFACE9 pDestSurface,
+ CONST PALETTEENTRY* pDestPalette,
+ CONST RECT* pDestRect,
+ LPDIRECT3DSURFACE9 pSrcSurface,
+ CONST PALETTEENTRY* pSrcPalette,
+ CONST RECT* pSrcRect,
+ DWORD Filter,
+ D3DCOLOR ColorKey);
+
+ typedef HRESULT(WINAPI* D3DXCreateLinePtr)(LPDIRECT3DDEVICE9 pDevice, LPD3DXLINE* ppLine);
+
+ typedef HRESULT(WINAPI* D3DXCreateFontPtr)(
+ LPDIRECT3DDEVICE9 pDevice,
+ int Height,
+ UINT Width,
+ UINT Weight,
+ UINT MipLevels,
+ bool Italic,
+ DWORD CharSet,
+ DWORD OutputPrecision,
+ DWORD Quality,
+ DWORD PitchAndFamily,
+ LPCWSTR pFaceName,
+ LPD3DXFONT* ppFont);
+
+
+ void DrawText(const RECT& rc, const CString& strText, int _Priority);
+ void ResetStats();
+ void DrawStats();
+ virtual void OnResetDevice() {};
+ void SendResetRequest();
+
+ double GetFrameTime() const;
+ double GetFrameRate() const;
+
+
+ int m_nTearingPos;
+ VMR9AlphaBitmap m_VMR9AlphaBitmap;
+ CAutoVectorPtr<BYTE> m_VMR9AlphaBitmapData;
+ CRect m_VMR9AlphaBitmapRect;
+ int m_VMR9AlphaBitmapWidthBytes;
+
+ D3DXLoadSurfaceFromMemoryPtr m_pD3DXLoadSurfaceFromMemory;
+ D3DXLoadSurfaceFromSurfacePtr m_pD3DXLoadSurfaceFromSurface;
+ D3DXCreateLinePtr m_pD3DXCreateLine;
+ D3DXCreateFontPtr m_pD3DXCreateFont;
+ HRESULT(__stdcall* m_pD3DXCreateSprite)(LPDIRECT3DDEVICE9 pDevice, LPD3DXSPRITE* ppSprite);
+
+
+
+ int m_nVMR9Surfaces; // Total number of DX Surfaces
+ int m_iVMR9Surface;
+ long m_nUsedBuffer;
+
+ double m_fAvrFps; // Estimate the real FPS
+ double m_fJitterStdDev; // Estimate the Jitter std dev
+ double m_fJitterMean;
+ double m_fSyncOffsetStdDev;
+ double m_fSyncOffsetAvr;
+ double m_DetectedRefreshRate;
+
+ CCritSec m_RefreshRateLock;
+ double m_DetectedRefreshTime;
+ double m_DetectedRefreshTimePrim;
+ double m_DetectedScanlineTime;
+ double m_DetectedScanlineTimePrim;
+ double m_DetectedScanlinesPerFrame;
+
+ double GetRefreshRate() const {
+ if (m_DetectedRefreshRate) {
+ return m_DetectedRefreshRate;
+ }
+ return m_RefreshRate;
+ }
+
+ LONG GetScanLines() const {
+ if (m_DetectedRefreshRate) {
+ return (LONG)m_DetectedScanlinesPerFrame;
+ }
+ return m_ScreenSize.cy;
+ }
+
+ double m_ldDetectedRefreshRateList[100];
+ double m_ldDetectedScanlineRateList[100];
+ int m_DetectedRefreshRatePos;
+ bool m_bSyncStatsAvailable;
+ LONGLONG m_pllJitter [NB_JITTER]; // Jitter buffer for stats
+ LONGLONG m_pllSyncOffset [NB_JITTER]; // Jitter buffer for stats
+ LONGLONG m_llLastPerf;
+ LONGLONG m_JitterStdDev;
+ LONGLONG m_MaxJitter;
+ LONGLONG m_MinJitter;
+ LONGLONG m_MaxSyncOffset;
+ LONGLONG m_MinSyncOffset;
+ int m_nNextJitter;
+ int m_nNextSyncOffset;
+ REFERENCE_TIME m_rtTimePerFrame;
+ double m_DetectedFrameRate;
+ double m_DetectedFrameTime;
+ double m_DetectedFrameTimeStdDev;
+ bool m_DetectedLock;
+ LONGLONG m_DetectedFrameTimeHistory[60];
+ double m_DetectedFrameTimeHistoryHistory[500];
+ int m_DetectedFrameTimePos;
+ int m_bInterlaced;
+ FF_FIELD_TYPE m_nFrameType;
+
+ double m_TextScale;
+
+ int m_VBlankEndWait;
+ int m_VBlankStartWait;
+ LONGLONG m_VBlankWaitTime;
+ LONGLONG m_VBlankLockTime;
+ int m_VBlankMin;
+ int m_VBlankMinCalc;
+ int m_VBlankMax;
+ int m_VBlankEndPresent;
+ LONGLONG m_VBlankStartMeasureTime;
+ int m_VBlankStartMeasure;
+
+ LONGLONG m_PresentWaitTime;
+ LONGLONG m_PresentWaitTimeMin;
+ LONGLONG m_PresentWaitTimeMax;
+
+ LONGLONG m_PaintTime;
+ LONGLONG m_PaintTimeMin;
+ LONGLONG m_PaintTimeMax;
+
+ LONGLONG m_WaitForGPUTime;
+
+ LONGLONG m_RasterStatusWaitTime;
+ LONGLONG m_RasterStatusWaitTimeMin;
+ LONGLONG m_RasterStatusWaitTimeMax;
+ LONGLONG m_RasterStatusWaitTimeMaxCalc;
+
+ double m_ClockDiffCalc;
+ double m_ClockDiffPrim;
+ double m_ClockDiff;
+
+ double m_TimeChangeHistory[100];
+ double m_ClockChangeHistory[100];
+ int m_ClockTimeChangeHistoryPos;
+ double m_ModeratedTimeSpeed;
+ double m_ModeratedTimeSpeedPrim;
+ double m_ModeratedTimeSpeedDiff;
+
+ bool m_bCorrectedFrameTime;
+ int m_FrameTimeCorrection;
+ LONGLONG m_LastFrameDuration;
+ LONGLONG m_LastSampleTime;
+
+ CString m_strStatsMsg[10];
+
+ CString m_D3D9Device;
+ DWORD m_nPCIVendor;
+
+ CString m_Decoder;
+
+ public:
+ CDX9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, bool bIsEVR, CString& _Error);
+ ~CDX9AllocatorPresenter();
+
+ // ISubPicAllocatorPresenter
+ STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
+ STDMETHODIMP_(bool) Paint(bool fAll);
+ STDMETHODIMP GetDIB(BYTE* lpDib, DWORD* size);
+ STDMETHODIMP SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget);
+ STDMETHODIMP SetPixelShader2(LPCSTR pSrcData, LPCSTR pTarget, bool bScreenSpace);
+ STDMETHODIMP_(bool) ResetDevice();
+ STDMETHODIMP_(bool) DisplayChange();
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/DX9RenderingEngine.cpp b/src/filters/renderer/VideoRenderers/DX9RenderingEngine.cpp
index e240ee550..bdbd90b88 100644
--- a/src/filters/renderer/VideoRenderers/DX9RenderingEngine.cpp
+++ b/src/filters/renderer/VideoRenderers/DX9RenderingEngine.cpp
@@ -30,1650 +30,1653 @@
#pragma pack(push, 1)
template<int texcoords>
struct MYD3DVERTEX {
- float x, y, z, rhw;
- struct {
- float u, v;
- } t[texcoords];
+ float x, y, z, rhw;
+ struct {
+ float u, v;
+ } t[texcoords];
};
template<>
struct MYD3DVERTEX<0> {
- float x, y, z, rhw;
- DWORD Diffuse;
+ float x, y, z, rhw;
+ DWORD Diffuse;
};
#pragma pack(pop)
template<int texcoords>
static void AdjustQuad(MYD3DVERTEX<texcoords>* v, double dx, double dy)
{
- float offset = 0.5;
-
- for (int i = 0; i < 4; i++) {
- v[i].x -= offset;
- v[i].y -= offset;
-
- for (int j = 0; j < max(texcoords-1, 1); j++) {
- v[i].t[j].u -= (float)(offset*dx);
- v[i].t[j].v -= (float)(offset*dy);
- }
-
- if (texcoords > 1) {
- v[i].t[texcoords-1].u -= offset;
- v[i].t[texcoords-1].v -= offset;
- }
- }
+ float offset = 0.5;
+
+ for (int i = 0; i < 4; i++) {
+ v[i].x -= offset;
+ v[i].y -= offset;
+
+ for (int j = 0; j < max(texcoords - 1, 1); j++) {
+ v[i].t[j].u -= (float)(offset * dx);
+ v[i].t[j].v -= (float)(offset * dy);
+ }
+
+ if (texcoords > 1) {
+ v[i].t[texcoords - 1].u -= offset;
+ v[i].t[texcoords - 1].v -= offset;
+ }
+ }
}
template<int texcoords>
static HRESULT TextureBlt(IDirect3DDevice9* pD3DDev, MYD3DVERTEX<texcoords> v[4], D3DTEXTUREFILTERTYPE filter)
{
- if (!pD3DDev) {
- return E_POINTER;
- }
-
- DWORD FVF = 0;
-
- switch (texcoords) {
- case 1:
- FVF = D3DFVF_TEX1;
- break;
- case 2:
- FVF = D3DFVF_TEX2;
- break;
- case 3:
- FVF = D3DFVF_TEX3;
- break;
- case 4:
- FVF = D3DFVF_TEX4;
- break;
- case 5:
- FVF = D3DFVF_TEX5;
- break;
- case 6:
- FVF = D3DFVF_TEX6;
- break;
- case 7:
- FVF = D3DFVF_TEX7;
- break;
- case 8:
- FVF = D3DFVF_TEX8;
- break;
- default:
- return E_FAIL;
- }
-
- HRESULT hr;
-
- hr = pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
- hr = pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_STENCILENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA|D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED);
-
- for (int i = 0; i < texcoords; i++) {
- hr = pD3DDev->SetSamplerState(i, D3DSAMP_MAGFILTER, filter);
- hr = pD3DDev->SetSamplerState(i, D3DSAMP_MINFILTER, filter);
- hr = pD3DDev->SetSamplerState(i, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
-
- hr = pD3DDev->SetSamplerState(i, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
- hr = pD3DDev->SetSamplerState(i, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
- }
-
- //
-
- hr = pD3DDev->SetFVF(D3DFVF_XYZRHW | FVF);
- // hr = pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v, sizeof(v[0]));
-
- MYD3DVERTEX<texcoords> tmp = v[2];
- v[2] = v[3];
- v[3] = tmp;
- hr = pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(v[0]));
-
- //
-
- for (int i = 0; i < texcoords; i++) {
- pD3DDev->SetTexture(i, NULL);
- }
-
- return S_OK;
+ if (!pD3DDev) {
+ return E_POINTER;
+ }
+
+ DWORD FVF = 0;
+
+ switch (texcoords) {
+ case 1:
+ FVF = D3DFVF_TEX1;
+ break;
+ case 2:
+ FVF = D3DFVF_TEX2;
+ break;
+ case 3:
+ FVF = D3DFVF_TEX3;
+ break;
+ case 4:
+ FVF = D3DFVF_TEX4;
+ break;
+ case 5:
+ FVF = D3DFVF_TEX5;
+ break;
+ case 6:
+ FVF = D3DFVF_TEX6;
+ break;
+ case 7:
+ FVF = D3DFVF_TEX7;
+ break;
+ case 8:
+ FVF = D3DFVF_TEX8;
+ break;
+ default:
+ return E_FAIL;
+ }
+
+ HRESULT hr;
+
+ hr = pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
+ hr = pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_STENCILENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED);
+
+ for (int i = 0; i < texcoords; i++) {
+ hr = pD3DDev->SetSamplerState(i, D3DSAMP_MAGFILTER, filter);
+ hr = pD3DDev->SetSamplerState(i, D3DSAMP_MINFILTER, filter);
+ hr = pD3DDev->SetSamplerState(i, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
+
+ hr = pD3DDev->SetSamplerState(i, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
+ hr = pD3DDev->SetSamplerState(i, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
+ }
+
+ //
+
+ hr = pD3DDev->SetFVF(D3DFVF_XYZRHW | FVF);
+ // hr = pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v, sizeof(v[0]));
+
+ MYD3DVERTEX<texcoords> tmp = v[2];
+ v[2] = v[3];
+ v[3] = tmp;
+ hr = pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(v[0]));
+
+ //
+
+ for (int i = 0; i < texcoords; i++) {
+ pD3DDev->SetTexture(i, NULL);
+ }
+
+ return S_OK;
}
using namespace DSObjects;
-CDX9RenderingEngine::CDX9RenderingEngine(HWND hWnd, HRESULT& hr, CString *_pError)
- : CSubPicAllocatorPresenterImpl(hWnd, hr, _pError)
- , m_ScreenSize(0, 0)
- , m_nNbDXSurface(1)
- , m_nCurSurface(0)
- , m_CurrentAdapter(0)
+CDX9RenderingEngine::CDX9RenderingEngine(HWND hWnd, HRESULT& hr, CString* _pError)
+ : CSubPicAllocatorPresenterImpl(hWnd, hr, _pError)
+ , m_ScreenSize(0, 0)
+ , m_nNbDXSurface(1)
+ , m_nCurSurface(0)
+ , m_CurrentAdapter(0)
{
- HINSTANCE hDll = GetRenderersData()->GetD3X9Dll();
- m_bD3DX = hDll != NULL;
+ HINSTANCE hDll = GetRenderersData()->GetD3X9Dll();
+ m_bD3DX = hDll != NULL;
- if (m_bD3DX) {
- (FARPROC&)m_pD3DXFloat32To16Array = GetProcAddress(hDll, "D3DXFloat32To16Array");
- }
+ if (m_bD3DX) {
+ (FARPROC&)m_pD3DXFloat32To16Array = GetProcAddress(hDll, "D3DXFloat32To16Array");
+ }
}
void CDX9RenderingEngine::InitRenderingEngine()
{
- m_StretchRectFilter = D3DTEXF_LINEAR;// eliminate this chain ASAP
+ m_StretchRectFilter = D3DTEXF_LINEAR;// eliminate this chain ASAP
- // Initialize the pixel shader compiler
- m_pPSC.Attach(DNew CPixelShaderCompiler(m_pD3DDev, true));
+ // Initialize the pixel shader compiler
+ m_pPSC.Attach(DNew CPixelShaderCompiler(m_pD3DDev, true));
- // Initialize settings
- m_BicubicA = 0;
+ // Initialize settings
+ m_BicubicA = 0;
}
void CDX9RenderingEngine::CleanupRenderingEngine()
{
- m_pPSC.Free();
-
- for (int i = 0; i < 4; i++) {
- m_pResizerPixelShaders[i] = NULL;
- }
-
- CleanupFinalPass();
-
- POSITION pos = m_pCustomScreenSpacePixelShaders.GetHeadPosition();
- while (pos) {
- CExternalPixelShader &Shader = m_pCustomScreenSpacePixelShaders.GetNext(pos);
- Shader.m_pPixelShader = NULL;
- }
- pos = m_pCustomPixelShaders.GetHeadPosition();
- while (pos) {
- CExternalPixelShader &Shader = m_pCustomPixelShaders.GetNext(pos);
- Shader.m_pPixelShader = NULL;
- }
-
- for (int i = 0; i < 2; i++) {
- m_pTemporaryVideoTextures[i] = NULL;
- m_pTemporaryScreenSpaceTextures[i] = NULL;
- }
+ m_pPSC.Free();
+
+ for (int i = 0; i < 4; i++) {
+ m_pResizerPixelShaders[i] = NULL;
+ }
+
+ CleanupFinalPass();
+
+ POSITION pos = m_pCustomScreenSpacePixelShaders.GetHeadPosition();
+ while (pos) {
+ CExternalPixelShader& Shader = m_pCustomScreenSpacePixelShaders.GetNext(pos);
+ Shader.m_pPixelShader = NULL;
+ }
+ pos = m_pCustomPixelShaders.GetHeadPosition();
+ while (pos) {
+ CExternalPixelShader& Shader = m_pCustomPixelShaders.GetNext(pos);
+ Shader.m_pPixelShader = NULL;
+ }
+
+ for (int i = 0; i < 2; i++) {
+ m_pTemporaryVideoTextures[i] = NULL;
+ m_pTemporaryScreenSpaceTextures[i] = NULL;
+ }
}
HRESULT CDX9RenderingEngine::CreateVideoSurfaces()
{
- HRESULT hr;
- CRenderersSettings& settings = GetRenderersSettings();
-
- // Free previously allocated video surfaces
- FreeVideoSurfaces();
-
- // Free previously allocated temporary video textures, because the native video size might have been changed!
- for (int i = 0; i < 2; i++) {
- m_pTemporaryVideoTextures[i] = NULL;
- }
-
- if (settings.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE2D || settings.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D) {
- int nTexturesNeeded = settings.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D ? m_nNbDXSurface : 1;
-
- for (int i = 0; i < nTexturesNeeded; i++) {
- if (FAILED(hr = m_pD3DDev->CreateTexture(
- m_NativeVideoSize.cx, m_NativeVideoSize.cy, 1,
- D3DUSAGE_RENDERTARGET, m_SurfaceType,
- D3DPOOL_DEFAULT, &m_pVideoTexture[i], NULL))) {
- return hr;
- }
-
- if (FAILED(hr = m_pVideoTexture[i]->GetSurfaceLevel(0, &m_pVideoSurface[i]))) {
- return hr;
- }
- }
-
- if (settings.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE2D) {
- m_RenderingPath = RENDERING_PATH_STRETCHRECT;
-
- for (int i = 0; i < m_nNbDXSurface; i++) {
- m_pVideoTexture[i] = NULL;
- }
- } else {
- m_RenderingPath = RENDERING_PATH_DRAW;
- }
- } else {
- m_RenderingPath = RENDERING_PATH_STRETCHRECT;
-
- if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(
- m_NativeVideoSize.cx, m_NativeVideoSize.cy,
- m_SurfaceType,
- D3DPOOL_DEFAULT, &m_pVideoSurface[m_nCurSurface], NULL))) {
- return hr;
- }
- }
-
- hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1, 0);
-
- return S_OK;
+ HRESULT hr;
+ CRenderersSettings& settings = GetRenderersSettings();
+
+ // Free previously allocated video surfaces
+ FreeVideoSurfaces();
+
+ // Free previously allocated temporary video textures, because the native video size might have been changed!
+ for (int i = 0; i < 2; i++) {
+ m_pTemporaryVideoTextures[i] = NULL;
+ }
+
+ if (settings.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE2D || settings.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D) {
+ int nTexturesNeeded = settings.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D ? m_nNbDXSurface : 1;
+
+ for (int i = 0; i < nTexturesNeeded; i++) {
+ if (FAILED(hr = m_pD3DDev->CreateTexture(
+ m_NativeVideoSize.cx, m_NativeVideoSize.cy, 1,
+ D3DUSAGE_RENDERTARGET, m_SurfaceType,
+ D3DPOOL_DEFAULT, &m_pVideoTexture[i], NULL))) {
+ return hr;
+ }
+
+ if (FAILED(hr = m_pVideoTexture[i]->GetSurfaceLevel(0, &m_pVideoSurface[i]))) {
+ return hr;
+ }
+ }
+
+ if (settings.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE2D) {
+ m_RenderingPath = RENDERING_PATH_STRETCHRECT;
+
+ for (int i = 0; i < m_nNbDXSurface; i++) {
+ m_pVideoTexture[i] = NULL;
+ }
+ } else {
+ m_RenderingPath = RENDERING_PATH_DRAW;
+ }
+ } else {
+ m_RenderingPath = RENDERING_PATH_STRETCHRECT;
+
+ if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(
+ m_NativeVideoSize.cx, m_NativeVideoSize.cy,
+ m_SurfaceType,
+ D3DPOOL_DEFAULT, &m_pVideoSurface[m_nCurSurface], NULL))) {
+ return hr;
+ }
+ }
+
+ hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1, 0);
+
+ return S_OK;
}
void CDX9RenderingEngine::FreeVideoSurfaces()
{
- for (int i = 0; i < m_nNbDXSurface; i++) {
- m_pVideoTexture[i] = NULL;
- m_pVideoSurface[i] = NULL;
- }
+ for (int i = 0; i < m_nNbDXSurface; i++) {
+ m_pVideoTexture[i] = NULL;
+ m_pVideoSurface[i] = NULL;
+ }
}
HRESULT CDX9RenderingEngine::RenderVideo(IDirect3DSurface9* pRenderTarget, const CRect& srcRect, const CRect& destRect)
{
- if (destRect.IsRectEmpty()) {
- return S_OK;
- }
-
- if (m_RenderingPath == RENDERING_PATH_DRAW) {
- return RenderVideoDrawPath(pRenderTarget, srcRect, destRect);
- } else {
- return RenderVideoStretchRectPath(pRenderTarget, srcRect, destRect);
- }
+ if (destRect.IsRectEmpty()) {
+ return S_OK;
+ }
+
+ if (m_RenderingPath == RENDERING_PATH_DRAW) {
+ return RenderVideoDrawPath(pRenderTarget, srcRect, destRect);
+ } else {
+ return RenderVideoStretchRectPath(pRenderTarget, srcRect, destRect);
+ }
}
HRESULT CDX9RenderingEngine::RenderVideoDrawPath(IDirect3DSurface9* pRenderTarget, const CRect& srcRect, const CRect& destRect)
{
- HRESULT hr;
-
- // Return if the video texture is not initialized
- if (m_pVideoTexture[m_nCurSurface] == 0) {
- return S_OK;
- }
-
- CRenderersSettings& settings = GetRenderersSettings();
-
- // Initialize the processing pipeline
- bool bCustomPixelShaders;
- bool bResizerShaders;
- bool bCustomScreenSpacePixelShaders;
- bool bFinalPass;
-
- int screenSpacePassCount = 0;
- DWORD iDX9Resizer = settings.iDX9Resizer;
-
- if (m_bD3DX) {
- // Final pass. Must be initialized first!
- hr = InitFinalPass();
- if (SUCCEEDED(hr)) {
- bFinalPass = m_bFinalPass;
- } else {
- bFinalPass = false;
- }
-
- if (bFinalPass) {
- ++screenSpacePassCount;
- }
-
- // Resizers
- float bicubicA = 0;
- switch (iDX9Resizer) {
- case 3:
- bicubicA = -0.60f;
- break;
- case 4:
- bicubicA = -0.751f;
- break; // FIXME : 0.75 crash recent D3D, or eat CPU
- case 5:
- bicubicA = -1.00f;
- break;
- }
-
- hr = InitResizers(bicubicA);
- bResizerShaders = SUCCEEDED(hr);
- screenSpacePassCount += 1; // currently all resizers are 1-pass
-
- // Custom screen space pixel shaders
- bCustomScreenSpacePixelShaders = !m_pCustomScreenSpacePixelShaders.IsEmpty();
-
- if (bCustomScreenSpacePixelShaders) {
- screenSpacePassCount += (int)m_pCustomScreenSpacePixelShaders.GetCount();
- }
-
- // Custom pixel shaders
- bCustomPixelShaders = !m_pCustomPixelShaders.IsEmpty();
-
- hr = InitTemporaryVideoTextures(min((int)m_pCustomPixelShaders.GetCount(), 2));
- if (FAILED(hr)) {
- bCustomPixelShaders = false;
- }
- } else {
- bCustomPixelShaders = false;
- bResizerShaders = false;
- bCustomScreenSpacePixelShaders = false;
- bFinalPass = false;
- }
-
- hr = InitScreenSpacePipeline(screenSpacePassCount, pRenderTarget);
- if (FAILED(hr)) {
- bCustomScreenSpacePixelShaders = false;
- bFinalPass = false;
- }
-
- // Apply the custom pixel shaders if there are any. Result: pVideoTexture
- CComPtr<IDirect3DTexture9> pVideoTexture = m_pVideoTexture[m_nCurSurface];
-
- if (bCustomPixelShaders) {
- static __int64 counter = 0;
- static long start = clock();
-
- long stop = clock();
- long diff = stop - start;
-
- if (diff >= 10*60*CLOCKS_PER_SEC) {
- start = stop; // reset after 10 min (ps float has its limits in both range and accuracy)
- }
+ HRESULT hr;
+
+ // Return if the video texture is not initialized
+ if (m_pVideoTexture[m_nCurSurface] == 0) {
+ return S_OK;
+ }
+
+ CRenderersSettings& settings = GetRenderersSettings();
+
+ // Initialize the processing pipeline
+ bool bCustomPixelShaders;
+ bool bResizerShaders;
+ bool bCustomScreenSpacePixelShaders;
+ bool bFinalPass;
+
+ int screenSpacePassCount = 0;
+ DWORD iDX9Resizer = settings.iDX9Resizer;
+
+ if (m_bD3DX) {
+ // Final pass. Must be initialized first!
+ hr = InitFinalPass();
+ if (SUCCEEDED(hr)) {
+ bFinalPass = m_bFinalPass;
+ } else {
+ bFinalPass = false;
+ }
+
+ if (bFinalPass) {
+ ++screenSpacePassCount;
+ }
+
+ // Resizers
+ float bicubicA = 0;
+ switch (iDX9Resizer) {
+ case 3:
+ bicubicA = -0.60f;
+ break;
+ case 4:
+ bicubicA = -0.751f;
+ break; // FIXME : 0.75 crash recent D3D, or eat CPU
+ case 5:
+ bicubicA = -1.00f;
+ break;
+ }
+
+ hr = InitResizers(bicubicA);
+ bResizerShaders = SUCCEEDED(hr);
+ screenSpacePassCount += 1; // currently all resizers are 1-pass
+
+ // Custom screen space pixel shaders
+ bCustomScreenSpacePixelShaders = !m_pCustomScreenSpacePixelShaders.IsEmpty();
+
+ if (bCustomScreenSpacePixelShaders) {
+ screenSpacePassCount += (int)m_pCustomScreenSpacePixelShaders.GetCount();
+ }
+
+ // Custom pixel shaders
+ bCustomPixelShaders = !m_pCustomPixelShaders.IsEmpty();
+
+ hr = InitTemporaryVideoTextures(min((int)m_pCustomPixelShaders.GetCount(), 2));
+ if (FAILED(hr)) {
+ bCustomPixelShaders = false;
+ }
+ } else {
+ bCustomPixelShaders = false;
+ bResizerShaders = false;
+ bCustomScreenSpacePixelShaders = false;
+ bFinalPass = false;
+ }
+
+ hr = InitScreenSpacePipeline(screenSpacePassCount, pRenderTarget);
+ if (FAILED(hr)) {
+ bCustomScreenSpacePixelShaders = false;
+ bFinalPass = false;
+ }
+
+ // Apply the custom pixel shaders if there are any. Result: pVideoTexture
+ CComPtr<IDirect3DTexture9> pVideoTexture = m_pVideoTexture[m_nCurSurface];
+
+ if (bCustomPixelShaders) {
+ static __int64 counter = 0;
+ static long start = clock();
+
+ long stop = clock();
+ long diff = stop - start;
+
+ if (diff >= 10 * 60 * CLOCKS_PER_SEC) {
+ start = stop; // reset after 10 min (ps float has its limits in both range and accuracy)
+ }
#if 1
- D3DSURFACE_DESC desc;
- m_pVideoTexture[m_nCurSurface]->GetLevelDesc(0, &desc);
+ D3DSURFACE_DESC desc;
+ m_pVideoTexture[m_nCurSurface]->GetLevelDesc(0, &desc);
- float fConstData[][4] = {
- {(float)desc.Width, (float)desc.Height, (float)(counter++), (float)diff / CLOCKS_PER_SEC},
- {1.0f / desc.Width, 1.0f / desc.Height, 0, 0},
- };
+ float fConstData[][4] = {
+ {(float)desc.Width, (float)desc.Height, (float)(counter++), (float)diff / CLOCKS_PER_SEC},
+ {1.0f / desc.Width, 1.0f / desc.Height, 0, 0},
+ };
#else
- CSize VideoSize = GetVisibleVideoSize();
+ CSize VideoSize = GetVisibleVideoSize();
- float fConstData[][4] = {
- {(float)VideoSize.cx, (float)VideoSize.cy, (float)(counter++), (float)diff / CLOCKS_PER_SEC},
- {1.0f / VideoSize.cx, 1.0f / VideoSize.cy, 0, 0},
- };
+ float fConstData[][4] = {
+ {(float)VideoSize.cx, (float)VideoSize.cy, (float)(counter++), (float)diff / CLOCKS_PER_SEC},
+ {1.0f / VideoSize.cx, 1.0f / VideoSize.cy, 0, 0},
+ };
#endif
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
-
- int src = 1;
- int dest = 0;
- bool first = true;
-
- POSITION pos = m_pCustomPixelShaders.GetHeadPosition();
- while (pos) {
- CComPtr<IDirect3DSurface9> pTemporarySurface;
- hr = m_pTemporaryVideoTextures[dest]->GetSurfaceLevel(0, &pTemporarySurface);
- hr = m_pD3DDev->SetRenderTarget(0, pTemporarySurface);
-
- CExternalPixelShader &Shader = m_pCustomPixelShaders.GetNext(pos);
- if (!Shader.m_pPixelShader) {
- Shader.Compile(m_pPSC);
- }
- hr = m_pD3DDev->SetPixelShader(Shader.m_pPixelShader);
-
- if (first) {
- TextureCopy(m_pVideoTexture[m_nCurSurface]);
- first = false;
- } else {
- TextureCopy(m_pTemporaryVideoTextures[src]);
- }
-
- std::swap(src, dest);
- }
-
- pVideoTexture = m_pTemporaryVideoTextures[src];
- }
-
- // Resize the frame
- Vector dst[4];
- Transform(destRect, dst);
-
- hr = BeginScreenSpacePass();
-
- if (m_ScreenSpacePassCount > 0) {
- hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1.0f, 0);
- }
-
- if (srcRect.Size() != destRect.Size()) {
- if (iDX9Resizer == 0 || iDX9Resizer == 1 || !bResizerShaders) {
- D3DTEXTUREFILTERTYPE Filter = iDX9Resizer == 0 ? D3DTEXF_POINT : D3DTEXF_LINEAR;
- hr = TextureResize(pVideoTexture, dst, Filter, srcRect);
- } else if (iDX9Resizer == 2) {
- hr = TextureResizeBilinear(pVideoTexture, dst, srcRect);
- } else if (iDX9Resizer >= 3) {
- hr = TextureResizeBicubic1pass(pVideoTexture, dst, srcRect);
- }
- } else {
- hr = TextureResize(pVideoTexture, dst, D3DTEXF_POINT, srcRect);
- }
-
- // Apply the custom screen size pixel shaders
- if (bCustomScreenSpacePixelShaders) {
- static __int64 counter = 555;
- static long start = clock() + 333;
-
- long stop = clock() + 333;
- long diff = stop - start;
-
- if (diff >= 10*60*CLOCKS_PER_SEC) {
- start = stop; // reset after 10 min (ps float has its limits in both range and accuracy)
- }
-
- float fConstData[][4] = {
- {(float)m_TemporaryScreenSpaceTextureSize.cx, (float)m_TemporaryScreenSpaceTextureSize.cy, (float)(counter++), (float)diff / CLOCKS_PER_SEC},
- {1.0f / m_TemporaryScreenSpaceTextureSize.cx, 1.0f / m_TemporaryScreenSpaceTextureSize.cy, 0, 0},
- };
-
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
-
- POSITION pos = m_pCustomScreenSpacePixelShaders.GetHeadPosition();
- while (pos) {
- BeginScreenSpacePass();
-
- CExternalPixelShader &Shader = m_pCustomScreenSpacePixelShaders.GetNext(pos);
- if (!Shader.m_pPixelShader) {
- Shader.Compile(m_pPSC);
- }
- hr = m_pD3DDev->SetPixelShader(Shader.m_pPixelShader);
- TextureCopy(m_pTemporaryScreenSpaceTextures[m_ScreenSpacePassSrc]);
- }
- }
-
- // Final pass
- if (bFinalPass) {
- hr = BeginScreenSpacePass();
- hr = FinalPass(m_pTemporaryScreenSpaceTextures[m_ScreenSpacePassSrc]);
- }
-
- hr = m_pD3DDev->SetPixelShader(NULL);
-
- return hr;
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+
+ int src = 1;
+ int dest = 0;
+ bool first = true;
+
+ POSITION pos = m_pCustomPixelShaders.GetHeadPosition();
+ while (pos) {
+ CComPtr<IDirect3DSurface9> pTemporarySurface;
+ hr = m_pTemporaryVideoTextures[dest]->GetSurfaceLevel(0, &pTemporarySurface);
+ hr = m_pD3DDev->SetRenderTarget(0, pTemporarySurface);
+
+ CExternalPixelShader& Shader = m_pCustomPixelShaders.GetNext(pos);
+ if (!Shader.m_pPixelShader) {
+ Shader.Compile(m_pPSC);
+ }
+ hr = m_pD3DDev->SetPixelShader(Shader.m_pPixelShader);
+
+ if (first) {
+ TextureCopy(m_pVideoTexture[m_nCurSurface]);
+ first = false;
+ } else {
+ TextureCopy(m_pTemporaryVideoTextures[src]);
+ }
+
+ std::swap(src, dest);
+ }
+
+ pVideoTexture = m_pTemporaryVideoTextures[src];
+ }
+
+ // Resize the frame
+ Vector dst[4];
+ Transform(destRect, dst);
+
+ hr = BeginScreenSpacePass();
+
+ if (m_ScreenSpacePassCount > 0) {
+ hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1.0f, 0);
+ }
+
+ if (srcRect.Size() != destRect.Size()) {
+ if (iDX9Resizer == 0 || iDX9Resizer == 1 || !bResizerShaders) {
+ D3DTEXTUREFILTERTYPE Filter = iDX9Resizer == 0 ? D3DTEXF_POINT : D3DTEXF_LINEAR;
+ hr = TextureResize(pVideoTexture, dst, Filter, srcRect);
+ } else if (iDX9Resizer == 2) {
+ hr = TextureResizeBilinear(pVideoTexture, dst, srcRect);
+ } else if (iDX9Resizer >= 3) {
+ hr = TextureResizeBicubic1pass(pVideoTexture, dst, srcRect);
+ }
+ } else {
+ hr = TextureResize(pVideoTexture, dst, D3DTEXF_POINT, srcRect);
+ }
+
+ // Apply the custom screen size pixel shaders
+ if (bCustomScreenSpacePixelShaders) {
+ static __int64 counter = 555;
+ static long start = clock() + 333;
+
+ long stop = clock() + 333;
+ long diff = stop - start;
+
+ if (diff >= 10 * 60 * CLOCKS_PER_SEC) {
+ start = stop; // reset after 10 min (ps float has its limits in both range and accuracy)
+ }
+
+ float fConstData[][4] = {
+ {(float)m_TemporaryScreenSpaceTextureSize.cx, (float)m_TemporaryScreenSpaceTextureSize.cy, (float)(counter++), (float)diff / CLOCKS_PER_SEC},
+ {1.0f / m_TemporaryScreenSpaceTextureSize.cx, 1.0f / m_TemporaryScreenSpaceTextureSize.cy, 0, 0},
+ };
+
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+
+ POSITION pos = m_pCustomScreenSpacePixelShaders.GetHeadPosition();
+ while (pos) {
+ BeginScreenSpacePass();
+
+ CExternalPixelShader& Shader = m_pCustomScreenSpacePixelShaders.GetNext(pos);
+ if (!Shader.m_pPixelShader) {
+ Shader.Compile(m_pPSC);
+ }
+ hr = m_pD3DDev->SetPixelShader(Shader.m_pPixelShader);
+ TextureCopy(m_pTemporaryScreenSpaceTextures[m_ScreenSpacePassSrc]);
+ }
+ }
+
+ // Final pass
+ if (bFinalPass) {
+ hr = BeginScreenSpacePass();
+ hr = FinalPass(m_pTemporaryScreenSpaceTextures[m_ScreenSpacePassSrc]);
+ }
+
+ hr = m_pD3DDev->SetPixelShader(NULL);
+
+ return hr;
}
HRESULT CDX9RenderingEngine::RenderVideoStretchRectPath(IDirect3DSurface9* pRenderTarget, const CRect& srcRect, const CRect& destRect)
{
- HRESULT hr;
+ HRESULT hr;
- // Return if the render target or the video surface is not initialized
- if (pRenderTarget == 0 || m_pVideoSurface[m_nCurSurface] == 0) {
- return S_OK;
- }
+ // Return if the render target or the video surface is not initialized
+ if (pRenderTarget == 0 || m_pVideoSurface[m_nCurSurface] == 0) {
+ return S_OK;
+ }
- CRect rSrcVid(srcRect);
- CRect rDstVid(destRect);
+ CRect rSrcVid(srcRect);
+ CRect rDstVid(destRect);
- ClipToSurface(pRenderTarget, rSrcVid, rDstVid); // grrr
- // IMPORTANT: rSrcVid has to be aligned on mod2 for yuy2->rgb conversion with StretchRect!!!
- rSrcVid.left &= ~1;
- rSrcVid.right &= ~1;
- rSrcVid.top &= ~1;
- rSrcVid.bottom &= ~1;
- hr = m_pD3DDev->StretchRect(m_pVideoSurface[m_nCurSurface], rSrcVid, pRenderTarget, rDstVid, m_StretchRectFilter);
+ ClipToSurface(pRenderTarget, rSrcVid, rDstVid); // grrr
+ // IMPORTANT: rSrcVid has to be aligned on mod2 for yuy2->rgb conversion with StretchRect!!!
+ rSrcVid.left &= ~1;
+ rSrcVid.right &= ~1;
+ rSrcVid.top &= ~1;
+ rSrcVid.bottom &= ~1;
+ hr = m_pD3DDev->StretchRect(m_pVideoSurface[m_nCurSurface], rSrcVid, pRenderTarget, rDstVid, m_StretchRectFilter);
- return hr;
+ return hr;
}
HRESULT CDX9RenderingEngine::InitTemporaryVideoTextures(int count)
{
- HRESULT hr = S_OK;
-
- for (int i = 0; i < count; i++) {
- if (m_pTemporaryVideoTextures[i] == NULL) {
- hr = m_pD3DDev->CreateTexture(
- m_NativeVideoSize.cx, m_NativeVideoSize.cy, 1, D3DUSAGE_RENDERTARGET, m_SurfaceType,
- D3DPOOL_DEFAULT, &m_pTemporaryVideoTextures[i], NULL);
-
- if (FAILED(hr)) {
- // Free all textures
- for (int j = 0; j < 2; j++) {
- m_pTemporaryVideoTextures[j] = NULL;
- }
-
- return hr;
- }
- }
- }
-
- // Free unnecessary textures
- for (int i = count; i < 2; i++) {
- m_pTemporaryVideoTextures[i] = NULL;
- }
-
- return hr;
+ HRESULT hr = S_OK;
+
+ for (int i = 0; i < count; i++) {
+ if (m_pTemporaryVideoTextures[i] == NULL) {
+ hr = m_pD3DDev->CreateTexture(
+ m_NativeVideoSize.cx, m_NativeVideoSize.cy, 1, D3DUSAGE_RENDERTARGET, m_SurfaceType,
+ D3DPOOL_DEFAULT, &m_pTemporaryVideoTextures[i], NULL);
+
+ if (FAILED(hr)) {
+ // Free all textures
+ for (int j = 0; j < 2; j++) {
+ m_pTemporaryVideoTextures[j] = NULL;
+ }
+
+ return hr;
+ }
+ }
+ }
+
+ // Free unnecessary textures
+ for (int i = count; i < 2; i++) {
+ m_pTemporaryVideoTextures[i] = NULL;
+ }
+
+ return hr;
}
HRESULT CDX9RenderingEngine::InitScreenSpacePipeline(int passCount, IDirect3DSurface9* pRenderTarget)
{
- m_pRenderTarget = pRenderTarget;
- m_ScreenSpacePassCount = passCount;
- m_ScreenSpacePassSrc = 0;
- m_ScreenSpacePassDest = 1;
+ m_pRenderTarget = pRenderTarget;
+ m_ScreenSpacePassCount = passCount;
+ m_ScreenSpacePassSrc = 0;
+ m_ScreenSpacePassDest = 1;
- HRESULT hr = InitTemporaryScreenSpaceTextures(min(passCount - 1, 2));
+ HRESULT hr = InitTemporaryScreenSpaceTextures(min(passCount - 1, 2));
- // If the initialized have failed, disable the pipeline
- if (FAILED(hr)) {
- m_ScreenSpacePassCount = 1;
- }
+ // If the initialized have failed, disable the pipeline
+ if (FAILED(hr)) {
+ m_ScreenSpacePassCount = 1;
+ }
- return hr;
+ return hr;
}
HRESULT CDX9RenderingEngine::InitTemporaryScreenSpaceTextures(int count)
{
- HRESULT hr = S_OK;
-
- for (int i = 0; i < count; i++) {
- if (m_pTemporaryScreenSpaceTextures[i] == NULL) {
- m_TemporaryScreenSpaceTextureSize = CSize(min(m_ScreenSize.cx, (int)m_Caps.MaxTextureWidth),
- min(max(m_ScreenSize.cy, m_NativeVideoSize.cy), (int)m_Caps.MaxTextureHeight));
- hr = m_pD3DDev->CreateTexture(
- m_TemporaryScreenSpaceTextureSize.cx, m_TemporaryScreenSpaceTextureSize.cy, 1, D3DUSAGE_RENDERTARGET, m_SurfaceType,
- D3DPOOL_DEFAULT, &m_pTemporaryScreenSpaceTextures[i], NULL);
-
- if (FAILED(hr)) {
- // Free all textures
- for (int j = 0; j < 2; j++) {
- m_pTemporaryScreenSpaceTextures[j] = NULL;
- }
-
- return hr;
- }
- }
- }
-
- // Free unnecessary textures
- for (int i = count; i < 2; i++) {
- m_pTemporaryScreenSpaceTextures[i] = NULL;
- }
-
- return hr;
+ HRESULT hr = S_OK;
+
+ for (int i = 0; i < count; i++) {
+ if (m_pTemporaryScreenSpaceTextures[i] == NULL) {
+ m_TemporaryScreenSpaceTextureSize = CSize(min(m_ScreenSize.cx, (int)m_Caps.MaxTextureWidth),
+ min(max(m_ScreenSize.cy, m_NativeVideoSize.cy), (int)m_Caps.MaxTextureHeight));
+ hr = m_pD3DDev->CreateTexture(
+ m_TemporaryScreenSpaceTextureSize.cx, m_TemporaryScreenSpaceTextureSize.cy, 1, D3DUSAGE_RENDERTARGET, m_SurfaceType,
+ D3DPOOL_DEFAULT, &m_pTemporaryScreenSpaceTextures[i], NULL);
+
+ if (FAILED(hr)) {
+ // Free all textures
+ for (int j = 0; j < 2; j++) {
+ m_pTemporaryScreenSpaceTextures[j] = NULL;
+ }
+
+ return hr;
+ }
+ }
+ }
+
+ // Free unnecessary textures
+ for (int i = count; i < 2; i++) {
+ m_pTemporaryScreenSpaceTextures[i] = NULL;
+ }
+
+ return hr;
}
HRESULT CDX9RenderingEngine::BeginScreenSpacePass()
{
- HRESULT hr;
+ HRESULT hr;
- std::swap(m_ScreenSpacePassSrc, m_ScreenSpacePassDest);
- --m_ScreenSpacePassCount;
+ std::swap(m_ScreenSpacePassSrc, m_ScreenSpacePassDest);
+ --m_ScreenSpacePassCount;
- if (m_ScreenSpacePassCount > 0) {
- CComPtr<IDirect3DSurface9> pTemporarySurface;
- hr = m_pTemporaryScreenSpaceTextures[m_ScreenSpacePassDest]->GetSurfaceLevel(0, &pTemporarySurface);
+ if (m_ScreenSpacePassCount > 0) {
+ CComPtr<IDirect3DSurface9> pTemporarySurface;
+ hr = m_pTemporaryScreenSpaceTextures[m_ScreenSpacePassDest]->GetSurfaceLevel(0, &pTemporarySurface);
- if (SUCCEEDED(hr)) {
- hr = m_pD3DDev->SetRenderTarget(0, pTemporarySurface);
- }
- } else {
- hr = m_pD3DDev->SetRenderTarget(0, m_pRenderTarget);
- }
+ if (SUCCEEDED(hr)) {
+ hr = m_pD3DDev->SetRenderTarget(0, pTemporarySurface);
+ }
+ } else {
+ hr = m_pD3DDev->SetRenderTarget(0, m_pRenderTarget);
+ }
- return hr;
+ return hr;
}
HRESULT CDX9RenderingEngine::InitResizers(float bicubicA)
{
- HRESULT hr;
-
- // Check whether the resizer pixel shaders must be initialized
- bool bInitRequired = false;
-
- if (bicubicA) {
- for (int i = 0; i < 4; i++) {
- if (!m_pResizerPixelShaders[i]) {
- bInitRequired = true;
- }
- }
-
- if (m_BicubicA != bicubicA) {
- bInitRequired = true;
- }
- } else {
- if (!m_pResizerPixelShaders[0]) {
- bInitRequired = true;
- }
- }
-
- if (!bInitRequired) {
- return S_OK;
- }
-
- // Initialize the resizer pixel shaders
- m_BicubicA = bicubicA;
-
- for (int i = 0; i < _countof(m_pResizerPixelShaders); i++) {
- m_pResizerPixelShaders[i] = NULL;
- }
-
- if (m_Caps.PixelShaderVersion < D3DPS_VERSION(2, 0)) {
- return E_FAIL;
- }
-
- LPCSTR pProfile = m_Caps.PixelShaderVersion >= D3DPS_VERSION(3, 0) ? "ps_3_0" : "ps_2_0";
-
- CStringA str;
- if (!LoadResource(IDF_SHADER_RESIZER, str, _T("FILE"))) {
- return E_FAIL;
- }
-
- CStringA A;
- A.Format("(%f)", bicubicA);
- str.Replace("_The_Value_Of_A_Is_Set_Here_", A);
-
- LPCSTR pEntries[] = {"main_bilinear", "main_bicubic1pass", "main_bicubic2pass_pass1", "main_bicubic2pass_pass2"};
-
- ASSERT(_countof(pEntries) == _countof(m_pResizerPixelShaders));
-
- for (int i = 0; i < _countof(pEntries); i++) {
- CString ErrorMessage;
- CString DissAssembly;
- hr = m_pPSC->CompileShader(str, pEntries[i], pProfile, 0, &m_pResizerPixelShaders[i], &DissAssembly, &ErrorMessage);
- if (FAILED(hr)) {
- TRACE("%ws", ErrorMessage.GetString());
- ASSERT (0);
- return hr;
- }
- /*
- if (i == 2 || i == 3)
- {
- const wchar_t *pStr = DissAssembly.GetString();
- TRACE("DisAsm: %s\n", pEntries[i]);
- const wchar_t *pStrStart = pStr;
- while (*pStr)
- {
- while (*pStr && *pStr != '\n')
- ++pStr;
- if (*pStr == '\n')
- ++pStr;
- if (*pStr == '\r')
- ++pStr;
- CString Test(pStrStart, pStr - pStrStart);
- TRACE("%ws", Test.GetString());
- pStrStart = pStr;
- }
- }
- */
- }
-
- return S_OK;
+ HRESULT hr;
+
+ // Check whether the resizer pixel shaders must be initialized
+ bool bInitRequired = false;
+
+ if (bicubicA) {
+ for (int i = 0; i < 4; i++) {
+ if (!m_pResizerPixelShaders[i]) {
+ bInitRequired = true;
+ }
+ }
+
+ if (m_BicubicA != bicubicA) {
+ bInitRequired = true;
+ }
+ } else {
+ if (!m_pResizerPixelShaders[0]) {
+ bInitRequired = true;
+ }
+ }
+
+ if (!bInitRequired) {
+ return S_OK;
+ }
+
+ // Initialize the resizer pixel shaders
+ m_BicubicA = bicubicA;
+
+ for (int i = 0; i < _countof(m_pResizerPixelShaders); i++) {
+ m_pResizerPixelShaders[i] = NULL;
+ }
+
+ if (m_Caps.PixelShaderVersion < D3DPS_VERSION(2, 0)) {
+ return E_FAIL;
+ }
+
+ LPCSTR pProfile = m_Caps.PixelShaderVersion >= D3DPS_VERSION(3, 0) ? "ps_3_0" : "ps_2_0";
+
+ CStringA str;
+ if (!LoadResource(IDF_SHADER_RESIZER, str, _T("FILE"))) {
+ return E_FAIL;
+ }
+
+ CStringA A;
+ A.Format("(%f)", bicubicA);
+ str.Replace("_The_Value_Of_A_Is_Set_Here_", A);
+
+ LPCSTR pEntries[] = {"main_bilinear", "main_bicubic1pass", "main_bicubic2pass_pass1", "main_bicubic2pass_pass2"};
+
+ ASSERT(_countof(pEntries) == _countof(m_pResizerPixelShaders));
+
+ for (int i = 0; i < _countof(pEntries); i++) {
+ CString ErrorMessage;
+ CString DissAssembly;
+ hr = m_pPSC->CompileShader(str, pEntries[i], pProfile, 0, &m_pResizerPixelShaders[i], &DissAssembly, &ErrorMessage);
+ if (FAILED(hr)) {
+ TRACE("%ws", ErrorMessage.GetString());
+ ASSERT(0);
+ return hr;
+ }
+ /*
+ if (i == 2 || i == 3)
+ {
+ const wchar_t *pStr = DissAssembly.GetString();
+ TRACE("DisAsm: %s\n", pEntries[i]);
+ const wchar_t *pStrStart = pStr;
+ while (*pStr)
+ {
+ while (*pStr && *pStr != '\n')
+ ++pStr;
+ if (*pStr == '\n')
+ ++pStr;
+ if (*pStr == '\r')
+ ++pStr;
+ CString Test(pStrStart, pStr - pStrStart);
+ TRACE("%ws", Test.GetString());
+ pStrStart = pStr;
+ }
+ }
+ */
+ }
+
+ return S_OK;
}
-HRESULT CDX9RenderingEngine::TextureResize(IDirect3DTexture9* pTexture, Vector dst[4], D3DTEXTUREFILTERTYPE filter, const CRect &srcRect)
+HRESULT CDX9RenderingEngine::TextureResize(IDirect3DTexture9* pTexture, Vector dst[4], D3DTEXTUREFILTERTYPE filter, const CRect& srcRect)
{
- HRESULT hr;
+ HRESULT hr;
- D3DSURFACE_DESC desc;
- if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
- return E_FAIL;
- }
+ D3DSURFACE_DESC desc;
+ if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
+ return E_FAIL;
+ }
- float w = (float)desc.Width;
- float h = (float)desc.Height;
+ float w = (float)desc.Width;
+ float h = (float)desc.Height;
- float dx2 = 1.0f/w;
- float dy2 = 1.0f/h;
+ float dx2 = 1.0f / w;
+ float dy2 = 1.0f / h;
- MYD3DVERTEX<1> v[] = {
- {dst[0].x, dst[0].y, dst[0].z, 1.0f/dst[0].z, srcRect.left * dx2, srcRect.top * dy2},
- {dst[1].x, dst[1].y, dst[1].z, 1.0f/dst[1].z, srcRect.right * dx2, srcRect.top * dy2},
- {dst[2].x, dst[2].y, dst[2].z, 1.0f/dst[2].z, srcRect.left * dx2, srcRect.bottom * dy2},
- {dst[3].x, dst[3].y, dst[3].z, 1.0f/dst[3].z, srcRect.right * dx2, srcRect.bottom * dy2},
- };
+ MYD3DVERTEX<1> v[] = {
+ {dst[0].x, dst[0].y, dst[0].z, 1.0f / dst[0].z, srcRect.left * dx2, srcRect.top * dy2},
+ {dst[1].x, dst[1].y, dst[1].z, 1.0f / dst[1].z, srcRect.right * dx2, srcRect.top * dy2},
+ {dst[2].x, dst[2].y, dst[2].z, 1.0f / dst[2].z, srcRect.left * dx2, srcRect.bottom * dy2},
+ {dst[3].x, dst[3].y, dst[3].z, 1.0f / dst[3].z, srcRect.right * dx2, srcRect.bottom * dy2},
+ };
- AdjustQuad(v, 0, 0);
+ AdjustQuad(v, 0, 0);
- hr = m_pD3DDev->SetTexture(0, pTexture);
- hr = m_pD3DDev->SetPixelShader(NULL);
- hr = TextureBlt(m_pD3DDev, v, filter);
+ hr = m_pD3DDev->SetTexture(0, pTexture);
+ hr = m_pD3DDev->SetPixelShader(NULL);
+ hr = TextureBlt(m_pD3DDev, v, filter);
- return hr;
+ return hr;
}
-HRESULT CDX9RenderingEngine::TextureResizeBilinear(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &srcRect)
+HRESULT CDX9RenderingEngine::TextureResizeBilinear(IDirect3DTexture9* pTexture, Vector dst[4], const CRect& srcRect)
{
- HRESULT hr;
+ HRESULT hr;
- D3DSURFACE_DESC desc;
- if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
- return E_FAIL;
- }
+ D3DSURFACE_DESC desc;
+ if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
+ return E_FAIL;
+ }
- // make const to give compiler a chance of optimising, also float faster than double and converted to float to sent to PS anyway
- const float dx = 1.0f/(float)desc.Width;
- const float dy = 1.0f/(float)desc.Height;
- const float tx0 = (float)srcRect.left;
- const float tx1 = (float)srcRect.right;
- const float ty0 = (float)srcRect.top;
- const float ty1 = (float)srcRect.bottom;
+ // make const to give compiler a chance of optimising, also float faster than double and converted to float to sent to PS anyway
+ const float dx = 1.0f / (float)desc.Width;
+ const float dy = 1.0f / (float)desc.Height;
+ const float tx0 = (float)srcRect.left;
+ const float tx1 = (float)srcRect.right;
+ const float ty0 = (float)srcRect.top;
+ const float ty1 = (float)srcRect.bottom;
- MYD3DVERTEX<1> v[] = {
- {dst[0].x, dst[0].y, dst[0].z, 1.0f/dst[0].z, tx0, ty0},
- {dst[1].x, dst[1].y, dst[1].z, 1.0f/dst[1].z, tx1, ty0},
- {dst[2].x, dst[2].y, dst[2].z, 1.0f/dst[2].z, tx0, ty1},
- {dst[3].x, dst[3].y, dst[3].z, 1.0f/dst[3].z, tx1, ty1},
- };
+ MYD3DVERTEX<1> v[] = {
+ {dst[0].x, dst[0].y, dst[0].z, 1.0f / dst[0].z, tx0, ty0},
+ {dst[1].x, dst[1].y, dst[1].z, 1.0f / dst[1].z, tx1, ty0},
+ {dst[2].x, dst[2].y, dst[2].z, 1.0f / dst[2].z, tx0, ty1},
+ {dst[3].x, dst[3].y, dst[3].z, 1.0f / dst[3].z, tx1, ty1},
+ };
- AdjustQuad(v, 1.0, 1.0);
+ AdjustQuad(v, 1.0, 1.0);
- hr = m_pD3DDev->SetTexture(0, pTexture);
+ hr = m_pD3DDev->SetTexture(0, pTexture);
- float fConstData[][4] = {{dx*0.5f, dy*0.5f, 0, 0}, {dx, dy, 0, 0}, {dx, 0, 0, 0}, {0, dy, 0, 0}};
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+ float fConstData[][4] = {{dx * 0.5f, dy * 0.5f, 0, 0}, {dx, dy, 0, 0}, {dx, 0, 0, 0}, {0, dy, 0, 0}};
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
- hr = m_pD3DDev->SetTexture(0, pTexture);
- hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShaders[0]);
+ hr = m_pD3DDev->SetTexture(0, pTexture);
+ hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShaders[0]);
- hr = TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
- return hr;
+ hr = TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
+ return hr;
}
-HRESULT CDX9RenderingEngine::TextureResizeBicubic1pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &srcRect)
+HRESULT CDX9RenderingEngine::TextureResizeBicubic1pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect& srcRect)
{
- HRESULT hr;
+ HRESULT hr;
- D3DSURFACE_DESC desc;
- if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
- return E_FAIL;
- }
+ D3DSURFACE_DESC desc;
+ if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
+ return E_FAIL;
+ }
- // make const to give compiler a chance of optimising, also float faster than double and converted to float to sent to PS anyway
- const float dx = 1.0f/(float)desc.Width;
- const float dy = 1.0f/(float)desc.Height;
- const float tx0 = (float)srcRect.left;
- const float tx1 = (float)srcRect.right;
- const float ty0 = (float)srcRect.top;
- const float ty1 = (float)srcRect.bottom;
+ // make const to give compiler a chance of optimising, also float faster than double and converted to float to sent to PS anyway
+ const float dx = 1.0f / (float)desc.Width;
+ const float dy = 1.0f / (float)desc.Height;
+ const float tx0 = (float)srcRect.left;
+ const float tx1 = (float)srcRect.right;
+ const float ty0 = (float)srcRect.top;
+ const float ty1 = (float)srcRect.bottom;
- MYD3DVERTEX<1> v[] = {
- {dst[0].x, dst[0].y, dst[0].z, 1.0f/dst[0].z, tx0, ty0},
- {dst[1].x, dst[1].y, dst[1].z, 1.0f/dst[1].z, tx1, ty0},
- {dst[2].x, dst[2].y, dst[2].z, 1.0f/dst[2].z, tx0, ty1},
- {dst[3].x, dst[3].y, dst[3].z, 1.0f/dst[3].z, tx1, ty1},
- };
+ MYD3DVERTEX<1> v[] = {
+ {dst[0].x, dst[0].y, dst[0].z, 1.0f / dst[0].z, tx0, ty0},
+ {dst[1].x, dst[1].y, dst[1].z, 1.0f / dst[1].z, tx1, ty0},
+ {dst[2].x, dst[2].y, dst[2].z, 1.0f / dst[2].z, tx0, ty1},
+ {dst[3].x, dst[3].y, dst[3].z, 1.0f / dst[3].z, tx1, ty1},
+ };
- AdjustQuad(v, 1.0, 1.0);
+ AdjustQuad(v, 1.0, 1.0);
- hr = m_pD3DDev->SetTexture(0, pTexture);
+ hr = m_pD3DDev->SetTexture(0, pTexture);
- float fConstData[][4] = {{dx*0.5f, dy*0.5f, 0, 0}, {dx, dy, 0, 0}, {dx, 0, 0, 0}, {0, dy, 0, 0}};
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+ float fConstData[][4] = {{dx * 0.5f, dy * 0.5f, 0, 0}, {dx, dy, 0, 0}, {dx, 0, 0, 0}, {0, dy, 0, 0}};
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
- hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShaders[1]);
+ hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShaders[1]);
- hr = TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
- return hr;
+ hr = TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
+ return hr;
}
/*
// The 2 pass sampler is incorrect in that it only does bilinear resampling in the y direction.
HRESULT CDX9RenderingEngine::TextureResizeBicubic2pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &srcRect)
{
- HRESULT hr;
+ HRESULT hr;
- // rotated?
- if (dst[0].z != dst[1].z || dst[2].z != dst[3].z || dst[0].z != dst[3].z
- || dst[0].y != dst[1].y || dst[0].x != dst[2].x || dst[2].y != dst[3].y || dst[1].x != dst[3].x)
- return TextureResizeBicubic1pass(pTexture, dst, srcRect);
+ // rotated?
+ if (dst[0].z != dst[1].z || dst[2].z != dst[3].z || dst[0].z != dst[3].z
+ || dst[0].y != dst[1].y || dst[0].x != dst[2].x || dst[2].y != dst[3].y || dst[1].x != dst[3].x)
+ return TextureResizeBicubic1pass(pTexture, dst, srcRect);
- D3DSURFACE_DESC desc;
- if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc)))
- return E_FAIL;
+ D3DSURFACE_DESC desc;
+ if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc)))
+ return E_FAIL;
- float Tex0_Width = desc.Width;
- float Tex0_Height = desc.Height;
+ float Tex0_Width = desc.Width;
+ float Tex0_Height = desc.Height;
- double dx0 = 1.0/desc.Width;
- UNREFERENCED_PARAMETER(dx0);
- double dy0 = 1.0/desc.Height;
- UNREFERENCED_PARAMETER(dy0);
+ double dx0 = 1.0/desc.Width;
+ UNREFERENCED_PARAMETER(dx0);
+ double dy0 = 1.0/desc.Height;
+ UNREFERENCED_PARAMETER(dy0);
- CSize SrcTextSize = CSize(desc.Width, desc.Height);
- double w = (double)srcRect.Width();
- double h = (double)srcRect.Height();
- UNREFERENCED_PARAMETER(w);
+ CSize SrcTextSize = CSize(desc.Width, desc.Height);
+ double w = (double)srcRect.Width();
+ double h = (double)srcRect.Height();
+ UNREFERENCED_PARAMETER(w);
- CRect dst1(0, 0, (int)(dst[3].x - dst[0].x), (int)h);
+ CRect dst1(0, 0, (int)(dst[3].x - dst[0].x), (int)h);
- if (!m_pTemporaryScreenSpaceTextures[0] || FAILED(m_pTemporaryScreenSpaceTextures[0]->GetLevelDesc(0, &desc)))
- return TextureResizeBicubic1pass(pTexture, dst, srcRect);
+ if (!m_pTemporaryScreenSpaceTextures[0] || FAILED(m_pTemporaryScreenSpaceTextures[0]->GetLevelDesc(0, &desc)))
+ return TextureResizeBicubic1pass(pTexture, dst, srcRect);
- float Tex1_Width = desc.Width;
- float Tex1_Height = desc.Height;
+ float Tex1_Width = desc.Width;
+ float Tex1_Height = desc.Height;
- double dx1 = 1.0/desc.Width;
- UNREFERENCED_PARAMETER(dx1);
- double dy1 = 1.0/desc.Height;
- UNREFERENCED_PARAMETER(dy1);
+ double dx1 = 1.0/desc.Width;
+ UNREFERENCED_PARAMETER(dx1);
+ double dy1 = 1.0/desc.Height;
+ UNREFERENCED_PARAMETER(dy1);
- double dw = (double)dst1.Width() / desc.Width;
- UNREFERENCED_PARAMETER(dw);
- double dh = (double)dst1.Height() / desc.Height;
- UNREFERENCED_PARAMETER(dh);
+ double dw = (double)dst1.Width() / desc.Width;
+ UNREFERENCED_PARAMETER(dw);
+ double dh = (double)dst1.Height() / desc.Height;
+ UNREFERENCED_PARAMETER(dh);
- float dx2 = 1.0f/SrcTextSize.cx;
- UNREFERENCED_PARAMETER(dx2);
- float dy2 = 1.0f/SrcTextSize.cy;
- UNREFERENCED_PARAMETER(dy2);
+ float dx2 = 1.0f/SrcTextSize.cx;
+ UNREFERENCED_PARAMETER(dx2);
+ float dy2 = 1.0f/SrcTextSize.cy;
+ UNREFERENCED_PARAMETER(dy2);
- float tx0 = srcRect.left;
- float tx1 = srcRect.right;
- float ty0 = srcRect.top;
- float ty1 = srcRect.bottom;
+ float tx0 = srcRect.left;
+ float tx1 = srcRect.right;
+ float ty0 = srcRect.top;
+ float ty1 = srcRect.bottom;
- float tx0_2 = 0;
- float tx1_2 = dst1.Width();
- float ty0_2 = 0;
- float ty1_2 = h;
+ float tx0_2 = 0;
+ float tx1_2 = dst1.Width();
+ float ty0_2 = 0;
+ float ty1_2 = h;
- // ASSERT(dst1.Height() == desc.Height);
+ // ASSERT(dst1.Height() == desc.Height);
- if (dst1.Width() > (int)desc.Width || dst1.Height() > (int)desc.Height)
- // if (dst1.Width() != desc.Width || dst1.Height() != desc.Height)
- return TextureResizeBicubic1pass(pTexture, dst, srcRect);
+ if (dst1.Width() > (int)desc.Width || dst1.Height() > (int)desc.Height)
+ // if (dst1.Width() != desc.Width || dst1.Height() != desc.Height)
+ return TextureResizeBicubic1pass(pTexture, dst, srcRect);
- MYD3DVERTEX<1> vx[] =
- {
- {(float)dst1.left, (float)dst1.top, 0.5f, 2.0f, tx0, ty0},
- {(float)dst1.right, (float)dst1.top, 0.5f, 2.0f, tx1, ty0},
- {(float)dst1.left, (float)dst1.bottom, 0.5f, 2.0f, tx0, ty1},
- {(float)dst1.right, (float)dst1.bottom, 0.5f, 2.0f, tx1, ty1},
- };
+ MYD3DVERTEX<1> vx[] =
+ {
+ {(float)dst1.left, (float)dst1.top, 0.5f, 2.0f, tx0, ty0},
+ {(float)dst1.right, (float)dst1.top, 0.5f, 2.0f, tx1, ty0},
+ {(float)dst1.left, (float)dst1.bottom, 0.5f, 2.0f, tx0, ty1},
+ {(float)dst1.right, (float)dst1.bottom, 0.5f, 2.0f, tx1, ty1},
+ };
- AdjustQuad(vx, 1.0, 0.0); // Casimir666 : bug here, create vertical lines ! TODO : why ??????
+ AdjustQuad(vx, 1.0, 0.0); // Casimir666 : bug here, create vertical lines ! TODO : why ??????
- MYD3DVERTEX<1> vy[] =
- {
- {dst[0].x, dst[0].y, dst[0].z, 1.0/dst[0].z, tx0_2, ty0_2},
- {dst[1].x, dst[1].y, dst[1].z, 1.0/dst[1].z, tx1_2, ty0_2},
- {dst[2].x, dst[2].y, dst[2].z, 1.0/dst[2].z, tx0_2, ty1_2},
- {dst[3].x, dst[3].y, dst[3].z, 1.0/dst[3].z, tx1_2, ty1_2},
- };
+ MYD3DVERTEX<1> vy[] =
+ {
+ {dst[0].x, dst[0].y, dst[0].z, 1.0/dst[0].z, tx0_2, ty0_2},
+ {dst[1].x, dst[1].y, dst[1].z, 1.0/dst[1].z, tx1_2, ty0_2},
+ {dst[2].x, dst[2].y, dst[2].z, 1.0/dst[2].z, tx0_2, ty1_2},
+ {dst[3].x, dst[3].y, dst[3].z, 1.0/dst[3].z, tx1_2, ty1_2},
+ };
- AdjustQuad(vy, 0.0, 1.0); // Casimir666 : bug here, create horizontal lines ! TODO : why ??????
+ AdjustQuad(vy, 0.0, 1.0); // Casimir666 : bug here, create horizontal lines ! TODO : why ??????
- hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShaders[2]);
- {
- float fConstData[][4] = {{0.5f / Tex0_Width, 0.5f / Tex0_Height, 0, 0}, {1.0f / Tex0_Width, 1.0f / Tex0_Height, 0, 0}, {1.0f / Tex0_Width, 0, 0, 0}, {0, 1.0f / Tex0_Height, 0, 0}, {Tex0_Width, Tex0_Height, 0, 0}};
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
- }
+ hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShaders[2]);
+ {
+ float fConstData[][4] = {{0.5f / Tex0_Width, 0.5f / Tex0_Height, 0, 0}, {1.0f / Tex0_Width, 1.0f / Tex0_Height, 0, 0}, {1.0f / Tex0_Width, 0, 0, 0}, {0, 1.0f / Tex0_Height, 0, 0}, {Tex0_Width, Tex0_Height, 0, 0}};
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+ }
- hr = m_pD3DDev->SetTexture(0, pTexture);
+ hr = m_pD3DDev->SetTexture(0, pTexture);
- CComPtr<IDirect3DSurface9> pRTOld;
- hr = m_pD3DDev->GetRenderTarget(0, &pRTOld);
+ CComPtr<IDirect3DSurface9> pRTOld;
+ hr = m_pD3DDev->GetRenderTarget(0, &pRTOld);
- CComPtr<IDirect3DSurface9> pRT;
- hr = m_pTemporaryScreenSpaceTextures[0]->GetSurfaceLevel(0, &pRT);
- hr = m_pD3DDev->SetRenderTarget(0, pRT);
+ CComPtr<IDirect3DSurface9> pRT;
+ hr = m_pTemporaryScreenSpaceTextures[0]->GetSurfaceLevel(0, &pRT);
+ hr = m_pD3DDev->SetRenderTarget(0, pRT);
- hr = TextureBlt(m_pD3DDev, vx, D3DTEXF_POINT);
+ hr = TextureBlt(m_pD3DDev, vx, D3DTEXF_POINT);
- hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShaders[3]);
- {
- float fConstData[][4] = {{0.5f / Tex1_Width, 0.5f / Tex1_Height, 0, 0}, {1.0f / Tex1_Width, 1.0f / Tex1_Height, 0, 0}, {1.0f / Tex1_Width, 0, 0, 0}, {0, 1.0f / Tex1_Height, 0, 0}, {Tex1_Width, Tex1_Height, 0, 0}};
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
- }
+ hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShaders[3]);
+ {
+ float fConstData[][4] = {{0.5f / Tex1_Width, 0.5f / Tex1_Height, 0, 0}, {1.0f / Tex1_Width, 1.0f / Tex1_Height, 0, 0}, {1.0f / Tex1_Width, 0, 0, 0}, {0, 1.0f / Tex1_Height, 0, 0}, {Tex1_Width, Tex1_Height, 0, 0}};
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+ }
- hr = m_pD3DDev->SetTexture(0, m_pTemporaryScreenSpaceTextures[0]);
+ hr = m_pD3DDev->SetTexture(0, m_pTemporaryScreenSpaceTextures[0]);
- hr = m_pD3DDev->SetRenderTarget(0, pRTOld);
+ hr = m_pD3DDev->SetRenderTarget(0, pRTOld);
- hr = TextureBlt(m_pD3DDev, vy, D3DTEXF_POINT);
- return hr;
+ hr = TextureBlt(m_pD3DDev, vy, D3DTEXF_POINT);
+ return hr;
}
*/
HRESULT CDX9RenderingEngine::InitFinalPass()
{
- HRESULT hr;
-
- CRenderersSettings& settings = GetRenderersSettings();
- CRenderersData* data = GetRenderersData();
-
- // Check whether the final pass must be initialized
- bool bColorManagement = settings.m_RenderSettings.iVMR9ColorManagementEnable;
- VideoSystem inputVideoSystem = static_cast<VideoSystem>(settings.m_RenderSettings.iVMR9ColorManagementInput);
- AmbientLight ambientLight = static_cast<AmbientLight>(settings.m_RenderSettings.iVMR9ColorManagementAmbientLight);
- ColorRenderingIntent renderingIntent = static_cast<ColorRenderingIntent>(settings.m_RenderSettings.iVMR9ColorManagementIntent);
-
- bool bInitRequired = false;
-
- if (m_bColorManagement != bColorManagement) {
- bInitRequired = true;
- }
-
- if (m_bColorManagement && bColorManagement) {
- if ((m_InputVideoSystem != inputVideoSystem) ||
- (m_RenderingIntent != renderingIntent) ||
- (m_AmbientLight != ambientLight)) {
- bInitRequired = true;
- }
- }
-
- if (!m_bFinalPass) {
- bInitRequired = true;
- }
-
- if (!bInitRequired) {
- return S_OK;
- }
-
- // Check whether the final pass is supported by the hardware
- m_bFinalPass = data->m_bFP16Support;
- if (!m_bFinalPass) {
- return S_OK;
- }
-
- // Update the settings
- m_bColorManagement = bColorManagement;
- m_InputVideoSystem = inputVideoSystem;
- m_AmbientLight = ambientLight;
- m_RenderingIntent = renderingIntent;
-
- // Check whether the final pass is required
- m_bFinalPass = bColorManagement || m_bFullFloatingPointProcessing || m_bHalfFloatingPointProcessing || ((m_bForceInputHighColorResolution || m_bHighColorResolution) && (m_DisplayType != D3DFMT_A2R10G10B10));
-
- if (!m_bFinalPass) {
- return S_OK;
- }
-
- // Initial cleanup
- m_pLut3DTexture = NULL;
- m_pFinalPixelShader = NULL;
-
- if (!m_pDitherTexture) {
- // Create the dither texture
- hr = m_pD3DDev->CreateTexture(DITHER_MATRIX_SIZE, DITHER_MATRIX_SIZE,
- 1,
- D3DUSAGE_DYNAMIC,
- D3DFMT_A16B16G16R16F,
- D3DPOOL_DEFAULT,
- &m_pDitherTexture,
- NULL);
-
- if (FAILED(hr)) {
- CleanupFinalPass();
- return hr;
- }
-
- D3DLOCKED_RECT lockedRect;
- hr = m_pDitherTexture->LockRect(0, &lockedRect, NULL, D3DLOCK_DISCARD);
- if (FAILED(hr)) {
- CleanupFinalPass();
- return hr;
- }
-
- char* outputRowIterator = static_cast<char*>(lockedRect.pBits);
- for (int y = 0; y < DITHER_MATRIX_SIZE; y++) {
- unsigned short* outputIterator = reinterpret_cast<unsigned short*>(outputRowIterator);
- for (int x = 0; x < DITHER_MATRIX_SIZE; x++) {
- for (int i = 0; i < 4; i++) {
- *outputIterator++ = DITHER_MATRIX[y][x];
- }
- }
-
- outputRowIterator += lockedRect.Pitch;
- }
-
- hr = m_pDitherTexture->UnlockRect(0);
- if (FAILED(hr)) {
- CleanupFinalPass();
- return hr;
- }
- }
-
- // Initialize the color management if necessary
- if (bColorManagement) {
- // Get the ICC profile path
- TCHAR* iccProfilePath = 0;
- HDC hDC = GetDC(m_hWnd);
-
- if (hDC != NULL) {
- DWORD icmProfilePathSize = 0;
- GetICMProfile(hDC, &icmProfilePathSize, NULL);
- iccProfilePath = DNew TCHAR[icmProfilePathSize];
- if (!GetICMProfile(hDC, &icmProfilePathSize, iccProfilePath)) {
- delete[] iccProfilePath;
- iccProfilePath = 0;
- }
-
- ReleaseDC(m_hWnd, hDC);
- }
-
- // Create the 3D LUT texture
- m_Lut3DSize = 64; // 64x64x64 LUT is enough for high-quality color management
- m_Lut3DEntryCount = m_Lut3DSize * m_Lut3DSize * m_Lut3DSize;
-
- hr = m_pD3DDev->CreateVolumeTexture(m_Lut3DSize, m_Lut3DSize, m_Lut3DSize,
- 1,
- D3DUSAGE_DYNAMIC,
- D3DFMT_A16B16G16R16F,
- D3DPOOL_DEFAULT,
- &m_pLut3DTexture,
- NULL);
-
- if (FAILED(hr)) {
- delete[] iccProfilePath;
- CleanupFinalPass();
- return hr;
- }
-
- float* lut3DFloat32 = DNew float[m_Lut3DEntryCount * 3];
- hr = CreateIccProfileLut(iccProfilePath, lut3DFloat32);
- delete[] iccProfilePath;
- if (FAILED(hr)) {
- delete[] lut3DFloat32;
- CleanupFinalPass();
- return hr;
- }
-
- D3DXFLOAT16* lut3DFloat16 = DNew D3DXFLOAT16[m_Lut3DEntryCount * 3];
- m_pD3DXFloat32To16Array(lut3DFloat16, lut3DFloat32, m_Lut3DEntryCount * 3);
- delete[] lut3DFloat32;
-
- const float oneFloat32 = 1.0f;
- D3DXFLOAT16 oneFloat16;
- m_pD3DXFloat32To16Array(&oneFloat16, &oneFloat32, 1);
-
- D3DLOCKED_BOX lockedBox;
- hr = m_pLut3DTexture->LockBox(0, &lockedBox, NULL, D3DLOCK_DISCARD);
- if (FAILED(hr)) {
- delete[] lut3DFloat16;
- CleanupFinalPass();
- return hr;
- }
-
- D3DXFLOAT16* lut3DFloat16Iterator = lut3DFloat16;
- char* outputSliceIterator = static_cast<char*>(lockedBox.pBits);
- for (int b = 0; b < m_Lut3DSize; b++) {
- char* outputRowIterator = outputSliceIterator;
-
- for (int g = 0; g < m_Lut3DSize; g++) {
- D3DXFLOAT16* outputIterator = reinterpret_cast<D3DXFLOAT16*>(outputRowIterator);
-
- for (int r = 0; r < m_Lut3DSize; r++) {
- // R, G, B
- for (int i = 0; i < 3; i++) {
- *outputIterator++ = *lut3DFloat16Iterator++;
- }
-
- // A
- *outputIterator++ = oneFloat16;
- }
-
- outputRowIterator += lockedBox.RowPitch;
- }
-
- outputSliceIterator += lockedBox.SlicePitch;
- }
-
- hr = m_pLut3DTexture->UnlockBox(0);
- delete[] lut3DFloat16;
- if (FAILED(hr)) {
- CleanupFinalPass();
- return hr;
- }
- }
-
- // Compile the final pixel shader
- LPCSTR pProfile = m_Caps.PixelShaderVersion >= D3DPS_VERSION(3, 0) ? "ps_3_0" : "ps_2_0";
-
- CStringA shaderSourceCode;
- if (!LoadResource(IDF_SHADER_FINAL, shaderSourceCode, _T("FILE"))) {
- CleanupFinalPass();
- return E_FAIL;
- }
-
- int quantization;
- if (m_DisplayType == D3DFMT_A2R10G10B10) {
- quantization = 1023; // 10-bit
- } else {
- quantization = 255; // 8-bit
- }
-
- CStringA quantizationString;
- quantizationString.Format("%d.", quantization);
- shaderSourceCode.Replace("_QUANTIZATION_VALUE_", quantizationString);
-
- CStringA lut3DEnabledString;
- lut3DEnabledString.Format("%d", static_cast<int>(bColorManagement));
- shaderSourceCode.Replace("_LUT3D_ENABLED_VALUE_", lut3DEnabledString);
-
- if (bColorManagement) {
- CStringA lut3DSizeString;
- lut3DSizeString.Format("%d.", m_Lut3DSize);
- shaderSourceCode.Replace("_LUT3D_SIZE_VALUE_", lut3DSizeString);
- }
-
- CString ErrorMessage;
- CString DissAssembly;
- hr = m_pPSC->CompileShader(shaderSourceCode, "main", pProfile, 0, &m_pFinalPixelShader, &DissAssembly, &ErrorMessage);
- if (FAILED(hr)) {
- TRACE("%ws", ErrorMessage.GetString());
- ASSERT (0);
- CleanupFinalPass();
- return hr;
- }
-
- return S_OK;
+ HRESULT hr;
+
+ CRenderersSettings& settings = GetRenderersSettings();
+ CRenderersData* data = GetRenderersData();
+
+ // Check whether the final pass must be initialized
+ bool bColorManagement = settings.m_RenderSettings.iVMR9ColorManagementEnable;
+ VideoSystem inputVideoSystem = static_cast<VideoSystem>(settings.m_RenderSettings.iVMR9ColorManagementInput);
+ AmbientLight ambientLight = static_cast<AmbientLight>(settings.m_RenderSettings.iVMR9ColorManagementAmbientLight);
+ ColorRenderingIntent renderingIntent = static_cast<ColorRenderingIntent>(settings.m_RenderSettings.iVMR9ColorManagementIntent);
+
+ bool bInitRequired = false;
+
+ if (m_bColorManagement != bColorManagement) {
+ bInitRequired = true;
+ }
+
+ if (m_bColorManagement && bColorManagement) {
+ if ((m_InputVideoSystem != inputVideoSystem) ||
+ (m_RenderingIntent != renderingIntent) ||
+ (m_AmbientLight != ambientLight)) {
+ bInitRequired = true;
+ }
+ }
+
+ if (!m_bFinalPass) {
+ bInitRequired = true;
+ }
+
+ if (!bInitRequired) {
+ return S_OK;
+ }
+
+ // Check whether the final pass is supported by the hardware
+ m_bFinalPass = data->m_bFP16Support;
+ if (!m_bFinalPass) {
+ return S_OK;
+ }
+
+ // Update the settings
+ m_bColorManagement = bColorManagement;
+ m_InputVideoSystem = inputVideoSystem;
+ m_AmbientLight = ambientLight;
+ m_RenderingIntent = renderingIntent;
+
+ // Check whether the final pass is required
+ m_bFinalPass = bColorManagement || m_bFullFloatingPointProcessing || m_bHalfFloatingPointProcessing || ((m_bForceInputHighColorResolution || m_bHighColorResolution) && (m_DisplayType != D3DFMT_A2R10G10B10));
+
+ if (!m_bFinalPass) {
+ return S_OK;
+ }
+
+ // Initial cleanup
+ m_pLut3DTexture = NULL;
+ m_pFinalPixelShader = NULL;
+
+ if (!m_pDitherTexture) {
+ // Create the dither texture
+ hr = m_pD3DDev->CreateTexture(DITHER_MATRIX_SIZE, DITHER_MATRIX_SIZE,
+ 1,
+ D3DUSAGE_DYNAMIC,
+ D3DFMT_A16B16G16R16F,
+ D3DPOOL_DEFAULT,
+ &m_pDitherTexture,
+ NULL);
+
+ if (FAILED(hr)) {
+ CleanupFinalPass();
+ return hr;
+ }
+
+ D3DLOCKED_RECT lockedRect;
+ hr = m_pDitherTexture->LockRect(0, &lockedRect, NULL, D3DLOCK_DISCARD);
+ if (FAILED(hr)) {
+ CleanupFinalPass();
+ return hr;
+ }
+
+ char* outputRowIterator = static_cast<char*>(lockedRect.pBits);
+ for (int y = 0; y < DITHER_MATRIX_SIZE; y++) {
+ unsigned short* outputIterator = reinterpret_cast<unsigned short*>(outputRowIterator);
+ for (int x = 0; x < DITHER_MATRIX_SIZE; x++) {
+ for (int i = 0; i < 4; i++) {
+ *outputIterator++ = DITHER_MATRIX[y][x];
+ }
+ }
+
+ outputRowIterator += lockedRect.Pitch;
+ }
+
+ hr = m_pDitherTexture->UnlockRect(0);
+ if (FAILED(hr)) {
+ CleanupFinalPass();
+ return hr;
+ }
+ }
+
+ // Initialize the color management if necessary
+ if (bColorManagement) {
+ // Get the ICC profile path
+ TCHAR* iccProfilePath = 0;
+ HDC hDC = GetDC(m_hWnd);
+
+ if (hDC != NULL) {
+ DWORD icmProfilePathSize = 0;
+ GetICMProfile(hDC, &icmProfilePathSize, NULL);
+ iccProfilePath = DNew TCHAR[icmProfilePathSize];
+ if (!GetICMProfile(hDC, &icmProfilePathSize, iccProfilePath)) {
+ delete[] iccProfilePath;
+ iccProfilePath = 0;
+ }
+
+ ReleaseDC(m_hWnd, hDC);
+ }
+
+ // Create the 3D LUT texture
+ m_Lut3DSize = 64; // 64x64x64 LUT is enough for high-quality color management
+ m_Lut3DEntryCount = m_Lut3DSize * m_Lut3DSize * m_Lut3DSize;
+
+ hr = m_pD3DDev->CreateVolumeTexture(m_Lut3DSize, m_Lut3DSize, m_Lut3DSize,
+ 1,
+ D3DUSAGE_DYNAMIC,
+ D3DFMT_A16B16G16R16F,
+ D3DPOOL_DEFAULT,
+ &m_pLut3DTexture,
+ NULL);
+
+ if (FAILED(hr)) {
+ delete[] iccProfilePath;
+ CleanupFinalPass();
+ return hr;
+ }
+
+ float* lut3DFloat32 = DNew float[m_Lut3DEntryCount * 3];
+ hr = CreateIccProfileLut(iccProfilePath, lut3DFloat32);
+ delete[] iccProfilePath;
+ if (FAILED(hr)) {
+ delete[] lut3DFloat32;
+ CleanupFinalPass();
+ return hr;
+ }
+
+ D3DXFLOAT16* lut3DFloat16 = DNew D3DXFLOAT16[m_Lut3DEntryCount * 3];
+ m_pD3DXFloat32To16Array(lut3DFloat16, lut3DFloat32, m_Lut3DEntryCount * 3);
+ delete[] lut3DFloat32;
+
+ const float oneFloat32 = 1.0f;
+ D3DXFLOAT16 oneFloat16;
+ m_pD3DXFloat32To16Array(&oneFloat16, &oneFloat32, 1);
+
+ D3DLOCKED_BOX lockedBox;
+ hr = m_pLut3DTexture->LockBox(0, &lockedBox, NULL, D3DLOCK_DISCARD);
+ if (FAILED(hr)) {
+ delete[] lut3DFloat16;
+ CleanupFinalPass();
+ return hr;
+ }
+
+ D3DXFLOAT16* lut3DFloat16Iterator = lut3DFloat16;
+ char* outputSliceIterator = static_cast<char*>(lockedBox.pBits);
+ for (int b = 0; b < m_Lut3DSize; b++) {
+ char* outputRowIterator = outputSliceIterator;
+
+ for (int g = 0; g < m_Lut3DSize; g++) {
+ D3DXFLOAT16* outputIterator = reinterpret_cast<D3DXFLOAT16*>(outputRowIterator);
+
+ for (int r = 0; r < m_Lut3DSize; r++) {
+ // R, G, B
+ for (int i = 0; i < 3; i++) {
+ *outputIterator++ = *lut3DFloat16Iterator++;
+ }
+
+ // A
+ *outputIterator++ = oneFloat16;
+ }
+
+ outputRowIterator += lockedBox.RowPitch;
+ }
+
+ outputSliceIterator += lockedBox.SlicePitch;
+ }
+
+ hr = m_pLut3DTexture->UnlockBox(0);
+ delete[] lut3DFloat16;
+ if (FAILED(hr)) {
+ CleanupFinalPass();
+ return hr;
+ }
+ }
+
+ // Compile the final pixel shader
+ LPCSTR pProfile = m_Caps.PixelShaderVersion >= D3DPS_VERSION(3, 0) ? "ps_3_0" : "ps_2_0";
+
+ CStringA shaderSourceCode;
+ if (!LoadResource(IDF_SHADER_FINAL, shaderSourceCode, _T("FILE"))) {
+ CleanupFinalPass();
+ return E_FAIL;
+ }
+
+ int quantization;
+ if (m_DisplayType == D3DFMT_A2R10G10B10) {
+ quantization = 1023; // 10-bit
+ } else {
+ quantization = 255; // 8-bit
+ }
+
+ CStringA quantizationString;
+ quantizationString.Format("%d.", quantization);
+ shaderSourceCode.Replace("_QUANTIZATION_VALUE_", quantizationString);
+
+ CStringA lut3DEnabledString;
+ lut3DEnabledString.Format("%d", static_cast<int>(bColorManagement));
+ shaderSourceCode.Replace("_LUT3D_ENABLED_VALUE_", lut3DEnabledString);
+
+ if (bColorManagement) {
+ CStringA lut3DSizeString;
+ lut3DSizeString.Format("%d.", m_Lut3DSize);
+ shaderSourceCode.Replace("_LUT3D_SIZE_VALUE_", lut3DSizeString);
+ }
+
+ CString ErrorMessage;
+ CString DissAssembly;
+ hr = m_pPSC->CompileShader(shaderSourceCode, "main", pProfile, 0, &m_pFinalPixelShader, &DissAssembly, &ErrorMessage);
+ if (FAILED(hr)) {
+ TRACE("%ws", ErrorMessage.GetString());
+ ASSERT(0);
+ CleanupFinalPass();
+ return hr;
+ }
+
+ return S_OK;
}
void CDX9RenderingEngine::CleanupFinalPass()
{
- m_bFinalPass = false;
- m_pDitherTexture = NULL;
- m_pLut3DTexture = NULL;
- m_pFinalPixelShader = NULL;
+ m_bFinalPass = false;
+ m_pDitherTexture = NULL;
+ m_pLut3DTexture = NULL;
+ m_pFinalPixelShader = NULL;
}
HRESULT CDX9RenderingEngine::CreateIccProfileLut(TCHAR* profilePath, float* lut3D)
{
- // Get the input video system
- VideoSystem videoSystem;
-
- if (m_InputVideoSystem == VIDEO_SYSTEM_UNKNOWN) {
- static const int ntscSizes[][2] = {{720, 480}, {720, 486}, {704, 480}};
- static const int palSizes[][2] = {{720, 576}, {704, 576}};
-
- videoSystem = VIDEO_SYSTEM_HDTV; // default
-
- for (int i = 0; i < _countof(ntscSizes); i++) {
- if (m_NativeVideoSize.cx == ntscSizes[i][0] && m_NativeVideoSize.cy == ntscSizes[i][1]) {
- videoSystem = VIDEO_SYSTEM_SDTV_NTSC;
- }
- }
-
- for (int i = 0; i < _countof(palSizes); i++) {
- if (m_NativeVideoSize.cx == palSizes[i][0] && m_NativeVideoSize.cy == palSizes[i][1]) {
- videoSystem = VIDEO_SYSTEM_SDTV_PAL;
- }
- }
- } else {
- videoSystem = m_InputVideoSystem;
- }
-
- // Get the gamma
- double gamma;
-
- switch (m_AmbientLight) {
- case AMBIENT_LIGHT_BRIGHT:
- gamma = 2.2;
- break;
-
- case AMBIENT_LIGHT_DIM:
- gamma = 2.35;
- break;
-
- case AMBIENT_LIGHT_DARK:
- gamma = 2.4;
- break;
-
- default:
- return E_FAIL;
- }
-
- // Get the rendering intent
- cmsUInt32Number intent;
-
- switch (m_RenderingIntent) {
- case COLOR_RENDERING_INTENT_PERCEPTUAL:
- intent = INTENT_PERCEPTUAL;
- break;
-
- case COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC:
- intent = INTENT_RELATIVE_COLORIMETRIC;
- break;
-
- case COLOR_RENDERING_INTENT_SATURATION:
- intent = INTENT_SATURATION;
- break;
-
- case COLOR_RENDERING_INTENT_ABSOLUTE_COLORIMETRIC:
- intent = INTENT_ABSOLUTE_COLORIMETRIC;
- break;
-
- default:
- return E_FAIL;
- }
-
- // Set the input white point. It's D65 in all cases.
- cmsCIExyY whitePoint;
-
- whitePoint.x = 0.312713;
- whitePoint.y = 0.329016;
- whitePoint.Y = 1.0;
-
- // Set the input primaries
- cmsCIExyYTRIPLE primaries;
-
- switch (videoSystem) {
- case VIDEO_SYSTEM_HDTV:
- // Rec. 709
- primaries.Red.x = 0.64;
- primaries.Red.y = 0.33;
- primaries.Green.x = 0.30;
- primaries.Green.y = 0.60;
- primaries.Blue.x = 0.15;
- primaries.Blue.y = 0.06;
- break;
-
- case VIDEO_SYSTEM_SDTV_NTSC:
- // SMPTE-C
- primaries.Red.x = 0.630;
- primaries.Red.y = 0.340;
- primaries.Green.x = 0.310;
- primaries.Green.y = 0.595;
- primaries.Blue.x = 0.155;
- primaries.Blue.y = 0.070;
- break;
-
- case VIDEO_SYSTEM_SDTV_PAL:
- // PAL/SECAM
- primaries.Red.x = 0.64;
- primaries.Red.y = 0.33;
- primaries.Green.x = 0.29;
- primaries.Green.y = 0.60;
- primaries.Blue.x = 0.15;
- primaries.Blue.y = 0.06;
- break;
-
- default:
- return E_FAIL;
- }
-
- primaries.Red.Y = 1.0;
- primaries.Green.Y = 1.0;
- primaries.Blue.Y = 1.0;
-
- // Set the input gamma, which is the gamma of a reference studio display we want to simulate
- // For more information, see the paper at http://www.poynton.com/notes/PU-PR-IS/Poynton-PU-PR-IS.pdf
- cmsToneCurve* transferFunction = cmsBuildGamma(0, gamma);
-
- cmsToneCurve* transferFunctionRGB[3];
- for (int i = 0; i < 3; i++) {
- transferFunctionRGB[i] = transferFunction;
- }
-
- // Create the input profile
- cmsHPROFILE hInputProfile = cmsCreateRGBProfile(&whitePoint, &primaries, transferFunctionRGB);
- cmsFreeToneCurve(transferFunction);
-
- if (hInputProfile == NULL) {
- return E_FAIL;
- }
-
- // Open the output profile
- cmsHPROFILE hOutputProfile;
- FILE* outputProfileStream;
-
- if (profilePath != 0) {
- if (_wfopen_s(&outputProfileStream, T2W(profilePath), L"rb") != 0) {
- cmsCloseProfile(hInputProfile);
- return E_FAIL;
- }
-
- hOutputProfile = cmsOpenProfileFromStream(outputProfileStream, "r");
- } else {
- hOutputProfile = cmsCreate_sRGBProfile();
- }
-
- if (hOutputProfile == NULL) {
- if (profilePath != 0) {
- fclose(outputProfileStream);
- }
-
- cmsCloseProfile(hInputProfile);
- return E_FAIL;
- }
-
- // Create the transform
- cmsHTRANSFORM hTransform = cmsCreateTransform(hInputProfile, TYPE_RGB_16, hOutputProfile, TYPE_RGB_16, intent, cmsFLAGS_HIGHRESPRECALC);
-
- cmsCloseProfile(hOutputProfile);
-
- if (profilePath != 0) {
- fclose(outputProfileStream);
- }
-
- cmsCloseProfile(hInputProfile);
-
- if (hTransform == NULL) {
- return E_FAIL;
- }
-
- // Create the 3D LUT input
- unsigned short* lut3DOutput = DNew unsigned short[m_Lut3DEntryCount * 3];
- unsigned short* lut3DInput = DNew unsigned short[m_Lut3DEntryCount * 3];
-
- unsigned short* lut3DInputIterator = lut3DInput;
-
- for (int b = 0; b < m_Lut3DSize; b++) {
- for (int g = 0; g < m_Lut3DSize; g++) {
- for (int r = 0; r < m_Lut3DSize; r++) {
- *lut3DInputIterator++ = r * 65535 / (m_Lut3DSize - 1);
- *lut3DInputIterator++ = g * 65535 / (m_Lut3DSize - 1);
- *lut3DInputIterator++ = b * 65535 / (m_Lut3DSize - 1);
- }
- }
- }
-
- // Do the transform
- cmsDoTransform(hTransform, lut3DInput, lut3DOutput, m_Lut3DEntryCount);
-
- // Convert the output to floating point
- for (int i = 0; i < m_Lut3DEntryCount * 3; i++) {
- lut3D[i] = static_cast<float>(lut3DOutput[i]) * (1.0f / 65535.0f);
- }
-
- // Cleanup
- delete[] lut3DOutput;
- delete[] lut3DInput;
- cmsDeleteTransform(hTransform);
-
- return S_OK;
+ // Get the input video system
+ VideoSystem videoSystem;
+
+ if (m_InputVideoSystem == VIDEO_SYSTEM_UNKNOWN) {
+ static const int ntscSizes[][2] = {{720, 480}, {720, 486}, {704, 480}};
+ static const int palSizes[][2] = {{720, 576}, {704, 576}};
+
+ videoSystem = VIDEO_SYSTEM_HDTV; // default
+
+ for (int i = 0; i < _countof(ntscSizes); i++) {
+ if (m_NativeVideoSize.cx == ntscSizes[i][0] && m_NativeVideoSize.cy == ntscSizes[i][1]) {
+ videoSystem = VIDEO_SYSTEM_SDTV_NTSC;
+ }
+ }
+
+ for (int i = 0; i < _countof(palSizes); i++) {
+ if (m_NativeVideoSize.cx == palSizes[i][0] && m_NativeVideoSize.cy == palSizes[i][1]) {
+ videoSystem = VIDEO_SYSTEM_SDTV_PAL;
+ }
+ }
+ } else {
+ videoSystem = m_InputVideoSystem;
+ }
+
+ // Get the gamma
+ double gamma;
+
+ switch (m_AmbientLight) {
+ case AMBIENT_LIGHT_BRIGHT:
+ gamma = 2.2;
+ break;
+
+ case AMBIENT_LIGHT_DIM:
+ gamma = 2.35;
+ break;
+
+ case AMBIENT_LIGHT_DARK:
+ gamma = 2.4;
+ break;
+
+ default:
+ return E_FAIL;
+ }
+
+ // Get the rendering intent
+ cmsUInt32Number intent;
+
+ switch (m_RenderingIntent) {
+ case COLOR_RENDERING_INTENT_PERCEPTUAL:
+ intent = INTENT_PERCEPTUAL;
+ break;
+
+ case COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC:
+ intent = INTENT_RELATIVE_COLORIMETRIC;
+ break;
+
+ case COLOR_RENDERING_INTENT_SATURATION:
+ intent = INTENT_SATURATION;
+ break;
+
+ case COLOR_RENDERING_INTENT_ABSOLUTE_COLORIMETRIC:
+ intent = INTENT_ABSOLUTE_COLORIMETRIC;
+ break;
+
+ default:
+ return E_FAIL;
+ }
+
+ // Set the input white point. It's D65 in all cases.
+ cmsCIExyY whitePoint;
+
+ whitePoint.x = 0.312713;
+ whitePoint.y = 0.329016;
+ whitePoint.Y = 1.0;
+
+ // Set the input primaries
+ cmsCIExyYTRIPLE primaries;
+
+ switch (videoSystem) {
+ case VIDEO_SYSTEM_HDTV:
+ // Rec. 709
+ primaries.Red.x = 0.64;
+ primaries.Red.y = 0.33;
+ primaries.Green.x = 0.30;
+ primaries.Green.y = 0.60;
+ primaries.Blue.x = 0.15;
+ primaries.Blue.y = 0.06;
+ break;
+
+ case VIDEO_SYSTEM_SDTV_NTSC:
+ // SMPTE-C
+ primaries.Red.x = 0.630;
+ primaries.Red.y = 0.340;
+ primaries.Green.x = 0.310;
+ primaries.Green.y = 0.595;
+ primaries.Blue.x = 0.155;
+ primaries.Blue.y = 0.070;
+ break;
+
+ case VIDEO_SYSTEM_SDTV_PAL:
+ // PAL/SECAM
+ primaries.Red.x = 0.64;
+ primaries.Red.y = 0.33;
+ primaries.Green.x = 0.29;
+ primaries.Green.y = 0.60;
+ primaries.Blue.x = 0.15;
+ primaries.Blue.y = 0.06;
+ break;
+
+ default:
+ return E_FAIL;
+ }
+
+ primaries.Red.Y = 1.0;
+ primaries.Green.Y = 1.0;
+ primaries.Blue.Y = 1.0;
+
+ // Set the input gamma, which is the gamma of a reference studio display we want to simulate
+ // For more information, see the paper at http://www.poynton.com/notes/PU-PR-IS/Poynton-PU-PR-IS.pdf
+ cmsToneCurve* transferFunction = cmsBuildGamma(0, gamma);
+
+ cmsToneCurve* transferFunctionRGB[3];
+ for (int i = 0; i < 3; i++) {
+ transferFunctionRGB[i] = transferFunction;
+ }
+
+ // Create the input profile
+ cmsHPROFILE hInputProfile = cmsCreateRGBProfile(&whitePoint, &primaries, transferFunctionRGB);
+ cmsFreeToneCurve(transferFunction);
+
+ if (hInputProfile == NULL) {
+ return E_FAIL;
+ }
+
+ // Open the output profile
+ cmsHPROFILE hOutputProfile;
+ FILE* outputProfileStream;
+
+ if (profilePath != 0) {
+ if (_wfopen_s(&outputProfileStream, T2W(profilePath), L"rb") != 0) {
+ cmsCloseProfile(hInputProfile);
+ return E_FAIL;
+ }
+
+ hOutputProfile = cmsOpenProfileFromStream(outputProfileStream, "r");
+ } else {
+ hOutputProfile = cmsCreate_sRGBProfile();
+ }
+
+ if (hOutputProfile == NULL) {
+ if (profilePath != 0) {
+ fclose(outputProfileStream);
+ }
+
+ cmsCloseProfile(hInputProfile);
+ return E_FAIL;
+ }
+
+ // Create the transform
+ cmsHTRANSFORM hTransform = cmsCreateTransform(hInputProfile, TYPE_RGB_16, hOutputProfile, TYPE_RGB_16, intent, cmsFLAGS_HIGHRESPRECALC);
+
+ cmsCloseProfile(hOutputProfile);
+
+ if (profilePath != 0) {
+ fclose(outputProfileStream);
+ }
+
+ cmsCloseProfile(hInputProfile);
+
+ if (hTransform == NULL) {
+ return E_FAIL;
+ }
+
+ // Create the 3D LUT input
+ unsigned short* lut3DOutput = DNew unsigned short[m_Lut3DEntryCount * 3];
+ unsigned short* lut3DInput = DNew unsigned short[m_Lut3DEntryCount * 3];
+
+ unsigned short* lut3DInputIterator = lut3DInput;
+
+ for (int b = 0; b < m_Lut3DSize; b++) {
+ for (int g = 0; g < m_Lut3DSize; g++) {
+ for (int r = 0; r < m_Lut3DSize; r++) {
+ *lut3DInputIterator++ = r * 65535 / (m_Lut3DSize - 1);
+ *lut3DInputIterator++ = g * 65535 / (m_Lut3DSize - 1);
+ *lut3DInputIterator++ = b * 65535 / (m_Lut3DSize - 1);
+ }
+ }
+ }
+
+ // Do the transform
+ cmsDoTransform(hTransform, lut3DInput, lut3DOutput, m_Lut3DEntryCount);
+
+ // Convert the output to floating point
+ for (int i = 0; i < m_Lut3DEntryCount * 3; i++) {
+ lut3D[i] = static_cast<float>(lut3DOutput[i]) * (1.0f / 65535.0f);
+ }
+
+ // Cleanup
+ delete[] lut3DOutput;
+ delete[] lut3DInput;
+ cmsDeleteTransform(hTransform);
+
+ return S_OK;
}
HRESULT CDX9RenderingEngine::FinalPass(IDirect3DTexture9* pTexture)
{
- HRESULT hr;
+ HRESULT hr;
- D3DSURFACE_DESC desc;
- if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
- return E_FAIL;
- }
+ D3DSURFACE_DESC desc;
+ if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
+ return E_FAIL;
+ }
- float w = (float)desc.Width;
- float h = (float)desc.Height;
+ float w = (float)desc.Width;
+ float h = (float)desc.Height;
- MYD3DVERTEX<1> v[] = {
- {0, 0, 0.5f, 2.0f, 0, 0},
- {w, 0, 0.5f, 2.0f, 1, 0},
- {0, h, 0.5f, 2.0f, 0, 1},
- {w, h, 0.5f, 2.0f, 1, 1},
- };
+ MYD3DVERTEX<1> v[] = {
+ {0, 0, 0.5f, 2.0f, 0, 0},
+ {w, 0, 0.5f, 2.0f, 1, 0},
+ {0, h, 0.5f, 2.0f, 0, 1},
+ {w, h, 0.5f, 2.0f, 1, 1},
+ };
- for (int i = 0; i < _countof(v); i++) {
- v[i].x -= 0.5;
- v[i].y -= 0.5;
- }
+ for (int i = 0; i < _countof(v); i++) {
+ v[i].x -= 0.5;
+ v[i].y -= 0.5;
+ }
- hr = m_pD3DDev->SetPixelShader(m_pFinalPixelShader);
+ hr = m_pD3DDev->SetPixelShader(m_pFinalPixelShader);
- // Set sampler: image
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
+ // Set sampler: image
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
- hr = m_pD3DDev->SetTexture(0, pTexture);
+ hr = m_pD3DDev->SetTexture(0, pTexture);
- // Set sampler: ditherMap
- hr = m_pD3DDev->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
- hr = m_pD3DDev->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_POINT);
- hr = m_pD3DDev->SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
+ // Set sampler: ditherMap
+ hr = m_pD3DDev->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
+ hr = m_pD3DDev->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_POINT);
+ hr = m_pD3DDev->SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
- hr = m_pD3DDev->SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
- hr = m_pD3DDev->SetSamplerState(1, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
+ hr = m_pD3DDev->SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
+ hr = m_pD3DDev->SetSamplerState(1, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
- hr = m_pD3DDev->SetTexture(1, m_pDitherTexture);
+ hr = m_pD3DDev->SetTexture(1, m_pDitherTexture);
- if (m_bColorManagement) {
- hr = m_pD3DDev->SetSamplerState(2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
- hr = m_pD3DDev->SetSamplerState(2, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
- hr = m_pD3DDev->SetSamplerState(2, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
+ if (m_bColorManagement) {
+ hr = m_pD3DDev->SetSamplerState(2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
+ hr = m_pD3DDev->SetSamplerState(2, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
+ hr = m_pD3DDev->SetSamplerState(2, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
- hr = m_pD3DDev->SetSamplerState(2, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
- hr = m_pD3DDev->SetSamplerState(2, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
- hr = m_pD3DDev->SetSamplerState(2, D3DSAMP_ADDRESSW, D3DTADDRESS_CLAMP);
+ hr = m_pD3DDev->SetSamplerState(2, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
+ hr = m_pD3DDev->SetSamplerState(2, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
+ hr = m_pD3DDev->SetSamplerState(2, D3DSAMP_ADDRESSW, D3DTADDRESS_CLAMP);
- hr = m_pD3DDev->SetTexture(2, m_pLut3DTexture);
- }
+ hr = m_pD3DDev->SetTexture(2, m_pLut3DTexture);
+ }
- // Set constants
- float fConstData[][4] = {{(float)w / DITHER_MATRIX_SIZE, (float)h / DITHER_MATRIX_SIZE, 0, 0}};
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+ // Set constants
+ float fConstData[][4] = {{(float)w / DITHER_MATRIX_SIZE, (float)h / DITHER_MATRIX_SIZE, 0, 0}};
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
- hr = TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
+ hr = TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
- hr = m_pD3DDev->SetTexture(1, NULL);
+ hr = m_pD3DDev->SetTexture(1, NULL);
- if (m_bColorManagement) {
- hr = m_pD3DDev->SetTexture(2, NULL);
- }
+ if (m_bColorManagement) {
+ hr = m_pD3DDev->SetTexture(2, NULL);
+ }
- return hr;
+ return hr;
}
HRESULT CDX9RenderingEngine::TextureCopy(IDirect3DTexture9* pTexture)
{
- HRESULT hr;
+ HRESULT hr;
- D3DSURFACE_DESC desc;
- if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
- return E_FAIL;
- }
+ D3DSURFACE_DESC desc;
+ if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
+ return E_FAIL;
+ }
- float w = (float)desc.Width;
- float h = (float)desc.Height;
+ float w = (float)desc.Width;
+ float h = (float)desc.Height;
- MYD3DVERTEX<1> v[] = {
- {0, 0, 0.5f, 2.0f, 0, 0},
- {w, 0, 0.5f, 2.0f, 1, 0},
- {0, h, 0.5f, 2.0f, 0, 1},
- {w, h, 0.5f, 2.0f, 1, 1},
- };
+ MYD3DVERTEX<1> v[] = {
+ {0, 0, 0.5f, 2.0f, 0, 0},
+ {w, 0, 0.5f, 2.0f, 1, 0},
+ {0, h, 0.5f, 2.0f, 0, 1},
+ {w, h, 0.5f, 2.0f, 1, 1},
+ };
- for (int i = 0; i < _countof(v); i++) {
- v[i].x -= 0.5;
- v[i].y -= 0.5;
- }
+ for (int i = 0; i < _countof(v); i++) {
+ v[i].x -= 0.5;
+ v[i].y -= 0.5;
+ }
- hr = m_pD3DDev->SetTexture(0, pTexture);
+ hr = m_pD3DDev->SetTexture(0, pTexture);
- return TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
+ return TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
}
bool CDX9RenderingEngine::ClipToSurface(IDirect3DSurface9* pSurface, CRect& s, CRect& d)
{
- D3DSURFACE_DESC d3dsd;
- ZeroMemory(&d3dsd, sizeof(d3dsd));
- if (FAILED(pSurface->GetDesc(&d3dsd))) {
- return false;
- }
-
- int w = d3dsd.Width, h = d3dsd.Height;
- int sw = s.Width(), sh = s.Height();
- int dw = d.Width(), dh = d.Height();
-
- if (d.left >= w || d.right < 0 || d.top >= h || d.bottom < 0
- || sw <= 0 || sh <= 0 || dw <= 0 || dh <= 0) {
- s.SetRectEmpty();
- d.SetRectEmpty();
- return true;
- }
-
- if (d.right > w) {
- s.right -= (d.right-w)*sw/dw;
- d.right = w;
- }
- if (d.bottom > h) {
- s.bottom -= (d.bottom-h)*sh/dh;
- d.bottom = h;
- }
- if (d.left < 0) {
- s.left += (0-d.left)*sw/dw;
- d.left = 0;
- }
- if (d.top < 0) {
- s.top += (0-d.top)*sh/dh;
- d.top = 0;
- }
-
- return true;
+ D3DSURFACE_DESC d3dsd;
+ ZeroMemory(&d3dsd, sizeof(d3dsd));
+ if (FAILED(pSurface->GetDesc(&d3dsd))) {
+ return false;
+ }
+
+ int w = d3dsd.Width, h = d3dsd.Height;
+ int sw = s.Width(), sh = s.Height();
+ int dw = d.Width(), dh = d.Height();
+
+ if (d.left >= w || d.right < 0 || d.top >= h || d.bottom < 0
+ || sw <= 0 || sh <= 0 || dw <= 0 || dh <= 0) {
+ s.SetRectEmpty();
+ d.SetRectEmpty();
+ return true;
+ }
+
+ if (d.right > w) {
+ s.right -= (d.right - w) * sw / dw;
+ d.right = w;
+ }
+ if (d.bottom > h) {
+ s.bottom -= (d.bottom - h) * sh / dh;
+ d.bottom = h;
+ }
+ if (d.left < 0) {
+ s.left += (0 - d.left) * sw / dw;
+ d.left = 0;
+ }
+ if (d.top < 0) {
+ s.top += (0 - d.top) * sh / dh;
+ d.top = 0;
+ }
+
+ return true;
}
-HRESULT CDX9RenderingEngine::DrawRect(DWORD _Color, DWORD _Alpha, const CRect &_Rect)
+HRESULT CDX9RenderingEngine::DrawRect(DWORD _Color, DWORD _Alpha, const CRect& _Rect)
{
- if (!m_pD3DDev) {
- return E_POINTER;
- }
-
- DWORD Color = D3DCOLOR_ARGB(_Alpha, GetRValue(_Color), GetGValue(_Color), GetBValue(_Color));
- MYD3DVERTEX<0> v[] = {
- {float(_Rect.left), float(_Rect.top), 0.5f, 2.0f, Color},
- {float(_Rect.right), float(_Rect.top), 0.5f, 2.0f, Color},
- {float(_Rect.left), float(_Rect.bottom), 0.5f, 2.0f, Color},
- {float(_Rect.right), float(_Rect.bottom), 0.5f, 2.0f, Color},
- };
-
- for (int i = 0; i < _countof(v); i++) {
- v[i].x -= 0.5;
- v[i].y -= 0.5;
- }
-
- HRESULT hr = m_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
- hr = m_pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
- hr = m_pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
- hr = m_pD3DDev->SetRenderState(D3DRS_STENCILENABLE, FALSE);
- hr = m_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
- hr = m_pD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
- hr = m_pD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
- //D3DRS_COLORVERTEX
- hr = m_pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
- hr = m_pD3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
-
-
- hr = m_pD3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA|D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED);
-
- hr = m_pD3DDev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX0 | D3DFVF_DIFFUSE);
- // hr = m_pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v, sizeof(v[0]));
-
- MYD3DVERTEX<0> tmp = v[2];
- v[2] = v[3];
- v[3] = tmp;
- hr = m_pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(v[0]));
-
- return S_OK;
+ if (!m_pD3DDev) {
+ return E_POINTER;
+ }
+
+ DWORD Color = D3DCOLOR_ARGB(_Alpha, GetRValue(_Color), GetGValue(_Color), GetBValue(_Color));
+ MYD3DVERTEX<0> v[] = {
+ {float(_Rect.left), float(_Rect.top), 0.5f, 2.0f, Color},
+ {float(_Rect.right), float(_Rect.top), 0.5f, 2.0f, Color},
+ {float(_Rect.left), float(_Rect.bottom), 0.5f, 2.0f, Color},
+ {float(_Rect.right), float(_Rect.bottom), 0.5f, 2.0f, Color},
+ };
+
+ for (int i = 0; i < _countof(v); i++) {
+ v[i].x -= 0.5;
+ v[i].y -= 0.5;
+ }
+
+ HRESULT hr = m_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_STENCILENABLE, FALSE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
+ hr = m_pD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
+ //D3DRS_COLORVERTEX
+ hr = m_pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
+
+
+ hr = m_pD3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED);
+
+ hr = m_pD3DDev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX0 | D3DFVF_DIFFUSE);
+ // hr = m_pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v, sizeof(v[0]));
+
+ MYD3DVERTEX<0> tmp = v[2];
+ v[2] = v[3];
+ v[3] = tmp;
+ hr = m_pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(v[0]));
+
+ return S_OK;
}
HRESULT CDX9RenderingEngine::AlphaBlt(RECT* pSrc, RECT* pDst, IDirect3DTexture9* pTexture)
{
- if (!pSrc || !pDst) {
- return E_POINTER;
- }
-
- CRect src(*pSrc), dst(*pDst);
-
- HRESULT hr;
-
- D3DSURFACE_DESC d3dsd;
- ZeroMemory(&d3dsd, sizeof(d3dsd));
- if (FAILED(pTexture->GetLevelDesc(0, &d3dsd)) /*|| d3dsd.Type != D3DRTYPE_TEXTURE*/) {
- return E_FAIL;
- }
-
- float w = (float)d3dsd.Width;
- float h = (float)d3dsd.Height;
-
- struct {
- float x, y, z, rhw;
- float tu, tv;
- }
- pVertices[] = {
- {(float)dst.left, (float)dst.top, 0.5f, 2.0f, (float)src.left / w, (float)src.top / h},
- {(float)dst.right, (float)dst.top, 0.5f, 2.0f, (float)src.right / w, (float)src.top / h},
- {(float)dst.left, (float)dst.bottom, 0.5f, 2.0f, (float)src.left / w, (float)src.bottom / h},
- {(float)dst.right, (float)dst.bottom, 0.5f, 2.0f, (float)src.right / w, (float)src.bottom / h},
- };
-
- for (int i = 0; i < _countof(pVertices); i++) {
- pVertices[i].x -= 0.5;
- pVertices[i].y -= 0.5;
- }
-
- hr = m_pD3DDev->SetTexture(0, pTexture);
-
- // GetRenderState fails for devices created with D3DCREATE_PUREDEVICE
- // so we need to provide default values in case GetRenderState fails
- DWORD abe, sb, db;
- if (FAILED(m_pD3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &abe)))
- abe = FALSE;
- if (FAILED(m_pD3DDev->GetRenderState(D3DRS_SRCBLEND, &sb)))
- sb = D3DBLEND_ONE;
- if (FAILED(m_pD3DDev->GetRenderState(D3DRS_DESTBLEND, &db)))
- db = D3DBLEND_ZERO;
-
- hr = m_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
- hr = m_pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
- hr = m_pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
- hr = m_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
- hr = m_pD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); // pre-multiplied src and ...
- hr = m_pD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCALPHA); // ... inverse alpha channel for dst
-
- hr = m_pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
- hr = m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- hr = m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
-
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
-
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
-
- /*//
-
- D3DCAPS9 d3dcaps9;
- hr = m_pD3DDev->GetDeviceCaps(&d3dcaps9);
- if (d3dcaps9.AlphaCmpCaps & D3DPCMPCAPS_LESS)
- {
- hr = m_pD3DDev->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x000000FE);
- hr = m_pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
- hr = m_pD3DDev->SetRenderState(D3DRS_ALPHAFUNC, D3DPCMPCAPS_LESS);
- }
-
- *///
-
- hr = m_pD3DDev->SetPixelShader(NULL);
-
- hr = m_pD3DDev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
- hr = m_pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof(pVertices[0]));
-
- //
-
- m_pD3DDev->SetTexture(0, NULL);
-
- m_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, abe);
- m_pD3DDev->SetRenderState(D3DRS_SRCBLEND, sb);
- m_pD3DDev->SetRenderState(D3DRS_DESTBLEND, db);
-
- return S_OK;
+ if (!pSrc || !pDst) {
+ return E_POINTER;
+ }
+
+ CRect src(*pSrc), dst(*pDst);
+
+ HRESULT hr;
+
+ D3DSURFACE_DESC d3dsd;
+ ZeroMemory(&d3dsd, sizeof(d3dsd));
+ if (FAILED(pTexture->GetLevelDesc(0, &d3dsd)) /*|| d3dsd.Type != D3DRTYPE_TEXTURE*/) {
+ return E_FAIL;
+ }
+
+ float w = (float)d3dsd.Width;
+ float h = (float)d3dsd.Height;
+
+ struct {
+ float x, y, z, rhw;
+ float tu, tv;
+ }
+ pVertices[] = {
+ {(float)dst.left, (float)dst.top, 0.5f, 2.0f, (float)src.left / w, (float)src.top / h},
+ {(float)dst.right, (float)dst.top, 0.5f, 2.0f, (float)src.right / w, (float)src.top / h},
+ {(float)dst.left, (float)dst.bottom, 0.5f, 2.0f, (float)src.left / w, (float)src.bottom / h},
+ {(float)dst.right, (float)dst.bottom, 0.5f, 2.0f, (float)src.right / w, (float)src.bottom / h},
+ };
+
+ for (int i = 0; i < _countof(pVertices); i++) {
+ pVertices[i].x -= 0.5;
+ pVertices[i].y -= 0.5;
+ }
+
+ hr = m_pD3DDev->SetTexture(0, pTexture);
+
+ // GetRenderState fails for devices created with D3DCREATE_PUREDEVICE
+ // so we need to provide default values in case GetRenderState fails
+ DWORD abe, sb, db;
+ if (FAILED(m_pD3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &abe))) {
+ abe = FALSE;
+ }
+ if (FAILED(m_pD3DDev->GetRenderState(D3DRS_SRCBLEND, &sb))) {
+ sb = D3DBLEND_ONE;
+ }
+ if (FAILED(m_pD3DDev->GetRenderState(D3DRS_DESTBLEND, &db))) {
+ db = D3DBLEND_ZERO;
+ }
+
+ hr = m_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); // pre-multiplied src and ...
+ hr = m_pD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCALPHA); // ... inverse alpha channel for dst
+
+ hr = m_pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
+ hr = m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
+ hr = m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
+
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
+
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
+
+ /*//
+
+ D3DCAPS9 d3dcaps9;
+ hr = m_pD3DDev->GetDeviceCaps(&d3dcaps9);
+ if (d3dcaps9.AlphaCmpCaps & D3DPCMPCAPS_LESS)
+ {
+ hr = m_pD3DDev->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x000000FE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_ALPHAFUNC, D3DPCMPCAPS_LESS);
+ }
+
+ *///
+
+ hr = m_pD3DDev->SetPixelShader(NULL);
+
+ hr = m_pD3DDev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
+ hr = m_pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof(pVertices[0]));
+
+ //
+
+ m_pD3DDev->SetTexture(0, NULL);
+
+ m_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, abe);
+ m_pD3DDev->SetRenderState(D3DRS_SRCBLEND, sb);
+ m_pD3DDev->SetRenderState(D3DRS_DESTBLEND, db);
+
+ return S_OK;
}
HRESULT CDX9RenderingEngine::SetCustomPixelShader(LPCSTR pSrcData, LPCSTR pTarget, bool bScreenSpace)
{
- CAtlList<CExternalPixelShader> *pPixelShaders;
- if (bScreenSpace) {
- pPixelShaders = &m_pCustomScreenSpacePixelShaders;
- } else {
- pPixelShaders = &m_pCustomPixelShaders;
- }
+ CAtlList<CExternalPixelShader>* pPixelShaders;
+ if (bScreenSpace) {
+ pPixelShaders = &m_pCustomScreenSpacePixelShaders;
+ } else {
+ pPixelShaders = &m_pCustomPixelShaders;
+ }
- if (!pSrcData && !pTarget) {
- pPixelShaders->RemoveAll();
- m_pD3DDev->SetPixelShader(NULL);
- return S_OK;
- }
+ if (!pSrcData && !pTarget) {
+ pPixelShaders->RemoveAll();
+ m_pD3DDev->SetPixelShader(NULL);
+ return S_OK;
+ }
- if (!pSrcData || !pTarget) {
- return E_INVALIDARG;
- }
+ if (!pSrcData || !pTarget) {
+ return E_INVALIDARG;
+ }
- CExternalPixelShader Shader;
- Shader.m_SourceData = pSrcData;
- Shader.m_SourceTarget = pTarget;
+ CExternalPixelShader Shader;
+ Shader.m_SourceData = pSrcData;
+ Shader.m_SourceTarget = pTarget;
- CComPtr<IDirect3DPixelShader9> pPixelShader;
+ CComPtr<IDirect3DPixelShader9> pPixelShader;
- HRESULT hr = Shader.Compile(m_pPSC);
- if (FAILED(hr)) {
- return hr;
- }
+ HRESULT hr = Shader.Compile(m_pPSC);
+ if (FAILED(hr)) {
+ return hr;
+ }
- pPixelShaders->AddTail(Shader);
+ pPixelShaders->AddTail(Shader);
- Paint(false);
+ Paint(false);
- return S_OK;
+ return S_OK;
}
diff --git a/src/filters/renderer/VideoRenderers/DX9RenderingEngine.h b/src/filters/renderer/VideoRenderers/DX9RenderingEngine.h
index f51e0c401..699d5fe85 100644
--- a/src/filters/renderer/VideoRenderers/DX9RenderingEngine.h
+++ b/src/filters/renderer/VideoRenderers/DX9RenderingEngine.h
@@ -32,152 +32,152 @@
namespace DSObjects
{
- class CDX9RenderingEngine
- : public CSubPicAllocatorPresenterImpl
- {
- protected:
- enum RenderingPath {
- RENDERING_PATH_STRETCHRECT,
- RENDERING_PATH_DRAW,
- };
-
- static const int MAX_VIDEO_SURFACES = 60;
-
- // Variables initialized/managed by the allocator-presenter!
- CComPtr<IDirect3D9> m_pD3D;
- CComPtr<IDirect3D9Ex> m_pD3DEx;
- CComPtr<IDirect3DDevice9> m_pD3DDev;
- CComPtr<IDirect3DDevice9Ex> m_pD3DDevEx;
- UINT m_CurrentAdapter;
- D3DCAPS9 m_Caps;
- D3DFORMAT m_BackbufferType;
- D3DFORMAT m_DisplayType;
- CSize m_ScreenSize;
- int m_nNbDXSurface; // Total number of DX Surfaces
- int m_nCurSurface; // Surface currently displayed
-
- bool m_bHighColorResolution;
- bool m_bForceInputHighColorResolution;
-
- // Variables initialized/managed by this class but can be accessed by the allocator-presenter
- bool m_bD3DX;
- RenderingPath m_RenderingPath;
- D3DFORMAT m_SurfaceType;
- CComPtr<IDirect3DTexture9> m_pVideoTexture[MAX_VIDEO_SURFACES];
- CComPtr<IDirect3DSurface9> m_pVideoSurface[MAX_VIDEO_SURFACES];
-
- bool m_bFullFloatingPointProcessing;
- bool m_bHalfFloatingPointProcessing;
- bool m_bColorManagement;
-
- CDX9RenderingEngine(HWND hWnd, HRESULT& hr, CString *_pError);
-
- void InitRenderingEngine();
- void CleanupRenderingEngine();
-
- HRESULT CreateVideoSurfaces();
- void FreeVideoSurfaces();
-
- HRESULT RenderVideo(IDirect3DSurface9* pRenderTarget, const CRect& srcRect, const CRect& destRect);
-
- HRESULT DrawRect(DWORD _Color, DWORD _Alpha, const CRect &_Rect);
- HRESULT AlphaBlt(RECT* pSrc, RECT* pDst, IDirect3DTexture9* pTexture);
-
- HRESULT SetCustomPixelShader(LPCSTR pSrcData, LPCSTR pTarget, bool bScreenSpace);
-
-
- private:
- class CExternalPixelShader
- {
- public:
- CComPtr<IDirect3DPixelShader9> m_pPixelShader;
- CStringA m_SourceData;
- CStringA m_SourceTarget;
- HRESULT Compile(CPixelShaderCompiler *pCompiler) {
- HRESULT hr = pCompiler->CompileShader(m_SourceData, "main", m_SourceTarget, 0, &m_pPixelShader);
- if (FAILED(hr)) {
- return hr;
- }
-
- return S_OK;
- }
- };
-
- // D3DX functions
- typedef D3DXFLOAT16* (WINAPI* D3DXFloat32To16ArrayPtr)(
- D3DXFLOAT16 *pOut,
- CONST FLOAT *pIn,
- UINT n);
-
-
- CAutoPtr<CPixelShaderCompiler> m_pPSC;
-
- // Settings
- VideoSystem m_InputVideoSystem;
- AmbientLight m_AmbientLight;
- ColorRenderingIntent m_RenderingIntent;
-
- // Custom pixel shaders
- CAtlList<CExternalPixelShader> m_pCustomPixelShaders;
- CComPtr<IDirect3DTexture9> m_pTemporaryVideoTextures[2];
-
- // Screen space pipeline
- int m_ScreenSpacePassCount;
- int m_ScreenSpacePassSrc;
- int m_ScreenSpacePassDest;
- CSize m_TemporaryScreenSpaceTextureSize;
- CComPtr<IDirect3DTexture9> m_pTemporaryScreenSpaceTextures[2];
- IDirect3DSurface9* m_pRenderTarget;
-
- // Resizers
- float m_BicubicA;
- CComPtr<IDirect3DPixelShader9> m_pResizerPixelShaders[4]; // bl, bc1, bc2_1, bc2_2
-
- // Final pass
- bool m_bFinalPass;
- int m_Lut3DSize;
- int m_Lut3DEntryCount;
- CComPtr<IDirect3DVolumeTexture9> m_pLut3DTexture;
- CComPtr<IDirect3DTexture9> m_pDitherTexture;
- CComPtr<IDirect3DPixelShader9> m_pFinalPixelShader;
-
- // Custom screen space pixel shaders
- CAtlList<CExternalPixelShader> m_pCustomScreenSpacePixelShaders;
-
- // StetchRect rendering path
- D3DTEXTUREFILTERTYPE m_StretchRectFilter;
-
- // D3DX function pointers
- D3DXFloat32To16ArrayPtr m_pD3DXFloat32To16Array;
-
-
- // Video rendering paths
- HRESULT RenderVideoDrawPath(IDirect3DSurface9* pRenderTarget, const CRect& srcRect, const CRect& destRect);
- HRESULT RenderVideoStretchRectPath(IDirect3DSurface9* pRenderTarget, const CRect& srcRect, const CRect& destRect);
-
- // Custom pixel shaders
- HRESULT InitTemporaryVideoTextures(int count);
-
- // Screen space pipeline
- HRESULT InitScreenSpacePipeline(int passCount, IDirect3DSurface9* pRenderTarget);
- HRESULT InitTemporaryScreenSpaceTextures(int count);
- HRESULT BeginScreenSpacePass();
-
- // Resizers
- HRESULT InitResizers(float bicubicA);
- HRESULT TextureResize(IDirect3DTexture9* pTexture, Vector dst[4], D3DTEXTUREFILTERTYPE filter, const CRect &srcRect);
- HRESULT TextureResizeBilinear(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &srcRect);
- HRESULT TextureResizeBicubic1pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &srcRect);
- //HRESULT TextureResizeBicubic2pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &srcRect);
+ class CDX9RenderingEngine
+ : public CSubPicAllocatorPresenterImpl
+ {
+ protected:
+ enum RenderingPath {
+ RENDERING_PATH_STRETCHRECT,
+ RENDERING_PATH_DRAW,
+ };
+
+ static const int MAX_VIDEO_SURFACES = 60;
+
+ // Variables initialized/managed by the allocator-presenter!
+ CComPtr<IDirect3D9> m_pD3D;
+ CComPtr<IDirect3D9Ex> m_pD3DEx;
+ CComPtr<IDirect3DDevice9> m_pD3DDev;
+ CComPtr<IDirect3DDevice9Ex> m_pD3DDevEx;
+ UINT m_CurrentAdapter;
+ D3DCAPS9 m_Caps;
+ D3DFORMAT m_BackbufferType;
+ D3DFORMAT m_DisplayType;
+ CSize m_ScreenSize;
+ int m_nNbDXSurface; // Total number of DX Surfaces
+ int m_nCurSurface; // Surface currently displayed
+
+ bool m_bHighColorResolution;
+ bool m_bForceInputHighColorResolution;
+
+ // Variables initialized/managed by this class but can be accessed by the allocator-presenter
+ bool m_bD3DX;
+ RenderingPath m_RenderingPath;
+ D3DFORMAT m_SurfaceType;
+ CComPtr<IDirect3DTexture9> m_pVideoTexture[MAX_VIDEO_SURFACES];
+ CComPtr<IDirect3DSurface9> m_pVideoSurface[MAX_VIDEO_SURFACES];
+
+ bool m_bFullFloatingPointProcessing;
+ bool m_bHalfFloatingPointProcessing;
+ bool m_bColorManagement;
+
+ CDX9RenderingEngine(HWND hWnd, HRESULT& hr, CString* _pError);
+
+ void InitRenderingEngine();
+ void CleanupRenderingEngine();
+
+ HRESULT CreateVideoSurfaces();
+ void FreeVideoSurfaces();
+
+ HRESULT RenderVideo(IDirect3DSurface9* pRenderTarget, const CRect& srcRect, const CRect& destRect);
+
+ HRESULT DrawRect(DWORD _Color, DWORD _Alpha, const CRect& _Rect);
+ HRESULT AlphaBlt(RECT* pSrc, RECT* pDst, IDirect3DTexture9* pTexture);
+
+ HRESULT SetCustomPixelShader(LPCSTR pSrcData, LPCSTR pTarget, bool bScreenSpace);
+
+
+ private:
+ class CExternalPixelShader
+ {
+ public:
+ CComPtr<IDirect3DPixelShader9> m_pPixelShader;
+ CStringA m_SourceData;
+ CStringA m_SourceTarget;
+ HRESULT Compile(CPixelShaderCompiler* pCompiler) {
+ HRESULT hr = pCompiler->CompileShader(m_SourceData, "main", m_SourceTarget, 0, &m_pPixelShader);
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ return S_OK;
+ }
+ };
+
+ // D3DX functions
+ typedef D3DXFLOAT16* (WINAPI* D3DXFloat32To16ArrayPtr)(
+ D3DXFLOAT16* pOut,
+ CONST FLOAT* pIn,
+ UINT n);
+
+
+ CAutoPtr<CPixelShaderCompiler> m_pPSC;
+
+ // Settings
+ VideoSystem m_InputVideoSystem;
+ AmbientLight m_AmbientLight;
+ ColorRenderingIntent m_RenderingIntent;
+
+ // Custom pixel shaders
+ CAtlList<CExternalPixelShader> m_pCustomPixelShaders;
+ CComPtr<IDirect3DTexture9> m_pTemporaryVideoTextures[2];
+
+ // Screen space pipeline
+ int m_ScreenSpacePassCount;
+ int m_ScreenSpacePassSrc;
+ int m_ScreenSpacePassDest;
+ CSize m_TemporaryScreenSpaceTextureSize;
+ CComPtr<IDirect3DTexture9> m_pTemporaryScreenSpaceTextures[2];
+ IDirect3DSurface9* m_pRenderTarget;
+
+ // Resizers
+ float m_BicubicA;
+ CComPtr<IDirect3DPixelShader9> m_pResizerPixelShaders[4]; // bl, bc1, bc2_1, bc2_2
+
+ // Final pass
+ bool m_bFinalPass;
+ int m_Lut3DSize;
+ int m_Lut3DEntryCount;
+ CComPtr<IDirect3DVolumeTexture9> m_pLut3DTexture;
+ CComPtr<IDirect3DTexture9> m_pDitherTexture;
+ CComPtr<IDirect3DPixelShader9> m_pFinalPixelShader;
+
+ // Custom screen space pixel shaders
+ CAtlList<CExternalPixelShader> m_pCustomScreenSpacePixelShaders;
+
+ // StetchRect rendering path
+ D3DTEXTUREFILTERTYPE m_StretchRectFilter;
+
+ // D3DX function pointers
+ D3DXFloat32To16ArrayPtr m_pD3DXFloat32To16Array;
+
+
+ // Video rendering paths
+ HRESULT RenderVideoDrawPath(IDirect3DSurface9* pRenderTarget, const CRect& srcRect, const CRect& destRect);
+ HRESULT RenderVideoStretchRectPath(IDirect3DSurface9* pRenderTarget, const CRect& srcRect, const CRect& destRect);
+
+ // Custom pixel shaders
+ HRESULT InitTemporaryVideoTextures(int count);
+
+ // Screen space pipeline
+ HRESULT InitScreenSpacePipeline(int passCount, IDirect3DSurface9* pRenderTarget);
+ HRESULT InitTemporaryScreenSpaceTextures(int count);
+ HRESULT BeginScreenSpacePass();
+
+ // Resizers
+ HRESULT InitResizers(float bicubicA);
+ HRESULT TextureResize(IDirect3DTexture9* pTexture, Vector dst[4], D3DTEXTUREFILTERTYPE filter, const CRect& srcRect);
+ HRESULT TextureResizeBilinear(IDirect3DTexture9* pTexture, Vector dst[4], const CRect& srcRect);
+ HRESULT TextureResizeBicubic1pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect& srcRect);
+ //HRESULT TextureResizeBicubic2pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &srcRect);
- // Final pass
- HRESULT InitFinalPass();
- void CleanupFinalPass();
- HRESULT CreateIccProfileLut(TCHAR* profilePath, float* lut3D);
- HRESULT FinalPass(IDirect3DTexture9* pTexture);
-
- HRESULT TextureCopy(IDirect3DTexture9* pTexture);
- bool ClipToSurface(IDirect3DSurface9* pSurface, CRect& s, CRect& d);
- };
+ // Final pass
+ HRESULT InitFinalPass();
+ void CleanupFinalPass();
+ HRESULT CreateIccProfileLut(TCHAR* profilePath, float* lut3D);
+ HRESULT FinalPass(IDirect3DTexture9* pTexture);
+
+ HRESULT TextureCopy(IDirect3DTexture9* pTexture);
+ bool ClipToSurface(IDirect3DSurface9* pSurface, CRect& s, CRect& d);
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/DXRAllocatorPresenter.cpp b/src/filters/renderer/VideoRenderers/DXRAllocatorPresenter.cpp
index 4be94e482..2cb61d6d2 100644
--- a/src/filters/renderer/VideoRenderers/DXRAllocatorPresenter.cpp
+++ b/src/filters/renderer/VideoRenderers/DXRAllocatorPresenter.cpp
@@ -33,213 +33,213 @@ using namespace DSObjects;
// CDXRAllocatorPresenter
//
-CDXRAllocatorPresenter::CDXRAllocatorPresenter(HWND hWnd, HRESULT& hr, CString &_Error)
- : CSubPicAllocatorPresenterImpl(hWnd, hr, &_Error)
- , m_ScreenSize(0, 0)
+CDXRAllocatorPresenter::CDXRAllocatorPresenter(HWND hWnd, HRESULT& hr, CString& _Error)
+ : CSubPicAllocatorPresenterImpl(hWnd, hr, &_Error)
+ , m_ScreenSize(0, 0)
{
- if (FAILED(hr)) {
- _Error += L"ISubPicAllocatorPresenterImpl failed\n";
- return;
- }
+ if (FAILED(hr)) {
+ _Error += L"ISubPicAllocatorPresenterImpl failed\n";
+ return;
+ }
- hr = S_OK;
+ hr = S_OK;
}
CDXRAllocatorPresenter::~CDXRAllocatorPresenter()
{
- if (m_pSRCB) {
- // nasty, but we have to let it know about our death somehow
- ((CSubRenderCallback*)(ISubRenderCallback*)m_pSRCB)->SetDXRAP(NULL);
- }
-
- // the order is important here
- m_pSubPicQueue = NULL;
- m_pAllocator = NULL;
- m_pDXR = NULL;
+ if (m_pSRCB) {
+ // nasty, but we have to let it know about our death somehow
+ ((CSubRenderCallback*)(ISubRenderCallback*)m_pSRCB)->SetDXRAP(NULL);
+ }
+
+ // the order is important here
+ m_pSubPicQueue = NULL;
+ m_pAllocator = NULL;
+ m_pDXR = NULL;
}
STDMETHODIMP CDXRAllocatorPresenter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- /*
- if (riid == __uuidof(IVideoWindow))
- return GetInterface((IVideoWindow*)this, ppv);
- if (riid == __uuidof(IBasicVideo))
- return GetInterface((IBasicVideo*)this, ppv);
- if (riid == __uuidof(IBasicVideo2))
- return GetInterface((IBasicVideo2*)this, ppv);
- */
- /*
- if (riid == __uuidof(IVMRWindowlessControl))
- return GetInterface((IVMRWindowlessControl*)this, ppv);
- */
-
- if (riid != IID_IUnknown && m_pDXR) {
- if (SUCCEEDED(m_pDXR->QueryInterface(riid, ppv))) {
- return S_OK;
- }
- }
-
- return __super::NonDelegatingQueryInterface(riid, ppv);
+ /*
+ if (riid == __uuidof(IVideoWindow))
+ return GetInterface((IVideoWindow*)this, ppv);
+ if (riid == __uuidof(IBasicVideo))
+ return GetInterface((IBasicVideo*)this, ppv);
+ if (riid == __uuidof(IBasicVideo2))
+ return GetInterface((IBasicVideo2*)this, ppv);
+ */
+ /*
+ if (riid == __uuidof(IVMRWindowlessControl))
+ return GetInterface((IVMRWindowlessControl*)this, ppv);
+ */
+
+ if (riid != IID_IUnknown && m_pDXR) {
+ if (SUCCEEDED(m_pDXR->QueryInterface(riid, ppv))) {
+ return S_OK;
+ }
+ }
+
+ return __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CDXRAllocatorPresenter::SetDevice(IDirect3DDevice9* pD3DDev)
{
- CheckPointer(pD3DDev, E_POINTER);
-
- CSize size;
- switch (GetRenderersSettings().nSPCMaxRes) {
- case 0:
- default:
- size = m_ScreenSize;
- break;
- case 1:
- size.SetSize(1024, 768);
- break;
- case 2:
- size.SetSize(800, 600);
- break;
- case 3:
- size.SetSize(640, 480);
- break;
- case 4:
- size.SetSize(512, 384);
- break;
- case 5:
- size.SetSize(384, 288);
- break;
- case 6:
- size.SetSize(2560, 1600);
- break;
- case 7:
- size.SetSize(1920, 1080);
- break;
- case 8:
- size.SetSize(1320, 900);
- break;
- case 9:
- size.SetSize(1280, 720);
- break;
- }
-
- if (m_pAllocator) {
- m_pAllocator->ChangeDevice(pD3DDev);
- } else {
- m_pAllocator = DNew CDX9SubPicAllocator(pD3DDev, size, GetRenderersSettings().fSPCPow2Tex, true);
- if (!m_pAllocator) {
- return E_FAIL;
- }
- }
-
- HRESULT hr = S_OK;
-
- m_pSubPicQueue = GetRenderersSettings().nSPCSize > 0
- ? (ISubPicQueue*)DNew CSubPicQueue(GetRenderersSettings().nSPCSize, !GetRenderersSettings().fSPCAllowAnimationWhenBuffering, m_pAllocator, &hr)
- : (ISubPicQueue*)DNew CSubPicQueueNoThread(m_pAllocator, &hr);
- if (!m_pSubPicQueue || FAILED(hr)) {
- return E_FAIL;
- }
-
- if (m_SubPicProvider) {
- m_pSubPicQueue->SetSubPicProvider(m_SubPicProvider);
- }
-
- return S_OK;
+ CheckPointer(pD3DDev, E_POINTER);
+
+ CSize size;
+ switch (GetRenderersSettings().nSPCMaxRes) {
+ case 0:
+ default:
+ size = m_ScreenSize;
+ break;
+ case 1:
+ size.SetSize(1024, 768);
+ break;
+ case 2:
+ size.SetSize(800, 600);
+ break;
+ case 3:
+ size.SetSize(640, 480);
+ break;
+ case 4:
+ size.SetSize(512, 384);
+ break;
+ case 5:
+ size.SetSize(384, 288);
+ break;
+ case 6:
+ size.SetSize(2560, 1600);
+ break;
+ case 7:
+ size.SetSize(1920, 1080);
+ break;
+ case 8:
+ size.SetSize(1320, 900);
+ break;
+ case 9:
+ size.SetSize(1280, 720);
+ break;
+ }
+
+ if (m_pAllocator) {
+ m_pAllocator->ChangeDevice(pD3DDev);
+ } else {
+ m_pAllocator = DNew CDX9SubPicAllocator(pD3DDev, size, GetRenderersSettings().fSPCPow2Tex, true);
+ if (!m_pAllocator) {
+ return E_FAIL;
+ }
+ }
+
+ HRESULT hr = S_OK;
+
+ m_pSubPicQueue = GetRenderersSettings().nSPCSize > 0
+ ? (ISubPicQueue*)DNew CSubPicQueue(GetRenderersSettings().nSPCSize, !GetRenderersSettings().fSPCAllowAnimationWhenBuffering, m_pAllocator, &hr)
+ : (ISubPicQueue*)DNew CSubPicQueueNoThread(m_pAllocator, &hr);
+ if (!m_pSubPicQueue || FAILED(hr)) {
+ return E_FAIL;
+ }
+
+ if (m_SubPicProvider) {
+ m_pSubPicQueue->SetSubPicProvider(m_SubPicProvider);
+ }
+
+ return S_OK;
}
HRESULT CDXRAllocatorPresenter::Render(
- REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, REFERENCE_TIME atpf,
- int left, int top, int right, int bottom, int width, int height)
+ REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, REFERENCE_TIME atpf,
+ int left, int top, int right, int bottom, int width, int height)
{
- __super::SetPosition(CRect(0, 0, width, height), CRect(left, top, right, bottom)); // needed? should be already set by the player
- SetTime(rtStart);
- if (atpf > 0 && m_pSubPicQueue) {
- m_pSubPicQueue->SetFPS(10000000.0 / atpf);
- }
- AlphaBltSubPic(CSize(width, height));
- return S_OK;
+ __super::SetPosition(CRect(0, 0, width, height), CRect(left, top, right, bottom)); // needed? should be already set by the player
+ SetTime(rtStart);
+ if (atpf > 0 && m_pSubPicQueue) {
+ m_pSubPicQueue->SetFPS(10000000.0 / atpf);
+ }
+ AlphaBltSubPic(CSize(width, height));
+ return S_OK;
}
// ISubPicAllocatorPresenter
STDMETHODIMP CDXRAllocatorPresenter::CreateRenderer(IUnknown** ppRenderer)
{
- CheckPointer(ppRenderer, E_POINTER);
-
- if (m_pDXR) {
- return E_UNEXPECTED;
- }
- m_pDXR.CoCreateInstance(CLSID_DXR, GetOwner());
- if (!m_pDXR) {
- return E_FAIL;
- }
-
- CComQIPtr<ISubRender> pSR = m_pDXR;
- if (!pSR) {
- m_pDXR = NULL;
- return E_FAIL;
- }
-
- m_pSRCB = DNew CSubRenderCallback(this);
- if (FAILED(pSR->SetCallback(m_pSRCB))) {
- m_pDXR = NULL;
- return E_FAIL;
- }
-
- (*ppRenderer = this)->AddRef();
-
- MONITORINFO mi;
- mi.cbSize = sizeof(MONITORINFO);
- if (GetMonitorInfo(MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST), &mi)) {
- m_ScreenSize.SetSize(mi.rcMonitor.right-mi.rcMonitor.left, mi.rcMonitor.bottom-mi.rcMonitor.top);
- }
-
- return S_OK;
+ CheckPointer(ppRenderer, E_POINTER);
+
+ if (m_pDXR) {
+ return E_UNEXPECTED;
+ }
+ m_pDXR.CoCreateInstance(CLSID_DXR, GetOwner());
+ if (!m_pDXR) {
+ return E_FAIL;
+ }
+
+ CComQIPtr<ISubRender> pSR = m_pDXR;
+ if (!pSR) {
+ m_pDXR = NULL;
+ return E_FAIL;
+ }
+
+ m_pSRCB = DNew CSubRenderCallback(this);
+ if (FAILED(pSR->SetCallback(m_pSRCB))) {
+ m_pDXR = NULL;
+ return E_FAIL;
+ }
+
+ (*ppRenderer = this)->AddRef();
+
+ MONITORINFO mi;
+ mi.cbSize = sizeof(MONITORINFO);
+ if (GetMonitorInfo(MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST), &mi)) {
+ m_ScreenSize.SetSize(mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top);
+ }
+
+ return S_OK;
}
STDMETHODIMP_(void) CDXRAllocatorPresenter::SetPosition(RECT w, RECT v)
{
- if (CComQIPtr<IBasicVideo> pBV = m_pDXR) {
- pBV->SetDefaultSourcePosition();
- pBV->SetDestinationPosition(v.left, v.top, v.right - v.left, v.bottom - v.top);
- }
-
- if (CComQIPtr<IVideoWindow> pVW = m_pDXR) {
- pVW->SetWindowPosition(w.left, w.top, w.right - w.left, w.bottom - w.top);
- }
+ if (CComQIPtr<IBasicVideo> pBV = m_pDXR) {
+ pBV->SetDefaultSourcePosition();
+ pBV->SetDestinationPosition(v.left, v.top, v.right - v.left, v.bottom - v.top);
+ }
+
+ if (CComQIPtr<IVideoWindow> pVW = m_pDXR) {
+ pVW->SetWindowPosition(w.left, w.top, w.right - w.left, w.bottom - w.top);
+ }
}
STDMETHODIMP_(SIZE) CDXRAllocatorPresenter::GetVideoSize(bool fCorrectAR)
{
- SIZE size = {0, 0};
-
- if (!fCorrectAR) {
- if (CComQIPtr<IBasicVideo> pBV = m_pDXR) {
- pBV->GetVideoSize(&size.cx, &size.cy);
- }
- } else {
- if (CComQIPtr<IBasicVideo2> pBV2 = m_pDXR) {
- pBV2->GetPreferredAspectRatio(&size.cx, &size.cy);
- }
- }
-
- return size;
+ SIZE size = {0, 0};
+
+ if (!fCorrectAR) {
+ if (CComQIPtr<IBasicVideo> pBV = m_pDXR) {
+ pBV->GetVideoSize(&size.cx, &size.cy);
+ }
+ } else {
+ if (CComQIPtr<IBasicVideo2> pBV2 = m_pDXR) {
+ pBV2->GetPreferredAspectRatio(&size.cx, &size.cy);
+ }
+ }
+
+ return size;
}
STDMETHODIMP_(bool) CDXRAllocatorPresenter::Paint(bool fAll)
{
- return false; // TODO
+ return false; // TODO
}
STDMETHODIMP CDXRAllocatorPresenter::GetDIB(BYTE* lpDib, DWORD* size)
{
- HRESULT hr = E_NOTIMPL;
- if (CComQIPtr<IBasicVideo> pBV = m_pDXR) {
- hr = pBV->GetCurrentImage((long*)size, (long*)lpDib);
- }
- return hr;
+ HRESULT hr = E_NOTIMPL;
+ if (CComQIPtr<IBasicVideo> pBV = m_pDXR) {
+ hr = pBV->GetCurrentImage((long*)size, (long*)lpDib);
+ }
+ return hr;
}
STDMETHODIMP CDXRAllocatorPresenter::SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget)
{
- return E_NOTIMPL; // TODO
+ return E_NOTIMPL; // TODO
}
diff --git a/src/filters/renderer/VideoRenderers/DXRAllocatorPresenter.h b/src/filters/renderer/VideoRenderers/DXRAllocatorPresenter.h
index a5c177231..341429e8f 100644
--- a/src/filters/renderer/VideoRenderers/DXRAllocatorPresenter.h
+++ b/src/filters/renderer/VideoRenderers/DXRAllocatorPresenter.h
@@ -28,73 +28,73 @@
namespace DSObjects
{
- class CDXRAllocatorPresenter
- : public CSubPicAllocatorPresenterImpl
- {
- class CSubRenderCallback : public CUnknown, public ISubRenderCallback, public CCritSec
- {
- CDXRAllocatorPresenter* m_pDXRAP;
-
- public:
- CSubRenderCallback(CDXRAllocatorPresenter* pDXRAP)
- : CUnknown(_T("CSubRender"), NULL)
- , m_pDXRAP(pDXRAP) {
- }
-
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
- return
- QI(ISubRenderCallback)
- __super::NonDelegatingQueryInterface(riid, ppv);
- }
-
- void SetDXRAP(CDXRAllocatorPresenter* pDXRAP) {
- CAutoLock cAutoLock(this);
- m_pDXRAP = pDXRAP;
- }
-
- // ISubRenderCallback
-
- STDMETHODIMP SetDevice(IDirect3DDevice9* pD3DDev) {
- CAutoLock cAutoLock(this);
- return m_pDXRAP ? m_pDXRAP->SetDevice(pD3DDev) : E_UNEXPECTED;
- }
-
- STDMETHODIMP Render(REFERENCE_TIME rtStart, int left, int top, int right, int bottom, int width, int height) {
- CAutoLock cAutoLock(this);
- return m_pDXRAP ? m_pDXRAP->Render(rtStart, 0, 0, left, top, right, bottom, width, height) : E_UNEXPECTED;
- }
-
- // ISubRendererCallback2
-
- STDMETHODIMP RenderEx(REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, REFERENCE_TIME AvgTimePerFrame, int left, int top, int right, int bottom, int width, int height) {
- CAutoLock cAutoLock(this);
- return m_pDXRAP ? m_pDXRAP->Render(rtStart, rtStop, AvgTimePerFrame, left, top, right, bottom, width, height) : E_UNEXPECTED;
- }
- };
-
- CComPtr<IUnknown> m_pDXR;
- CComPtr<ISubRenderCallback> m_pSRCB;
- CSize m_ScreenSize;
-
- public:
- CDXRAllocatorPresenter(HWND hWnd, HRESULT& hr, CString &_Error);
- virtual ~CDXRAllocatorPresenter();
-
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- HRESULT SetDevice(IDirect3DDevice9* pD3DDev);
- HRESULT Render(
- REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, REFERENCE_TIME atpf,
- int left, int top, int bottom, int right, int width, int height);
-
- // ISubPicAllocatorPresenter
- STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
- STDMETHODIMP_(void) SetPosition(RECT w, RECT v);
- STDMETHODIMP_(SIZE) GetVideoSize(bool fCorrectAR);
- STDMETHODIMP_(bool) Paint(bool fAll);
- STDMETHODIMP GetDIB(BYTE* lpDib, DWORD* size);
- STDMETHODIMP SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget);
- };
+ class CDXRAllocatorPresenter
+ : public CSubPicAllocatorPresenterImpl
+ {
+ class CSubRenderCallback : public CUnknown, public ISubRenderCallback, public CCritSec
+ {
+ CDXRAllocatorPresenter* m_pDXRAP;
+
+ public:
+ CSubRenderCallback(CDXRAllocatorPresenter* pDXRAP)
+ : CUnknown(_T("CSubRender"), NULL)
+ , m_pDXRAP(pDXRAP) {
+ }
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
+ return
+ QI(ISubRenderCallback)
+ __super::NonDelegatingQueryInterface(riid, ppv);
+ }
+
+ void SetDXRAP(CDXRAllocatorPresenter* pDXRAP) {
+ CAutoLock cAutoLock(this);
+ m_pDXRAP = pDXRAP;
+ }
+
+ // ISubRenderCallback
+
+ STDMETHODIMP SetDevice(IDirect3DDevice9* pD3DDev) {
+ CAutoLock cAutoLock(this);
+ return m_pDXRAP ? m_pDXRAP->SetDevice(pD3DDev) : E_UNEXPECTED;
+ }
+
+ STDMETHODIMP Render(REFERENCE_TIME rtStart, int left, int top, int right, int bottom, int width, int height) {
+ CAutoLock cAutoLock(this);
+ return m_pDXRAP ? m_pDXRAP->Render(rtStart, 0, 0, left, top, right, bottom, width, height) : E_UNEXPECTED;
+ }
+
+ // ISubRendererCallback2
+
+ STDMETHODIMP RenderEx(REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, REFERENCE_TIME AvgTimePerFrame, int left, int top, int right, int bottom, int width, int height) {
+ CAutoLock cAutoLock(this);
+ return m_pDXRAP ? m_pDXRAP->Render(rtStart, rtStop, AvgTimePerFrame, left, top, right, bottom, width, height) : E_UNEXPECTED;
+ }
+ };
+
+ CComPtr<IUnknown> m_pDXR;
+ CComPtr<ISubRenderCallback> m_pSRCB;
+ CSize m_ScreenSize;
+
+ public:
+ CDXRAllocatorPresenter(HWND hWnd, HRESULT& hr, CString& _Error);
+ virtual ~CDXRAllocatorPresenter();
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ HRESULT SetDevice(IDirect3DDevice9* pD3DDev);
+ HRESULT Render(
+ REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, REFERENCE_TIME atpf,
+ int left, int top, int bottom, int right, int width, int height);
+
+ // ISubPicAllocatorPresenter
+ STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
+ STDMETHODIMP_(void) SetPosition(RECT w, RECT v);
+ STDMETHODIMP_(SIZE) GetVideoSize(bool fCorrectAR);
+ STDMETHODIMP_(bool) Paint(bool fAll);
+ STDMETHODIMP GetDIB(BYTE* lpDib, DWORD* size);
+ STDMETHODIMP SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget);
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/Dither.cpp b/src/filters/renderer/VideoRenderers/Dither.cpp
index f896bccca..b55330016 100644
--- a/src/filters/renderer/VideoRenderers/Dither.cpp
+++ b/src/filters/renderer/VideoRenderers/Dither.cpp
@@ -25,68 +25,68 @@
// Dither matrix in 16-bit floating point format
const unsigned short DITHER_MATRIX[DITHER_MATRIX_SIZE][DITHER_MATRIX_SIZE] = {
- 0x2c90, 0x38f4, 0x3bba, 0x29e0, 0x35f4, 0x3230, 0x3bbc, 0x3924, 0x3a46, 0x3644, 0x39e2, 0x370c, 0x3444, 0x3b1a, 0x3140, 0x39d2,
- 0x385a, 0x3b24, 0x2c10, 0x38c6, 0x3808, 0x2780, 0x3bbe, 0x37f8, 0x350c, 0x3a6c, 0x3368, 0x3bc0, 0x3000, 0x3886, 0x31b0, 0x3554,
- 0x3a94, 0x3618, 0x3430, 0x3a34, 0x3834, 0x39fe, 0x2740, 0x3758, 0x3494, 0x3b7a, 0x2700, 0x3958, 0x3858, 0x3a24, 0x364c, 0x3bc2,
- 0x3278, 0x3a22, 0x353c, 0x39de, 0x3268, 0x3a98, 0x36fc, 0x2ed0, 0x39e0, 0x30f0, 0x381a, 0x3996, 0x35ac, 0x3af2, 0x39b8, 0x37bc,
- 0x3250, 0x39dc, 0x3800, 0x30e8, 0x3b42, 0x34d4, 0x3970, 0x3afe, 0x3020, 0x3898, 0x33e8, 0x3b34, 0x2e10, 0x3320, 0x391a, 0x26c0,
- 0x3784, 0x38de, 0x3060, 0x3b5c, 0x3600, 0x38e6, 0x3490, 0x3b2a, 0x387a, 0x365c, 0x3b3c, 0x2be0, 0x37ac, 0x33d8, 0x2680, 0x3b98,
- 0x38d6, 0x2a60, 0x3b7e, 0x391e, 0x36d0, 0x2fe0, 0x3812, 0x32a0, 0x3a84, 0x36b0, 0x3a50, 0x357c, 0x37dc, 0x3b68, 0x3594, 0x3aca,
- 0x344c, 0x3a7c, 0x3674, 0x3884, 0x2d30, 0x3a48, 0x3170, 0x398e, 0x2900, 0x3a30, 0x34bc, 0x38ea, 0x3b70, 0x3a3c, 0x3852, 0x3460,
- 0x3b04, 0x37a0, 0x351c, 0x2d40, 0x3a80, 0x394e, 0x3b84, 0x3614, 0x3900, 0x2b20, 0x396c, 0x31b8, 0x38ca, 0x3a0c, 0x3038, 0x385c,
- 0x39a2, 0x2c70, 0x3ba2, 0x3464, 0x3992, 0x36dc, 0x3bc4, 0x3580, 0x3824, 0x32d0, 0x3abc, 0x2ec0, 0x3560, 0x30f8, 0x3974, 0x3610,
- 0x3a12, 0x3110, 0x3aaa, 0x38a2, 0x35e4, 0x341c, 0x28c0, 0x3a02, 0x34a8, 0x3b60, 0x3790, 0x3aa2, 0x2c40, 0x346c, 0x373c, 0x3bc6,
- 0x32f0, 0x37e8, 0x391c, 0x3100, 0x3af6, 0x2640, 0x3868, 0x3098, 0x3b3e, 0x3944, 0x3620, 0x3870, 0x39da, 0x374c, 0x3bc8, 0x2e20,
- 0x3804, 0x3932, 0x3660, 0x3260, 0x3bca, 0x38ce, 0x3ade, 0x382e, 0x30a0, 0x389e, 0x33a0, 0x363c, 0x3b86, 0x3910, 0x3a58, 0x2820,
- 0x36a0, 0x3b28, 0x34e0, 0x3a40, 0x3768, 0x3510, 0x3a54, 0x390e, 0x36e8, 0x2ae0, 0x3bcc, 0x31a0, 0x3aa4, 0x2600, 0x38cc, 0x3400,
- 0x3ac4, 0x2800, 0x3b4a, 0x39ee, 0x2cc0, 0x3764, 0x31c8, 0x35cc, 0x3bb6, 0x39a8, 0x2f30, 0x3a1e, 0x3816, 0x3160, 0x35b0, 0x389a,
- 0x3a86, 0x3070, 0x3848, 0x2d70, 0x38ba, 0x3baa, 0x2e60, 0x3414, 0x3ae4, 0x3544, 0x3a06, 0x37fc, 0x347c, 0x36d8, 0x3b12, 0x35a4,
- 0x3248, 0x3866, 0x34f8, 0x3814, 0x33f8, 0x39c2, 0x3a8a, 0x38e2, 0x25c0, 0x3720, 0x3b26, 0x3508, 0x2980, 0x39b4, 0x3b4c, 0x33a8,
- 0x3976, 0x3534, 0x39c4, 0x3b40, 0x3604, 0x31c0, 0x397c, 0x37b0, 0x39d0, 0x3218, 0x38d8, 0x2e30, 0x3b52, 0x39bc, 0x2fa0, 0x3980,
- 0x3b9a, 0x39d4, 0x2f40, 0x3960, 0x3b64, 0x3680, 0x2f60, 0x34c8, 0x3acc, 0x3228, 0x3850, 0x395c, 0x3bce, 0x354c, 0x3840, 0x2db0,
- 0x37a4, 0x3bd0, 0x2580, 0x33c8, 0x392a, 0x3a82, 0x3530, 0x3b48, 0x2540, 0x3760, 0x3a42, 0x35dc, 0x3890, 0x3308, 0x3844, 0x3710,
- 0x3418, 0x366c, 0x3a9a, 0x3590, 0x2500, 0x3888, 0x3bd2, 0x3984, 0x3668, 0x39e4, 0x345c, 0x2d20, 0x371c, 0x3288, 0x3aae, 0x39d6,
- 0x31e0, 0x38c8, 0x36e4, 0x3ab2, 0x380c, 0x2b00, 0x389c, 0x3280, 0x392c, 0x3bd4, 0x33b8, 0x3ad6, 0x24c0, 0x3bd6, 0x3a32, 0x2c60,
- 0x3b1c, 0x38aa, 0x3238, 0x3902, 0x3ae8, 0x3528, 0x3118, 0x3818, 0x2c50, 0x3ba0, 0x38bc, 0x3ad8, 0x3a20, 0x38f0, 0x2480, 0x36b4,
- 0x3b02, 0x34b0, 0x3a00, 0x30a8, 0x3518, 0x3bd8, 0x3688, 0x3a92, 0x34b4, 0x36c0, 0x2f70, 0x3968, 0x3798, 0x3448, 0x35ec, 0x3930,
- 0x3750, 0x2a40, 0x3bda, 0x3728, 0x32e8, 0x3a4a, 0x38d2, 0x3b38, 0x33d0, 0x3738, 0x30b8, 0x3628, 0x340c, 0x37d4, 0x3bb2, 0x3428,
- 0x3934, 0x2b40, 0x3856, 0x3b0e, 0x3964, 0x31d0, 0x39b0, 0x2e80, 0x38d4, 0x3b1e, 0x3a28, 0x387e, 0x30e0, 0x39a0, 0x3ae2, 0x3208,
- 0x3a56, 0x352c, 0x3a14, 0x2d90, 0x3978, 0x3794, 0x2960, 0x35e0, 0x39c6, 0x3a88, 0x3862, 0x3b76, 0x2e40, 0x3988, 0x3128, 0x3a4c,
- 0x378c, 0x3b8e, 0x359c, 0x2ea0, 0x36ac, 0x383e, 0x3af8, 0x3404, 0x3780, 0x2a20, 0x3360, 0x3598, 0x3b90, 0x37d0, 0x2dd0, 0x3880,
- 0x3358, 0x3946, 0x381c, 0x348c, 0x3b50, 0x3198, 0x3ad4, 0x3940, 0x3050, 0x3540, 0x2440, 0x39cc, 0x3770, 0x3b0a, 0x35d8, 0x386c,
- 0x2f00, 0x3380, 0x3a5a, 0x3948, 0x3ba4, 0x2400, 0x35a0, 0x393e, 0x3ba6, 0x39ea, 0x3838, 0x3ab0, 0x27c0, 0x3a38, 0x3538, 0x3bb4,
- 0x2380, 0x3b62, 0x30d8, 0x3a62, 0x360c, 0x388c, 0x342c, 0x37e0, 0x3bdc, 0x38f2, 0x3ad0, 0x3488, 0x3168, 0x38da, 0x2300, 0x39ca,
- 0x3aee, 0x3630, 0x387c, 0x31a8, 0x34e4, 0x38b8, 0x3a3e, 0x2dc0, 0x3640, 0x3130, 0x34ec, 0x3972, 0x36ec, 0x3318, 0x3950, 0x3714,
- 0x3914, 0x356c, 0x38b6, 0x376c, 0x2280, 0x3b9c, 0x39c8, 0x2d50, 0x35e8, 0x32c0, 0x3704, 0x388a, 0x3a64, 0x3558, 0x3bde, 0x3440,
- 0x3724, 0x3982, 0x28e0, 0x3ada, 0x375c, 0x3b30, 0x3300, 0x384a, 0x3a74, 0x38e8, 0x3b66, 0x2ee0, 0x385e, 0x3b46, 0x2f90, 0x3ab8,
- 0x3178, 0x3a52, 0x2e00, 0x3b08, 0x3918, 0x3150, 0x3678, 0x3aa6, 0x3922, 0x3b14, 0x2fd0, 0x3b8a, 0x2ce0, 0x39a4, 0x379c, 0x2fb0,
- 0x3b5a, 0x3240, 0x3a2e, 0x3390, 0x3916, 0x2e90, 0x36c4, 0x3be0, 0x349c, 0x2200, 0x3694, 0x39b2, 0x3478, 0x39f0, 0x35c4, 0x3828,
- 0x3be2, 0x36d4, 0x3994, 0x3548, 0x3328, 0x3a04, 0x3854, 0x3498, 0x28a0, 0x3810, 0x39fc, 0x3520, 0x3846, 0x32d8, 0x3ab4, 0x393c,
- 0x3864, 0x35b4, 0x380e, 0x3be4, 0x3570, 0x3a96, 0x39ac, 0x3090, 0x3962, 0x37c0, 0x3a9e, 0x3120, 0x3be6, 0x2a00, 0x38f6, 0x3410,
- 0x2180, 0x386e, 0x3088, 0x3b82, 0x37a8, 0x3ae6, 0x2f10, 0x3be8, 0x399a, 0x3634, 0x31e8, 0x3912, 0x3b06, 0x36f0, 0x2c30, 0x3504,
- 0x3a76, 0x2aa0, 0x39e8, 0x3040, 0x3878, 0x2880, 0x383a, 0x35f8, 0x3aec, 0x32a8, 0x3936, 0x3550, 0x3892, 0x3740, 0x3aea, 0x398c,
- 0x3a72, 0x34c4, 0x3a1c, 0x38ac, 0x2860, 0x3584, 0x38fa, 0x372c, 0x3388, 0x3a3a, 0x3b9e, 0x2100, 0x3420, 0x395a, 0x3bae, 0x37d8,
- 0x3398, 0x3b6c, 0x3734, 0x34d0, 0x39c0, 0x3b78, 0x3474, 0x3a2c, 0x2b80, 0x3830, 0x3b56, 0x2cb0, 0x3a78, 0x33b0, 0x3018, 0x3650,
- 0x30d0, 0x3b20, 0x3690, 0x3350, 0x39ae, 0x3a90, 0x3148, 0x3b44, 0x2cd0, 0x38a0, 0x355c, 0x382a, 0x3a8e, 0x35b8, 0x3190, 0x39ec,
- 0x38c4, 0x3068, 0x3938, 0x3b2e, 0x32c8, 0x3748, 0x3008, 0x3894, 0x3bb8, 0x3438, 0x36c8, 0x3904, 0x35fc, 0x396e, 0x3bac, 0x38a6,
- 0x397a, 0x37ec, 0x2ca0, 0x3bea, 0x3754, 0x34a4, 0x3836, 0x3956, 0x362c, 0x3b00, 0x30c0, 0x39a6, 0x2fc0, 0x38ae, 0x3abe, 0x2080,
- 0x3684, 0x3a70, 0x3568, 0x2000, 0x38c2, 0x3af0, 0x3998, 0x368c, 0x30b0, 0x39ba, 0x3aa8, 0x3200, 0x3b16, 0x2d80, 0x377c, 0x3480,
- 0x3b6e, 0x3270, 0x39fa, 0x386a, 0x2ff0, 0x3b10, 0x1f00, 0x3a44, 0x343c, 0x3802, 0x3a66, 0x34b8, 0x3bec, 0x3708, 0x3340, 0x3882,
- 0x3bee, 0x3298, 0x3806, 0x3a08, 0x3638, 0x2d00, 0x34ac, 0x3a60, 0x38ee, 0x35c8, 0x29c0, 0x380a, 0x34f0, 0x38f8, 0x3aac, 0x1e00,
- 0x3564, 0x38fe, 0x3468, 0x3ace, 0x35d0, 0x394a, 0x37b4, 0x31f8, 0x3bf0, 0x2bc0, 0x38d0, 0x36b8, 0x2940, 0x3926, 0x3b32, 0x35a8,
- 0x2d60, 0x38e0, 0x3b58, 0x3078, 0x3a9c, 0x37e4, 0x3bf2, 0x2e50, 0x33f0, 0x3b72, 0x38b4, 0x39e6, 0x3bf4, 0x3290, 0x3670, 0x3a1a,
- 0x3842, 0x3a68, 0x2920, 0x37c4, 0x32b8, 0x3b88, 0x34c0, 0x396a, 0x3664, 0x39b6, 0x3330, 0x3b5e, 0x39ce, 0x3484, 0x3080, 0x39aa,
- 0x3a4e, 0x3700, 0x34e8, 0x395e, 0x3310, 0x3908, 0x3588, 0x384e, 0x3ac6, 0x3730, 0x3220, 0x3574, 0x2de0, 0x37f0, 0x399c, 0x2ef0,
- 0x3188, 0x369c, 0x3bf6, 0x390a, 0x39f2, 0x2b60, 0x3872, 0x3aa0, 0x2df0, 0x3b0c, 0x37cc, 0x2da0, 0x382c, 0x3ae0, 0x38b0, 0x3788,
- 0x33c0, 0x3afa, 0x2ba0, 0x3826, 0x3b6a, 0x1d00, 0x39f8, 0x3108, 0x3920, 0x1c00, 0x3a26, 0x3b22, 0x38ec, 0x3ac2, 0x3458, 0x3b7c,
- 0x3a8c, 0x38a8, 0x34d8, 0x3048, 0x3654, 0x3adc, 0x3138, 0x3744, 0x3450, 0x38be, 0x34f4, 0x3a10, 0x3210, 0x35bc, 0x2840, 0x3b92,
- 0x3058, 0x3986, 0x3698, 0x39d8, 0x3434, 0x36f8, 0x3b18, 0x3524, 0x3a7a, 0x35d4, 0x3822, 0x3408, 0x36bc, 0x2ac0, 0x3896, 0x3624,
- 0x1a00, 0x3378, 0x3a16, 0x3b3a, 0x381e, 0x3338, 0x3906, 0x39f6, 0x3bf8, 0x3158, 0x3ad2, 0x36e0, 0x3bfa, 0x392e, 0x3a5c, 0x3648,
- 0x38dc, 0x34cc, 0x3bfc, 0x30c8, 0x3ab6, 0x3942, 0x32b0, 0x38a4, 0x2d10, 0x3b96, 0x394c, 0x2f80, 0x3bfe, 0x3966, 0x3258, 0x39be,
- 0x3bb0, 0x3928, 0x361c, 0x2c00, 0x3990, 0x3b8c, 0x3578, 0x2a80, 0x36cc, 0x3952, 0x1800, 0x388e, 0x33e0, 0x2f20, 0x384c, 0x31d8,
- 0x3a18, 0x1400, 0x3876, 0x358c, 0x383c, 0x2c20, 0x3b80, 0x3774, 0x3a36, 0x3470, 0x31f0, 0x3a0a, 0x3832, 0x3514, 0x3a6a, 0x37f4,
- 0x367c, 0x3028, 0x3ac8, 0x37b8, 0x34a0, 0x2f50, 0x3a5e, 0x3874, 0x3b36, 0x34fc, 0x3a6e, 0x35f0, 0x399e, 0x3aba, 0x3500, 0x3b74,
- 0x37c8, 0x3ac0, 0x398a, 0x3010, 0x3a7e, 0x3658, 0x38e4, 0x3030, 0x3608, 0x3860, 0x3af4, 0x3718, 0x29a0, 0x3b2c, 0x2eb0, 0x3424,
- 0x3a0e, 0x3820, 0x32f8, 0x3954, 0x3afc, 0x38c0, 0x36a4, 0x3370, 0x2e70, 0x38b2, 0x3180, 0x3ba8, 0x2c80, 0x3778, 0x390c, 0x2cf0,
- 0x35c0, 0x32e0, 0x36f4, 0x3b94, 0x3454, 0x39f4, 0x3348, 0x397e, 0x3b4e, 0x0000, 0x38fc, 0x34dc, 0x3a2a, 0x36a8, 0x393a, 0x3b54,
+ 0x2c90, 0x38f4, 0x3bba, 0x29e0, 0x35f4, 0x3230, 0x3bbc, 0x3924, 0x3a46, 0x3644, 0x39e2, 0x370c, 0x3444, 0x3b1a, 0x3140, 0x39d2,
+ 0x385a, 0x3b24, 0x2c10, 0x38c6, 0x3808, 0x2780, 0x3bbe, 0x37f8, 0x350c, 0x3a6c, 0x3368, 0x3bc0, 0x3000, 0x3886, 0x31b0, 0x3554,
+ 0x3a94, 0x3618, 0x3430, 0x3a34, 0x3834, 0x39fe, 0x2740, 0x3758, 0x3494, 0x3b7a, 0x2700, 0x3958, 0x3858, 0x3a24, 0x364c, 0x3bc2,
+ 0x3278, 0x3a22, 0x353c, 0x39de, 0x3268, 0x3a98, 0x36fc, 0x2ed0, 0x39e0, 0x30f0, 0x381a, 0x3996, 0x35ac, 0x3af2, 0x39b8, 0x37bc,
+ 0x3250, 0x39dc, 0x3800, 0x30e8, 0x3b42, 0x34d4, 0x3970, 0x3afe, 0x3020, 0x3898, 0x33e8, 0x3b34, 0x2e10, 0x3320, 0x391a, 0x26c0,
+ 0x3784, 0x38de, 0x3060, 0x3b5c, 0x3600, 0x38e6, 0x3490, 0x3b2a, 0x387a, 0x365c, 0x3b3c, 0x2be0, 0x37ac, 0x33d8, 0x2680, 0x3b98,
+ 0x38d6, 0x2a60, 0x3b7e, 0x391e, 0x36d0, 0x2fe0, 0x3812, 0x32a0, 0x3a84, 0x36b0, 0x3a50, 0x357c, 0x37dc, 0x3b68, 0x3594, 0x3aca,
+ 0x344c, 0x3a7c, 0x3674, 0x3884, 0x2d30, 0x3a48, 0x3170, 0x398e, 0x2900, 0x3a30, 0x34bc, 0x38ea, 0x3b70, 0x3a3c, 0x3852, 0x3460,
+ 0x3b04, 0x37a0, 0x351c, 0x2d40, 0x3a80, 0x394e, 0x3b84, 0x3614, 0x3900, 0x2b20, 0x396c, 0x31b8, 0x38ca, 0x3a0c, 0x3038, 0x385c,
+ 0x39a2, 0x2c70, 0x3ba2, 0x3464, 0x3992, 0x36dc, 0x3bc4, 0x3580, 0x3824, 0x32d0, 0x3abc, 0x2ec0, 0x3560, 0x30f8, 0x3974, 0x3610,
+ 0x3a12, 0x3110, 0x3aaa, 0x38a2, 0x35e4, 0x341c, 0x28c0, 0x3a02, 0x34a8, 0x3b60, 0x3790, 0x3aa2, 0x2c40, 0x346c, 0x373c, 0x3bc6,
+ 0x32f0, 0x37e8, 0x391c, 0x3100, 0x3af6, 0x2640, 0x3868, 0x3098, 0x3b3e, 0x3944, 0x3620, 0x3870, 0x39da, 0x374c, 0x3bc8, 0x2e20,
+ 0x3804, 0x3932, 0x3660, 0x3260, 0x3bca, 0x38ce, 0x3ade, 0x382e, 0x30a0, 0x389e, 0x33a0, 0x363c, 0x3b86, 0x3910, 0x3a58, 0x2820,
+ 0x36a0, 0x3b28, 0x34e0, 0x3a40, 0x3768, 0x3510, 0x3a54, 0x390e, 0x36e8, 0x2ae0, 0x3bcc, 0x31a0, 0x3aa4, 0x2600, 0x38cc, 0x3400,
+ 0x3ac4, 0x2800, 0x3b4a, 0x39ee, 0x2cc0, 0x3764, 0x31c8, 0x35cc, 0x3bb6, 0x39a8, 0x2f30, 0x3a1e, 0x3816, 0x3160, 0x35b0, 0x389a,
+ 0x3a86, 0x3070, 0x3848, 0x2d70, 0x38ba, 0x3baa, 0x2e60, 0x3414, 0x3ae4, 0x3544, 0x3a06, 0x37fc, 0x347c, 0x36d8, 0x3b12, 0x35a4,
+ 0x3248, 0x3866, 0x34f8, 0x3814, 0x33f8, 0x39c2, 0x3a8a, 0x38e2, 0x25c0, 0x3720, 0x3b26, 0x3508, 0x2980, 0x39b4, 0x3b4c, 0x33a8,
+ 0x3976, 0x3534, 0x39c4, 0x3b40, 0x3604, 0x31c0, 0x397c, 0x37b0, 0x39d0, 0x3218, 0x38d8, 0x2e30, 0x3b52, 0x39bc, 0x2fa0, 0x3980,
+ 0x3b9a, 0x39d4, 0x2f40, 0x3960, 0x3b64, 0x3680, 0x2f60, 0x34c8, 0x3acc, 0x3228, 0x3850, 0x395c, 0x3bce, 0x354c, 0x3840, 0x2db0,
+ 0x37a4, 0x3bd0, 0x2580, 0x33c8, 0x392a, 0x3a82, 0x3530, 0x3b48, 0x2540, 0x3760, 0x3a42, 0x35dc, 0x3890, 0x3308, 0x3844, 0x3710,
+ 0x3418, 0x366c, 0x3a9a, 0x3590, 0x2500, 0x3888, 0x3bd2, 0x3984, 0x3668, 0x39e4, 0x345c, 0x2d20, 0x371c, 0x3288, 0x3aae, 0x39d6,
+ 0x31e0, 0x38c8, 0x36e4, 0x3ab2, 0x380c, 0x2b00, 0x389c, 0x3280, 0x392c, 0x3bd4, 0x33b8, 0x3ad6, 0x24c0, 0x3bd6, 0x3a32, 0x2c60,
+ 0x3b1c, 0x38aa, 0x3238, 0x3902, 0x3ae8, 0x3528, 0x3118, 0x3818, 0x2c50, 0x3ba0, 0x38bc, 0x3ad8, 0x3a20, 0x38f0, 0x2480, 0x36b4,
+ 0x3b02, 0x34b0, 0x3a00, 0x30a8, 0x3518, 0x3bd8, 0x3688, 0x3a92, 0x34b4, 0x36c0, 0x2f70, 0x3968, 0x3798, 0x3448, 0x35ec, 0x3930,
+ 0x3750, 0x2a40, 0x3bda, 0x3728, 0x32e8, 0x3a4a, 0x38d2, 0x3b38, 0x33d0, 0x3738, 0x30b8, 0x3628, 0x340c, 0x37d4, 0x3bb2, 0x3428,
+ 0x3934, 0x2b40, 0x3856, 0x3b0e, 0x3964, 0x31d0, 0x39b0, 0x2e80, 0x38d4, 0x3b1e, 0x3a28, 0x387e, 0x30e0, 0x39a0, 0x3ae2, 0x3208,
+ 0x3a56, 0x352c, 0x3a14, 0x2d90, 0x3978, 0x3794, 0x2960, 0x35e0, 0x39c6, 0x3a88, 0x3862, 0x3b76, 0x2e40, 0x3988, 0x3128, 0x3a4c,
+ 0x378c, 0x3b8e, 0x359c, 0x2ea0, 0x36ac, 0x383e, 0x3af8, 0x3404, 0x3780, 0x2a20, 0x3360, 0x3598, 0x3b90, 0x37d0, 0x2dd0, 0x3880,
+ 0x3358, 0x3946, 0x381c, 0x348c, 0x3b50, 0x3198, 0x3ad4, 0x3940, 0x3050, 0x3540, 0x2440, 0x39cc, 0x3770, 0x3b0a, 0x35d8, 0x386c,
+ 0x2f00, 0x3380, 0x3a5a, 0x3948, 0x3ba4, 0x2400, 0x35a0, 0x393e, 0x3ba6, 0x39ea, 0x3838, 0x3ab0, 0x27c0, 0x3a38, 0x3538, 0x3bb4,
+ 0x2380, 0x3b62, 0x30d8, 0x3a62, 0x360c, 0x388c, 0x342c, 0x37e0, 0x3bdc, 0x38f2, 0x3ad0, 0x3488, 0x3168, 0x38da, 0x2300, 0x39ca,
+ 0x3aee, 0x3630, 0x387c, 0x31a8, 0x34e4, 0x38b8, 0x3a3e, 0x2dc0, 0x3640, 0x3130, 0x34ec, 0x3972, 0x36ec, 0x3318, 0x3950, 0x3714,
+ 0x3914, 0x356c, 0x38b6, 0x376c, 0x2280, 0x3b9c, 0x39c8, 0x2d50, 0x35e8, 0x32c0, 0x3704, 0x388a, 0x3a64, 0x3558, 0x3bde, 0x3440,
+ 0x3724, 0x3982, 0x28e0, 0x3ada, 0x375c, 0x3b30, 0x3300, 0x384a, 0x3a74, 0x38e8, 0x3b66, 0x2ee0, 0x385e, 0x3b46, 0x2f90, 0x3ab8,
+ 0x3178, 0x3a52, 0x2e00, 0x3b08, 0x3918, 0x3150, 0x3678, 0x3aa6, 0x3922, 0x3b14, 0x2fd0, 0x3b8a, 0x2ce0, 0x39a4, 0x379c, 0x2fb0,
+ 0x3b5a, 0x3240, 0x3a2e, 0x3390, 0x3916, 0x2e90, 0x36c4, 0x3be0, 0x349c, 0x2200, 0x3694, 0x39b2, 0x3478, 0x39f0, 0x35c4, 0x3828,
+ 0x3be2, 0x36d4, 0x3994, 0x3548, 0x3328, 0x3a04, 0x3854, 0x3498, 0x28a0, 0x3810, 0x39fc, 0x3520, 0x3846, 0x32d8, 0x3ab4, 0x393c,
+ 0x3864, 0x35b4, 0x380e, 0x3be4, 0x3570, 0x3a96, 0x39ac, 0x3090, 0x3962, 0x37c0, 0x3a9e, 0x3120, 0x3be6, 0x2a00, 0x38f6, 0x3410,
+ 0x2180, 0x386e, 0x3088, 0x3b82, 0x37a8, 0x3ae6, 0x2f10, 0x3be8, 0x399a, 0x3634, 0x31e8, 0x3912, 0x3b06, 0x36f0, 0x2c30, 0x3504,
+ 0x3a76, 0x2aa0, 0x39e8, 0x3040, 0x3878, 0x2880, 0x383a, 0x35f8, 0x3aec, 0x32a8, 0x3936, 0x3550, 0x3892, 0x3740, 0x3aea, 0x398c,
+ 0x3a72, 0x34c4, 0x3a1c, 0x38ac, 0x2860, 0x3584, 0x38fa, 0x372c, 0x3388, 0x3a3a, 0x3b9e, 0x2100, 0x3420, 0x395a, 0x3bae, 0x37d8,
+ 0x3398, 0x3b6c, 0x3734, 0x34d0, 0x39c0, 0x3b78, 0x3474, 0x3a2c, 0x2b80, 0x3830, 0x3b56, 0x2cb0, 0x3a78, 0x33b0, 0x3018, 0x3650,
+ 0x30d0, 0x3b20, 0x3690, 0x3350, 0x39ae, 0x3a90, 0x3148, 0x3b44, 0x2cd0, 0x38a0, 0x355c, 0x382a, 0x3a8e, 0x35b8, 0x3190, 0x39ec,
+ 0x38c4, 0x3068, 0x3938, 0x3b2e, 0x32c8, 0x3748, 0x3008, 0x3894, 0x3bb8, 0x3438, 0x36c8, 0x3904, 0x35fc, 0x396e, 0x3bac, 0x38a6,
+ 0x397a, 0x37ec, 0x2ca0, 0x3bea, 0x3754, 0x34a4, 0x3836, 0x3956, 0x362c, 0x3b00, 0x30c0, 0x39a6, 0x2fc0, 0x38ae, 0x3abe, 0x2080,
+ 0x3684, 0x3a70, 0x3568, 0x2000, 0x38c2, 0x3af0, 0x3998, 0x368c, 0x30b0, 0x39ba, 0x3aa8, 0x3200, 0x3b16, 0x2d80, 0x377c, 0x3480,
+ 0x3b6e, 0x3270, 0x39fa, 0x386a, 0x2ff0, 0x3b10, 0x1f00, 0x3a44, 0x343c, 0x3802, 0x3a66, 0x34b8, 0x3bec, 0x3708, 0x3340, 0x3882,
+ 0x3bee, 0x3298, 0x3806, 0x3a08, 0x3638, 0x2d00, 0x34ac, 0x3a60, 0x38ee, 0x35c8, 0x29c0, 0x380a, 0x34f0, 0x38f8, 0x3aac, 0x1e00,
+ 0x3564, 0x38fe, 0x3468, 0x3ace, 0x35d0, 0x394a, 0x37b4, 0x31f8, 0x3bf0, 0x2bc0, 0x38d0, 0x36b8, 0x2940, 0x3926, 0x3b32, 0x35a8,
+ 0x2d60, 0x38e0, 0x3b58, 0x3078, 0x3a9c, 0x37e4, 0x3bf2, 0x2e50, 0x33f0, 0x3b72, 0x38b4, 0x39e6, 0x3bf4, 0x3290, 0x3670, 0x3a1a,
+ 0x3842, 0x3a68, 0x2920, 0x37c4, 0x32b8, 0x3b88, 0x34c0, 0x396a, 0x3664, 0x39b6, 0x3330, 0x3b5e, 0x39ce, 0x3484, 0x3080, 0x39aa,
+ 0x3a4e, 0x3700, 0x34e8, 0x395e, 0x3310, 0x3908, 0x3588, 0x384e, 0x3ac6, 0x3730, 0x3220, 0x3574, 0x2de0, 0x37f0, 0x399c, 0x2ef0,
+ 0x3188, 0x369c, 0x3bf6, 0x390a, 0x39f2, 0x2b60, 0x3872, 0x3aa0, 0x2df0, 0x3b0c, 0x37cc, 0x2da0, 0x382c, 0x3ae0, 0x38b0, 0x3788,
+ 0x33c0, 0x3afa, 0x2ba0, 0x3826, 0x3b6a, 0x1d00, 0x39f8, 0x3108, 0x3920, 0x1c00, 0x3a26, 0x3b22, 0x38ec, 0x3ac2, 0x3458, 0x3b7c,
+ 0x3a8c, 0x38a8, 0x34d8, 0x3048, 0x3654, 0x3adc, 0x3138, 0x3744, 0x3450, 0x38be, 0x34f4, 0x3a10, 0x3210, 0x35bc, 0x2840, 0x3b92,
+ 0x3058, 0x3986, 0x3698, 0x39d8, 0x3434, 0x36f8, 0x3b18, 0x3524, 0x3a7a, 0x35d4, 0x3822, 0x3408, 0x36bc, 0x2ac0, 0x3896, 0x3624,
+ 0x1a00, 0x3378, 0x3a16, 0x3b3a, 0x381e, 0x3338, 0x3906, 0x39f6, 0x3bf8, 0x3158, 0x3ad2, 0x36e0, 0x3bfa, 0x392e, 0x3a5c, 0x3648,
+ 0x38dc, 0x34cc, 0x3bfc, 0x30c8, 0x3ab6, 0x3942, 0x32b0, 0x38a4, 0x2d10, 0x3b96, 0x394c, 0x2f80, 0x3bfe, 0x3966, 0x3258, 0x39be,
+ 0x3bb0, 0x3928, 0x361c, 0x2c00, 0x3990, 0x3b8c, 0x3578, 0x2a80, 0x36cc, 0x3952, 0x1800, 0x388e, 0x33e0, 0x2f20, 0x384c, 0x31d8,
+ 0x3a18, 0x1400, 0x3876, 0x358c, 0x383c, 0x2c20, 0x3b80, 0x3774, 0x3a36, 0x3470, 0x31f0, 0x3a0a, 0x3832, 0x3514, 0x3a6a, 0x37f4,
+ 0x367c, 0x3028, 0x3ac8, 0x37b8, 0x34a0, 0x2f50, 0x3a5e, 0x3874, 0x3b36, 0x34fc, 0x3a6e, 0x35f0, 0x399e, 0x3aba, 0x3500, 0x3b74,
+ 0x37c8, 0x3ac0, 0x398a, 0x3010, 0x3a7e, 0x3658, 0x38e4, 0x3030, 0x3608, 0x3860, 0x3af4, 0x3718, 0x29a0, 0x3b2c, 0x2eb0, 0x3424,
+ 0x3a0e, 0x3820, 0x32f8, 0x3954, 0x3afc, 0x38c0, 0x36a4, 0x3370, 0x2e70, 0x38b2, 0x3180, 0x3ba8, 0x2c80, 0x3778, 0x390c, 0x2cf0,
+ 0x35c0, 0x32e0, 0x36f4, 0x3b94, 0x3454, 0x39f4, 0x3348, 0x397e, 0x3b4e, 0x0000, 0x38fc, 0x34dc, 0x3a2a, 0x36a8, 0x393a, 0x3b54,
};
diff --git a/src/filters/renderer/VideoRenderers/EVRAllocatorPresenter.cpp b/src/filters/renderer/VideoRenderers/EVRAllocatorPresenter.cpp
index 2764fcb81..04ffbb083 100644
--- a/src/filters/renderer/VideoRenderers/EVRAllocatorPresenter.cpp
+++ b/src/filters/renderer/VideoRenderers/EVRAllocatorPresenter.cpp
@@ -29,15 +29,15 @@
#include "../../transform/MPCVideoDec/MPCVideoDecFilter.h"
-#if (0) // Set to 1 to activate EVR traces
-#define TRACE_EVR TRACE
+#if (0) // Set to 1 to activate EVR traces
+#define TRACE_EVR TRACE
#else
-#define TRACE_EVR __noop
+#define TRACE_EVR __noop
#endif
typedef enum {
- MSG_MIXERIN,
- MSG_MIXEROUT
+ MSG_MIXERIN,
+ MSG_MIXEROUT
} EVR_STATS_MSG;
// Guid to tag IMFSample with DirectX surface index
@@ -49,2558 +49,2558 @@ static const GUID GUID_SURFACE_INDEX = { 0x30c8e9f6, 0x415, 0x4b81, { 0xa3, 0x15
MFOffset MakeOffset(float v)
{
- MFOffset offset;
- offset.value = short(v);
- offset.fract = WORD(65536 * (v-offset.value));
- return offset;
+ MFOffset offset;
+ offset.value = short(v);
+ offset.fract = WORD(65536 * (v - offset.value));
+ return offset;
}
MFVideoArea MakeArea(float x, float y, DWORD width, DWORD height)
{
- MFVideoArea area;
- area.OffsetX = MakeOffset(x);
- area.OffsetY = MakeOffset(y);
- area.Area.cx = width;
- area.Area.cy = height;
- return area;
+ MFVideoArea area;
+ area.OffsetX = MakeOffset(x);
+ area.OffsetY = MakeOffset(y);
+ area.Area.cx = width;
+ area.Area.cy = height;
+ return area;
}
using namespace DSObjects;
-CEVRAllocatorPresenter::CEVRAllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString &_Error)
- : CDX9AllocatorPresenter(hWnd, bFullscreen, hr, true, _Error)
-{
- HMODULE hLib;
- CRenderersSettings& s = GetRenderersSettings();
-
- m_nResetToken = 0;
- m_hThread = INVALID_HANDLE_VALUE;
- m_hGetMixerThread= INVALID_HANDLE_VALUE;
- m_hEvtFlush = INVALID_HANDLE_VALUE;
- m_hEvtQuit = INVALID_HANDLE_VALUE;
- m_bEvtQuit = 0;
- m_bEvtFlush = 0;
- m_ModeratedTime = 0;
- m_ModeratedTimeLast = -1;
- m_ModeratedClockLast = -1;
-
- if (FAILED (hr)) {
- _Error += L"DX9AllocatorPresenter failed\n";
- return;
- }
-
- // Load EVR specifics DLLs
- hLib = LoadLibrary (L"dxva2.dll");
- pfDXVA2CreateDirect3DDeviceManager9 = hLib ? (PTR_DXVA2CreateDirect3DDeviceManager9) GetProcAddress (hLib, "DXVA2CreateDirect3DDeviceManager9") : NULL;
-
- // Load EVR functions
- hLib = LoadLibrary (L"evr.dll");
- pfMFCreateDXSurfaceBuffer = hLib ? (PTR_MFCreateDXSurfaceBuffer) GetProcAddress (hLib, "MFCreateDXSurfaceBuffer") : NULL;
- pfMFCreateVideoSampleFromSurface = hLib ? (PTR_MFCreateVideoSampleFromSurface) GetProcAddress (hLib, "MFCreateVideoSampleFromSurface") : NULL;
- pfMFCreateVideoMediaType = hLib ? (PTR_MFCreateVideoMediaType) GetProcAddress (hLib, "MFCreateVideoMediaType") : NULL;
-
- if (!pfDXVA2CreateDirect3DDeviceManager9 || !pfMFCreateDXSurfaceBuffer || !pfMFCreateVideoSampleFromSurface || !pfMFCreateVideoMediaType) {
- if (!pfDXVA2CreateDirect3DDeviceManager9) {
- _Error += L"Could not find DXVA2CreateDirect3DDeviceManager9 (dxva2.dll)\n";
- }
- if (!pfMFCreateDXSurfaceBuffer) {
- _Error += L"Could not find MFCreateDXSurfaceBuffer (evr.dll)\n";
- }
- if (!pfMFCreateVideoSampleFromSurface) {
- _Error += L"Could not find MFCreateVideoSampleFromSurface (evr.dll)\n";
- }
- if (!pfMFCreateVideoMediaType) {
- _Error += L"Could not find MFCreateVideoMediaType (evr.dll)\n";
- }
- hr = E_FAIL;
- return;
- }
-
- // Load mfplat fuctions
+CEVRAllocatorPresenter::CEVRAllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString& _Error)
+ : CDX9AllocatorPresenter(hWnd, bFullscreen, hr, true, _Error)
+{
+ HMODULE hLib;
+ CRenderersSettings& s = GetRenderersSettings();
+
+ m_nResetToken = 0;
+ m_hThread = INVALID_HANDLE_VALUE;
+ m_hGetMixerThread = INVALID_HANDLE_VALUE;
+ m_hEvtFlush = INVALID_HANDLE_VALUE;
+ m_hEvtQuit = INVALID_HANDLE_VALUE;
+ m_bEvtQuit = 0;
+ m_bEvtFlush = 0;
+ m_ModeratedTime = 0;
+ m_ModeratedTimeLast = -1;
+ m_ModeratedClockLast = -1;
+
+ if (FAILED(hr)) {
+ _Error += L"DX9AllocatorPresenter failed\n";
+ return;
+ }
+
+ // Load EVR specifics DLLs
+ hLib = LoadLibrary(L"dxva2.dll");
+ pfDXVA2CreateDirect3DDeviceManager9 = hLib ? (PTR_DXVA2CreateDirect3DDeviceManager9) GetProcAddress(hLib, "DXVA2CreateDirect3DDeviceManager9") : NULL;
+
+ // Load EVR functions
+ hLib = LoadLibrary(L"evr.dll");
+ pfMFCreateDXSurfaceBuffer = hLib ? (PTR_MFCreateDXSurfaceBuffer) GetProcAddress(hLib, "MFCreateDXSurfaceBuffer") : NULL;
+ pfMFCreateVideoSampleFromSurface = hLib ? (PTR_MFCreateVideoSampleFromSurface) GetProcAddress(hLib, "MFCreateVideoSampleFromSurface") : NULL;
+ pfMFCreateVideoMediaType = hLib ? (PTR_MFCreateVideoMediaType) GetProcAddress(hLib, "MFCreateVideoMediaType") : NULL;
+
+ if (!pfDXVA2CreateDirect3DDeviceManager9 || !pfMFCreateDXSurfaceBuffer || !pfMFCreateVideoSampleFromSurface || !pfMFCreateVideoMediaType) {
+ if (!pfDXVA2CreateDirect3DDeviceManager9) {
+ _Error += L"Could not find DXVA2CreateDirect3DDeviceManager9 (dxva2.dll)\n";
+ }
+ if (!pfMFCreateDXSurfaceBuffer) {
+ _Error += L"Could not find MFCreateDXSurfaceBuffer (evr.dll)\n";
+ }
+ if (!pfMFCreateVideoSampleFromSurface) {
+ _Error += L"Could not find MFCreateVideoSampleFromSurface (evr.dll)\n";
+ }
+ if (!pfMFCreateVideoMediaType) {
+ _Error += L"Could not find MFCreateVideoMediaType (evr.dll)\n";
+ }
+ hr = E_FAIL;
+ return;
+ }
+
+ // Load mfplat fuctions
#if 0
- hLib = LoadLibrary (L"mfplat.dll");
- (FARPROC &)pMFCreateMediaType = GetProcAddress(hLib, "MFCreateMediaType");
- (FARPROC &)pMFInitMediaTypeFromAMMediaType = GetProcAddress(hLib, "MFInitMediaTypeFromAMMediaType");
- (FARPROC &)pMFInitAMMediaTypeFromMFMediaType = GetProcAddress(hLib, "MFInitAMMediaTypeFromMFMediaType");
-
- if (!pMFCreateMediaType || !pMFInitMediaTypeFromAMMediaType || !pMFInitAMMediaTypeFromMFMediaType) {
- hr = E_FAIL;
- return;
- }
+ hLib = LoadLibrary(L"mfplat.dll");
+ (FARPROC&)pMFCreateMediaType = GetProcAddress(hLib, "MFCreateMediaType");
+ (FARPROC&)pMFInitMediaTypeFromAMMediaType = GetProcAddress(hLib, "MFInitMediaTypeFromAMMediaType");
+ (FARPROC&)pMFInitAMMediaTypeFromMFMediaType = GetProcAddress(hLib, "MFInitAMMediaTypeFromMFMediaType");
+
+ if (!pMFCreateMediaType || !pMFInitMediaTypeFromAMMediaType || !pMFInitAMMediaTypeFromMFMediaType) {
+ hr = E_FAIL;
+ return;
+ }
#endif
- // Load Vista specifics DLLs
- hLib = LoadLibrary (L"avrt.dll");
- pfAvSetMmThreadCharacteristicsW = hLib ? (PTR_AvSetMmThreadCharacteristicsW) GetProcAddress (hLib, "AvSetMmThreadCharacteristicsW") : NULL;
- pfAvSetMmThreadPriority = hLib ? (PTR_AvSetMmThreadPriority) GetProcAddress (hLib, "AvSetMmThreadPriority") : NULL;
- pfAvRevertMmThreadCharacteristics = hLib ? (PTR_AvRevertMmThreadCharacteristics) GetProcAddress (hLib, "AvRevertMmThreadCharacteristics") : NULL;
-
- // Init DXVA manager
- hr = pfDXVA2CreateDirect3DDeviceManager9(&m_nResetToken, &m_pD3DManager);
- if (SUCCEEDED (hr)) {
- hr = m_pD3DManager->ResetDevice(m_pD3DDev, m_nResetToken);
- if (!SUCCEEDED (hr)) {
- _Error += L"m_pD3DManager->ResetDevice failed\n";
- }
- } else {
- _Error += L"DXVA2CreateDirect3DDeviceManager9 failed\n";
- }
-
- CComPtr<IDirectXVideoDecoderService> pDecoderService;
- HANDLE hDevice;
- if (SUCCEEDED (m_pD3DManager->OpenDeviceHandle(&hDevice)) &&
- SUCCEEDED (m_pD3DManager->GetVideoService (hDevice, __uuidof(IDirectXVideoDecoderService), (void**)&pDecoderService))) {
- TRACE_EVR ("EVR: DXVA2 : device handle = 0x%08x", hDevice);
- HookDirectXVideoDecoderService (pDecoderService);
-
- m_pD3DManager->CloseDeviceHandle (hDevice);
- }
-
-
- // Bufferize frame only with 3D texture!
- if (s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D) {
- m_nNbDXSurface = max (min (s.iEvrBuffers, MAX_VIDEO_SURFACES), 4);
- } else {
- m_nNbDXSurface = 1;
- }
-
- ResetStats();
- m_nRenderState = Shutdown;
- m_fUseInternalTimer = false;
- m_LastSetOutputRange = -1;
- m_bPendingRenegotiate = false;
- m_bPendingMediaFinished = false;
- m_bWaitingSample = false;
- m_pCurrentDisplaydSample = NULL;
- m_nStepCount = 0;
- m_dwVideoAspectRatioMode = MFVideoARMode_PreservePicture;
- m_dwVideoRenderPrefs = (MFVideoRenderPrefs)0;
- m_BorderColor = RGB (0,0,0);
- m_bSignaledStarvation = false;
- m_StarvationClock = 0;
- m_pOuterEVR = NULL;
- m_LastScheduledSampleTime = -1;
- m_LastScheduledUncorrectedSampleTime = -1;
- m_MaxSampleDuration = 0;
- m_LastSampleOffset = 0;
- ZeroMemory(m_VSyncOffsetHistory, sizeof(m_VSyncOffsetHistory));
- m_VSyncOffsetHistoryPos = 0;
- m_bLastSampleOffsetValid = false;
+ // Load Vista specifics DLLs
+ hLib = LoadLibrary(L"avrt.dll");
+ pfAvSetMmThreadCharacteristicsW = hLib ? (PTR_AvSetMmThreadCharacteristicsW) GetProcAddress(hLib, "AvSetMmThreadCharacteristicsW") : NULL;
+ pfAvSetMmThreadPriority = hLib ? (PTR_AvSetMmThreadPriority) GetProcAddress(hLib, "AvSetMmThreadPriority") : NULL;
+ pfAvRevertMmThreadCharacteristics = hLib ? (PTR_AvRevertMmThreadCharacteristics) GetProcAddress(hLib, "AvRevertMmThreadCharacteristics") : NULL;
+
+ // Init DXVA manager
+ hr = pfDXVA2CreateDirect3DDeviceManager9(&m_nResetToken, &m_pD3DManager);
+ if (SUCCEEDED(hr)) {
+ hr = m_pD3DManager->ResetDevice(m_pD3DDev, m_nResetToken);
+ if (!SUCCEEDED(hr)) {
+ _Error += L"m_pD3DManager->ResetDevice failed\n";
+ }
+ } else {
+ _Error += L"DXVA2CreateDirect3DDeviceManager9 failed\n";
+ }
+
+ CComPtr<IDirectXVideoDecoderService> pDecoderService;
+ HANDLE hDevice;
+ if (SUCCEEDED(m_pD3DManager->OpenDeviceHandle(&hDevice)) &&
+ SUCCEEDED(m_pD3DManager->GetVideoService(hDevice, __uuidof(IDirectXVideoDecoderService), (void**)&pDecoderService))) {
+ TRACE_EVR("EVR: DXVA2 : device handle = 0x%08x", hDevice);
+ HookDirectXVideoDecoderService(pDecoderService);
+
+ m_pD3DManager->CloseDeviceHandle(hDevice);
+ }
+
+
+ // Bufferize frame only with 3D texture!
+ if (s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D) {
+ m_nNbDXSurface = max(min(s.iEvrBuffers, MAX_VIDEO_SURFACES), 4);
+ } else {
+ m_nNbDXSurface = 1;
+ }
+
+ ResetStats();
+ m_nRenderState = Shutdown;
+ m_fUseInternalTimer = false;
+ m_LastSetOutputRange = -1;
+ m_bPendingRenegotiate = false;
+ m_bPendingMediaFinished = false;
+ m_bWaitingSample = false;
+ m_pCurrentDisplaydSample = NULL;
+ m_nStepCount = 0;
+ m_dwVideoAspectRatioMode = MFVideoARMode_PreservePicture;
+ m_dwVideoRenderPrefs = (MFVideoRenderPrefs)0;
+ m_BorderColor = RGB(0, 0, 0);
+ m_bSignaledStarvation = false;
+ m_StarvationClock = 0;
+ m_pOuterEVR = NULL;
+ m_LastScheduledSampleTime = -1;
+ m_LastScheduledUncorrectedSampleTime = -1;
+ m_MaxSampleDuration = 0;
+ m_LastSampleOffset = 0;
+ ZeroMemory(m_VSyncOffsetHistory, sizeof(m_VSyncOffsetHistory));
+ m_VSyncOffsetHistoryPos = 0;
+ m_bLastSampleOffsetValid = false;
}
CEVRAllocatorPresenter::~CEVRAllocatorPresenter(void)
{
- StopWorkerThreads(); // If not already done...
- m_pMediaType = NULL;
- m_pClock = NULL;
+ StopWorkerThreads(); // If not already done...
+ m_pMediaType = NULL;
+ m_pClock = NULL;
- m_pD3DManager = NULL;
+ m_pD3DManager = NULL;
}
void CEVRAllocatorPresenter::ResetStats()
{
- m_pcFrames = 0;
- m_nDroppedUpdate = 0;
- m_pcFramesDrawn = 0;
- m_piAvg = 0;
- m_piDev = 0;
+ m_pcFrames = 0;
+ m_nDroppedUpdate = 0;
+ m_pcFramesDrawn = 0;
+ m_piAvg = 0;
+ m_piDev = 0;
}
HRESULT CEVRAllocatorPresenter::CheckShutdown() const
{
- if (m_nRenderState == Shutdown) {
- return MF_E_SHUTDOWN;
- } else {
- return S_OK;
- }
+ if (m_nRenderState == Shutdown) {
+ return MF_E_SHUTDOWN;
+ } else {
+ return S_OK;
+ }
}
void CEVRAllocatorPresenter::StartWorkerThreads()
{
- DWORD dwThreadId;
+ DWORD dwThreadId;
- if (m_nRenderState == Shutdown) {
- m_hEvtQuit = CreateEvent (NULL, TRUE, FALSE, NULL);
- m_hEvtFlush = CreateEvent (NULL, TRUE, FALSE, NULL);
+ if (m_nRenderState == Shutdown) {
+ m_hEvtQuit = CreateEvent(NULL, TRUE, FALSE, NULL);
+ m_hEvtFlush = CreateEvent(NULL, TRUE, FALSE, NULL);
- m_hThread = ::CreateThread(NULL, 0, PresentThread, (LPVOID)this, 0, &dwThreadId);
- SetThreadPriority(m_hThread, THREAD_PRIORITY_TIME_CRITICAL);
- m_hGetMixerThread = ::CreateThread(NULL, 0, GetMixerThreadStatic, (LPVOID)this, 0, &dwThreadId);
- SetThreadPriority(m_hGetMixerThread, THREAD_PRIORITY_HIGHEST);
+ m_hThread = ::CreateThread(NULL, 0, PresentThread, (LPVOID)this, 0, &dwThreadId);
+ SetThreadPriority(m_hThread, THREAD_PRIORITY_TIME_CRITICAL);
+ m_hGetMixerThread = ::CreateThread(NULL, 0, GetMixerThreadStatic, (LPVOID)this, 0, &dwThreadId);
+ SetThreadPriority(m_hGetMixerThread, THREAD_PRIORITY_HIGHEST);
- m_nRenderState = Stopped;
- TRACE_EVR ("EVR: Worker threads started...\n");
- }
+ m_nRenderState = Stopped;
+ TRACE_EVR("EVR: Worker threads started...\n");
+ }
}
void CEVRAllocatorPresenter::StopWorkerThreads()
{
- if (m_nRenderState != Shutdown) {
- SetEvent (m_hEvtFlush);
- m_bEvtFlush = true;
- SetEvent (m_hEvtQuit);
- m_bEvtQuit = true;
- if ((m_hThread != INVALID_HANDLE_VALUE) && (WaitForSingleObject (m_hThread, 10000) == WAIT_TIMEOUT)) {
- ASSERT (FALSE);
- TerminateThread (m_hThread, 0xDEAD);
- }
- if ((m_hGetMixerThread != INVALID_HANDLE_VALUE) && (WaitForSingleObject (m_hGetMixerThread, 10000) == WAIT_TIMEOUT)) {
- ASSERT (FALSE);
- TerminateThread (m_hGetMixerThread, 0xDEAD);
- }
-
- if (m_hThread != INVALID_HANDLE_VALUE) {
- CloseHandle (m_hThread);
- }
- if (m_hGetMixerThread != INVALID_HANDLE_VALUE) {
- CloseHandle (m_hGetMixerThread);
- }
- if (m_hEvtFlush != INVALID_HANDLE_VALUE) {
- CloseHandle (m_hEvtFlush);
- }
- if (m_hEvtQuit != INVALID_HANDLE_VALUE) {
- CloseHandle (m_hEvtQuit);
- }
-
- m_bEvtFlush = false;
- m_bEvtQuit = false;
-
-
- TRACE_EVR ("EVR: Worker threads stopped...\n");
- }
- m_nRenderState = Shutdown;
+ if (m_nRenderState != Shutdown) {
+ SetEvent(m_hEvtFlush);
+ m_bEvtFlush = true;
+ SetEvent(m_hEvtQuit);
+ m_bEvtQuit = true;
+ if ((m_hThread != INVALID_HANDLE_VALUE) && (WaitForSingleObject(m_hThread, 10000) == WAIT_TIMEOUT)) {
+ ASSERT(FALSE);
+ TerminateThread(m_hThread, 0xDEAD);
+ }
+ if ((m_hGetMixerThread != INVALID_HANDLE_VALUE) && (WaitForSingleObject(m_hGetMixerThread, 10000) == WAIT_TIMEOUT)) {
+ ASSERT(FALSE);
+ TerminateThread(m_hGetMixerThread, 0xDEAD);
+ }
+
+ if (m_hThread != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hThread);
+ }
+ if (m_hGetMixerThread != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hGetMixerThread);
+ }
+ if (m_hEvtFlush != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hEvtFlush);
+ }
+ if (m_hEvtQuit != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hEvtQuit);
+ }
+
+ m_bEvtFlush = false;
+ m_bEvtQuit = false;
+
+
+ TRACE_EVR("EVR: Worker threads stopped...\n");
+ }
+ m_nRenderState = Shutdown;
}
STDMETHODIMP CEVRAllocatorPresenter::CreateRenderer(IUnknown** ppRenderer)
{
- CheckPointer(ppRenderer, E_POINTER);
+ CheckPointer(ppRenderer, E_POINTER);
- *ppRenderer = NULL;
+ *ppRenderer = NULL;
- HRESULT hr = E_FAIL;
+ HRESULT hr = E_FAIL;
- do {
- CMacrovisionKicker* pMK = DNew CMacrovisionKicker(NAME("CMacrovisionKicker"), NULL);
- CComPtr<IUnknown> pUnk = (IUnknown*)(INonDelegatingUnknown*)pMK;
+ do {
+ CMacrovisionKicker* pMK = DNew CMacrovisionKicker(NAME("CMacrovisionKicker"), NULL);
+ CComPtr<IUnknown> pUnk = (IUnknown*)(INonDelegatingUnknown*)pMK;
- COuterEVR *pOuterEVR = DNew COuterEVR(NAME("COuterEVR"), pUnk, hr, &m_VMR9AlphaBitmap, this);
- m_pOuterEVR = pOuterEVR;
+ COuterEVR* pOuterEVR = DNew COuterEVR(NAME("COuterEVR"), pUnk, hr, &m_VMR9AlphaBitmap, this);
+ m_pOuterEVR = pOuterEVR;
- pMK->SetInner((IUnknown*)(INonDelegatingUnknown*)pOuterEVR);
- CComQIPtr<IBaseFilter> pBF = pUnk;
+ pMK->SetInner((IUnknown*)(INonDelegatingUnknown*)pOuterEVR);
+ CComQIPtr<IBaseFilter> pBF = pUnk;
- if (FAILED (hr)) {
- break;
- }
+ if (FAILED(hr)) {
+ break;
+ }
- // Set EVR custom presenter
- CComPtr<IMFVideoPresenter> pVP;
- CComPtr<IMFVideoRenderer> pMFVR;
- CComQIPtr<IMFGetService, &__uuidof(IMFGetService)> pMFGS = pBF;
- CComQIPtr<IEVRFilterConfig> pConfig = pBF;
- if (SUCCEEDED(hr)) {
- if (FAILED(pConfig->SetNumberOfStreams(3))) { // TODO - maybe need other number of input stream ...
- break;
- }
- }
+ // Set EVR custom presenter
+ CComPtr<IMFVideoPresenter> pVP;
+ CComPtr<IMFVideoRenderer> pMFVR;
+ CComQIPtr<IMFGetService, &__uuidof(IMFGetService)> pMFGS = pBF;
+ CComQIPtr<IEVRFilterConfig> pConfig = pBF;
+ if (SUCCEEDED(hr)) {
+ if (FAILED(pConfig->SetNumberOfStreams(3))) { // TODO - maybe need other number of input stream ...
+ break;
+ }
+ }
- hr = pMFGS->GetService (MR_VIDEO_RENDER_SERVICE, IID_IMFVideoRenderer, (void**)&pMFVR);
+ hr = pMFGS->GetService(MR_VIDEO_RENDER_SERVICE, IID_IMFVideoRenderer, (void**)&pMFVR);
- if (SUCCEEDED(hr)) {
- hr = QueryInterface (__uuidof(IMFVideoPresenter), (void**)&pVP);
- }
- if (SUCCEEDED(hr)) {
- hr = pMFVR->InitializeRenderer (NULL, pVP);
- }
+ if (SUCCEEDED(hr)) {
+ hr = QueryInterface(__uuidof(IMFVideoPresenter), (void**)&pVP);
+ }
+ if (SUCCEEDED(hr)) {
+ hr = pMFVR->InitializeRenderer(NULL, pVP);
+ }
#if 1
- CComPtr<IPin> pPin = GetFirstPin(pBF);
- CComQIPtr<IMemInputPin> pMemInputPin = pPin;
+ CComPtr<IPin> pPin = GetFirstPin(pBF);
+ CComQIPtr<IMemInputPin> pMemInputPin = pPin;
- // No NewSegment : no chocolate :o)
- m_fUseInternalTimer = HookNewSegmentAndReceive((IPinC*)(IPin*)pPin, (IMemInputPinC*)(IMemInputPin*)pMemInputPin);
+ // No NewSegment : no chocolate :o)
+ m_fUseInternalTimer = HookNewSegmentAndReceive((IPinC*)(IPin*)pPin, (IMemInputPinC*)(IMemInputPin*)pMemInputPin);
#else
- m_fUseInternalTimer = false;
+ m_fUseInternalTimer = false;
#endif
- if (FAILED(hr)) {
- *ppRenderer = NULL;
- } else {
- *ppRenderer = pBF.Detach();
- }
+ if (FAILED(hr)) {
+ *ppRenderer = NULL;
+ } else {
+ *ppRenderer = pBF.Detach();
+ }
- } while (0);
+ } while (0);
- return hr;
+ return hr;
}
STDMETHODIMP_(bool) CEVRAllocatorPresenter::Paint(bool fAll)
{
- return __super::Paint (fAll);
+ return __super::Paint(fAll);
}
STDMETHODIMP CEVRAllocatorPresenter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- HRESULT hr;
- if (riid == __uuidof(IMFClockStateSink)) {
- hr = GetInterface((IMFClockStateSink*)this, ppv);
- } else if (riid == __uuidof(IMFVideoPresenter)) {
- hr = GetInterface((IMFVideoPresenter*)this, ppv);
- } else if (riid == __uuidof(IMFTopologyServiceLookupClient)) {
- hr = GetInterface((IMFTopologyServiceLookupClient*)this, ppv);
- } else if (riid == __uuidof(IMFVideoDeviceID)) {
- hr = GetInterface((IMFVideoDeviceID*)this, ppv);
- } else if (riid == __uuidof(IMFGetService)) {
- hr = GetInterface((IMFGetService*)this, ppv);
- } else if (riid == __uuidof(IMFAsyncCallback)) {
- hr = GetInterface((IMFAsyncCallback*)this, ppv);
- } else if (riid == __uuidof(IMFVideoDisplayControl)) {
- hr = GetInterface((IMFVideoDisplayControl*)this, ppv);
- } else if (riid == __uuidof(IEVRTrustedVideoPlugin)) {
- hr = GetInterface((IEVRTrustedVideoPlugin*)this, ppv);
- } else if (riid == IID_IQualProp) {
- hr = GetInterface((IQualProp*)this, ppv);
- } else if (riid == __uuidof(IMFRateSupport)) {
- hr = GetInterface((IMFRateSupport*)this, ppv);
- } else if (riid == __uuidof(IDirect3DDeviceManager9))
- // hr = GetInterface((IDirect3DDeviceManager9*)this, ppv);
- {
- hr = m_pD3DManager->QueryInterface (__uuidof(IDirect3DDeviceManager9), (void**) ppv);
- } else {
- hr = __super::NonDelegatingQueryInterface(riid, ppv);
- }
-
- return hr;
+ HRESULT hr;
+ if (riid == __uuidof(IMFClockStateSink)) {
+ hr = GetInterface((IMFClockStateSink*)this, ppv);
+ } else if (riid == __uuidof(IMFVideoPresenter)) {
+ hr = GetInterface((IMFVideoPresenter*)this, ppv);
+ } else if (riid == __uuidof(IMFTopologyServiceLookupClient)) {
+ hr = GetInterface((IMFTopologyServiceLookupClient*)this, ppv);
+ } else if (riid == __uuidof(IMFVideoDeviceID)) {
+ hr = GetInterface((IMFVideoDeviceID*)this, ppv);
+ } else if (riid == __uuidof(IMFGetService)) {
+ hr = GetInterface((IMFGetService*)this, ppv);
+ } else if (riid == __uuidof(IMFAsyncCallback)) {
+ hr = GetInterface((IMFAsyncCallback*)this, ppv);
+ } else if (riid == __uuidof(IMFVideoDisplayControl)) {
+ hr = GetInterface((IMFVideoDisplayControl*)this, ppv);
+ } else if (riid == __uuidof(IEVRTrustedVideoPlugin)) {
+ hr = GetInterface((IEVRTrustedVideoPlugin*)this, ppv);
+ } else if (riid == IID_IQualProp) {
+ hr = GetInterface((IQualProp*)this, ppv);
+ } else if (riid == __uuidof(IMFRateSupport)) {
+ hr = GetInterface((IMFRateSupport*)this, ppv);
+ } else if (riid == __uuidof(IDirect3DDeviceManager9))
+ // hr = GetInterface((IDirect3DDeviceManager9*)this, ppv);
+ {
+ hr = m_pD3DManager->QueryInterface(__uuidof(IDirect3DDeviceManager9), (void**) ppv);
+ } else {
+ hr = __super::NonDelegatingQueryInterface(riid, ppv);
+ }
+
+ return hr;
}
// IMFClockStateSink
STDMETHODIMP CEVRAllocatorPresenter::OnClockStart(MFTIME hnsSystemTime, LONGLONG llClockStartOffset)
{
- m_nRenderState = Started;
+ m_nRenderState = Started;
- TRACE_EVR ("EVR: OnClockStart hnsSystemTime = %I64d, llClockStartOffset = %I64d\n", hnsSystemTime, llClockStartOffset);
- m_ModeratedTimeLast = -1;
- m_ModeratedClockLast = -1;
+ TRACE_EVR("EVR: OnClockStart hnsSystemTime = %I64d, llClockStartOffset = %I64d\n", hnsSystemTime, llClockStartOffset);
+ m_ModeratedTimeLast = -1;
+ m_ModeratedClockLast = -1;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::OnClockStop(MFTIME hnsSystemTime)
{
- TRACE_EVR ("EVR: OnClockStop hnsSystemTime = %I64d\n", hnsSystemTime);
- m_nRenderState = Stopped;
+ TRACE_EVR("EVR: OnClockStop hnsSystemTime = %I64d\n", hnsSystemTime);
+ m_nRenderState = Stopped;
- m_ModeratedClockLast = -1;
- m_ModeratedTimeLast = -1;
- return S_OK;
+ m_ModeratedClockLast = -1;
+ m_ModeratedTimeLast = -1;
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::OnClockPause(MFTIME hnsSystemTime)
{
- TRACE_EVR ("EVR: OnClockPause hnsSystemTime = %I64d\n", hnsSystemTime);
- if (!m_bSignaledStarvation) {
- m_nRenderState = Paused;
- }
- m_ModeratedTimeLast = -1;
- m_ModeratedClockLast = -1;
- return S_OK;
+ TRACE_EVR("EVR: OnClockPause hnsSystemTime = %I64d\n", hnsSystemTime);
+ if (!m_bSignaledStarvation) {
+ m_nRenderState = Paused;
+ }
+ m_ModeratedTimeLast = -1;
+ m_ModeratedClockLast = -1;
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::OnClockRestart(MFTIME hnsSystemTime)
{
- m_nRenderState = Started;
+ m_nRenderState = Started;
- m_ModeratedTimeLast = -1;
- m_ModeratedClockLast = -1;
- TRACE_EVR ("EVR: OnClockRestart hnsSystemTime = %I64d\n", hnsSystemTime);
+ m_ModeratedTimeLast = -1;
+ m_ModeratedClockLast = -1;
+ TRACE_EVR("EVR: OnClockRestart hnsSystemTime = %I64d\n", hnsSystemTime);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::OnClockSetRate(MFTIME hnsSystemTime, float flRate)
{
- ASSERT (FALSE);
- return E_NOTIMPL;
+ ASSERT(FALSE);
+ return E_NOTIMPL;
}
// IBaseFilter delegate
-bool CEVRAllocatorPresenter::GetState( DWORD dwMilliSecsTimeout, FILTER_STATE *State, HRESULT &_ReturnValue)
+bool CEVRAllocatorPresenter::GetState(DWORD dwMilliSecsTimeout, FILTER_STATE* State, HRESULT& _ReturnValue)
{
- CAutoLock lock(&m_SampleQueueLock);
+ CAutoLock lock(&m_SampleQueueLock);
- if (m_bSignaledStarvation) {
- size_t nSamples = max(m_nNbDXSurface / 2, 1);
- if ((m_ScheduledSamples.GetCount() < nSamples || m_LastSampleOffset < -m_rtTimePerFrame*2) && !g_bNoDuration) {
- *State = (FILTER_STATE)Paused;
- _ReturnValue = VFW_S_STATE_INTERMEDIATE;
- return true;
- }
- m_bSignaledStarvation = false;
- }
- return false;
+ if (m_bSignaledStarvation) {
+ size_t nSamples = max(m_nNbDXSurface / 2, 1);
+ if ((m_ScheduledSamples.GetCount() < nSamples || m_LastSampleOffset < -m_rtTimePerFrame * 2) && !g_bNoDuration) {
+ *State = (FILTER_STATE)Paused;
+ _ReturnValue = VFW_S_STATE_INTERMEDIATE;
+ return true;
+ }
+ m_bSignaledStarvation = false;
+ }
+ return false;
}
// IQualProp
-STDMETHODIMP CEVRAllocatorPresenter::get_FramesDroppedInRenderer(int *pcFrames)
+STDMETHODIMP CEVRAllocatorPresenter::get_FramesDroppedInRenderer(int* pcFrames)
{
- *pcFrames = m_pcFrames;
- return S_OK;
+ *pcFrames = m_pcFrames;
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::get_FramesDrawn(int *pcFramesDrawn)
+STDMETHODIMP CEVRAllocatorPresenter::get_FramesDrawn(int* pcFramesDrawn)
{
- *pcFramesDrawn = m_pcFramesDrawn;
- return S_OK;
+ *pcFramesDrawn = m_pcFramesDrawn;
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::get_AvgFrameRate(int *piAvgFrameRate)
+STDMETHODIMP CEVRAllocatorPresenter::get_AvgFrameRate(int* piAvgFrameRate)
{
- *piAvgFrameRate = (int)(m_fAvrFps * 100);
- return S_OK;
+ *piAvgFrameRate = (int)(m_fAvrFps * 100);
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::get_Jitter(int *iJitter)
+STDMETHODIMP CEVRAllocatorPresenter::get_Jitter(int* iJitter)
{
- *iJitter = (int)((m_fJitterStdDev/10000.0) + 0.5);
- return S_OK;
+ *iJitter = (int)((m_fJitterStdDev / 10000.0) + 0.5);
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::get_AvgSyncOffset(int *piAvg)
+STDMETHODIMP CEVRAllocatorPresenter::get_AvgSyncOffset(int* piAvg)
{
- *piAvg = (int)((m_fSyncOffsetAvr/10000.0) + 0.5);
- return S_OK;
+ *piAvg = (int)((m_fSyncOffsetAvr / 10000.0) + 0.5);
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::get_DevSyncOffset(int *piDev)
+STDMETHODIMP CEVRAllocatorPresenter::get_DevSyncOffset(int* piDev)
{
- *piDev = (int)((m_fSyncOffsetStdDev/10000.0) + 0.5);
- return S_OK;
+ *piDev = (int)((m_fSyncOffsetStdDev / 10000.0) + 0.5);
+ return S_OK;
}
// IMFRateSupport
-STDMETHODIMP CEVRAllocatorPresenter::GetSlowestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float *pflRate)
+STDMETHODIMP CEVRAllocatorPresenter::GetSlowestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float* pflRate)
{
- // TODO : not finished...
- *pflRate = 0;
- return S_OK;
+ // TODO : not finished...
+ *pflRate = 0;
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::GetFastestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float *pflRate)
+STDMETHODIMP CEVRAllocatorPresenter::GetFastestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float* pflRate)
{
- HRESULT hr = S_OK;
- float fMaxRate = 0.0f;
+ HRESULT hr = S_OK;
+ float fMaxRate = 0.0f;
- CAutoLock lock(this);
+ CAutoLock lock(this);
- CheckPointer(pflRate, E_POINTER);
- CheckHR(CheckShutdown());
+ CheckPointer(pflRate, E_POINTER);
+ CheckHR(CheckShutdown());
- // Get the maximum forward rate.
- fMaxRate = GetMaxRate(fThin);
+ // Get the maximum forward rate.
+ fMaxRate = GetMaxRate(fThin);
- // For reverse playback, swap the sign.
- if (eDirection == MFRATE_REVERSE) {
- fMaxRate = -fMaxRate;
- }
+ // For reverse playback, swap the sign.
+ if (eDirection == MFRATE_REVERSE) {
+ fMaxRate = -fMaxRate;
+ }
- *pflRate = fMaxRate;
+ *pflRate = fMaxRate;
- return hr;
+ return hr;
}
-STDMETHODIMP CEVRAllocatorPresenter::IsRateSupported(BOOL fThin, float flRate, float *pflNearestSupportedRate)
+STDMETHODIMP CEVRAllocatorPresenter::IsRateSupported(BOOL fThin, float flRate, float* pflNearestSupportedRate)
{
- // fRate can be negative for reverse playback.
- // pfNearestSupportedRate can be NULL.
+ // fRate can be negative for reverse playback.
+ // pfNearestSupportedRate can be NULL.
- CAutoLock lock(this);
+ CAutoLock lock(this);
- HRESULT hr = S_OK;
- float fMaxRate = 0.0f;
- float fNearestRate = flRate; // Default.
+ HRESULT hr = S_OK;
+ float fMaxRate = 0.0f;
+ float fNearestRate = flRate; // Default.
- CheckPointer (pflNearestSupportedRate, E_POINTER);
- CheckHR(hr = CheckShutdown());
+ CheckPointer(pflNearestSupportedRate, E_POINTER);
+ CheckHR(hr = CheckShutdown());
- // Find the maximum forward rate.
- fMaxRate = GetMaxRate(fThin);
+ // Find the maximum forward rate.
+ fMaxRate = GetMaxRate(fThin);
- if (fabsf(flRate) > fMaxRate) {
- // The (absolute) requested rate exceeds the maximum rate.
- hr = MF_E_UNSUPPORTED_RATE;
+ if (fabsf(flRate) > fMaxRate) {
+ // The (absolute) requested rate exceeds the maximum rate.
+ hr = MF_E_UNSUPPORTED_RATE;
- // The nearest supported rate is fMaxRate.
- fNearestRate = fMaxRate;
- if (flRate < 0) {
- // For reverse playback, swap the sign.
- fNearestRate = -fNearestRate;
- }
- }
+ // The nearest supported rate is fMaxRate.
+ fNearestRate = fMaxRate;
+ if (flRate < 0) {
+ // For reverse playback, swap the sign.
+ fNearestRate = -fNearestRate;
+ }
+ }
- // Return the nearest supported rate if the caller requested it.
- if (pflNearestSupportedRate != NULL) {
- *pflNearestSupportedRate = fNearestRate;
- }
+ // Return the nearest supported rate if the caller requested it.
+ if (pflNearestSupportedRate != NULL) {
+ *pflNearestSupportedRate = fNearestRate;
+ }
- return hr;
+ return hr;
}
float CEVRAllocatorPresenter::GetMaxRate(BOOL bThin)
{
- float fMaxRate = FLT_MAX; // Default.
- UINT32 fpsNumerator = 0, fpsDenominator = 0;
+ float fMaxRate = FLT_MAX; // Default.
+ UINT32 fpsNumerator = 0, fpsDenominator = 0;
- if (!bThin && (m_pMediaType != NULL)) {
- // Non-thinned: Use the frame rate and monitor refresh rate.
+ if (!bThin && (m_pMediaType != NULL)) {
+ // Non-thinned: Use the frame rate and monitor refresh rate.
- // Frame rate:
- MFGetAttributeRatio(m_pMediaType, MF_MT_FRAME_RATE,
- &fpsNumerator, &fpsDenominator);
+ // Frame rate:
+ MFGetAttributeRatio(m_pMediaType, MF_MT_FRAME_RATE,
+ &fpsNumerator, &fpsDenominator);
- // Monitor refresh rate:
- UINT MonitorRateHz = m_RefreshRate; // D3DDISPLAYMODE
+ // Monitor refresh rate:
+ UINT MonitorRateHz = m_RefreshRate; // D3DDISPLAYMODE
- if (fpsDenominator && fpsNumerator && MonitorRateHz) {
- // Max Rate = Refresh Rate / Frame Rate
- fMaxRate = (float)MulDiv(MonitorRateHz, fpsDenominator, fpsNumerator);
- }
- }
- return fMaxRate;
+ if (fpsDenominator && fpsNumerator && MonitorRateHz) {
+ // Max Rate = Refresh Rate / Frame Rate
+ fMaxRate = (float)MulDiv(MonitorRateHz, fpsDenominator, fpsNumerator);
+ }
+ }
+ return fMaxRate;
}
void CEVRAllocatorPresenter::CompleteFrameStep(bool bCancel)
{
- if (m_nStepCount > 0) {
- if (bCancel || (m_nStepCount == 1)) {
- m_pSink->Notify(EC_STEP_COMPLETE, bCancel ? TRUE : FALSE, 0);
- m_nStepCount = 0;
- } else {
- m_nStepCount--;
- }
- }
+ if (m_nStepCount > 0) {
+ if (bCancel || (m_nStepCount == 1)) {
+ m_pSink->Notify(EC_STEP_COMPLETE, bCancel ? TRUE : FALSE, 0);
+ m_nStepCount = 0;
+ } else {
+ m_nStepCount--;
+ }
+ }
}
// IMFVideoPresenter
STDMETHODIMP CEVRAllocatorPresenter::ProcessMessage(MFVP_MESSAGE_TYPE eMessage, ULONG_PTR ulParam)
{
- HRESULT hr = S_OK;
-
- switch (eMessage) {
- case MFVP_MESSAGE_BEGINSTREAMING : // The EVR switched from stopped to paused. The presenter should allocate resources
- ResetStats();
- TRACE_EVR ("EVR: MFVP_MESSAGE_BEGINSTREAMING\n");
- break;
-
- case MFVP_MESSAGE_CANCELSTEP : // Cancels a frame step
- TRACE_EVR ("EVR: MFVP_MESSAGE_CANCELSTEP\n");
- CompleteFrameStep (true);
- break;
-
- case MFVP_MESSAGE_ENDOFSTREAM : // All input streams have ended.
- TRACE_EVR ("EVR: MFVP_MESSAGE_ENDOFSTREAM\n");
- m_bPendingMediaFinished = true;
- break;
-
- case MFVP_MESSAGE_ENDSTREAMING : // The EVR switched from running or paused to stopped. The presenter should free resources
- TRACE_EVR ("EVR: MFVP_MESSAGE_ENDSTREAMING\n");
- break;
-
- case MFVP_MESSAGE_FLUSH : // The presenter should discard any pending samples
- SetEvent(m_hEvtFlush);
- m_bEvtFlush = true;
- TRACE_EVR ("EVR: MFVP_MESSAGE_FLUSH\n");
- while (WaitForSingleObject(m_hEvtFlush, 1) == WAIT_OBJECT_0) {
- ;
- }
- break;
-
- case MFVP_MESSAGE_INVALIDATEMEDIATYPE : // The mixer's output format has changed. The EVR will initiate format negotiation, as described previously
- /*
- 1) The EVR sets the media type on the reference stream.
- 2) The EVR calls IMFVideoPresenter::ProcessMessage on the presenter with the MFVP_MESSAGE_INVALIDATEMEDIATYPE message.
- 3) The presenter sets the media type on the mixer's output stream.
- 4) The EVR sets the media type on the substreams.
- */
- m_bPendingRenegotiate = true;
- while (*((volatile bool *)&m_bPendingRenegotiate)) {
- Sleep(1);
- }
- break;
-
- case MFVP_MESSAGE_PROCESSINPUTNOTIFY : // One input stream on the mixer has received a new sample
- // GetImageFromMixer();
- break;
-
- case MFVP_MESSAGE_STEP : // Requests a frame step.
- TRACE_EVR ("EVR: MFVP_MESSAGE_STEP\n");
- m_nStepCount = (int)ulParam;
- hr = S_OK;
- break;
-
- default :
- ASSERT (FALSE);
- break;
- }
- return hr;
+ HRESULT hr = S_OK;
+
+ switch (eMessage) {
+ case MFVP_MESSAGE_BEGINSTREAMING : // The EVR switched from stopped to paused. The presenter should allocate resources
+ ResetStats();
+ TRACE_EVR("EVR: MFVP_MESSAGE_BEGINSTREAMING\n");
+ break;
+
+ case MFVP_MESSAGE_CANCELSTEP : // Cancels a frame step
+ TRACE_EVR("EVR: MFVP_MESSAGE_CANCELSTEP\n");
+ CompleteFrameStep(true);
+ break;
+
+ case MFVP_MESSAGE_ENDOFSTREAM : // All input streams have ended.
+ TRACE_EVR("EVR: MFVP_MESSAGE_ENDOFSTREAM\n");
+ m_bPendingMediaFinished = true;
+ break;
+
+ case MFVP_MESSAGE_ENDSTREAMING : // The EVR switched from running or paused to stopped. The presenter should free resources
+ TRACE_EVR("EVR: MFVP_MESSAGE_ENDSTREAMING\n");
+ break;
+
+ case MFVP_MESSAGE_FLUSH : // The presenter should discard any pending samples
+ SetEvent(m_hEvtFlush);
+ m_bEvtFlush = true;
+ TRACE_EVR("EVR: MFVP_MESSAGE_FLUSH\n");
+ while (WaitForSingleObject(m_hEvtFlush, 1) == WAIT_OBJECT_0) {
+ ;
+ }
+ break;
+
+ case MFVP_MESSAGE_INVALIDATEMEDIATYPE : // The mixer's output format has changed. The EVR will initiate format negotiation, as described previously
+ /*
+ 1) The EVR sets the media type on the reference stream.
+ 2) The EVR calls IMFVideoPresenter::ProcessMessage on the presenter with the MFVP_MESSAGE_INVALIDATEMEDIATYPE message.
+ 3) The presenter sets the media type on the mixer's output stream.
+ 4) The EVR sets the media type on the substreams.
+ */
+ m_bPendingRenegotiate = true;
+ while (*((volatile bool*)&m_bPendingRenegotiate)) {
+ Sleep(1);
+ }
+ break;
+
+ case MFVP_MESSAGE_PROCESSINPUTNOTIFY : // One input stream on the mixer has received a new sample
+ // GetImageFromMixer();
+ break;
+
+ case MFVP_MESSAGE_STEP : // Requests a frame step.
+ TRACE_EVR("EVR: MFVP_MESSAGE_STEP\n");
+ m_nStepCount = (int)ulParam;
+ hr = S_OK;
+ break;
+
+ default :
+ ASSERT(FALSE);
+ break;
+ }
+ return hr;
}
HRESULT CEVRAllocatorPresenter::IsMediaTypeSupported(IMFMediaType* pMixerType)
{
- HRESULT hr;
+ HRESULT hr;
- // We support only video types
- GUID MajorType;
- hr = pMixerType->GetMajorType(&MajorType);
+ // We support only video types
+ GUID MajorType;
+ hr = pMixerType->GetMajorType(&MajorType);
- if (SUCCEEDED(hr)) {
- if (MajorType != MFMediaType_Video) {
- hr = MF_E_INVALIDMEDIATYPE;
- }
- }
+ if (SUCCEEDED(hr)) {
+ if (MajorType != MFMediaType_Video) {
+ hr = MF_E_INVALIDMEDIATYPE;
+ }
+ }
- // We support only progressive formats
- MFVideoInterlaceMode InterlaceMode;
+ // We support only progressive formats
+ MFVideoInterlaceMode InterlaceMode;
- if (SUCCEEDED(hr)) {
- hr = pMixerType->GetUINT32(MF_MT_INTERLACE_MODE, (UINT32*)&InterlaceMode);
- }
+ if (SUCCEEDED(hr)) {
+ hr = pMixerType->GetUINT32(MF_MT_INTERLACE_MODE, (UINT32*)&InterlaceMode);
+ }
- if (SUCCEEDED(hr)) {
- if (InterlaceMode != MFVideoInterlace_Progressive) {
- hr = MF_E_INVALIDMEDIATYPE;
- }
- }
+ if (SUCCEEDED(hr)) {
+ if (InterlaceMode != MFVideoInterlace_Progressive) {
+ hr = MF_E_INVALIDMEDIATYPE;
+ }
+ }
- // Check whether we support the surface format
- int Merit = 0;
+ // Check whether we support the surface format
+ int Merit = 0;
- if (SUCCEEDED(hr)) {
- hr = GetMediaTypeMerit(pMixerType, &Merit);
- }
+ if (SUCCEEDED(hr)) {
+ hr = GetMediaTypeMerit(pMixerType, &Merit);
+ }
- if (SUCCEEDED(hr)) {
- if (Merit == 0) {
- hr = MF_E_INVALIDMEDIATYPE;
- }
- }
+ if (SUCCEEDED(hr)) {
+ if (Merit == 0) {
+ hr = MF_E_INVALIDMEDIATYPE;
+ }
+ }
- return hr;
+ return hr;
}
HRESULT CEVRAllocatorPresenter::CreateProposedOutputType(IMFMediaType* pMixerType, IMFMediaType** pType)
{
- HRESULT hr;
- AM_MEDIA_TYPE* pAMMedia = NULL;
- LARGE_INTEGER i64Size;
- MFVIDEOFORMAT* VideoFormat;
-
- CheckHR (pMixerType->GetRepresentation (FORMAT_MFVideoFormat, (void**)&pAMMedia));
-
- VideoFormat = (MFVIDEOFORMAT*)pAMMedia->pbFormat;
- hr = pfMFCreateVideoMediaType (VideoFormat, &m_pMediaType);
-
- if (0) {
- // This code doesn't work, use same method as VMR9 instead
- if (VideoFormat->videoInfo.FramesPerSecond.Numerator != 0) {
- switch (VideoFormat->videoInfo.InterlaceMode) {
- case MFVideoInterlace_Progressive:
- case MFVideoInterlace_MixedInterlaceOrProgressive:
- default: {
- m_rtTimePerFrame = (10000000I64*VideoFormat->videoInfo.FramesPerSecond.Denominator)/VideoFormat->videoInfo.FramesPerSecond.Numerator;
- m_bInterlaced = false;
- }
- break;
- case MFVideoInterlace_FieldSingleUpper:
- case MFVideoInterlace_FieldSingleLower:
- case MFVideoInterlace_FieldInterleavedUpperFirst:
- case MFVideoInterlace_FieldInterleavedLowerFirst: {
- m_rtTimePerFrame = (20000000I64*VideoFormat->videoInfo.FramesPerSecond.Denominator)/VideoFormat->videoInfo.FramesPerSecond.Numerator;
- m_bInterlaced = true;
- }
- break;
- }
- }
- }
-
- m_AspectRatio.cx = VideoFormat->videoInfo.PixelAspectRatio.Numerator;
- m_AspectRatio.cy = VideoFormat->videoInfo.PixelAspectRatio.Denominator;
-
- if (SUCCEEDED (hr)) {
- i64Size.HighPart = VideoFormat->videoInfo.dwWidth;
- i64Size.LowPart = VideoFormat->videoInfo.dwHeight;
- m_pMediaType->SetUINT64 (MF_MT_FRAME_SIZE, i64Size.QuadPart);
-
- m_pMediaType->SetUINT32 (MF_MT_PAN_SCAN_ENABLED, 0);
-
- CRenderersSettings& s = GetRenderersSettings();
+ HRESULT hr;
+ AM_MEDIA_TYPE* pAMMedia = NULL;
+ LARGE_INTEGER i64Size;
+ MFVIDEOFORMAT* VideoFormat;
+
+ CheckHR(pMixerType->GetRepresentation(FORMAT_MFVideoFormat, (void**)&pAMMedia));
+
+ VideoFormat = (MFVIDEOFORMAT*)pAMMedia->pbFormat;
+ hr = pfMFCreateVideoMediaType(VideoFormat, &m_pMediaType);
+
+ if (0) {
+ // This code doesn't work, use same method as VMR9 instead
+ if (VideoFormat->videoInfo.FramesPerSecond.Numerator != 0) {
+ switch (VideoFormat->videoInfo.InterlaceMode) {
+ case MFVideoInterlace_Progressive:
+ case MFVideoInterlace_MixedInterlaceOrProgressive:
+ default: {
+ m_rtTimePerFrame = (10000000I64 * VideoFormat->videoInfo.FramesPerSecond.Denominator) / VideoFormat->videoInfo.FramesPerSecond.Numerator;
+ m_bInterlaced = false;
+ }
+ break;
+ case MFVideoInterlace_FieldSingleUpper:
+ case MFVideoInterlace_FieldSingleLower:
+ case MFVideoInterlace_FieldInterleavedUpperFirst:
+ case MFVideoInterlace_FieldInterleavedLowerFirst: {
+ m_rtTimePerFrame = (20000000I64 * VideoFormat->videoInfo.FramesPerSecond.Denominator) / VideoFormat->videoInfo.FramesPerSecond.Numerator;
+ m_bInterlaced = true;
+ }
+ break;
+ }
+ }
+ }
+
+ m_AspectRatio.cx = VideoFormat->videoInfo.PixelAspectRatio.Numerator;
+ m_AspectRatio.cy = VideoFormat->videoInfo.PixelAspectRatio.Denominator;
+
+ if (SUCCEEDED(hr)) {
+ i64Size.HighPart = VideoFormat->videoInfo.dwWidth;
+ i64Size.LowPart = VideoFormat->videoInfo.dwHeight;
+ m_pMediaType->SetUINT64(MF_MT_FRAME_SIZE, i64Size.QuadPart);
+
+ m_pMediaType->SetUINT32(MF_MT_PAN_SCAN_ENABLED, 0);
+
+ CRenderersSettings& s = GetRenderersSettings();
#if 1
- if (s.m_RenderSettings.iEVROutputRange == 1) {
- m_pMediaType->SetUINT32 (MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_16_235);
- } else {
- m_pMediaType->SetUINT32 (MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_0_255);
- }
+ if (s.m_RenderSettings.iEVROutputRange == 1) {
+ m_pMediaType->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_16_235);
+ } else {
+ m_pMediaType->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_0_255);
+ }
- // m_pMediaType->SetUINT32 (MF_MT_TRANSFER_FUNCTION, MFVideoTransFunc_10);
+ // m_pMediaType->SetUINT32 (MF_MT_TRANSFER_FUNCTION, MFVideoTransFunc_10);
#else
- m_pMediaType->SetUINT32 (MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_0_255);
- if (s.iEVROutputRange == 1) {
- m_pMediaType->SetUINT32 (MF_MT_YUV_MATRIX, MFVideoTransferMatrix_BT601);
- } else {
- m_pMediaType->SetUINT32 (MF_MT_YUV_MATRIX, MFVideoTransferMatrix_BT709);
- }
+ m_pMediaType->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_0_255);
+ if (s.iEVROutputRange == 1) {
+ m_pMediaType->SetUINT32(MF_MT_YUV_MATRIX, MFVideoTransferMatrix_BT601);
+ } else {
+ m_pMediaType->SetUINT32(MF_MT_YUV_MATRIX, MFVideoTransferMatrix_BT709);
+ }
#endif
- m_LastSetOutputRange = s.m_RenderSettings.iEVROutputRange;
+ m_LastSetOutputRange = s.m_RenderSettings.iEVROutputRange;
- i64Size.HighPart = m_AspectRatio.cx;
- i64Size.LowPart = m_AspectRatio.cy;
- m_pMediaType->SetUINT64 (MF_MT_PIXEL_ASPECT_RATIO, i64Size.QuadPart);
+ i64Size.HighPart = m_AspectRatio.cx;
+ i64Size.LowPart = m_AspectRatio.cy;
+ m_pMediaType->SetUINT64(MF_MT_PIXEL_ASPECT_RATIO, i64Size.QuadPart);
- MFVideoArea Area = MakeArea (0, 0, VideoFormat->videoInfo.dwWidth, VideoFormat->videoInfo.dwHeight);
- m_pMediaType->SetBlob(MF_MT_GEOMETRIC_APERTURE, (UINT8*)&Area, sizeof(MFVideoArea));
+ MFVideoArea Area = MakeArea(0, 0, VideoFormat->videoInfo.dwWidth, VideoFormat->videoInfo.dwHeight);
+ m_pMediaType->SetBlob(MF_MT_GEOMETRIC_APERTURE, (UINT8*)&Area, sizeof(MFVideoArea));
- }
+ }
- m_AspectRatio.cx *= VideoFormat->videoInfo.dwWidth;
- m_AspectRatio.cy *= VideoFormat->videoInfo.dwHeight;
+ m_AspectRatio.cx *= VideoFormat->videoInfo.dwWidth;
+ m_AspectRatio.cy *= VideoFormat->videoInfo.dwHeight;
- bool bDoneSomething = true;
+ bool bDoneSomething = true;
- if (m_AspectRatio.cx >= 1 && m_AspectRatio.cy >= 1) { //if any of these is 0, it will stuck into a infinite loop
- while (bDoneSomething) {
- bDoneSomething = false;
- INT MinNum = min(m_AspectRatio.cx, m_AspectRatio.cy);
- INT i;
- for (i = 2; i < MinNum+1; ++i) {
- if (m_AspectRatio.cx%i == 0 && m_AspectRatio.cy%i ==0) {
- break;
- }
- }
- if (i != MinNum + 1) {
- m_AspectRatio.cx = m_AspectRatio.cx / i;
- m_AspectRatio.cy = m_AspectRatio.cy / i;
- bDoneSomething = true;
- }
- }
- }
+ if (m_AspectRatio.cx >= 1 && m_AspectRatio.cy >= 1) { //if any of these is 0, it will stuck into a infinite loop
+ while (bDoneSomething) {
+ bDoneSomething = false;
+ INT MinNum = min(m_AspectRatio.cx, m_AspectRatio.cy);
+ INT i;
+ for (i = 2; i < MinNum + 1; ++i) {
+ if (m_AspectRatio.cx % i == 0 && m_AspectRatio.cy % i == 0) {
+ break;
+ }
+ }
+ if (i != MinNum + 1) {
+ m_AspectRatio.cx = m_AspectRatio.cx / i;
+ m_AspectRatio.cy = m_AspectRatio.cy / i;
+ bDoneSomething = true;
+ }
+ }
+ }
- pMixerType->FreeRepresentation (FORMAT_MFVideoFormat, (void*)pAMMedia);
- m_pMediaType->QueryInterface (__uuidof(IMFMediaType), (void**) pType);
+ pMixerType->FreeRepresentation(FORMAT_MFVideoFormat, (void*)pAMMedia);
+ m_pMediaType->QueryInterface(__uuidof(IMFMediaType), (void**) pType);
- return hr;
+ return hr;
}
HRESULT CEVRAllocatorPresenter::SetMediaType(IMFMediaType* pType)
{
- HRESULT hr;
- AM_MEDIA_TYPE* pAMMedia = NULL;
- CString strTemp, strTemp1;
+ HRESULT hr;
+ AM_MEDIA_TYPE* pAMMedia = NULL;
+ CString strTemp, strTemp1;
- CheckPointer (pType, E_POINTER);
- CheckHR (pType->GetRepresentation(FORMAT_VideoInfo2, (void**)&pAMMedia));
+ CheckPointer(pType, E_POINTER);
+ CheckHR(pType->GetRepresentation(FORMAT_VideoInfo2, (void**)&pAMMedia));
- hr = InitializeDevice (pType);
- if (SUCCEEDED(hr)) {
- strTemp = GetMediaTypeName (pAMMedia->subtype);
- strTemp.Replace (L"MEDIASUBTYPE_", L"");
- strTemp1 = GetMediaTypeFormatDesc(pType);
- strTemp1.Replace (L"D3DFMT_", L"");
- m_strStatsMsg[MSG_MIXEROUT].Format (L"Mixer output : %-10s Type %-10s", strTemp, strTemp1);
- }
+ hr = InitializeDevice(pType);
+ if (SUCCEEDED(hr)) {
+ strTemp = GetMediaTypeName(pAMMedia->subtype);
+ strTemp.Replace(L"MEDIASUBTYPE_", L"");
+ strTemp1 = GetMediaTypeFormatDesc(pType);
+ strTemp1.Replace(L"D3DFMT_", L"");
+ m_strStatsMsg[MSG_MIXEROUT].Format(L"Mixer output : %-10s Type %-10s", strTemp, strTemp1);
+ }
- pType->FreeRepresentation (FORMAT_VideoInfo2, (void*)pAMMedia);
+ pType->FreeRepresentation(FORMAT_VideoInfo2, (void*)pAMMedia);
- return hr;
+ return hr;
}
HRESULT CEVRAllocatorPresenter::GetMediaTypeFourCC(IMFMediaType* pType, DWORD* pFourCC)
{
- if (pFourCC == NULL) {
- return E_POINTER;
- }
+ if (pFourCC == NULL) {
+ return E_POINTER;
+ }
- HRESULT hr = S_OK;
- GUID guidSubType = GUID_NULL;
+ HRESULT hr = S_OK;
+ GUID guidSubType = GUID_NULL;
- if (SUCCEEDED(hr)) {
- hr = pType->GetGUID(MF_MT_SUBTYPE, &guidSubType);
- }
+ if (SUCCEEDED(hr)) {
+ hr = pType->GetGUID(MF_MT_SUBTYPE, &guidSubType);
+ }
- if (SUCCEEDED(hr)) {
- *pFourCC = guidSubType.Data1;
- }
+ if (SUCCEEDED(hr)) {
+ *pFourCC = guidSubType.Data1;
+ }
- return hr;
+ return hr;
}
HRESULT CEVRAllocatorPresenter::GetMediaTypeMerit(IMFMediaType* pType, int* pMerit)
{
- DWORD Format;
- HRESULT hr = GetMediaTypeFourCC(pType, &Format);
-
- if (SUCCEEDED(hr)) {
- switch (Format) {
- case FCC('AI44'):// Palettized, 4:4:4
- *pMerit = 31;
- break;
- case FCC('YVU9'):// 8-bit, 16:1:1
- *pMerit = 30;
- break;
- case FCC('NV11'):// 8-bit, 4:1:1
- *pMerit = 29;
- break;
- case FCC('Y41P'):
- *pMerit = 28;
- break;
- case FCC('Y41T'):
- *pMerit = 27;
- break;
- case FCC('P016'):// 4:2:0
- *pMerit = 26;
- break;
- case FCC('P010'):
- *pMerit = 25;
- break;
- case FCC('IMC1'):
- *pMerit = 24;
- break;
- case FCC('IMC3'):
- *pMerit = 23;
- break;
- case FCC('IMC2'):
- *pMerit = 22;
- break;
- case FCC('IMC4'):
- *pMerit = 21;
- break;
- case FCC('YV12'):
- *pMerit = 20;
- break;
- case FCC('NV12'):
- *pMerit = 19;
- break;
- case FCC('I420'):
- *pMerit = 18;
- break;
- case FCC('IYUV'):
- *pMerit = 17;
- break;
- case FCC('Y216'):// 4:2:2
- *pMerit = 16;
- break;
- case FCC('v216'):
- *pMerit = 15;
- break;
- case FCC('P216'):
- *pMerit = 14;
- break;
- case FCC('Y210'):
- *pMerit = 13;
- break;
- case FCC('v210'):
- *pMerit = 12;
- break;
- case FCC('P210'):
- *pMerit = 11;
- break;
- case FCC('YUY2'):
- *pMerit = 0;// bug: the internal software codecs will always select this, for safety this item is ranked below X8R8G8B8 until the problem is solved
- break;
- case FCC('UYVY'):
- *pMerit = 9;
- break;
- case FCC('Y42T'):
- *pMerit = 8;
- break;
- case FCC('YVYU'):
- *pMerit = 7;
- break;
- case FCC('Y416'):// 4:4:4
- *pMerit = 6;
- break;
- case FCC('Y410'):
- *pMerit = 5;
- break;
- case FCC('v410'):
- *pMerit = 4;
- break;
- case FCC('AYUV'):
- *pMerit = 3;
- break;
- case D3DFMT_X8R8G8B8:
- if (m_bForceInputHighColorResolution) {
- *pMerit = 63;
- } else {
- *pMerit = 1;
- }
- break;
- case D3DFMT_A8R8G8B8:// an accepted format, but fails on most surface types
- case D3DFMT_A8B8G8R8:
- case D3DFMT_X8B8G8R8:
- case D3DFMT_R8G8B8:
- case D3DFMT_R5G6B5:
- case D3DFMT_X1R5G5B5:
- case D3DFMT_A1R5G5B5:
- case D3DFMT_A4R4G4B4:
- case D3DFMT_R3G3B2:
- case D3DFMT_A8R3G3B2:
- case D3DFMT_X4R4G4B4:
- case D3DFMT_A8P8:
- case D3DFMT_P8:
- *pMerit = 0;
- break;
- default:
- *pMerit = 2;
- break;
- }
- }
-
- return hr;
+ DWORD Format;
+ HRESULT hr = GetMediaTypeFourCC(pType, &Format);
+
+ if (SUCCEEDED(hr)) {
+ switch (Format) {
+ case FCC('AI44'):// Palettized, 4:4:4
+ *pMerit = 31;
+ break;
+ case FCC('YVU9'):// 8-bit, 16:1:1
+ *pMerit = 30;
+ break;
+ case FCC('NV11'):// 8-bit, 4:1:1
+ *pMerit = 29;
+ break;
+ case FCC('Y41P'):
+ *pMerit = 28;
+ break;
+ case FCC('Y41T'):
+ *pMerit = 27;
+ break;
+ case FCC('P016'):// 4:2:0
+ *pMerit = 26;
+ break;
+ case FCC('P010'):
+ *pMerit = 25;
+ break;
+ case FCC('IMC1'):
+ *pMerit = 24;
+ break;
+ case FCC('IMC3'):
+ *pMerit = 23;
+ break;
+ case FCC('IMC2'):
+ *pMerit = 22;
+ break;
+ case FCC('IMC4'):
+ *pMerit = 21;
+ break;
+ case FCC('YV12'):
+ *pMerit = 20;
+ break;
+ case FCC('NV12'):
+ *pMerit = 19;
+ break;
+ case FCC('I420'):
+ *pMerit = 18;
+ break;
+ case FCC('IYUV'):
+ *pMerit = 17;
+ break;
+ case FCC('Y216'):// 4:2:2
+ *pMerit = 16;
+ break;
+ case FCC('v216'):
+ *pMerit = 15;
+ break;
+ case FCC('P216'):
+ *pMerit = 14;
+ break;
+ case FCC('Y210'):
+ *pMerit = 13;
+ break;
+ case FCC('v210'):
+ *pMerit = 12;
+ break;
+ case FCC('P210'):
+ *pMerit = 11;
+ break;
+ case FCC('YUY2'):
+ *pMerit = 0;// bug: the internal software codecs will always select this, for safety this item is ranked below X8R8G8B8 until the problem is solved
+ break;
+ case FCC('UYVY'):
+ *pMerit = 9;
+ break;
+ case FCC('Y42T'):
+ *pMerit = 8;
+ break;
+ case FCC('YVYU'):
+ *pMerit = 7;
+ break;
+ case FCC('Y416'):// 4:4:4
+ *pMerit = 6;
+ break;
+ case FCC('Y410'):
+ *pMerit = 5;
+ break;
+ case FCC('v410'):
+ *pMerit = 4;
+ break;
+ case FCC('AYUV'):
+ *pMerit = 3;
+ break;
+ case D3DFMT_X8R8G8B8:
+ if (m_bForceInputHighColorResolution) {
+ *pMerit = 63;
+ } else {
+ *pMerit = 1;
+ }
+ break;
+ case D3DFMT_A8R8G8B8:// an accepted format, but fails on most surface types
+ case D3DFMT_A8B8G8R8:
+ case D3DFMT_X8B8G8R8:
+ case D3DFMT_R8G8B8:
+ case D3DFMT_R5G6B5:
+ case D3DFMT_X1R5G5B5:
+ case D3DFMT_A1R5G5B5:
+ case D3DFMT_A4R4G4B4:
+ case D3DFMT_R3G3B2:
+ case D3DFMT_A8R3G3B2:
+ case D3DFMT_X4R4G4B4:
+ case D3DFMT_A8P8:
+ case D3DFMT_P8:
+ *pMerit = 0;
+ break;
+ default:
+ *pMerit = 2;
+ break;
+ }
+ }
+
+ return hr;
}
LPCTSTR FindD3DFormat(const D3DFORMAT Format);
LPCTSTR CEVRAllocatorPresenter::GetMediaTypeFormatDesc(IMFMediaType* pMediaType)
{
- D3DFORMAT Format = D3DFMT_UNKNOWN;
- GetMediaTypeFourCC(pMediaType, (DWORD*)&Format);
- return FindD3DFormat(Format);
+ D3DFORMAT Format = D3DFMT_UNKNOWN;
+ GetMediaTypeFourCC(pMediaType, (DWORD*)&Format);
+ return FindD3DFormat(Format);
}
HRESULT CEVRAllocatorPresenter::RenegotiateMediaType()
{
- HRESULT hr = S_OK;
-
- CComPtr<IMFMediaType> pMixerType;
- CComPtr<IMFMediaType> pType;
-
- if (!m_pMixer) {
- return MF_E_INVALIDREQUEST;
- }
-
- CInterfaceArray<IMFMediaType> ValidMixerTypes;
-
- // Loop through all of the mixer's proposed output types.
- DWORD iTypeIndex = 0;
- while ((hr != MF_E_NO_MORE_TYPES)) {
- pMixerType = NULL;
- pType = NULL;
- m_pMediaType = NULL;
-
- // Step 1. Get the next media type supported by mixer.
- hr = m_pMixer->GetOutputAvailableType(0, iTypeIndex++, &pMixerType);
- if (FAILED(hr)) {
- break;
- }
-
- // Step 2. Check if we support this media type.
- if (SUCCEEDED(hr)) {
- hr = IsMediaTypeSupported(pMixerType);
- }
-
- if (SUCCEEDED(hr)) {
- hr = CreateProposedOutputType(pMixerType, &pType);
- }
-
- // Step 4. Check if the mixer will accept this media type.
- if (SUCCEEDED(hr)) {
- hr = m_pMixer->SetOutputType(0, pType, MFT_SET_TYPE_TEST_ONLY);
- }
-
- int Merit;
- if (SUCCEEDED(hr)) {
- hr = GetMediaTypeMerit(pType, &Merit);
- }
-
- if (SUCCEEDED(hr)) {
- size_t nTypes = ValidMixerTypes.GetCount();
- size_t iInsertPos = 0;
- for (size_t i = 0; i < nTypes; ++i) {
- int ThisMerit;
- GetMediaTypeMerit(ValidMixerTypes[i], &ThisMerit);
-
- if (Merit > ThisMerit) {
- iInsertPos = i;
- break;
- } else {
- iInsertPos = i+1;
- }
- }
-
- ValidMixerTypes.InsertAt(iInsertPos, pType);
- }
- }
-
-
- size_t nValidTypes = ValidMixerTypes.GetCount();
+ HRESULT hr = S_OK;
+
+ CComPtr<IMFMediaType> pMixerType;
+ CComPtr<IMFMediaType> pType;
+
+ if (!m_pMixer) {
+ return MF_E_INVALIDREQUEST;
+ }
+
+ CInterfaceArray<IMFMediaType> ValidMixerTypes;
+
+ // Loop through all of the mixer's proposed output types.
+ DWORD iTypeIndex = 0;
+ while ((hr != MF_E_NO_MORE_TYPES)) {
+ pMixerType = NULL;
+ pType = NULL;
+ m_pMediaType = NULL;
+
+ // Step 1. Get the next media type supported by mixer.
+ hr = m_pMixer->GetOutputAvailableType(0, iTypeIndex++, &pMixerType);
+ if (FAILED(hr)) {
+ break;
+ }
+
+ // Step 2. Check if we support this media type.
+ if (SUCCEEDED(hr)) {
+ hr = IsMediaTypeSupported(pMixerType);
+ }
+
+ if (SUCCEEDED(hr)) {
+ hr = CreateProposedOutputType(pMixerType, &pType);
+ }
+
+ // Step 4. Check if the mixer will accept this media type.
+ if (SUCCEEDED(hr)) {
+ hr = m_pMixer->SetOutputType(0, pType, MFT_SET_TYPE_TEST_ONLY);
+ }
+
+ int Merit;
+ if (SUCCEEDED(hr)) {
+ hr = GetMediaTypeMerit(pType, &Merit);
+ }
+
+ if (SUCCEEDED(hr)) {
+ size_t nTypes = ValidMixerTypes.GetCount();
+ size_t iInsertPos = 0;
+ for (size_t i = 0; i < nTypes; ++i) {
+ int ThisMerit;
+ GetMediaTypeMerit(ValidMixerTypes[i], &ThisMerit);
+
+ if (Merit > ThisMerit) {
+ iInsertPos = i;
+ break;
+ } else {
+ iInsertPos = i + 1;
+ }
+ }
+
+ ValidMixerTypes.InsertAt(iInsertPos, pType);
+ }
+ }
+
+
+ size_t nValidTypes = ValidMixerTypes.GetCount();
#ifdef _DEBUG
- for (size_t i = 0; i < nValidTypes; ++i) {
- // Step 3. Adjust the mixer's type to match our requirements.
- pType = ValidMixerTypes[i];
- TRACE_EVR("EVR: Valid mixer output type: %ws\n", GetMediaTypeFormatDesc(pType));
- }
+ for (size_t i = 0; i < nValidTypes; ++i) {
+ // Step 3. Adjust the mixer's type to match our requirements.
+ pType = ValidMixerTypes[i];
+ TRACE_EVR("EVR: Valid mixer output type: %ws\n", GetMediaTypeFormatDesc(pType));
+ }
#endif
- for (size_t i = 0; i < nValidTypes; ++i) {
- // Step 3. Adjust the mixer's type to match our requirements.
- pType = ValidMixerTypes[i];
+ for (size_t i = 0; i < nValidTypes; ++i) {
+ // Step 3. Adjust the mixer's type to match our requirements.
+ pType = ValidMixerTypes[i];
- TRACE_EVR("EVR: Trying mixer output type: %ws\n", GetMediaTypeFormatDesc(pType));
+ TRACE_EVR("EVR: Trying mixer output type: %ws\n", GetMediaTypeFormatDesc(pType));
- // Step 5. Try to set the media type on ourselves.
- hr = SetMediaType(pType);
+ // Step 5. Try to set the media type on ourselves.
+ hr = SetMediaType(pType);
- // Step 6. Set output media type on mixer.
- if (SUCCEEDED(hr)) {
- hr = m_pMixer->SetOutputType(0, pType, 0);
+ // Step 6. Set output media type on mixer.
+ if (SUCCEEDED(hr)) {
+ hr = m_pMixer->SetOutputType(0, pType, 0);
- // If something went wrong, clear the media type.
- if (FAILED(hr)) {
- SetMediaType(NULL);
- } else {
- break;
- }
- }
- }
+ // If something went wrong, clear the media type.
+ if (FAILED(hr)) {
+ SetMediaType(NULL);
+ } else {
+ break;
+ }
+ }
+ }
- pMixerType = NULL;
- pType = NULL;
- return hr;
+ pMixerType = NULL;
+ pType = NULL;
+ return hr;
}
bool CEVRAllocatorPresenter::GetImageFromMixer()
{
- MFT_OUTPUT_DATA_BUFFER Buffer;
- HRESULT hr = S_OK;
- DWORD dwStatus;
- REFERENCE_TIME nsSampleTime;
- LONGLONG llClockBefore = 0;
- LONGLONG llClockAfter = 0;
- LONGLONG llMixerLatency;
- UINT dwSurface;
+ MFT_OUTPUT_DATA_BUFFER Buffer;
+ HRESULT hr = S_OK;
+ DWORD dwStatus;
+ REFERENCE_TIME nsSampleTime;
+ LONGLONG llClockBefore = 0;
+ LONGLONG llClockAfter = 0;
+ LONGLONG llMixerLatency;
+ UINT dwSurface;
- bool bDoneSomething = false;
+ bool bDoneSomething = false;
- while (SUCCEEDED(hr)) {
- CComPtr<IMFSample> pSample;
+ while (SUCCEEDED(hr)) {
+ CComPtr<IMFSample> pSample;
- if (FAILED (GetFreeSample (&pSample))) {
- m_bWaitingSample = true;
- break;
- }
+ if (FAILED(GetFreeSample(&pSample))) {
+ m_bWaitingSample = true;
+ break;
+ }
- memset (&Buffer, 0, sizeof(Buffer));
- Buffer.pSample = pSample;
- pSample->GetUINT32 (GUID_SURFACE_INDEX, &dwSurface);
+ memset(&Buffer, 0, sizeof(Buffer));
+ Buffer.pSample = pSample;
+ pSample->GetUINT32(GUID_SURFACE_INDEX, &dwSurface);
- {
- llClockBefore = GetRenderersData()->GetPerfCounter();
- hr = m_pMixer->ProcessOutput (0 , 1, &Buffer, &dwStatus);
- llClockAfter = GetRenderersData()->GetPerfCounter();
- }
+ {
+ llClockBefore = GetRenderersData()->GetPerfCounter();
+ hr = m_pMixer->ProcessOutput(0 , 1, &Buffer, &dwStatus);
+ llClockAfter = GetRenderersData()->GetPerfCounter();
+ }
- if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) {
- MoveToFreeList (pSample, false);
- break;
- }
+ if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) {
+ MoveToFreeList(pSample, false);
+ break;
+ }
- if (m_pSink) {
- //CAutoLock autolock(this); We shouldn't need to lock here, m_pSink is thread safe
- llMixerLatency = llClockAfter - llClockBefore;
- m_pSink->Notify (EC_PROCESSING_LATENCY, (LONG_PTR)&llMixerLatency, 0);
- }
+ if (m_pSink) {
+ //CAutoLock autolock(this); We shouldn't need to lock here, m_pSink is thread safe
+ llMixerLatency = llClockAfter - llClockBefore;
+ m_pSink->Notify(EC_PROCESSING_LATENCY, (LONG_PTR)&llMixerLatency, 0);
+ }
- pSample->GetSampleTime (&nsSampleTime);
- REFERENCE_TIME nsDuration;
- pSample->GetSampleDuration (&nsDuration);
+ pSample->GetSampleTime(&nsSampleTime);
+ REFERENCE_TIME nsDuration;
+ pSample->GetSampleDuration(&nsDuration);
- if (GetRenderersData()->m_fTearingTest) {
- RECT rcTearing;
+ if (GetRenderersData()->m_fTearingTest) {
+ RECT rcTearing;
- rcTearing.left = m_nTearingPos;
- rcTearing.top = 0;
- rcTearing.right = rcTearing.left + 4;
- rcTearing.bottom = m_NativeVideoSize.cy;
- m_pD3DDev->ColorFill (m_pVideoSurface[dwSurface], &rcTearing, D3DCOLOR_ARGB (255,255,0,0));
+ rcTearing.left = m_nTearingPos;
+ rcTearing.top = 0;
+ rcTearing.right = rcTearing.left + 4;
+ rcTearing.bottom = m_NativeVideoSize.cy;
+ m_pD3DDev->ColorFill(m_pVideoSurface[dwSurface], &rcTearing, D3DCOLOR_ARGB(255, 255, 0, 0));
- rcTearing.left = (rcTearing.right + 15) % m_NativeVideoSize.cx;
- rcTearing.right = rcTearing.left + 4;
- m_pD3DDev->ColorFill (m_pVideoSurface[dwSurface], &rcTearing, D3DCOLOR_ARGB (255,255,0,0));
- m_nTearingPos = (m_nTearingPos + 7) % m_NativeVideoSize.cx;
- }
+ rcTearing.left = (rcTearing.right + 15) % m_NativeVideoSize.cx;
+ rcTearing.right = rcTearing.left + 4;
+ m_pD3DDev->ColorFill(m_pVideoSurface[dwSurface], &rcTearing, D3DCOLOR_ARGB(255, 255, 0, 0));
+ m_nTearingPos = (m_nTearingPos + 7) % m_NativeVideoSize.cx;
+ }
- TRACE_EVR ("EVR: Get from Mixer : %d (%I64d) (%I64d)\n", dwSurface, nsSampleTime, m_rtTimePerFrame ? nsSampleTime/m_rtTimePerFrame : 0);
+ TRACE_EVR("EVR: Get from Mixer : %d (%I64d) (%I64d)\n", dwSurface, nsSampleTime, m_rtTimePerFrame ? nsSampleTime / m_rtTimePerFrame : 0);
- MoveToScheduledList (pSample, false);
- bDoneSomething = true;
- if (m_rtTimePerFrame == 0) {
- break;
- }
- }
+ MoveToScheduledList(pSample, false);
+ bDoneSomething = true;
+ if (m_rtTimePerFrame == 0) {
+ break;
+ }
+ }
- return bDoneSomething;
+ return bDoneSomething;
}
-STDMETHODIMP CEVRAllocatorPresenter::GetCurrentMediaType(__deref_out IMFVideoMediaType **ppMediaType)
+STDMETHODIMP CEVRAllocatorPresenter::GetCurrentMediaType(__deref_out IMFVideoMediaType** ppMediaType)
{
- HRESULT hr = S_OK;
- CAutoLock lock(this); // Hold the critical section.
+ HRESULT hr = S_OK;
+ CAutoLock lock(this); // Hold the critical section.
- CheckPointer (ppMediaType, E_POINTER);
- CheckHR (CheckShutdown());
+ CheckPointer(ppMediaType, E_POINTER);
+ CheckHR(CheckShutdown());
- if (m_pMediaType == NULL) {
- CheckHR(MF_E_NOT_INITIALIZED);
- }
+ if (m_pMediaType == NULL) {
+ CheckHR(MF_E_NOT_INITIALIZED);
+ }
- CheckHR(m_pMediaType->QueryInterface( __uuidof(IMFVideoMediaType), (void**)&ppMediaType));
+ CheckHR(m_pMediaType->QueryInterface(__uuidof(IMFVideoMediaType), (void**)&ppMediaType));
- return hr;
+ return hr;
}
// IMFTopologyServiceLookupClient
-STDMETHODIMP CEVRAllocatorPresenter::InitServicePointers(/* [in] */ __in IMFTopologyServiceLookup *pLookup)
+STDMETHODIMP CEVRAllocatorPresenter::InitServicePointers(/* [in] */ __in IMFTopologyServiceLookup* pLookup)
{
- HRESULT hr;
- DWORD dwObjects = 1;
+ HRESULT hr;
+ DWORD dwObjects = 1;
- TRACE_EVR ("EVR: CEVRAllocatorPresenter::InitServicePointers\n");
- hr = pLookup->LookupService (MF_SERVICE_LOOKUP_GLOBAL, 0, MR_VIDEO_MIXER_SERVICE,
- __uuidof (IMFTransform), (void**)&m_pMixer, &dwObjects);
+ TRACE_EVR("EVR: CEVRAllocatorPresenter::InitServicePointers\n");
+ hr = pLookup->LookupService(MF_SERVICE_LOOKUP_GLOBAL, 0, MR_VIDEO_MIXER_SERVICE,
+ __uuidof(IMFTransform), (void**)&m_pMixer, &dwObjects);
- hr = pLookup->LookupService (MF_SERVICE_LOOKUP_GLOBAL, 0, MR_VIDEO_RENDER_SERVICE,
- __uuidof (IMediaEventSink ), (void**)&m_pSink, &dwObjects);
+ hr = pLookup->LookupService(MF_SERVICE_LOOKUP_GLOBAL, 0, MR_VIDEO_RENDER_SERVICE,
+ __uuidof(IMediaEventSink), (void**)&m_pSink, &dwObjects);
- hr = pLookup->LookupService (MF_SERVICE_LOOKUP_GLOBAL, 0, MR_VIDEO_RENDER_SERVICE,
- __uuidof (IMFClock ), (void**)&m_pClock, &dwObjects);
+ hr = pLookup->LookupService(MF_SERVICE_LOOKUP_GLOBAL, 0, MR_VIDEO_RENDER_SERVICE,
+ __uuidof(IMFClock), (void**)&m_pClock, &dwObjects);
- StartWorkerThreads();
- return S_OK;
+ StartWorkerThreads();
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::ReleaseServicePointers()
{
- TRACE_EVR ("EVR: CEVRAllocatorPresenter::ReleaseServicePointers\n");
- StopWorkerThreads();
- m_pMixer = NULL;
- m_pSink = NULL;
- m_pClock = NULL;
- return S_OK;
+ TRACE_EVR("EVR: CEVRAllocatorPresenter::ReleaseServicePointers\n");
+ StopWorkerThreads();
+ m_pMixer = NULL;
+ m_pSink = NULL;
+ m_pClock = NULL;
+ return S_OK;
}
// IMFVideoDeviceID
-STDMETHODIMP CEVRAllocatorPresenter::GetDeviceID(/* [out] */ __out IID *pDeviceID)
+STDMETHODIMP CEVRAllocatorPresenter::GetDeviceID(/* [out] */ __out IID* pDeviceID)
{
- CheckPointer(pDeviceID, E_POINTER);
- *pDeviceID = IID_IDirect3DDevice9;
- return S_OK;
+ CheckPointer(pDeviceID, E_POINTER);
+ *pDeviceID = IID_IDirect3DDevice9;
+ return S_OK;
}
// IMFGetService
-STDMETHODIMP CEVRAllocatorPresenter::GetService (/* [in] */ __RPC__in REFGUID guidService,
- /* [in] */ __RPC__in REFIID riid,
- /* [iid_is][out] */ __RPC__deref_out_opt LPVOID *ppvObject)
+STDMETHODIMP CEVRAllocatorPresenter::GetService(/* [in] */ __RPC__in REFGUID guidService,
+ /* [in] */ __RPC__in REFIID riid,
+ /* [iid_is][out] */ __RPC__deref_out_opt LPVOID* ppvObject)
{
- if (guidService == MR_VIDEO_RENDER_SERVICE) {
- return NonDelegatingQueryInterface (riid, ppvObject);
- } else if (guidService == MR_VIDEO_ACCELERATION_SERVICE) {
- return m_pD3DManager->QueryInterface (__uuidof(IDirect3DDeviceManager9), (void**) ppvObject);
- }
+ if (guidService == MR_VIDEO_RENDER_SERVICE) {
+ return NonDelegatingQueryInterface(riid, ppvObject);
+ } else if (guidService == MR_VIDEO_ACCELERATION_SERVICE) {
+ return m_pD3DManager->QueryInterface(__uuidof(IDirect3DDeviceManager9), (void**) ppvObject);
+ }
- return E_NOINTERFACE;
+ return E_NOINTERFACE;
}
// IMFAsyncCallback
-STDMETHODIMP CEVRAllocatorPresenter::GetParameters( /* [out] */ __RPC__out DWORD *pdwFlags, /* [out] */ __RPC__out DWORD *pdwQueue)
+STDMETHODIMP CEVRAllocatorPresenter::GetParameters(/* [out] */ __RPC__out DWORD* pdwFlags, /* [out] */ __RPC__out DWORD* pdwQueue)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
-STDMETHODIMP CEVRAllocatorPresenter::Invoke ( /* [in] */ __RPC__in_opt IMFAsyncResult *pAsyncResult)
+STDMETHODIMP CEVRAllocatorPresenter::Invoke(/* [in] */ __RPC__in_opt IMFAsyncResult* pAsyncResult)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// IMFVideoDisplayControl
-STDMETHODIMP CEVRAllocatorPresenter::GetNativeVideoSize(SIZE *pszVideo, SIZE *pszARVideo)
+STDMETHODIMP CEVRAllocatorPresenter::GetNativeVideoSize(SIZE* pszVideo, SIZE* pszARVideo)
{
- if (pszVideo) {
- pszVideo->cx = m_NativeVideoSize.cx;
- pszVideo->cy = m_NativeVideoSize.cy;
- }
- if (pszARVideo) {
- pszARVideo->cx = m_NativeVideoSize.cx * m_AspectRatio.cx;
- pszARVideo->cy = m_NativeVideoSize.cy * m_AspectRatio.cy;
- }
- return S_OK;
+ if (pszVideo) {
+ pszVideo->cx = m_NativeVideoSize.cx;
+ pszVideo->cy = m_NativeVideoSize.cy;
+ }
+ if (pszARVideo) {
+ pszARVideo->cx = m_NativeVideoSize.cx * m_AspectRatio.cx;
+ pszARVideo->cy = m_NativeVideoSize.cy * m_AspectRatio.cy;
+ }
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::GetIdealVideoSize(SIZE *pszMin, SIZE *pszMax)
+STDMETHODIMP CEVRAllocatorPresenter::GetIdealVideoSize(SIZE* pszMin, SIZE* pszMax)
{
- if (pszMin) {
- pszMin->cx = 1;
- pszMin->cy = 1;
- }
+ if (pszMin) {
+ pszMin->cx = 1;
+ pszMin->cy = 1;
+ }
- if (pszMax) {
- D3DDISPLAYMODE d3ddm;
+ if (pszMax) {
+ D3DDISPLAYMODE d3ddm;
- ZeroMemory(&d3ddm, sizeof(d3ddm));
- if (SUCCEEDED(m_pD3D->GetAdapterDisplayMode(GetAdapter(m_pD3D), &d3ddm))) {
- pszMax->cx = d3ddm.Width;
- pszMax->cy = d3ddm.Height;
- }
- }
+ ZeroMemory(&d3ddm, sizeof(d3ddm));
+ if (SUCCEEDED(m_pD3D->GetAdapterDisplayMode(GetAdapter(m_pD3D), &d3ddm))) {
+ pszMax->cx = d3ddm.Width;
+ pszMax->cy = d3ddm.Height;
+ }
+ }
- return S_OK;
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::SetVideoPosition(const MFVideoNormalizedRect *pnrcSource, const LPRECT prcDest)
+STDMETHODIMP CEVRAllocatorPresenter::SetVideoPosition(const MFVideoNormalizedRect* pnrcSource, const LPRECT prcDest)
{
- return S_OK;
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::GetVideoPosition(MFVideoNormalizedRect *pnrcSource, LPRECT prcDest)
+STDMETHODIMP CEVRAllocatorPresenter::GetVideoPosition(MFVideoNormalizedRect* pnrcSource, LPRECT prcDest)
{
- // Always all source rectangle ?
- if (pnrcSource) {
- pnrcSource->left = 0.0;
- pnrcSource->top = 0.0;
- pnrcSource->right = 1.0;
- pnrcSource->bottom = 1.0;
- }
+ // Always all source rectangle ?
+ if (pnrcSource) {
+ pnrcSource->left = 0.0;
+ pnrcSource->top = 0.0;
+ pnrcSource->right = 1.0;
+ pnrcSource->bottom = 1.0;
+ }
- if (prcDest) {
- memcpy (prcDest, &m_VideoRect, sizeof(m_VideoRect)); //GetClientRect (m_hWnd, prcDest);
- }
+ if (prcDest) {
+ memcpy(prcDest, &m_VideoRect, sizeof(m_VideoRect)); //GetClientRect (m_hWnd, prcDest);
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::SetAspectRatioMode(DWORD dwAspectRatioMode)
{
- m_dwVideoAspectRatioMode = (MFVideoAspectRatioMode)dwAspectRatioMode;
- return S_OK;
+ m_dwVideoAspectRatioMode = (MFVideoAspectRatioMode)dwAspectRatioMode;
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::GetAspectRatioMode(DWORD *pdwAspectRatioMode)
+STDMETHODIMP CEVRAllocatorPresenter::GetAspectRatioMode(DWORD* pdwAspectRatioMode)
{
- CheckPointer (pdwAspectRatioMode, E_POINTER);
- *pdwAspectRatioMode = m_dwVideoAspectRatioMode;
- return S_OK;
+ CheckPointer(pdwAspectRatioMode, E_POINTER);
+ *pdwAspectRatioMode = m_dwVideoAspectRatioMode;
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::SetVideoWindow(HWND hwndVideo)
{
- ASSERT (m_hWnd == hwndVideo); // What if not ??
- // m_hWnd = hwndVideo;
- return S_OK;
+ ASSERT(m_hWnd == hwndVideo); // What if not ??
+ // m_hWnd = hwndVideo;
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::GetVideoWindow(HWND *phwndVideo)
+STDMETHODIMP CEVRAllocatorPresenter::GetVideoWindow(HWND* phwndVideo)
{
- CheckPointer (phwndVideo, E_POINTER);
- *phwndVideo = m_hWnd;
- return S_OK;
+ CheckPointer(phwndVideo, E_POINTER);
+ *phwndVideo = m_hWnd;
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::RepaintVideo()
{
- Paint (true);
- return S_OK;
+ Paint(true);
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::GetCurrentImage(BITMAPINFOHEADER *pBih, BYTE **pDib, DWORD *pcbDib, LONGLONG *pTimeStamp)
+STDMETHODIMP CEVRAllocatorPresenter::GetCurrentImage(BITMAPINFOHEADER* pBih, BYTE** pDib, DWORD* pcbDib, LONGLONG* pTimeStamp)
{
- ASSERT (FALSE);
- return E_NOTIMPL;
+ ASSERT(FALSE);
+ return E_NOTIMPL;
}
STDMETHODIMP CEVRAllocatorPresenter::SetBorderColor(COLORREF Clr)
{
- m_BorderColor = Clr;
- return S_OK;
+ m_BorderColor = Clr;
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::GetBorderColor(COLORREF *pClr)
+STDMETHODIMP CEVRAllocatorPresenter::GetBorderColor(COLORREF* pClr)
{
- CheckPointer (pClr, E_POINTER);
- *pClr = m_BorderColor;
- return S_OK;
+ CheckPointer(pClr, E_POINTER);
+ *pClr = m_BorderColor;
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::SetRenderingPrefs(DWORD dwRenderFlags)
{
- m_dwVideoRenderPrefs = (MFVideoRenderPrefs)dwRenderFlags;
- return S_OK;
+ m_dwVideoRenderPrefs = (MFVideoRenderPrefs)dwRenderFlags;
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::GetRenderingPrefs(DWORD *pdwRenderFlags)
+STDMETHODIMP CEVRAllocatorPresenter::GetRenderingPrefs(DWORD* pdwRenderFlags)
{
- CheckPointer(pdwRenderFlags, E_POINTER);
- *pdwRenderFlags = m_dwVideoRenderPrefs;
- return S_OK;
+ CheckPointer(pdwRenderFlags, E_POINTER);
+ *pdwRenderFlags = m_dwVideoRenderPrefs;
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::SetFullscreen(BOOL fFullscreen)
{
- ASSERT (FALSE);
- return E_NOTIMPL;
+ ASSERT(FALSE);
+ return E_NOTIMPL;
}
-STDMETHODIMP CEVRAllocatorPresenter::GetFullscreen(BOOL *pfFullscreen)
+STDMETHODIMP CEVRAllocatorPresenter::GetFullscreen(BOOL* pfFullscreen)
{
- ASSERT (FALSE);
- return E_NOTIMPL;
+ ASSERT(FALSE);
+ return E_NOTIMPL;
}
// IEVRTrustedVideoPlugin
-STDMETHODIMP CEVRAllocatorPresenter::IsInTrustedVideoMode(BOOL *pYes)
+STDMETHODIMP CEVRAllocatorPresenter::IsInTrustedVideoMode(BOOL* pYes)
{
- CheckPointer(pYes, E_POINTER);
- *pYes = TRUE;
- return S_OK;
+ CheckPointer(pYes, E_POINTER);
+ *pYes = TRUE;
+ return S_OK;
}
-STDMETHODIMP CEVRAllocatorPresenter::CanConstrict(BOOL *pYes)
+STDMETHODIMP CEVRAllocatorPresenter::CanConstrict(BOOL* pYes)
{
- CheckPointer(pYes, E_POINTER);
- *pYes = TRUE;
- return S_OK;
+ CheckPointer(pYes, E_POINTER);
+ *pYes = TRUE;
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::SetConstriction(DWORD dwKPix)
{
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::DisableImageExport(BOOL bDisable)
{
- return S_OK;
+ return S_OK;
}
// IDirect3DDeviceManager9
-STDMETHODIMP CEVRAllocatorPresenter::ResetDevice(IDirect3DDevice9 *pDevice,UINT resetToken)
+STDMETHODIMP CEVRAllocatorPresenter::ResetDevice(IDirect3DDevice9* pDevice, UINT resetToken)
{
- HRESULT hr = m_pD3DManager->ResetDevice (pDevice, resetToken);
- return hr;
+ HRESULT hr = m_pD3DManager->ResetDevice(pDevice, resetToken);
+ return hr;
}
-STDMETHODIMP CEVRAllocatorPresenter::OpenDeviceHandle(HANDLE *phDevice)
+STDMETHODIMP CEVRAllocatorPresenter::OpenDeviceHandle(HANDLE* phDevice)
{
- HRESULT hr = m_pD3DManager->OpenDeviceHandle (phDevice);
- return hr;
+ HRESULT hr = m_pD3DManager->OpenDeviceHandle(phDevice);
+ return hr;
}
STDMETHODIMP CEVRAllocatorPresenter::CloseDeviceHandle(HANDLE hDevice)
{
- HRESULT hr = m_pD3DManager->CloseDeviceHandle(hDevice);
- return hr;
+ HRESULT hr = m_pD3DManager->CloseDeviceHandle(hDevice);
+ return hr;
}
STDMETHODIMP CEVRAllocatorPresenter::TestDevice(HANDLE hDevice)
{
- HRESULT hr = m_pD3DManager->TestDevice(hDevice);
- return hr;
+ HRESULT hr = m_pD3DManager->TestDevice(hDevice);
+ return hr;
}
-STDMETHODIMP CEVRAllocatorPresenter::LockDevice(HANDLE hDevice, IDirect3DDevice9 **ppDevice, BOOL fBlock)
+STDMETHODIMP CEVRAllocatorPresenter::LockDevice(HANDLE hDevice, IDirect3DDevice9** ppDevice, BOOL fBlock)
{
- HRESULT hr = m_pD3DManager->LockDevice(hDevice, ppDevice, fBlock);
- return hr;
+ HRESULT hr = m_pD3DManager->LockDevice(hDevice, ppDevice, fBlock);
+ return hr;
}
STDMETHODIMP CEVRAllocatorPresenter::UnlockDevice(HANDLE hDevice, BOOL fSaveState)
{
- HRESULT hr = m_pD3DManager->UnlockDevice(hDevice, fSaveState);
- return hr;
+ HRESULT hr = m_pD3DManager->UnlockDevice(hDevice, fSaveState);
+ return hr;
}
-STDMETHODIMP CEVRAllocatorPresenter::GetVideoService(HANDLE hDevice, REFIID riid, void **ppService)
+STDMETHODIMP CEVRAllocatorPresenter::GetVideoService(HANDLE hDevice, REFIID riid, void** ppService)
{
- HRESULT hr = m_pD3DManager->GetVideoService(hDevice, riid, ppService);
+ HRESULT hr = m_pD3DManager->GetVideoService(hDevice, riid, ppService);
- if (riid == __uuidof(IDirectXVideoDecoderService)) {
- UINT nNbDecoder = 5;
- GUID* pDecoderGuid;
- IDirectXVideoDecoderService* pDXVAVideoDecoder = (IDirectXVideoDecoderService*) *ppService;
- pDXVAVideoDecoder->GetDecoderDeviceGuids (&nNbDecoder, &pDecoderGuid);
- } else if (riid == __uuidof(IDirectXVideoProcessorService)) {
- IDirectXVideoProcessorService* pDXVAProcessor = (IDirectXVideoProcessorService*) *ppService;
- UNREFERENCED_PARAMETER(pDXVAProcessor);
- }
+ if (riid == __uuidof(IDirectXVideoDecoderService)) {
+ UINT nNbDecoder = 5;
+ GUID* pDecoderGuid;
+ IDirectXVideoDecoderService* pDXVAVideoDecoder = (IDirectXVideoDecoderService*) *ppService;
+ pDXVAVideoDecoder->GetDecoderDeviceGuids(&nNbDecoder, &pDecoderGuid);
+ } else if (riid == __uuidof(IDirectXVideoProcessorService)) {
+ IDirectXVideoProcessorService* pDXVAProcessor = (IDirectXVideoProcessorService*) *ppService;
+ UNREFERENCED_PARAMETER(pDXVAProcessor);
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CEVRAllocatorPresenter::GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight)
{
- // This function should be called...
- ASSERT (FALSE);
+ // This function should be called...
+ ASSERT(FALSE);
- if (lpWidth) {
- *lpWidth = m_NativeVideoSize.cx;
- }
- if (lpHeight) {
- *lpHeight = m_NativeVideoSize.cy;
- }
- if (lpARWidth) {
- *lpARWidth = m_AspectRatio.cx;
- }
- if (lpARHeight) {
- *lpARHeight = m_AspectRatio.cy;
- }
- return S_OK;
+ if (lpWidth) {
+ *lpWidth = m_NativeVideoSize.cx;
+ }
+ if (lpHeight) {
+ *lpHeight = m_NativeVideoSize.cy;
+ }
+ if (lpARWidth) {
+ *lpARWidth = m_AspectRatio.cx;
+ }
+ if (lpARHeight) {
+ *lpARHeight = m_AspectRatio.cy;
+ }
+ return S_OK;
}
STDMETHODIMP CEVRAllocatorPresenter::InitializeDevice(IMFMediaType* pMediaType)
{
- HRESULT hr;
- CAutoLock lock(this);
- CAutoLock lock2(&m_ImageProcessingLock);
- CAutoLock cRenderLock(&m_RenderLock);
+ HRESULT hr;
+ CAutoLock lock(this);
+ CAutoLock lock2(&m_ImageProcessingLock);
+ CAutoLock cRenderLock(&m_RenderLock);
- RemoveAllSamples();
- DeleteSurfaces();
+ RemoveAllSamples();
+ DeleteSurfaces();
- // Retrieve the surface size and format
- UINT32 Width;
- UINT32 Height;
- hr = MFGetAttributeSize(pMediaType, MF_MT_FRAME_SIZE, &Width, &Height);
+ // Retrieve the surface size and format
+ UINT32 Width;
+ UINT32 Height;
+ hr = MFGetAttributeSize(pMediaType, MF_MT_FRAME_SIZE, &Width, &Height);
- D3DFORMAT Format;
- if (SUCCEEDED(hr)) {
- m_NativeVideoSize = CSize(Width, Height);
- hr = GetMediaTypeFourCC(pMediaType, (DWORD*)&Format);
- }
+ D3DFORMAT Format;
+ if (SUCCEEDED(hr)) {
+ m_NativeVideoSize = CSize(Width, Height);
+ hr = GetMediaTypeFourCC(pMediaType, (DWORD*)&Format);
+ }
- if (SUCCEEDED(hr)) {
- hr = AllocSurfaces();
- }
+ if (SUCCEEDED(hr)) {
+ hr = AllocSurfaces();
+ }
- if (SUCCEEDED(hr)) {
- for (int i = 0; i < m_nNbDXSurface; i++) {
- CComPtr<IMFSample> pMFSample;
- hr = pfMFCreateVideoSampleFromSurface (m_pVideoSurface[i], &pMFSample);
+ if (SUCCEEDED(hr)) {
+ for (int i = 0; i < m_nNbDXSurface; i++) {
+ CComPtr<IMFSample> pMFSample;
+ hr = pfMFCreateVideoSampleFromSurface(m_pVideoSurface[i], &pMFSample);
- if (SUCCEEDED (hr)) {
- pMFSample->SetUINT32 (GUID_SURFACE_INDEX, i);
- m_FreeSamples.AddTail (pMFSample);
- }
- ASSERT (SUCCEEDED (hr));
- }
- }
+ if (SUCCEEDED(hr)) {
+ pMFSample->SetUINT32(GUID_SURFACE_INDEX, i);
+ m_FreeSamples.AddTail(pMFSample);
+ }
+ ASSERT(SUCCEEDED(hr));
+ }
+ }
- return hr;
+ return hr;
}
DWORD WINAPI CEVRAllocatorPresenter::GetMixerThreadStatic(LPVOID lpParam)
{
- SetThreadName((DWORD)-1, "CEVRPresenter::MixerThread");
- CEVRAllocatorPresenter* pThis = (CEVRAllocatorPresenter*) lpParam;
- pThis->GetMixerThread();
- return 0;
+ SetThreadName((DWORD) - 1, "CEVRPresenter::MixerThread");
+ CEVRAllocatorPresenter* pThis = (CEVRAllocatorPresenter*) lpParam;
+ pThis->GetMixerThread();
+ return 0;
}
DWORD WINAPI CEVRAllocatorPresenter::PresentThread(LPVOID lpParam)
{
- SetThreadName((DWORD)-1, "CEVRPresenter::PresentThread");
- CEVRAllocatorPresenter* pThis = (CEVRAllocatorPresenter*) lpParam;
- pThis->RenderThread();
- return 0;
+ SetThreadName((DWORD) - 1, "CEVRPresenter::PresentThread");
+ CEVRAllocatorPresenter* pThis = (CEVRAllocatorPresenter*) lpParam;
+ pThis->RenderThread();
+ return 0;
}
void CEVRAllocatorPresenter::CheckWaitingSampleFromMixer()
{
- if (m_bWaitingSample) {
- m_bWaitingSample = false;
- //GetImageFromMixer(); // Do this in processing thread instead
- }
+ if (m_bWaitingSample) {
+ m_bWaitingSample = false;
+ //GetImageFromMixer(); // Do this in processing thread instead
+ }
}
bool ExtractInterlaced(const AM_MEDIA_TYPE* pmt)
{
- if (pmt->formattype==FORMAT_VideoInfo) {
- return false;
- } else if (pmt->formattype==FORMAT_VideoInfo2) {
- return (((VIDEOINFOHEADER2*)pmt->pbFormat)->dwInterlaceFlags & AMINTERLACE_IsInterlaced) != 0;
- } else if (pmt->formattype==FORMAT_MPEGVideo) {
- return false;
- } else if (pmt->formattype==FORMAT_MPEG2Video) {
- return (((MPEG2VIDEOINFO*)pmt->pbFormat)->hdr.dwInterlaceFlags & AMINTERLACE_IsInterlaced) != 0;
- } else {
- return false;
- }
+ if (pmt->formattype == FORMAT_VideoInfo) {
+ return false;
+ } else if (pmt->formattype == FORMAT_VideoInfo2) {
+ return (((VIDEOINFOHEADER2*)pmt->pbFormat)->dwInterlaceFlags & AMINTERLACE_IsInterlaced) != 0;
+ } else if (pmt->formattype == FORMAT_MPEGVideo) {
+ return false;
+ } else if (pmt->formattype == FORMAT_MPEG2Video) {
+ return (((MPEG2VIDEOINFO*)pmt->pbFormat)->hdr.dwInterlaceFlags & AMINTERLACE_IsInterlaced) != 0;
+ } else {
+ return false;
+ }
}
void CEVRAllocatorPresenter::GetMixerThread()
{
- //HANDLE hAvrt;
- HANDLE hEvts[] = { m_hEvtQuit};
- bool bQuit = false;
- TIMECAPS tc;
- DWORD dwResolution;
- DWORD dwUser = 0;
- //DWORD dwTaskIndex = 0;
-
- // Tell Vista Multimedia Class Scheduler we are a playback thretad (increase priority)
- // if (pfAvSetMmThreadCharacteristicsW)
- // hAvrt = pfAvSetMmThreadCharacteristicsW (L"Playback", &dwTaskIndex);
- // if (pfAvSetMmThreadPriority)
- // pfAvSetMmThreadPriority (hAvrt, AVRT_PRIORITY_HIGH /*AVRT_PRIORITY_CRITICAL*/);
-
- timeGetDevCaps(&tc, sizeof(TIMECAPS));
- dwResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
- dwUser = timeBeginPeriod(dwResolution);
-
- while (!bQuit) {
- DWORD dwObject = WaitForMultipleObjects (_countof(hEvts), hEvts, FALSE, 1);
- switch (dwObject) {
- case WAIT_OBJECT_0 :
- bQuit = true;
- break;
- case WAIT_TIMEOUT : {
- if (GetRenderersData()->m_fDisplayStats) {
- CComPtr<IPin> pPin;
- CComPtr<IPin> pPinTo;
- if (SUCCEEDED (m_pOuterEVR->FindPin(L"EVR Input0", &pPin)) &&
- SUCCEEDED(pPin->ConnectedTo(&pPinTo)) && pPinTo) {
- if (CComPtr<IBaseFilter> pFilter = GetFilterFromPin(pPinTo) ) {
- if (CComQIPtr<IMPCVideoDecFilter2> MPCVideoDecFilter = pFilter ) {
- m_nFrameType = (FF_FIELD_TYPE)MPCVideoDecFilter->GetFrameType();
- }
- }
- }
- }
-
- bool bDoneSomething = false;
- {
- CAutoLock AutoLock(&m_ImageProcessingLock);
- bDoneSomething = GetImageFromMixer();
- }
- if (m_rtTimePerFrame == 0 && bDoneSomething) {
- //CAutoLock lock(this);
- //CAutoLock lock2(&m_ImageProcessingLock);
- //CAutoLock cRenderLock(&m_RenderLock);
-
- // Use the code from VMR9 to get the movie fps, as this method is reliable.
- CComPtr<IPin> pPin;
- CMediaType mt;
- if (
- SUCCEEDED (m_pOuterEVR->FindPin(L"EVR Input0", &pPin)) &&
- SUCCEEDED (pPin->ConnectionMediaType(&mt)) ) {
-
- ExtractAvgTimePerFrame (&mt, m_rtTimePerFrame);
-
- m_bInterlaced = ExtractInterlaced(&mt);
-
- CComPtr<IPin> pPinTo;
- if (SUCCEEDED(pPin->ConnectedTo(&pPinTo)) && pPinTo) {
- m_Decoder = GetFilterName(GetFilterFromPin(pPinTo));
- }
- }
- // If framerate not set by Video Decoder choose 23.97...
- if (m_rtTimePerFrame == 0) {
- m_rtTimePerFrame = 417166;
- }
-
- // Update internal subtitle clock
- if (m_fUseInternalTimer && m_pSubPicQueue) {
- m_fps = (float)(10000000.0 / m_rtTimePerFrame);
- m_pSubPicQueue->SetFPS(m_fps);
- }
-
- }
-
- }
- break;
- }
- }
-
- timeEndPeriod (dwResolution);
- // if (pfAvRevertMmThreadCharacteristics) pfAvRevertMmThreadCharacteristics (hAvrt);
+ //HANDLE hAvrt;
+ HANDLE hEvts[] = { m_hEvtQuit};
+ bool bQuit = false;
+ TIMECAPS tc;
+ DWORD dwResolution;
+ DWORD dwUser = 0;
+ //DWORD dwTaskIndex = 0;
+
+ // Tell Vista Multimedia Class Scheduler we are a playback thretad (increase priority)
+ // if (pfAvSetMmThreadCharacteristicsW)
+ // hAvrt = pfAvSetMmThreadCharacteristicsW (L"Playback", &dwTaskIndex);
+ // if (pfAvSetMmThreadPriority)
+ // pfAvSetMmThreadPriority (hAvrt, AVRT_PRIORITY_HIGH /*AVRT_PRIORITY_CRITICAL*/);
+
+ timeGetDevCaps(&tc, sizeof(TIMECAPS));
+ dwResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
+ dwUser = timeBeginPeriod(dwResolution);
+
+ while (!bQuit) {
+ DWORD dwObject = WaitForMultipleObjects(_countof(hEvts), hEvts, FALSE, 1);
+ switch (dwObject) {
+ case WAIT_OBJECT_0 :
+ bQuit = true;
+ break;
+ case WAIT_TIMEOUT : {
+ if (GetRenderersData()->m_fDisplayStats) {
+ CComPtr<IPin> pPin;
+ CComPtr<IPin> pPinTo;
+ if (SUCCEEDED(m_pOuterEVR->FindPin(L"EVR Input0", &pPin)) &&
+ SUCCEEDED(pPin->ConnectedTo(&pPinTo)) && pPinTo) {
+ if (CComPtr<IBaseFilter> pFilter = GetFilterFromPin(pPinTo)) {
+ if (CComQIPtr<IMPCVideoDecFilter2> MPCVideoDecFilter = pFilter) {
+ m_nFrameType = (FF_FIELD_TYPE)MPCVideoDecFilter->GetFrameType();
+ }
+ }
+ }
+ }
+
+ bool bDoneSomething = false;
+ {
+ CAutoLock AutoLock(&m_ImageProcessingLock);
+ bDoneSomething = GetImageFromMixer();
+ }
+ if (m_rtTimePerFrame == 0 && bDoneSomething) {
+ //CAutoLock lock(this);
+ //CAutoLock lock2(&m_ImageProcessingLock);
+ //CAutoLock cRenderLock(&m_RenderLock);
+
+ // Use the code from VMR9 to get the movie fps, as this method is reliable.
+ CComPtr<IPin> pPin;
+ CMediaType mt;
+ if (
+ SUCCEEDED(m_pOuterEVR->FindPin(L"EVR Input0", &pPin)) &&
+ SUCCEEDED(pPin->ConnectionMediaType(&mt))) {
+
+ ExtractAvgTimePerFrame(&mt, m_rtTimePerFrame);
+
+ m_bInterlaced = ExtractInterlaced(&mt);
+
+ CComPtr<IPin> pPinTo;
+ if (SUCCEEDED(pPin->ConnectedTo(&pPinTo)) && pPinTo) {
+ m_Decoder = GetFilterName(GetFilterFromPin(pPinTo));
+ }
+ }
+ // If framerate not set by Video Decoder choose 23.97...
+ if (m_rtTimePerFrame == 0) {
+ m_rtTimePerFrame = 417166;
+ }
+
+ // Update internal subtitle clock
+ if (m_fUseInternalTimer && m_pSubPicQueue) {
+ m_fps = (float)(10000000.0 / m_rtTimePerFrame);
+ m_pSubPicQueue->SetFPS(m_fps);
+ }
+
+ }
+
+ }
+ break;
+ }
+ }
+
+ timeEndPeriod(dwResolution);
+ // if (pfAvRevertMmThreadCharacteristics) pfAvRevertMmThreadCharacteristics (hAvrt);
}
void ModerateFloat(double& Value, double Target, double& ValuePrim, double ChangeSpeed)
{
- double xbiss = (-(ChangeSpeed)*(ValuePrim) - (Value-Target)*(ChangeSpeed*ChangeSpeed)*0.25f);
- ValuePrim += xbiss;
- Value += ValuePrim;
+ double xbiss = (-(ChangeSpeed) * (ValuePrim) - (Value - Target) * (ChangeSpeed * ChangeSpeed) * 0.25f);
+ ValuePrim += xbiss;
+ Value += ValuePrim;
}
LONGLONG CEVRAllocatorPresenter::GetClockTime(LONGLONG PerformanceCounter)
{
- LONGLONG llClockTime;
- MFTIME nsCurrentTime;
- m_pClock->GetCorrelatedTime(0, &llClockTime, &nsCurrentTime);
- DWORD Characteristics = 0;
- m_pClock->GetClockCharacteristics(&Characteristics);
- MFCLOCK_STATE State;
- m_pClock->GetState(0, &State);
-
- if (!(Characteristics & MFCLOCK_CHARACTERISTICS_FLAG_FREQUENCY_10MHZ)) {
- MFCLOCK_PROPERTIES Props;
- if (m_pClock->GetProperties(&Props) == S_OK) {
- llClockTime = (llClockTime * 10000000) / Props.qwClockFrequency; // Make 10 MHz
- }
-
- }
- LONGLONG llPerf = PerformanceCounter;
- // return llClockTime + (llPerf - nsCurrentTime);
- double Target = llClockTime + (llPerf - nsCurrentTime) * m_ModeratedTimeSpeed;
-
- bool bReset = false;
- if (m_ModeratedTimeLast < 0 || State != m_LastClockState || m_ModeratedClockLast < 0) {
- bReset = true;
- m_ModeratedTimeLast = llPerf;
- m_ModeratedClockLast = llClockTime;
- }
-
- m_LastClockState = State;
-
- LONGLONG TimeChangeM = llPerf - m_ModeratedTimeLast;
- LONGLONG ClockChangeM = llClockTime - m_ModeratedClockLast;
- UNREFERENCED_PARAMETER(ClockChangeM);
-
- m_ModeratedTimeLast = llPerf;
- m_ModeratedClockLast = llClockTime;
+ LONGLONG llClockTime;
+ MFTIME nsCurrentTime;
+ m_pClock->GetCorrelatedTime(0, &llClockTime, &nsCurrentTime);
+ DWORD Characteristics = 0;
+ m_pClock->GetClockCharacteristics(&Characteristics);
+ MFCLOCK_STATE State;
+ m_pClock->GetState(0, &State);
+
+ if (!(Characteristics & MFCLOCK_CHARACTERISTICS_FLAG_FREQUENCY_10MHZ)) {
+ MFCLOCK_PROPERTIES Props;
+ if (m_pClock->GetProperties(&Props) == S_OK) {
+ llClockTime = (llClockTime * 10000000) / Props.qwClockFrequency; // Make 10 MHz
+ }
+
+ }
+ LONGLONG llPerf = PerformanceCounter;
+ // return llClockTime + (llPerf - nsCurrentTime);
+ double Target = llClockTime + (llPerf - nsCurrentTime) * m_ModeratedTimeSpeed;
+
+ bool bReset = false;
+ if (m_ModeratedTimeLast < 0 || State != m_LastClockState || m_ModeratedClockLast < 0) {
+ bReset = true;
+ m_ModeratedTimeLast = llPerf;
+ m_ModeratedClockLast = llClockTime;
+ }
+
+ m_LastClockState = State;
+
+ LONGLONG TimeChangeM = llPerf - m_ModeratedTimeLast;
+ LONGLONG ClockChangeM = llClockTime - m_ModeratedClockLast;
+ UNREFERENCED_PARAMETER(ClockChangeM);
+
+ m_ModeratedTimeLast = llPerf;
+ m_ModeratedClockLast = llClockTime;
#if 1
- if (bReset) {
- m_ModeratedTimeSpeed = 1.0;
- m_ModeratedTimeSpeedPrim = 0.0;
- ZeroMemory(m_TimeChangeHistory, sizeof(m_TimeChangeHistory));
- ZeroMemory(m_ClockChangeHistory, sizeof(m_ClockChangeHistory));
- m_ClockTimeChangeHistoryPos = 0;
- }
- if (TimeChangeM) {
- int Pos = m_ClockTimeChangeHistoryPos % 100;
- int nHistory = min(m_ClockTimeChangeHistoryPos, 100);
- ++m_ClockTimeChangeHistoryPos;
- if (nHistory > 50) {
- int iLastPos = (Pos - (nHistory)) % 100;
- if (iLastPos < 0) {
- iLastPos += 100;
- }
-
- double TimeChange = llPerf - m_TimeChangeHistory[iLastPos];
- double ClockChange = llClockTime - m_ClockChangeHistory[iLastPos];
-
- double ClockSpeedTarget = ClockChange / TimeChange;
- double ChangeSpeed = 0.1;
- if (ClockSpeedTarget > m_ModeratedTimeSpeed) {
- if (ClockSpeedTarget / m_ModeratedTimeSpeed > 0.1) {
- ChangeSpeed = 0.1;
- } else {
- ChangeSpeed = 0.01;
- }
- } else {
- if (m_ModeratedTimeSpeed / ClockSpeedTarget > 0.1) {
- ChangeSpeed = 0.1;
- } else {
- ChangeSpeed = 0.01;
- }
- }
- ModerateFloat(m_ModeratedTimeSpeed, ClockSpeedTarget, m_ModeratedTimeSpeedPrim, ChangeSpeed);
- // m_ModeratedTimeSpeed = TimeChange / ClockChange;
- }
- m_TimeChangeHistory[Pos] = (double)llPerf;
- m_ClockChangeHistory[Pos] = (double)llClockTime;
- }
-
- return (LONGLONG)Target;
+ if (bReset) {
+ m_ModeratedTimeSpeed = 1.0;
+ m_ModeratedTimeSpeedPrim = 0.0;
+ ZeroMemory(m_TimeChangeHistory, sizeof(m_TimeChangeHistory));
+ ZeroMemory(m_ClockChangeHistory, sizeof(m_ClockChangeHistory));
+ m_ClockTimeChangeHistoryPos = 0;
+ }
+ if (TimeChangeM) {
+ int Pos = m_ClockTimeChangeHistoryPos % 100;
+ int nHistory = min(m_ClockTimeChangeHistoryPos, 100);
+ ++m_ClockTimeChangeHistoryPos;
+ if (nHistory > 50) {
+ int iLastPos = (Pos - (nHistory)) % 100;
+ if (iLastPos < 0) {
+ iLastPos += 100;
+ }
+
+ double TimeChange = llPerf - m_TimeChangeHistory[iLastPos];
+ double ClockChange = llClockTime - m_ClockChangeHistory[iLastPos];
+
+ double ClockSpeedTarget = ClockChange / TimeChange;
+ double ChangeSpeed = 0.1;
+ if (ClockSpeedTarget > m_ModeratedTimeSpeed) {
+ if (ClockSpeedTarget / m_ModeratedTimeSpeed > 0.1) {
+ ChangeSpeed = 0.1;
+ } else {
+ ChangeSpeed = 0.01;
+ }
+ } else {
+ if (m_ModeratedTimeSpeed / ClockSpeedTarget > 0.1) {
+ ChangeSpeed = 0.1;
+ } else {
+ ChangeSpeed = 0.01;
+ }
+ }
+ ModerateFloat(m_ModeratedTimeSpeed, ClockSpeedTarget, m_ModeratedTimeSpeedPrim, ChangeSpeed);
+ // m_ModeratedTimeSpeed = TimeChange / ClockChange;
+ }
+ m_TimeChangeHistory[Pos] = (double)llPerf;
+ m_ClockChangeHistory[Pos] = (double)llClockTime;
+ }
+
+ return (LONGLONG)Target;
#else
- double EstimateTime = m_ModeratedTime + TimeChange * m_ModeratedTimeSpeed + m_ClockDiffCalc;
- double Diff = Target - EstimateTime;
-
- // > 5 ms just set it
- if ((fabs(Diff) > 50000.0 || bReset)) {
-
- // TRACE_EVR("EVR: Reset clock at diff: %f ms\n", (m_ModeratedTime - Target) /10000.0);
- if (State == MFCLOCK_STATE_RUNNING) {
- if (bReset) {
- m_ModeratedTimeSpeed = 1.0;
- m_ModeratedTimeSpeedPrim = 0.0;
- m_ClockDiffCalc = 0;
- m_ClockDiffPrim = 0;
- m_ModeratedTime = Target;
- m_ModeratedTimer = llPerf;
- } else {
- EstimateTime = m_ModeratedTime + TimeChange * m_ModeratedTimeSpeed;
- Diff = Target - EstimateTime;
- m_ClockDiffCalc = Diff;
- m_ClockDiffPrim = 0;
- }
- } else {
- m_ModeratedTimeSpeed = 0.0;
- m_ModeratedTimeSpeedPrim = 0.0;
- m_ClockDiffCalc = 0;
- m_ClockDiffPrim = 0;
- m_ModeratedTime = Target;
- m_ModeratedTimer = llPerf;
- }
- }
-
- {
- LONGLONG ModerateTime = 10000;
- double ChangeSpeed = 1.00;
- /* if (m_ModeratedTimeSpeedPrim != 0.0)
- {
- if (m_ModeratedTimeSpeedPrim < 0.1)
- ChangeSpeed = 0.1;
- }*/
-
- int nModerate = 0;
- double Change = 0;
- while (m_ModeratedTimer < llPerf - ModerateTime) {
- m_ModeratedTimer += ModerateTime;
- m_ModeratedTime += double(ModerateTime) * m_ModeratedTimeSpeed;
-
- double TimerDiff = llPerf - m_ModeratedTimer;
-
- double Diff = (double)(m_ModeratedTime - (Target - TimerDiff));
-
- double TimeSpeedTarget;
- double AbsDiff = fabs(Diff);
- TimeSpeedTarget = 1.0 - (Diff / 1000000.0);
- // TimeSpeedTarget = m_ModeratedTimeSpeed - (Diff / 100000000000.0);
- //if (AbsDiff > 20000.0)
- // TimeSpeedTarget = 1.0 - (Diff / 1000000.0);
- /*else if (AbsDiff > 5000.0)
- TimeSpeedTarget = 1.0 - (Diff / 100000000.0);
- else
- TimeSpeedTarget = 1.0 - (Diff / 500000000.0);*/
- double StartMod = m_ModeratedTimeSpeed;
- ModerateFloat(m_ModeratedTimeSpeed, TimeSpeedTarget, m_ModeratedTimeSpeedPrim, ChangeSpeed);
- m_ModeratedTimeSpeed = TimeSpeedTarget;
- ++nModerate;
- Change += m_ModeratedTimeSpeed - StartMod;
- }
- if (nModerate) {
- m_ModeratedTimeSpeedDiff = Change / nModerate;
- }
-
- double Ret = m_ModeratedTime + double(llPerf - m_ModeratedTimer) * m_ModeratedTimeSpeed;
- double Diff = Target - Ret;
- ModerateFloat(m_ClockDiffCalc, Diff, m_ClockDiffPrim, ChangeSpeed*0.1);
-
- Ret += m_ClockDiffCalc;
- Diff = Target - Ret;
- m_ClockDiff = Diff;
- return LONGLONG(Ret + 0.5);
- }
-
- return Target;
- return LONGLONG(m_ModeratedTime + 0.5);
+ double EstimateTime = m_ModeratedTime + TimeChange * m_ModeratedTimeSpeed + m_ClockDiffCalc;
+ double Diff = Target - EstimateTime;
+
+ // > 5 ms just set it
+ if ((fabs(Diff) > 50000.0 || bReset)) {
+
+ // TRACE_EVR("EVR: Reset clock at diff: %f ms\n", (m_ModeratedTime - Target) /10000.0);
+ if (State == MFCLOCK_STATE_RUNNING) {
+ if (bReset) {
+ m_ModeratedTimeSpeed = 1.0;
+ m_ModeratedTimeSpeedPrim = 0.0;
+ m_ClockDiffCalc = 0;
+ m_ClockDiffPrim = 0;
+ m_ModeratedTime = Target;
+ m_ModeratedTimer = llPerf;
+ } else {
+ EstimateTime = m_ModeratedTime + TimeChange * m_ModeratedTimeSpeed;
+ Diff = Target - EstimateTime;
+ m_ClockDiffCalc = Diff;
+ m_ClockDiffPrim = 0;
+ }
+ } else {
+ m_ModeratedTimeSpeed = 0.0;
+ m_ModeratedTimeSpeedPrim = 0.0;
+ m_ClockDiffCalc = 0;
+ m_ClockDiffPrim = 0;
+ m_ModeratedTime = Target;
+ m_ModeratedTimer = llPerf;
+ }
+ }
+
+ {
+ LONGLONG ModerateTime = 10000;
+ double ChangeSpeed = 1.00;
+ /* if (m_ModeratedTimeSpeedPrim != 0.0)
+ {
+ if (m_ModeratedTimeSpeedPrim < 0.1)
+ ChangeSpeed = 0.1;
+ }*/
+
+ int nModerate = 0;
+ double Change = 0;
+ while (m_ModeratedTimer < llPerf - ModerateTime) {
+ m_ModeratedTimer += ModerateTime;
+ m_ModeratedTime += double(ModerateTime) * m_ModeratedTimeSpeed;
+
+ double TimerDiff = llPerf - m_ModeratedTimer;
+
+ double Diff = (double)(m_ModeratedTime - (Target - TimerDiff));
+
+ double TimeSpeedTarget;
+ double AbsDiff = fabs(Diff);
+ TimeSpeedTarget = 1.0 - (Diff / 1000000.0);
+ // TimeSpeedTarget = m_ModeratedTimeSpeed - (Diff / 100000000000.0);
+ //if (AbsDiff > 20000.0)
+ // TimeSpeedTarget = 1.0 - (Diff / 1000000.0);
+ /*else if (AbsDiff > 5000.0)
+ TimeSpeedTarget = 1.0 - (Diff / 100000000.0);
+ else
+ TimeSpeedTarget = 1.0 - (Diff / 500000000.0);*/
+ double StartMod = m_ModeratedTimeSpeed;
+ ModerateFloat(m_ModeratedTimeSpeed, TimeSpeedTarget, m_ModeratedTimeSpeedPrim, ChangeSpeed);
+ m_ModeratedTimeSpeed = TimeSpeedTarget;
+ ++nModerate;
+ Change += m_ModeratedTimeSpeed - StartMod;
+ }
+ if (nModerate) {
+ m_ModeratedTimeSpeedDiff = Change / nModerate;
+ }
+
+ double Ret = m_ModeratedTime + double(llPerf - m_ModeratedTimer) * m_ModeratedTimeSpeed;
+ double Diff = Target - Ret;
+ ModerateFloat(m_ClockDiffCalc, Diff, m_ClockDiffPrim, ChangeSpeed * 0.1);
+
+ Ret += m_ClockDiffCalc;
+ Diff = Target - Ret;
+ m_ClockDiff = Diff;
+ return LONGLONG(Ret + 0.5);
+ }
+
+ return Target;
+ return LONGLONG(m_ModeratedTime + 0.5);
#endif
}
void CEVRAllocatorPresenter::OnVBlankFinished(bool fAll, LONGLONG PerformanceCounter)
{
- if (!m_pCurrentDisplaydSample || !m_OrderedPaint || !fAll) {
- return;
- }
-
- LONGLONG llClockTime;
- LONGLONG nsSampleTime;
- LONGLONG SampleDuration = 0;
- if (!m_bSignaledStarvation) {
- llClockTime = GetClockTime(PerformanceCounter);
- m_StarvationClock = llClockTime;
- } else {
- llClockTime = m_StarvationClock;
- }
- if (FAILED(m_pCurrentDisplaydSample->GetSampleDuration(&SampleDuration))) {
- SampleDuration = 0;
- }
-
- if (FAILED(m_pCurrentDisplaydSample->GetSampleTime(&nsSampleTime))) {
- nsSampleTime = llClockTime;
- }
- LONGLONG TimePerFrame = m_rtTimePerFrame;
- if (!TimePerFrame) {
- return;
- }
- if (SampleDuration > 1) {
- TimePerFrame = SampleDuration;
- }
- {
- m_nNextSyncOffset = (m_nNextSyncOffset+1) % NB_JITTER;
- LONGLONG SyncOffset = nsSampleTime - llClockTime;
-
- m_pllSyncOffset[m_nNextSyncOffset] = SyncOffset;
- // TRACE_EVR("EVR: SyncOffset(%d, %d): %8I64d %8I64d %8I64d \n", m_nCurSurface, m_VSyncMode, m_LastPredictedSync, -SyncOffset, m_LastPredictedSync - (-SyncOffset));
-
- m_MaxSyncOffset = MINLONG64;
- m_MinSyncOffset = MAXLONG64;
-
- LONGLONG AvrageSum = 0;
- for (int i=0; i<NB_JITTER; i++) {
- LONGLONG Offset = m_pllSyncOffset[i];
- AvrageSum += Offset;
- m_MaxSyncOffset = max(m_MaxSyncOffset, Offset);
- m_MinSyncOffset = min(m_MinSyncOffset, Offset);
- }
- double MeanOffset = double(AvrageSum)/NB_JITTER;
- double DeviationSum = 0;
- for (int i=0; i<NB_JITTER; i++) {
- double Deviation = double(m_pllSyncOffset[i]) - MeanOffset;
- DeviationSum += Deviation*Deviation;
- }
- double StdDev = sqrt(DeviationSum/NB_JITTER);
-
- m_fSyncOffsetAvr = MeanOffset;
- m_bSyncStatsAvailable = true;
- m_fSyncOffsetStdDev = StdDev;
-
-
- }
+ if (!m_pCurrentDisplaydSample || !m_OrderedPaint || !fAll) {
+ return;
+ }
+
+ LONGLONG llClockTime;
+ LONGLONG nsSampleTime;
+ LONGLONG SampleDuration = 0;
+ if (!m_bSignaledStarvation) {
+ llClockTime = GetClockTime(PerformanceCounter);
+ m_StarvationClock = llClockTime;
+ } else {
+ llClockTime = m_StarvationClock;
+ }
+ if (FAILED(m_pCurrentDisplaydSample->GetSampleDuration(&SampleDuration))) {
+ SampleDuration = 0;
+ }
+
+ if (FAILED(m_pCurrentDisplaydSample->GetSampleTime(&nsSampleTime))) {
+ nsSampleTime = llClockTime;
+ }
+ LONGLONG TimePerFrame = m_rtTimePerFrame;
+ if (!TimePerFrame) {
+ return;
+ }
+ if (SampleDuration > 1) {
+ TimePerFrame = SampleDuration;
+ }
+ {
+ m_nNextSyncOffset = (m_nNextSyncOffset + 1) % NB_JITTER;
+ LONGLONG SyncOffset = nsSampleTime - llClockTime;
+
+ m_pllSyncOffset[m_nNextSyncOffset] = SyncOffset;
+ // TRACE_EVR("EVR: SyncOffset(%d, %d): %8I64d %8I64d %8I64d \n", m_nCurSurface, m_VSyncMode, m_LastPredictedSync, -SyncOffset, m_LastPredictedSync - (-SyncOffset));
+
+ m_MaxSyncOffset = MINLONG64;
+ m_MinSyncOffset = MAXLONG64;
+
+ LONGLONG AvrageSum = 0;
+ for (int i = 0; i < NB_JITTER; i++) {
+ LONGLONG Offset = m_pllSyncOffset[i];
+ AvrageSum += Offset;
+ m_MaxSyncOffset = max(m_MaxSyncOffset, Offset);
+ m_MinSyncOffset = min(m_MinSyncOffset, Offset);
+ }
+ double MeanOffset = double(AvrageSum) / NB_JITTER;
+ double DeviationSum = 0;
+ for (int i = 0; i < NB_JITTER; i++) {
+ double Deviation = double(m_pllSyncOffset[i]) - MeanOffset;
+ DeviationSum += Deviation * Deviation;
+ }
+ double StdDev = sqrt(DeviationSum / NB_JITTER);
+
+ m_fSyncOffsetAvr = MeanOffset;
+ m_bSyncStatsAvailable = true;
+ m_fSyncOffsetStdDev = StdDev;
+
+
+ }
}
STDMETHODIMP_(bool) CEVRAllocatorPresenter::ResetDevice()
{
- CAutoLock lock(this);
- CAutoLock lock2(&m_ImageProcessingLock);
- CAutoLock cRenderLock(&m_RenderLock);
+ CAutoLock lock(this);
+ CAutoLock lock2(&m_ImageProcessingLock);
+ CAutoLock cRenderLock(&m_RenderLock);
- RemoveAllSamples();
+ RemoveAllSamples();
- bool bResult = __super::ResetDevice();
+ bool bResult = __super::ResetDevice();
- for (int i = 0; i < m_nNbDXSurface; i++) {
- CComPtr<IMFSample> pMFSample;
- HRESULT hr = pfMFCreateVideoSampleFromSurface (m_pVideoSurface[i], &pMFSample);
+ for (int i = 0; i < m_nNbDXSurface; i++) {
+ CComPtr<IMFSample> pMFSample;
+ HRESULT hr = pfMFCreateVideoSampleFromSurface(m_pVideoSurface[i], &pMFSample);
- if (SUCCEEDED (hr)) {
- pMFSample->SetUINT32 (GUID_SURFACE_INDEX, i);
- m_FreeSamples.AddTail (pMFSample);
- }
- ASSERT (SUCCEEDED (hr));
- }
- return bResult;
+ if (SUCCEEDED(hr)) {
+ pMFSample->SetUINT32(GUID_SURFACE_INDEX, i);
+ m_FreeSamples.AddTail(pMFSample);
+ }
+ ASSERT(SUCCEEDED(hr));
+ }
+ return bResult;
}
STDMETHODIMP_(bool) CEVRAllocatorPresenter::DisplayChange()
{
- CAutoLock lock(this);
- CAutoLock lock2(&m_ImageProcessingLock);
- CAutoLock cRenderLock(&m_RenderLock);
-
- m_DetectedFrameRate = 0.0;
- m_DetectedFrameTime = 0.0;
- m_DetectedFrameTimeStdDev = 0.0;
- m_DetectedLock = false;
- ZeroMemory(m_DetectedFrameTimeHistory, sizeof(m_DetectedFrameTimeHistory));
- ZeroMemory(m_DetectedFrameTimeHistoryHistory, sizeof(m_DetectedFrameTimeHistoryHistory));
- m_DetectedFrameTimePos = 0;
- ZeroMemory(&m_VMR9AlphaBitmap, sizeof(m_VMR9AlphaBitmap));
-
- ZeroMemory(m_ldDetectedRefreshRateList, sizeof(m_ldDetectedRefreshRateList));
- ZeroMemory(m_ldDetectedScanlineRateList, sizeof(m_ldDetectedScanlineRateList));
- m_DetectedRefreshRatePos = 0;
- m_DetectedRefreshTimePrim = 0;
- m_DetectedScanlineTime = 0;
- m_DetectedScanlineTimePrim = 0;
- m_DetectedRefreshRate = 0;
-
- memset (m_pllJitter, 0, sizeof(m_pllJitter));
- memset (m_pllSyncOffset, 0, sizeof(m_pllSyncOffset));
- m_nNextJitter = 0;
- m_nNextSyncOffset = 0;
- m_llLastPerf = 0;
- m_fAvrFps = 0.0;
- m_fJitterStdDev = 0.0;
- m_fSyncOffsetStdDev = 0.0;
- m_fSyncOffsetAvr = 0.0;
- m_bSyncStatsAvailable = false;
-
- bool bResult = __super::DisplayChange();
-
- return bResult;
+ CAutoLock lock(this);
+ CAutoLock lock2(&m_ImageProcessingLock);
+ CAutoLock cRenderLock(&m_RenderLock);
+
+ m_DetectedFrameRate = 0.0;
+ m_DetectedFrameTime = 0.0;
+ m_DetectedFrameTimeStdDev = 0.0;
+ m_DetectedLock = false;
+ ZeroMemory(m_DetectedFrameTimeHistory, sizeof(m_DetectedFrameTimeHistory));
+ ZeroMemory(m_DetectedFrameTimeHistoryHistory, sizeof(m_DetectedFrameTimeHistoryHistory));
+ m_DetectedFrameTimePos = 0;
+ ZeroMemory(&m_VMR9AlphaBitmap, sizeof(m_VMR9AlphaBitmap));
+
+ ZeroMemory(m_ldDetectedRefreshRateList, sizeof(m_ldDetectedRefreshRateList));
+ ZeroMemory(m_ldDetectedScanlineRateList, sizeof(m_ldDetectedScanlineRateList));
+ m_DetectedRefreshRatePos = 0;
+ m_DetectedRefreshTimePrim = 0;
+ m_DetectedScanlineTime = 0;
+ m_DetectedScanlineTimePrim = 0;
+ m_DetectedRefreshRate = 0;
+
+ memset(m_pllJitter, 0, sizeof(m_pllJitter));
+ memset(m_pllSyncOffset, 0, sizeof(m_pllSyncOffset));
+ m_nNextJitter = 0;
+ m_nNextSyncOffset = 0;
+ m_llLastPerf = 0;
+ m_fAvrFps = 0.0;
+ m_fJitterStdDev = 0.0;
+ m_fSyncOffsetStdDev = 0.0;
+ m_fSyncOffsetAvr = 0.0;
+ m_bSyncStatsAvailable = false;
+
+ bool bResult = __super::DisplayChange();
+
+ return bResult;
}
void CEVRAllocatorPresenter::RenderThread()
{
- HANDLE hEvts[] = { m_hEvtQuit, m_hEvtFlush};
- bool bQuit = false;
- TIMECAPS tc;
- DWORD dwResolution;
- MFTIME nsSampleTime;
- LONGLONG llClockTime;
- DWORD dwUser = 0;
- DWORD dwObject;
-
-
- // Tell Vista Multimedia Class Scheduler we are a playback thretad (increase priority)
- HANDLE hAvrt = 0;
- if (pfAvSetMmThreadCharacteristicsW) {
- DWORD dwTaskIndex = 0;
- hAvrt = pfAvSetMmThreadCharacteristicsW (L"Playback", &dwTaskIndex);
- if (pfAvSetMmThreadPriority) {
- pfAvSetMmThreadPriority (hAvrt, AVRT_PRIORITY_HIGH /*AVRT_PRIORITY_CRITICAL*/);
- }
- }
-
- timeGetDevCaps(&tc, sizeof(TIMECAPS));
- dwResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
- dwUser = timeBeginPeriod(dwResolution);
- CRenderersSettings& s = GetRenderersSettings();
-
- int NextSleepTime = 1;
- while (!bQuit) {
- LONGLONG llPerf = GetRenderersData()->GetPerfCounter();
- UNREFERENCED_PARAMETER(llPerf);
- if (!s.m_RenderSettings.iVMR9VSyncAccurate && NextSleepTime == 0) {
- NextSleepTime = 1;
- }
- dwObject = WaitForMultipleObjects (_countof(hEvts), hEvts, FALSE, max(NextSleepTime < 0 ? 1 : NextSleepTime, 0));
- /* dwObject = WAIT_TIMEOUT;
- if (m_bEvtFlush)
- dwObject = WAIT_OBJECT_0 + 1;
- else if (m_bEvtQuit)
- dwObject = WAIT_OBJECT_0;*/
- // if (NextSleepTime)
- // TRACE_EVR("EVR: Sleep: %7.3f\n", double(GetRenderersData()->GetPerfCounter()-llPerf) / 10000.0);
- if (NextSleepTime > 1) {
- NextSleepTime = 0;
- } else if (NextSleepTime == 0) {
- NextSleepTime = -1;
- }
- switch (dwObject) {
- case WAIT_OBJECT_0 :
- bQuit = true;
- break;
- case WAIT_OBJECT_0 + 1 :
- // Flush pending samples!
- FlushSamples();
- m_bEvtFlush = false;
- ResetEvent(m_hEvtFlush);
- TRACE_EVR ("EVR: Flush done!\n");
- break;
-
- case WAIT_TIMEOUT :
-
- if (m_LastSetOutputRange != -1 && m_LastSetOutputRange != s.m_RenderSettings.iEVROutputRange || m_bPendingRenegotiate) {
- FlushSamples();
- RenegotiateMediaType();
- m_bPendingRenegotiate = false;
- }
- if (m_bPendingResetDevice) {
- SendResetRequest();
- }
-
- // Discard timer events if playback stop
- // if ((dwObject == WAIT_OBJECT_0 + 3) && (m_nRenderState != Started)) continue;
-
- // TRACE_EVR ("EVR: RenderThread ==>> Waiting buffer\n");
-
- // if (WaitForMultipleObjects (_countof(hEvtsBuff), hEvtsBuff, FALSE, INFINITE) == WAIT_OBJECT_0+2)
- {
- CComPtr<IMFSample> pMFSample;
- LONGLONG llPerf = GetRenderersData()->GetPerfCounter();
- UNREFERENCED_PARAMETER(llPerf);
- int nSamplesLeft = 0;
- if (SUCCEEDED (GetScheduledSample(&pMFSample, nSamplesLeft))) {
- // pMFSample->GetUINT32 (GUID_SURFACE_INDEX, (UINT32*)&m_nCurSurface);
- m_pCurrentDisplaydSample = pMFSample;
-
- bool bValidSampleTime = true;
- HRESULT hGetSampleTime = pMFSample->GetSampleTime (&nsSampleTime);
- if (hGetSampleTime != S_OK || nsSampleTime == 0) {
- bValidSampleTime = false;
- }
- // We assume that all samples have the same duration
- LONGLONG SampleDuration = 0;
- pMFSample->GetSampleDuration(&SampleDuration);
-
- // TRACE_EVR ("EVR: RenderThread ==>> Presenting surface %d (%I64d)\n", m_nCurSurface, nsSampleTime);
-
- bool bStepForward = false;
-
- if (m_nStepCount < 0) {
- // Drop frame
- TRACE_EVR ("EVR: Dropped frame\n");
- m_pcFrames++;
- bStepForward = true;
- m_nStepCount = 0;
- /*
- } else if (m_nStepCount > 0) {
- pMFSample->GetUINT32(GUID_SURFACE_INDEX, (UINT32 *)&m_nCurSurface);
- ++m_OrderedPaint;
- if (!g_bExternalSubtitleTime) {
- __super::SetTime (g_tSegmentStart + nsSampleTime);
- }
- Paint(true);
- m_nDroppedUpdate = 0;
- CompleteFrameStep (false);
- bStepForward = true;
- */
- } else if ((m_nRenderState == Started)) {
- LONGLONG CurrentCounter = GetRenderersData()->GetPerfCounter();
- // Calculate wake up timer
- if (!m_bSignaledStarvation) {
- llClockTime = GetClockTime(CurrentCounter);
- m_StarvationClock = llClockTime;
- } else {
- llClockTime = m_StarvationClock;
- }
-
- if (!bValidSampleTime) {
- // Just play as fast as possible
- bStepForward = true;
- pMFSample->GetUINT32(GUID_SURFACE_INDEX, (UINT32 *)&m_nCurSurface);
- ++m_OrderedPaint;
- if (!g_bExternalSubtitleTime) {
- __super::SetTime (g_tSegmentStart + nsSampleTime);
- }
- Paint(true);
- } else {
- LONGLONG TimePerFrame = (LONGLONG)(GetFrameTime() * 10000000.0);
- LONGLONG DrawTime = m_PaintTime * 9 / 10 - 20000; // 2 ms offset (= m_PaintTime * 0.9 - 20000)
- //if (!s.iVMR9VSync)
- DrawTime = 0;
-
- LONGLONG SyncOffset = 0;
- LONGLONG VSyncTime = 0;
- LONGLONG TimeToNextVSync = -1;
- bool bVSyncCorrection = false;
- double DetectedRefreshTime;
- double DetectedScanlinesPerFrame;
- double DetectedScanlineTime;
- int DetectedRefreshRatePos;
- {
- CAutoLock Lock(&m_RefreshRateLock);
- DetectedRefreshTime = m_DetectedRefreshTime;
- DetectedRefreshRatePos = m_DetectedRefreshRatePos;
- DetectedScanlinesPerFrame = m_DetectedScanlinesPerFrame;
- DetectedScanlineTime = m_DetectedScanlineTime;
- }
-
- if (DetectedRefreshRatePos < 20 || !DetectedRefreshTime || !DetectedScanlinesPerFrame) {
- DetectedRefreshTime = 1.0/m_RefreshRate;
- DetectedScanlinesPerFrame = m_ScreenSize.cy;
- DetectedScanlineTime = DetectedRefreshTime / double(m_ScreenSize.cy);
- }
-
- if (s.m_RenderSettings.iVMR9VSync) {
- bVSyncCorrection = true;
- double TargetVSyncPos = GetVBlackPos();
- double RefreshLines = DetectedScanlinesPerFrame;
- double ScanlinesPerSecond = 1.0/DetectedScanlineTime;
- double CurrentVSyncPos = fmod(double(m_VBlankStartMeasure) + ScanlinesPerSecond * ((CurrentCounter - m_VBlankStartMeasureTime) / 10000000.0), RefreshLines);
- double LinesUntilVSync = 0;
- //TargetVSyncPos -= ScanlinesPerSecond * (DrawTime/10000000.0);
- //TargetVSyncPos -= 10;
- TargetVSyncPos = fmod(TargetVSyncPos, RefreshLines);
- if (TargetVSyncPos < 0) {
- TargetVSyncPos += RefreshLines;
- }
- if (TargetVSyncPos > CurrentVSyncPos) {
- LinesUntilVSync = TargetVSyncPos - CurrentVSyncPos;
- } else {
- LinesUntilVSync = (RefreshLines - CurrentVSyncPos) + TargetVSyncPos;
- }
- double TimeUntilVSync = LinesUntilVSync * DetectedScanlineTime;
- TimeToNextVSync = (LONGLONG)(TimeUntilVSync * 10000000.0);
- VSyncTime = (LONGLONG)(DetectedRefreshTime * 10000000.0);
-
- LONGLONG ClockTimeAtNextVSync = llClockTime + (LONGLONG)(TimeUntilVSync * 10000000.0 * m_ModeratedTimeSpeed);
-
- SyncOffset = (nsSampleTime - ClockTimeAtNextVSync);
-
- // if (SyncOffset < 0)
- // TRACE_EVR("EVR: SyncOffset(%d): %I64d %I64d %I64d\n", m_nCurSurface, SyncOffset, TimePerFrame, VSyncTime);
- } else {
- SyncOffset = (nsSampleTime - llClockTime);
- }
-
- //LONGLONG SyncOffset = nsSampleTime - llClockTime;
- TRACE_EVR ("EVR: SyncOffset: %I64d SampleFrame: %I64d ClockFrame: %I64d\n", SyncOffset, TimePerFrame!=0 ? nsSampleTime/TimePerFrame : 0, TimePerFrame!=0 ? llClockTime /TimePerFrame : 0);
- if (SampleDuration > 1 && !m_DetectedLock) {
- TimePerFrame = SampleDuration;
- }
-
- LONGLONG MinMargin;
- if (m_FrameTimeCorrection && 0) {
- MinMargin = 15000;
- } else {
- MinMargin = 15000 + min(LONGLONG(m_DetectedFrameTimeStdDev), 20000);
- }
- LONGLONG TimePerFrameMargin = min(max(TimePerFrame*2/100, MinMargin), TimePerFrame*11/100); // (0.02..0.11)TimePerFrame
- LONGLONG TimePerFrameMargin0 = TimePerFrameMargin/2;
- LONGLONG TimePerFrameMargin1 = 0;
-
- if (m_DetectedLock && TimePerFrame < VSyncTime) {
- VSyncTime = TimePerFrame;
- }
-
- if (m_VSyncMode == 1) {
- TimePerFrameMargin1 = -TimePerFrameMargin;
- } else if (m_VSyncMode == 2) {
- TimePerFrameMargin1 = TimePerFrameMargin;
- }
-
- m_LastSampleOffset = SyncOffset;
- m_bLastSampleOffsetValid = true;
-
- LONGLONG VSyncOffset0 = 0;
- bool bDoVSyncCorrection = false;
- if ((SyncOffset < -(TimePerFrame + TimePerFrameMargin0 - TimePerFrameMargin1)) && nSamplesLeft > 0) { // Only drop if we have something else to display at once
- // Drop frame
- TRACE_EVR ("EVR: Dropped frame\n");
- m_pcFrames++;
- bStepForward = true;
- ++m_nDroppedUpdate;
- NextSleepTime = 0;
- // VSyncOffset0 = (-SyncOffset) - VSyncTime;
- //VSyncOffset0 = (-SyncOffset) - VSyncTime + TimePerFrameMargin1;
- //m_LastPredictedSync = VSyncOffset0;
- bDoVSyncCorrection = false;
- } else if (SyncOffset < TimePerFrameMargin1) {
-
- if (bVSyncCorrection) {
- VSyncOffset0 = -SyncOffset;
- bDoVSyncCorrection = true;
- }
-
- // Paint and prepare for next frame
- TRACE_EVR ("EVR: Normalframe\n");
- m_nDroppedUpdate = 0;
- bStepForward = true;
- pMFSample->GetUINT32(GUID_SURFACE_INDEX, (UINT32 *)&m_nCurSurface);
- m_LastFrameDuration = nsSampleTime - m_LastSampleTime;
- m_LastSampleTime = nsSampleTime;
- m_LastPredictedSync = VSyncOffset0;
-
- if (m_nStepCount > 0) {
- CompleteFrameStep (false);
- }
-
- ++m_OrderedPaint;
-
- if (!g_bExternalSubtitleTime) {
- __super::SetTime (g_tSegmentStart + nsSampleTime);
- }
- Paint(true);
-
- NextSleepTime = 0;
- m_pcFramesDrawn++;
- } else {
- if (TimeToNextVSync >= 0 && SyncOffset > 0) {
- NextSleepTime = (int)(TimeToNextVSync/10000 - 2);
- } else {
- NextSleepTime = (int)(SyncOffset/10000 - 2);
- }
-
- if (NextSleepTime > TimePerFrame) {
- NextSleepTime = 1;
- }
-
- if (NextSleepTime < 0) {
- NextSleepTime = 0;
- }
- NextSleepTime = 1;
- //TRACE_EVR ("EVR: Delay\n");
- }
-
- if (bDoVSyncCorrection) {
- //LONGLONG VSyncOffset0 = (((SyncOffset) % VSyncTime) + VSyncTime) % VSyncTime;
- LONGLONG Margin = TimePerFrameMargin;
-
- LONGLONG VSyncOffsetMin = 30000000000000;
- LONGLONG VSyncOffsetMax = -30000000000000;
- for (int i = 0; i < 5; ++i) {
- VSyncOffsetMin = min(m_VSyncOffsetHistory[i], VSyncOffsetMin);
- VSyncOffsetMax = max(m_VSyncOffsetHistory[i], VSyncOffsetMax);
- }
-
- m_VSyncOffsetHistory[m_VSyncOffsetHistoryPos] = VSyncOffset0;
- m_VSyncOffsetHistoryPos = (m_VSyncOffsetHistoryPos + 1) % 5;
-
- // LONGLONG VSyncTime2 = VSyncTime2 + (VSyncOffsetMax - VSyncOffsetMin);
- //VSyncOffsetMin; = (((VSyncOffsetMin) % VSyncTime) + VSyncTime) % VSyncTime;
- //VSyncOffsetMax = (((VSyncOffsetMax) % VSyncTime) + VSyncTime) % VSyncTime;
-
- // TRACE_EVR("EVR: SyncOffset(%d, %d): %8I64d %8I64d %8I64d %8I64d\n", m_nCurSurface, m_VSyncMode,VSyncOffset0, VSyncOffsetMin, VSyncOffsetMax, VSyncOffsetMax - VSyncOffsetMin);
-
- if (m_VSyncMode == 0) {
- // 23.976 in 60 Hz
- if (VSyncOffset0 < Margin && VSyncOffsetMax > (VSyncTime - Margin)) {
- m_VSyncMode = 2;
- } else if (VSyncOffset0 > (VSyncTime - Margin) && VSyncOffsetMin < Margin) {
- m_VSyncMode = 1;
- }
- } else if (m_VSyncMode == 2) {
- if (VSyncOffsetMin > (Margin)) {
- m_VSyncMode = 0;
- }
- } else if (m_VSyncMode == 1) {
- if (VSyncOffsetMax < (VSyncTime - Margin)) {
- m_VSyncMode = 0;
- }
- }
- }
-
- }
- }
-
- m_pCurrentDisplaydSample = NULL;
- if (bStepForward) {
- MoveToFreeList(pMFSample, true);
- CheckWaitingSampleFromMixer();
- m_MaxSampleDuration = max(SampleDuration, m_MaxSampleDuration);
- } else {
- MoveToScheduledList(pMFSample, true);
- }
- } else if (m_bLastSampleOffsetValid && m_LastSampleOffset < -10000000) { // Only starve if we are 1 seconds behind
- if (m_nRenderState == Started && !g_bNoDuration) {
- m_pSink->Notify(EC_STARVATION, 0, 0);
- m_bSignaledStarvation = true;
- }
- }
- //GetImageFromMixer();
- }
- // else
- // {
- // TRACE_EVR ("EVR: RenderThread ==>> Flush before rendering frame!\n");
- // }
-
- break;
- }
- }
-
- timeEndPeriod (dwResolution);
- if (pfAvRevertMmThreadCharacteristics) {
- pfAvRevertMmThreadCharacteristics (hAvrt);
- }
+ HANDLE hEvts[] = { m_hEvtQuit, m_hEvtFlush};
+ bool bQuit = false;
+ TIMECAPS tc;
+ DWORD dwResolution;
+ MFTIME nsSampleTime;
+ LONGLONG llClockTime;
+ DWORD dwUser = 0;
+ DWORD dwObject;
+
+
+ // Tell Vista Multimedia Class Scheduler we are a playback thretad (increase priority)
+ HANDLE hAvrt = 0;
+ if (pfAvSetMmThreadCharacteristicsW) {
+ DWORD dwTaskIndex = 0;
+ hAvrt = pfAvSetMmThreadCharacteristicsW(L"Playback", &dwTaskIndex);
+ if (pfAvSetMmThreadPriority) {
+ pfAvSetMmThreadPriority(hAvrt, AVRT_PRIORITY_HIGH /*AVRT_PRIORITY_CRITICAL*/);
+ }
+ }
+
+ timeGetDevCaps(&tc, sizeof(TIMECAPS));
+ dwResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
+ dwUser = timeBeginPeriod(dwResolution);
+ CRenderersSettings& s = GetRenderersSettings();
+
+ int NextSleepTime = 1;
+ while (!bQuit) {
+ LONGLONG llPerf = GetRenderersData()->GetPerfCounter();
+ UNREFERENCED_PARAMETER(llPerf);
+ if (!s.m_RenderSettings.iVMR9VSyncAccurate && NextSleepTime == 0) {
+ NextSleepTime = 1;
+ }
+ dwObject = WaitForMultipleObjects(_countof(hEvts), hEvts, FALSE, max(NextSleepTime < 0 ? 1 : NextSleepTime, 0));
+ /* dwObject = WAIT_TIMEOUT;
+ if (m_bEvtFlush)
+ dwObject = WAIT_OBJECT_0 + 1;
+ else if (m_bEvtQuit)
+ dwObject = WAIT_OBJECT_0;*/
+ // if (NextSleepTime)
+ // TRACE_EVR("EVR: Sleep: %7.3f\n", double(GetRenderersData()->GetPerfCounter()-llPerf) / 10000.0);
+ if (NextSleepTime > 1) {
+ NextSleepTime = 0;
+ } else if (NextSleepTime == 0) {
+ NextSleepTime = -1;
+ }
+ switch (dwObject) {
+ case WAIT_OBJECT_0 :
+ bQuit = true;
+ break;
+ case WAIT_OBJECT_0 + 1 :
+ // Flush pending samples!
+ FlushSamples();
+ m_bEvtFlush = false;
+ ResetEvent(m_hEvtFlush);
+ TRACE_EVR("EVR: Flush done!\n");
+ break;
+
+ case WAIT_TIMEOUT :
+
+ if (m_LastSetOutputRange != -1 && m_LastSetOutputRange != s.m_RenderSettings.iEVROutputRange || m_bPendingRenegotiate) {
+ FlushSamples();
+ RenegotiateMediaType();
+ m_bPendingRenegotiate = false;
+ }
+ if (m_bPendingResetDevice) {
+ SendResetRequest();
+ }
+
+ // Discard timer events if playback stop
+ // if ((dwObject == WAIT_OBJECT_0 + 3) && (m_nRenderState != Started)) continue;
+
+ // TRACE_EVR ("EVR: RenderThread ==>> Waiting buffer\n");
+
+ // if (WaitForMultipleObjects (_countof(hEvtsBuff), hEvtsBuff, FALSE, INFINITE) == WAIT_OBJECT_0+2)
+ {
+ CComPtr<IMFSample> pMFSample;
+ LONGLONG llPerf = GetRenderersData()->GetPerfCounter();
+ UNREFERENCED_PARAMETER(llPerf);
+ int nSamplesLeft = 0;
+ if (SUCCEEDED(GetScheduledSample(&pMFSample, nSamplesLeft))) {
+ // pMFSample->GetUINT32 (GUID_SURFACE_INDEX, (UINT32*)&m_nCurSurface);
+ m_pCurrentDisplaydSample = pMFSample;
+
+ bool bValidSampleTime = true;
+ HRESULT hGetSampleTime = pMFSample->GetSampleTime(&nsSampleTime);
+ if (hGetSampleTime != S_OK || nsSampleTime == 0) {
+ bValidSampleTime = false;
+ }
+ // We assume that all samples have the same duration
+ LONGLONG SampleDuration = 0;
+ pMFSample->GetSampleDuration(&SampleDuration);
+
+ // TRACE_EVR ("EVR: RenderThread ==>> Presenting surface %d (%I64d)\n", m_nCurSurface, nsSampleTime);
+
+ bool bStepForward = false;
+
+ if (m_nStepCount < 0) {
+ // Drop frame
+ TRACE_EVR("EVR: Dropped frame\n");
+ m_pcFrames++;
+ bStepForward = true;
+ m_nStepCount = 0;
+ /*
+ } else if (m_nStepCount > 0) {
+ pMFSample->GetUINT32(GUID_SURFACE_INDEX, (UINT32 *)&m_nCurSurface);
+ ++m_OrderedPaint;
+ if (!g_bExternalSubtitleTime) {
+ __super::SetTime (g_tSegmentStart + nsSampleTime);
+ }
+ Paint(true);
+ m_nDroppedUpdate = 0;
+ CompleteFrameStep (false);
+ bStepForward = true;
+ */
+ } else if ((m_nRenderState == Started)) {
+ LONGLONG CurrentCounter = GetRenderersData()->GetPerfCounter();
+ // Calculate wake up timer
+ if (!m_bSignaledStarvation) {
+ llClockTime = GetClockTime(CurrentCounter);
+ m_StarvationClock = llClockTime;
+ } else {
+ llClockTime = m_StarvationClock;
+ }
+
+ if (!bValidSampleTime) {
+ // Just play as fast as possible
+ bStepForward = true;
+ pMFSample->GetUINT32(GUID_SURFACE_INDEX, (UINT32*)&m_nCurSurface);
+ ++m_OrderedPaint;
+ if (!g_bExternalSubtitleTime) {
+ __super::SetTime(g_tSegmentStart + nsSampleTime);
+ }
+ Paint(true);
+ } else {
+ LONGLONG TimePerFrame = (LONGLONG)(GetFrameTime() * 10000000.0);
+ LONGLONG DrawTime = m_PaintTime * 9 / 10 - 20000; // 2 ms offset (= m_PaintTime * 0.9 - 20000)
+ //if (!s.iVMR9VSync)
+ DrawTime = 0;
+
+ LONGLONG SyncOffset = 0;
+ LONGLONG VSyncTime = 0;
+ LONGLONG TimeToNextVSync = -1;
+ bool bVSyncCorrection = false;
+ double DetectedRefreshTime;
+ double DetectedScanlinesPerFrame;
+ double DetectedScanlineTime;
+ int DetectedRefreshRatePos;
+ {
+ CAutoLock Lock(&m_RefreshRateLock);
+ DetectedRefreshTime = m_DetectedRefreshTime;
+ DetectedRefreshRatePos = m_DetectedRefreshRatePos;
+ DetectedScanlinesPerFrame = m_DetectedScanlinesPerFrame;
+ DetectedScanlineTime = m_DetectedScanlineTime;
+ }
+
+ if (DetectedRefreshRatePos < 20 || !DetectedRefreshTime || !DetectedScanlinesPerFrame) {
+ DetectedRefreshTime = 1.0 / m_RefreshRate;
+ DetectedScanlinesPerFrame = m_ScreenSize.cy;
+ DetectedScanlineTime = DetectedRefreshTime / double(m_ScreenSize.cy);
+ }
+
+ if (s.m_RenderSettings.iVMR9VSync) {
+ bVSyncCorrection = true;
+ double TargetVSyncPos = GetVBlackPos();
+ double RefreshLines = DetectedScanlinesPerFrame;
+ double ScanlinesPerSecond = 1.0 / DetectedScanlineTime;
+ double CurrentVSyncPos = fmod(double(m_VBlankStartMeasure) + ScanlinesPerSecond * ((CurrentCounter - m_VBlankStartMeasureTime) / 10000000.0), RefreshLines);
+ double LinesUntilVSync = 0;
+ //TargetVSyncPos -= ScanlinesPerSecond * (DrawTime/10000000.0);
+ //TargetVSyncPos -= 10;
+ TargetVSyncPos = fmod(TargetVSyncPos, RefreshLines);
+ if (TargetVSyncPos < 0) {
+ TargetVSyncPos += RefreshLines;
+ }
+ if (TargetVSyncPos > CurrentVSyncPos) {
+ LinesUntilVSync = TargetVSyncPos - CurrentVSyncPos;
+ } else {
+ LinesUntilVSync = (RefreshLines - CurrentVSyncPos) + TargetVSyncPos;
+ }
+ double TimeUntilVSync = LinesUntilVSync * DetectedScanlineTime;
+ TimeToNextVSync = (LONGLONG)(TimeUntilVSync * 10000000.0);
+ VSyncTime = (LONGLONG)(DetectedRefreshTime * 10000000.0);
+
+ LONGLONG ClockTimeAtNextVSync = llClockTime + (LONGLONG)(TimeUntilVSync * 10000000.0 * m_ModeratedTimeSpeed);
+
+ SyncOffset = (nsSampleTime - ClockTimeAtNextVSync);
+
+ // if (SyncOffset < 0)
+ // TRACE_EVR("EVR: SyncOffset(%d): %I64d %I64d %I64d\n", m_nCurSurface, SyncOffset, TimePerFrame, VSyncTime);
+ } else {
+ SyncOffset = (nsSampleTime - llClockTime);
+ }
+
+ //LONGLONG SyncOffset = nsSampleTime - llClockTime;
+ TRACE_EVR("EVR: SyncOffset: %I64d SampleFrame: %I64d ClockFrame: %I64d\n", SyncOffset, TimePerFrame != 0 ? nsSampleTime / TimePerFrame : 0, TimePerFrame != 0 ? llClockTime / TimePerFrame : 0);
+ if (SampleDuration > 1 && !m_DetectedLock) {
+ TimePerFrame = SampleDuration;
+ }
+
+ LONGLONG MinMargin;
+ if (m_FrameTimeCorrection && 0) {
+ MinMargin = 15000;
+ } else {
+ MinMargin = 15000 + min(LONGLONG(m_DetectedFrameTimeStdDev), 20000);
+ }
+ LONGLONG TimePerFrameMargin = min(max(TimePerFrame * 2 / 100, MinMargin), TimePerFrame * 11 / 100); // (0.02..0.11)TimePerFrame
+ LONGLONG TimePerFrameMargin0 = TimePerFrameMargin / 2;
+ LONGLONG TimePerFrameMargin1 = 0;
+
+ if (m_DetectedLock && TimePerFrame < VSyncTime) {
+ VSyncTime = TimePerFrame;
+ }
+
+ if (m_VSyncMode == 1) {
+ TimePerFrameMargin1 = -TimePerFrameMargin;
+ } else if (m_VSyncMode == 2) {
+ TimePerFrameMargin1 = TimePerFrameMargin;
+ }
+
+ m_LastSampleOffset = SyncOffset;
+ m_bLastSampleOffsetValid = true;
+
+ LONGLONG VSyncOffset0 = 0;
+ bool bDoVSyncCorrection = false;
+ if ((SyncOffset < -(TimePerFrame + TimePerFrameMargin0 - TimePerFrameMargin1)) && nSamplesLeft > 0) { // Only drop if we have something else to display at once
+ // Drop frame
+ TRACE_EVR("EVR: Dropped frame\n");
+ m_pcFrames++;
+ bStepForward = true;
+ ++m_nDroppedUpdate;
+ NextSleepTime = 0;
+ // VSyncOffset0 = (-SyncOffset) - VSyncTime;
+ //VSyncOffset0 = (-SyncOffset) - VSyncTime + TimePerFrameMargin1;
+ //m_LastPredictedSync = VSyncOffset0;
+ bDoVSyncCorrection = false;
+ } else if (SyncOffset < TimePerFrameMargin1) {
+
+ if (bVSyncCorrection) {
+ VSyncOffset0 = -SyncOffset;
+ bDoVSyncCorrection = true;
+ }
+
+ // Paint and prepare for next frame
+ TRACE_EVR("EVR: Normalframe\n");
+ m_nDroppedUpdate = 0;
+ bStepForward = true;
+ pMFSample->GetUINT32(GUID_SURFACE_INDEX, (UINT32*)&m_nCurSurface);
+ m_LastFrameDuration = nsSampleTime - m_LastSampleTime;
+ m_LastSampleTime = nsSampleTime;
+ m_LastPredictedSync = VSyncOffset0;
+
+ if (m_nStepCount > 0) {
+ CompleteFrameStep(false);
+ }
+
+ ++m_OrderedPaint;
+
+ if (!g_bExternalSubtitleTime) {
+ __super::SetTime(g_tSegmentStart + nsSampleTime);
+ }
+ Paint(true);
+
+ NextSleepTime = 0;
+ m_pcFramesDrawn++;
+ } else {
+ if (TimeToNextVSync >= 0 && SyncOffset > 0) {
+ NextSleepTime = (int)(TimeToNextVSync / 10000 - 2);
+ } else {
+ NextSleepTime = (int)(SyncOffset / 10000 - 2);
+ }
+
+ if (NextSleepTime > TimePerFrame) {
+ NextSleepTime = 1;
+ }
+
+ if (NextSleepTime < 0) {
+ NextSleepTime = 0;
+ }
+ NextSleepTime = 1;
+ //TRACE_EVR ("EVR: Delay\n");
+ }
+
+ if (bDoVSyncCorrection) {
+ //LONGLONG VSyncOffset0 = (((SyncOffset) % VSyncTime) + VSyncTime) % VSyncTime;
+ LONGLONG Margin = TimePerFrameMargin;
+
+ LONGLONG VSyncOffsetMin = 30000000000000;
+ LONGLONG VSyncOffsetMax = -30000000000000;
+ for (int i = 0; i < 5; ++i) {
+ VSyncOffsetMin = min(m_VSyncOffsetHistory[i], VSyncOffsetMin);
+ VSyncOffsetMax = max(m_VSyncOffsetHistory[i], VSyncOffsetMax);
+ }
+
+ m_VSyncOffsetHistory[m_VSyncOffsetHistoryPos] = VSyncOffset0;
+ m_VSyncOffsetHistoryPos = (m_VSyncOffsetHistoryPos + 1) % 5;
+
+ // LONGLONG VSyncTime2 = VSyncTime2 + (VSyncOffsetMax - VSyncOffsetMin);
+ //VSyncOffsetMin; = (((VSyncOffsetMin) % VSyncTime) + VSyncTime) % VSyncTime;
+ //VSyncOffsetMax = (((VSyncOffsetMax) % VSyncTime) + VSyncTime) % VSyncTime;
+
+ // TRACE_EVR("EVR: SyncOffset(%d, %d): %8I64d %8I64d %8I64d %8I64d\n", m_nCurSurface, m_VSyncMode,VSyncOffset0, VSyncOffsetMin, VSyncOffsetMax, VSyncOffsetMax - VSyncOffsetMin);
+
+ if (m_VSyncMode == 0) {
+ // 23.976 in 60 Hz
+ if (VSyncOffset0 < Margin && VSyncOffsetMax > (VSyncTime - Margin)) {
+ m_VSyncMode = 2;
+ } else if (VSyncOffset0 > (VSyncTime - Margin) && VSyncOffsetMin < Margin) {
+ m_VSyncMode = 1;
+ }
+ } else if (m_VSyncMode == 2) {
+ if (VSyncOffsetMin > (Margin)) {
+ m_VSyncMode = 0;
+ }
+ } else if (m_VSyncMode == 1) {
+ if (VSyncOffsetMax < (VSyncTime - Margin)) {
+ m_VSyncMode = 0;
+ }
+ }
+ }
+
+ }
+ }
+
+ m_pCurrentDisplaydSample = NULL;
+ if (bStepForward) {
+ MoveToFreeList(pMFSample, true);
+ CheckWaitingSampleFromMixer();
+ m_MaxSampleDuration = max(SampleDuration, m_MaxSampleDuration);
+ } else {
+ MoveToScheduledList(pMFSample, true);
+ }
+ } else if (m_bLastSampleOffsetValid && m_LastSampleOffset < -10000000) { // Only starve if we are 1 seconds behind
+ if (m_nRenderState == Started && !g_bNoDuration) {
+ m_pSink->Notify(EC_STARVATION, 0, 0);
+ m_bSignaledStarvation = true;
+ }
+ }
+ //GetImageFromMixer();
+ }
+ // else
+ // {
+ // TRACE_EVR ("EVR: RenderThread ==>> Flush before rendering frame!\n");
+ // }
+
+ break;
+ }
+ }
+
+ timeEndPeriod(dwResolution);
+ if (pfAvRevertMmThreadCharacteristics) {
+ pfAvRevertMmThreadCharacteristics(hAvrt);
+ }
}
void CEVRAllocatorPresenter::OnResetDevice()
{
- HRESULT hr;
+ HRESULT hr;
- // Reset DXVA Manager, and get new buffers
- hr = m_pD3DManager->ResetDevice(m_pD3DDev, m_nResetToken);
+ // Reset DXVA Manager, and get new buffers
+ hr = m_pD3DManager->ResetDevice(m_pD3DDev, m_nResetToken);
- // Not necessary, but Microsoft documentation say Presenter should send this message...
- if (m_pSink) {
- m_pSink->Notify (EC_DISPLAY_CHANGED, 0, 0);
- }
+ // Not necessary, but Microsoft documentation say Presenter should send this message...
+ if (m_pSink) {
+ m_pSink->Notify(EC_DISPLAY_CHANGED, 0, 0);
+ }
}
void CEVRAllocatorPresenter::RemoveAllSamples()
{
- CAutoLock AutoLock(&m_ImageProcessingLock);
+ CAutoLock AutoLock(&m_ImageProcessingLock);
- FlushSamples();
- m_ScheduledSamples.RemoveAll();
- m_FreeSamples.RemoveAll();
- m_LastScheduledSampleTime = -1;
- m_LastScheduledUncorrectedSampleTime = -1;
- m_nUsedBuffer = 0;
+ FlushSamples();
+ m_ScheduledSamples.RemoveAll();
+ m_FreeSamples.RemoveAll();
+ m_LastScheduledSampleTime = -1;
+ m_LastScheduledUncorrectedSampleTime = -1;
+ m_nUsedBuffer = 0;
}
HRESULT CEVRAllocatorPresenter::GetFreeSample(IMFSample** ppSample)
{
- CAutoLock lock(&m_SampleQueueLock);
- HRESULT hr = S_OK;
+ CAutoLock lock(&m_SampleQueueLock);
+ HRESULT hr = S_OK;
- if (m_FreeSamples.GetCount() > 1) { // <= Cannot use first free buffer (can be currently displayed)
- InterlockedIncrement (&m_nUsedBuffer);
- *ppSample = m_FreeSamples.RemoveHead().Detach();
- } else {
- hr = MF_E_SAMPLEALLOCATOR_EMPTY;
- }
+ if (m_FreeSamples.GetCount() > 1) { // <= Cannot use first free buffer (can be currently displayed)
+ InterlockedIncrement(&m_nUsedBuffer);
+ *ppSample = m_FreeSamples.RemoveHead().Detach();
+ } else {
+ hr = MF_E_SAMPLEALLOCATOR_EMPTY;
+ }
- return hr;
+ return hr;
}
-HRESULT CEVRAllocatorPresenter::GetScheduledSample(IMFSample** ppSample, int &_Count)
+HRESULT CEVRAllocatorPresenter::GetScheduledSample(IMFSample** ppSample, int& _Count)
{
- CAutoLock lock(&m_SampleQueueLock);
- HRESULT hr = S_OK;
+ CAutoLock lock(&m_SampleQueueLock);
+ HRESULT hr = S_OK;
- _Count = (int)m_ScheduledSamples.GetCount();
- if (_Count > 0) {
- *ppSample = m_ScheduledSamples.RemoveHead().Detach();
- --_Count;
- } else {
- hr = MF_E_SAMPLEALLOCATOR_EMPTY;
- }
+ _Count = (int)m_ScheduledSamples.GetCount();
+ if (_Count > 0) {
+ *ppSample = m_ScheduledSamples.RemoveHead().Detach();
+ --_Count;
+ } else {
+ hr = MF_E_SAMPLEALLOCATOR_EMPTY;
+ }
- return hr;
+ return hr;
}
void CEVRAllocatorPresenter::MoveToFreeList(IMFSample* pSample, bool bTail)
{
- CAutoLock lock(&m_SampleQueueLock);
- InterlockedDecrement (&m_nUsedBuffer);
- if (m_bPendingMediaFinished && m_nUsedBuffer == 0) {
- m_bPendingMediaFinished = false;
- m_pSink->Notify (EC_COMPLETE, 0, 0);
- }
- if (bTail) {
- m_FreeSamples.AddTail (pSample);
- } else {
- m_FreeSamples.AddHead(pSample);
- }
+ CAutoLock lock(&m_SampleQueueLock);
+ InterlockedDecrement(&m_nUsedBuffer);
+ if (m_bPendingMediaFinished && m_nUsedBuffer == 0) {
+ m_bPendingMediaFinished = false;
+ m_pSink->Notify(EC_COMPLETE, 0, 0);
+ }
+ if (bTail) {
+ m_FreeSamples.AddTail(pSample);
+ } else {
+ m_FreeSamples.AddHead(pSample);
+ }
}
void CEVRAllocatorPresenter::MoveToScheduledList(IMFSample* pSample, bool _bSorted)
{
- if (_bSorted) {
- CAutoLock lock(&m_SampleQueueLock);
- // Insert sorted
- /* POSITION Iterator = m_ScheduledSamples.GetHeadPosition();
-
- LONGLONG NewSampleTime;
- pSample->GetSampleTime(&NewSampleTime);
-
- while (Iterator != NULL)
- {
- POSITION CurrentPos = Iterator;
- IMFSample *pIter = m_ScheduledSamples.GetNext(Iterator);
- LONGLONG SampleTime;
- pIter->GetSampleTime(&SampleTime);
- if (NewSampleTime < SampleTime)
- {
- m_ScheduledSamples.InsertBefore(CurrentPos, pSample);
- return;
- }
- }*/
-
- m_ScheduledSamples.AddHead(pSample);
- } else {
-
- CAutoLock lock(&m_SampleQueueLock);
-
- CRenderersSettings& s = GetRenderersSettings();
- double ForceFPS = 0.0;
- // double ForceFPS = 59.94;
- // double ForceFPS = 23.976;
- if (ForceFPS != 0.0) {
- m_rtTimePerFrame = (REFERENCE_TIME)(10000000.0 / ForceFPS);
- }
- LONGLONG Duration = m_rtTimePerFrame;
- UNREFERENCED_PARAMETER(Duration);
- LONGLONG PrevTime = m_LastScheduledUncorrectedSampleTime;
- LONGLONG Time;
- LONGLONG SetDuration;
- pSample->GetSampleDuration(&SetDuration);
- pSample->GetSampleTime(&Time);
- m_LastScheduledUncorrectedSampleTime = Time;
-
- m_bCorrectedFrameTime = false;
-
- LONGLONG Diff2 = PrevTime - (LONGLONG)(m_LastScheduledSampleTimeFP * 10000000.0);
- LONGLONG Diff = Time - PrevTime;
- if (PrevTime == -1) {
- Diff = 0;
- }
- if (Diff < 0) {
- Diff = -Diff;
- }
- if (Diff2 < 0) {
- Diff2 = -Diff2;
- }
- if (Diff < m_rtTimePerFrame*8 && m_rtTimePerFrame && Diff2 < m_rtTimePerFrame*8) { // Detect seeking
- int iPos = (m_DetectedFrameTimePos++) % 60;
- LONGLONG Diff = Time - PrevTime;
- if (PrevTime == -1) {
- Diff = 0;
- }
- m_DetectedFrameTimeHistory[iPos] = Diff;
-
- if (m_DetectedFrameTimePos >= 10) {
- int nFrames = min(m_DetectedFrameTimePos, 60);
- LONGLONG DectedSum = 0;
- for (int i = 0; i < nFrames; ++i) {
- DectedSum += m_DetectedFrameTimeHistory[i];
- }
-
- double Average = double(DectedSum) / double(nFrames);
- double DeviationSum = 0.0;
- for (int i = 0; i < nFrames; ++i) {
- double Deviation = m_DetectedFrameTimeHistory[i] - Average;
- DeviationSum += Deviation*Deviation;
- }
-
- double StdDev = sqrt(DeviationSum/double(nFrames));
-
- m_DetectedFrameTimeStdDev = StdDev;
-
- double DetectedRate = 1.0/ (double(DectedSum) / (nFrames * 10000000.0) );
-
- double AllowedError = 0.0003;
-
- static double AllowedValues[] = {60.0, 59.94, 50.0, 48.0, 47.952, 30.0, 29.97, 25.0, 24.0, 23.976};
-
- int nAllowed = _countof(AllowedValues);
- for (int i = 0; i < nAllowed; ++i) {
- if (fabs(1.0 - DetectedRate / AllowedValues[i]) < AllowedError) {
- DetectedRate = AllowedValues[i];
- break;
- }
- }
-
- m_DetectedFrameTimeHistoryHistory[m_DetectedFrameTimePos % 500] = DetectedRate;
-
- class CAutoInt
- {
- public:
-
- int m_Int;
-
- CAutoInt() {
- m_Int = 0;
- }
- CAutoInt(int _Other) {
- m_Int = _Other;
- }
-
- operator int () const {
- return m_Int;
- }
-
- CAutoInt &operator ++ () {
- ++m_Int;
- return *this;
- }
- };
-
-
- CMap<double, double, CAutoInt, CAutoInt> Map;
-
- for (int i = 0; i < 500; ++i) {
- ++Map[m_DetectedFrameTimeHistoryHistory[i]];
- }
-
- POSITION Pos = Map.GetStartPosition();
- double BestVal = 0.0;
- int BestNum = 5;
- while (Pos) {
- double Key;
- CAutoInt Value;
- Map.GetNextAssoc(Pos, Key, Value);
- if (Value.m_Int > BestNum && Key != 0.0) {
- BestNum = Value.m_Int;
- BestVal = Key;
- }
- }
-
- m_DetectedLock = false;
- for (int i = 0; i < nAllowed; ++i) {
- if (BestVal == AllowedValues[i]) {
- m_DetectedLock = true;
- break;
- }
- }
- if (BestVal != 0.0) {
- m_DetectedFrameRate = BestVal;
- m_DetectedFrameTime = 1.0 / BestVal;
- }
- }
-
- LONGLONG PredictedNext = PrevTime + m_rtTimePerFrame;
- LONGLONG PredictedDiff = PredictedNext - Time;
- if (PredictedDiff < 0) {
- PredictedDiff = -PredictedDiff;
- }
-
- if (m_DetectedFrameTime != 0.0
- //&& PredictedDiff > 15000
- && m_DetectedLock && s.m_RenderSettings.iEVREnableFrameTimeCorrection) {
- double CurrentTime = Time / 10000000.0;
- double LastTime = m_LastScheduledSampleTimeFP;
- double PredictedTime = LastTime + m_DetectedFrameTime;
- if (fabs(PredictedTime - CurrentTime) > 0.0015) { // 1.5 ms wrong, lets correct
- CurrentTime = PredictedTime;
- Time = (LONGLONG)(CurrentTime * 10000000.0);
- pSample->SetSampleTime(Time);
- pSample->SetSampleDuration(LONGLONG(m_DetectedFrameTime * 10000000.0));
- m_bCorrectedFrameTime = true;
- m_FrameTimeCorrection = 30;
- }
- m_LastScheduledSampleTimeFP = CurrentTime;
- } else {
- m_LastScheduledSampleTimeFP = Time / 10000000.0;
- }
- } else {
- m_LastScheduledSampleTimeFP = Time / 10000000.0;
- if (Diff > m_rtTimePerFrame*8) {
- // Seek
- m_bSignaledStarvation = false;
- m_DetectedFrameTimePos = 0;
- m_DetectedLock = false;
- }
- }
-
- // TRACE_EVR("EVR: Time: %f %f %f\n", Time / 10000000.0, SetDuration / 10000000.0, m_DetectedFrameRate);
- if (!m_bCorrectedFrameTime && m_FrameTimeCorrection) {
- --m_FrameTimeCorrection;
- }
+ if (_bSorted) {
+ CAutoLock lock(&m_SampleQueueLock);
+ // Insert sorted
+ /* POSITION Iterator = m_ScheduledSamples.GetHeadPosition();
+
+ LONGLONG NewSampleTime;
+ pSample->GetSampleTime(&NewSampleTime);
+
+ while (Iterator != NULL)
+ {
+ POSITION CurrentPos = Iterator;
+ IMFSample *pIter = m_ScheduledSamples.GetNext(Iterator);
+ LONGLONG SampleTime;
+ pIter->GetSampleTime(&SampleTime);
+ if (NewSampleTime < SampleTime)
+ {
+ m_ScheduledSamples.InsertBefore(CurrentPos, pSample);
+ return;
+ }
+ }*/
+
+ m_ScheduledSamples.AddHead(pSample);
+ } else {
+
+ CAutoLock lock(&m_SampleQueueLock);
+
+ CRenderersSettings& s = GetRenderersSettings();
+ double ForceFPS = 0.0;
+ // double ForceFPS = 59.94;
+ // double ForceFPS = 23.976;
+ if (ForceFPS != 0.0) {
+ m_rtTimePerFrame = (REFERENCE_TIME)(10000000.0 / ForceFPS);
+ }
+ LONGLONG Duration = m_rtTimePerFrame;
+ UNREFERENCED_PARAMETER(Duration);
+ LONGLONG PrevTime = m_LastScheduledUncorrectedSampleTime;
+ LONGLONG Time;
+ LONGLONG SetDuration;
+ pSample->GetSampleDuration(&SetDuration);
+ pSample->GetSampleTime(&Time);
+ m_LastScheduledUncorrectedSampleTime = Time;
+
+ m_bCorrectedFrameTime = false;
+
+ LONGLONG Diff2 = PrevTime - (LONGLONG)(m_LastScheduledSampleTimeFP * 10000000.0);
+ LONGLONG Diff = Time - PrevTime;
+ if (PrevTime == -1) {
+ Diff = 0;
+ }
+ if (Diff < 0) {
+ Diff = -Diff;
+ }
+ if (Diff2 < 0) {
+ Diff2 = -Diff2;
+ }
+ if (Diff < m_rtTimePerFrame * 8 && m_rtTimePerFrame && Diff2 < m_rtTimePerFrame * 8) { // Detect seeking
+ int iPos = (m_DetectedFrameTimePos++) % 60;
+ LONGLONG Diff = Time - PrevTime;
+ if (PrevTime == -1) {
+ Diff = 0;
+ }
+ m_DetectedFrameTimeHistory[iPos] = Diff;
+
+ if (m_DetectedFrameTimePos >= 10) {
+ int nFrames = min(m_DetectedFrameTimePos, 60);
+ LONGLONG DectedSum = 0;
+ for (int i = 0; i < nFrames; ++i) {
+ DectedSum += m_DetectedFrameTimeHistory[i];
+ }
+
+ double Average = double(DectedSum) / double(nFrames);
+ double DeviationSum = 0.0;
+ for (int i = 0; i < nFrames; ++i) {
+ double Deviation = m_DetectedFrameTimeHistory[i] - Average;
+ DeviationSum += Deviation * Deviation;
+ }
+
+ double StdDev = sqrt(DeviationSum / double(nFrames));
+
+ m_DetectedFrameTimeStdDev = StdDev;
+
+ double DetectedRate = 1.0 / (double(DectedSum) / (nFrames * 10000000.0));
+
+ double AllowedError = 0.0003;
+
+ static double AllowedValues[] = {60.0, 59.94, 50.0, 48.0, 47.952, 30.0, 29.97, 25.0, 24.0, 23.976};
+
+ int nAllowed = _countof(AllowedValues);
+ for (int i = 0; i < nAllowed; ++i) {
+ if (fabs(1.0 - DetectedRate / AllowedValues[i]) < AllowedError) {
+ DetectedRate = AllowedValues[i];
+ break;
+ }
+ }
+
+ m_DetectedFrameTimeHistoryHistory[m_DetectedFrameTimePos % 500] = DetectedRate;
+
+ class CAutoInt
+ {
+ public:
+
+ int m_Int;
+
+ CAutoInt() {
+ m_Int = 0;
+ }
+ CAutoInt(int _Other) {
+ m_Int = _Other;
+ }
+
+ operator int () const {
+ return m_Int;
+ }
+
+ CAutoInt& operator ++ () {
+ ++m_Int;
+ return *this;
+ }
+ };
+
+
+ CMap<double, double, CAutoInt, CAutoInt> Map;
+
+ for (int i = 0; i < 500; ++i) {
+ ++Map[m_DetectedFrameTimeHistoryHistory[i]];
+ }
+
+ POSITION Pos = Map.GetStartPosition();
+ double BestVal = 0.0;
+ int BestNum = 5;
+ while (Pos) {
+ double Key;
+ CAutoInt Value;
+ Map.GetNextAssoc(Pos, Key, Value);
+ if (Value.m_Int > BestNum && Key != 0.0) {
+ BestNum = Value.m_Int;
+ BestVal = Key;
+ }
+ }
+
+ m_DetectedLock = false;
+ for (int i = 0; i < nAllowed; ++i) {
+ if (BestVal == AllowedValues[i]) {
+ m_DetectedLock = true;
+ break;
+ }
+ }
+ if (BestVal != 0.0) {
+ m_DetectedFrameRate = BestVal;
+ m_DetectedFrameTime = 1.0 / BestVal;
+ }
+ }
+
+ LONGLONG PredictedNext = PrevTime + m_rtTimePerFrame;
+ LONGLONG PredictedDiff = PredictedNext - Time;
+ if (PredictedDiff < 0) {
+ PredictedDiff = -PredictedDiff;
+ }
+
+ if (m_DetectedFrameTime != 0.0
+ //&& PredictedDiff > 15000
+ && m_DetectedLock && s.m_RenderSettings.iEVREnableFrameTimeCorrection) {
+ double CurrentTime = Time / 10000000.0;
+ double LastTime = m_LastScheduledSampleTimeFP;
+ double PredictedTime = LastTime + m_DetectedFrameTime;
+ if (fabs(PredictedTime - CurrentTime) > 0.0015) { // 1.5 ms wrong, lets correct
+ CurrentTime = PredictedTime;
+ Time = (LONGLONG)(CurrentTime * 10000000.0);
+ pSample->SetSampleTime(Time);
+ pSample->SetSampleDuration(LONGLONG(m_DetectedFrameTime * 10000000.0));
+ m_bCorrectedFrameTime = true;
+ m_FrameTimeCorrection = 30;
+ }
+ m_LastScheduledSampleTimeFP = CurrentTime;
+ } else {
+ m_LastScheduledSampleTimeFP = Time / 10000000.0;
+ }
+ } else {
+ m_LastScheduledSampleTimeFP = Time / 10000000.0;
+ if (Diff > m_rtTimePerFrame * 8) {
+ // Seek
+ m_bSignaledStarvation = false;
+ m_DetectedFrameTimePos = 0;
+ m_DetectedLock = false;
+ }
+ }
+
+ // TRACE_EVR("EVR: Time: %f %f %f\n", Time / 10000000.0, SetDuration / 10000000.0, m_DetectedFrameRate);
+ if (!m_bCorrectedFrameTime && m_FrameTimeCorrection) {
+ --m_FrameTimeCorrection;
+ }
#if 0
- if (Time <= m_LastScheduledUncorrectedSampleTime && m_LastScheduledSampleTime >= 0) {
- PrevTime = m_LastScheduledSampleTime;
- }
-
- m_bCorrectedFrameTime = false;
- if (PrevTime != -1 && (Time >= PrevTime - ((Duration*20)/9) || Time == 0) || ForceFPS != 0.0) {
- if (Time - PrevTime > ((Duration*20)/9) && Time - PrevTime < Duration * 8 || Time == 0 || ((Time - PrevTime) < (Duration / 11)) || ForceFPS != 0.0) {
- // Error!!!!
- Time = PrevTime + Duration;
- pSample->SetSampleTime(Time);
- pSample->SetSampleDuration(Duration);
- m_bCorrectedFrameTime = true;
- TRACE_EVR("EVR: Corrected invalid sample time\n");
- }
- }
- if (Time+Duration*10 < m_LastScheduledSampleTime) {
- // Flush when repeating movie
- FlushSamplesInternal();
- }
+ if (Time <= m_LastScheduledUncorrectedSampleTime && m_LastScheduledSampleTime >= 0) {
+ PrevTime = m_LastScheduledSampleTime;
+ }
+
+ m_bCorrectedFrameTime = false;
+ if (PrevTime != -1 && (Time >= PrevTime - ((Duration * 20) / 9) || Time == 0) || ForceFPS != 0.0) {
+ if (Time - PrevTime > ((Duration * 20) / 9) && Time - PrevTime < Duration * 8 || Time == 0 || ((Time - PrevTime) < (Duration / 11)) || ForceFPS != 0.0) {
+ // Error!!!!
+ Time = PrevTime + Duration;
+ pSample->SetSampleTime(Time);
+ pSample->SetSampleDuration(Duration);
+ m_bCorrectedFrameTime = true;
+ TRACE_EVR("EVR: Corrected invalid sample time\n");
+ }
+ }
+ if (Time + Duration * 10 < m_LastScheduledSampleTime) {
+ // Flush when repeating movie
+ FlushSamplesInternal();
+ }
#endif
#if 0
- static LONGLONG LastDuration = 0;
- LONGLONG SetDuration = m_rtTimePerFrame;
- pSample->GetSampleDuration(&SetDuration);
- if (SetDuration != LastDuration) {
- TRACE_EVR("EVR: Old duration: %I64d New duration: %I64d\n", LastDuration, SetDuration);
- }
- LastDuration = SetDuration;
+ static LONGLONG LastDuration = 0;
+ LONGLONG SetDuration = m_rtTimePerFrame;
+ pSample->GetSampleDuration(&SetDuration);
+ if (SetDuration != LastDuration) {
+ TRACE_EVR("EVR: Old duration: %I64d New duration: %I64d\n", LastDuration, SetDuration);
+ }
+ LastDuration = SetDuration;
#endif
- m_LastScheduledSampleTime = Time;
+ m_LastScheduledSampleTime = Time;
- m_ScheduledSamples.AddTail(pSample);
+ m_ScheduledSamples.AddTail(pSample);
- }
+ }
}
void CEVRAllocatorPresenter::FlushSamples()
{
- CAutoLock lock(this);
- CAutoLock lock2(&m_SampleQueueLock);
+ CAutoLock lock(this);
+ CAutoLock lock2(&m_SampleQueueLock);
- FlushSamplesInternal();
- m_LastScheduledSampleTime = -1;
+ FlushSamplesInternal();
+ m_LastScheduledSampleTime = -1;
}
void CEVRAllocatorPresenter::FlushSamplesInternal()
{
- while (m_ScheduledSamples.GetCount() > 0) {
- CComPtr<IMFSample> pMFSample;
+ while (m_ScheduledSamples.GetCount() > 0) {
+ CComPtr<IMFSample> pMFSample;
- pMFSample = m_ScheduledSamples.RemoveHead();
- MoveToFreeList (pMFSample, true);
- }
+ pMFSample = m_ScheduledSamples.RemoveHead();
+ MoveToFreeList(pMFSample, true);
+ }
- m_LastSampleOffset = 0;
- m_bLastSampleOffsetValid = false;
- m_bSignaledStarvation = false;
+ m_LastSampleOffset = 0;
+ m_bLastSampleOffsetValid = false;
+ m_bSignaledStarvation = false;
}
diff --git a/src/filters/renderer/VideoRenderers/EVRAllocatorPresenter.h b/src/filters/renderer/VideoRenderers/EVRAllocatorPresenter.h
index c5bdd72bd..7a0121cb4 100644
--- a/src/filters/renderer/VideoRenderers/EVRAllocatorPresenter.h
+++ b/src/filters/renderer/VideoRenderers/EVRAllocatorPresenter.h
@@ -23,260 +23,260 @@
#pragma once
#include "DX9AllocatorPresenter.h"
-#include <mfapi.h> // API Media Foundation
+#include <mfapi.h> // API Media Foundation
#include <evr9.h>
namespace DSObjects
{
- // dxva.dll
- typedef HRESULT (__stdcall *PTR_DXVA2CreateDirect3DDeviceManager9)(UINT* pResetToken, IDirect3DDeviceManager9** ppDeviceManager);
-
- // mf.dll
- typedef HRESULT (__stdcall *PTR_MFCreatePresentationClock)(IMFPresentationClock** ppPresentationClock);
-
- // evr.dll
- typedef HRESULT (__stdcall *PTR_MFCreateDXSurfaceBuffer)(REFIID riid, IUnknown* punkSurface, BOOL fBottomUpWhenLinear, IMFMediaBuffer** ppBuffer);
- typedef HRESULT (__stdcall *PTR_MFCreateVideoSampleFromSurface)(IUnknown* pUnkSurface, IMFSample** ppSample);
- typedef HRESULT (__stdcall *PTR_MFCreateVideoMediaType)(const MFVIDEOFORMAT* pVideoFormat, IMFVideoMediaType** ppIVideoMediaType);
-
- // AVRT.dll
- typedef HANDLE (__stdcall *PTR_AvSetMmThreadCharacteristicsW)(LPCWSTR TaskName, LPDWORD TaskIndex);
- typedef BOOL (__stdcall *PTR_AvSetMmThreadPriority)(HANDLE AvrtHandle, AVRT_PRIORITY Priority);
- typedef BOOL (__stdcall *PTR_AvRevertMmThreadCharacteristics)(HANDLE AvrtHandle);
-
- class COuterEVR;
-
- class CEVRAllocatorPresenter :
- public CDX9AllocatorPresenter,
- public IMFGetService,
- public IMFTopologyServiceLookupClient,
- public IMFVideoDeviceID,
- public IMFVideoPresenter,
- public IDirect3DDeviceManager9,
-
- public IMFAsyncCallback,
- public IQualProp,
- public IMFRateSupport,
- public IMFVideoDisplayControl,
- public IEVRTrustedVideoPlugin
- /* public IMFVideoPositionMapper, // Non mandatory EVR Presenter Interfaces (see later...)
- */
- {
- public:
- CEVRAllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString &_Error);
- ~CEVRAllocatorPresenter(void);
-
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
- STDMETHODIMP_(bool) Paint(bool fAll);
- STDMETHODIMP GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight);
- STDMETHODIMP InitializeDevice(IMFMediaType* pMediaType);
- STDMETHODIMP_(bool) ResetDevice();
- STDMETHODIMP_(bool) DisplayChange();
-
- // IMFClockStateSink
- STDMETHODIMP OnClockStart(/* [in] */ MFTIME hnsSystemTime, /* [in] */ LONGLONG llClockStartOffset);
- STDMETHODIMP OnClockStop(/* [in] */ MFTIME hnsSystemTime);
- STDMETHODIMP OnClockPause(/* [in] */ MFTIME hnsSystemTime);
- STDMETHODIMP OnClockRestart(/* [in] */ MFTIME hnsSystemTime);
- STDMETHODIMP OnClockSetRate(/* [in] */ MFTIME hnsSystemTime, /* [in] */ float flRate);
-
- // IBaseFilter delegate
- bool GetState( DWORD dwMilliSecsTimeout, FILTER_STATE *State, HRESULT &_ReturnValue);
-
- // IQualProp (EVR statistics window)
- STDMETHODIMP get_FramesDroppedInRenderer (int *pcFrames);
- STDMETHODIMP get_FramesDrawn (int *pcFramesDrawn);
- STDMETHODIMP get_AvgFrameRate (int *piAvgFrameRate);
- STDMETHODIMP get_Jitter (int *iJitter);
- STDMETHODIMP get_AvgSyncOffset (int *piAvg);
- STDMETHODIMP get_DevSyncOffset (int *piDev);
-
-
- // IMFRateSupport
- STDMETHODIMP GetSlowestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float *pflRate);
- STDMETHODIMP GetFastestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float *pflRate);
- STDMETHODIMP IsRateSupported(BOOL fThin, float flRate, float *pflNearestSupportedRate);
-
- float GetMaxRate(BOOL bThin);
-
-
- // IMFVideoPresenter
- STDMETHODIMP ProcessMessage(MFVP_MESSAGE_TYPE eMessage, ULONG_PTR ulParam);
- STDMETHODIMP GetCurrentMediaType(__deref_out IMFVideoMediaType **ppMediaType);
-
- // IMFTopologyServiceLookupClient
- STDMETHODIMP InitServicePointers(/* [in] */ __in IMFTopologyServiceLookup *pLookup);
- STDMETHODIMP ReleaseServicePointers();
-
- // IMFVideoDeviceID
- STDMETHODIMP GetDeviceID(/* [out] */ __out IID *pDeviceID);
-
- // IMFGetService
- STDMETHODIMP GetService (/* [in] */ __RPC__in REFGUID guidService,
- /* [in] */ __RPC__in REFIID riid,
- /* [iid_is][out] */ __RPC__deref_out_opt LPVOID *ppvObject);
-
- // IMFAsyncCallback
- STDMETHODIMP GetParameters( /* [out] */ __RPC__out DWORD *pdwFlags, /* [out] */ __RPC__out DWORD *pdwQueue);
- STDMETHODIMP Invoke ( /* [in] */ __RPC__in_opt IMFAsyncResult *pAsyncResult);
-
- // IMFVideoDisplayControl
- STDMETHODIMP GetNativeVideoSize(SIZE *pszVideo, SIZE *pszARVideo);
- STDMETHODIMP GetIdealVideoSize(SIZE *pszMin, SIZE *pszMax);
- STDMETHODIMP SetVideoPosition(const MFVideoNormalizedRect *pnrcSource, const LPRECT prcDest);
- STDMETHODIMP GetVideoPosition(MFVideoNormalizedRect *pnrcSource, LPRECT prcDest);
- STDMETHODIMP SetAspectRatioMode(DWORD dwAspectRatioMode);
- STDMETHODIMP GetAspectRatioMode(DWORD *pdwAspectRatioMode);
- STDMETHODIMP SetVideoWindow(HWND hwndVideo);
- STDMETHODIMP GetVideoWindow(HWND *phwndVideo);
- STDMETHODIMP RepaintVideo( void);
- STDMETHODIMP GetCurrentImage(BITMAPINFOHEADER *pBih, BYTE **pDib, DWORD *pcbDib, LONGLONG *pTimeStamp);
- STDMETHODIMP SetBorderColor(COLORREF Clr);
- STDMETHODIMP GetBorderColor(COLORREF *pClr);
- STDMETHODIMP SetRenderingPrefs(DWORD dwRenderFlags);
- STDMETHODIMP GetRenderingPrefs(DWORD *pdwRenderFlags);
- STDMETHODIMP SetFullscreen(BOOL fFullscreen);
- STDMETHODIMP GetFullscreen(BOOL *pfFullscreen);
-
- // IEVRTrustedVideoPlugin
- STDMETHODIMP IsInTrustedVideoMode(BOOL *pYes);
- STDMETHODIMP CanConstrict(BOOL *pYes);
- STDMETHODIMP SetConstriction(DWORD dwKPix);
- STDMETHODIMP DisableImageExport(BOOL bDisable);
-
- // IDirect3DDeviceManager9
- STDMETHODIMP ResetDevice(IDirect3DDevice9 *pDevice,UINT resetToken);
- STDMETHODIMP OpenDeviceHandle(HANDLE *phDevice);
- STDMETHODIMP CloseDeviceHandle(HANDLE hDevice);
- STDMETHODIMP TestDevice(HANDLE hDevice);
- STDMETHODIMP LockDevice(HANDLE hDevice, IDirect3DDevice9 **ppDevice, BOOL fBlock);
- STDMETHODIMP UnlockDevice(HANDLE hDevice, BOOL fSaveState);
- STDMETHODIMP GetVideoService(HANDLE hDevice, REFIID riid, void **ppService);
-
- protected :
- void OnResetDevice();
- virtual void OnVBlankFinished(bool fAll, LONGLONG PerformanceCounter);
-
- double m_ModeratedTime;
- LONGLONG m_ModeratedTimeLast;
- LONGLONG m_ModeratedClockLast;
- LONGLONG m_ModeratedTimer;
- MFCLOCK_STATE m_LastClockState;
- LONGLONG GetClockTime(LONGLONG PerformanceCounter);
-
- private :
-
- typedef enum {
- Started = State_Running,
- Stopped = State_Stopped,
- Paused = State_Paused,
- Shutdown = State_Running + 1
- } RENDER_STATE;
-
- COuterEVR* m_pOuterEVR;
- CComPtr<IMFClock> m_pClock;
- CComPtr<IDirect3DDeviceManager9> m_pD3DManager;
- CComPtr<IMFTransform> m_pMixer;
- CComPtr<IMediaEventSink> m_pSink;
- CComPtr<IMFVideoMediaType> m_pMediaType;
- MFVideoAspectRatioMode m_dwVideoAspectRatioMode;
- MFVideoRenderPrefs m_dwVideoRenderPrefs;
- COLORREF m_BorderColor;
-
-
- HANDLE m_hEvtQuit; // Stop rendering thread event
- bool m_bEvtQuit;
- HANDLE m_hEvtFlush; // Discard all buffers
- bool m_bEvtFlush;
-
- bool m_fUseInternalTimer;
- int32 m_LastSetOutputRange;
- bool m_bPendingRenegotiate;
- bool m_bPendingMediaFinished;
-
- HANDLE m_hThread;
- HANDLE m_hGetMixerThread;
- RENDER_STATE m_nRenderState;
-
- CCritSec m_SampleQueueLock;
- CCritSec m_ImageProcessingLock;
-
- CInterfaceList<IMFSample, &IID_IMFSample> m_FreeSamples;
- CInterfaceList<IMFSample, &IID_IMFSample> m_ScheduledSamples;
- IMFSample * m_pCurrentDisplaydSample;
- bool m_bWaitingSample;
- bool m_bLastSampleOffsetValid;
- LONGLONG m_LastScheduledSampleTime;
- double m_LastScheduledSampleTimeFP;
- LONGLONG m_LastScheduledUncorrectedSampleTime;
- LONGLONG m_MaxSampleDuration;
- LONGLONG m_LastSampleOffset;
- LONGLONG m_VSyncOffsetHistory[5];
- LONGLONG m_LastPredictedSync;
- int m_VSyncOffsetHistoryPos;
-
- UINT m_nResetToken;
- int m_nStepCount;
-
- bool m_bSignaledStarvation;
- LONGLONG m_StarvationClock;
-
- // Stats variable for IQualProp
- UINT m_pcFrames;
- UINT m_nDroppedUpdate;
- UINT m_pcFramesDrawn; // Retrieves the number of frames drawn since streaming started
- UINT m_piAvg;
- UINT m_piDev;
-
-
- void GetMixerThread();
- static DWORD WINAPI GetMixerThreadStatic(LPVOID lpParam);
-
- bool GetImageFromMixer();
- void RenderThread();
- static DWORD WINAPI PresentThread(LPVOID lpParam);
- void ResetStats();
- void StartWorkerThreads();
- void StopWorkerThreads();
- HRESULT CheckShutdown() const;
- void CompleteFrameStep(bool bCancel);
- void CheckWaitingSampleFromMixer();
-
- void RemoveAllSamples();
- HRESULT GetFreeSample(IMFSample** ppSample);
- HRESULT GetScheduledSample(IMFSample** ppSample, int &_Count);
- void MoveToFreeList(IMFSample* pSample, bool bTail);
- void MoveToScheduledList(IMFSample* pSample, bool _bSorted);
- void FlushSamples();
- void FlushSamplesInternal();
-
- // === Media type negotiation functions
- HRESULT RenegotiateMediaType();
- HRESULT IsMediaTypeSupported(IMFMediaType* pMixerType);
- HRESULT CreateProposedOutputType(IMFMediaType* pMixerType, IMFMediaType** pType);
- HRESULT SetMediaType(IMFMediaType* pType);
- HRESULT GetMediaTypeFourCC(IMFMediaType* pType, DWORD* pFourCC);
- HRESULT GetMediaTypeMerit(IMFMediaType* pType, int *pMerit);
- LPCTSTR GetMediaTypeFormatDesc(IMFMediaType* pMediaType);
-
- // === Functions pointers on Vista / .Net3 specifics library
- PTR_DXVA2CreateDirect3DDeviceManager9 pfDXVA2CreateDirect3DDeviceManager9;
- PTR_MFCreateDXSurfaceBuffer pfMFCreateDXSurfaceBuffer;
- PTR_MFCreateVideoSampleFromSurface pfMFCreateVideoSampleFromSurface;
- PTR_MFCreateVideoMediaType pfMFCreateVideoMediaType;
+ // dxva.dll
+ typedef HRESULT(__stdcall* PTR_DXVA2CreateDirect3DDeviceManager9)(UINT* pResetToken, IDirect3DDeviceManager9** ppDeviceManager);
+
+ // mf.dll
+ typedef HRESULT(__stdcall* PTR_MFCreatePresentationClock)(IMFPresentationClock** ppPresentationClock);
+
+ // evr.dll
+ typedef HRESULT(__stdcall* PTR_MFCreateDXSurfaceBuffer)(REFIID riid, IUnknown* punkSurface, BOOL fBottomUpWhenLinear, IMFMediaBuffer** ppBuffer);
+ typedef HRESULT(__stdcall* PTR_MFCreateVideoSampleFromSurface)(IUnknown* pUnkSurface, IMFSample** ppSample);
+ typedef HRESULT(__stdcall* PTR_MFCreateVideoMediaType)(const MFVIDEOFORMAT* pVideoFormat, IMFVideoMediaType** ppIVideoMediaType);
+
+ // AVRT.dll
+ typedef HANDLE(__stdcall* PTR_AvSetMmThreadCharacteristicsW)(LPCWSTR TaskName, LPDWORD TaskIndex);
+ typedef BOOL (__stdcall* PTR_AvSetMmThreadPriority)(HANDLE AvrtHandle, AVRT_PRIORITY Priority);
+ typedef BOOL (__stdcall* PTR_AvRevertMmThreadCharacteristics)(HANDLE AvrtHandle);
+
+ class COuterEVR;
+
+ class CEVRAllocatorPresenter :
+ public CDX9AllocatorPresenter,
+ public IMFGetService,
+ public IMFTopologyServiceLookupClient,
+ public IMFVideoDeviceID,
+ public IMFVideoPresenter,
+ public IDirect3DDeviceManager9,
+
+ public IMFAsyncCallback,
+ public IQualProp,
+ public IMFRateSupport,
+ public IMFVideoDisplayControl,
+ public IEVRTrustedVideoPlugin
+ /* public IMFVideoPositionMapper, // Non mandatory EVR Presenter Interfaces (see later...)
+ */
+ {
+ public:
+ CEVRAllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString& _Error);
+ ~CEVRAllocatorPresenter(void);
+
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
+ STDMETHODIMP_(bool) Paint(bool fAll);
+ STDMETHODIMP GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight);
+ STDMETHODIMP InitializeDevice(IMFMediaType* pMediaType);
+ STDMETHODIMP_(bool) ResetDevice();
+ STDMETHODIMP_(bool) DisplayChange();
+
+ // IMFClockStateSink
+ STDMETHODIMP OnClockStart(/* [in] */ MFTIME hnsSystemTime, /* [in] */ LONGLONG llClockStartOffset);
+ STDMETHODIMP OnClockStop(/* [in] */ MFTIME hnsSystemTime);
+ STDMETHODIMP OnClockPause(/* [in] */ MFTIME hnsSystemTime);
+ STDMETHODIMP OnClockRestart(/* [in] */ MFTIME hnsSystemTime);
+ STDMETHODIMP OnClockSetRate(/* [in] */ MFTIME hnsSystemTime, /* [in] */ float flRate);
+
+ // IBaseFilter delegate
+ bool GetState(DWORD dwMilliSecsTimeout, FILTER_STATE* State, HRESULT& _ReturnValue);
+
+ // IQualProp (EVR statistics window)
+ STDMETHODIMP get_FramesDroppedInRenderer(int* pcFrames);
+ STDMETHODIMP get_FramesDrawn(int* pcFramesDrawn);
+ STDMETHODIMP get_AvgFrameRate(int* piAvgFrameRate);
+ STDMETHODIMP get_Jitter(int* iJitter);
+ STDMETHODIMP get_AvgSyncOffset(int* piAvg);
+ STDMETHODIMP get_DevSyncOffset(int* piDev);
+
+
+ // IMFRateSupport
+ STDMETHODIMP GetSlowestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float* pflRate);
+ STDMETHODIMP GetFastestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float* pflRate);
+ STDMETHODIMP IsRateSupported(BOOL fThin, float flRate, float* pflNearestSupportedRate);
+
+ float GetMaxRate(BOOL bThin);
+
+
+ // IMFVideoPresenter
+ STDMETHODIMP ProcessMessage(MFVP_MESSAGE_TYPE eMessage, ULONG_PTR ulParam);
+ STDMETHODIMP GetCurrentMediaType(__deref_out IMFVideoMediaType** ppMediaType);
+
+ // IMFTopologyServiceLookupClient
+ STDMETHODIMP InitServicePointers(/* [in] */ __in IMFTopologyServiceLookup* pLookup);
+ STDMETHODIMP ReleaseServicePointers();
+
+ // IMFVideoDeviceID
+ STDMETHODIMP GetDeviceID(/* [out] */ __out IID* pDeviceID);
+
+ // IMFGetService
+ STDMETHODIMP GetService(/* [in] */ __RPC__in REFGUID guidService,
+ /* [in] */ __RPC__in REFIID riid,
+ /* [iid_is][out] */ __RPC__deref_out_opt LPVOID* ppvObject);
+
+ // IMFAsyncCallback
+ STDMETHODIMP GetParameters(/* [out] */ __RPC__out DWORD* pdwFlags, /* [out] */ __RPC__out DWORD* pdwQueue);
+ STDMETHODIMP Invoke(/* [in] */ __RPC__in_opt IMFAsyncResult* pAsyncResult);
+
+ // IMFVideoDisplayControl
+ STDMETHODIMP GetNativeVideoSize(SIZE* pszVideo, SIZE* pszARVideo);
+ STDMETHODIMP GetIdealVideoSize(SIZE* pszMin, SIZE* pszMax);
+ STDMETHODIMP SetVideoPosition(const MFVideoNormalizedRect* pnrcSource, const LPRECT prcDest);
+ STDMETHODIMP GetVideoPosition(MFVideoNormalizedRect* pnrcSource, LPRECT prcDest);
+ STDMETHODIMP SetAspectRatioMode(DWORD dwAspectRatioMode);
+ STDMETHODIMP GetAspectRatioMode(DWORD* pdwAspectRatioMode);
+ STDMETHODIMP SetVideoWindow(HWND hwndVideo);
+ STDMETHODIMP GetVideoWindow(HWND* phwndVideo);
+ STDMETHODIMP RepaintVideo(void);
+ STDMETHODIMP GetCurrentImage(BITMAPINFOHEADER* pBih, BYTE** pDib, DWORD* pcbDib, LONGLONG* pTimeStamp);
+ STDMETHODIMP SetBorderColor(COLORREF Clr);
+ STDMETHODIMP GetBorderColor(COLORREF* pClr);
+ STDMETHODIMP SetRenderingPrefs(DWORD dwRenderFlags);
+ STDMETHODIMP GetRenderingPrefs(DWORD* pdwRenderFlags);
+ STDMETHODIMP SetFullscreen(BOOL fFullscreen);
+ STDMETHODIMP GetFullscreen(BOOL* pfFullscreen);
+
+ // IEVRTrustedVideoPlugin
+ STDMETHODIMP IsInTrustedVideoMode(BOOL* pYes);
+ STDMETHODIMP CanConstrict(BOOL* pYes);
+ STDMETHODIMP SetConstriction(DWORD dwKPix);
+ STDMETHODIMP DisableImageExport(BOOL bDisable);
+
+ // IDirect3DDeviceManager9
+ STDMETHODIMP ResetDevice(IDirect3DDevice9* pDevice, UINT resetToken);
+ STDMETHODIMP OpenDeviceHandle(HANDLE* phDevice);
+ STDMETHODIMP CloseDeviceHandle(HANDLE hDevice);
+ STDMETHODIMP TestDevice(HANDLE hDevice);
+ STDMETHODIMP LockDevice(HANDLE hDevice, IDirect3DDevice9** ppDevice, BOOL fBlock);
+ STDMETHODIMP UnlockDevice(HANDLE hDevice, BOOL fSaveState);
+ STDMETHODIMP GetVideoService(HANDLE hDevice, REFIID riid, void** ppService);
+
+ protected :
+ void OnResetDevice();
+ virtual void OnVBlankFinished(bool fAll, LONGLONG PerformanceCounter);
+
+ double m_ModeratedTime;
+ LONGLONG m_ModeratedTimeLast;
+ LONGLONG m_ModeratedClockLast;
+ LONGLONG m_ModeratedTimer;
+ MFCLOCK_STATE m_LastClockState;
+ LONGLONG GetClockTime(LONGLONG PerformanceCounter);
+
+ private :
+
+ typedef enum {
+ Started = State_Running,
+ Stopped = State_Stopped,
+ Paused = State_Paused,
+ Shutdown = State_Running + 1
+ } RENDER_STATE;
+
+ COuterEVR* m_pOuterEVR;
+ CComPtr<IMFClock> m_pClock;
+ CComPtr<IDirect3DDeviceManager9> m_pD3DManager;
+ CComPtr<IMFTransform> m_pMixer;
+ CComPtr<IMediaEventSink> m_pSink;
+ CComPtr<IMFVideoMediaType> m_pMediaType;
+ MFVideoAspectRatioMode m_dwVideoAspectRatioMode;
+ MFVideoRenderPrefs m_dwVideoRenderPrefs;
+ COLORREF m_BorderColor;
+
+
+ HANDLE m_hEvtQuit; // Stop rendering thread event
+ bool m_bEvtQuit;
+ HANDLE m_hEvtFlush; // Discard all buffers
+ bool m_bEvtFlush;
+
+ bool m_fUseInternalTimer;
+ int32 m_LastSetOutputRange;
+ bool m_bPendingRenegotiate;
+ bool m_bPendingMediaFinished;
+
+ HANDLE m_hThread;
+ HANDLE m_hGetMixerThread;
+ RENDER_STATE m_nRenderState;
+
+ CCritSec m_SampleQueueLock;
+ CCritSec m_ImageProcessingLock;
+
+ CInterfaceList<IMFSample, &IID_IMFSample> m_FreeSamples;
+ CInterfaceList<IMFSample, &IID_IMFSample> m_ScheduledSamples;
+ IMFSample* m_pCurrentDisplaydSample;
+ bool m_bWaitingSample;
+ bool m_bLastSampleOffsetValid;
+ LONGLONG m_LastScheduledSampleTime;
+ double m_LastScheduledSampleTimeFP;
+ LONGLONG m_LastScheduledUncorrectedSampleTime;
+ LONGLONG m_MaxSampleDuration;
+ LONGLONG m_LastSampleOffset;
+ LONGLONG m_VSyncOffsetHistory[5];
+ LONGLONG m_LastPredictedSync;
+ int m_VSyncOffsetHistoryPos;
+
+ UINT m_nResetToken;
+ int m_nStepCount;
+
+ bool m_bSignaledStarvation;
+ LONGLONG m_StarvationClock;
+
+ // Stats variable for IQualProp
+ UINT m_pcFrames;
+ UINT m_nDroppedUpdate;
+ UINT m_pcFramesDrawn; // Retrieves the number of frames drawn since streaming started
+ UINT m_piAvg;
+ UINT m_piDev;
+
+
+ void GetMixerThread();
+ static DWORD WINAPI GetMixerThreadStatic(LPVOID lpParam);
+
+ bool GetImageFromMixer();
+ void RenderThread();
+ static DWORD WINAPI PresentThread(LPVOID lpParam);
+ void ResetStats();
+ void StartWorkerThreads();
+ void StopWorkerThreads();
+ HRESULT CheckShutdown() const;
+ void CompleteFrameStep(bool bCancel);
+ void CheckWaitingSampleFromMixer();
+
+ void RemoveAllSamples();
+ HRESULT GetFreeSample(IMFSample** ppSample);
+ HRESULT GetScheduledSample(IMFSample** ppSample, int& _Count);
+ void MoveToFreeList(IMFSample* pSample, bool bTail);
+ void MoveToScheduledList(IMFSample* pSample, bool _bSorted);
+ void FlushSamples();
+ void FlushSamplesInternal();
+
+ // === Media type negotiation functions
+ HRESULT RenegotiateMediaType();
+ HRESULT IsMediaTypeSupported(IMFMediaType* pMixerType);
+ HRESULT CreateProposedOutputType(IMFMediaType* pMixerType, IMFMediaType** pType);
+ HRESULT SetMediaType(IMFMediaType* pType);
+ HRESULT GetMediaTypeFourCC(IMFMediaType* pType, DWORD* pFourCC);
+ HRESULT GetMediaTypeMerit(IMFMediaType* pType, int* pMerit);
+ LPCTSTR GetMediaTypeFormatDesc(IMFMediaType* pMediaType);
+
+ // === Functions pointers on Vista / .Net3 specifics library
+ PTR_DXVA2CreateDirect3DDeviceManager9 pfDXVA2CreateDirect3DDeviceManager9;
+ PTR_MFCreateDXSurfaceBuffer pfMFCreateDXSurfaceBuffer;
+ PTR_MFCreateVideoSampleFromSurface pfMFCreateVideoSampleFromSurface;
+ PTR_MFCreateVideoMediaType pfMFCreateVideoMediaType;
#if 0
- HRESULT (__stdcall *pMFCreateMediaType)(__deref_out IMFMediaType** ppMFType);
- HRESULT (__stdcall *pMFInitMediaTypeFromAMMediaType)(__in IMFMediaType *pMFType, __in const AM_MEDIA_TYPE *pAMType);
- HRESULT (__stdcall *pMFInitAMMediaTypeFromMFMediaType)(__in IMFMediaType *pMFType, __in GUID guidFormatBlockType, __inout AM_MEDIA_TYPE *pAMType);
+ HRESULT(__stdcall* pMFCreateMediaType)(__deref_out IMFMediaType** ppMFType);
+ HRESULT(__stdcall* pMFInitMediaTypeFromAMMediaType)(__in IMFMediaType* pMFType, __in const AM_MEDIA_TYPE* pAMType);
+ HRESULT(__stdcall* pMFInitAMMediaTypeFromMFMediaType)(__in IMFMediaType* pMFType, __in GUID guidFormatBlockType, __inout AM_MEDIA_TYPE* pAMType);
#endif
- PTR_AvSetMmThreadCharacteristicsW pfAvSetMmThreadCharacteristicsW;
- PTR_AvSetMmThreadPriority pfAvSetMmThreadPriority;
- PTR_AvRevertMmThreadCharacteristics pfAvRevertMmThreadCharacteristics;
- };
+ PTR_AvSetMmThreadCharacteristicsW pfAvSetMmThreadCharacteristicsW;
+ PTR_AvSetMmThreadPriority pfAvSetMmThreadPriority;
+ PTR_AvRevertMmThreadCharacteristics pfAvRevertMmThreadCharacteristics;
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/IPinHook.cpp b/src/filters/renderer/VideoRenderers/IPinHook.cpp
index 35f60c66d..006970cfe 100644
--- a/src/filters/renderer/VideoRenderers/IPinHook.cpp
+++ b/src/filters/renderer/VideoRenderers/IPinHook.cpp
@@ -43,620 +43,620 @@
#define LOG_FILE_BITSTREAM _T("bitstream.log")
#endif
-REFERENCE_TIME g_tSegmentStart = 0;
-REFERENCE_TIME g_tSampleStart = 0;
-GUID g_guidDXVADecoder = GUID_NULL;
-int g_nDXVAVersion = 0;
+REFERENCE_TIME g_tSegmentStart = 0;
+REFERENCE_TIME g_tSampleStart = 0;
+GUID g_guidDXVADecoder = GUID_NULL;
+int g_nDXVAVersion = 0;
-IPinCVtbl* g_pPinCVtbl = NULL;
-IMemInputPinCVtbl* g_pMemInputPinCVtbl = NULL;
+IPinCVtbl* g_pPinCVtbl = NULL;
+IMemInputPinCVtbl* g_pMemInputPinCVtbl = NULL;
typedef struct {
- const int Format;
- const LPCTSTR Description;
+ const int Format;
+ const LPCTSTR Description;
} D3DFORMAT_TYPE;
const D3DFORMAT_TYPE D3DFormatType[] = {
- { D3DFMT_UNKNOWN , _T("D3DFMT_UNKNOWN ") },
- { D3DFMT_R8G8B8 , _T("D3DFMT_R8G8B8 ") },
- { D3DFMT_A8R8G8B8 , _T("D3DFMT_A8R8G8B8 ") },
- { D3DFMT_X8R8G8B8 , _T("D3DFMT_X8R8G8B8 ") },
- { D3DFMT_R5G6B5 , _T("D3DFMT_R5G6B5 ") },
- { D3DFMT_X1R5G5B5 , _T("D3DFMT_X1R5G5B5 ") },
- { D3DFMT_A1R5G5B5 , _T("D3DFMT_A1R5G5B5 ") },
- { D3DFMT_A4R4G4B4 , _T("D3DFMT_A4R4G4B4 ") },
- { D3DFMT_R3G3B2 , _T("D3DFMT_R3G3B2 ") },
- { D3DFMT_A8 , _T("D3DFMT_A8 ") },
- { D3DFMT_A8R3G3B2 , _T("D3DFMT_A8R3G3B2 ") },
- { D3DFMT_X4R4G4B4 , _T("D3DFMT_X4R4G4B4 ") },
- { D3DFMT_A2B10G10R10 , _T("D3DFMT_A2B10G10R10 ") },
- { D3DFMT_A8B8G8R8 , _T("D3DFMT_A8B8G8R8 ") },
- { D3DFMT_X8B8G8R8 , _T("D3DFMT_X8B8G8R8 ") },
- { D3DFMT_G16R16 , _T("D3DFMT_G16R16 ") },
- { D3DFMT_A2R10G10B10 , _T("D3DFMT_A2R10G10B10 ") },
- { D3DFMT_A16B16G16R16 , _T("D3DFMT_A16B16G16R16 ") },
- { D3DFMT_A8P8 , _T("D3DFMT_A8P8 ") },
- { D3DFMT_P8 , _T("D3DFMT_P8 ") },
- { D3DFMT_L8 , _T("D3DFMT_L8 ") },
- { D3DFMT_A8L8 , _T("D3DFMT_A8L8 ") },
- { D3DFMT_A4L4 , _T("D3DFMT_A4L4 ") },
- { D3DFMT_X8L8V8U8 , _T("D3DFMT_X8L8V8U8 ") },
- { D3DFMT_Q8W8V8U8 , _T("D3DFMT_Q8W8V8U8 ") },
- { D3DFMT_V16U16 , _T("D3DFMT_V16U16 ") },
- { D3DFMT_A2W10V10U10 , _T("D3DFMT_A2W10V10U10 ") },
- { D3DFMT_UYVY , _T("D3DFMT_UYVY ") },
- { D3DFMT_R8G8_B8G8 , _T("D3DFMT_R8G8_B8G8 ") },
- { D3DFMT_YUY2 , _T("D3DFMT_YUY2 ") },
- { D3DFMT_G8R8_G8B8 , _T("D3DFMT_G8R8_G8B8 ") },
- { D3DFMT_DXT1 , _T("D3DFMT_DXT1 ") },
- { D3DFMT_DXT2 , _T("D3DFMT_DXT2 ") },
- { D3DFMT_DXT3 , _T("D3DFMT_DXT3 ") },
- { D3DFMT_DXT4 , _T("D3DFMT_DXT4 ") },
- { D3DFMT_DXT5 , _T("D3DFMT_DXT5 ") },
- { D3DFMT_D16_LOCKABLE , _T("D3DFMT_D16_LOCKABLE ") },
- { D3DFMT_D32 , _T("D3DFMT_D32 ") },
- { D3DFMT_D15S1 , _T("D3DFMT_D15S1 ") },
- { D3DFMT_D24S8 , _T("D3DFMT_D24S8 ") },
- { D3DFMT_D24X8 , _T("D3DFMT_D24X8 ") },
- { D3DFMT_D24X4S4 , _T("D3DFMT_D24X4S4 ") },
- { D3DFMT_D16 , _T("D3DFMT_D16 ") },
- { D3DFMT_D32F_LOCKABLE , _T("D3DFMT_D32F_LOCKABLE") },
- { D3DFMT_D24FS8 , _T("D3DFMT_D24FS8 ") },
- { D3DFMT_L16 , _T("D3DFMT_L16 ") },
- { D3DFMT_VERTEXDATA , _T("D3DFMT_VERTEXDATA ") },
- { D3DFMT_INDEX16 , _T("D3DFMT_INDEX16 ") },
- { D3DFMT_INDEX32 , _T("D3DFMT_INDEX32 ") },
- { D3DFMT_Q16W16V16U16 , _T("D3DFMT_Q16W16V16U16 ") },
-
- { MAKEFOURCC('N','V','1','2') , _T("D3DFMT_NV12") },
- { MAKEFOURCC('N','V','2','4') , _T("D3DFMT_NV24") },
+ { D3DFMT_UNKNOWN , _T("D3DFMT_UNKNOWN ") },
+ { D3DFMT_R8G8B8 , _T("D3DFMT_R8G8B8 ") },
+ { D3DFMT_A8R8G8B8 , _T("D3DFMT_A8R8G8B8 ") },
+ { D3DFMT_X8R8G8B8 , _T("D3DFMT_X8R8G8B8 ") },
+ { D3DFMT_R5G6B5 , _T("D3DFMT_R5G6B5 ") },
+ { D3DFMT_X1R5G5B5 , _T("D3DFMT_X1R5G5B5 ") },
+ { D3DFMT_A1R5G5B5 , _T("D3DFMT_A1R5G5B5 ") },
+ { D3DFMT_A4R4G4B4 , _T("D3DFMT_A4R4G4B4 ") },
+ { D3DFMT_R3G3B2 , _T("D3DFMT_R3G3B2 ") },
+ { D3DFMT_A8 , _T("D3DFMT_A8 ") },
+ { D3DFMT_A8R3G3B2 , _T("D3DFMT_A8R3G3B2 ") },
+ { D3DFMT_X4R4G4B4 , _T("D3DFMT_X4R4G4B4 ") },
+ { D3DFMT_A2B10G10R10 , _T("D3DFMT_A2B10G10R10 ") },
+ { D3DFMT_A8B8G8R8 , _T("D3DFMT_A8B8G8R8 ") },
+ { D3DFMT_X8B8G8R8 , _T("D3DFMT_X8B8G8R8 ") },
+ { D3DFMT_G16R16 , _T("D3DFMT_G16R16 ") },
+ { D3DFMT_A2R10G10B10 , _T("D3DFMT_A2R10G10B10 ") },
+ { D3DFMT_A16B16G16R16 , _T("D3DFMT_A16B16G16R16 ") },
+ { D3DFMT_A8P8 , _T("D3DFMT_A8P8 ") },
+ { D3DFMT_P8 , _T("D3DFMT_P8 ") },
+ { D3DFMT_L8 , _T("D3DFMT_L8 ") },
+ { D3DFMT_A8L8 , _T("D3DFMT_A8L8 ") },
+ { D3DFMT_A4L4 , _T("D3DFMT_A4L4 ") },
+ { D3DFMT_X8L8V8U8 , _T("D3DFMT_X8L8V8U8 ") },
+ { D3DFMT_Q8W8V8U8 , _T("D3DFMT_Q8W8V8U8 ") },
+ { D3DFMT_V16U16 , _T("D3DFMT_V16U16 ") },
+ { D3DFMT_A2W10V10U10 , _T("D3DFMT_A2W10V10U10 ") },
+ { D3DFMT_UYVY , _T("D3DFMT_UYVY ") },
+ { D3DFMT_R8G8_B8G8 , _T("D3DFMT_R8G8_B8G8 ") },
+ { D3DFMT_YUY2 , _T("D3DFMT_YUY2 ") },
+ { D3DFMT_G8R8_G8B8 , _T("D3DFMT_G8R8_G8B8 ") },
+ { D3DFMT_DXT1 , _T("D3DFMT_DXT1 ") },
+ { D3DFMT_DXT2 , _T("D3DFMT_DXT2 ") },
+ { D3DFMT_DXT3 , _T("D3DFMT_DXT3 ") },
+ { D3DFMT_DXT4 , _T("D3DFMT_DXT4 ") },
+ { D3DFMT_DXT5 , _T("D3DFMT_DXT5 ") },
+ { D3DFMT_D16_LOCKABLE , _T("D3DFMT_D16_LOCKABLE ") },
+ { D3DFMT_D32 , _T("D3DFMT_D32 ") },
+ { D3DFMT_D15S1 , _T("D3DFMT_D15S1 ") },
+ { D3DFMT_D24S8 , _T("D3DFMT_D24S8 ") },
+ { D3DFMT_D24X8 , _T("D3DFMT_D24X8 ") },
+ { D3DFMT_D24X4S4 , _T("D3DFMT_D24X4S4 ") },
+ { D3DFMT_D16 , _T("D3DFMT_D16 ") },
+ { D3DFMT_D32F_LOCKABLE , _T("D3DFMT_D32F_LOCKABLE") },
+ { D3DFMT_D24FS8 , _T("D3DFMT_D24FS8 ") },
+ { D3DFMT_L16 , _T("D3DFMT_L16 ") },
+ { D3DFMT_VERTEXDATA , _T("D3DFMT_VERTEXDATA ") },
+ { D3DFMT_INDEX16 , _T("D3DFMT_INDEX16 ") },
+ { D3DFMT_INDEX32 , _T("D3DFMT_INDEX32 ") },
+ { D3DFMT_Q16W16V16U16 , _T("D3DFMT_Q16W16V16U16 ") },
+
+ { MAKEFOURCC('N', 'V', '1', '2') , _T("D3DFMT_NV12") },
+ { MAKEFOURCC('N', 'V', '2', '4') , _T("D3DFMT_NV24") },
};
const LPCTSTR DXVAVersion[] = { _T("DXVA "), _T("DXVA1"), _T("DXVA2") };
LPCTSTR GetDXVADecoderDescription()
{
- return GetDXVAMode (&g_guidDXVADecoder);
+ return GetDXVAMode(&g_guidDXVADecoder);
}
LPCTSTR GetDXVAVersion()
{
- return DXVAVersion[g_nDXVAVersion];
+ return DXVAVersion[g_nDXVAVersion];
}
void ClearDXVAState()
{
- g_guidDXVADecoder = GUID_NULL;
- g_nDXVAVersion = 0;
+ g_guidDXVADecoder = GUID_NULL;
+ g_nDXVAVersion = 0;
}
LPCTSTR FindD3DFormat(const D3DFORMAT Format)
{
- for (int i=0; i<_countof(D3DFormatType); i++) {
- if (Format == D3DFormatType[i].Format) {
- return D3DFormatType[i].Description;
- }
- }
+ for (int i = 0; i < _countof(D3DFormatType); i++) {
+ if (Format == D3DFormatType[i].Format) {
+ return D3DFormatType[i].Description;
+ }
+ }
- return D3DFormatType[0].Description;
+ return D3DFormatType[0].Description;
}
// === DirectShow hooks
-static HRESULT (STDMETHODCALLTYPE * NewSegmentOrg)(IPinC * This, /* [in] */ REFERENCE_TIME tStart, /* [in] */ REFERENCE_TIME tStop, /* [in] */ double dRate) = NULL;
+static HRESULT(STDMETHODCALLTYPE* NewSegmentOrg)(IPinC* This, /* [in] */ REFERENCE_TIME tStart, /* [in] */ REFERENCE_TIME tStop, /* [in] */ double dRate) = NULL;
-static HRESULT STDMETHODCALLTYPE NewSegmentMine(IPinC * This, /* [in] */ REFERENCE_TIME tStart, /* [in] */ REFERENCE_TIME tStop, /* [in] */ double dRate)
+static HRESULT STDMETHODCALLTYPE NewSegmentMine(IPinC* This, /* [in] */ REFERENCE_TIME tStart, /* [in] */ REFERENCE_TIME tStop, /* [in] */ double dRate)
{
- g_tSegmentStart = tStart;
- return NewSegmentOrg(This, tStart, tStop, dRate);
+ g_tSegmentStart = tStart;
+ return NewSegmentOrg(This, tStart, tStop, dRate);
}
-static HRESULT ( STDMETHODCALLTYPE *ReceiveOrg )( IMemInputPinC * This, IMediaSample *pSample) = NULL;
+static HRESULT(STDMETHODCALLTYPE* ReceiveOrg)(IMemInputPinC* This, IMediaSample* pSample) = NULL;
-static HRESULT STDMETHODCALLTYPE ReceiveMineI(IMemInputPinC * This, IMediaSample *pSample)
+static HRESULT STDMETHODCALLTYPE ReceiveMineI(IMemInputPinC* This, IMediaSample* pSample)
{
- REFERENCE_TIME rtStart, rtStop;
- if (pSample && SUCCEEDED(pSample->GetTime(&rtStart, &rtStop))) {
- g_tSampleStart = rtStart;
- }
- return ReceiveOrg(This, pSample);
+ REFERENCE_TIME rtStart, rtStop;
+ if (pSample && SUCCEEDED(pSample->GetTime(&rtStart, &rtStop))) {
+ g_tSampleStart = rtStart;
+ }
+ return ReceiveOrg(This, pSample);
}
-static HRESULT STDMETHODCALLTYPE ReceiveMine(IMemInputPinC * This, IMediaSample *pSample)
+static HRESULT STDMETHODCALLTYPE ReceiveMine(IMemInputPinC* This, IMediaSample* pSample)
{
- // Support ffdshow queueing.
- // To avoid black out on pause, we have to lock g_ffdshowReceive to synchronize with CMainFrame::OnPlayPause.
- if (queue_ffdshow_support) {
- CAutoLock lck(&g_ffdshowReceive);
- return ReceiveMineI(This,pSample);
- }
- return ReceiveMineI(This,pSample);
+ // Support ffdshow queueing.
+ // To avoid black out on pause, we have to lock g_ffdshowReceive to synchronize with CMainFrame::OnPlayPause.
+ if (queue_ffdshow_support) {
+ CAutoLock lck(&g_ffdshowReceive);
+ return ReceiveMineI(This, pSample);
+ }
+ return ReceiveMineI(This, pSample);
}
void UnhookNewSegmentAndReceive()
{
- BOOL res;
- DWORD flOldProtect = 0;
-
- // Casimir666 : unhook previous VTables
- if (g_pPinCVtbl && g_pMemInputPinCVtbl) {
- res = VirtualProtect(g_pPinCVtbl, sizeof(IPinCVtbl), PAGE_WRITECOPY, &flOldProtect);
- if (g_pPinCVtbl->NewSegment == NewSegmentMine) {
- g_pPinCVtbl->NewSegment = NewSegmentOrg;
- }
- res = VirtualProtect(g_pPinCVtbl, sizeof(IPinCVtbl), flOldProtect, &flOldProtect);
-
- res = VirtualProtect(g_pMemInputPinCVtbl, sizeof(IMemInputPinCVtbl), PAGE_WRITECOPY, &flOldProtect);
- if (g_pMemInputPinCVtbl->Receive == ReceiveMine) {
- g_pMemInputPinCVtbl->Receive = ReceiveOrg;
- }
- res = VirtualProtect(g_pMemInputPinCVtbl, sizeof(IMemInputPinCVtbl), flOldProtect, &flOldProtect);
-
- g_pPinCVtbl = NULL;
- g_pMemInputPinCVtbl = NULL;
- NewSegmentOrg = NULL;
- ReceiveOrg = NULL;
- }
+ BOOL res;
+ DWORD flOldProtect = 0;
+
+ // Casimir666 : unhook previous VTables
+ if (g_pPinCVtbl && g_pMemInputPinCVtbl) {
+ res = VirtualProtect(g_pPinCVtbl, sizeof(IPinCVtbl), PAGE_WRITECOPY, &flOldProtect);
+ if (g_pPinCVtbl->NewSegment == NewSegmentMine) {
+ g_pPinCVtbl->NewSegment = NewSegmentOrg;
+ }
+ res = VirtualProtect(g_pPinCVtbl, sizeof(IPinCVtbl), flOldProtect, &flOldProtect);
+
+ res = VirtualProtect(g_pMemInputPinCVtbl, sizeof(IMemInputPinCVtbl), PAGE_WRITECOPY, &flOldProtect);
+ if (g_pMemInputPinCVtbl->Receive == ReceiveMine) {
+ g_pMemInputPinCVtbl->Receive = ReceiveOrg;
+ }
+ res = VirtualProtect(g_pMemInputPinCVtbl, sizeof(IMemInputPinCVtbl), flOldProtect, &flOldProtect);
+
+ g_pPinCVtbl = NULL;
+ g_pMemInputPinCVtbl = NULL;
+ NewSegmentOrg = NULL;
+ ReceiveOrg = NULL;
+ }
}
bool HookNewSegmentAndReceive(IPinC* pPinC, IMemInputPinC* pMemInputPinC)
{
- if (!pPinC || !pMemInputPinC) {
- return false;
- }
-
- g_tSegmentStart = 0;
- g_tSampleStart = 0;
-
- BOOL res;
- DWORD flOldProtect = 0;
-
- UnhookNewSegmentAndReceive();
-
- // Casimir666 : change sizeof(IPinC) to sizeof(IPinCVtbl) to fix crash with EVR hack on Vista!
- res = VirtualProtect(pPinC->lpVtbl, sizeof(IPinCVtbl), PAGE_WRITECOPY, &flOldProtect);
- if (NewSegmentOrg == NULL) {
- NewSegmentOrg = pPinC->lpVtbl->NewSegment;
- }
- pPinC->lpVtbl->NewSegment = NewSegmentMine; // Function sets global variable(s)
- res = VirtualProtect(pPinC->lpVtbl, sizeof(IPinCVtbl), flOldProtect, &flOldProtect);
-
- // Casimir666 : change sizeof(IMemInputPinC) to sizeof(IMemInputPinCVtbl) to fix crash with EVR hack on Vista!
- res = VirtualProtect(pMemInputPinC->lpVtbl, sizeof(IMemInputPinCVtbl), PAGE_WRITECOPY, &flOldProtect);
- if (ReceiveOrg == NULL) {
- ReceiveOrg = pMemInputPinC->lpVtbl->Receive;
- }
- pMemInputPinC->lpVtbl->Receive = ReceiveMine; // Function sets global variable(s)
- res = VirtualProtect(pMemInputPinC->lpVtbl, sizeof(IMemInputPinCVtbl), flOldProtect, &flOldProtect);
-
- g_pPinCVtbl = pPinC->lpVtbl;
- g_pMemInputPinCVtbl = pMemInputPinC->lpVtbl;
-
- return true;
+ if (!pPinC || !pMemInputPinC) {
+ return false;
+ }
+
+ g_tSegmentStart = 0;
+ g_tSampleStart = 0;
+
+ BOOL res;
+ DWORD flOldProtect = 0;
+
+ UnhookNewSegmentAndReceive();
+
+ // Casimir666 : change sizeof(IPinC) to sizeof(IPinCVtbl) to fix crash with EVR hack on Vista!
+ res = VirtualProtect(pPinC->lpVtbl, sizeof(IPinCVtbl), PAGE_WRITECOPY, &flOldProtect);
+ if (NewSegmentOrg == NULL) {
+ NewSegmentOrg = pPinC->lpVtbl->NewSegment;
+ }
+ pPinC->lpVtbl->NewSegment = NewSegmentMine; // Function sets global variable(s)
+ res = VirtualProtect(pPinC->lpVtbl, sizeof(IPinCVtbl), flOldProtect, &flOldProtect);
+
+ // Casimir666 : change sizeof(IMemInputPinC) to sizeof(IMemInputPinCVtbl) to fix crash with EVR hack on Vista!
+ res = VirtualProtect(pMemInputPinC->lpVtbl, sizeof(IMemInputPinCVtbl), PAGE_WRITECOPY, &flOldProtect);
+ if (ReceiveOrg == NULL) {
+ ReceiveOrg = pMemInputPinC->lpVtbl->Receive;
+ }
+ pMemInputPinC->lpVtbl->Receive = ReceiveMine; // Function sets global variable(s)
+ res = VirtualProtect(pMemInputPinC->lpVtbl, sizeof(IMemInputPinCVtbl), flOldProtect, &flOldProtect);
+
+ g_pPinCVtbl = pPinC->lpVtbl;
+ g_pMemInputPinCVtbl = pMemInputPinC->lpVtbl;
+
+ return true;
}
// === DXVA1 hooks
#ifdef _DEBUG
-#define MAX_BUFFER_TYPE 15
-BYTE* g_ppBuffer[MAX_BUFFER_TYPE]; // Only used for debug logging
+#define MAX_BUFFER_TYPE 15
+BYTE* g_ppBuffer[MAX_BUFFER_TYPE]; // Only used for debug logging
-static HRESULT ( STDMETHODCALLTYPE *GetVideoAcceleratorGUIDsOrg )( IAMVideoAcceleratorC * This,/* [out][in] */ LPDWORD pdwNumGuidsSupported,/* [out][in] */ LPGUID pGuidsSupported) = NULL;
-static HRESULT ( STDMETHODCALLTYPE *GetUncompFormatsSupportedOrg )( IAMVideoAcceleratorC * This,/* [in] */ const GUID *pGuid,/* [out][in] */ LPDWORD pdwNumFormatsSupported,/* [out][in] */ LPDDPIXELFORMAT pFormatsSupported) = NULL;
-static HRESULT ( STDMETHODCALLTYPE *GetInternalMemInfoOrg )( IAMVideoAcceleratorC * This,/* [in] */ const GUID *pGuid,/* [in] */ const AMVAUncompDataInfo *pamvaUncompDataInfo,/* [out][in] */ LPAMVAInternalMemInfo pamvaInternalMemInfo) = NULL;
+static HRESULT(STDMETHODCALLTYPE* GetVideoAcceleratorGUIDsOrg)(IAMVideoAcceleratorC* This,/* [out][in] */ LPDWORD pdwNumGuidsSupported,/* [out][in] */ LPGUID pGuidsSupported) = NULL;
+static HRESULT(STDMETHODCALLTYPE* GetUncompFormatsSupportedOrg)(IAMVideoAcceleratorC* This,/* [in] */ const GUID* pGuid,/* [out][in] */ LPDWORD pdwNumFormatsSupported,/* [out][in] */ LPDDPIXELFORMAT pFormatsSupported) = NULL;
+static HRESULT(STDMETHODCALLTYPE* GetInternalMemInfoOrg)(IAMVideoAcceleratorC* This,/* [in] */ const GUID* pGuid,/* [in] */ const AMVAUncompDataInfo* pamvaUncompDataInfo,/* [out][in] */ LPAMVAInternalMemInfo pamvaInternalMemInfo) = NULL;
#endif
-static HRESULT ( STDMETHODCALLTYPE *GetCompBufferInfoOrg )( IAMVideoAcceleratorC * This,/* [in] */ const GUID *pGuid,/* [in] */ const AMVAUncompDataInfo *pamvaUncompDataInfo,/* [out][in] */ LPDWORD pdwNumTypesCompBuffers,/* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo) = NULL;
+static HRESULT(STDMETHODCALLTYPE* GetCompBufferInfoOrg)(IAMVideoAcceleratorC* This,/* [in] */ const GUID* pGuid,/* [in] */ const AMVAUncompDataInfo* pamvaUncompDataInfo,/* [out][in] */ LPDWORD pdwNumTypesCompBuffers,/* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo) = NULL;
#ifdef _DEBUG
-static HRESULT ( STDMETHODCALLTYPE *GetInternalCompBufferInfoOrg )( IAMVideoAcceleratorC * This,/* [out][in] */ LPDWORD pdwNumTypesCompBuffers,/* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo) = NULL;
-static HRESULT ( STDMETHODCALLTYPE *BeginFrameOrg )( IAMVideoAcceleratorC * This,/* [in] */ const AMVABeginFrameInfo *amvaBeginFrameInfo) = NULL;
-static HRESULT ( STDMETHODCALLTYPE *EndFrameOrg )( IAMVideoAcceleratorC * This,/* [in] */ const AMVAEndFrameInfo *pEndFrameInfo) = NULL;
-static HRESULT ( STDMETHODCALLTYPE *GetBufferOrg )( IAMVideoAcceleratorC * This,/* [in] */ DWORD dwTypeIndex,/* [in] */ DWORD dwBufferIndex,/* [in] */ BOOL bReadOnly,/* [out] */ LPVOID *ppBuffer,/* [out] */ LONG *lpStride) = NULL;
-static HRESULT ( STDMETHODCALLTYPE *ReleaseBufferOrg )( IAMVideoAcceleratorC * This,/* [in] */ DWORD dwTypeIndex,/* [in] */ DWORD dwBufferIndex) = NULL;
-static HRESULT ( STDMETHODCALLTYPE *ExecuteOrg )( IAMVideoAcceleratorC * This,/* [in] */ DWORD dwFunction,/* [in] */ LPVOID lpPrivateInputData,/* [in] */ DWORD cbPrivateInputData,/* [in] */ LPVOID lpPrivateOutputDat,/* [in] */ DWORD cbPrivateOutputData,/* [in] */ DWORD dwNumBuffers,/* [in] */ const AMVABUFFERINFO *pamvaBufferInfo) = NULL;
-static HRESULT ( STDMETHODCALLTYPE *QueryRenderStatusOrg )( IAMVideoAcceleratorC * This,/* [in] */ DWORD dwTypeIndex,/* [in] */ DWORD dwBufferIndex,/* [in] */ DWORD dwFlags) = NULL;
-static HRESULT ( STDMETHODCALLTYPE *DisplayFrameOrg )( IAMVideoAcceleratorC * This,/* [in] */ DWORD dwFlipToIndex,/* [in] */ IMediaSample *pMediaSample) = NULL;
+static HRESULT(STDMETHODCALLTYPE* GetInternalCompBufferInfoOrg)(IAMVideoAcceleratorC* This,/* [out][in] */ LPDWORD pdwNumTypesCompBuffers,/* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo) = NULL;
+static HRESULT(STDMETHODCALLTYPE* BeginFrameOrg)(IAMVideoAcceleratorC* This,/* [in] */ const AMVABeginFrameInfo* amvaBeginFrameInfo) = NULL;
+static HRESULT(STDMETHODCALLTYPE* EndFrameOrg)(IAMVideoAcceleratorC* This,/* [in] */ const AMVAEndFrameInfo* pEndFrameInfo) = NULL;
+static HRESULT(STDMETHODCALLTYPE* GetBufferOrg)(IAMVideoAcceleratorC* This,/* [in] */ DWORD dwTypeIndex,/* [in] */ DWORD dwBufferIndex,/* [in] */ BOOL bReadOnly,/* [out] */ LPVOID* ppBuffer,/* [out] */ LONG* lpStride) = NULL;
+static HRESULT(STDMETHODCALLTYPE* ReleaseBufferOrg)(IAMVideoAcceleratorC* This,/* [in] */ DWORD dwTypeIndex,/* [in] */ DWORD dwBufferIndex) = NULL;
+static HRESULT(STDMETHODCALLTYPE* ExecuteOrg)(IAMVideoAcceleratorC* This,/* [in] */ DWORD dwFunction,/* [in] */ LPVOID lpPrivateInputData,/* [in] */ DWORD cbPrivateInputData,/* [in] */ LPVOID lpPrivateOutputDat,/* [in] */ DWORD cbPrivateOutputData,/* [in] */ DWORD dwNumBuffers,/* [in] */ const AMVABUFFERINFO* pamvaBufferInfo) = NULL;
+static HRESULT(STDMETHODCALLTYPE* QueryRenderStatusOrg)(IAMVideoAcceleratorC* This,/* [in] */ DWORD dwTypeIndex,/* [in] */ DWORD dwBufferIndex,/* [in] */ DWORD dwFlags) = NULL;
+static HRESULT(STDMETHODCALLTYPE* DisplayFrameOrg)(IAMVideoAcceleratorC* This,/* [in] */ DWORD dwFlipToIndex,/* [in] */ IMediaSample* pMediaSample) = NULL;
#endif
#if defined(_DEBUG) && DXVA_LOGFILE_A
static void LOG_TOFILE(LPCTSTR FileName, LPCTSTR fmt, ...)
{
- va_list args;
- va_start(args, fmt);
- int nCount = _vsctprintf(fmt, args) + 1;
- if (TCHAR* buff = DNew TCHAR[nCount]) {
- FILE* f;
- _vstprintf_s(buff, nCount, fmt, args);
- if (_tfopen_s(&f, FileName, _T("at")) == 0) {
- fseek(f, 0, 2);
- _ftprintf_s(f, _T("%s\n"), buff);
- fclose(f);
- }
- delete [] buff;
- }
- va_end(args);
+ va_list args;
+ va_start(args, fmt);
+ int nCount = _vsctprintf(fmt, args) + 1;
+ if (TCHAR* buff = DNew TCHAR[nCount]) {
+ FILE* f;
+ _vstprintf_s(buff, nCount, fmt, args);
+ if (_tfopen_s(&f, FileName, _T("at")) == 0) {
+ fseek(f, 0, 2);
+ _ftprintf_s(f, _T("%s\n"), buff);
+ fclose(f);
+ }
+ delete [] buff;
+ }
+ va_end(args);
}
static void LOG(LPCTSTR fmt, ...)
{
- va_list args;
- va_start(args, fmt);
- //int nCount = _vsctprintf(fmt, args) + 1;
- TCHAR buff[3000];
- FILE* f;
- _vstprintf_s(buff, _countof(buff), fmt, args);
- if (_tfopen_s(&f, LOG_FILE_DXVA, _T("at")) == 0) {
- fseek(f, 0, 2);
- _ftprintf_s(f, _T("%s\n"), buff);
- fclose(f);
- }
-
- va_end(args);
+ va_list args;
+ va_start(args, fmt);
+ //int nCount = _vsctprintf(fmt, args) + 1;
+ TCHAR buff[3000];
+ FILE* f;
+ _vstprintf_s(buff, _countof(buff), fmt, args);
+ if (_tfopen_s(&f, LOG_FILE_DXVA, _T("at")) == 0) {
+ fseek(f, 0, 2);
+ _ftprintf_s(f, _T("%s\n"), buff);
+ fclose(f);
+ }
+
+ va_end(args);
}
static void LOGPF(LPCTSTR prefix, const DDPIXELFORMAT* p, int n)
{
- for (int i = 0; i < n; i++) {
- LOG(_T("%s[%d].dwSize = %d"), prefix, i, p[i].dwSize);
- LOG(_T("%s[%d].dwFlags = %08x"), prefix, i, p[i].dwFlags);
- LOG(_T("%s[%d].dwFourCC = %4.4hs"), prefix, i, &p[i].dwFourCC);
- LOG(_T("%s[%d].dwRGBBitCount = %08x"), prefix, i, &p[i].dwRGBBitCount);
- LOG(_T("%s[%d].dwRBitMask = %08x"), prefix, i, &p[i].dwRBitMask);
- LOG(_T("%s[%d].dwGBitMask = %08x"), prefix, i, &p[i].dwGBitMask);
- LOG(_T("%s[%d].dwBBitMask = %08x"), prefix, i, &p[i].dwBBitMask);
- LOG(_T("%s[%d].dwRGBAlphaBitMask = %08x"), prefix, i, &p[i].dwRGBAlphaBitMask);
- }
+ for (int i = 0; i < n; i++) {
+ LOG(_T("%s[%d].dwSize = %d"), prefix, i, p[i].dwSize);
+ LOG(_T("%s[%d].dwFlags = %08x"), prefix, i, p[i].dwFlags);
+ LOG(_T("%s[%d].dwFourCC = %4.4hs"), prefix, i, &p[i].dwFourCC);
+ LOG(_T("%s[%d].dwRGBBitCount = %08x"), prefix, i, &p[i].dwRGBBitCount);
+ LOG(_T("%s[%d].dwRBitMask = %08x"), prefix, i, &p[i].dwRBitMask);
+ LOG(_T("%s[%d].dwGBitMask = %08x"), prefix, i, &p[i].dwGBitMask);
+ LOG(_T("%s[%d].dwBBitMask = %08x"), prefix, i, &p[i].dwBBitMask);
+ LOG(_T("%s[%d].dwRGBAlphaBitMask = %08x"), prefix, i, &p[i].dwRGBAlphaBitMask);
+ }
}
static void LOGUDI(LPCTSTR prefix, const AMVAUncompDataInfo* p, int n)
{
- for (int i = 0; i < n; i++) {
- LOG(_T("%s[%d].dwUncompWidth = %d"), prefix, i, p[i].dwUncompWidth);
- LOG(_T("%s[%d].dwUncompHeight = %d"), prefix, i, p[i].dwUncompHeight);
-
- CString prefix2;
- prefix2.Format(_T("%s[%d]"), prefix, i);
- LOGPF(prefix2, &p[i].ddUncompPixelFormat, 1);
- }
+ for (int i = 0; i < n; i++) {
+ LOG(_T("%s[%d].dwUncompWidth = %d"), prefix, i, p[i].dwUncompWidth);
+ LOG(_T("%s[%d].dwUncompHeight = %d"), prefix, i, p[i].dwUncompHeight);
+
+ CString prefix2;
+ prefix2.Format(_T("%s[%d]"), prefix, i);
+ LOGPF(prefix2, &p[i].ddUncompPixelFormat, 1);
+ }
}
-static void LogDXVA_PicParams_H264 (DXVA_PicParams_H264* pPic)
+static void LogDXVA_PicParams_H264(DXVA_PicParams_H264* pPic)
{
- CString strRes;
- int i;
- static bool bFirstParam = true;
-
- if (bFirstParam) {
- LOG_TOFILE (LOG_FILE_PICTURE, _T("RefPicFlag,wFrameWidthInMbsMinus1,wFrameHeightInMbsMinus1,CurrPic.Index7Bits,num_ref_frames,wBitFields,bit_depth_luma_minus8,bit_depth_chroma_minus8,Reserved16Bits,StatusReportFeedbackNumber,RFL.Index7Bits[0],") \
- _T("RFL.Index7Bits[1],RFL.Index7Bits[2],RFL.Index7Bits[3],RFL.Index7Bits[4],RFL.Index7Bits[5],") \
- _T("RFL.Index7Bits[6],RFL.Index7Bits[7],RFL.Index7Bits[8],RFL.Index7Bits[9],RFL.Index7Bits[10],") \
- _T("RFL.Index7Bits[11],RFL.Index7Bits[12],RFL.Index7Bits[13],RFL.Index7Bits[14],RFL.Index7Bits[15],") \
- _T("CurrFieldOrderCnt[0], CurrFieldOrderCnt[1],FieldOrderCntList[0][0], FieldOrderCntList[0][1],FieldOrderCntList[1][0], FieldOrderCntList[1][1],FieldOrderCntList[2][0], FieldOrderCntList[2][1],FieldOrderCntList[3][0], FieldOrderCntList[3][1],FieldOrderCntList[4][0], FieldOrderCntList[4][1],FieldOrderCntList[5][0],") \
- _T("FieldOrderCntList[5][1],FieldOrderCntList[6][0], FieldOrderCntList[6][1],FieldOrderCntList[7][0], FieldOrderCntList[7][1],FieldOrderCntList[8][0], FieldOrderCntList[8][1],FieldOrderCntList[9][0], FieldOrderCntList[9][1],FieldOrderCntList[10][0], FieldOrderCntList[10][1],FieldOrderCntList[11][0],")\
- _T("FieldOrderCntList[11][1],FieldOrderCntList[12][0], FieldOrderCntList[12][1],FieldOrderCntList[13][0], FieldOrderCntList[13][1],FieldOrderCntList[14][0], FieldOrderCntList[14][1],FieldOrderCntList[15][0], FieldOrderCntList[15][1],pic_init_qs_minus26,chroma_qp_index_offset,second_chroma_qp_index_offset,")\
- _T("ContinuationFlag,pic_init_qp_minus26,num_ref_idx_l0_active_minus1,num_ref_idx_l1_active_minus1,Reserved8BitsA,FrameNumList[0],FrameNumList[1],FrameNumList[2],FrameNumList[3],FrameNumList[4],FrameNumList[5],FrameNumList[6],FrameNumList[7],FrameNumList[8],FrameNumList[9],FrameNumList[10],FrameNumList[11],")\
- _T("FrameNumList[12],FrameNumList[13],FrameNumList[14],FrameNumList[15],UsedForReferenceFlags,NonExistingFrameFlags,frame_num,log2_max_frame_num_minus4,pic_order_cnt_type,log2_max_pic_order_cnt_lsb_minus4,delta_pic_order_always_zero_flag,direct_8x8_inference_flag,entropy_coding_mode_flag,pic_order_present_flag,")\
- _T("num_slice_groups_minus1,slice_group_map_type,deblocking_filter_control_present_flag,redundant_pic_cnt_present_flag,Reserved8BitsB,slice_group_change_rate_minus1"));
-
- }
- bFirstParam = false;
-
- strRes.AppendFormat(_T("%d,"), pPic->RefPicFlag);
- strRes.AppendFormat(_T("%d,"), pPic->wFrameWidthInMbsMinus1);
- strRes.AppendFormat(_T("%d,"), pPic->wFrameHeightInMbsMinus1);
-
- // DXVA_PicEntry_H264 CurrPic)); /* flag is bot field flag */
- // strRes.AppendFormat(_T("%d,"), pPic->CurrPic.AssociatedFlag);
- // strRes.AppendFormat(_T("%d,"), pPic->CurrPic.bPicEntry);
- strRes.AppendFormat(_T("%d,"), pPic->CurrPic.Index7Bits);
-
-
- strRes.AppendFormat(_T("%d,"), pPic->num_ref_frames);
- strRes.AppendFormat(_T("%d,"), pPic->wBitFields);
- strRes.AppendFormat(_T("%d,"), pPic->bit_depth_luma_minus8);
- strRes.AppendFormat(_T("%d,"), pPic->bit_depth_chroma_minus8);
-
- strRes.AppendFormat(_T("%d,"), pPic->Reserved16Bits);
- strRes.AppendFormat(_T("%d,"), pPic->StatusReportFeedbackNumber);
-
- for (i =0; i<16; i++) {
- //strRes.AppendFormat(_T("%d,"), pPic->RefFrameList[i].AssociatedFlag);
- //strRes.AppendFormat(_T("%d,"), pPic->RefFrameList[i].bPicEntry);
- strRes.AppendFormat(_T("%d,"), pPic->RefFrameList[i].Index7Bits);
- }
-
- strRes.AppendFormat(_T("%d, %d,"), pPic->CurrFieldOrderCnt[0], pPic->CurrFieldOrderCnt[1]);
-
- for (int i=0; i<16; i++) {
- strRes.AppendFormat(_T("%d, %d,"), pPic->FieldOrderCntList[i][0], pPic->FieldOrderCntList[i][1]);
- }
- //strRes.AppendFormat(_T("%d,"), pPic->FieldOrderCntList[16][2]);
-
- strRes.AppendFormat(_T("%d,"), pPic->pic_init_qs_minus26);
- strRes.AppendFormat(_T("%d,"), pPic->chroma_qp_index_offset); /* also used for QScb */
- strRes.AppendFormat(_T("%d,"), pPic->second_chroma_qp_index_offset); /* also for QScr */
- strRes.AppendFormat(_T("%d,"), pPic->ContinuationFlag);
-
- /* remainder for parsing */
- strRes.AppendFormat(_T("%d,"), pPic->pic_init_qp_minus26);
- strRes.AppendFormat(_T("%d,"), pPic->num_ref_idx_l0_active_minus1);
- strRes.AppendFormat(_T("%d,"), pPic->num_ref_idx_l1_active_minus1);
- strRes.AppendFormat(_T("%d,"), pPic->Reserved8BitsA);
-
- for (int i=0; i<16; i++) {
- strRes.AppendFormat(_T("%d,"), pPic->FrameNumList[i]);
- }
-
- //strRes.AppendFormat(_T("%d,"), pPic->FrameNumList[16]);
- strRes.AppendFormat(_T("%d,"), pPic->UsedForReferenceFlags);
- strRes.AppendFormat(_T("%d,"), pPic->NonExistingFrameFlags);
- strRes.AppendFormat(_T("%d,"), pPic->frame_num);
-
- strRes.AppendFormat(_T("%d,"), pPic->log2_max_frame_num_minus4);
- strRes.AppendFormat(_T("%d,"), pPic->pic_order_cnt_type);
- strRes.AppendFormat(_T("%d,"), pPic->log2_max_pic_order_cnt_lsb_minus4);
- strRes.AppendFormat(_T("%d,"), pPic->delta_pic_order_always_zero_flag);
-
- strRes.AppendFormat(_T("%d,"), pPic->direct_8x8_inference_flag);
- strRes.AppendFormat(_T("%d,"), pPic->entropy_coding_mode_flag);
- strRes.AppendFormat(_T("%d,"), pPic->pic_order_present_flag);
- strRes.AppendFormat(_T("%d,"), pPic->num_slice_groups_minus1);
-
- strRes.AppendFormat(_T("%d,"), pPic->slice_group_map_type);
- strRes.AppendFormat(_T("%d,"), pPic->deblocking_filter_control_present_flag);
- strRes.AppendFormat(_T("%d,"), pPic->redundant_pic_cnt_present_flag);
- strRes.AppendFormat(_T("%d,"), pPic->Reserved8BitsB);
-
- strRes.AppendFormat(_T("%d,"), pPic->slice_group_change_rate_minus1);
-
- //for (int i=0; i<810; i++)
- // strRes.AppendFormat(_T("%d,"), pPic->SliceGroupMap[i]);
- // strRes.AppendFormat(_T("%d,"), pPic->SliceGroupMap[810]);
-
- // SABOTAGE !!!
- //for (int i=0; i<16; i++)
- //{
- // pPic->FieldOrderCntList[i][0] = pPic->FieldOrderCntList[i][1] = 0;
- // pPic->RefFrameList[i].AssociatedFlag = 1;
- // pPic->RefFrameList[i].bPicEntry = 255;
- // pPic->RefFrameList[i].Index7Bits = 127;
- //}
-
- // === Dump PicParams!
- //static FILE* hPict = NULL;
- //if (!hPict) hPict = fopen ("PicParam.bin", "wb");
- //if (hPict)
- //{
- // fwrite (pPic, sizeof (DXVA_PicParams_H264), 1, hPict);
- //}
-
- LOG_TOFILE(LOG_FILE_PICTURE, strRes);
+ CString strRes;
+ int i;
+ static bool bFirstParam = true;
+
+ if (bFirstParam) {
+ LOG_TOFILE(LOG_FILE_PICTURE, _T("RefPicFlag,wFrameWidthInMbsMinus1,wFrameHeightInMbsMinus1,CurrPic.Index7Bits,num_ref_frames,wBitFields,bit_depth_luma_minus8,bit_depth_chroma_minus8,Reserved16Bits,StatusReportFeedbackNumber,RFL.Index7Bits[0],") \
+ _T("RFL.Index7Bits[1],RFL.Index7Bits[2],RFL.Index7Bits[3],RFL.Index7Bits[4],RFL.Index7Bits[5],") \
+ _T("RFL.Index7Bits[6],RFL.Index7Bits[7],RFL.Index7Bits[8],RFL.Index7Bits[9],RFL.Index7Bits[10],") \
+ _T("RFL.Index7Bits[11],RFL.Index7Bits[12],RFL.Index7Bits[13],RFL.Index7Bits[14],RFL.Index7Bits[15],") \
+ _T("CurrFieldOrderCnt[0], CurrFieldOrderCnt[1],FieldOrderCntList[0][0], FieldOrderCntList[0][1],FieldOrderCntList[1][0], FieldOrderCntList[1][1],FieldOrderCntList[2][0], FieldOrderCntList[2][1],FieldOrderCntList[3][0], FieldOrderCntList[3][1],FieldOrderCntList[4][0], FieldOrderCntList[4][1],FieldOrderCntList[5][0],") \
+ _T("FieldOrderCntList[5][1],FieldOrderCntList[6][0], FieldOrderCntList[6][1],FieldOrderCntList[7][0], FieldOrderCntList[7][1],FieldOrderCntList[8][0], FieldOrderCntList[8][1],FieldOrderCntList[9][0], FieldOrderCntList[9][1],FieldOrderCntList[10][0], FieldOrderCntList[10][1],FieldOrderCntList[11][0],")\
+ _T("FieldOrderCntList[11][1],FieldOrderCntList[12][0], FieldOrderCntList[12][1],FieldOrderCntList[13][0], FieldOrderCntList[13][1],FieldOrderCntList[14][0], FieldOrderCntList[14][1],FieldOrderCntList[15][0], FieldOrderCntList[15][1],pic_init_qs_minus26,chroma_qp_index_offset,second_chroma_qp_index_offset,")\
+ _T("ContinuationFlag,pic_init_qp_minus26,num_ref_idx_l0_active_minus1,num_ref_idx_l1_active_minus1,Reserved8BitsA,FrameNumList[0],FrameNumList[1],FrameNumList[2],FrameNumList[3],FrameNumList[4],FrameNumList[5],FrameNumList[6],FrameNumList[7],FrameNumList[8],FrameNumList[9],FrameNumList[10],FrameNumList[11],")\
+ _T("FrameNumList[12],FrameNumList[13],FrameNumList[14],FrameNumList[15],UsedForReferenceFlags,NonExistingFrameFlags,frame_num,log2_max_frame_num_minus4,pic_order_cnt_type,log2_max_pic_order_cnt_lsb_minus4,delta_pic_order_always_zero_flag,direct_8x8_inference_flag,entropy_coding_mode_flag,pic_order_present_flag,")\
+ _T("num_slice_groups_minus1,slice_group_map_type,deblocking_filter_control_present_flag,redundant_pic_cnt_present_flag,Reserved8BitsB,slice_group_change_rate_minus1"));
+
+ }
+ bFirstParam = false;
+
+ strRes.AppendFormat(_T("%d,"), pPic->RefPicFlag);
+ strRes.AppendFormat(_T("%d,"), pPic->wFrameWidthInMbsMinus1);
+ strRes.AppendFormat(_T("%d,"), pPic->wFrameHeightInMbsMinus1);
+
+ // DXVA_PicEntry_H264 CurrPic)); /* flag is bot field flag */
+ // strRes.AppendFormat(_T("%d,"), pPic->CurrPic.AssociatedFlag);
+ // strRes.AppendFormat(_T("%d,"), pPic->CurrPic.bPicEntry);
+ strRes.AppendFormat(_T("%d,"), pPic->CurrPic.Index7Bits);
+
+
+ strRes.AppendFormat(_T("%d,"), pPic->num_ref_frames);
+ strRes.AppendFormat(_T("%d,"), pPic->wBitFields);
+ strRes.AppendFormat(_T("%d,"), pPic->bit_depth_luma_minus8);
+ strRes.AppendFormat(_T("%d,"), pPic->bit_depth_chroma_minus8);
+
+ strRes.AppendFormat(_T("%d,"), pPic->Reserved16Bits);
+ strRes.AppendFormat(_T("%d,"), pPic->StatusReportFeedbackNumber);
+
+ for (i = 0; i < 16; i++) {
+ //strRes.AppendFormat(_T("%d,"), pPic->RefFrameList[i].AssociatedFlag);
+ //strRes.AppendFormat(_T("%d,"), pPic->RefFrameList[i].bPicEntry);
+ strRes.AppendFormat(_T("%d,"), pPic->RefFrameList[i].Index7Bits);
+ }
+
+ strRes.AppendFormat(_T("%d, %d,"), pPic->CurrFieldOrderCnt[0], pPic->CurrFieldOrderCnt[1]);
+
+ for (int i = 0; i < 16; i++) {
+ strRes.AppendFormat(_T("%d, %d,"), pPic->FieldOrderCntList[i][0], pPic->FieldOrderCntList[i][1]);
+ }
+ //strRes.AppendFormat(_T("%d,"), pPic->FieldOrderCntList[16][2]);
+
+ strRes.AppendFormat(_T("%d,"), pPic->pic_init_qs_minus26);
+ strRes.AppendFormat(_T("%d,"), pPic->chroma_qp_index_offset); /* also used for QScb */
+ strRes.AppendFormat(_T("%d,"), pPic->second_chroma_qp_index_offset); /* also for QScr */
+ strRes.AppendFormat(_T("%d,"), pPic->ContinuationFlag);
+
+ /* remainder for parsing */
+ strRes.AppendFormat(_T("%d,"), pPic->pic_init_qp_minus26);
+ strRes.AppendFormat(_T("%d,"), pPic->num_ref_idx_l0_active_minus1);
+ strRes.AppendFormat(_T("%d,"), pPic->num_ref_idx_l1_active_minus1);
+ strRes.AppendFormat(_T("%d,"), pPic->Reserved8BitsA);
+
+ for (int i = 0; i < 16; i++) {
+ strRes.AppendFormat(_T("%d,"), pPic->FrameNumList[i]);
+ }
+
+ //strRes.AppendFormat(_T("%d,"), pPic->FrameNumList[16]);
+ strRes.AppendFormat(_T("%d,"), pPic->UsedForReferenceFlags);
+ strRes.AppendFormat(_T("%d,"), pPic->NonExistingFrameFlags);
+ strRes.AppendFormat(_T("%d,"), pPic->frame_num);
+
+ strRes.AppendFormat(_T("%d,"), pPic->log2_max_frame_num_minus4);
+ strRes.AppendFormat(_T("%d,"), pPic->pic_order_cnt_type);
+ strRes.AppendFormat(_T("%d,"), pPic->log2_max_pic_order_cnt_lsb_minus4);
+ strRes.AppendFormat(_T("%d,"), pPic->delta_pic_order_always_zero_flag);
+
+ strRes.AppendFormat(_T("%d,"), pPic->direct_8x8_inference_flag);
+ strRes.AppendFormat(_T("%d,"), pPic->entropy_coding_mode_flag);
+ strRes.AppendFormat(_T("%d,"), pPic->pic_order_present_flag);
+ strRes.AppendFormat(_T("%d,"), pPic->num_slice_groups_minus1);
+
+ strRes.AppendFormat(_T("%d,"), pPic->slice_group_map_type);
+ strRes.AppendFormat(_T("%d,"), pPic->deblocking_filter_control_present_flag);
+ strRes.AppendFormat(_T("%d,"), pPic->redundant_pic_cnt_present_flag);
+ strRes.AppendFormat(_T("%d,"), pPic->Reserved8BitsB);
+
+ strRes.AppendFormat(_T("%d,"), pPic->slice_group_change_rate_minus1);
+
+ //for (int i=0; i<810; i++)
+ // strRes.AppendFormat(_T("%d,"), pPic->SliceGroupMap[i]);
+ // strRes.AppendFormat(_T("%d,"), pPic->SliceGroupMap[810]);
+
+ // SABOTAGE !!!
+ //for (int i=0; i<16; i++)
+ //{
+ // pPic->FieldOrderCntList[i][0] = pPic->FieldOrderCntList[i][1] = 0;
+ // pPic->RefFrameList[i].AssociatedFlag = 1;
+ // pPic->RefFrameList[i].bPicEntry = 255;
+ // pPic->RefFrameList[i].Index7Bits = 127;
+ //}
+
+ // === Dump PicParams!
+ //static FILE* hPict = NULL;
+ //if (!hPict) hPict = fopen ("PicParam.bin", "wb");
+ //if (hPict)
+ //{
+ // fwrite (pPic, sizeof (DXVA_PicParams_H264), 1, hPict);
+ //}
+
+ LOG_TOFILE(LOG_FILE_PICTURE, strRes);
}
-static void LogH264SliceShort (DXVA_Slice_H264_Short* pSlice, int nCount)
+static void LogH264SliceShort(DXVA_Slice_H264_Short* pSlice, int nCount)
{
- CString strRes;
- static bool bFirstSlice = true;
-
- if (bFirstSlice) {
- strRes = _T("nCnt, BSNALunitDataLocation, SliceBytesInBuffer, wBadSliceChopping");
- LOG_TOFILE (LOG_FILE_SLICESHORT, strRes);
- strRes = "";
- bFirstSlice = false;
- }
-
- for (int i=0; i<nCount; i++) {
- strRes.AppendFormat(_T("%d,"), i);
- strRes.AppendFormat(_T("%d,"), pSlice[i].BSNALunitDataLocation);
- strRes.AppendFormat(_T("%d,"), pSlice[i].SliceBytesInBuffer);
- strRes.AppendFormat(_T("%d"), pSlice[i].wBadSliceChopping);
-
- LOG_TOFILE (LOG_FILE_SLICESHORT, strRes);
- strRes = "";
- }
+ CString strRes;
+ static bool bFirstSlice = true;
+
+ if (bFirstSlice) {
+ strRes = _T("nCnt, BSNALunitDataLocation, SliceBytesInBuffer, wBadSliceChopping");
+ LOG_TOFILE(LOG_FILE_SLICESHORT, strRes);
+ strRes = "";
+ bFirstSlice = false;
+ }
+
+ for (int i = 0; i < nCount; i++) {
+ strRes.AppendFormat(_T("%d,"), i);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].BSNALunitDataLocation);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].SliceBytesInBuffer);
+ strRes.AppendFormat(_T("%d"), pSlice[i].wBadSliceChopping);
+
+ LOG_TOFILE(LOG_FILE_SLICESHORT, strRes);
+ strRes = "";
+ }
}
-static void LogSliceInfo (DXVA_SliceInfo* pSlice, int nCount)
+static void LogSliceInfo(DXVA_SliceInfo* pSlice, int nCount)
{
- CString strRes;
- static bool bFirstSlice = true;
-
- if (bFirstSlice) {
- strRes = _T("nCnt, wHorizontalPosition, wVerticalPosition, dwSliceBitsInBuffer,dwSliceDataLocation, bStartCodeBitOffset, bReservedBits, wMBbitOffset, wNumberMBsInSlice, wQuantizerScaleCode, wBadSliceChopping");
-
- LOG_TOFILE (LOG_FILE_SLICESHORT, strRes);
- strRes = "";
- bFirstSlice = false;
- }
-
- for (int i=0; i<nCount; i++) {
- strRes.AppendFormat(_T("%d,"), i);
- strRes.AppendFormat(_T("%d,"), pSlice[i].wHorizontalPosition);
- strRes.AppendFormat(_T("%d,"), pSlice[i].wVerticalPosition);
- strRes.AppendFormat(_T("%d,"), pSlice[i].dwSliceBitsInBuffer);
- strRes.AppendFormat(_T("%d,"), pSlice[i].dwSliceDataLocation);
- strRes.AppendFormat(_T("%d,"), pSlice[i].bStartCodeBitOffset);
- strRes.AppendFormat(_T("%d,"), pSlice[i].bReservedBits);
- strRes.AppendFormat(_T("%d,"), pSlice[i].wMBbitOffset);
- strRes.AppendFormat(_T("%d,"), pSlice[i].wNumberMBsInSlice);
- strRes.AppendFormat(_T("%d,"), pSlice[i].wQuantizerScaleCode);
- strRes.AppendFormat(_T("%d"), pSlice[i].wBadSliceChopping);
-
- LOG_TOFILE (LOG_FILE_SLICESHORT, strRes);
- strRes = "";
- }
+ CString strRes;
+ static bool bFirstSlice = true;
+
+ if (bFirstSlice) {
+ strRes = _T("nCnt, wHorizontalPosition, wVerticalPosition, dwSliceBitsInBuffer,dwSliceDataLocation, bStartCodeBitOffset, bReservedBits, wMBbitOffset, wNumberMBsInSlice, wQuantizerScaleCode, wBadSliceChopping");
+
+ LOG_TOFILE(LOG_FILE_SLICESHORT, strRes);
+ strRes = "";
+ bFirstSlice = false;
+ }
+
+ for (int i = 0; i < nCount; i++) {
+ strRes.AppendFormat(_T("%d,"), i);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].wHorizontalPosition);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].wVerticalPosition);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].dwSliceBitsInBuffer);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].dwSliceDataLocation);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].bStartCodeBitOffset);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].bReservedBits);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].wMBbitOffset);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].wNumberMBsInSlice);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].wQuantizerScaleCode);
+ strRes.AppendFormat(_T("%d"), pSlice[i].wBadSliceChopping);
+
+ LOG_TOFILE(LOG_FILE_SLICESHORT, strRes);
+ strRes = "";
+ }
}
-static void LogH264SliceLong (DXVA_Slice_H264_Long* pSlice, int nCount)
+static void LogH264SliceLong(DXVA_Slice_H264_Long* pSlice, int nCount)
{
- static bool bFirstSlice = true;
- CString strRes;
-
- if (bFirstSlice) {
- strRes = _T("nCnt, BSNALunitDataLocation, SliceBytesInBuffer, wBadSliceChopping,") \
- _T("first_mb_in_slice, NumMbsForSlice, BitOffsetToSliceData, slice_type,luma_log2_weight_denom,chroma_log2_weight_denom,") \
- _T("num_ref_idx_l0_active_minus1,num_ref_idx_l1_active_minus1,slice_alpha_c0_offset_div2,slice_beta_offset_div2,") \
- _T("Reserved8Bits,slice_qs_delta,slice_qp_delta,redundant_pic_cnt,direct_spatial_mv_pred_flag,cabac_init_idc,") \
- _T("disable_deblocking_filter_idc,slice_id,");
-
- for (int i=0; i<2; i++) { /* L0 & L1 */
- for (int j=0; j<32; j++) {
- strRes.AppendFormat(_T("R[%d][%d].AssociatedFlag,"), i, j);
- strRes.AppendFormat(_T("R[%d][%d].bPicEntry,"), i, j);
- strRes.AppendFormat(_T("R[%d][%d].Index7Bits,"), i, j);
- }
- }
-
- for (int a=0; a<2; a++) { /* L0 & L1; Y, Cb, Cr */
- for (int b=0; b<32; b++) {
- for (int c=0; c<3; c++) {
- for (int d=0; d<2; d++) {
- strRes.AppendFormat(_T("W[%d][%d][%d][%d],"), a,b,c,d);
- }
- }
- }
- }
-
-
- LOG_TOFILE (LOG_FILE_SLICELONG, strRes);
- strRes = "";
- }
- bFirstSlice = false;
-
- for (int i=0; i<nCount; i++) {
- strRes.AppendFormat(_T("%d,"), i);
- strRes.AppendFormat(_T("%d,"), pSlice[i].BSNALunitDataLocation);
- strRes.AppendFormat(_T("%d,"), pSlice[i].SliceBytesInBuffer);
- strRes.AppendFormat(_T("%d,"), pSlice[i].wBadSliceChopping);
-
- strRes.AppendFormat(_T("%d,"), pSlice[i].first_mb_in_slice);
- strRes.AppendFormat(_T("%d,"), pSlice[i].NumMbsForSlice);
-
- strRes.AppendFormat(_T("%d,"), pSlice[i].BitOffsetToSliceData);
-
- strRes.AppendFormat(_T("%d,"), pSlice[i].slice_type);
- strRes.AppendFormat(_T("%d,"), pSlice[i].luma_log2_weight_denom);
- strRes.AppendFormat(_T("%d,"), pSlice[i].chroma_log2_weight_denom);
- strRes.AppendFormat(_T("%d,"), pSlice[i].num_ref_idx_l0_active_minus1);
- strRes.AppendFormat(_T("%d,"), pSlice[i].num_ref_idx_l1_active_minus1);
- strRes.AppendFormat(_T("%d,"), pSlice[i].slice_alpha_c0_offset_div2);
- strRes.AppendFormat(_T("%d,"), pSlice[i].slice_beta_offset_div2);
- strRes.AppendFormat(_T("%d,"), pSlice[i].Reserved8Bits);
-
- strRes.AppendFormat(_T("%d,"), pSlice[i].slice_qs_delta);
-
- strRes.AppendFormat(_T("%d,"), pSlice[i].slice_qp_delta);
- strRes.AppendFormat(_T("%d,"), pSlice[i].redundant_pic_cnt);
- strRes.AppendFormat(_T("%d,"), pSlice[i].direct_spatial_mv_pred_flag);
- strRes.AppendFormat(_T("%d,"), pSlice[i].cabac_init_idc);
- strRes.AppendFormat(_T("%d,"), pSlice[i].disable_deblocking_filter_idc);
- strRes.AppendFormat(_T("%d,"), pSlice[i].slice_id);
-
- for (int a=0; a<2; a++) { /* L0 & L1 */
- for (int b=0; b<32; b++) {
- strRes.AppendFormat(_T("%d,"), pSlice[i].RefPicList[a][b].AssociatedFlag);
- strRes.AppendFormat(_T("%d,"), pSlice[i].RefPicList[a][b].bPicEntry);
- strRes.AppendFormat(_T("%d,"), pSlice[i].RefPicList[a][b].Index7Bits);
- }
- }
-
- for (int a=0; a<2; a++) { /* L0 & L1; Y, Cb, Cr */
- for (int b=0; b<32; b++) {
- for (int c=0; c<3; c++) {
- for (int d=0; d<2; d++) {
- strRes.AppendFormat(_T("%d,"), pSlice[i].Weights[a][b][c][d]);
- }
- }
- }
- }
-
- LOG_TOFILE (LOG_FILE_SLICELONG, strRes);
- strRes = "";
- }
+ static bool bFirstSlice = true;
+ CString strRes;
+
+ if (bFirstSlice) {
+ strRes = _T("nCnt, BSNALunitDataLocation, SliceBytesInBuffer, wBadSliceChopping,") \
+ _T("first_mb_in_slice, NumMbsForSlice, BitOffsetToSliceData, slice_type,luma_log2_weight_denom,chroma_log2_weight_denom,") \
+ _T("num_ref_idx_l0_active_minus1,num_ref_idx_l1_active_minus1,slice_alpha_c0_offset_div2,slice_beta_offset_div2,") \
+ _T("Reserved8Bits,slice_qs_delta,slice_qp_delta,redundant_pic_cnt,direct_spatial_mv_pred_flag,cabac_init_idc,") \
+ _T("disable_deblocking_filter_idc,slice_id,");
+
+ for (int i = 0; i < 2; i++) { /* L0 & L1 */
+ for (int j = 0; j < 32; j++) {
+ strRes.AppendFormat(_T("R[%d][%d].AssociatedFlag,"), i, j);
+ strRes.AppendFormat(_T("R[%d][%d].bPicEntry,"), i, j);
+ strRes.AppendFormat(_T("R[%d][%d].Index7Bits,"), i, j);
+ }
+ }
+
+ for (int a = 0; a < 2; a++) { /* L0 & L1; Y, Cb, Cr */
+ for (int b = 0; b < 32; b++) {
+ for (int c = 0; c < 3; c++) {
+ for (int d = 0; d < 2; d++) {
+ strRes.AppendFormat(_T("W[%d][%d][%d][%d],"), a, b, c, d);
+ }
+ }
+ }
+ }
+
+
+ LOG_TOFILE(LOG_FILE_SLICELONG, strRes);
+ strRes = "";
+ }
+ bFirstSlice = false;
+
+ for (int i = 0; i < nCount; i++) {
+ strRes.AppendFormat(_T("%d,"), i);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].BSNALunitDataLocation);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].SliceBytesInBuffer);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].wBadSliceChopping);
+
+ strRes.AppendFormat(_T("%d,"), pSlice[i].first_mb_in_slice);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].NumMbsForSlice);
+
+ strRes.AppendFormat(_T("%d,"), pSlice[i].BitOffsetToSliceData);
+
+ strRes.AppendFormat(_T("%d,"), pSlice[i].slice_type);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].luma_log2_weight_denom);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].chroma_log2_weight_denom);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].num_ref_idx_l0_active_minus1);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].num_ref_idx_l1_active_minus1);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].slice_alpha_c0_offset_div2);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].slice_beta_offset_div2);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].Reserved8Bits);
+
+ strRes.AppendFormat(_T("%d,"), pSlice[i].slice_qs_delta);
+
+ strRes.AppendFormat(_T("%d,"), pSlice[i].slice_qp_delta);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].redundant_pic_cnt);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].direct_spatial_mv_pred_flag);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].cabac_init_idc);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].disable_deblocking_filter_idc);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].slice_id);
+
+ for (int a = 0; a < 2; a++) { /* L0 & L1 */
+ for (int b = 0; b < 32; b++) {
+ strRes.AppendFormat(_T("%d,"), pSlice[i].RefPicList[a][b].AssociatedFlag);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].RefPicList[a][b].bPicEntry);
+ strRes.AppendFormat(_T("%d,"), pSlice[i].RefPicList[a][b].Index7Bits);
+ }
+ }
+
+ for (int a = 0; a < 2; a++) { /* L0 & L1; Y, Cb, Cr */
+ for (int b = 0; b < 32; b++) {
+ for (int c = 0; c < 3; c++) {
+ for (int d = 0; d < 2; d++) {
+ strRes.AppendFormat(_T("%d,"), pSlice[i].Weights[a][b][c][d]);
+ }
+ }
+ }
+ }
+
+ LOG_TOFILE(LOG_FILE_SLICELONG, strRes);
+ strRes = "";
+ }
}
-static void LogDXVA_PictureParameters (DXVA_PictureParameters* pPic)
+static void LogDXVA_PictureParameters(DXVA_PictureParameters* pPic)
{
- static bool bFirstPictureParam = true;
- CString strRes;
-
- if (bFirstPictureParam) {
- LOG_TOFILE (LOG_FILE_PICTURE, _T("wDecodedPictureIndex,wDeblockedPictureIndex,wForwardRefPictureIndex,wBackwardRefPictureIndex,wPicWidthInMBminus1,wPicHeightInMBminus1,bMacroblockWidthMinus1,bMacroblockHeightMinus1,bBlockWidthMinus1,bBlockHeightMinus1,bBPPminus1,bPicStructure,bSecondField,bPicIntra,bPicBackwardPrediction,bBidirectionalAveragingMode,bMVprecisionAndChromaRelation,bChromaFormat,bPicScanFixed,bPicScanMethod,bPicReadbackRequests,bRcontrol,bPicSpatialResid8,bPicOverflowBlocks,bPicExtrapolation,bPicDeblocked,bPicDeblockConfined,bPic4MVallowed,bPicOBMC,bPicBinPB,bMV_RPS,bReservedBits,wBitstreamFcodes,wBitstreamPCEelements,bBitstreamConcealmentNeed,bBitstreamConcealmentMethod"));
- }
- bFirstPictureParam = false;
-
- strRes.Format (_T("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d"),
- pPic->wDecodedPictureIndex,
- pPic->wDeblockedPictureIndex,
- pPic->wForwardRefPictureIndex,
- pPic->wBackwardRefPictureIndex,
- pPic->wPicWidthInMBminus1,
- pPic->wPicHeightInMBminus1,
- pPic->bMacroblockWidthMinus1,
- pPic->bMacroblockHeightMinus1,
- pPic->bBlockWidthMinus1,
- pPic->bBlockHeightMinus1,
- pPic->bBPPminus1,
- pPic->bPicStructure,
- pPic->bSecondField,
- pPic->bPicIntra,
- pPic->bPicBackwardPrediction,
- pPic->bBidirectionalAveragingMode,
- pPic->bMVprecisionAndChromaRelation,
- pPic->bChromaFormat,
- pPic->bPicScanFixed,
- pPic->bPicScanMethod,
- pPic->bPicReadbackRequests,
- pPic->bRcontrol,
- pPic->bPicSpatialResid8,
- pPic->bPicOverflowBlocks,
- pPic->bPicExtrapolation,
- pPic->bPicDeblocked,
- pPic->bPicDeblockConfined,
- pPic->bPic4MVallowed,
- pPic->bPicOBMC,
- pPic->bPicBinPB,
- pPic->bMV_RPS,
- pPic->bReservedBits,
- pPic->wBitstreamFcodes,
- pPic->wBitstreamPCEelements,
- pPic->bBitstreamConcealmentNeed,
- pPic->bBitstreamConcealmentMethod);
-
- LOG_TOFILE (LOG_FILE_PICTURE, strRes);
+ static bool bFirstPictureParam = true;
+ CString strRes;
+
+ if (bFirstPictureParam) {
+ LOG_TOFILE(LOG_FILE_PICTURE, _T("wDecodedPictureIndex,wDeblockedPictureIndex,wForwardRefPictureIndex,wBackwardRefPictureIndex,wPicWidthInMBminus1,wPicHeightInMBminus1,bMacroblockWidthMinus1,bMacroblockHeightMinus1,bBlockWidthMinus1,bBlockHeightMinus1,bBPPminus1,bPicStructure,bSecondField,bPicIntra,bPicBackwardPrediction,bBidirectionalAveragingMode,bMVprecisionAndChromaRelation,bChromaFormat,bPicScanFixed,bPicScanMethod,bPicReadbackRequests,bRcontrol,bPicSpatialResid8,bPicOverflowBlocks,bPicExtrapolation,bPicDeblocked,bPicDeblockConfined,bPic4MVallowed,bPicOBMC,bPicBinPB,bMV_RPS,bReservedBits,wBitstreamFcodes,wBitstreamPCEelements,bBitstreamConcealmentNeed,bBitstreamConcealmentMethod"));
+ }
+ bFirstPictureParam = false;
+
+ strRes.Format(_T("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d"),
+ pPic->wDecodedPictureIndex,
+ pPic->wDeblockedPictureIndex,
+ pPic->wForwardRefPictureIndex,
+ pPic->wBackwardRefPictureIndex,
+ pPic->wPicWidthInMBminus1,
+ pPic->wPicHeightInMBminus1,
+ pPic->bMacroblockWidthMinus1,
+ pPic->bMacroblockHeightMinus1,
+ pPic->bBlockWidthMinus1,
+ pPic->bBlockHeightMinus1,
+ pPic->bBPPminus1,
+ pPic->bPicStructure,
+ pPic->bSecondField,
+ pPic->bPicIntra,
+ pPic->bPicBackwardPrediction,
+ pPic->bBidirectionalAveragingMode,
+ pPic->bMVprecisionAndChromaRelation,
+ pPic->bChromaFormat,
+ pPic->bPicScanFixed,
+ pPic->bPicScanMethod,
+ pPic->bPicReadbackRequests,
+ pPic->bRcontrol,
+ pPic->bPicSpatialResid8,
+ pPic->bPicOverflowBlocks,
+ pPic->bPicExtrapolation,
+ pPic->bPicDeblocked,
+ pPic->bPicDeblockConfined,
+ pPic->bPic4MVallowed,
+ pPic->bPicOBMC,
+ pPic->bPicBinPB,
+ pPic->bMV_RPS,
+ pPic->bReservedBits,
+ pPic->wBitstreamFcodes,
+ pPic->wBitstreamPCEelements,
+ pPic->bBitstreamConcealmentNeed,
+ pPic->bBitstreamConcealmentMethod);
+
+ LOG_TOFILE(LOG_FILE_PICTURE, strRes);
}
void LogDXVA_Bitstream(BYTE* pBuffer, int nSize)
{
- CString strRes;
- static bool bFirstBitstream = true;
-
- if (bFirstBitstream) {
- LOG_TOFILE (LOG_FILE_BITSTREAM, _T("Size,Start, Stop"));
- }
- bFirstBitstream = false;
-
- strRes.Format (_T("%d, -"), nSize);
-
- for (int i=0; i<20; i++) {
- if (i < nSize) {
- strRes.AppendFormat (_T(" %02x"), pBuffer[i]);
- } else {
- strRes.Append(_T(" --"));
- }
- }
-
- strRes.Append (_T(", -"), nSize);
- for (int i=0; i<20; i++) {
- if (nSize-i >= 0) {
- strRes.AppendFormat (_T(" %02x"), pBuffer[i]);
- } else {
- strRes.Append(_T(" --"));
- }
- }
-
- LOG_TOFILE (LOG_FILE_BITSTREAM, strRes);
+ CString strRes;
+ static bool bFirstBitstream = true;
+
+ if (bFirstBitstream) {
+ LOG_TOFILE(LOG_FILE_BITSTREAM, _T("Size,Start, Stop"));
+ }
+ bFirstBitstream = false;
+
+ strRes.Format(_T("%d, -"), nSize);
+
+ for (int i = 0; i < 20; i++) {
+ if (i < nSize) {
+ strRes.AppendFormat(_T(" %02x"), pBuffer[i]);
+ } else {
+ strRes.Append(_T(" --"));
+ }
+ }
+
+ strRes.Append(_T(", -"), nSize);
+ for (int i = 0; i < 20; i++) {
+ if (nSize - i >= 0) {
+ strRes.AppendFormat(_T(" %02x"), pBuffer[i]);
+ } else {
+ strRes.Append(_T(" --"));
+ }
+ }
+
+ LOG_TOFILE(LOG_FILE_BITSTREAM, strRes);
}
@@ -664,407 +664,407 @@ void LogDXVA_Bitstream(BYTE* pBuffer, int nSize)
inline static void LOG(...) { }
inline static void LOGPF(LPCTSTR prefix, const DDPIXELFORMAT* p, int n) {}
inline static void LOGUDI(LPCTSTR prefix, const AMVAUncompDataInfo* p, int n) {}
-inline static void LogDXVA_PicParams_H264 (DXVA_PicParams_H264* pPic) {}
-inline static void LogDXVA_PictureParameters (DXVA_PictureParameters* pPic) {}
+inline static void LogDXVA_PicParams_H264(DXVA_PicParams_H264* pPic) {}
+inline static void LogDXVA_PictureParameters(DXVA_PictureParameters* pPic) {}
inline static void LogDXVA_Bitstream(BYTE* pBuffer, int nSize) {}
#endif
#ifdef _DEBUG
-static HRESULT STDMETHODCALLTYPE GetVideoAcceleratorGUIDsMine(IAMVideoAcceleratorC * This, LPDWORD pdwNumGuidsSupported, LPGUID pGuidsSupported)
+static HRESULT STDMETHODCALLTYPE GetVideoAcceleratorGUIDsMine(IAMVideoAcceleratorC* This, LPDWORD pdwNumGuidsSupported, LPGUID pGuidsSupported)
{
- LOG(_T("\nGetVideoAcceleratorGUIDs"));
+ LOG(_T("\nGetVideoAcceleratorGUIDs"));
- if (pdwNumGuidsSupported) {
- LOG(_T("[in] *pdwNumGuidsSupported = %d"), *pdwNumGuidsSupported);
- }
+ if (pdwNumGuidsSupported) {
+ LOG(_T("[in] *pdwNumGuidsSupported = %d"), *pdwNumGuidsSupported);
+ }
- HRESULT hr = GetVideoAcceleratorGUIDsOrg(This, pdwNumGuidsSupported, pGuidsSupported);
+ HRESULT hr = GetVideoAcceleratorGUIDsOrg(This, pdwNumGuidsSupported, pGuidsSupported);
- LOG(_T("hr = %08x"), hr);
+ LOG(_T("hr = %08x"), hr);
- if (pdwNumGuidsSupported) {
- LOG(_T("[out] *pdwNumGuidsSupported = %d"), *pdwNumGuidsSupported);
+ if (pdwNumGuidsSupported) {
+ LOG(_T("[out] *pdwNumGuidsSupported = %d"), *pdwNumGuidsSupported);
- if (pGuidsSupported) {
- for (DWORD i = 0; i < *pdwNumGuidsSupported; i++) {
- LOG(_T("[out] pGuidsSupported[%d] = %s"), i, CStringFromGUID(pGuidsSupported[i]));
- }
- }
- }
+ if (pGuidsSupported) {
+ for (DWORD i = 0; i < *pdwNumGuidsSupported; i++) {
+ LOG(_T("[out] pGuidsSupported[%d] = %s"), i, CStringFromGUID(pGuidsSupported[i]));
+ }
+ }
+ }
- return hr;
+ return hr;
}
-static HRESULT STDMETHODCALLTYPE GetUncompFormatsSupportedMine(IAMVideoAcceleratorC * This, const GUID *pGuid, LPDWORD pdwNumFormatsSupported, LPDDPIXELFORMAT pFormatsSupported)
+static HRESULT STDMETHODCALLTYPE GetUncompFormatsSupportedMine(IAMVideoAcceleratorC* This, const GUID* pGuid, LPDWORD pdwNumFormatsSupported, LPDDPIXELFORMAT pFormatsSupported)
{
- LOG(_T("\nGetUncompFormatsSupported"));
+ LOG(_T("\nGetUncompFormatsSupported"));
- if (pGuid) {
- LOG(_T("[in] *pGuid = %s"), CStringFromGUID(*pGuid));
- }
+ if (pGuid) {
+ LOG(_T("[in] *pGuid = %s"), CStringFromGUID(*pGuid));
+ }
- if (pdwNumFormatsSupported) {
- LOG(_T("[in] *pdwNumFormatsSupported = %d"), *pdwNumFormatsSupported);
- }
+ if (pdwNumFormatsSupported) {
+ LOG(_T("[in] *pdwNumFormatsSupported = %d"), *pdwNumFormatsSupported);
+ }
- HRESULT hr = GetUncompFormatsSupportedOrg(This, pGuid, pdwNumFormatsSupported, pFormatsSupported);
+ HRESULT hr = GetUncompFormatsSupportedOrg(This, pGuid, pdwNumFormatsSupported, pFormatsSupported);
- LOG(_T("hr = %08x"), hr);
+ LOG(_T("hr = %08x"), hr);
- if (pdwNumFormatsSupported) {
- LOG(_T("[out] *pdwNumFormatsSupported = %d"), *pdwNumFormatsSupported);
+ if (pdwNumFormatsSupported) {
+ LOG(_T("[out] *pdwNumFormatsSupported = %d"), *pdwNumFormatsSupported);
- if (pFormatsSupported) {
- LOGPF(_T("[out] pFormatsSupported"), pFormatsSupported, *pdwNumFormatsSupported);
- }
- }
+ if (pFormatsSupported) {
+ LOGPF(_T("[out] pFormatsSupported"), pFormatsSupported, *pdwNumFormatsSupported);
+ }
+ }
- return hr;
+ return hr;
}
-static HRESULT STDMETHODCALLTYPE GetInternalMemInfoMine(IAMVideoAcceleratorC * This, const GUID *pGuid, const AMVAUncompDataInfo *pamvaUncompDataInfo, LPAMVAInternalMemInfo pamvaInternalMemInfo)
+static HRESULT STDMETHODCALLTYPE GetInternalMemInfoMine(IAMVideoAcceleratorC* This, const GUID* pGuid, const AMVAUncompDataInfo* pamvaUncompDataInfo, LPAMVAInternalMemInfo pamvaInternalMemInfo)
{
- LOG(_T("\nGetInternalMemInfo"));
+ LOG(_T("\nGetInternalMemInfo"));
- HRESULT hr = GetInternalMemInfoOrg(This, pGuid, pamvaUncompDataInfo, pamvaInternalMemInfo);
+ HRESULT hr = GetInternalMemInfoOrg(This, pGuid, pamvaUncompDataInfo, pamvaInternalMemInfo);
- LOG(_T("hr = %08x"), hr);
+ LOG(_T("hr = %08x"), hr);
- return hr;
+ return hr;
}
#endif
-static HRESULT STDMETHODCALLTYPE GetCompBufferInfoMine(IAMVideoAcceleratorC * This, const GUID *pGuid, const AMVAUncompDataInfo *pamvaUncompDataInfo, LPDWORD pdwNumTypesCompBuffers, LPAMVACompBufferInfo pamvaCompBufferInfo)
+static HRESULT STDMETHODCALLTYPE GetCompBufferInfoMine(IAMVideoAcceleratorC* This, const GUID* pGuid, const AMVAUncompDataInfo* pamvaUncompDataInfo, LPDWORD pdwNumTypesCompBuffers, LPAMVACompBufferInfo pamvaCompBufferInfo)
{
- LOG(_T("\nGetCompBufferInfo"));
+ LOG(_T("\nGetCompBufferInfo"));
- if (pGuid) {
- g_guidDXVADecoder = *pGuid;
- g_nDXVAVersion = 1;
+ if (pGuid) {
+ g_guidDXVADecoder = *pGuid;
+ g_nDXVAVersion = 1;
#ifdef _DEBUG
- LOG(_T("[in] *pGuid = %s"), CStringFromGUID(*pGuid));
+ LOG(_T("[in] *pGuid = %s"), CStringFromGUID(*pGuid));
- if (pdwNumTypesCompBuffers) {
- LOG(_T("[in] *pdwNumTypesCompBuffers = %d"), *pdwNumTypesCompBuffers);
- }
+ if (pdwNumTypesCompBuffers) {
+ LOG(_T("[in] *pdwNumTypesCompBuffers = %d"), *pdwNumTypesCompBuffers);
+ }
#endif
- }
+ }
- HRESULT hr = GetCompBufferInfoOrg(This, pGuid, pamvaUncompDataInfo, pdwNumTypesCompBuffers, pamvaCompBufferInfo);
+ HRESULT hr = GetCompBufferInfoOrg(This, pGuid, pamvaUncompDataInfo, pdwNumTypesCompBuffers, pamvaCompBufferInfo);
- LOG(_T("hr = %08x"), hr);
+ LOG(_T("hr = %08x"), hr);
- //if (pdwNumTypesCompBuffers)
- //{
- // LOG(_T("[out] *pdwNumTypesCompBuffers = %d"), *pdwNumTypesCompBuffers);
+ //if (pdwNumTypesCompBuffers)
+ //{
+ // LOG(_T("[out] *pdwNumTypesCompBuffers = %d"), *pdwNumTypesCompBuffers);
- // if (pamvaUncompDataInfo)
- // {
- // LOGUDI(_T("[out] pamvaUncompDataInfo"), pamvaUncompDataInfo, *pdwNumTypesCompBuffers);
- // }
- //}
+ // if (pamvaUncompDataInfo)
+ // {
+ // LOGUDI(_T("[out] pamvaUncompDataInfo"), pamvaUncompDataInfo, *pdwNumTypesCompBuffers);
+ // }
+ //}
- return hr;
+ return hr;
}
#ifdef _DEBUG
-static HRESULT STDMETHODCALLTYPE GetInternalCompBufferInfoMine(IAMVideoAcceleratorC * This, LPDWORD pdwNumTypesCompBuffers, LPAMVACompBufferInfo pamvaCompBufferInfo)
+static HRESULT STDMETHODCALLTYPE GetInternalCompBufferInfoMine(IAMVideoAcceleratorC* This, LPDWORD pdwNumTypesCompBuffers, LPAMVACompBufferInfo pamvaCompBufferInfo)
{
- LOG(_T("\nGetInternalCompBufferInfo"));
+ LOG(_T("\nGetInternalCompBufferInfo"));
- HRESULT hr = GetInternalCompBufferInfoOrg(This, pdwNumTypesCompBuffers, pamvaCompBufferInfo);
+ HRESULT hr = GetInternalCompBufferInfoOrg(This, pdwNumTypesCompBuffers, pamvaCompBufferInfo);
- LOG(_T("hr = %08x"), hr);
+ LOG(_T("hr = %08x"), hr);
- return hr;
+ return hr;
}
-static HRESULT STDMETHODCALLTYPE BeginFrameMine(IAMVideoAcceleratorC * This, const AMVABeginFrameInfo *amvaBeginFrameInfo)
+static HRESULT STDMETHODCALLTYPE BeginFrameMine(IAMVideoAcceleratorC* This, const AMVABeginFrameInfo* amvaBeginFrameInfo)
{
- LOG(_T("\nBeginFrame"));
+ LOG(_T("\nBeginFrame"));
- if (amvaBeginFrameInfo) {
- LOG(_T("[in] amvaBeginFrameInfo->dwDestSurfaceIndex = %08x"), amvaBeginFrameInfo->dwDestSurfaceIndex);
- LOG(_T("[in] amvaBeginFrameInfo->pInputData = %08x"), amvaBeginFrameInfo->pInputData);
- LOG(_T("[in] amvaBeginFrameInfo->dwSizeInputData = %08x"), amvaBeginFrameInfo->dwSizeInputData);
- LOG(_T("[in] amvaBeginFrameInfo->pOutputData = %08x"), amvaBeginFrameInfo->pOutputData);
- LOG(_T("[in] amvaBeginFrameInfo->dwSizeOutputData = %08x"), amvaBeginFrameInfo->dwSizeOutputData);
- }
- if (amvaBeginFrameInfo && (amvaBeginFrameInfo->dwSizeInputData == 4)) {
- LOG(_T("[in] amvaBeginFrameInfo->pInputData => dwDestSurfaceIndex = %ld "),
- ((DWORD*)amvaBeginFrameInfo->pInputData)[0]);
- }
+ if (amvaBeginFrameInfo) {
+ LOG(_T("[in] amvaBeginFrameInfo->dwDestSurfaceIndex = %08x"), amvaBeginFrameInfo->dwDestSurfaceIndex);
+ LOG(_T("[in] amvaBeginFrameInfo->pInputData = %08x"), amvaBeginFrameInfo->pInputData);
+ LOG(_T("[in] amvaBeginFrameInfo->dwSizeInputData = %08x"), amvaBeginFrameInfo->dwSizeInputData);
+ LOG(_T("[in] amvaBeginFrameInfo->pOutputData = %08x"), amvaBeginFrameInfo->pOutputData);
+ LOG(_T("[in] amvaBeginFrameInfo->dwSizeOutputData = %08x"), amvaBeginFrameInfo->dwSizeOutputData);
+ }
+ if (amvaBeginFrameInfo && (amvaBeginFrameInfo->dwSizeInputData == 4)) {
+ LOG(_T("[in] amvaBeginFrameInfo->pInputData => dwDestSurfaceIndex = %ld "),
+ ((DWORD*)amvaBeginFrameInfo->pInputData)[0]);
+ }
- HRESULT hr = BeginFrameOrg(This, amvaBeginFrameInfo);
+ HRESULT hr = BeginFrameOrg(This, amvaBeginFrameInfo);
- LOG(_T("hr = %08x"), hr);
+ LOG(_T("hr = %08x"), hr);
- return hr;
+ return hr;
}
-static HRESULT STDMETHODCALLTYPE EndFrameMine(IAMVideoAcceleratorC * This, const AMVAEndFrameInfo *pEndFrameInfo)
+static HRESULT STDMETHODCALLTYPE EndFrameMine(IAMVideoAcceleratorC* This, const AMVAEndFrameInfo* pEndFrameInfo)
{
- LOG(_T("\nEndFrame"));
+ LOG(_T("\nEndFrame"));
- if (pEndFrameInfo) {
- LOG(_T("[in] pEndFrameInfo->dwSizeMiscData = %08x"), pEndFrameInfo->dwSizeMiscData);
- LOG(_T("[in] pEndFrameInfo->pMiscData = %08x"), pEndFrameInfo->pMiscData);
+ if (pEndFrameInfo) {
+ LOG(_T("[in] pEndFrameInfo->dwSizeMiscData = %08x"), pEndFrameInfo->dwSizeMiscData);
+ LOG(_T("[in] pEndFrameInfo->pMiscData = %08x"), pEndFrameInfo->pMiscData);
- if (pEndFrameInfo->dwSizeMiscData >= 4)
- LOG(_T("[out] pEndFrameInfo->pMiscData = %02x %02x %02x %02x "),
- ((BYTE*)pEndFrameInfo->pMiscData)[0],
- ((BYTE*)pEndFrameInfo->pMiscData)[1],
- ((BYTE*)pEndFrameInfo->pMiscData)[2],
- ((BYTE*)pEndFrameInfo->pMiscData)[3]);
+ if (pEndFrameInfo->dwSizeMiscData >= 4)
+ LOG(_T("[out] pEndFrameInfo->pMiscData = %02x %02x %02x %02x "),
+ ((BYTE*)pEndFrameInfo->pMiscData)[0],
+ ((BYTE*)pEndFrameInfo->pMiscData)[1],
+ ((BYTE*)pEndFrameInfo->pMiscData)[2],
+ ((BYTE*)pEndFrameInfo->pMiscData)[3]);
- }
+ }
- HRESULT hr = EndFrameOrg(This, pEndFrameInfo);
+ HRESULT hr = EndFrameOrg(This, pEndFrameInfo);
- LOG(_T("hr = %08x"), hr);
+ LOG(_T("hr = %08x"), hr);
- return hr;
+ return hr;
}
-static HRESULT STDMETHODCALLTYPE GetBufferMine(IAMVideoAcceleratorC * This, DWORD dwTypeIndex, DWORD dwBufferIndex, BOOL bReadOnly, LPVOID *ppBuffer, LONG *lpStride)
+static HRESULT STDMETHODCALLTYPE GetBufferMine(IAMVideoAcceleratorC* This, DWORD dwTypeIndex, DWORD dwBufferIndex, BOOL bReadOnly, LPVOID* ppBuffer, LONG* lpStride)
{
- HRESULT hr = GetBufferOrg(This, dwTypeIndex, dwBufferIndex, bReadOnly, ppBuffer, lpStride);
+ HRESULT hr = GetBufferOrg(This, dwTypeIndex, dwBufferIndex, bReadOnly, ppBuffer, lpStride);
- LOG(_T("\nGetBuffer"));
+ LOG(_T("\nGetBuffer"));
- LOG(_T("[in] dwTypeIndex = %08x"), dwTypeIndex);
- LOG(_T("[in] dwBufferIndex = %08x"), dwBufferIndex);
- LOG(_T("[in] bReadOnly = %08x"), bReadOnly);
- LOG(_T("[in] ppBuffer = %08x"), ppBuffer);
- LOG(_T("[out] *lpStride = %08x"), *lpStride);
- LOG(_T("hr = %08x"), hr);
+ LOG(_T("[in] dwTypeIndex = %08x"), dwTypeIndex);
+ LOG(_T("[in] dwBufferIndex = %08x"), dwBufferIndex);
+ LOG(_T("[in] bReadOnly = %08x"), bReadOnly);
+ LOG(_T("[in] ppBuffer = %08x"), ppBuffer);
+ LOG(_T("[out] *lpStride = %08x"), *lpStride);
+ LOG(_T("hr = %08x"), hr);
- g_ppBuffer [dwTypeIndex] = (BYTE*)*ppBuffer;
- //LOG(_T("[out] *ppBuffer = %02x %02x %02x %02x ..."), ((BYTE*)*ppBuffer)[0], ((BYTE*)*ppBuffer)[1], ((BYTE*)*ppBuffer)[2], ((BYTE*)*ppBuffer)[3]);
+ g_ppBuffer [dwTypeIndex] = (BYTE*)*ppBuffer;
+ //LOG(_T("[out] *ppBuffer = %02x %02x %02x %02x ..."), ((BYTE*)*ppBuffer)[0], ((BYTE*)*ppBuffer)[1], ((BYTE*)*ppBuffer)[2], ((BYTE*)*ppBuffer)[3]);
- return hr;
+ return hr;
}
-static HRESULT STDMETHODCALLTYPE ReleaseBufferMine(IAMVideoAcceleratorC * This, DWORD dwTypeIndex, DWORD dwBufferIndex)
+static HRESULT STDMETHODCALLTYPE ReleaseBufferMine(IAMVideoAcceleratorC* This, DWORD dwTypeIndex, DWORD dwBufferIndex)
{
- LOG(_T("\nReleaseBuffer"));
+ LOG(_T("\nReleaseBuffer"));
- LOG(_T("[in] dwTypeIndex = %08x"), dwTypeIndex);
- LOG(_T("[in] dwBufferIndex = %08x"), dwBufferIndex);
+ LOG(_T("[in] dwTypeIndex = %08x"), dwTypeIndex);
+ LOG(_T("[in] dwBufferIndex = %08x"), dwBufferIndex);
- HRESULT hr = ReleaseBufferOrg(This, dwTypeIndex, dwBufferIndex);
+ HRESULT hr = ReleaseBufferOrg(This, dwTypeIndex, dwBufferIndex);
- LOG(_T("hr = %08x"), hr);
+ LOG(_T("hr = %08x"), hr);
- return hr;
+ return hr;
}
static HRESULT STDMETHODCALLTYPE ExecuteMine(IAMVideoAcceleratorC* This, DWORD dwFunction, LPVOID lpPrivateInputData, DWORD cbPrivateInputData,
- LPVOID lpPrivateOutputData, DWORD cbPrivateOutputData, DWORD dwNumBuffers, const AMVABUFFERINFO *pamvaBufferInfo)
+ LPVOID lpPrivateOutputData, DWORD cbPrivateOutputData, DWORD dwNumBuffers, const AMVABUFFERINFO* pamvaBufferInfo)
{
#ifdef _DEBUG
- LOG(_T("\nExecute"));
- LOG(_T("[in] dwFunction = %08x"), dwFunction);
- if (lpPrivateInputData) {
- if (dwFunction == 0x01000000) {
- DXVA_BufferDescription* pBuffDesc = (DXVA_BufferDescription*)lpPrivateInputData;
-
- for (DWORD i=0; i<dwNumBuffers; i++) {
- LOG(_T("[in] lpPrivateInputData, buffer description %d"), i);
- LOG(_T(" pBuffDesc->dwTypeIndex = %d"), pBuffDesc[i].dwTypeIndex);
- LOG(_T(" pBuffDesc->dwBufferIndex = %d"), pBuffDesc[i].dwBufferIndex);
- LOG(_T(" pBuffDesc->dwDataOffset = %d"), pBuffDesc[i].dwDataOffset);
- LOG(_T(" pBuffDesc->dwDataSize = %d"), pBuffDesc[i].dwDataSize);
- LOG(_T(" pBuffDesc->dwFirstMBaddress = %d"), pBuffDesc[i].dwFirstMBaddress);
- LOG(_T(" pBuffDesc->dwHeight = %d"), pBuffDesc[i].dwHeight);
- LOG(_T(" pBuffDesc->dwStride = %d"), pBuffDesc[i].dwStride);
- LOG(_T(" pBuffDesc->dwWidth = %d"), pBuffDesc[i].dwWidth);
- LOG(_T(" pBuffDesc->dwNumMBsInBuffer = %d"), pBuffDesc[i].dwNumMBsInBuffer);
- LOG(_T(" pBuffDesc->dwReservedBits = %d"), pBuffDesc[i].dwReservedBits);
- }
- } else if ((dwFunction == 0xfffff101) || (dwFunction == 0xfffff501)) {
- DXVA_ConfigPictureDecode* ConfigRequested = (DXVA_ConfigPictureDecode*)lpPrivateInputData;
- LOG(_T("[in] lpPrivateInputData, config requested"));
- LOG(_T(" pBuffDesc->dwTypeIndex = %d"), ConfigRequested->bConfig4GroupedCoefs);
- LOG(_T(" ConfigRequested->bConfigBitstreamRaw = %d"), ConfigRequested->bConfigBitstreamRaw);
- LOG(_T(" ConfigRequested->bConfigHostInverseScan = %d"), ConfigRequested->bConfigHostInverseScan);
- LOG(_T(" ConfigRequested->bConfigIntraResidUnsigned = %d"), ConfigRequested->bConfigIntraResidUnsigned);
- LOG(_T(" ConfigRequested->bConfigMBcontrolRasterOrder = %d"), ConfigRequested->bConfigMBcontrolRasterOrder);
- LOG(_T(" ConfigRequested->bConfigResid8Subtraction = %d"), ConfigRequested->bConfigResid8Subtraction);
- LOG(_T(" ConfigRequested->bConfigResidDiffAccelerator = %d"), ConfigRequested->bConfigResidDiffAccelerator);
- LOG(_T(" ConfigRequested->bConfigResidDiffHost = %d"), ConfigRequested->bConfigResidDiffHost);
- LOG(_T(" ConfigRequested->bConfigSpatialHost8or9Clipping= %d"), ConfigRequested->bConfigSpatialHost8or9Clipping);
- LOG(_T(" ConfigRequested->bConfigSpatialResid8 = %d"), ConfigRequested->bConfigSpatialResid8);
- LOG(_T(" ConfigRequested->bConfigSpatialResidInterleaved= %d"), ConfigRequested->bConfigSpatialResidInterleaved);
- LOG(_T(" ConfigRequested->bConfigSpecificIDCT = %d"), ConfigRequested->bConfigSpecificIDCT);
- LOG(_T(" ConfigRequested->dwFunction = %d"), ConfigRequested->dwFunction);
- LOG(_T(" ConfigRequested->guidConfigBitstreamEncryption = %s"), CStringFromGUID (ConfigRequested->guidConfigBitstreamEncryption));
- LOG(_T(" ConfigRequested->guidConfigMBcontrolEncryption = %s"), CStringFromGUID (ConfigRequested->guidConfigMBcontrolEncryption));
- LOG(_T(" ConfigRequested->guidConfigResidDiffEncryption = %s"), CStringFromGUID (ConfigRequested->guidConfigResidDiffEncryption));
- } else
- LOG(_T("[in] lpPrivateInputData = %02x %02x %02x %02x ..."),
- ((BYTE*)lpPrivateInputData)[0],
- ((BYTE*)lpPrivateInputData)[1],
- ((BYTE*)lpPrivateInputData)[2],
- ((BYTE*)lpPrivateInputData)[3]);
- }
- LOG(_T("[in] cbPrivateInputData = %08x"), cbPrivateInputData);
- LOG(_T("[in] lpPrivateOutputData = %08x"), lpPrivateOutputData);
- LOG(_T("[in] cbPrivateOutputData = %08x"), cbPrivateOutputData);
- LOG(_T("[in] dwNumBuffers = %08x"), dwNumBuffers);
- if (pamvaBufferInfo) {
- for (DWORD i=0; i<dwNumBuffers; i++) {
- LOG(_T("[in] pamvaBufferInfo, buffer description %d"), i);
- LOG(_T("[in] pamvaBufferInfo->dwTypeIndex = %08x"), pamvaBufferInfo[i].dwTypeIndex);
- LOG(_T("[in] pamvaBufferInfo->dwBufferIndex = %08x"), pamvaBufferInfo[i].dwBufferIndex);
- LOG(_T("[in] pamvaBufferInfo->dwDataOffset = %08x"), pamvaBufferInfo[i].dwDataOffset);
- LOG(_T("[in] pamvaBufferInfo->dwDataSize = %08x"), pamvaBufferInfo[i].dwDataSize);
- }
- }
-
-
- for (DWORD i=0; i<dwNumBuffers; i++) {
- if (pamvaBufferInfo[i].dwTypeIndex == DXVA_PICTURE_DECODE_BUFFER) {
- if (g_guidDXVADecoder == DXVA2_ModeH264_E || g_guidDXVADecoder == DXVA_Intel_H264_ClearVideo) {
- LogDXVA_PicParams_H264 ((DXVA_PicParams_H264*)g_ppBuffer[pamvaBufferInfo[i].dwTypeIndex]);
- } else if (g_guidDXVADecoder == DXVA2_ModeVC1_D || g_guidDXVADecoder == DXVA_Intel_VC1_ClearVideo) {
- LogDXVA_PictureParameters((DXVA_PictureParameters*)g_ppBuffer[pamvaBufferInfo[i].dwTypeIndex]);
- }
- } else if (pamvaBufferInfo[i].dwTypeIndex == DXVA_SLICE_CONTROL_BUFFER && (pamvaBufferInfo[i].dwDataSize % sizeof(DXVA_Slice_H264_Short)) == 0) {
- for (WORD j=0; j<pamvaBufferInfo[i].dwDataSize / sizeof(DXVA_Slice_H264_Short); j++) {
- DXVA_Slice_H264_Short* pSlice = &(((DXVA_Slice_H264_Short*)g_ppBuffer[pamvaBufferInfo[i].dwTypeIndex])[j]);
- LOG(_T(" - BSNALunitDataLocation %d"), pSlice->BSNALunitDataLocation);
- LOG(_T(" - SliceBytesInBuffer %d"), pSlice->SliceBytesInBuffer);
- LOG(_T(" - wBadSliceChopping %d"), pSlice->wBadSliceChopping);
- }
- } else if (pamvaBufferInfo[i].dwTypeIndex == DXVA_BITSTREAM_DATA_BUFFER) {
-
- LogDXVA_Bitstream(g_ppBuffer[pamvaBufferInfo[i].dwTypeIndex], pamvaBufferInfo[i].dwDataSize);
+ LOG(_T("\nExecute"));
+ LOG(_T("[in] dwFunction = %08x"), dwFunction);
+ if (lpPrivateInputData) {
+ if (dwFunction == 0x01000000) {
+ DXVA_BufferDescription* pBuffDesc = (DXVA_BufferDescription*)lpPrivateInputData;
+
+ for (DWORD i = 0; i < dwNumBuffers; i++) {
+ LOG(_T("[in] lpPrivateInputData, buffer description %d"), i);
+ LOG(_T(" pBuffDesc->dwTypeIndex = %d"), pBuffDesc[i].dwTypeIndex);
+ LOG(_T(" pBuffDesc->dwBufferIndex = %d"), pBuffDesc[i].dwBufferIndex);
+ LOG(_T(" pBuffDesc->dwDataOffset = %d"), pBuffDesc[i].dwDataOffset);
+ LOG(_T(" pBuffDesc->dwDataSize = %d"), pBuffDesc[i].dwDataSize);
+ LOG(_T(" pBuffDesc->dwFirstMBaddress = %d"), pBuffDesc[i].dwFirstMBaddress);
+ LOG(_T(" pBuffDesc->dwHeight = %d"), pBuffDesc[i].dwHeight);
+ LOG(_T(" pBuffDesc->dwStride = %d"), pBuffDesc[i].dwStride);
+ LOG(_T(" pBuffDesc->dwWidth = %d"), pBuffDesc[i].dwWidth);
+ LOG(_T(" pBuffDesc->dwNumMBsInBuffer = %d"), pBuffDesc[i].dwNumMBsInBuffer);
+ LOG(_T(" pBuffDesc->dwReservedBits = %d"), pBuffDesc[i].dwReservedBits);
+ }
+ } else if ((dwFunction == 0xfffff101) || (dwFunction == 0xfffff501)) {
+ DXVA_ConfigPictureDecode* ConfigRequested = (DXVA_ConfigPictureDecode*)lpPrivateInputData;
+ LOG(_T("[in] lpPrivateInputData, config requested"));
+ LOG(_T(" pBuffDesc->dwTypeIndex = %d"), ConfigRequested->bConfig4GroupedCoefs);
+ LOG(_T(" ConfigRequested->bConfigBitstreamRaw = %d"), ConfigRequested->bConfigBitstreamRaw);
+ LOG(_T(" ConfigRequested->bConfigHostInverseScan = %d"), ConfigRequested->bConfigHostInverseScan);
+ LOG(_T(" ConfigRequested->bConfigIntraResidUnsigned = %d"), ConfigRequested->bConfigIntraResidUnsigned);
+ LOG(_T(" ConfigRequested->bConfigMBcontrolRasterOrder = %d"), ConfigRequested->bConfigMBcontrolRasterOrder);
+ LOG(_T(" ConfigRequested->bConfigResid8Subtraction = %d"), ConfigRequested->bConfigResid8Subtraction);
+ LOG(_T(" ConfigRequested->bConfigResidDiffAccelerator = %d"), ConfigRequested->bConfigResidDiffAccelerator);
+ LOG(_T(" ConfigRequested->bConfigResidDiffHost = %d"), ConfigRequested->bConfigResidDiffHost);
+ LOG(_T(" ConfigRequested->bConfigSpatialHost8or9Clipping= %d"), ConfigRequested->bConfigSpatialHost8or9Clipping);
+ LOG(_T(" ConfigRequested->bConfigSpatialResid8 = %d"), ConfigRequested->bConfigSpatialResid8);
+ LOG(_T(" ConfigRequested->bConfigSpatialResidInterleaved= %d"), ConfigRequested->bConfigSpatialResidInterleaved);
+ LOG(_T(" ConfigRequested->bConfigSpecificIDCT = %d"), ConfigRequested->bConfigSpecificIDCT);
+ LOG(_T(" ConfigRequested->dwFunction = %d"), ConfigRequested->dwFunction);
+ LOG(_T(" ConfigRequested->guidConfigBitstreamEncryption = %s"), CStringFromGUID(ConfigRequested->guidConfigBitstreamEncryption));
+ LOG(_T(" ConfigRequested->guidConfigMBcontrolEncryption = %s"), CStringFromGUID(ConfigRequested->guidConfigMBcontrolEncryption));
+ LOG(_T(" ConfigRequested->guidConfigResidDiffEncryption = %s"), CStringFromGUID(ConfigRequested->guidConfigResidDiffEncryption));
+ } else
+ LOG(_T("[in] lpPrivateInputData = %02x %02x %02x %02x ..."),
+ ((BYTE*)lpPrivateInputData)[0],
+ ((BYTE*)lpPrivateInputData)[1],
+ ((BYTE*)lpPrivateInputData)[2],
+ ((BYTE*)lpPrivateInputData)[3]);
+ }
+ LOG(_T("[in] cbPrivateInputData = %08x"), cbPrivateInputData);
+ LOG(_T("[in] lpPrivateOutputData = %08x"), lpPrivateOutputData);
+ LOG(_T("[in] cbPrivateOutputData = %08x"), cbPrivateOutputData);
+ LOG(_T("[in] dwNumBuffers = %08x"), dwNumBuffers);
+ if (pamvaBufferInfo) {
+ for (DWORD i = 0; i < dwNumBuffers; i++) {
+ LOG(_T("[in] pamvaBufferInfo, buffer description %d"), i);
+ LOG(_T("[in] pamvaBufferInfo->dwTypeIndex = %08x"), pamvaBufferInfo[i].dwTypeIndex);
+ LOG(_T("[in] pamvaBufferInfo->dwBufferIndex = %08x"), pamvaBufferInfo[i].dwBufferIndex);
+ LOG(_T("[in] pamvaBufferInfo->dwDataOffset = %08x"), pamvaBufferInfo[i].dwDataOffset);
+ LOG(_T("[in] pamvaBufferInfo->dwDataSize = %08x"), pamvaBufferInfo[i].dwDataSize);
+ }
+ }
+
+
+ for (DWORD i = 0; i < dwNumBuffers; i++) {
+ if (pamvaBufferInfo[i].dwTypeIndex == DXVA_PICTURE_DECODE_BUFFER) {
+ if (g_guidDXVADecoder == DXVA2_ModeH264_E || g_guidDXVADecoder == DXVA_Intel_H264_ClearVideo) {
+ LogDXVA_PicParams_H264((DXVA_PicParams_H264*)g_ppBuffer[pamvaBufferInfo[i].dwTypeIndex]);
+ } else if (g_guidDXVADecoder == DXVA2_ModeVC1_D || g_guidDXVADecoder == DXVA_Intel_VC1_ClearVideo) {
+ LogDXVA_PictureParameters((DXVA_PictureParameters*)g_ppBuffer[pamvaBufferInfo[i].dwTypeIndex]);
+ }
+ } else if (pamvaBufferInfo[i].dwTypeIndex == DXVA_SLICE_CONTROL_BUFFER && (pamvaBufferInfo[i].dwDataSize % sizeof(DXVA_Slice_H264_Short)) == 0) {
+ for (WORD j = 0; j < pamvaBufferInfo[i].dwDataSize / sizeof(DXVA_Slice_H264_Short); j++) {
+ DXVA_Slice_H264_Short* pSlice = &(((DXVA_Slice_H264_Short*)g_ppBuffer[pamvaBufferInfo[i].dwTypeIndex])[j]);
+ LOG(_T(" - BSNALunitDataLocation %d"), pSlice->BSNALunitDataLocation);
+ LOG(_T(" - SliceBytesInBuffer %d"), pSlice->SliceBytesInBuffer);
+ LOG(_T(" - wBadSliceChopping %d"), pSlice->wBadSliceChopping);
+ }
+ } else if (pamvaBufferInfo[i].dwTypeIndex == DXVA_BITSTREAM_DATA_BUFFER) {
+
+ LogDXVA_Bitstream(g_ppBuffer[pamvaBufferInfo[i].dwTypeIndex], pamvaBufferInfo[i].dwDataSize);
#if LOG_BITSTREAM
- char strFile[_MAX_PATH];
- static int nNb = 1;
- sprintf_s(strFile, "BitStream%d.bin", nNb++);
- FILE* hFile = fopen(strFile, "wb");
- if (hFile) {
- fwrite(g_ppBuffer[pamvaBufferInfo[i].dwTypeIndex],
- 1,
- pamvaBufferInfo[i].dwDataSize,
- hFile);
- fclose(hFile);
- }
+ char strFile[_MAX_PATH];
+ static int nNb = 1;
+ sprintf_s(strFile, "BitStream%d.bin", nNb++);
+ FILE* hFile = fopen(strFile, "wb");
+ if (hFile) {
+ fwrite(g_ppBuffer[pamvaBufferInfo[i].dwTypeIndex],
+ 1,
+ pamvaBufferInfo[i].dwDataSize,
+ hFile);
+ fclose(hFile);
+ }
#endif
- }
- }
+ }
+ }
#endif
- HRESULT hr = ExecuteOrg(This, dwFunction, lpPrivateInputData, cbPrivateInputData, lpPrivateOutputData, cbPrivateOutputData, dwNumBuffers, pamvaBufferInfo);
+ HRESULT hr = ExecuteOrg(This, dwFunction, lpPrivateInputData, cbPrivateInputData, lpPrivateOutputData, cbPrivateOutputData, dwNumBuffers, pamvaBufferInfo);
- LOG(_T("hr = %08x"), hr);
+ LOG(_T("hr = %08x"), hr);
- if (lpPrivateOutputData && (dwFunction == 0x01000000)) {
- LOG(_T("[out] *lpPrivateOutputData : Result = %08x"), ((DWORD*)lpPrivateOutputData)[0]);
- }
+ if (lpPrivateOutputData && (dwFunction == 0x01000000)) {
+ LOG(_T("[out] *lpPrivateOutputData : Result = %08x"), ((DWORD*)lpPrivateOutputData)[0]);
+ }
- return hr;
+ return hr;
}
-static HRESULT STDMETHODCALLTYPE QueryRenderStatusMine(IAMVideoAcceleratorC * This, DWORD dwTypeIndex, DWORD dwBufferIndex, DWORD dwFlags)
+static HRESULT STDMETHODCALLTYPE QueryRenderStatusMine(IAMVideoAcceleratorC* This, DWORD dwTypeIndex, DWORD dwBufferIndex, DWORD dwFlags)
{
- HRESULT hr = QueryRenderStatusOrg(This, dwTypeIndex, dwBufferIndex, dwFlags);
- LOG(_T("\nQueryRenderStatus Type=%d Index=%d hr = %08x"), dwTypeIndex, dwBufferIndex, hr);
+ HRESULT hr = QueryRenderStatusOrg(This, dwTypeIndex, dwBufferIndex, dwFlags);
+ LOG(_T("\nQueryRenderStatus Type=%d Index=%d hr = %08x"), dwTypeIndex, dwBufferIndex, hr);
- return hr;
+ return hr;
}
-static HRESULT STDMETHODCALLTYPE DisplayFrameMine(IAMVideoAcceleratorC * This, DWORD dwFlipToIndex, IMediaSample *pMediaSample)
+static HRESULT STDMETHODCALLTYPE DisplayFrameMine(IAMVideoAcceleratorC* This, DWORD dwFlipToIndex, IMediaSample* pMediaSample)
{
- LOG(_T("\nEnter DisplayFrame : %d"), dwFlipToIndex);
+ LOG(_T("\nEnter DisplayFrame : %d"), dwFlipToIndex);
- HRESULT hr = DisplayFrameOrg(This, dwFlipToIndex, pMediaSample);
+ HRESULT hr = DisplayFrameOrg(This, dwFlipToIndex, pMediaSample);
- LOG(_T("Leave DisplayFrame : hr = %08x"), hr);
+ LOG(_T("Leave DisplayFrame : hr = %08x"), hr);
- return hr;
+ return hr;
}
#endif
void HookAMVideoAccelerator(IAMVideoAcceleratorC* pAMVideoAcceleratorC)
{
- g_guidDXVADecoder = GUID_NULL;
- g_nDXVAVersion = 0;
+ g_guidDXVADecoder = GUID_NULL;
+ g_nDXVAVersion = 0;
- BOOL res;
- DWORD flOldProtect = 0;
- res = VirtualProtect(pAMVideoAcceleratorC->lpVtbl, sizeof(IAMVideoAcceleratorC), PAGE_WRITECOPY, &flOldProtect);
+ BOOL res;
+ DWORD flOldProtect = 0;
+ res = VirtualProtect(pAMVideoAcceleratorC->lpVtbl, sizeof(IAMVideoAcceleratorC), PAGE_WRITECOPY, &flOldProtect);
#ifdef _DEBUG
- if (GetVideoAcceleratorGUIDsOrg == NULL) {
- GetVideoAcceleratorGUIDsOrg = pAMVideoAcceleratorC->lpVtbl->GetVideoAcceleratorGUIDs;
- }
- if (GetUncompFormatsSupportedOrg == NULL) {
- GetUncompFormatsSupportedOrg = pAMVideoAcceleratorC->lpVtbl->GetUncompFormatsSupported;
- }
- if (GetInternalMemInfoOrg == NULL) {
- GetInternalMemInfoOrg = pAMVideoAcceleratorC->lpVtbl->GetInternalMemInfo;
- }
+ if (GetVideoAcceleratorGUIDsOrg == NULL) {
+ GetVideoAcceleratorGUIDsOrg = pAMVideoAcceleratorC->lpVtbl->GetVideoAcceleratorGUIDs;
+ }
+ if (GetUncompFormatsSupportedOrg == NULL) {
+ GetUncompFormatsSupportedOrg = pAMVideoAcceleratorC->lpVtbl->GetUncompFormatsSupported;
+ }
+ if (GetInternalMemInfoOrg == NULL) {
+ GetInternalMemInfoOrg = pAMVideoAcceleratorC->lpVtbl->GetInternalMemInfo;
+ }
#endif
- if (GetCompBufferInfoOrg == NULL) {
- GetCompBufferInfoOrg = pAMVideoAcceleratorC->lpVtbl->GetCompBufferInfo;
- }
+ if (GetCompBufferInfoOrg == NULL) {
+ GetCompBufferInfoOrg = pAMVideoAcceleratorC->lpVtbl->GetCompBufferInfo;
+ }
#ifdef _DEBUG
- if (GetInternalCompBufferInfoOrg == NULL) {
- GetInternalCompBufferInfoOrg = pAMVideoAcceleratorC->lpVtbl->GetInternalCompBufferInfo;
- }
- if (BeginFrameOrg == NULL) {
- BeginFrameOrg = pAMVideoAcceleratorC->lpVtbl->BeginFrame;
- }
- if (EndFrameOrg == NULL) {
- EndFrameOrg = pAMVideoAcceleratorC->lpVtbl->EndFrame;
- }
- if (GetBufferOrg == NULL) {
- GetBufferOrg = pAMVideoAcceleratorC->lpVtbl->GetBuffer;
- }
- if (ReleaseBufferOrg == NULL) {
- ReleaseBufferOrg = pAMVideoAcceleratorC->lpVtbl->ReleaseBuffer;
- }
- if (ExecuteOrg == NULL) {
- ExecuteOrg = pAMVideoAcceleratorC->lpVtbl->Execute;
- }
- if (QueryRenderStatusOrg == NULL) {
- QueryRenderStatusOrg = pAMVideoAcceleratorC->lpVtbl->QueryRenderStatus;
- }
- if (DisplayFrameOrg == NULL) {
- DisplayFrameOrg = pAMVideoAcceleratorC->lpVtbl->DisplayFrame;
- }
-
- pAMVideoAcceleratorC->lpVtbl->GetVideoAcceleratorGUIDs = GetVideoAcceleratorGUIDsMine;
- pAMVideoAcceleratorC->lpVtbl->GetUncompFormatsSupported = GetUncompFormatsSupportedMine;
- pAMVideoAcceleratorC->lpVtbl->GetInternalMemInfo = GetInternalMemInfoMine;
+ if (GetInternalCompBufferInfoOrg == NULL) {
+ GetInternalCompBufferInfoOrg = pAMVideoAcceleratorC->lpVtbl->GetInternalCompBufferInfo;
+ }
+ if (BeginFrameOrg == NULL) {
+ BeginFrameOrg = pAMVideoAcceleratorC->lpVtbl->BeginFrame;
+ }
+ if (EndFrameOrg == NULL) {
+ EndFrameOrg = pAMVideoAcceleratorC->lpVtbl->EndFrame;
+ }
+ if (GetBufferOrg == NULL) {
+ GetBufferOrg = pAMVideoAcceleratorC->lpVtbl->GetBuffer;
+ }
+ if (ReleaseBufferOrg == NULL) {
+ ReleaseBufferOrg = pAMVideoAcceleratorC->lpVtbl->ReleaseBuffer;
+ }
+ if (ExecuteOrg == NULL) {
+ ExecuteOrg = pAMVideoAcceleratorC->lpVtbl->Execute;
+ }
+ if (QueryRenderStatusOrg == NULL) {
+ QueryRenderStatusOrg = pAMVideoAcceleratorC->lpVtbl->QueryRenderStatus;
+ }
+ if (DisplayFrameOrg == NULL) {
+ DisplayFrameOrg = pAMVideoAcceleratorC->lpVtbl->DisplayFrame;
+ }
+
+ pAMVideoAcceleratorC->lpVtbl->GetVideoAcceleratorGUIDs = GetVideoAcceleratorGUIDsMine;
+ pAMVideoAcceleratorC->lpVtbl->GetUncompFormatsSupported = GetUncompFormatsSupportedMine;
+ pAMVideoAcceleratorC->lpVtbl->GetInternalMemInfo = GetInternalMemInfoMine;
#endif
- pAMVideoAcceleratorC->lpVtbl->GetCompBufferInfo = GetCompBufferInfoMine; // Function sets global variable(s)
+ pAMVideoAcceleratorC->lpVtbl->GetCompBufferInfo = GetCompBufferInfoMine; // Function sets global variable(s)
#ifdef _DEBUG
- pAMVideoAcceleratorC->lpVtbl->GetInternalCompBufferInfo = GetInternalCompBufferInfoMine;
- pAMVideoAcceleratorC->lpVtbl->BeginFrame = BeginFrameMine;
- pAMVideoAcceleratorC->lpVtbl->EndFrame = EndFrameMine;
- pAMVideoAcceleratorC->lpVtbl->GetBuffer = GetBufferMine;
- pAMVideoAcceleratorC->lpVtbl->ReleaseBuffer = ReleaseBufferMine;
- pAMVideoAcceleratorC->lpVtbl->Execute = ExecuteMine;
- pAMVideoAcceleratorC->lpVtbl->QueryRenderStatus = QueryRenderStatusMine;
- pAMVideoAcceleratorC->lpVtbl->DisplayFrame = DisplayFrameMine;
+ pAMVideoAcceleratorC->lpVtbl->GetInternalCompBufferInfo = GetInternalCompBufferInfoMine;
+ pAMVideoAcceleratorC->lpVtbl->BeginFrame = BeginFrameMine;
+ pAMVideoAcceleratorC->lpVtbl->EndFrame = EndFrameMine;
+ pAMVideoAcceleratorC->lpVtbl->GetBuffer = GetBufferMine;
+ pAMVideoAcceleratorC->lpVtbl->ReleaseBuffer = ReleaseBufferMine;
+ pAMVideoAcceleratorC->lpVtbl->Execute = ExecuteMine;
+ pAMVideoAcceleratorC->lpVtbl->QueryRenderStatus = QueryRenderStatusMine;
+ pAMVideoAcceleratorC->lpVtbl->DisplayFrame = DisplayFrameMine;
- res = VirtualProtect(pAMVideoAcceleratorC->lpVtbl, sizeof(IAMVideoAcceleratorC), PAGE_EXECUTE, &flOldProtect);
+ res = VirtualProtect(pAMVideoAcceleratorC->lpVtbl, sizeof(IAMVideoAcceleratorC), PAGE_EXECUTE, &flOldProtect);
#if DXVA_LOGFILE_A
- ::DeleteFile (LOG_FILE_DXVA);
- ::DeleteFile (LOG_FILE_PICTURE);
- ::DeleteFile (LOG_FILE_SLICELONG);
- ::DeleteFile (LOG_FILE_SLICESHORT);
- ::DeleteFile (LOG_FILE_BITSTREAM);
+ ::DeleteFile(LOG_FILE_DXVA);
+ ::DeleteFile(LOG_FILE_PICTURE);
+ ::DeleteFile(LOG_FILE_SLICELONG);
+ ::DeleteFile(LOG_FILE_SLICESHORT);
+ ::DeleteFile(LOG_FILE_BITSTREAM);
#endif
#endif
}
@@ -1075,186 +1075,184 @@ void HookAMVideoAccelerator(IAMVideoAcceleratorC* pAMVideoAcceleratorC)
#ifdef _DEBUG
static void LogDecodeBufferDesc(DXVA2_DecodeBufferDesc* pDecodeBuff)
{
- LOG(_T("DecodeBufferDesc type : %d Size=%d NumMBsInBuffer=%d"), pDecodeBuff->CompressedBufferType, pDecodeBuff->DataSize, pDecodeBuff->NumMBsInBuffer);
- //LOG(_T(" - BufferIndex %d"), pDecodeBuff->BufferIndex);
- //LOG(_T(" - DataOffset %d"), pDecodeBuff->DataOffset);
- //LOG(_T(" - DataSize %d"), pDecodeBuff->DataSize);
- //LOG(_T(" - FirstMBaddress %d"), pDecodeBuff->FirstMBaddress);
- //LOG(_T(" - NumMBsInBuffer %d"), pDecodeBuff->NumMBsInBuffer);
- //LOG(_T(" - Width %d"), pDecodeBuff->Width);
- //LOG(_T(" - Height %d"), pDecodeBuff->Height);
- //LOG(_T(" - Stride %d"), pDecodeBuff->Stride);
- //LOG(_T(" - ReservedBits %d"), pDecodeBuff->ReservedBits);
- //LOG(_T(" - pvPVPState %d"), pDecodeBuff->pvPVPState);
+ LOG(_T("DecodeBufferDesc type : %d Size=%d NumMBsInBuffer=%d"), pDecodeBuff->CompressedBufferType, pDecodeBuff->DataSize, pDecodeBuff->NumMBsInBuffer);
+ //LOG(_T(" - BufferIndex %d"), pDecodeBuff->BufferIndex);
+ //LOG(_T(" - DataOffset %d"), pDecodeBuff->DataOffset);
+ //LOG(_T(" - DataSize %d"), pDecodeBuff->DataSize);
+ //LOG(_T(" - FirstMBaddress %d"), pDecodeBuff->FirstMBaddress);
+ //LOG(_T(" - NumMBsInBuffer %d"), pDecodeBuff->NumMBsInBuffer);
+ //LOG(_T(" - Width %d"), pDecodeBuff->Width);
+ //LOG(_T(" - Height %d"), pDecodeBuff->Height);
+ //LOG(_T(" - Stride %d"), pDecodeBuff->Stride);
+ //LOG(_T(" - ReservedBits %d"), pDecodeBuff->ReservedBits);
+ //LOG(_T(" - pvPVPState %d"), pDecodeBuff->pvPVPState);
}
class CFakeDirectXVideoDecoder : public CUnknown, public IDirectXVideoDecoder
{
private :
- CComPtr<IDirectXVideoDecoder> m_pDec;
- BYTE* m_ppBuffer[MAX_BUFFER_TYPE];
- UINT m_ppBufferLen[MAX_BUFFER_TYPE];
+ CComPtr<IDirectXVideoDecoder> m_pDec;
+ BYTE* m_ppBuffer[MAX_BUFFER_TYPE];
+ UINT m_ppBufferLen[MAX_BUFFER_TYPE];
public :
- CFakeDirectXVideoDecoder(LPUNKNOWN pUnk, IDirectXVideoDecoder* pDec) : CUnknown(_T("Fake DXVA2 Dec"), pUnk) {
- m_pDec.Attach (pDec);
- memset (m_ppBuffer, 0, sizeof(m_ppBuffer));
- }
-
- ~CFakeDirectXVideoDecoder() {
- LOG(_T("CFakeDirectXVideoDecoder destroyed !\n"));
- }
-
- DECLARE_IUNKNOWN;
-
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
- if (riid == __uuidof(IDirectXVideoDecoder)) {
- return GetInterface((IDirectXVideoDecoder*)this, ppv);
- } else {
- return __super::NonDelegatingQueryInterface(riid, ppv);
- }
- }
-
- virtual HRESULT STDMETHODCALLTYPE GetVideoDecoderService(IDirectXVideoDecoderService **ppService) {
- HRESULT hr = m_pDec->GetVideoDecoderService (ppService);
- LOG(_T("IDirectXVideoDecoder::GetVideoDecoderService hr = %08x\n"), hr);
- return hr;
- }
-
- virtual HRESULT STDMETHODCALLTYPE GetCreationParameters(GUID *pDeviceGuid, DXVA2_VideoDesc *pVideoDesc, DXVA2_ConfigPictureDecode *pConfig, IDirect3DSurface9 ***pDecoderRenderTargets, UINT *pNumSurfaces) {
- HRESULT hr = m_pDec->GetCreationParameters(pDeviceGuid, pVideoDesc, pConfig, pDecoderRenderTargets, pNumSurfaces);
- LOG(_T("IDirectXVideoDecoder::GetCreationParameters hr = %08x\n"), hr);
- return hr;
- }
-
-
- virtual HRESULT STDMETHODCALLTYPE GetBuffer(UINT BufferType, void **ppBuffer, UINT *pBufferSize) {
- HRESULT hr = m_pDec->GetBuffer(BufferType, ppBuffer, pBufferSize);
-
- if (BufferType < MAX_BUFFER_TYPE) {
- m_ppBuffer[BufferType] = (BYTE*)*ppBuffer;
- m_ppBufferLen[BufferType] = *pBufferSize;
- }
- // LOG(_T("IDirectXVideoDecoder::GetBuffer Type = %d, hr = %08x"), BufferType, hr);
-
- return hr;
- }
-
- virtual HRESULT STDMETHODCALLTYPE ReleaseBuffer(UINT BufferType) {
- HRESULT hr = m_pDec->ReleaseBuffer (BufferType);
- // LOG(_T("IDirectXVideoDecoder::ReleaseBuffer Type = %d, hr = %08x"), BufferType, hr);
- return hr;
- }
-
- virtual HRESULT STDMETHODCALLTYPE BeginFrame(IDirect3DSurface9 *pRenderTarget, void *pvPVPData) {
- HRESULT hr = m_pDec->BeginFrame (pRenderTarget, pvPVPData);
- LOG(_T("IDirectXVideoDecoder::BeginFrame pRenderTarget = %08x, hr = %08x"), pRenderTarget, hr);
- return hr;
- }
-
- virtual HRESULT STDMETHODCALLTYPE EndFrame(HANDLE *pHandleComplete) {
- HRESULT hr = m_pDec->EndFrame (pHandleComplete);
- LOG(_T("IDirectXVideoDecoder::EndFrame Handle=0x%08x hr = %08x\n"), pHandleComplete, hr);
- return hr;
- }
-
- virtual HRESULT STDMETHODCALLTYPE Execute(const DXVA2_DecodeExecuteParams *pExecuteParams) {
+ CFakeDirectXVideoDecoder(LPUNKNOWN pUnk, IDirectXVideoDecoder* pDec) : CUnknown(_T("Fake DXVA2 Dec"), pUnk) {
+ m_pDec.Attach(pDec);
+ memset(m_ppBuffer, 0, sizeof(m_ppBuffer));
+ }
+
+ ~CFakeDirectXVideoDecoder() {
+ LOG(_T("CFakeDirectXVideoDecoder destroyed !\n"));
+ }
+
+ DECLARE_IUNKNOWN;
+
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
+ if (riid == __uuidof(IDirectXVideoDecoder)) {
+ return GetInterface((IDirectXVideoDecoder*)this, ppv);
+ } else {
+ return __super::NonDelegatingQueryInterface(riid, ppv);
+ }
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE GetVideoDecoderService(IDirectXVideoDecoderService** ppService) {
+ HRESULT hr = m_pDec->GetVideoDecoderService(ppService);
+ LOG(_T("IDirectXVideoDecoder::GetVideoDecoderService hr = %08x\n"), hr);
+ return hr;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE GetCreationParameters(GUID* pDeviceGuid, DXVA2_VideoDesc* pVideoDesc, DXVA2_ConfigPictureDecode* pConfig, IDirect3DSurface9** *pDecoderRenderTargets, UINT* pNumSurfaces) {
+ HRESULT hr = m_pDec->GetCreationParameters(pDeviceGuid, pVideoDesc, pConfig, pDecoderRenderTargets, pNumSurfaces);
+ LOG(_T("IDirectXVideoDecoder::GetCreationParameters hr = %08x\n"), hr);
+ return hr;
+ }
+
+
+ virtual HRESULT STDMETHODCALLTYPE GetBuffer(UINT BufferType, void** ppBuffer, UINT* pBufferSize) {
+ HRESULT hr = m_pDec->GetBuffer(BufferType, ppBuffer, pBufferSize);
+
+ if (BufferType < MAX_BUFFER_TYPE) {
+ m_ppBuffer[BufferType] = (BYTE*)*ppBuffer;
+ m_ppBufferLen[BufferType] = *pBufferSize;
+ }
+ // LOG(_T("IDirectXVideoDecoder::GetBuffer Type = %d, hr = %08x"), BufferType, hr);
+
+ return hr;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE ReleaseBuffer(UINT BufferType) {
+ HRESULT hr = m_pDec->ReleaseBuffer(BufferType);
+ // LOG(_T("IDirectXVideoDecoder::ReleaseBuffer Type = %d, hr = %08x"), BufferType, hr);
+ return hr;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE BeginFrame(IDirect3DSurface9* pRenderTarget, void* pvPVPData) {
+ HRESULT hr = m_pDec->BeginFrame(pRenderTarget, pvPVPData);
+ LOG(_T("IDirectXVideoDecoder::BeginFrame pRenderTarget = %08x, hr = %08x"), pRenderTarget, hr);
+ return hr;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE EndFrame(HANDLE* pHandleComplete) {
+ HRESULT hr = m_pDec->EndFrame(pHandleComplete);
+ LOG(_T("IDirectXVideoDecoder::EndFrame Handle=0x%08x hr = %08x\n"), pHandleComplete, hr);
+ return hr;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE Execute(const DXVA2_DecodeExecuteParams* pExecuteParams) {
#if defined(_DEBUG) && DXVA_LOGFILE_A
- for (DWORD i=0; i<pExecuteParams->NumCompBuffers; i++) {
- CString strBuffer;
-
- LogDecodeBufferDesc (&pExecuteParams->pCompressedBuffers[i]);
- /*
- for (int j=0; j<4000 && j<pExecuteParams->pCompressedBuffers[i].DataSize; j++)
- strBuffer.AppendFormat (_T("%02x "), m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType][j]);
-
- LOG (_T(" - Buffer type=%d, offset=%d, size=%d"),
- pExecuteParams->pCompressedBuffers[i].CompressedBufferType,
- pExecuteParams->pCompressedBuffers[i].DataOffset,
- pExecuteParams->pCompressedBuffers[i].DataSize);
-
- LOG (strBuffer);*/
-
- if (pExecuteParams->pCompressedBuffers[i].CompressedBufferType == DXVA2_PictureParametersBufferType) {
- if (g_guidDXVADecoder == DXVA2_ModeH264_E || g_guidDXVADecoder == DXVA_Intel_H264_ClearVideo) {
- LogDXVA_PicParams_H264 ((DXVA_PicParams_H264*)m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType]);
- } else if (g_guidDXVADecoder == DXVA2_ModeVC1_D || g_guidDXVADecoder == DXVA2_ModeMPEG2_VLD || g_guidDXVADecoder == DXVA_Intel_VC1_ClearVideo) {
- LogDXVA_PictureParameters((DXVA_PictureParameters*)m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType]);
- }
- }
-
- if (g_guidDXVADecoder == DXVA2_ModeH264_E || g_guidDXVADecoder == DXVA_Intel_H264_ClearVideo) {
- if (pExecuteParams->pCompressedBuffers[i].CompressedBufferType == DXVA2_SliceControlBufferType) {
- if (pExecuteParams->pCompressedBuffers[i].DataSize % sizeof(DXVA_Slice_H264_Long) == 0) {
- DXVA_Slice_H264_Long* pSlice = (DXVA_Slice_H264_Long*)m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType];
- LogH264SliceLong (pSlice, pExecuteParams->pCompressedBuffers[i].DataSize / sizeof(DXVA_Slice_H264_Long));
- } else if (pExecuteParams->pCompressedBuffers[i].DataSize % sizeof(DXVA_Slice_H264_Short) == 0) {
- DXVA_Slice_H264_Short* pSlice = (DXVA_Slice_H264_Short*)m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType];
- LogH264SliceShort (pSlice, pExecuteParams->pCompressedBuffers[i].DataSize / sizeof(DXVA_Slice_H264_Short));
- }
- }
- } else if (g_guidDXVADecoder == DXVA2_ModeVC1_D || g_guidDXVADecoder == DXVA2_ModeMPEG2_VLD || g_guidDXVADecoder == DXVA_Intel_VC1_ClearVideo) {
- if (pExecuteParams->pCompressedBuffers[i].CompressedBufferType == DXVA2_SliceControlBufferType) {
- DXVA_SliceInfo* pSlice = (DXVA_SliceInfo*)m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType];
- LogSliceInfo (pSlice, pExecuteParams->pCompressedBuffers[i].DataSize / sizeof(DXVA_SliceInfo));
- }
- }
+ for (DWORD i = 0; i < pExecuteParams->NumCompBuffers; i++) {
+ CString strBuffer;
+
+ LogDecodeBufferDesc(&pExecuteParams->pCompressedBuffers[i]);
+ /*
+ for (int j=0; j<4000 && j<pExecuteParams->pCompressedBuffers[i].DataSize; j++)
+ strBuffer.AppendFormat (_T("%02x "), m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType][j]);
+
+ LOG (_T(" - Buffer type=%d, offset=%d, size=%d"),
+ pExecuteParams->pCompressedBuffers[i].CompressedBufferType,
+ pExecuteParams->pCompressedBuffers[i].DataOffset,
+ pExecuteParams->pCompressedBuffers[i].DataSize);
+
+ LOG (strBuffer);*/
+
+ if (pExecuteParams->pCompressedBuffers[i].CompressedBufferType == DXVA2_PictureParametersBufferType) {
+ if (g_guidDXVADecoder == DXVA2_ModeH264_E || g_guidDXVADecoder == DXVA_Intel_H264_ClearVideo) {
+ LogDXVA_PicParams_H264((DXVA_PicParams_H264*)m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType]);
+ } else if (g_guidDXVADecoder == DXVA2_ModeVC1_D || g_guidDXVADecoder == DXVA2_ModeMPEG2_VLD || g_guidDXVADecoder == DXVA_Intel_VC1_ClearVideo) {
+ LogDXVA_PictureParameters((DXVA_PictureParameters*)m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType]);
+ }
+ }
+
+ if (g_guidDXVADecoder == DXVA2_ModeH264_E || g_guidDXVADecoder == DXVA_Intel_H264_ClearVideo) {
+ if (pExecuteParams->pCompressedBuffers[i].CompressedBufferType == DXVA2_SliceControlBufferType) {
+ if (pExecuteParams->pCompressedBuffers[i].DataSize % sizeof(DXVA_Slice_H264_Long) == 0) {
+ DXVA_Slice_H264_Long* pSlice = (DXVA_Slice_H264_Long*)m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType];
+ LogH264SliceLong(pSlice, pExecuteParams->pCompressedBuffers[i].DataSize / sizeof(DXVA_Slice_H264_Long));
+ } else if (pExecuteParams->pCompressedBuffers[i].DataSize % sizeof(DXVA_Slice_H264_Short) == 0) {
+ DXVA_Slice_H264_Short* pSlice = (DXVA_Slice_H264_Short*)m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType];
+ LogH264SliceShort(pSlice, pExecuteParams->pCompressedBuffers[i].DataSize / sizeof(DXVA_Slice_H264_Short));
+ }
+ }
+ } else if (g_guidDXVADecoder == DXVA2_ModeVC1_D || g_guidDXVADecoder == DXVA2_ModeMPEG2_VLD || g_guidDXVADecoder == DXVA_Intel_VC1_ClearVideo) {
+ if (pExecuteParams->pCompressedBuffers[i].CompressedBufferType == DXVA2_SliceControlBufferType) {
+ DXVA_SliceInfo* pSlice = (DXVA_SliceInfo*)m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType];
+ LogSliceInfo(pSlice, pExecuteParams->pCompressedBuffers[i].DataSize / sizeof(DXVA_SliceInfo));
+ }
+ }
#if LOG_MATRIX
- if (pExecuteParams->pCompressedBuffers[i].CompressedBufferType == DXVA2_InverseQuantizationMatrixBufferType) {
- char strFile[_MAX_PATH];
- static int nNb = 1;
- sprintf_s(strFile, "Matrix%d.bin", nNb++);
- FILE* hFile = fopen(strFile, "wb");
- if (hFile) {
- fwrite(m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType],
- 1,
- pExecuteParams->pCompressedBuffers[i].DataSize,
- hFile);
- fclose(hFile);
- }
- }
+ if (pExecuteParams->pCompressedBuffers[i].CompressedBufferType == DXVA2_InverseQuantizationMatrixBufferType) {
+ char strFile[_MAX_PATH];
+ static int nNb = 1;
+ sprintf_s(strFile, "Matrix%d.bin", nNb++);
+ FILE* hFile = fopen(strFile, "wb");
+ if (hFile) {
+ fwrite(m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType],
+ 1,
+ pExecuteParams->pCompressedBuffers[i].DataSize,
+ hFile);
+ fclose(hFile);
+ }
+ }
#endif
- if (pExecuteParams->pCompressedBuffers[i].CompressedBufferType == DXVA2_BitStreamDateBufferType) {
- LogDXVA_Bitstream(m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType], pExecuteParams->pCompressedBuffers[i].DataSize);
+ if (pExecuteParams->pCompressedBuffers[i].CompressedBufferType == DXVA2_BitStreamDateBufferType) {
+ LogDXVA_Bitstream(m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType], pExecuteParams->pCompressedBuffers[i].DataSize);
#if LOG_BITSTREAM
- char strFile[_MAX_PATH];
- static int nNb = 1;
- sprintf_s(strFile, "BitStream%d.bin", nNb++);
- FILE* hFile = fopen(strFile, "wb");
- if (hFile) {
- fwrite(m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType],
- 1,
- pExecuteParams->pCompressedBuffers[i].DataSize,
- hFile);
- fclose(hFile);
- }
+ char strFile[_MAX_PATH];
+ static int nNb = 1;
+ sprintf_s(strFile, "BitStream%d.bin", nNb++);
+ FILE* hFile = fopen(strFile, "wb");
+ if (hFile) {
+ fwrite(m_ppBuffer[pExecuteParams->pCompressedBuffers[i].CompressedBufferType],
+ 1,
+ pExecuteParams->pCompressedBuffers[i].DataSize,
+ hFile);
+ fclose(hFile);
+ }
#endif
- }
- }
+ }
+ }
#endif
- HRESULT hr = m_pDec->Execute (pExecuteParams);
+ HRESULT hr = m_pDec->Execute(pExecuteParams);
#ifdef _DEBUG
- if (pExecuteParams->pExtensionData)
- {
- LOG(_T("IDirectXVideoDecoder::Execute %d buffer, fct = %d (in=%d, out=%d), hr = %08x"),
- pExecuteParams->NumCompBuffers,
- pExecuteParams->pExtensionData->Function,
- pExecuteParams->pExtensionData->PrivateInputDataSize,
- pExecuteParams->pExtensionData->PrivateOutputDataSize,
- hr);
- }
- else {
- LOG(_T("IDirectXVideoDecoder::Execute %d buffer, hr = %08x"), pExecuteParams->NumCompBuffers, hr);
- }
+ if (pExecuteParams->pExtensionData) {
+ LOG(_T("IDirectXVideoDecoder::Execute %d buffer, fct = %d (in=%d, out=%d), hr = %08x"),
+ pExecuteParams->NumCompBuffers,
+ pExecuteParams->pExtensionData->Function,
+ pExecuteParams->pExtensionData->PrivateInputDataSize,
+ pExecuteParams->pExtensionData->PrivateOutputDataSize,
+ hr);
+ } else {
+ LOG(_T("IDirectXVideoDecoder::Execute %d buffer, hr = %08x"), pExecuteParams->NumCompBuffers, hr);
+ }
#endif
- return hr;
- }
+ return hr;
+ }
};
#endif
@@ -1263,88 +1261,88 @@ public :
// Why was the code duplicated ?
interface IDirectXVideoDecoderServiceC;
struct IDirectXVideoDecoderServiceCVtbl {
- BEGIN_INTERFACE
- HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IDirectXVideoDecoderServiceC* pThis, /* [in] */ REFIID riid, /* [iid_is][out] */ void **ppvObject );
- ULONG ( STDMETHODCALLTYPE *AddRef )(IDirectXVideoDecoderServiceC* pThis);
- ULONG ( STDMETHODCALLTYPE *Release )(IDirectXVideoDecoderServiceC* pThis);
- HRESULT (STDMETHODCALLTYPE* CreateSurface)(IDirectXVideoDecoderServiceC* pThis, __in UINT Width, __in UINT Height, __in UINT BackBuffers, __in D3DFORMAT Format, __in D3DPOOL Pool, __in DWORD Usage, __in DWORD DxvaType, __out_ecount(BackBuffers+1) IDirect3DSurface9 **ppSurface, __inout_opt HANDLE *pSharedHandle);
-
- HRESULT (STDMETHODCALLTYPE* GetDecoderDeviceGuids)(
- IDirectXVideoDecoderServiceC* pThis,
- __out UINT* pCount,
- __deref_out_ecount_opt(*pCount) GUID** pGuids);
-
- HRESULT (STDMETHODCALLTYPE* GetDecoderRenderTargets)(
- IDirectXVideoDecoderServiceC* pThis,
- __in REFGUID Guid,
- __out UINT* pCount,
- __deref_out_ecount_opt(*pCount) D3DFORMAT** pFormats);
-
- HRESULT (STDMETHODCALLTYPE* GetDecoderConfigurations)(
- IDirectXVideoDecoderServiceC* pThis,
- __in REFGUID Guid,
- __in const DXVA2_VideoDesc* pVideoDesc,
- __reserved void* pReserved,
- __out UINT* pCount,
- __deref_out_ecount_opt(*pCount) DXVA2_ConfigPictureDecode **ppConfigs);
-
- HRESULT (STDMETHODCALLTYPE* CreateVideoDecoder)(
- IDirectXVideoDecoderServiceC* pThis,
- __in REFGUID Guid,
- __in const DXVA2_VideoDesc* pVideoDesc,
- __in const DXVA2_ConfigPictureDecode* pConfig,
- __in_ecount(NumRenderTargets) IDirect3DSurface9 **ppDecoderRenderTargets,
- __in UINT NumRenderTargets,
- __deref_out IDirectXVideoDecoder** ppDecode);
-
- END_INTERFACE
+ BEGIN_INTERFACE
+ HRESULT(STDMETHODCALLTYPE* QueryInterface)(IDirectXVideoDecoderServiceC* pThis, /* [in] */ REFIID riid, /* [iid_is][out] */ void** ppvObject);
+ ULONG(STDMETHODCALLTYPE* AddRef)(IDirectXVideoDecoderServiceC* pThis);
+ ULONG(STDMETHODCALLTYPE* Release)(IDirectXVideoDecoderServiceC* pThis);
+ HRESULT(STDMETHODCALLTYPE* CreateSurface)(IDirectXVideoDecoderServiceC* pThis, __in UINT Width, __in UINT Height, __in UINT BackBuffers, __in D3DFORMAT Format, __in D3DPOOL Pool, __in DWORD Usage, __in DWORD DxvaType, __out_ecount(BackBuffers + 1) IDirect3DSurface9** ppSurface, __inout_opt HANDLE* pSharedHandle);
+
+ HRESULT(STDMETHODCALLTYPE* GetDecoderDeviceGuids)(
+ IDirectXVideoDecoderServiceC* pThis,
+ __out UINT* pCount,
+ __deref_out_ecount_opt(*pCount) GUID** pGuids);
+
+ HRESULT(STDMETHODCALLTYPE* GetDecoderRenderTargets)(
+ IDirectXVideoDecoderServiceC* pThis,
+ __in REFGUID Guid,
+ __out UINT* pCount,
+ __deref_out_ecount_opt(*pCount) D3DFORMAT** pFormats);
+
+ HRESULT(STDMETHODCALLTYPE* GetDecoderConfigurations)(
+ IDirectXVideoDecoderServiceC* pThis,
+ __in REFGUID Guid,
+ __in const DXVA2_VideoDesc* pVideoDesc,
+ __reserved void* pReserved,
+ __out UINT* pCount,
+ __deref_out_ecount_opt(*pCount) DXVA2_ConfigPictureDecode** ppConfigs);
+
+ HRESULT(STDMETHODCALLTYPE* CreateVideoDecoder)(
+ IDirectXVideoDecoderServiceC* pThis,
+ __in REFGUID Guid,
+ __in const DXVA2_VideoDesc* pVideoDesc,
+ __in const DXVA2_ConfigPictureDecode* pConfig,
+ __in_ecount(NumRenderTargets) IDirect3DSurface9** ppDecoderRenderTargets,
+ __in UINT NumRenderTargets,
+ __deref_out IDirectXVideoDecoder** ppDecode);
+
+ END_INTERFACE
};
interface IDirectXVideoDecoderServiceC {
- CONST_VTBL struct IDirectXVideoDecoderServiceCVtbl *lpVtbl;
+ CONST_VTBL struct IDirectXVideoDecoderServiceCVtbl* lpVtbl;
};
-IDirectXVideoDecoderServiceCVtbl* g_pIDirectXVideoDecoderServiceCVtbl = NULL;
-static HRESULT (STDMETHODCALLTYPE* CreateVideoDecoderOrg ) (IDirectXVideoDecoderServiceC* pThis, __in REFGUID Guid, __in const DXVA2_VideoDesc* pVideoDesc, __in const DXVA2_ConfigPictureDecode* pConfig, __in_ecount(NumRenderTargets) IDirect3DSurface9 **ppDecoderRenderTargets, __in UINT NumRenderTargets, __deref_out IDirectXVideoDecoder** ppDecode) = NULL;
+IDirectXVideoDecoderServiceCVtbl* g_pIDirectXVideoDecoderServiceCVtbl = NULL;
+static HRESULT(STDMETHODCALLTYPE* CreateVideoDecoderOrg)(IDirectXVideoDecoderServiceC* pThis, __in REFGUID Guid, __in const DXVA2_VideoDesc* pVideoDesc, __in const DXVA2_ConfigPictureDecode* pConfig, __in_ecount(NumRenderTargets) IDirect3DSurface9** ppDecoderRenderTargets, __in UINT NumRenderTargets, __deref_out IDirectXVideoDecoder** ppDecode) = NULL;
#ifdef _DEBUG
-static HRESULT (STDMETHODCALLTYPE* GetDecoderDeviceGuidsOrg)(IDirectXVideoDecoderServiceC* pThis, __out UINT* pCount, __deref_out_ecount_opt(*pCount) GUID** pGuids) = NULL;
-static HRESULT (STDMETHODCALLTYPE* GetDecoderConfigurationsOrg) (IDirectXVideoDecoderServiceC* pThis, __in REFGUID Guid, __in const DXVA2_VideoDesc* pVideoDesc, __reserved void* pReserved, __out UINT* pCount, __deref_out_ecount_opt(*pCount) DXVA2_ConfigPictureDecode **ppConfigs) = NULL;
+static HRESULT(STDMETHODCALLTYPE* GetDecoderDeviceGuidsOrg)(IDirectXVideoDecoderServiceC* pThis, __out UINT* pCount, __deref_out_ecount_opt(*pCount) GUID** pGuids) = NULL;
+static HRESULT(STDMETHODCALLTYPE* GetDecoderConfigurationsOrg)(IDirectXVideoDecoderServiceC* pThis, __in REFGUID Guid, __in const DXVA2_VideoDesc* pVideoDesc, __reserved void* pReserved, __out UINT* pCount, __deref_out_ecount_opt(*pCount) DXVA2_ConfigPictureDecode** ppConfigs) = NULL;
#endif
#ifdef _DEBUG
-static void LogDXVA2Config (const DXVA2_ConfigPictureDecode* pConfig)
+static void LogDXVA2Config(const DXVA2_ConfigPictureDecode* pConfig)
{
- LOG(_T("Config"));
- LOG(_T(" - Config4GroupedCoefs %d"), pConfig->Config4GroupedCoefs);
- LOG(_T(" - ConfigBitstreamRaw %d"), pConfig->ConfigBitstreamRaw);
- LOG(_T(" - ConfigDecoderSpecific %d"), pConfig->ConfigDecoderSpecific);
- LOG(_T(" - ConfigHostInverseScan %d"), pConfig->ConfigHostInverseScan);
- LOG(_T(" - ConfigIntraResidUnsigned %d"), pConfig->ConfigIntraResidUnsigned);
- LOG(_T(" - ConfigMBcontrolRasterOrder %d"), pConfig->ConfigMBcontrolRasterOrder);
- LOG(_T(" - ConfigMinRenderTargetBuffCount %d"), pConfig->ConfigMinRenderTargetBuffCount);
- LOG(_T(" - ConfigResid8Subtraction %d"), pConfig->ConfigResid8Subtraction);
- LOG(_T(" - ConfigResidDiffAccelerator %d"), pConfig->ConfigResidDiffAccelerator);
- LOG(_T(" - ConfigResidDiffHost %d"), pConfig->ConfigResidDiffHost);
- LOG(_T(" - ConfigSpatialHost8or9Clipping %d"), pConfig->ConfigSpatialHost8or9Clipping);
- LOG(_T(" - ConfigSpatialResid8 %d"), pConfig->ConfigSpatialResid8);
- LOG(_T(" - ConfigSpatialResidInterleaved %d"), pConfig->ConfigSpatialResidInterleaved);
- LOG(_T(" - ConfigSpecificIDCT %d"), pConfig->ConfigSpecificIDCT);
- LOG(_T(" - guidConfigBitstreamEncryption %s"), CStringFromGUID(pConfig->guidConfigBitstreamEncryption));
- LOG(_T(" - guidConfigMBcontrolEncryption %s"), CStringFromGUID(pConfig->guidConfigMBcontrolEncryption));
- LOG(_T(" - guidConfigResidDiffEncryption %s"), CStringFromGUID(pConfig->guidConfigResidDiffEncryption));
+ LOG(_T("Config"));
+ LOG(_T(" - Config4GroupedCoefs %d"), pConfig->Config4GroupedCoefs);
+ LOG(_T(" - ConfigBitstreamRaw %d"), pConfig->ConfigBitstreamRaw);
+ LOG(_T(" - ConfigDecoderSpecific %d"), pConfig->ConfigDecoderSpecific);
+ LOG(_T(" - ConfigHostInverseScan %d"), pConfig->ConfigHostInverseScan);
+ LOG(_T(" - ConfigIntraResidUnsigned %d"), pConfig->ConfigIntraResidUnsigned);
+ LOG(_T(" - ConfigMBcontrolRasterOrder %d"), pConfig->ConfigMBcontrolRasterOrder);
+ LOG(_T(" - ConfigMinRenderTargetBuffCount %d"), pConfig->ConfigMinRenderTargetBuffCount);
+ LOG(_T(" - ConfigResid8Subtraction %d"), pConfig->ConfigResid8Subtraction);
+ LOG(_T(" - ConfigResidDiffAccelerator %d"), pConfig->ConfigResidDiffAccelerator);
+ LOG(_T(" - ConfigResidDiffHost %d"), pConfig->ConfigResidDiffHost);
+ LOG(_T(" - ConfigSpatialHost8or9Clipping %d"), pConfig->ConfigSpatialHost8or9Clipping);
+ LOG(_T(" - ConfigSpatialResid8 %d"), pConfig->ConfigSpatialResid8);
+ LOG(_T(" - ConfigSpatialResidInterleaved %d"), pConfig->ConfigSpatialResidInterleaved);
+ LOG(_T(" - ConfigSpecificIDCT %d"), pConfig->ConfigSpecificIDCT);
+ LOG(_T(" - guidConfigBitstreamEncryption %s"), CStringFromGUID(pConfig->guidConfigBitstreamEncryption));
+ LOG(_T(" - guidConfigMBcontrolEncryption %s"), CStringFromGUID(pConfig->guidConfigMBcontrolEncryption));
+ LOG(_T(" - guidConfigResidDiffEncryption %s"), CStringFromGUID(pConfig->guidConfigResidDiffEncryption));
}
-static void LogDXVA2VideoDesc (const DXVA2_VideoDesc* pVideoDesc)
+static void LogDXVA2VideoDesc(const DXVA2_VideoDesc* pVideoDesc)
{
- LOG(_T("VideoDesc"));
- LOG(_T(" - Format %s (0x%08x)"), FindD3DFormat(pVideoDesc->Format), pVideoDesc->Format);
- LOG(_T(" - InputSampleFreq %d/%d"), pVideoDesc->InputSampleFreq.Numerator, pVideoDesc->InputSampleFreq.Denominator);
- LOG(_T(" - OutputFrameFreq %d/%d"), pVideoDesc->OutputFrameFreq.Numerator, pVideoDesc->OutputFrameFreq.Denominator);
- LOG(_T(" - SampleFormat %d"), pVideoDesc->SampleFormat.value);
- LOG(_T(" - SampleHeight %d"), pVideoDesc->SampleHeight);
- LOG(_T(" - SampleWidth %d"), pVideoDesc->SampleWidth);
- LOG(_T(" - UABProtectionLevel %d"), pVideoDesc->UABProtectionLevel);
+ LOG(_T("VideoDesc"));
+ LOG(_T(" - Format %s (0x%08x)"), FindD3DFormat(pVideoDesc->Format), pVideoDesc->Format);
+ LOG(_T(" - InputSampleFreq %d/%d"), pVideoDesc->InputSampleFreq.Numerator, pVideoDesc->InputSampleFreq.Denominator);
+ LOG(_T(" - OutputFrameFreq %d/%d"), pVideoDesc->OutputFrameFreq.Numerator, pVideoDesc->OutputFrameFreq.Denominator);
+ LOG(_T(" - SampleFormat %d"), pVideoDesc->SampleFormat.value);
+ LOG(_T(" - SampleHeight %d"), pVideoDesc->SampleHeight);
+ LOG(_T(" - SampleWidth %d"), pVideoDesc->SampleWidth);
+ LOG(_T(" - UABProtectionLevel %d"), pVideoDesc->UABProtectionLevel);
}
#endif
@@ -1352,190 +1350,190 @@ static void LogDXVA2VideoDesc (const DXVA2_VideoDesc* pVideoDesc)
// Function not used yet
static void LogVideoCardCaps(IDirectXVideoDecoderService* pDecoderService)
{
- HRESULT hr;
- UINT cDecoderGuids = 0;
- GUID* pDecoderGuids = NULL;
-
- hr = pDecoderService->GetDecoderDeviceGuids(&cDecoderGuids, &pDecoderGuids);
- if (SUCCEEDED(hr)) {
- // Look for the decoder GUIDs we want.
- for (UINT iGuid = 0; iGuid < cDecoderGuids; iGuid++) {
- LOG (_T("=== New mode : %s"), GetDXVAMode (&pDecoderGuids[iGuid]));
-
- // Find a configuration that we support.
- UINT cFormats = 0;
- UINT cConfigurations = 0;
- D3DFORMAT* pFormats = NULL;
- DXVA2_ConfigPictureDecode* pConfig = NULL;
- DXVA2_VideoDesc m_VideoDesc;
-
- hr = pDecoderService->GetDecoderRenderTargets(pDecoderGuids[iGuid], &cFormats, &pFormats);
-
- if (SUCCEEDED(hr)) {
- // Look for a format that matches our output format.
- for (UINT iFormat = 0; iFormat < cFormats; iFormat++) {
- LOG (_T("Direct 3D format : %s"), FindD3DFormat(pFormats[iFormat]));
- // Fill in the video description. Set the width, height, format, and frame rate.
- memset(&m_VideoDesc, 0, sizeof(m_VideoDesc));
- m_VideoDesc.SampleWidth = 1280;
- m_VideoDesc.SampleHeight = 720;
- m_VideoDesc.Format = pFormats[iFormat];
-
- // Get the available configurations.
- hr = pDecoderService->GetDecoderConfigurations(pDecoderGuids[iGuid], &m_VideoDesc, NULL, &cConfigurations, &pConfig);
-
- if (SUCCEEDED(hr)) {
-
- // Find a supported configuration.
- for (UINT iConfig = 0; iConfig < cConfigurations; iConfig++) {
- LogDXVA2Config (&pConfig[iConfig]);
- }
-
- CoTaskMemFree(pConfig);
- }
- }
- }
-
- LOG(_T("\n"));
- CoTaskMemFree(pFormats);
- }
- }
+ HRESULT hr;
+ UINT cDecoderGuids = 0;
+ GUID* pDecoderGuids = NULL;
+
+ hr = pDecoderService->GetDecoderDeviceGuids(&cDecoderGuids, &pDecoderGuids);
+ if (SUCCEEDED(hr)) {
+ // Look for the decoder GUIDs we want.
+ for (UINT iGuid = 0; iGuid < cDecoderGuids; iGuid++) {
+ LOG(_T("=== New mode : %s"), GetDXVAMode(&pDecoderGuids[iGuid]));
+
+ // Find a configuration that we support.
+ UINT cFormats = 0;
+ UINT cConfigurations = 0;
+ D3DFORMAT* pFormats = NULL;
+ DXVA2_ConfigPictureDecode* pConfig = NULL;
+ DXVA2_VideoDesc m_VideoDesc;
+
+ hr = pDecoderService->GetDecoderRenderTargets(pDecoderGuids[iGuid], &cFormats, &pFormats);
+
+ if (SUCCEEDED(hr)) {
+ // Look for a format that matches our output format.
+ for (UINT iFormat = 0; iFormat < cFormats; iFormat++) {
+ LOG(_T("Direct 3D format : %s"), FindD3DFormat(pFormats[iFormat]));
+ // Fill in the video description. Set the width, height, format, and frame rate.
+ memset(&m_VideoDesc, 0, sizeof(m_VideoDesc));
+ m_VideoDesc.SampleWidth = 1280;
+ m_VideoDesc.SampleHeight = 720;
+ m_VideoDesc.Format = pFormats[iFormat];
+
+ // Get the available configurations.
+ hr = pDecoderService->GetDecoderConfigurations(pDecoderGuids[iGuid], &m_VideoDesc, NULL, &cConfigurations, &pConfig);
+
+ if (SUCCEEDED(hr)) {
+
+ // Find a supported configuration.
+ for (UINT iConfig = 0; iConfig < cConfigurations; iConfig++) {
+ LogDXVA2Config(&pConfig[iConfig]);
+ }
+
+ CoTaskMemFree(pConfig);
+ }
+ }
+ }
+
+ LOG(_T("\n"));
+ CoTaskMemFree(pFormats);
+ }
+ }
}
#endif
static HRESULT STDMETHODCALLTYPE CreateVideoDecoderMine(
- IDirectXVideoDecoderServiceC* pThis,
- __in REFGUID Guid,
- __in const DXVA2_VideoDesc* pVideoDesc,
- __in const DXVA2_ConfigPictureDecode* pConfig,
- __in_ecount(NumRenderTargets) IDirect3DSurface9 **ppDecoderRenderTargets,
- __in UINT NumRenderTargets,
- __deref_out IDirectXVideoDecoder** ppDecode)
+ IDirectXVideoDecoderServiceC* pThis,
+ __in REFGUID Guid,
+ __in const DXVA2_VideoDesc* pVideoDesc,
+ __in const DXVA2_ConfigPictureDecode* pConfig,
+ __in_ecount(NumRenderTargets) IDirect3DSurface9** ppDecoderRenderTargets,
+ __in UINT NumRenderTargets,
+ __deref_out IDirectXVideoDecoder** ppDecode)
{
- // DebugBreak();
- // ((DXVA2_VideoDesc*)pVideoDesc)->Format = (D3DFORMAT)0x3231564E;
- g_guidDXVADecoder = Guid;
- g_nDXVAVersion = 2;
+ // DebugBreak();
+ // ((DXVA2_VideoDesc*)pVideoDesc)->Format = (D3DFORMAT)0x3231564E;
+ g_guidDXVADecoder = Guid;
+ g_nDXVAVersion = 2;
#ifdef _DEBUG
- LOG(_T("\n\n"));
- LogDXVA2VideoDesc(pVideoDesc);
- LogDXVA2Config(pConfig);
+ LOG(_T("\n\n"));
+ LogDXVA2VideoDesc(pVideoDesc);
+ LogDXVA2Config(pConfig);
#endif
- HRESULT hr = CreateVideoDecoderOrg(pThis, Guid, pVideoDesc, pConfig, ppDecoderRenderTargets, NumRenderTargets, ppDecode);
+ HRESULT hr = CreateVideoDecoderOrg(pThis, Guid, pVideoDesc, pConfig, ppDecoderRenderTargets, NumRenderTargets, ppDecode);
- if (FAILED (hr)) {
- g_guidDXVADecoder = GUID_NULL;
- }
+ if (FAILED(hr)) {
+ g_guidDXVADecoder = GUID_NULL;
+ }
#ifdef _DEBUG
- else {
- if ((Guid == DXVA2_ModeH264_E) ||
- (Guid == DXVA2_ModeVC1_D) ||
- (Guid == DXVA_Intel_H264_ClearVideo) ||
- (Guid == DXVA_Intel_VC1_ClearVideo) ||
- (Guid == DXVA2_ModeMPEG2_VLD)) {
- *ppDecode = DNew CFakeDirectXVideoDecoder (NULL, *ppDecode);
- (*ppDecode)->AddRef();
- }
-
- for (DWORD i=0; i<NumRenderTargets; i++) {
- LOG(_T(" - Surf %d : %08x"), i, ppDecoderRenderTargets[i]);
- }
- }
+ else {
+ if ((Guid == DXVA2_ModeH264_E) ||
+ (Guid == DXVA2_ModeVC1_D) ||
+ (Guid == DXVA_Intel_H264_ClearVideo) ||
+ (Guid == DXVA_Intel_VC1_ClearVideo) ||
+ (Guid == DXVA2_ModeMPEG2_VLD)) {
+ *ppDecode = DNew CFakeDirectXVideoDecoder(NULL, *ppDecode);
+ (*ppDecode)->AddRef();
+ }
+
+ for (DWORD i = 0; i < NumRenderTargets; i++) {
+ LOG(_T(" - Surf %d : %08x"), i, ppDecoderRenderTargets[i]);
+ }
+ }
#endif
- TRACE(_T("DXVA Decoder : %s\n"), GetDXVADecoderDescription());
+ TRACE(_T("DXVA Decoder : %s\n"), GetDXVADecoderDescription());
#ifdef _DEBUG
- LOG(_T("IDirectXVideoDecoderService::CreateVideoDecoder %s (%d render targets) hr = %08x"), GetDXVAMode(&g_guidDXVADecoder), NumRenderTargets, hr);
+ LOG(_T("IDirectXVideoDecoderService::CreateVideoDecoder %s (%d render targets) hr = %08x"), GetDXVAMode(&g_guidDXVADecoder), NumRenderTargets, hr);
#endif
- return hr;
+ return hr;
}
#ifdef _DEBUG
-static HRESULT STDMETHODCALLTYPE GetDecoderDeviceGuidsMine (IDirectXVideoDecoderServiceC* pThis,
- __out UINT* pCount,
- __deref_out_ecount_opt(*pCount) GUID** pGuids)
+static HRESULT STDMETHODCALLTYPE GetDecoderDeviceGuidsMine(IDirectXVideoDecoderServiceC* pThis,
+ __out UINT* pCount,
+ __deref_out_ecount_opt(*pCount) GUID** pGuids)
{
- HRESULT hr = GetDecoderDeviceGuidsOrg(pThis, pCount, pGuids);
- LOG(_T("IDirectXVideoDecoderService::GetDecoderDeviceGuids hr = %08x\n"), hr);
+ HRESULT hr = GetDecoderDeviceGuidsOrg(pThis, pCount, pGuids);
+ LOG(_T("IDirectXVideoDecoderService::GetDecoderDeviceGuids hr = %08x\n"), hr);
- return hr;
+ return hr;
}
-static HRESULT STDMETHODCALLTYPE GetDecoderConfigurationsMine (IDirectXVideoDecoderServiceC* pThis,
- __in REFGUID Guid,
- __in const DXVA2_VideoDesc* pVideoDesc,
- __reserved void* pReserved,
- __out UINT* pCount,
- __deref_out_ecount_opt(*pCount) DXVA2_ConfigPictureDecode **ppConfigs)
+static HRESULT STDMETHODCALLTYPE GetDecoderConfigurationsMine(IDirectXVideoDecoderServiceC* pThis,
+ __in REFGUID Guid,
+ __in const DXVA2_VideoDesc* pVideoDesc,
+ __reserved void* pReserved,
+ __out UINT* pCount,
+ __deref_out_ecount_opt(*pCount) DXVA2_ConfigPictureDecode** ppConfigs)
{
- HRESULT hr = GetDecoderConfigurationsOrg(pThis, Guid, pVideoDesc, pReserved, pCount, ppConfigs);
+ HRESULT hr = GetDecoderConfigurationsOrg(pThis, Guid, pVideoDesc, pReserved, pCount, ppConfigs);
- // Force LongSlice decoding !
- // memcpy (&(*ppConfigs)[1], &(*ppConfigs)[0], sizeof(DXVA2_ConfigPictureDecode));
+ // Force LongSlice decoding !
+ // memcpy (&(*ppConfigs)[1], &(*ppConfigs)[0], sizeof(DXVA2_ConfigPictureDecode));
- return hr;
+ return hr;
}
#endif
void HookDirectXVideoDecoderService(void* pIDirectXVideoDecoderService)
{
- IDirectXVideoDecoderServiceC* pIDirectXVideoDecoderServiceC = (IDirectXVideoDecoderServiceC*) pIDirectXVideoDecoderService;
+ IDirectXVideoDecoderServiceC* pIDirectXVideoDecoderServiceC = (IDirectXVideoDecoderServiceC*) pIDirectXVideoDecoderService;
- BOOL res;
- DWORD flOldProtect = 0;
+ BOOL res;
+ DWORD flOldProtect = 0;
- // Casimir666 : unhook previous VTables
- if (g_pIDirectXVideoDecoderServiceCVtbl) {
- res = VirtualProtect(g_pIDirectXVideoDecoderServiceCVtbl, sizeof(g_pIDirectXVideoDecoderServiceCVtbl), PAGE_WRITECOPY, &flOldProtect);
- if (g_pIDirectXVideoDecoderServiceCVtbl->CreateVideoDecoder == CreateVideoDecoderMine) {
- g_pIDirectXVideoDecoderServiceCVtbl->CreateVideoDecoder = CreateVideoDecoderOrg;
- }
+ // Casimir666 : unhook previous VTables
+ if (g_pIDirectXVideoDecoderServiceCVtbl) {
+ res = VirtualProtect(g_pIDirectXVideoDecoderServiceCVtbl, sizeof(g_pIDirectXVideoDecoderServiceCVtbl), PAGE_WRITECOPY, &flOldProtect);
+ if (g_pIDirectXVideoDecoderServiceCVtbl->CreateVideoDecoder == CreateVideoDecoderMine) {
+ g_pIDirectXVideoDecoderServiceCVtbl->CreateVideoDecoder = CreateVideoDecoderOrg;
+ }
#ifdef _DEBUG
- if (g_pIDirectXVideoDecoderServiceCVtbl->GetDecoderConfigurations == GetDecoderConfigurationsMine) {
- g_pIDirectXVideoDecoderServiceCVtbl->GetDecoderConfigurations = GetDecoderConfigurationsOrg;
- }
+ if (g_pIDirectXVideoDecoderServiceCVtbl->GetDecoderConfigurations == GetDecoderConfigurationsMine) {
+ g_pIDirectXVideoDecoderServiceCVtbl->GetDecoderConfigurations = GetDecoderConfigurationsOrg;
+ }
- //if (g_pIDirectXVideoDecoderServiceCVtbl->GetDecoderDeviceGuids == GetDecoderDeviceGuidsMine)
- // g_pIDirectXVideoDecoderServiceCVtbl->GetDecoderDeviceGuids = GetDecoderDeviceGuidsOrg;
+ //if (g_pIDirectXVideoDecoderServiceCVtbl->GetDecoderDeviceGuids == GetDecoderDeviceGuidsMine)
+ // g_pIDirectXVideoDecoderServiceCVtbl->GetDecoderDeviceGuids = GetDecoderDeviceGuidsOrg;
#endif
- res = VirtualProtect(g_pIDirectXVideoDecoderServiceCVtbl, sizeof(g_pIDirectXVideoDecoderServiceCVtbl), flOldProtect, &flOldProtect);
+ res = VirtualProtect(g_pIDirectXVideoDecoderServiceCVtbl, sizeof(g_pIDirectXVideoDecoderServiceCVtbl), flOldProtect, &flOldProtect);
- g_pIDirectXVideoDecoderServiceCVtbl = NULL;
- CreateVideoDecoderOrg = NULL;
+ g_pIDirectXVideoDecoderServiceCVtbl = NULL;
+ CreateVideoDecoderOrg = NULL;
#ifdef _DEBUG
- GetDecoderConfigurationsOrg = NULL;
+ GetDecoderConfigurationsOrg = NULL;
#endif
- g_guidDXVADecoder = GUID_NULL;
- g_nDXVAVersion = 0;
- }
+ g_guidDXVADecoder = GUID_NULL;
+ g_nDXVAVersion = 0;
+ }
#if defined(_DEBUG) && DXVA_LOGFILE_A
- ::DeleteFile (LOG_FILE_DXVA);
- ::DeleteFile (LOG_FILE_PICTURE);
- ::DeleteFile (LOG_FILE_SLICELONG);
+ ::DeleteFile(LOG_FILE_DXVA);
+ ::DeleteFile(LOG_FILE_PICTURE);
+ ::DeleteFile(LOG_FILE_SLICELONG);
#endif
- if (!g_pIDirectXVideoDecoderServiceCVtbl && pIDirectXVideoDecoderService) {
- res = VirtualProtect(pIDirectXVideoDecoderServiceC->lpVtbl, sizeof(IDirectXVideoDecoderServiceCVtbl), PAGE_WRITECOPY, &flOldProtect);
+ if (!g_pIDirectXVideoDecoderServiceCVtbl && pIDirectXVideoDecoderService) {
+ res = VirtualProtect(pIDirectXVideoDecoderServiceC->lpVtbl, sizeof(IDirectXVideoDecoderServiceCVtbl), PAGE_WRITECOPY, &flOldProtect);
- CreateVideoDecoderOrg = pIDirectXVideoDecoderServiceC->lpVtbl->CreateVideoDecoder;
- pIDirectXVideoDecoderServiceC->lpVtbl->CreateVideoDecoder = CreateVideoDecoderMine;
+ CreateVideoDecoderOrg = pIDirectXVideoDecoderServiceC->lpVtbl->CreateVideoDecoder;
+ pIDirectXVideoDecoderServiceC->lpVtbl->CreateVideoDecoder = CreateVideoDecoderMine;
#ifdef _DEBUG
- GetDecoderConfigurationsOrg = pIDirectXVideoDecoderServiceC->lpVtbl->GetDecoderConfigurations;
- pIDirectXVideoDecoderServiceC->lpVtbl->GetDecoderConfigurations = GetDecoderConfigurationsMine;
+ GetDecoderConfigurationsOrg = pIDirectXVideoDecoderServiceC->lpVtbl->GetDecoderConfigurations;
+ pIDirectXVideoDecoderServiceC->lpVtbl->GetDecoderConfigurations = GetDecoderConfigurationsMine;
- //GetDecoderDeviceGuidsOrg = pIDirectXVideoDecoderServiceC->lpVtbl->GetDecoderDeviceGuids;
- //pIDirectXVideoDecoderServiceC->lpVtbl->GetDecoderDeviceGuids = GetDecoderDeviceGuidsMine;
+ //GetDecoderDeviceGuidsOrg = pIDirectXVideoDecoderServiceC->lpVtbl->GetDecoderDeviceGuids;
+ //pIDirectXVideoDecoderServiceC->lpVtbl->GetDecoderDeviceGuids = GetDecoderDeviceGuidsMine;
#endif
- res = VirtualProtect(pIDirectXVideoDecoderServiceC->lpVtbl, sizeof(IDirectXVideoDecoderServiceCVtbl), flOldProtect, &flOldProtect);
+ res = VirtualProtect(pIDirectXVideoDecoderServiceC->lpVtbl, sizeof(IDirectXVideoDecoderServiceCVtbl), flOldProtect, &flOldProtect);
- g_pIDirectXVideoDecoderServiceCVtbl = pIDirectXVideoDecoderServiceC->lpVtbl;
- }
+ g_pIDirectXVideoDecoderServiceCVtbl = pIDirectXVideoDecoderServiceC->lpVtbl;
+ }
} \ No newline at end of file
diff --git a/src/filters/renderer/VideoRenderers/IPinHook.h b/src/filters/renderer/VideoRenderers/IPinHook.h
index 67b6f82ad..784b5e333 100644
--- a/src/filters/renderer/VideoRenderers/IPinHook.h
+++ b/src/filters/renderer/VideoRenderers/IPinHook.h
@@ -28,50 +28,50 @@
interface IPinC;
typedef struct IPinCVtbl {
- BEGIN_INTERFACE
- HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IPinC * This, /* [in] */ REFIID riid, /* [iid_is][out] */ void **ppvObject );
- ULONG ( STDMETHODCALLTYPE *AddRef )( IPinC * This );
- ULONG ( STDMETHODCALLTYPE *Release )( IPinC * This );
- HRESULT ( STDMETHODCALLTYPE *Connect )( IPinC * This, /* [in] */ IPinC *pReceivePin, /* [in] */ const AM_MEDIA_TYPE *pmt );
- HRESULT ( STDMETHODCALLTYPE *ReceiveConnection )( IPinC * This, /* [in] */ IPinC *pConnector, /* [in] */ const AM_MEDIA_TYPE *pmt );
- HRESULT ( STDMETHODCALLTYPE *Disconnect )( IPinC * This );
- HRESULT ( STDMETHODCALLTYPE *ConnectedTo )( IPinC * This, /* [out] */ IPinC **pPin );
- HRESULT ( STDMETHODCALLTYPE *ConnectionMediaType )( IPinC * This, /* [out] */ AM_MEDIA_TYPE *pmt );
- HRESULT ( STDMETHODCALLTYPE *QueryPinInfo )( IPinC * This, /* [out] */ PIN_INFO *pInfo );
- HRESULT ( STDMETHODCALLTYPE *QueryDirection )( IPinC * This, /* [out] */ PIN_DIRECTION *pPinDir );
- HRESULT ( STDMETHODCALLTYPE *QueryId )( IPinC * This, /* [out] */ LPWSTR *Id );
- HRESULT ( STDMETHODCALLTYPE *QueryAccept )( IPinC * This, /* [in] */ const AM_MEDIA_TYPE *pmt );
- HRESULT ( STDMETHODCALLTYPE *EnumMediaTypes )( IPinC * This, /* [out] */ IEnumMediaTypes **ppEnum );
- HRESULT ( STDMETHODCALLTYPE *QueryInternalConnections )( IPinC * This, /* [out] */ IPinC **apPin, /* [out][in] */ ULONG *nPin );
- HRESULT ( STDMETHODCALLTYPE *EndOfStream )( IPinC * This );
- HRESULT ( STDMETHODCALLTYPE *BeginFlush )( IPinC * This );
- HRESULT ( STDMETHODCALLTYPE *EndFlush )( IPinC * This );
- HRESULT ( STDMETHODCALLTYPE *NewSegment )( IPinC * This, /* [in] */ REFERENCE_TIME tStart, /* [in] */ REFERENCE_TIME tStop, /* [in] */ double dRate );
- END_INTERFACE
+ BEGIN_INTERFACE
+ HRESULT(STDMETHODCALLTYPE* QueryInterface)(IPinC* This, /* [in] */ REFIID riid, /* [iid_is][out] */ void** ppvObject);
+ ULONG(STDMETHODCALLTYPE* AddRef)(IPinC* This);
+ ULONG(STDMETHODCALLTYPE* Release)(IPinC* This);
+ HRESULT(STDMETHODCALLTYPE* Connect)(IPinC* This, /* [in] */ IPinC* pReceivePin, /* [in] */ const AM_MEDIA_TYPE* pmt);
+ HRESULT(STDMETHODCALLTYPE* ReceiveConnection)(IPinC* This, /* [in] */ IPinC* pConnector, /* [in] */ const AM_MEDIA_TYPE* pmt);
+ HRESULT(STDMETHODCALLTYPE* Disconnect)(IPinC* This);
+ HRESULT(STDMETHODCALLTYPE* ConnectedTo)(IPinC* This, /* [out] */ IPinC** pPin);
+ HRESULT(STDMETHODCALLTYPE* ConnectionMediaType)(IPinC* This, /* [out] */ AM_MEDIA_TYPE* pmt);
+ HRESULT(STDMETHODCALLTYPE* QueryPinInfo)(IPinC* This, /* [out] */ PIN_INFO* pInfo);
+ HRESULT(STDMETHODCALLTYPE* QueryDirection)(IPinC* This, /* [out] */ PIN_DIRECTION* pPinDir);
+ HRESULT(STDMETHODCALLTYPE* QueryId)(IPinC* This, /* [out] */ LPWSTR* Id);
+ HRESULT(STDMETHODCALLTYPE* QueryAccept)(IPinC* This, /* [in] */ const AM_MEDIA_TYPE* pmt);
+ HRESULT(STDMETHODCALLTYPE* EnumMediaTypes)(IPinC* This, /* [out] */ IEnumMediaTypes** ppEnum);
+ HRESULT(STDMETHODCALLTYPE* QueryInternalConnections)(IPinC* This, /* [out] */ IPinC** apPin, /* [out][in] */ ULONG* nPin);
+ HRESULT(STDMETHODCALLTYPE* EndOfStream)(IPinC* This);
+ HRESULT(STDMETHODCALLTYPE* BeginFlush)(IPinC* This);
+ HRESULT(STDMETHODCALLTYPE* EndFlush)(IPinC* This);
+ HRESULT(STDMETHODCALLTYPE* NewSegment)(IPinC* This, /* [in] */ REFERENCE_TIME tStart, /* [in] */ REFERENCE_TIME tStop, /* [in] */ double dRate);
+ END_INTERFACE
} IPinCVtbl;
interface IPinC {
- CONST_VTBL struct IPinCVtbl *lpVtbl;
+ CONST_VTBL struct IPinCVtbl* lpVtbl;
};
interface IMemInputPinC;
typedef struct IMemInputPinCVtbl {
- BEGIN_INTERFACE
- HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IPinC * This, /* [in] */ REFIID riid, /* [iid_is][out] */ void **ppvObject );
- ULONG ( STDMETHODCALLTYPE *AddRef )( IPinC * This );
- ULONG ( STDMETHODCALLTYPE *Release )( IPinC * This );
- HRESULT ( STDMETHODCALLTYPE *GetAllocator )( IMemInputPinC * This, IMemAllocator **ppAllocator);
- HRESULT ( STDMETHODCALLTYPE *NotifyAllocator )( IMemInputPinC * This, IMemAllocator *pAllocator, BOOL bReadOnly);
- HRESULT ( STDMETHODCALLTYPE *GetAllocatorRequirements )( IMemInputPinC * This, ALLOCATOR_PROPERTIES *pProps);
- HRESULT ( STDMETHODCALLTYPE *Receive )( IMemInputPinC * This, IMediaSample *pSample);
- HRESULT ( STDMETHODCALLTYPE *ReceiveMultiple )( IMemInputPinC * This, IMediaSample **pSamples, long nSamples, long *nSamplesProcessed);
- HRESULT ( STDMETHODCALLTYPE *ReceiveCanBlock )( IMemInputPinC * This);
- END_INTERFACE
+ BEGIN_INTERFACE
+ HRESULT(STDMETHODCALLTYPE* QueryInterface)(IPinC* This, /* [in] */ REFIID riid, /* [iid_is][out] */ void** ppvObject);
+ ULONG(STDMETHODCALLTYPE* AddRef)(IPinC* This);
+ ULONG(STDMETHODCALLTYPE* Release)(IPinC* This);
+ HRESULT(STDMETHODCALLTYPE* GetAllocator)(IMemInputPinC* This, IMemAllocator** ppAllocator);
+ HRESULT(STDMETHODCALLTYPE* NotifyAllocator)(IMemInputPinC* This, IMemAllocator* pAllocator, BOOL bReadOnly);
+ HRESULT(STDMETHODCALLTYPE* GetAllocatorRequirements)(IMemInputPinC* This, ALLOCATOR_PROPERTIES* pProps);
+ HRESULT(STDMETHODCALLTYPE* Receive)(IMemInputPinC* This, IMediaSample* pSample);
+ HRESULT(STDMETHODCALLTYPE* ReceiveMultiple)(IMemInputPinC* This, IMediaSample** pSamples, long nSamples, long* nSamplesProcessed);
+ HRESULT(STDMETHODCALLTYPE* ReceiveCanBlock)(IMemInputPinC* This);
+ END_INTERFACE
} IMemInputPinCVtbl;
interface IMemInputPinC {
- CONST_VTBL struct IMemInputPinCVtbl *lpVtbl;
+ CONST_VTBL struct IMemInputPinCVtbl* lpVtbl;
};
extern bool HookNewSegmentAndReceive(IPinC* pPinC, IMemInputPinC* pMemInputPin);
@@ -83,95 +83,95 @@ extern REFERENCE_TIME g_tSegmentStart, g_tSampleStart, g_rtTimePerFrame;
interface IAMVideoAcceleratorC;
typedef struct IAMVideoAcceleratorCVtbl {
- BEGIN_INTERFACE
-
- HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
- IAMVideoAcceleratorC * This,
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void **ppvObject);
-
- ULONG ( STDMETHODCALLTYPE *AddRef )(
- IAMVideoAcceleratorC * This);
-
- ULONG ( STDMETHODCALLTYPE *Release )(
- IAMVideoAcceleratorC * This);
-
- HRESULT ( STDMETHODCALLTYPE *GetVideoAcceleratorGUIDs )(
- IAMVideoAcceleratorC * This,
- /* [out][in] */ LPDWORD pdwNumGuidsSupported,
- /* [out][in] */ LPGUID pGuidsSupported);
-
- HRESULT ( STDMETHODCALLTYPE *GetUncompFormatsSupported )(
- IAMVideoAcceleratorC * This,
- /* [in] */ const GUID *pGuid,
- /* [out][in] */ LPDWORD pdwNumFormatsSupported,
- /* [out][in] */ LPDDPIXELFORMAT pFormatsSupported);
-
- HRESULT ( STDMETHODCALLTYPE *GetInternalMemInfo )(
- IAMVideoAcceleratorC * This,
- /* [in] */ const GUID *pGuid,
- /* [in] */ const AMVAUncompDataInfo *pamvaUncompDataInfo,
- /* [out][in] */ LPAMVAInternalMemInfo pamvaInternalMemInfo);
-
- HRESULT ( STDMETHODCALLTYPE *GetCompBufferInfo )(
- IAMVideoAcceleratorC * This,
- /* [in] */ const GUID *pGuid,
- /* [in] */ const AMVAUncompDataInfo *pamvaUncompDataInfo,
- /* [out][in] */ LPDWORD pdwNumTypesCompBuffers,
- /* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo);
-
- HRESULT ( STDMETHODCALLTYPE *GetInternalCompBufferInfo )(
- IAMVideoAcceleratorC * This,
- /* [out][in] */ LPDWORD pdwNumTypesCompBuffers,
- /* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo);
-
- HRESULT ( STDMETHODCALLTYPE *BeginFrame )(
- IAMVideoAcceleratorC * This,
- /* [in] */ const AMVABeginFrameInfo *amvaBeginFrameInfo);
-
- HRESULT ( STDMETHODCALLTYPE *EndFrame )(
- IAMVideoAcceleratorC * This,
- /* [in] */ const AMVAEndFrameInfo *pEndFrameInfo);
-
- HRESULT ( STDMETHODCALLTYPE *GetBuffer )(
- IAMVideoAcceleratorC * This,
- /* [in] */ DWORD dwTypeIndex,
- /* [in] */ DWORD dwBufferIndex,
- /* [in] */ BOOL bReadOnly,
- /* [out] */ LPVOID *ppBuffer,
- /* [out] */ LONG *lpStride);
-
- HRESULT ( STDMETHODCALLTYPE *ReleaseBuffer )(
- IAMVideoAcceleratorC * This,
- /* [in] */ DWORD dwTypeIndex,
- /* [in] */ DWORD dwBufferIndex);
-
- HRESULT ( STDMETHODCALLTYPE *Execute )(
- IAMVideoAcceleratorC * This,
- /* [in] */ DWORD dwFunction,
- /* [in] */ LPVOID lpPrivateInputData,
- /* [in] */ DWORD cbPrivateInputData,
- /* [in] */ LPVOID lpPrivateOutputDat,
- /* [in] */ DWORD cbPrivateOutputData,
- /* [in] */ DWORD dwNumBuffers,
- /* [in] */ const AMVABUFFERINFO *pamvaBufferInfo);
-
- HRESULT ( STDMETHODCALLTYPE *QueryRenderStatus )(
- IAMVideoAcceleratorC * This,
- /* [in] */ DWORD dwTypeIndex,
- /* [in] */ DWORD dwBufferIndex,
- /* [in] */ DWORD dwFlags);
-
- HRESULT ( STDMETHODCALLTYPE *DisplayFrame )(
- IAMVideoAcceleratorC * This,
- /* [in] */ DWORD dwFlipToIndex,
- /* [in] */ IMediaSample *pMediaSample);
-
- END_INTERFACE
+ BEGIN_INTERFACE
+
+ HRESULT(STDMETHODCALLTYPE* QueryInterface)(
+ IAMVideoAcceleratorC* This,
+ /* [in] */ REFIID riid,
+ /* [iid_is][out] */ void** ppvObject);
+
+ ULONG(STDMETHODCALLTYPE* AddRef)(
+ IAMVideoAcceleratorC* This);
+
+ ULONG(STDMETHODCALLTYPE* Release)(
+ IAMVideoAcceleratorC* This);
+
+ HRESULT(STDMETHODCALLTYPE* GetVideoAcceleratorGUIDs)(
+ IAMVideoAcceleratorC* This,
+ /* [out][in] */ LPDWORD pdwNumGuidsSupported,
+ /* [out][in] */ LPGUID pGuidsSupported);
+
+ HRESULT(STDMETHODCALLTYPE* GetUncompFormatsSupported)(
+ IAMVideoAcceleratorC* This,
+ /* [in] */ const GUID* pGuid,
+ /* [out][in] */ LPDWORD pdwNumFormatsSupported,
+ /* [out][in] */ LPDDPIXELFORMAT pFormatsSupported);
+
+ HRESULT(STDMETHODCALLTYPE* GetInternalMemInfo)(
+ IAMVideoAcceleratorC* This,
+ /* [in] */ const GUID* pGuid,
+ /* [in] */ const AMVAUncompDataInfo* pamvaUncompDataInfo,
+ /* [out][in] */ LPAMVAInternalMemInfo pamvaInternalMemInfo);
+
+ HRESULT(STDMETHODCALLTYPE* GetCompBufferInfo)(
+ IAMVideoAcceleratorC* This,
+ /* [in] */ const GUID* pGuid,
+ /* [in] */ const AMVAUncompDataInfo* pamvaUncompDataInfo,
+ /* [out][in] */ LPDWORD pdwNumTypesCompBuffers,
+ /* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo);
+
+ HRESULT(STDMETHODCALLTYPE* GetInternalCompBufferInfo)(
+ IAMVideoAcceleratorC* This,
+ /* [out][in] */ LPDWORD pdwNumTypesCompBuffers,
+ /* [out] */ LPAMVACompBufferInfo pamvaCompBufferInfo);
+
+ HRESULT(STDMETHODCALLTYPE* BeginFrame)(
+ IAMVideoAcceleratorC* This,
+ /* [in] */ const AMVABeginFrameInfo* amvaBeginFrameInfo);
+
+ HRESULT(STDMETHODCALLTYPE* EndFrame)(
+ IAMVideoAcceleratorC* This,
+ /* [in] */ const AMVAEndFrameInfo* pEndFrameInfo);
+
+ HRESULT(STDMETHODCALLTYPE* GetBuffer)(
+ IAMVideoAcceleratorC* This,
+ /* [in] */ DWORD dwTypeIndex,
+ /* [in] */ DWORD dwBufferIndex,
+ /* [in] */ BOOL bReadOnly,
+ /* [out] */ LPVOID* ppBuffer,
+ /* [out] */ LONG* lpStride);
+
+ HRESULT(STDMETHODCALLTYPE* ReleaseBuffer)(
+ IAMVideoAcceleratorC* This,
+ /* [in] */ DWORD dwTypeIndex,
+ /* [in] */ DWORD dwBufferIndex);
+
+ HRESULT(STDMETHODCALLTYPE* Execute)(
+ IAMVideoAcceleratorC* This,
+ /* [in] */ DWORD dwFunction,
+ /* [in] */ LPVOID lpPrivateInputData,
+ /* [in] */ DWORD cbPrivateInputData,
+ /* [in] */ LPVOID lpPrivateOutputDat,
+ /* [in] */ DWORD cbPrivateOutputData,
+ /* [in] */ DWORD dwNumBuffers,
+ /* [in] */ const AMVABUFFERINFO* pamvaBufferInfo);
+
+ HRESULT(STDMETHODCALLTYPE* QueryRenderStatus)(
+ IAMVideoAcceleratorC* This,
+ /* [in] */ DWORD dwTypeIndex,
+ /* [in] */ DWORD dwBufferIndex,
+ /* [in] */ DWORD dwFlags);
+
+ HRESULT(STDMETHODCALLTYPE* DisplayFrame)(
+ IAMVideoAcceleratorC* This,
+ /* [in] */ DWORD dwFlipToIndex,
+ /* [in] */ IMediaSample* pMediaSample);
+
+ END_INTERFACE
} IAMVideoAcceleratorCVtbl;
interface IAMVideoAcceleratorC {
- CONST_VTBL struct IAMVideoAcceleratorCVtbl *lpVtbl;
+ CONST_VTBL struct IAMVideoAcceleratorCVtbl* lpVtbl;
};
void HookAMVideoAccelerator(IAMVideoAcceleratorC* pAMVideoAcceleratorC);
diff --git a/src/filters/renderer/VideoRenderers/IQTVideoSurface.h b/src/filters/renderer/VideoRenderers/IQTVideoSurface.h
index f15b026a5..bd4c65c17 100644
--- a/src/filters/renderer/VideoRenderers/IQTVideoSurface.h
+++ b/src/filters/renderer/VideoRenderers/IQTVideoSurface.h
@@ -30,6 +30,6 @@
interface __declspec(uuid("A6AE36F7-A6F2-4157-AF54-6599857E4E20"))
IQTVideoSurface :
public IUnknown {
- STDMETHOD (BeginBlt) (const BITMAP& bm) PURE;
- STDMETHOD (DoBlt) (const BITMAP& bm) PURE;
+ STDMETHOD(BeginBlt)(const BITMAP & bm) PURE;
+ STDMETHOD(DoBlt)(const BITMAP & bm) PURE;
};
diff --git a/src/filters/renderer/VideoRenderers/MacrovisionKicker.cpp b/src/filters/renderer/VideoRenderers/MacrovisionKicker.cpp
index 1de2398c5..ccb42643b 100644
--- a/src/filters/renderer/VideoRenderers/MacrovisionKicker.cpp
+++ b/src/filters/renderer/VideoRenderers/MacrovisionKicker.cpp
@@ -30,7 +30,7 @@
//
CMacrovisionKicker::CMacrovisionKicker(const TCHAR* pName, LPUNKNOWN pUnk)
- : CUnknown(pName, pUnk)
+ : CUnknown(pName, pUnk)
{
}
@@ -40,54 +40,54 @@ CMacrovisionKicker::~CMacrovisionKicker()
void CMacrovisionKicker::SetInner(IUnknown* pUnk)
{
- m_pInner = pUnk;
+ m_pInner = pUnk;
}
STDMETHODIMP CMacrovisionKicker::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- if (riid == __uuidof(IUnknown)) {
- return __super::NonDelegatingQueryInterface(riid, ppv);
- }
- if (riid == __uuidof(IKsPropertySet) && CComQIPtr<IKsPropertySet>(m_pInner)) {
- return GetInterface((IKsPropertySet*)this, ppv);
- }
+ if (riid == __uuidof(IUnknown)) {
+ return __super::NonDelegatingQueryInterface(riid, ppv);
+ }
+ if (riid == __uuidof(IKsPropertySet) && CComQIPtr<IKsPropertySet>(m_pInner)) {
+ return GetInterface((IKsPropertySet*)this, ppv);
+ }
- HRESULT hr = m_pInner ? m_pInner->QueryInterface(riid, ppv) : E_NOINTERFACE;
+ HRESULT hr = m_pInner ? m_pInner->QueryInterface(riid, ppv) : E_NOINTERFACE;
- return SUCCEEDED(hr) ? hr : __super::NonDelegatingQueryInterface(riid, ppv);
+ return SUCCEEDED(hr) ? hr : __super::NonDelegatingQueryInterface(riid, ppv);
}
// IKsPropertySet
STDMETHODIMP CMacrovisionKicker::Set(REFGUID PropSet, ULONG Id, LPVOID pInstanceData, ULONG InstanceLength, LPVOID pPropertyData, ULONG DataLength)
{
- if (CComQIPtr<IKsPropertySet> pKsPS = m_pInner) {
- if (PropSet == AM_KSPROPSETID_CopyProt && Id == AM_PROPERTY_COPY_MACROVISION
- /*&& DataLength == 4 && *(DWORD*)pPropertyData*/) {
- TRACE(_T("Oops, no-no-no, no macrovision please\n"));
- return S_OK;
- }
+ if (CComQIPtr<IKsPropertySet> pKsPS = m_pInner) {
+ if (PropSet == AM_KSPROPSETID_CopyProt && Id == AM_PROPERTY_COPY_MACROVISION
+ /*&& DataLength == 4 && *(DWORD*)pPropertyData*/) {
+ TRACE(_T("Oops, no-no-no, no macrovision please\n"));
+ return S_OK;
+ }
- return pKsPS->Set(PropSet, Id, pInstanceData, InstanceLength, pPropertyData, DataLength);
- }
+ return pKsPS->Set(PropSet, Id, pInstanceData, InstanceLength, pPropertyData, DataLength);
+ }
- return E_UNEXPECTED;
+ return E_UNEXPECTED;
}
STDMETHODIMP CMacrovisionKicker::Get(REFGUID PropSet, ULONG Id, LPVOID pInstanceData, ULONG InstanceLength, LPVOID pPropertyData, ULONG DataLength, ULONG* pBytesReturned)
{
- if (CComQIPtr<IKsPropertySet> pKsPS = m_pInner) {
- return pKsPS->Get(PropSet, Id, pInstanceData, InstanceLength, pPropertyData, DataLength, pBytesReturned);
- }
+ if (CComQIPtr<IKsPropertySet> pKsPS = m_pInner) {
+ return pKsPS->Get(PropSet, Id, pInstanceData, InstanceLength, pPropertyData, DataLength, pBytesReturned);
+ }
- return E_UNEXPECTED;
+ return E_UNEXPECTED;
}
STDMETHODIMP CMacrovisionKicker::QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport)
{
- if (CComQIPtr<IKsPropertySet> pKsPS = m_pInner) {
- return pKsPS->QuerySupported(PropSet, Id, pTypeSupport);
- }
+ if (CComQIPtr<IKsPropertySet> pKsPS = m_pInner) {
+ return pKsPS->QuerySupported(PropSet, Id, pTypeSupport);
+ }
- return E_UNEXPECTED;
+ return E_UNEXPECTED;
}
diff --git a/src/filters/renderer/VideoRenderers/MacrovisionKicker.h b/src/filters/renderer/VideoRenderers/MacrovisionKicker.h
index d26ff0141..c05807f29 100644
--- a/src/filters/renderer/VideoRenderers/MacrovisionKicker.h
+++ b/src/filters/renderer/VideoRenderers/MacrovisionKicker.h
@@ -24,22 +24,22 @@
#pragma once
class CMacrovisionKicker
- : public CUnknown
- , public IKsPropertySet
+ : public CUnknown
+ , public IKsPropertySet
{
- CComPtr<IUnknown> m_pInner;
+ CComPtr<IUnknown> m_pInner;
public:
- CMacrovisionKicker(const TCHAR* pName, LPUNKNOWN pUnk);
- virtual ~CMacrovisionKicker();
+ CMacrovisionKicker(const TCHAR* pName, LPUNKNOWN pUnk);
+ virtual ~CMacrovisionKicker();
- void SetInner(IUnknown* pUnk);
+ void SetInner(IUnknown* pUnk);
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // IKsPropertySet
- STDMETHODIMP Set(REFGUID PropSet, ULONG Id, LPVOID pInstanceData, ULONG InstanceLength, LPVOID pPropertyData, ULONG DataLength);
- STDMETHODIMP Get(REFGUID PropSet, ULONG Id, LPVOID pInstanceData, ULONG InstanceLength, LPVOID pPropertyData, ULONG DataLength, ULONG* pBytesReturned);
- STDMETHODIMP QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport);
+ // IKsPropertySet
+ STDMETHODIMP Set(REFGUID PropSet, ULONG Id, LPVOID pInstanceData, ULONG InstanceLength, LPVOID pPropertyData, ULONG DataLength);
+ STDMETHODIMP Get(REFGUID PropSet, ULONG Id, LPVOID pInstanceData, ULONG InstanceLength, LPVOID pPropertyData, ULONG DataLength, ULONG* pBytesReturned);
+ STDMETHODIMP QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport);
};
diff --git a/src/filters/renderer/VideoRenderers/OuterEVR.cpp b/src/filters/renderer/VideoRenderers/OuterEVR.cpp
index 277da1f82..23538496f 100644
--- a/src/filters/renderer/VideoRenderers/OuterEVR.cpp
+++ b/src/filters/renderer/VideoRenderers/OuterEVR.cpp
@@ -27,167 +27,178 @@
using namespace DSObjects;
-STDMETHODIMP COuterEVR::EnumPins(__out IEnumPins **ppEnum) {
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->EnumPins(ppEnum);
- }
- return E_NOTIMPL;
+STDMETHODIMP COuterEVR::EnumPins(__out IEnumPins** ppEnum)
+{
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->EnumPins(ppEnum);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterEVR::FindPin(LPCWSTR Id, __out IPin **ppPin) {
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->FindPin(Id, ppPin);
- }
- return E_NOTIMPL;
+STDMETHODIMP COuterEVR::FindPin(LPCWSTR Id, __out IPin** ppPin)
+{
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->FindPin(Id, ppPin);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterEVR::QueryFilterInfo(__out FILTER_INFO *pInfo) {
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->QueryFilterInfo(pInfo);
- }
- return E_NOTIMPL;
+STDMETHODIMP COuterEVR::QueryFilterInfo(__out FILTER_INFO* pInfo)
+{
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->QueryFilterInfo(pInfo);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterEVR::JoinFilterGraph(__in_opt IFilterGraph *pGraph, __in_opt LPCWSTR pName) {
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->JoinFilterGraph(pGraph, pName);
- }
- return E_NOTIMPL;
+STDMETHODIMP COuterEVR::JoinFilterGraph(__in_opt IFilterGraph* pGraph, __in_opt LPCWSTR pName)
+{
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->JoinFilterGraph(pGraph, pName);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterEVR::QueryVendorInfo(__out LPWSTR *pVendorInfo) {
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->QueryVendorInfo(pVendorInfo);
- }
- return E_NOTIMPL;
+STDMETHODIMP COuterEVR::QueryVendorInfo(__out LPWSTR* pVendorInfo)
+{
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->QueryVendorInfo(pVendorInfo);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterEVR::Stop() {
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->Stop();
- }
- return E_NOTIMPL;
+STDMETHODIMP COuterEVR::Stop()
+{
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->Stop();
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterEVR::Pause() {
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->Pause();
- }
- return E_NOTIMPL;
+STDMETHODIMP COuterEVR::Pause()
+{
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->Pause();
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterEVR::Run(REFERENCE_TIME tStart) {
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->Run(tStart);
- }
- return E_NOTIMPL;
+STDMETHODIMP COuterEVR::Run(REFERENCE_TIME tStart)
+{
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->Run(tStart);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterEVR::GetState(DWORD dwMilliSecsTimeout, __out FILTER_STATE *State)
+STDMETHODIMP COuterEVR::GetState(DWORD dwMilliSecsTimeout, __out FILTER_STATE* State)
{
- HRESULT ReturnValue;
- if (m_pAllocatorPresenter->GetState(dwMilliSecsTimeout, State, ReturnValue)) {
- return ReturnValue;
- }
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->GetState(dwMilliSecsTimeout, State);
- }
- return E_NOTIMPL;
+ HRESULT ReturnValue;
+ if (m_pAllocatorPresenter->GetState(dwMilliSecsTimeout, State, ReturnValue)) {
+ return ReturnValue;
+ }
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->GetState(dwMilliSecsTimeout, State);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterEVR::SetSyncSource(__in_opt IReferenceClock *pClock) {
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->SetSyncSource(pClock);
- }
- return E_NOTIMPL;
+STDMETHODIMP COuterEVR::SetSyncSource(__in_opt IReferenceClock* pClock)
+{
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->SetSyncSource(pClock);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterEVR::GetSyncSource(__deref_out_opt IReferenceClock **pClock) {
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->GetSyncSource(pClock);
- }
- return E_NOTIMPL;
+STDMETHODIMP COuterEVR::GetSyncSource(__deref_out_opt IReferenceClock** pClock)
+{
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->GetSyncSource(pClock);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterEVR::GetClassID(__RPC__out CLSID *pClassID) {
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->GetClassID(pClassID);
- }
- return E_NOTIMPL;
+STDMETHODIMP COuterEVR::GetClassID(__RPC__out CLSID* pClassID)
+{
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->GetClassID(pClassID);
+ }
+ return E_NOTIMPL;
}
STDMETHODIMP COuterEVR::GetAlphaBitmapParameters(VMR9AlphaBitmap* pBmpParms)
{
- CheckPointer(pBmpParms, E_POINTER);
- CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
- memcpy (pBmpParms, m_pVMR9AlphaBitmap, sizeof(VMR9AlphaBitmap));
- return S_OK;
+ CheckPointer(pBmpParms, E_POINTER);
+ CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
+ memcpy(pBmpParms, m_pVMR9AlphaBitmap, sizeof(VMR9AlphaBitmap));
+ return S_OK;
}
STDMETHODIMP COuterEVR::SetAlphaBitmap(const VMR9AlphaBitmap* pBmpParms)
{
- CheckPointer(pBmpParms, E_POINTER);
- CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
- memcpy (m_pVMR9AlphaBitmap, pBmpParms, sizeof(VMR9AlphaBitmap));
- m_pVMR9AlphaBitmap->dwFlags |= VMRBITMAP_UPDATE;
- m_pAllocatorPresenter->UpdateAlphaBitmap();
- return S_OK;
+ CheckPointer(pBmpParms, E_POINTER);
+ CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
+ memcpy(m_pVMR9AlphaBitmap, pBmpParms, sizeof(VMR9AlphaBitmap));
+ m_pVMR9AlphaBitmap->dwFlags |= VMRBITMAP_UPDATE;
+ m_pAllocatorPresenter->UpdateAlphaBitmap();
+ return S_OK;
}
STDMETHODIMP COuterEVR::UpdateAlphaBitmapParameters(const VMR9AlphaBitmap* pBmpParms)
{
- CheckPointer(pBmpParms, E_POINTER);
- CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
- memcpy (m_pVMR9AlphaBitmap, pBmpParms, sizeof(VMR9AlphaBitmap));
- m_pVMR9AlphaBitmap->dwFlags |= VMRBITMAP_UPDATE;
- m_pAllocatorPresenter->UpdateAlphaBitmap();
- return S_OK;
+ CheckPointer(pBmpParms, E_POINTER);
+ CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
+ memcpy(m_pVMR9AlphaBitmap, pBmpParms, sizeof(VMR9AlphaBitmap));
+ m_pVMR9AlphaBitmap->dwFlags |= VMRBITMAP_UPDATE;
+ m_pAllocatorPresenter->UpdateAlphaBitmap();
+ return S_OK;
}
diff --git a/src/filters/renderer/VideoRenderers/OuterEVR.h b/src/filters/renderer/VideoRenderers/OuterEVR.h
index 5abab719e..45e6dee97 100644
--- a/src/filters/renderer/VideoRenderers/OuterEVR.h
+++ b/src/filters/renderer/VideoRenderers/OuterEVR.h
@@ -25,75 +25,75 @@
/// === Outer EVR
namespace DSObjects
{
- class COuterEVR
- : public CUnknown
- , public IVMRffdshow9
- , public IVMRMixerBitmap9
- , public IBaseFilter
- {
- CComPtr<IUnknown> m_pEVR;
- VMR9AlphaBitmap* m_pVMR9AlphaBitmap;
- CEVRAllocatorPresenter *m_pAllocatorPresenter;
+ class COuterEVR
+ : public CUnknown
+ , public IVMRffdshow9
+ , public IVMRMixerBitmap9
+ , public IBaseFilter
+ {
+ CComPtr<IUnknown> m_pEVR;
+ VMR9AlphaBitmap* m_pVMR9AlphaBitmap;
+ CEVRAllocatorPresenter* m_pAllocatorPresenter;
- public:
- COuterEVR(const TCHAR* pName, LPUNKNOWN pUnk, HRESULT& hr, VMR9AlphaBitmap* pVMR9AlphaBitmap, CEVRAllocatorPresenter *pAllocatorPresenter) : CUnknown(pName, pUnk) {
- hr = m_pEVR.CoCreateInstance(CLSID_EnhancedVideoRenderer, GetOwner());
- m_pVMR9AlphaBitmap = pVMR9AlphaBitmap;
- m_pAllocatorPresenter = pAllocatorPresenter;
- }
+ public:
+ COuterEVR(const TCHAR* pName, LPUNKNOWN pUnk, HRESULT& hr, VMR9AlphaBitmap* pVMR9AlphaBitmap, CEVRAllocatorPresenter* pAllocatorPresenter) : CUnknown(pName, pUnk) {
+ hr = m_pEVR.CoCreateInstance(CLSID_EnhancedVideoRenderer, GetOwner());
+ m_pVMR9AlphaBitmap = pVMR9AlphaBitmap;
+ m_pAllocatorPresenter = pAllocatorPresenter;
+ }
- ~COuterEVR() {}
+ ~COuterEVR() {}
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
- HRESULT hr;
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
+ HRESULT hr;
- if (riid == __uuidof(IVMRMixerBitmap9)) {
- return GetInterface((IVMRMixerBitmap9*)this, ppv);
- }
- if (riid == __uuidof(IMediaFilter)) {
- return GetInterface((IMediaFilter*)this, ppv);
- }
- if (riid == __uuidof(IPersist)) {
- return GetInterface((IPersist*)this, ppv);
- }
- if (riid == __uuidof(IBaseFilter)) {
- return GetInterface((IBaseFilter*)this, ppv);
- }
+ if (riid == __uuidof(IVMRMixerBitmap9)) {
+ return GetInterface((IVMRMixerBitmap9*)this, ppv);
+ }
+ if (riid == __uuidof(IMediaFilter)) {
+ return GetInterface((IMediaFilter*)this, ppv);
+ }
+ if (riid == __uuidof(IPersist)) {
+ return GetInterface((IPersist*)this, ppv);
+ }
+ if (riid == __uuidof(IBaseFilter)) {
+ return GetInterface((IBaseFilter*)this, ppv);
+ }
- hr = m_pEVR ? m_pEVR->QueryInterface(riid, ppv) : E_NOINTERFACE;
- if (m_pEVR && FAILED(hr)) {
- if (riid == __uuidof(IVMRffdshow9)) { // Support ffdshow queueing. We show ffdshow that this is patched Media Player Classic.
- return GetInterface((IVMRffdshow9*)this, ppv);
- }
- }
+ hr = m_pEVR ? m_pEVR->QueryInterface(riid, ppv) : E_NOINTERFACE;
+ if (m_pEVR && FAILED(hr)) {
+ if (riid == __uuidof(IVMRffdshow9)) { // Support ffdshow queueing. We show ffdshow that this is patched Media Player Classic.
+ return GetInterface((IVMRffdshow9*)this, ppv);
+ }
+ }
- return SUCCEEDED(hr) ? hr : __super::NonDelegatingQueryInterface(riid, ppv);
- }
+ return SUCCEEDED(hr) ? hr : __super::NonDelegatingQueryInterface(riid, ppv);
+ }
- // IBaseFilter
- STDMETHODIMP EnumPins(__out IEnumPins **ppEnum);
- STDMETHODIMP FindPin(LPCWSTR Id, __out IPin **ppPin);
- STDMETHODIMP QueryFilterInfo(__out FILTER_INFO *pInfo);
- STDMETHODIMP JoinFilterGraph(__in_opt IFilterGraph *pGraph, __in_opt LPCWSTR pName);
- STDMETHODIMP QueryVendorInfo(__out LPWSTR *pVendorInfo);
- STDMETHODIMP Stop();
- STDMETHODIMP Pause();
- STDMETHODIMP Run(REFERENCE_TIME tStart);
- STDMETHODIMP GetState( DWORD dwMilliSecsTimeout, __out FILTER_STATE *State);
- STDMETHODIMP SetSyncSource(__in_opt IReferenceClock *pClock);
- STDMETHODIMP GetSyncSource(__deref_out_opt IReferenceClock **pClock);
- STDMETHODIMP GetClassID(__RPC__out CLSID *pClassID);
+ // IBaseFilter
+ STDMETHODIMP EnumPins(__out IEnumPins** ppEnum);
+ STDMETHODIMP FindPin(LPCWSTR Id, __out IPin** ppPin);
+ STDMETHODIMP QueryFilterInfo(__out FILTER_INFO* pInfo);
+ STDMETHODIMP JoinFilterGraph(__in_opt IFilterGraph* pGraph, __in_opt LPCWSTR pName);
+ STDMETHODIMP QueryVendorInfo(__out LPWSTR* pVendorInfo);
+ STDMETHODIMP Stop();
+ STDMETHODIMP Pause();
+ STDMETHODIMP Run(REFERENCE_TIME tStart);
+ STDMETHODIMP GetState(DWORD dwMilliSecsTimeout, __out FILTER_STATE* State);
+ STDMETHODIMP SetSyncSource(__in_opt IReferenceClock* pClock);
+ STDMETHODIMP GetSyncSource(__deref_out_opt IReferenceClock** pClock);
+ STDMETHODIMP GetClassID(__RPC__out CLSID* pClassID);
- // IVMRffdshow9
- STDMETHODIMP support_ffdshow() {
- queue_ffdshow_support = true;
- return S_OK;
- }
+ // IVMRffdshow9
+ STDMETHODIMP support_ffdshow() {
+ queue_ffdshow_support = true;
+ return S_OK;
+ }
- // IVMRMixerBitmap9
- STDMETHODIMP GetAlphaBitmapParameters(VMR9AlphaBitmap* pBmpParms);
- STDMETHODIMP SetAlphaBitmap(const VMR9AlphaBitmap* pBmpParms);
- STDMETHODIMP UpdateAlphaBitmapParameters(const VMR9AlphaBitmap* pBmpParms);
- };
+ // IVMRMixerBitmap9
+ STDMETHODIMP GetAlphaBitmapParameters(VMR9AlphaBitmap* pBmpParms);
+ STDMETHODIMP SetAlphaBitmap(const VMR9AlphaBitmap* pBmpParms);
+ STDMETHODIMP UpdateAlphaBitmapParameters(const VMR9AlphaBitmap* pBmpParms);
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/OuterVMR.cpp b/src/filters/renderer/VideoRenderers/OuterVMR.cpp
index a5f5738cb..af4a2c910 100644
--- a/src/filters/renderer/VideoRenderers/OuterVMR.cpp
+++ b/src/filters/renderer/VideoRenderers/OuterVMR.cpp
@@ -27,134 +27,146 @@
using namespace DSObjects;
-STDMETHODIMP COuterVMR9::GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight) {
- if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
- return pWC9->GetNativeVideoSize(lpWidth, lpHeight, lpARWidth, lpARHeight);
- }
+STDMETHODIMP COuterVMR9::GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight)
+{
+ if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
+ return pWC9->GetNativeVideoSize(lpWidth, lpHeight, lpARWidth, lpARHeight);
+ }
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterVMR9::GetVideoPosition(LPRECT lpSRCRect, LPRECT lpDSTRect) {
- if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
- return pWC9->GetVideoPosition(lpSRCRect, lpDSTRect);
- }
+STDMETHODIMP COuterVMR9::GetVideoPosition(LPRECT lpSRCRect, LPRECT lpDSTRect)
+{
+ if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
+ return pWC9->GetVideoPosition(lpSRCRect, lpDSTRect);
+ }
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterVMR9::GetAspectRatioMode(DWORD* lpAspectRatioMode) {
- if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
- *lpAspectRatioMode = VMR_ARMODE_NONE;
- return S_OK;
- }
+STDMETHODIMP COuterVMR9::GetAspectRatioMode(DWORD* lpAspectRatioMode)
+{
+ if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
+ *lpAspectRatioMode = VMR_ARMODE_NONE;
+ return S_OK;
+ }
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// IVideoWindow
-STDMETHODIMP COuterVMR9::get_Width(long* pWidth) {
- if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
- CRect s, d;
- HRESULT hr = pWC9->GetVideoPosition(&s, &d);
- *pWidth = d.Width();
- return hr;
- }
-
- return E_NOTIMPL;
+STDMETHODIMP COuterVMR9::get_Width(long* pWidth)
+{
+ if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
+ CRect s, d;
+ HRESULT hr = pWC9->GetVideoPosition(&s, &d);
+ *pWidth = d.Width();
+ return hr;
+ }
+
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterVMR9::get_Height(long* pHeight) {
- if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
- CRect s, d;
- HRESULT hr = pWC9->GetVideoPosition(&s, &d);
- *pHeight = d.Height();
- return hr;
- }
+STDMETHODIMP COuterVMR9::get_Height(long* pHeight)
+{
+ if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
+ CRect s, d;
+ HRESULT hr = pWC9->GetVideoPosition(&s, &d);
+ *pHeight = d.Height();
+ return hr;
+ }
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// IBasicVideo2
-STDMETHODIMP COuterVMR9::GetSourcePosition(long* pLeft, long* pTop, long* pWidth, long* pHeight) {
- // DVD Nav. bug workaround fix
- {
- *pLeft = *pTop = 0;
- return GetVideoSize(pWidth, pHeight);
- }
- /*
- if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR)
- {
- CRect s, d;
- HRESULT hr = pWC9->GetVideoPosition(&s, &d);
- *pLeft = s.left;
- *pTop = s.top;
- *pWidth = s.Width();
- *pHeight = s.Height();
- return hr;
- }
- return E_NOTIMPL;
- */
+STDMETHODIMP COuterVMR9::GetSourcePosition(long* pLeft, long* pTop, long* pWidth, long* pHeight)
+{
+ // DVD Nav. bug workaround fix
+ {
+ *pLeft = *pTop = 0;
+ return GetVideoSize(pWidth, pHeight);
+ }
+ /*
+ if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR)
+ {
+ CRect s, d;
+ HRESULT hr = pWC9->GetVideoPosition(&s, &d);
+ *pLeft = s.left;
+ *pTop = s.top;
+ *pWidth = s.Width();
+ *pHeight = s.Height();
+ return hr;
+ }
+ return E_NOTIMPL;
+ */
}
-STDMETHODIMP COuterVMR9::GetDestinationPosition(long* pLeft, long* pTop, long* pWidth, long* pHeight) {
- if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
- CRect s, d;
- HRESULT hr = pWC9->GetVideoPosition(&s, &d);
- *pLeft = d.left;
- *pTop = d.top;
- *pWidth = d.Width();
- *pHeight = d.Height();
- return hr;
- }
-
- return E_NOTIMPL;
+STDMETHODIMP COuterVMR9::GetDestinationPosition(long* pLeft, long* pTop, long* pWidth, long* pHeight)
+{
+ if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
+ CRect s, d;
+ HRESULT hr = pWC9->GetVideoPosition(&s, &d);
+ *pLeft = d.left;
+ *pTop = d.top;
+ *pWidth = d.Width();
+ *pHeight = d.Height();
+ return hr;
+ }
+
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterVMR9::GetVideoSize(long* pWidth, long* pHeight) {
- if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
- LONG aw, ah;
- // return pWC9->GetNativeVideoSize(pWidth, pHeight, &aw, &ah);
- // DVD Nav. bug workaround fix
- HRESULT hr = pWC9->GetNativeVideoSize(pWidth, pHeight, &aw, &ah);
- *pWidth = *pHeight * aw / ah;
- return hr;
- }
-
- return E_NOTIMPL;
+STDMETHODIMP COuterVMR9::GetVideoSize(long* pWidth, long* pHeight)
+{
+ if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
+ LONG aw, ah;
+ // return pWC9->GetNativeVideoSize(pWidth, pHeight, &aw, &ah);
+ // DVD Nav. bug workaround fix
+ HRESULT hr = pWC9->GetNativeVideoSize(pWidth, pHeight, &aw, &ah);
+ *pWidth = *pHeight * aw / ah;
+ return hr;
+ }
+
+ return E_NOTIMPL;
}
-STDMETHODIMP COuterVMR9::GetPreferredAspectRatio(long* plAspectX, long* plAspectY) {
- if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
- LONG w, h;
- return pWC9->GetNativeVideoSize(&w, &h, plAspectX, plAspectY);
- }
+STDMETHODIMP COuterVMR9::GetPreferredAspectRatio(long* plAspectX, long* plAspectY)
+{
+ if (CComQIPtr<IVMRWindowlessControl9> pWC9 = m_pVMR) {
+ LONG w, h;
+ return pWC9->GetNativeVideoSize(&w, &h, plAspectX, plAspectY);
+ }
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// IVMRMixerBitmap9
-STDMETHODIMP COuterVMR9::GetAlphaBitmapParameters(VMR9AlphaBitmap* pBmpParms) {
- CheckPointer(pBmpParms, E_POINTER);
- CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
- memcpy (pBmpParms, m_pVMR9AlphaBitmap, sizeof(VMR9AlphaBitmap));
- return S_OK;
+STDMETHODIMP COuterVMR9::GetAlphaBitmapParameters(VMR9AlphaBitmap* pBmpParms)
+{
+ CheckPointer(pBmpParms, E_POINTER);
+ CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
+ memcpy(pBmpParms, m_pVMR9AlphaBitmap, sizeof(VMR9AlphaBitmap));
+ return S_OK;
}
-STDMETHODIMP COuterVMR9::SetAlphaBitmap(const VMR9AlphaBitmap* pBmpParms) {
- CheckPointer(pBmpParms, E_POINTER);
- CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
- memcpy (m_pVMR9AlphaBitmap, pBmpParms, sizeof(VMR9AlphaBitmap));
- m_pVMR9AlphaBitmap->dwFlags |= VMRBITMAP_UPDATE;
- m_pAllocatorPresenter->UpdateAlphaBitmap();
- return S_OK;
+STDMETHODIMP COuterVMR9::SetAlphaBitmap(const VMR9AlphaBitmap* pBmpParms)
+{
+ CheckPointer(pBmpParms, E_POINTER);
+ CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
+ memcpy(m_pVMR9AlphaBitmap, pBmpParms, sizeof(VMR9AlphaBitmap));
+ m_pVMR9AlphaBitmap->dwFlags |= VMRBITMAP_UPDATE;
+ m_pAllocatorPresenter->UpdateAlphaBitmap();
+ return S_OK;
}
-STDMETHODIMP COuterVMR9::UpdateAlphaBitmapParameters(const VMR9AlphaBitmap* pBmpParms) {
- CheckPointer(pBmpParms, E_POINTER);
- CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
- memcpy (m_pVMR9AlphaBitmap, pBmpParms, sizeof(VMR9AlphaBitmap));
- m_pVMR9AlphaBitmap->dwFlags |= VMRBITMAP_UPDATE;
- m_pAllocatorPresenter->UpdateAlphaBitmap();
- return S_OK;
+STDMETHODIMP COuterVMR9::UpdateAlphaBitmapParameters(const VMR9AlphaBitmap* pBmpParms)
+{
+ CheckPointer(pBmpParms, E_POINTER);
+ CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
+ memcpy(m_pVMR9AlphaBitmap, pBmpParms, sizeof(VMR9AlphaBitmap));
+ m_pVMR9AlphaBitmap->dwFlags |= VMRBITMAP_UPDATE;
+ m_pAllocatorPresenter->UpdateAlphaBitmap();
+ return S_OK;
}
diff --git a/src/filters/renderer/VideoRenderers/OuterVMR.h b/src/filters/renderer/VideoRenderers/OuterVMR.h
index 8b71014d4..153a068cd 100644
--- a/src/filters/renderer/VideoRenderers/OuterVMR.h
+++ b/src/filters/renderer/VideoRenderers/OuterVMR.h
@@ -24,343 +24,343 @@
namespace DSObjects
{
- class COuterVMR9
- : public CUnknown
- , public IVideoWindow
- , public IBasicVideo2
- , public IVMRWindowlessControl
- , public IVMRffdshow9
- , public IVMRMixerBitmap9
- {
- CComPtr<IUnknown> m_pVMR;
- VMR9AlphaBitmap* m_pVMR9AlphaBitmap;
- CDX9AllocatorPresenter *m_pAllocatorPresenter;
+ class COuterVMR9
+ : public CUnknown
+ , public IVideoWindow
+ , public IBasicVideo2
+ , public IVMRWindowlessControl
+ , public IVMRffdshow9
+ , public IVMRMixerBitmap9
+ {
+ CComPtr<IUnknown> m_pVMR;
+ VMR9AlphaBitmap* m_pVMR9AlphaBitmap;
+ CDX9AllocatorPresenter* m_pAllocatorPresenter;
- public:
+ public:
- COuterVMR9(const TCHAR* pName, LPUNKNOWN pUnk, VMR9AlphaBitmap* pVMR9AlphaBitmap, CDX9AllocatorPresenter *_pAllocatorPresenter) : CUnknown(pName, pUnk) {
- m_pVMR.CoCreateInstance(CLSID_VideoMixingRenderer9, GetOwner());
- m_pVMR9AlphaBitmap = pVMR9AlphaBitmap;
- m_pAllocatorPresenter = _pAllocatorPresenter;
- }
+ COuterVMR9(const TCHAR* pName, LPUNKNOWN pUnk, VMR9AlphaBitmap* pVMR9AlphaBitmap, CDX9AllocatorPresenter* _pAllocatorPresenter) : CUnknown(pName, pUnk) {
+ m_pVMR.CoCreateInstance(CLSID_VideoMixingRenderer9, GetOwner());
+ m_pVMR9AlphaBitmap = pVMR9AlphaBitmap;
+ m_pAllocatorPresenter = _pAllocatorPresenter;
+ }
- ~COuterVMR9() {
- m_pVMR = NULL;
- }
+ ~COuterVMR9() {
+ m_pVMR = NULL;
+ }
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
- HRESULT hr;
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
+ HRESULT hr;
- // Casimir666 : in renderless mode, do the inlaying in place of VMR
- if (riid == __uuidof(IVMRMixerBitmap9)) {
- return GetInterface((IVMRMixerBitmap9*)this, ppv);
- }
+ // Casimir666 : in renderless mode, do the inlaying in place of VMR
+ if (riid == __uuidof(IVMRMixerBitmap9)) {
+ return GetInterface((IVMRMixerBitmap9*)this, ppv);
+ }
- hr = m_pVMR ? m_pVMR->QueryInterface(riid, ppv) : E_NOINTERFACE;
- if (m_pVMR && FAILED(hr)) {
- if (riid == __uuidof(IVideoWindow)) {
- return GetInterface((IVideoWindow*)this, ppv);
- }
- if (riid == __uuidof(IBasicVideo)) {
- return GetInterface((IBasicVideo*)this, ppv);
- }
- if (riid == __uuidof(IBasicVideo2)) {
- return GetInterface((IBasicVideo2*)this, ppv);
- }
- if (riid == __uuidof(IVMRffdshow9)) { // Support ffdshow queueing. We show ffdshow that this is patched Media Player Classic.
- return GetInterface((IVMRffdshow9*)this, ppv);
- }
- /* if (riid == __uuidof(IVMRWindowlessControl))
- return GetInterface((IVMRWindowlessControl*)this, ppv);
- */
- }
+ hr = m_pVMR ? m_pVMR->QueryInterface(riid, ppv) : E_NOINTERFACE;
+ if (m_pVMR && FAILED(hr)) {
+ if (riid == __uuidof(IVideoWindow)) {
+ return GetInterface((IVideoWindow*)this, ppv);
+ }
+ if (riid == __uuidof(IBasicVideo)) {
+ return GetInterface((IBasicVideo*)this, ppv);
+ }
+ if (riid == __uuidof(IBasicVideo2)) {
+ return GetInterface((IBasicVideo2*)this, ppv);
+ }
+ if (riid == __uuidof(IVMRffdshow9)) { // Support ffdshow queueing. We show ffdshow that this is patched Media Player Classic.
+ return GetInterface((IVMRffdshow9*)this, ppv);
+ }
+ /* if (riid == __uuidof(IVMRWindowlessControl))
+ return GetInterface((IVMRWindowlessControl*)this, ppv);
+ */
+ }
- return SUCCEEDED(hr) ? hr : __super::NonDelegatingQueryInterface(riid, ppv);
- }
+ return SUCCEEDED(hr) ? hr : __super::NonDelegatingQueryInterface(riid, ppv);
+ }
- // IVMRWindowlessControl
+ // IVMRWindowlessControl
- STDMETHODIMP GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight);
+ STDMETHODIMP GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight);
- STDMETHODIMP GetMinIdealVideoSize(LONG* lpWidth, LONG* lpHeight) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetMaxIdealVideoSize(LONG* lpWidth, LONG* lpHeight) {
- return E_NOTIMPL;
- }
- STDMETHODIMP SetVideoPosition(const LPRECT lpSRCRect, const LPRECT lpDSTRect) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetVideoPosition(LPRECT lpSRCRect, LPRECT lpDSTRect);
+ STDMETHODIMP GetMinIdealVideoSize(LONG* lpWidth, LONG* lpHeight) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetMaxIdealVideoSize(LONG* lpWidth, LONG* lpHeight) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP SetVideoPosition(const LPRECT lpSRCRect, const LPRECT lpDSTRect) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetVideoPosition(LPRECT lpSRCRect, LPRECT lpDSTRect);
- STDMETHODIMP GetAspectRatioMode(DWORD* lpAspectRatioMode);
+ STDMETHODIMP GetAspectRatioMode(DWORD* lpAspectRatioMode);
- STDMETHODIMP SetAspectRatioMode(DWORD AspectRatioMode) {
- return E_NOTIMPL;
- }
- STDMETHODIMP SetVideoClippingWindow(HWND hwnd) {
- return E_NOTIMPL;
- }
- STDMETHODIMP RepaintVideo(HWND hwnd, HDC hdc) {
- return E_NOTIMPL;
- }
- STDMETHODIMP DisplayModeChanged() {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetCurrentImage(BYTE** lpDib) {
- return E_NOTIMPL;
- }
- STDMETHODIMP SetBorderColor(COLORREF Clr) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetBorderColor(COLORREF* lpClr) {
- return E_NOTIMPL;
- }
- STDMETHODIMP SetColorKey(COLORREF Clr) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetColorKey(COLORREF* lpClr) {
- return E_NOTIMPL;
- }
+ STDMETHODIMP SetAspectRatioMode(DWORD AspectRatioMode) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP SetVideoClippingWindow(HWND hwnd) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP RepaintVideo(HWND hwnd, HDC hdc) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP DisplayModeChanged() {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetCurrentImage(BYTE** lpDib) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP SetBorderColor(COLORREF Clr) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetBorderColor(COLORREF* lpClr) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP SetColorKey(COLORREF Clr) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetColorKey(COLORREF* lpClr) {
+ return E_NOTIMPL;
+ }
- // IVideoWindow
- STDMETHODIMP GetTypeInfoCount(UINT* pctinfo) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId) {
- return E_NOTIMPL;
- }
- STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_Caption(BSTR strCaption) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_Caption(BSTR* strCaption) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_WindowStyle(long WindowStyle) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_WindowStyle(long* WindowStyle) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_WindowStyleEx(long WindowStyleEx) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_WindowStyleEx(long* WindowStyleEx) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_AutoShow(long AutoShow) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_AutoShow(long* AutoShow) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_WindowState(long WindowState) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_WindowState(long* WindowState) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_BackgroundPalette(long BackgroundPalette) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_BackgroundPalette(long* pBackgroundPalette) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_Visible(long Visible) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_Visible(long* pVisible) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_Left(long Left) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_Left(long* pLeft) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_Width(long Width) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_Width(long* pWidth);
+ // IVideoWindow
+ STDMETHODIMP GetTypeInfoCount(UINT* pctinfo) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_Caption(BSTR strCaption) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_Caption(BSTR* strCaption) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_WindowStyle(long WindowStyle) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_WindowStyle(long* WindowStyle) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_WindowStyleEx(long WindowStyleEx) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_WindowStyleEx(long* WindowStyleEx) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_AutoShow(long AutoShow) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_AutoShow(long* AutoShow) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_WindowState(long WindowState) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_WindowState(long* WindowState) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_BackgroundPalette(long BackgroundPalette) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_BackgroundPalette(long* pBackgroundPalette) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_Visible(long Visible) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_Visible(long* pVisible) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_Left(long Left) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_Left(long* pLeft) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_Width(long Width) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_Width(long* pWidth);
- STDMETHODIMP put_Top(long Top) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_Top(long* pTop) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_Height(long Height) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_Height(long* pHeight);
+ STDMETHODIMP put_Top(long Top) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_Top(long* pTop) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_Height(long Height) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_Height(long* pHeight);
- STDMETHODIMP put_Owner(OAHWND Owner) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_Owner(OAHWND* Owner) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_MessageDrain(OAHWND Drain) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_MessageDrain(OAHWND* Drain) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_BorderColor(long* Color) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_BorderColor(long Color) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_FullScreenMode(long* FullScreenMode) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_FullScreenMode(long FullScreenMode) {
- return E_NOTIMPL;
- }
- STDMETHODIMP SetWindowForeground(long Focus) {
- return E_NOTIMPL;
- }
- STDMETHODIMP NotifyOwnerMessage(OAHWND hwnd, long uMsg, LONG_PTR wParam, LONG_PTR lParam) {
- return E_NOTIMPL;
- }
- STDMETHODIMP SetWindowPosition(long Left, long Top, long Width, long Height) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetWindowPosition(long* pLeft, long* pTop, long* pWidth, long* pHeight) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetMinIdealImageSize(long* pWidth, long* pHeight) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetMaxIdealImageSize(long* pWidth, long* pHeight) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetRestorePosition(long* pLeft, long* pTop, long* pWidth, long* pHeight) {
- return E_NOTIMPL;
- }
- STDMETHODIMP HideCursor(long HideCursor) {
- return E_NOTIMPL;
- }
- STDMETHODIMP IsCursorHidden(long* CursorHidden) {
- return E_NOTIMPL;
- }
+ STDMETHODIMP put_Owner(OAHWND Owner) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_Owner(OAHWND* Owner) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_MessageDrain(OAHWND Drain) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_MessageDrain(OAHWND* Drain) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_BorderColor(long* Color) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_BorderColor(long Color) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_FullScreenMode(long* FullScreenMode) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_FullScreenMode(long FullScreenMode) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP SetWindowForeground(long Focus) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP NotifyOwnerMessage(OAHWND hwnd, long uMsg, LONG_PTR wParam, LONG_PTR lParam) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP SetWindowPosition(long Left, long Top, long Width, long Height) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetWindowPosition(long* pLeft, long* pTop, long* pWidth, long* pHeight) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetMinIdealImageSize(long* pWidth, long* pHeight) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetMaxIdealImageSize(long* pWidth, long* pHeight) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetRestorePosition(long* pLeft, long* pTop, long* pWidth, long* pHeight) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP HideCursor(long HideCursor) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP IsCursorHidden(long* CursorHidden) {
+ return E_NOTIMPL;
+ }
- // IBasicVideo2
- STDMETHODIMP get_AvgTimePerFrame(REFTIME* pAvgTimePerFrame) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_BitRate(long* pBitRate) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_BitErrorRate(long* pBitErrorRate) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_VideoWidth(long* pVideoWidth) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_VideoHeight(long* pVideoHeight) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_SourceLeft(long SourceLeft) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_SourceLeft(long* pSourceLeft) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_SourceWidth(long SourceWidth) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_SourceWidth(long* pSourceWidth) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_SourceTop(long SourceTop) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_SourceTop(long* pSourceTop) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_SourceHeight(long SourceHeight) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_SourceHeight(long* pSourceHeight) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_DestinationLeft(long DestinationLeft) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_DestinationLeft(long* pDestinationLeft) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_DestinationWidth(long DestinationWidth) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_DestinationWidth(long* pDestinationWidth) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_DestinationTop(long DestinationTop) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_DestinationTop(long* pDestinationTop) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_DestinationHeight(long DestinationHeight) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_DestinationHeight(long* pDestinationHeight) {
- return E_NOTIMPL;
- }
- STDMETHODIMP SetSourcePosition(long Left, long Top, long Width, long Height) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetSourcePosition(long* pLeft, long* pTop, long* pWidth, long* pHeight);
+ // IBasicVideo2
+ STDMETHODIMP get_AvgTimePerFrame(REFTIME* pAvgTimePerFrame) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_BitRate(long* pBitRate) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_BitErrorRate(long* pBitErrorRate) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_VideoWidth(long* pVideoWidth) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_VideoHeight(long* pVideoHeight) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_SourceLeft(long SourceLeft) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_SourceLeft(long* pSourceLeft) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_SourceWidth(long SourceWidth) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_SourceWidth(long* pSourceWidth) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_SourceTop(long SourceTop) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_SourceTop(long* pSourceTop) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_SourceHeight(long SourceHeight) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_SourceHeight(long* pSourceHeight) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_DestinationLeft(long DestinationLeft) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_DestinationLeft(long* pDestinationLeft) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_DestinationWidth(long DestinationWidth) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_DestinationWidth(long* pDestinationWidth) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_DestinationTop(long DestinationTop) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_DestinationTop(long* pDestinationTop) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_DestinationHeight(long DestinationHeight) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_DestinationHeight(long* pDestinationHeight) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP SetSourcePosition(long Left, long Top, long Width, long Height) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetSourcePosition(long* pLeft, long* pTop, long* pWidth, long* pHeight);
- STDMETHODIMP SetDefaultSourcePosition() {
- return E_NOTIMPL;
- }
- STDMETHODIMP SetDestinationPosition(long Left, long Top, long Width, long Height) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetDestinationPosition(long* pLeft, long* pTop, long* pWidth, long* pHeight);
+ STDMETHODIMP SetDefaultSourcePosition() {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP SetDestinationPosition(long Left, long Top, long Width, long Height) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetDestinationPosition(long* pLeft, long* pTop, long* pWidth, long* pHeight);
- STDMETHODIMP SetDefaultDestinationPosition() {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetVideoSize(long* pWidth, long* pHeight);
+ STDMETHODIMP SetDefaultDestinationPosition() {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetVideoSize(long* pWidth, long* pHeight);
- // IVMRffdshow9
- STDMETHODIMP support_ffdshow() {
- queue_ffdshow_support = true;
- return S_OK;
- }
+ // IVMRffdshow9
+ STDMETHODIMP support_ffdshow() {
+ queue_ffdshow_support = true;
+ return S_OK;
+ }
- STDMETHODIMP GetVideoPaletteEntries(long StartIndex, long Entries, long* pRetrieved, long* pPalette) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetCurrentImage(long* pBufferSize, long* pDIBImage) {
- return E_NOTIMPL;
- }
- STDMETHODIMP IsUsingDefaultSource() {
- return E_NOTIMPL;
- }
- STDMETHODIMP IsUsingDefaultDestination() {
- return E_NOTIMPL;
- }
+ STDMETHODIMP GetVideoPaletteEntries(long StartIndex, long Entries, long* pRetrieved, long* pPalette) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetCurrentImage(long* pBufferSize, long* pDIBImage) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP IsUsingDefaultSource() {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP IsUsingDefaultDestination() {
+ return E_NOTIMPL;
+ }
- STDMETHODIMP GetPreferredAspectRatio(long* plAspectX, long* plAspectY);
+ STDMETHODIMP GetPreferredAspectRatio(long* plAspectX, long* plAspectY);
- // IVMRMixerBitmap9
- STDMETHODIMP GetAlphaBitmapParameters(VMR9AlphaBitmap* pBmpParms);
+ // IVMRMixerBitmap9
+ STDMETHODIMP GetAlphaBitmapParameters(VMR9AlphaBitmap* pBmpParms);
- STDMETHODIMP SetAlphaBitmap(const VMR9AlphaBitmap* pBmpParms);
+ STDMETHODIMP SetAlphaBitmap(const VMR9AlphaBitmap* pBmpParms);
- STDMETHODIMP UpdateAlphaBitmapParameters(const VMR9AlphaBitmap* pBmpParms);
- };
+ STDMETHODIMP UpdateAlphaBitmapParameters(const VMR9AlphaBitmap* pBmpParms);
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/PixelShaderCompiler.cpp b/src/filters/renderer/VideoRenderers/PixelShaderCompiler.cpp
index adb353346..95cfa7d1e 100644
--- a/src/filters/renderer/VideoRenderers/PixelShaderCompiler.cpp
+++ b/src/filters/renderer/VideoRenderers/PixelShaderCompiler.cpp
@@ -28,25 +28,25 @@
CPixelShaderCompiler::CPixelShaderCompiler(IDirect3DDevice9* pD3DDev, bool fStaySilent)
- : m_pD3DDev(pD3DDev)
- , m_pD3DXCompileShader(NULL)
- , m_pD3DXDisassembleShader(NULL)
+ : m_pD3DDev(pD3DDev)
+ , m_pD3DXCompileShader(NULL)
+ , m_pD3DXDisassembleShader(NULL)
{
- HINSTANCE hDll;
- hDll = GetRenderersData()->GetD3X9Dll();
-
- if (hDll) {
- m_pD3DXCompileShader = (D3DXCompileShaderPtr)GetProcAddress(hDll, "D3DXCompileShader");
- m_pD3DXDisassembleShader = (D3DXDisassembleShaderPtr)GetProcAddress(hDll, "D3DXDisassembleShader");
- }
-
- if (!fStaySilent) {
- if (!hDll) {
- AfxMessageBox(IDS_PIXELSHADERCOMPILER_0, MB_ICONWARNING | MB_OK, 0);
- } else if (!m_pD3DXCompileShader || !m_pD3DXDisassembleShader) {
- AfxMessageBox(IDS_PIXELSHADERCOMPILER_1, MB_ICONWARNING | MB_OK, 0);
- }
- }
+ HINSTANCE hDll;
+ hDll = GetRenderersData()->GetD3X9Dll();
+
+ if (hDll) {
+ m_pD3DXCompileShader = (D3DXCompileShaderPtr)GetProcAddress(hDll, "D3DXCompileShader");
+ m_pD3DXDisassembleShader = (D3DXDisassembleShaderPtr)GetProcAddress(hDll, "D3DXDisassembleShader");
+ }
+
+ if (!fStaySilent) {
+ if (!hDll) {
+ AfxMessageBox(IDS_PIXELSHADERCOMPILER_0, MB_ICONWARNING | MB_OK, 0);
+ } else if (!m_pD3DXCompileShader || !m_pD3DXDisassembleShader) {
+ AfxMessageBox(IDS_PIXELSHADERCOMPILER_1, MB_ICONWARNING | MB_OK, 0);
+ }
+ }
}
CPixelShaderCompiler::~CPixelShaderCompiler()
@@ -54,54 +54,54 @@ CPixelShaderCompiler::~CPixelShaderCompiler()
}
HRESULT CPixelShaderCompiler::CompileShader(
- LPCSTR pSrcData,
- LPCSTR pFunctionName,
- LPCSTR pProfile,
- DWORD Flags,
- IDirect3DPixelShader9** ppPixelShader,
- CString* disasm,
- CString* errmsg)
+ LPCSTR pSrcData,
+ LPCSTR pFunctionName,
+ LPCSTR pProfile,
+ DWORD Flags,
+ IDirect3DPixelShader9** ppPixelShader,
+ CString* disasm,
+ CString* errmsg)
{
- if (!m_pD3DXCompileShader || !m_pD3DXDisassembleShader) {
- return E_FAIL;
- }
-
- HRESULT hr;
-
- CComPtr<ID3DXBuffer> pShader, pDisAsm, pErrorMsgs;
- hr = m_pD3DXCompileShader(pSrcData, (UINT)strlen(pSrcData), NULL, NULL, pFunctionName, pProfile, Flags, &pShader, &pErrorMsgs, NULL);
-
- if (FAILED(hr)) {
- if (errmsg) {
- CStringA msg = "Unexpected compiler error";
-
- if (pErrorMsgs) {
- int len = pErrorMsgs->GetBufferSize();
- memcpy(msg.GetBufferSetLength(len), pErrorMsgs->GetBufferPointer(), len);
- }
-
- *errmsg = msg;
- }
-
- return hr;
- }
-
- if (ppPixelShader) {
- if (!m_pD3DDev) {
- return E_FAIL;
- }
- hr = m_pD3DDev->CreatePixelShader((DWORD*)pShader->GetBufferPointer(), ppPixelShader);
- if (FAILED(hr)) {
- return hr;
- }
- }
-
- if (disasm) {
- hr = m_pD3DXDisassembleShader((DWORD*)pShader->GetBufferPointer(), FALSE, NULL, &pDisAsm);
- if (SUCCEEDED(hr) && pDisAsm) {
- *disasm = CStringA((const char*)pDisAsm->GetBufferPointer());
- }
- }
-
- return S_OK;
+ if (!m_pD3DXCompileShader || !m_pD3DXDisassembleShader) {
+ return E_FAIL;
+ }
+
+ HRESULT hr;
+
+ CComPtr<ID3DXBuffer> pShader, pDisAsm, pErrorMsgs;
+ hr = m_pD3DXCompileShader(pSrcData, (UINT)strlen(pSrcData), NULL, NULL, pFunctionName, pProfile, Flags, &pShader, &pErrorMsgs, NULL);
+
+ if (FAILED(hr)) {
+ if (errmsg) {
+ CStringA msg = "Unexpected compiler error";
+
+ if (pErrorMsgs) {
+ int len = pErrorMsgs->GetBufferSize();
+ memcpy(msg.GetBufferSetLength(len), pErrorMsgs->GetBufferPointer(), len);
+ }
+
+ *errmsg = msg;
+ }
+
+ return hr;
+ }
+
+ if (ppPixelShader) {
+ if (!m_pD3DDev) {
+ return E_FAIL;
+ }
+ hr = m_pD3DDev->CreatePixelShader((DWORD*)pShader->GetBufferPointer(), ppPixelShader);
+ if (FAILED(hr)) {
+ return hr;
+ }
+ }
+
+ if (disasm) {
+ hr = m_pD3DXDisassembleShader((DWORD*)pShader->GetBufferPointer(), FALSE, NULL, &pDisAsm);
+ if (SUCCEEDED(hr) && pDisAsm) {
+ *disasm = CStringA((const char*)pDisAsm->GetBufferPointer());
+ }
+ }
+
+ return S_OK;
}
diff --git a/src/filters/renderer/VideoRenderers/PixelShaderCompiler.h b/src/filters/renderer/VideoRenderers/PixelShaderCompiler.h
index 5c429fb82..45bc68b06 100644
--- a/src/filters/renderer/VideoRenderers/PixelShaderCompiler.h
+++ b/src/filters/renderer/VideoRenderers/PixelShaderCompiler.h
@@ -28,39 +28,39 @@
class CPixelShaderCompiler
{
- typedef HRESULT (WINAPI * D3DXCompileShaderPtr) (
- LPCSTR pSrcData,
- UINT SrcDataLen,
- CONST D3DXMACRO* pDefines,
- LPD3DXINCLUDE pInclude,
- LPCSTR pFunctionName,
- LPCSTR pProfile,
- DWORD Flags,
- LPD3DXBUFFER* ppShader,
- LPD3DXBUFFER* ppErrorMsgs,
- LPD3DXCONSTANTTABLE* ppConstantTable);
+ typedef HRESULT(WINAPI* D3DXCompileShaderPtr)(
+ LPCSTR pSrcData,
+ UINT SrcDataLen,
+ CONST D3DXMACRO* pDefines,
+ LPD3DXINCLUDE pInclude,
+ LPCSTR pFunctionName,
+ LPCSTR pProfile,
+ DWORD Flags,
+ LPD3DXBUFFER* ppShader,
+ LPD3DXBUFFER* ppErrorMsgs,
+ LPD3DXCONSTANTTABLE* ppConstantTable);
- typedef HRESULT (WINAPI * D3DXDisassembleShaderPtr) (
- CONST DWORD* pShader,
- bool EnableColorCode,
- LPCSTR pComments,
- LPD3DXBUFFER* ppDisassembly);
+ typedef HRESULT(WINAPI* D3DXDisassembleShaderPtr)(
+ CONST DWORD* pShader,
+ bool EnableColorCode,
+ LPCSTR pComments,
+ LPD3DXBUFFER* ppDisassembly);
- D3DXCompileShaderPtr m_pD3DXCompileShader;
- D3DXDisassembleShaderPtr m_pD3DXDisassembleShader;
+ D3DXCompileShaderPtr m_pD3DXCompileShader;
+ D3DXDisassembleShaderPtr m_pD3DXDisassembleShader;
- CComPtr<IDirect3DDevice9> m_pD3DDev;
+ CComPtr<IDirect3DDevice9> m_pD3DDev;
public:
- CPixelShaderCompiler(IDirect3DDevice9* pD3DDev, bool fStaySilent = false);
- virtual ~CPixelShaderCompiler();
+ CPixelShaderCompiler(IDirect3DDevice9* pD3DDev, bool fStaySilent = false);
+ virtual ~CPixelShaderCompiler();
- HRESULT CompileShader(
- LPCSTR pSrcData,
- LPCSTR pFunctionName,
- LPCSTR pProfile,
- DWORD Flags,
- IDirect3DPixelShader9** ppPixelShader,
- CString* disasm = NULL,
- CString* errmsg = NULL);
+ HRESULT CompileShader(
+ LPCSTR pSrcData,
+ LPCSTR pFunctionName,
+ LPCSTR pProfile,
+ DWORD Flags,
+ IDirect3DPixelShader9** ppPixelShader,
+ CString* disasm = NULL,
+ CString* errmsg = NULL);
};
diff --git a/src/filters/renderer/VideoRenderers/QT7AllocatorPresenter.cpp b/src/filters/renderer/VideoRenderers/QT7AllocatorPresenter.cpp
index b9fc43ef5..2920a1176 100644
--- a/src/filters/renderer/VideoRenderers/QT7AllocatorPresenter.cpp
+++ b/src/filters/renderer/VideoRenderers/QT7AllocatorPresenter.cpp
@@ -31,131 +31,131 @@ using namespace DSObjects;
//
CQT7AllocatorPresenter::CQT7AllocatorPresenter(HWND hWnd, HRESULT& hr)
- : CDX7AllocatorPresenter(hWnd, hr)
+ : CDX7AllocatorPresenter(hWnd, hr)
{
}
STDMETHODIMP CQT7AllocatorPresenter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(IQTVideoSurface)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IQTVideoSurface)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CQT7AllocatorPresenter::AllocSurfaces()
{
- CAutoLock cAutoLock(this);
-
- m_pVideoSurfaceOff = NULL;
-
- DDSURFACEDESC2 ddsd;
- INITDDSTRUCT(ddsd);
- ddsd.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
- ddsd.dwWidth = m_NativeVideoSize.cx;
- ddsd.dwHeight = m_NativeVideoSize.cy;
- ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
- ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
- ddsd.ddpfPixelFormat.dwRGBBitCount = 32;
- ddsd.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000;
- ddsd.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
- ddsd.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
- ddsd.ddpfPixelFormat.dwBBitMask = 0x000000FF;
-
- HRESULT hr = m_pDD->CreateSurface(&ddsd, &m_pVideoSurfaceOff, NULL);
- if (FAILED(hr)) {
- return E_FAIL;
- }
-
- DDBLTFX fx;
- INITDDSTRUCT(fx);
- fx.dwFillColor = 0;
- m_pVideoSurfaceOff->Blt(NULL, NULL, NULL, DDBLT_WAIT|DDBLT_COLORFILL, &fx);
-
- return __super::AllocSurfaces();
+ CAutoLock cAutoLock(this);
+
+ m_pVideoSurfaceOff = NULL;
+
+ DDSURFACEDESC2 ddsd;
+ INITDDSTRUCT(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
+ ddsd.dwWidth = m_NativeVideoSize.cx;
+ ddsd.dwHeight = m_NativeVideoSize.cy;
+ ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
+ ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
+ ddsd.ddpfPixelFormat.dwRGBBitCount = 32;
+ ddsd.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000;
+ ddsd.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
+ ddsd.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
+ ddsd.ddpfPixelFormat.dwBBitMask = 0x000000FF;
+
+ HRESULT hr = m_pDD->CreateSurface(&ddsd, &m_pVideoSurfaceOff, NULL);
+ if (FAILED(hr)) {
+ return E_FAIL;
+ }
+
+ DDBLTFX fx;
+ INITDDSTRUCT(fx);
+ fx.dwFillColor = 0;
+ m_pVideoSurfaceOff->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &fx);
+
+ return __super::AllocSurfaces();
}
void CQT7AllocatorPresenter::DeleteSurfaces()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- m_pVideoSurfaceOff = NULL;
+ m_pVideoSurfaceOff = NULL;
- __super::DeleteSurfaces();
+ __super::DeleteSurfaces();
}
// IQTVideoSurface
STDMETHODIMP CQT7AllocatorPresenter::BeginBlt(const BITMAP& bm)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- DeleteSurfaces();
+ DeleteSurfaces();
- m_NativeVideoSize = m_AspectRatio = CSize(bm.bmWidth, abs(bm.bmHeight));
+ m_NativeVideoSize = m_AspectRatio = CSize(bm.bmWidth, abs(bm.bmHeight));
- HRESULT hr;
- if (FAILED(hr = AllocSurfaces())) {
- return hr;
- }
+ HRESULT hr;
+ if (FAILED(hr = AllocSurfaces())) {
+ return hr;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CQT7AllocatorPresenter::DoBlt(const BITMAP& bm)
{
- if (!m_pVideoSurface || !m_pVideoSurfaceOff) {
- return E_FAIL;
- }
-
- bool fOk = false;
-
- DDSURFACEDESC2 ddsd;
- INITDDSTRUCT(ddsd);
- if (FAILED(m_pVideoSurfaceOff->GetSurfaceDesc(&ddsd))) {
- return E_FAIL;
- }
-
- UINT w = (UINT)bm.bmWidth;
- UINT h = abs(bm.bmHeight);
- int bpp = bm.bmBitsPixel;
-
- if ((bpp == 16 || bpp == 24 || bpp == 32) && w == ddsd.dwWidth && h == ddsd.dwHeight) {
- INITDDSTRUCT(ddsd);
- if (SUCCEEDED(m_pVideoSurfaceOff->Lock(NULL, &ddsd, DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY, NULL))) {
- BitBltFromRGBToRGB(
- w, h,
- (BYTE*)ddsd.lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRGBBitCount,
- (BYTE*)bm.bmBits, bm.bmWidthBytes, bm.bmBitsPixel);
- m_pVideoSurfaceOff->Unlock(NULL);
- fOk = true;
- }
- }
-
- if (!fOk) {
- DDBLTFX fx;
- INITDDSTRUCT(fx);
- fx.dwFillColor = 0;
- m_pVideoSurfaceOff->Blt(NULL, NULL, NULL, DDBLT_WAIT|DDBLT_COLORFILL, &fx);
-
- HDC hDC;
- if (SUCCEEDED(m_pVideoSurfaceOff->GetDC(&hDC))) {
- CString str;
- str.Format(_T("Sorry, this format is not supported"));
-
- SetBkColor(hDC, 0);
- SetTextColor(hDC, 0x404040);
- TextOut(hDC, 10, 10, str, str.GetLength());
-
- m_pVideoSurfaceOff->ReleaseDC(hDC);
- }
- }
-
- m_pVideoSurface->Blt(NULL, m_pVideoSurfaceOff, NULL, DDBLT_WAIT, NULL);
-
- Paint(true);
-
- return S_OK;
+ if (!m_pVideoSurface || !m_pVideoSurfaceOff) {
+ return E_FAIL;
+ }
+
+ bool fOk = false;
+
+ DDSURFACEDESC2 ddsd;
+ INITDDSTRUCT(ddsd);
+ if (FAILED(m_pVideoSurfaceOff->GetSurfaceDesc(&ddsd))) {
+ return E_FAIL;
+ }
+
+ UINT w = (UINT)bm.bmWidth;
+ UINT h = abs(bm.bmHeight);
+ int bpp = bm.bmBitsPixel;
+
+ if ((bpp == 16 || bpp == 24 || bpp == 32) && w == ddsd.dwWidth && h == ddsd.dwHeight) {
+ INITDDSTRUCT(ddsd);
+ if (SUCCEEDED(m_pVideoSurfaceOff->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY, NULL))) {
+ BitBltFromRGBToRGB(
+ w, h,
+ (BYTE*)ddsd.lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRGBBitCount,
+ (BYTE*)bm.bmBits, bm.bmWidthBytes, bm.bmBitsPixel);
+ m_pVideoSurfaceOff->Unlock(NULL);
+ fOk = true;
+ }
+ }
+
+ if (!fOk) {
+ DDBLTFX fx;
+ INITDDSTRUCT(fx);
+ fx.dwFillColor = 0;
+ m_pVideoSurfaceOff->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &fx);
+
+ HDC hDC;
+ if (SUCCEEDED(m_pVideoSurfaceOff->GetDC(&hDC))) {
+ CString str;
+ str.Format(_T("Sorry, this format is not supported"));
+
+ SetBkColor(hDC, 0);
+ SetTextColor(hDC, 0x404040);
+ TextOut(hDC, 10, 10, str, str.GetLength());
+
+ m_pVideoSurfaceOff->ReleaseDC(hDC);
+ }
+ }
+
+ m_pVideoSurface->Blt(NULL, m_pVideoSurfaceOff, NULL, DDBLT_WAIT, NULL);
+
+ Paint(true);
+
+ return S_OK;
}
diff --git a/src/filters/renderer/VideoRenderers/QT7AllocatorPresenter.h b/src/filters/renderer/VideoRenderers/QT7AllocatorPresenter.h
index 65dd39ba7..a89f6b90b 100644
--- a/src/filters/renderer/VideoRenderers/QT7AllocatorPresenter.h
+++ b/src/filters/renderer/VideoRenderers/QT7AllocatorPresenter.h
@@ -29,25 +29,25 @@
namespace DSObjects
{
- class CQT7AllocatorPresenter
- : public CDX7AllocatorPresenter
- , public IQTVideoSurface
- {
- CComPtr<IDirectDrawSurface7> m_pVideoSurfaceOff;
-
- protected:
- HRESULT AllocSurfaces();
- void DeleteSurfaces();
-
- public:
- CQT7AllocatorPresenter(HWND hWnd, HRESULT& hr);
-
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- // IQTVideoSurface
- STDMETHODIMP BeginBlt(const BITMAP& bm);
- STDMETHODIMP DoBlt(const BITMAP& bm);
- };
+ class CQT7AllocatorPresenter
+ : public CDX7AllocatorPresenter
+ , public IQTVideoSurface
+ {
+ CComPtr<IDirectDrawSurface7> m_pVideoSurfaceOff;
+
+ protected:
+ HRESULT AllocSurfaces();
+ void DeleteSurfaces();
+
+ public:
+ CQT7AllocatorPresenter(HWND hWnd, HRESULT& hr);
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ // IQTVideoSurface
+ STDMETHODIMP BeginBlt(const BITMAP& bm);
+ STDMETHODIMP DoBlt(const BITMAP& bm);
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/QT9AllocatorPresenter.cpp b/src/filters/renderer/VideoRenderers/QT9AllocatorPresenter.cpp
index 85111716a..e3ae99134 100644
--- a/src/filters/renderer/VideoRenderers/QT9AllocatorPresenter.cpp
+++ b/src/filters/renderer/VideoRenderers/QT9AllocatorPresenter.cpp
@@ -29,108 +29,108 @@ using namespace DSObjects;
// CQT9AllocatorPresenter
//
-CQT9AllocatorPresenter::CQT9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString &_Error)
- : CDX9AllocatorPresenter(hWnd, bFullscreen, hr, false, _Error)
+CQT9AllocatorPresenter::CQT9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString& _Error)
+ : CDX9AllocatorPresenter(hWnd, bFullscreen, hr, false, _Error)
{
}
STDMETHODIMP CQT9AllocatorPresenter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(IQTVideoSurface)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IQTVideoSurface)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CQT9AllocatorPresenter::AllocSurfaces()
{
- HRESULT hr;
+ HRESULT hr;
- m_pVideoSurfaceOff = NULL;
+ m_pVideoSurfaceOff = NULL;
- if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(
- m_NativeVideoSize.cx, m_NativeVideoSize.cy, D3DFMT_X8R8G8B8,
- D3DPOOL_DEFAULT, &m_pVideoSurfaceOff, NULL))) {
- return hr;
- }
+ if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(
+ m_NativeVideoSize.cx, m_NativeVideoSize.cy, D3DFMT_X8R8G8B8,
+ D3DPOOL_DEFAULT, &m_pVideoSurfaceOff, NULL))) {
+ return hr;
+ }
- return __super::AllocSurfaces();
+ return __super::AllocSurfaces();
}
void CQT9AllocatorPresenter::DeleteSurfaces()
{
- m_pVideoSurfaceOff = NULL;
+ m_pVideoSurfaceOff = NULL;
- __super::DeleteSurfaces();
+ __super::DeleteSurfaces();
}
// IQTVideoSurface
STDMETHODIMP CQT9AllocatorPresenter::BeginBlt(const BITMAP& bm)
{
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_RenderLock);
- DeleteSurfaces();
- m_NativeVideoSize = m_AspectRatio = CSize(bm.bmWidth, abs(bm.bmHeight));
- if (FAILED(AllocSurfaces())) {
- return E_FAIL;
- }
- return S_OK;
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_RenderLock);
+ DeleteSurfaces();
+ m_NativeVideoSize = m_AspectRatio = CSize(bm.bmWidth, abs(bm.bmHeight));
+ if (FAILED(AllocSurfaces())) {
+ return E_FAIL;
+ }
+ return S_OK;
}
STDMETHODIMP CQT9AllocatorPresenter::DoBlt(const BITMAP& bm)
{
- if (!m_pVideoSurface || !m_pVideoSurfaceOff) {
- return E_FAIL;
- }
-
- bool fOk = false;
-
- D3DSURFACE_DESC d3dsd;
- ZeroMemory(&d3dsd, sizeof(d3dsd));
- if (FAILED(m_pVideoSurfaceOff->GetDesc(&d3dsd))) {
- return E_FAIL;
- }
-
- UINT w = (UINT)bm.bmWidth;
- UINT h = abs(bm.bmHeight);
- int bpp = bm.bmBitsPixel;
- int dbpp =
- d3dsd.Format == D3DFMT_R8G8B8 || d3dsd.Format == D3DFMT_X8R8G8B8 || d3dsd.Format == D3DFMT_A8R8G8B8 ? 32 :
- d3dsd.Format == D3DFMT_R5G6B5 ? 16 : 0;
-
- if ((bpp == 16 || bpp == 24 || bpp == 32) && w == d3dsd.Width && h == d3dsd.Height) {
- D3DLOCKED_RECT r;
- if (SUCCEEDED(m_pVideoSurfaceOff->LockRect(&r, NULL, 0))) {
- BitBltFromRGBToRGB(
- w, h,
- (BYTE*)r.pBits, r.Pitch, dbpp,
- (BYTE*)bm.bmBits, bm.bmWidthBytes, bm.bmBitsPixel);
- m_pVideoSurfaceOff->UnlockRect();
- fOk = true;
- }
- }
-
- if (!fOk) {
- m_pD3DDev->ColorFill(m_pVideoSurfaceOff, NULL, 0);
-
- HDC hDC;
- if (SUCCEEDED(m_pVideoSurfaceOff->GetDC(&hDC))) {
- CString str;
- str.Format(_T("Sorry, this color format is not supported"));
-
- SetBkColor(hDC, 0);
- SetTextColor(hDC, 0x404040);
- TextOut(hDC, 10, 10, str, str.GetLength());
-
- m_pVideoSurfaceOff->ReleaseDC(hDC);
- }
- }
-
- m_pD3DDev->StretchRect(m_pVideoSurfaceOff, NULL, m_pVideoSurface[m_nCurSurface], NULL, D3DTEXF_NONE);
-
- Paint(true);
-
- return S_OK;
+ if (!m_pVideoSurface || !m_pVideoSurfaceOff) {
+ return E_FAIL;
+ }
+
+ bool fOk = false;
+
+ D3DSURFACE_DESC d3dsd;
+ ZeroMemory(&d3dsd, sizeof(d3dsd));
+ if (FAILED(m_pVideoSurfaceOff->GetDesc(&d3dsd))) {
+ return E_FAIL;
+ }
+
+ UINT w = (UINT)bm.bmWidth;
+ UINT h = abs(bm.bmHeight);
+ int bpp = bm.bmBitsPixel;
+ int dbpp =
+ d3dsd.Format == D3DFMT_R8G8B8 || d3dsd.Format == D3DFMT_X8R8G8B8 || d3dsd.Format == D3DFMT_A8R8G8B8 ? 32 :
+ d3dsd.Format == D3DFMT_R5G6B5 ? 16 : 0;
+
+ if ((bpp == 16 || bpp == 24 || bpp == 32) && w == d3dsd.Width && h == d3dsd.Height) {
+ D3DLOCKED_RECT r;
+ if (SUCCEEDED(m_pVideoSurfaceOff->LockRect(&r, NULL, 0))) {
+ BitBltFromRGBToRGB(
+ w, h,
+ (BYTE*)r.pBits, r.Pitch, dbpp,
+ (BYTE*)bm.bmBits, bm.bmWidthBytes, bm.bmBitsPixel);
+ m_pVideoSurfaceOff->UnlockRect();
+ fOk = true;
+ }
+ }
+
+ if (!fOk) {
+ m_pD3DDev->ColorFill(m_pVideoSurfaceOff, NULL, 0);
+
+ HDC hDC;
+ if (SUCCEEDED(m_pVideoSurfaceOff->GetDC(&hDC))) {
+ CString str;
+ str.Format(_T("Sorry, this color format is not supported"));
+
+ SetBkColor(hDC, 0);
+ SetTextColor(hDC, 0x404040);
+ TextOut(hDC, 10, 10, str, str.GetLength());
+
+ m_pVideoSurfaceOff->ReleaseDC(hDC);
+ }
+ }
+
+ m_pD3DDev->StretchRect(m_pVideoSurfaceOff, NULL, m_pVideoSurface[m_nCurSurface], NULL, D3DTEXF_NONE);
+
+ Paint(true);
+
+ return S_OK;
}
diff --git a/src/filters/renderer/VideoRenderers/QT9AllocatorPresenter.h b/src/filters/renderer/VideoRenderers/QT9AllocatorPresenter.h
index 026ec54d1..f34bcb6b2 100644
--- a/src/filters/renderer/VideoRenderers/QT9AllocatorPresenter.h
+++ b/src/filters/renderer/VideoRenderers/QT9AllocatorPresenter.h
@@ -27,24 +27,24 @@
namespace DSObjects
{
- class CQT9AllocatorPresenter
- : public CDX9AllocatorPresenter
- , public IQTVideoSurface
- {
- CComPtr<IDirect3DSurface9> m_pVideoSurfaceOff;
+ class CQT9AllocatorPresenter
+ : public CDX9AllocatorPresenter
+ , public IQTVideoSurface
+ {
+ CComPtr<IDirect3DSurface9> m_pVideoSurfaceOff;
- protected:
- HRESULT AllocSurfaces();
- void DeleteSurfaces();
+ protected:
+ HRESULT AllocSurfaces();
+ void DeleteSurfaces();
- public:
- CQT9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString &_Error);
+ public:
+ CQT9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString& _Error);
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // IQTVideoSurface
- STDMETHODIMP BeginBlt(const BITMAP& bm);
- STDMETHODIMP DoBlt(const BITMAP& bm);
- };
+ // IQTVideoSurface
+ STDMETHODIMP BeginBlt(const BITMAP& bm);
+ STDMETHODIMP DoBlt(const BITMAP& bm);
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/RM7AllocatorPresenter.cpp b/src/filters/renderer/VideoRenderers/RM7AllocatorPresenter.cpp
index b4f5c4616..db8961f37 100644
--- a/src/filters/renderer/VideoRenderers/RM7AllocatorPresenter.cpp
+++ b/src/filters/renderer/VideoRenderers/RM7AllocatorPresenter.cpp
@@ -31,238 +31,238 @@ using namespace DSObjects;
//
CRM7AllocatorPresenter::CRM7AllocatorPresenter(HWND hWnd, HRESULT& hr)
- : CDX7AllocatorPresenter(hWnd, hr)
+ : CDX7AllocatorPresenter(hWnd, hr)
{
}
STDMETHODIMP CRM7AllocatorPresenter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI2(IRMAVideoSurface)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI2(IRMAVideoSurface)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CRM7AllocatorPresenter::AllocSurfaces()
{
- CAutoLock cAutoLock(this);
-
- m_pVideoSurfaceOff = NULL;
- m_pVideoSurfaceYUY2 = NULL;
-
- DDSURFACEDESC2 ddsd;
- DDBLTFX fx;
-
- INITDDSTRUCT(ddsd);
- ddsd.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
- ddsd.dwWidth = m_NativeVideoSize.cx;
- ddsd.dwHeight = m_NativeVideoSize.cy;
- ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
- ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
- ddsd.ddpfPixelFormat.dwRGBBitCount = 32;
- ddsd.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000;
- ddsd.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
- ddsd.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
- ddsd.ddpfPixelFormat.dwBBitMask = 0x000000FF;
-
- HRESULT hr = m_pDD->CreateSurface(&ddsd, &m_pVideoSurfaceOff, NULL);
- if (FAILED(hr)) {
- return E_FAIL;
- }
-
- INITDDSTRUCT(fx);
- fx.dwFillColor = 0;
- m_pVideoSurfaceOff->Blt(NULL, NULL, NULL, DDBLT_WAIT|DDBLT_COLORFILL, &fx);
-
- INITDDSTRUCT(ddsd);
- ddsd.dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
- ddsd.dwWidth = m_NativeVideoSize.cx;
- ddsd.dwHeight = m_NativeVideoSize.cy;
- ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
- ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC;
- ddsd.ddpfPixelFormat.dwYUVBitCount = 16;
- ddsd.ddpfPixelFormat.dwFourCC = '2YUY';
-
- hr = m_pDD->CreateSurface(&ddsd, &m_pVideoSurfaceYUY2, NULL);
-
- if (FAILED(m_pVideoSurfaceOff->Blt(NULL, m_pVideoSurfaceYUY2, NULL, DDBLT_WAIT, NULL))) {
- m_pVideoSurfaceYUY2 = NULL;
- }
-
- if (m_pVideoSurfaceYUY2) {
- INITDDSTRUCT(fx);
- fx.dwFillColor = 0x80108010;
- m_pVideoSurfaceYUY2->Blt(NULL, NULL, NULL, DDBLT_WAIT|DDBLT_COLORFILL, &fx);
- }
-
- return __super::AllocSurfaces();
+ CAutoLock cAutoLock(this);
+
+ m_pVideoSurfaceOff = NULL;
+ m_pVideoSurfaceYUY2 = NULL;
+
+ DDSURFACEDESC2 ddsd;
+ DDBLTFX fx;
+
+ INITDDSTRUCT(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
+ ddsd.dwWidth = m_NativeVideoSize.cx;
+ ddsd.dwHeight = m_NativeVideoSize.cy;
+ ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
+ ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB;
+ ddsd.ddpfPixelFormat.dwRGBBitCount = 32;
+ ddsd.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000;
+ ddsd.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
+ ddsd.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
+ ddsd.ddpfPixelFormat.dwBBitMask = 0x000000FF;
+
+ HRESULT hr = m_pDD->CreateSurface(&ddsd, &m_pVideoSurfaceOff, NULL);
+ if (FAILED(hr)) {
+ return E_FAIL;
+ }
+
+ INITDDSTRUCT(fx);
+ fx.dwFillColor = 0;
+ m_pVideoSurfaceOff->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &fx);
+
+ INITDDSTRUCT(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
+ ddsd.dwWidth = m_NativeVideoSize.cx;
+ ddsd.dwHeight = m_NativeVideoSize.cy;
+ ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
+ ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC;
+ ddsd.ddpfPixelFormat.dwYUVBitCount = 16;
+ ddsd.ddpfPixelFormat.dwFourCC = '2YUY';
+
+ hr = m_pDD->CreateSurface(&ddsd, &m_pVideoSurfaceYUY2, NULL);
+
+ if (FAILED(m_pVideoSurfaceOff->Blt(NULL, m_pVideoSurfaceYUY2, NULL, DDBLT_WAIT, NULL))) {
+ m_pVideoSurfaceYUY2 = NULL;
+ }
+
+ if (m_pVideoSurfaceYUY2) {
+ INITDDSTRUCT(fx);
+ fx.dwFillColor = 0x80108010;
+ m_pVideoSurfaceYUY2->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &fx);
+ }
+
+ return __super::AllocSurfaces();
}
void CRM7AllocatorPresenter::DeleteSurfaces()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- m_pVideoSurfaceOff = NULL;
- m_pVideoSurfaceYUY2 = NULL;
+ m_pVideoSurfaceOff = NULL;
+ m_pVideoSurfaceYUY2 = NULL;
- __super::DeleteSurfaces();
+ __super::DeleteSurfaces();
}
// IRMAVideoSurface
STDMETHODIMP CRM7AllocatorPresenter::Blt(UCHAR* pImageData, RMABitmapInfoHeader* pBitmapInfo, REF(PNxRect) inDestRect, REF(PNxRect) inSrcRect)
{
- if (!m_pVideoSurface || !m_pVideoSurfaceOff) {
- return E_FAIL;
- }
-
- bool fRGB = false;
- bool fYUY2 = false;
-
- CRect src((RECT*)&inSrcRect), dst((RECT*)&inDestRect), src2(CPoint(0,0), src.Size());
- if (src.Width() > dst.Width() || src.Height() > dst.Height()) {
- return E_FAIL;
- }
-
- DDSURFACEDESC2 ddsd;
-
- if (pBitmapInfo->biCompression == '024I') {
- DWORD pitch = pBitmapInfo->biWidth;
- DWORD size = pitch*abs(pBitmapInfo->biHeight);
-
- BYTE* y = pImageData + src.top*pitch + src.left;
- BYTE* u = pImageData + size + src.top*(pitch/2) + src.left/2;
- BYTE* v = pImageData + size + size/4 + src.top*(pitch/2) + src.left/2;
-
- if (m_pVideoSurfaceYUY2) {
- INITDDSTRUCT(ddsd);
- if (SUCCEEDED(m_pVideoSurfaceYUY2->Lock(src2, &ddsd, DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY, NULL))) {
- BitBltFromI420ToYUY2(src.Width(), src.Height(), (BYTE*)ddsd.lpSurface, ddsd.lPitch, y, u, v, pitch);
- m_pVideoSurfaceYUY2->Unlock(src2);
- fYUY2 = true;
- }
- } else {
- INITDDSTRUCT(ddsd);
- if (SUCCEEDED(m_pVideoSurfaceOff->Lock(src2, &ddsd, DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY, NULL))) {
- BitBltFromI420ToRGB(src.Width(), src.Height(), (BYTE*)ddsd.lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRGBBitCount, y, u, v, pitch);
- m_pVideoSurfaceOff->Unlock(src2);
- fRGB = true;
- }
- }
- } else if (pBitmapInfo->biCompression == '2YUY') {
- DWORD w = pBitmapInfo->biWidth;
- DWORD h = abs(pBitmapInfo->biHeight);
- DWORD pitch = pBitmapInfo->biWidth*2;
- UNREFERENCED_PARAMETER(w);
- UNREFERENCED_PARAMETER(h);
-
- BYTE* yvyu = pImageData + src.top*pitch + src.left*2;
-
- if (m_pVideoSurfaceYUY2) {
- INITDDSTRUCT(ddsd);
- if (SUCCEEDED(m_pVideoSurfaceYUY2->Lock(src2, &ddsd, DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY, NULL))) {
- BitBltFromYUY2ToYUY2(src.Width(), src.Height(), (BYTE*)ddsd.lpSurface, ddsd.lPitch, yvyu, pitch);
- m_pVideoSurfaceYUY2->Unlock(src2);
- fYUY2 = true;
- }
- } else {
- INITDDSTRUCT(ddsd);
- if (SUCCEEDED(m_pVideoSurfaceOff->Lock(src2, &ddsd, DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY, NULL))) {
- BitBltFromYUY2ToRGB(src.Width(), src.Height(), (BYTE*)ddsd.lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRGBBitCount, yvyu, pitch);
- m_pVideoSurfaceOff->Unlock(src2);
- fRGB = true;
- }
- }
- } else if (pBitmapInfo->biCompression == 0 || pBitmapInfo->biCompression == 3
- || pBitmapInfo->biCompression == 'BGRA') {
- DWORD w = pBitmapInfo->biWidth;
- DWORD h = abs(pBitmapInfo->biHeight);
- DWORD pitch = pBitmapInfo->biWidth*pBitmapInfo->biBitCount>>3;
- UNREFERENCED_PARAMETER(w);
- UNREFERENCED_PARAMETER(h);
-
- BYTE* rgb = pImageData + src.top*pitch + src.left*(pBitmapInfo->biBitCount>>3);
-
- INITDDSTRUCT(ddsd);
- if (SUCCEEDED(m_pVideoSurfaceOff->Lock(src2, &ddsd, DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY, NULL))) {
- BYTE* lpSurface = (BYTE*)ddsd.lpSurface;
- if (pBitmapInfo->biHeight > 0) {
- lpSurface += ddsd.lPitch*(src.Height()-1);
- ddsd.lPitch = -ddsd.lPitch;
- }
- BitBltFromRGBToRGB(src.Width(), src.Height(), lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRGBBitCount, rgb, pitch, pBitmapInfo->biBitCount);
- fRGB = true;
- m_pVideoSurfaceOff->Unlock(src2);
- }
- }
-
- if (!fRGB && !fYUY2) {
- DDBLTFX fx;
- INITDDSTRUCT(fx);
- fx.dwFillColor = 0;
- m_pVideoSurfaceOff->Blt(NULL, NULL, NULL, DDBLT_WAIT|DDBLT_COLORFILL, &fx);
-
- HDC hDC;
- if (SUCCEEDED(m_pVideoSurfaceOff->GetDC(&hDC))) {
- CString str;
- str.Format(_T("Sorry, this format is not supported"));
-
- SetBkColor(hDC, 0);
- SetTextColor(hDC, 0x404040);
- TextOut(hDC, 10, 10, str, str.GetLength());
-
- m_pVideoSurfaceOff->ReleaseDC(hDC);
-
- fRGB = true;
- }
- }
-
-
- HRESULT hr;
-
- if (fRGB) {
- hr = m_pVideoSurface->Blt(dst, m_pVideoSurfaceOff, src2, DDBLT_WAIT, NULL);
- }
- if (fYUY2) {
- hr = m_pVideoSurface->Blt(dst, m_pVideoSurfaceYUY2, src2, DDBLT_WAIT, NULL);
- }
-
- Paint(true);
-
- return PNR_OK;
+ if (!m_pVideoSurface || !m_pVideoSurfaceOff) {
+ return E_FAIL;
+ }
+
+ bool fRGB = false;
+ bool fYUY2 = false;
+
+ CRect src((RECT*)&inSrcRect), dst((RECT*)&inDestRect), src2(CPoint(0, 0), src.Size());
+ if (src.Width() > dst.Width() || src.Height() > dst.Height()) {
+ return E_FAIL;
+ }
+
+ DDSURFACEDESC2 ddsd;
+
+ if (pBitmapInfo->biCompression == '024I') {
+ DWORD pitch = pBitmapInfo->biWidth;
+ DWORD size = pitch * abs(pBitmapInfo->biHeight);
+
+ BYTE* y = pImageData + src.top * pitch + src.left;
+ BYTE* u = pImageData + size + src.top * (pitch / 2) + src.left / 2;
+ BYTE* v = pImageData + size + size / 4 + src.top * (pitch / 2) + src.left / 2;
+
+ if (m_pVideoSurfaceYUY2) {
+ INITDDSTRUCT(ddsd);
+ if (SUCCEEDED(m_pVideoSurfaceYUY2->Lock(src2, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY, NULL))) {
+ BitBltFromI420ToYUY2(src.Width(), src.Height(), (BYTE*)ddsd.lpSurface, ddsd.lPitch, y, u, v, pitch);
+ m_pVideoSurfaceYUY2->Unlock(src2);
+ fYUY2 = true;
+ }
+ } else {
+ INITDDSTRUCT(ddsd);
+ if (SUCCEEDED(m_pVideoSurfaceOff->Lock(src2, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY, NULL))) {
+ BitBltFromI420ToRGB(src.Width(), src.Height(), (BYTE*)ddsd.lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRGBBitCount, y, u, v, pitch);
+ m_pVideoSurfaceOff->Unlock(src2);
+ fRGB = true;
+ }
+ }
+ } else if (pBitmapInfo->biCompression == '2YUY') {
+ DWORD w = pBitmapInfo->biWidth;
+ DWORD h = abs(pBitmapInfo->biHeight);
+ DWORD pitch = pBitmapInfo->biWidth * 2;
+ UNREFERENCED_PARAMETER(w);
+ UNREFERENCED_PARAMETER(h);
+
+ BYTE* yvyu = pImageData + src.top * pitch + src.left * 2;
+
+ if (m_pVideoSurfaceYUY2) {
+ INITDDSTRUCT(ddsd);
+ if (SUCCEEDED(m_pVideoSurfaceYUY2->Lock(src2, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY, NULL))) {
+ BitBltFromYUY2ToYUY2(src.Width(), src.Height(), (BYTE*)ddsd.lpSurface, ddsd.lPitch, yvyu, pitch);
+ m_pVideoSurfaceYUY2->Unlock(src2);
+ fYUY2 = true;
+ }
+ } else {
+ INITDDSTRUCT(ddsd);
+ if (SUCCEEDED(m_pVideoSurfaceOff->Lock(src2, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY, NULL))) {
+ BitBltFromYUY2ToRGB(src.Width(), src.Height(), (BYTE*)ddsd.lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRGBBitCount, yvyu, pitch);
+ m_pVideoSurfaceOff->Unlock(src2);
+ fRGB = true;
+ }
+ }
+ } else if (pBitmapInfo->biCompression == 0 || pBitmapInfo->biCompression == 3
+ || pBitmapInfo->biCompression == 'BGRA') {
+ DWORD w = pBitmapInfo->biWidth;
+ DWORD h = abs(pBitmapInfo->biHeight);
+ DWORD pitch = pBitmapInfo->biWidth * pBitmapInfo->biBitCount >> 3;
+ UNREFERENCED_PARAMETER(w);
+ UNREFERENCED_PARAMETER(h);
+
+ BYTE* rgb = pImageData + src.top * pitch + src.left * (pBitmapInfo->biBitCount >> 3);
+
+ INITDDSTRUCT(ddsd);
+ if (SUCCEEDED(m_pVideoSurfaceOff->Lock(src2, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY, NULL))) {
+ BYTE* lpSurface = (BYTE*)ddsd.lpSurface;
+ if (pBitmapInfo->biHeight > 0) {
+ lpSurface += ddsd.lPitch * (src.Height() - 1);
+ ddsd.lPitch = -ddsd.lPitch;
+ }
+ BitBltFromRGBToRGB(src.Width(), src.Height(), lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRGBBitCount, rgb, pitch, pBitmapInfo->biBitCount);
+ fRGB = true;
+ m_pVideoSurfaceOff->Unlock(src2);
+ }
+ }
+
+ if (!fRGB && !fYUY2) {
+ DDBLTFX fx;
+ INITDDSTRUCT(fx);
+ fx.dwFillColor = 0;
+ m_pVideoSurfaceOff->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &fx);
+
+ HDC hDC;
+ if (SUCCEEDED(m_pVideoSurfaceOff->GetDC(&hDC))) {
+ CString str;
+ str.Format(_T("Sorry, this format is not supported"));
+
+ SetBkColor(hDC, 0);
+ SetTextColor(hDC, 0x404040);
+ TextOut(hDC, 10, 10, str, str.GetLength());
+
+ m_pVideoSurfaceOff->ReleaseDC(hDC);
+
+ fRGB = true;
+ }
+ }
+
+
+ HRESULT hr;
+
+ if (fRGB) {
+ hr = m_pVideoSurface->Blt(dst, m_pVideoSurfaceOff, src2, DDBLT_WAIT, NULL);
+ }
+ if (fYUY2) {
+ hr = m_pVideoSurface->Blt(dst, m_pVideoSurfaceYUY2, src2, DDBLT_WAIT, NULL);
+ }
+
+ Paint(true);
+
+ return PNR_OK;
}
STDMETHODIMP CRM7AllocatorPresenter::BeginOptimizedBlt(RMABitmapInfoHeader* pBitmapInfo)
{
- CAutoLock cAutoLock(this);
- DeleteSurfaces();
- m_NativeVideoSize = m_AspectRatio = CSize(pBitmapInfo->biWidth, abs(pBitmapInfo->biHeight));
- if (FAILED(AllocSurfaces())) {
- return E_FAIL;
- }
- return PNR_NOTIMPL;
+ CAutoLock cAutoLock(this);
+ DeleteSurfaces();
+ m_NativeVideoSize = m_AspectRatio = CSize(pBitmapInfo->biWidth, abs(pBitmapInfo->biHeight));
+ if (FAILED(AllocSurfaces())) {
+ return E_FAIL;
+ }
+ return PNR_NOTIMPL;
}
STDMETHODIMP CRM7AllocatorPresenter::OptimizedBlt(UCHAR* pImageBits, REF(PNxRect) rDestRect, REF(PNxRect) rSrcRect)
{
- return PNR_NOTIMPL;
+ return PNR_NOTIMPL;
}
STDMETHODIMP CRM7AllocatorPresenter::EndOptimizedBlt()
{
- return PNR_NOTIMPL;
+ return PNR_NOTIMPL;
}
STDMETHODIMP CRM7AllocatorPresenter::GetOptimizedFormat(REF(RMA_COMPRESSION_TYPE) ulType)
{
- return PNR_NOTIMPL;
+ return PNR_NOTIMPL;
}
STDMETHODIMP CRM7AllocatorPresenter::GetPreferredFormat(REF(RMA_COMPRESSION_TYPE) ulType)
{
- ulType = RMA_I420;
- return PNR_OK;
+ ulType = RMA_I420;
+ return PNR_OK;
}
diff --git a/src/filters/renderer/VideoRenderers/RM7AllocatorPresenter.h b/src/filters/renderer/VideoRenderers/RM7AllocatorPresenter.h
index a84bf49e9..998181f6e 100644
--- a/src/filters/renderer/VideoRenderers/RM7AllocatorPresenter.h
+++ b/src/filters/renderer/VideoRenderers/RM7AllocatorPresenter.h
@@ -32,33 +32,33 @@
namespace DSObjects
{
- class CRM7AllocatorPresenter
- : public CDX7AllocatorPresenter
- , public IRMAVideoSurface
- {
- CComPtr<IDirectDrawSurface7> m_pVideoSurfaceOff;
- CComPtr<IDirectDrawSurface7> m_pVideoSurfaceYUY2;
+ class CRM7AllocatorPresenter
+ : public CDX7AllocatorPresenter
+ , public IRMAVideoSurface
+ {
+ CComPtr<IDirectDrawSurface7> m_pVideoSurfaceOff;
+ CComPtr<IDirectDrawSurface7> m_pVideoSurfaceYUY2;
- RMABitmapInfoHeader m_bitmapInfo;
- RMABitmapInfoHeader m_lastBitmapInfo;
+ RMABitmapInfoHeader m_bitmapInfo;
+ RMABitmapInfoHeader m_lastBitmapInfo;
- protected:
- HRESULT AllocSurfaces();
- void DeleteSurfaces();
+ protected:
+ HRESULT AllocSurfaces();
+ void DeleteSurfaces();
- public:
- CRM7AllocatorPresenter(HWND hWnd, HRESULT& hr);
+ public:
+ CRM7AllocatorPresenter(HWND hWnd, HRESULT& hr);
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // IRMAVideoSurface
- STDMETHODIMP Blt(UCHAR* pImageData, RMABitmapInfoHeader* pBitmapInfo, REF(PNxRect) inDestRect, REF(PNxRect) inSrcRect);
- STDMETHODIMP BeginOptimizedBlt(RMABitmapInfoHeader* pBitmapInfo);
- STDMETHODIMP OptimizedBlt(UCHAR* pImageBits, REF(PNxRect) rDestRect, REF(PNxRect) rSrcRect);
- STDMETHODIMP EndOptimizedBlt();
- STDMETHODIMP GetOptimizedFormat(REF(RMA_COMPRESSION_TYPE) ulType);
- STDMETHODIMP GetPreferredFormat(REF(RMA_COMPRESSION_TYPE) ulType);
- };
+ // IRMAVideoSurface
+ STDMETHODIMP Blt(UCHAR* pImageData, RMABitmapInfoHeader* pBitmapInfo, REF(PNxRect) inDestRect, REF(PNxRect) inSrcRect);
+ STDMETHODIMP BeginOptimizedBlt(RMABitmapInfoHeader* pBitmapInfo);
+ STDMETHODIMP OptimizedBlt(UCHAR* pImageBits, REF(PNxRect) rDestRect, REF(PNxRect) rSrcRect);
+ STDMETHODIMP EndOptimizedBlt();
+ STDMETHODIMP GetOptimizedFormat(REF(RMA_COMPRESSION_TYPE) ulType);
+ STDMETHODIMP GetPreferredFormat(REF(RMA_COMPRESSION_TYPE) ulType);
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/RM9AllocatorPresenter.cpp b/src/filters/renderer/VideoRenderers/RM9AllocatorPresenter.cpp
index 579c6a5cb..37cff11f8 100644
--- a/src/filters/renderer/VideoRenderers/RM9AllocatorPresenter.cpp
+++ b/src/filters/renderer/VideoRenderers/RM9AllocatorPresenter.cpp
@@ -29,217 +29,217 @@ using namespace DSObjects;
// CRM9AllocatorPresenter
//
-CRM9AllocatorPresenter::CRM9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString &_Error)
- : CDX9AllocatorPresenter(hWnd, bFullscreen, hr, false, _Error)
+CRM9AllocatorPresenter::CRM9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString& _Error)
+ : CDX9AllocatorPresenter(hWnd, bFullscreen, hr, false, _Error)
{
}
STDMETHODIMP CRM9AllocatorPresenter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI2(IRMAVideoSurface)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI2(IRMAVideoSurface)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CRM9AllocatorPresenter::AllocSurfaces()
{
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_RenderLock);
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_RenderLock);
- m_pVideoSurfaceOff = NULL;
- m_pVideoSurfaceYUY2 = NULL;
+ m_pVideoSurfaceOff = NULL;
+ m_pVideoSurfaceYUY2 = NULL;
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(
- m_NativeVideoSize.cx, m_NativeVideoSize.cy, D3DFMT_X8R8G8B8,
- D3DPOOL_DEFAULT, &m_pVideoSurfaceOff, NULL))) {
- return hr;
- }
+ if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(
+ m_NativeVideoSize.cx, m_NativeVideoSize.cy, D3DFMT_X8R8G8B8,
+ D3DPOOL_DEFAULT, &m_pVideoSurfaceOff, NULL))) {
+ return hr;
+ }
- m_pD3DDev->ColorFill(m_pVideoSurfaceOff, NULL, 0);
+ m_pD3DDev->ColorFill(m_pVideoSurfaceOff, NULL, 0);
- if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(
- m_NativeVideoSize.cx, m_NativeVideoSize.cy, D3DFMT_YUY2,
- D3DPOOL_DEFAULT, &m_pVideoSurfaceYUY2, NULL))) {
- m_pVideoSurfaceYUY2 = NULL;
- }
+ if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(
+ m_NativeVideoSize.cx, m_NativeVideoSize.cy, D3DFMT_YUY2,
+ D3DPOOL_DEFAULT, &m_pVideoSurfaceYUY2, NULL))) {
+ m_pVideoSurfaceYUY2 = NULL;
+ }
- if (m_pVideoSurfaceYUY2) {
- m_pD3DDev->ColorFill(m_pVideoSurfaceOff, NULL, 0x80108010);
- }
+ if (m_pVideoSurfaceYUY2) {
+ m_pD3DDev->ColorFill(m_pVideoSurfaceOff, NULL, 0x80108010);
+ }
- return __super::AllocSurfaces();
+ return __super::AllocSurfaces();
}
void CRM9AllocatorPresenter::DeleteSurfaces()
{
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_RenderLock);
- m_pVideoSurfaceOff = NULL;
- m_pVideoSurfaceYUY2 = NULL;
- __super::DeleteSurfaces();
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_RenderLock);
+ m_pVideoSurfaceOff = NULL;
+ m_pVideoSurfaceYUY2 = NULL;
+ __super::DeleteSurfaces();
}
// IRMAVideoSurface
STDMETHODIMP CRM9AllocatorPresenter::Blt(UCHAR* pImageData, RMABitmapInfoHeader* pBitmapInfo, REF(PNxRect) inDestRect, REF(PNxRect) inSrcRect)
{
- if (!m_pVideoSurface || !m_pVideoSurfaceOff) {
- return E_FAIL;
- }
-
- bool fRGB = false;
- bool fYUY2 = false;
-
- CRect src((RECT*)&inSrcRect), dst((RECT*)&inDestRect), src2(CPoint(0,0), src.Size());
- if (src.Width() > dst.Width() || src.Height() > dst.Height()) {
- return E_FAIL;
- }
-
- D3DSURFACE_DESC d3dsd;
- ZeroMemory(&d3dsd, sizeof(d3dsd));
- if (FAILED(m_pVideoSurfaceOff->GetDesc(&d3dsd))) {
- return E_FAIL;
- }
-
- int dbpp =
- d3dsd.Format == D3DFMT_R8G8B8 || d3dsd.Format == D3DFMT_X8R8G8B8 || d3dsd.Format == D3DFMT_A8R8G8B8 ? 32 :
- d3dsd.Format == D3DFMT_R5G6B5 ? 16 : 0;
-
- if (pBitmapInfo->biCompression == '024I') {
- DWORD pitch = pBitmapInfo->biWidth;
- DWORD size = pitch*abs(pBitmapInfo->biHeight);
-
- BYTE* y = pImageData + src.top*pitch + src.left;
- BYTE* u = pImageData + size + src.top*(pitch/2) + src.left/2;
- BYTE* v = pImageData + size + size/4 + src.top*(pitch/2) + src.left/2;
-
- if (m_pVideoSurfaceYUY2) {
- D3DLOCKED_RECT r;
- if (SUCCEEDED(m_pVideoSurfaceYUY2->LockRect(&r, src2, 0))) {
- BitBltFromI420ToYUY2(src.Width(), src.Height(), (BYTE*)r.pBits, r.Pitch, y, u, v, pitch);
- m_pVideoSurfaceYUY2->UnlockRect();
- fYUY2 = true;
- }
- } else {
- D3DLOCKED_RECT r;
- if (SUCCEEDED(m_pVideoSurfaceOff->LockRect(&r, src2, 0))) {
- BitBltFromI420ToRGB(src.Width(), src.Height(), (BYTE*)r.pBits, r.Pitch, dbpp, y, u, v, pitch);
- m_pVideoSurfaceOff->UnlockRect();
- fRGB = true;
- }
- }
- } else if (pBitmapInfo->biCompression == '2YUY') {
- DWORD w = pBitmapInfo->biWidth;
- DWORD h = abs(pBitmapInfo->biHeight);
- DWORD pitch = pBitmapInfo->biWidth*2;
- UNREFERENCED_PARAMETER(w);
- UNREFERENCED_PARAMETER(h);
-
- BYTE* yvyu = pImageData + src.top*pitch + src.left*2;
-
- if (m_pVideoSurfaceYUY2) {
- D3DLOCKED_RECT r;
- if (SUCCEEDED(m_pVideoSurfaceYUY2->LockRect(&r, src2, 0))) {
- BitBltFromYUY2ToYUY2(src.Width(), src.Height(), (BYTE*)r.pBits, r.Pitch, yvyu, pitch);
- m_pVideoSurfaceYUY2->UnlockRect();
- fYUY2 = true;
- }
- } else {
- D3DLOCKED_RECT r;
- if (SUCCEEDED(m_pVideoSurfaceOff->LockRect(&r, src2, 0))) {
- BitBltFromYUY2ToRGB(src.Width(), src.Height(), (BYTE*)r.pBits, r.Pitch, dbpp, yvyu, pitch);
- m_pVideoSurfaceOff->UnlockRect();
- fRGB = true;
- }
- }
- } else if (pBitmapInfo->biCompression == 0 || pBitmapInfo->biCompression == 3
- || pBitmapInfo->biCompression == 'BGRA') {
- DWORD w = pBitmapInfo->biWidth;
- DWORD h = abs(pBitmapInfo->biHeight);
- DWORD pitch = pBitmapInfo->biWidth*pBitmapInfo->biBitCount>>3;
- UNREFERENCED_PARAMETER(w);
- UNREFERENCED_PARAMETER(h);
-
- BYTE* rgb = pImageData + src.top*pitch + src.left*(pBitmapInfo->biBitCount>>3);
-
- D3DLOCKED_RECT r;
- if (SUCCEEDED(m_pVideoSurfaceOff->LockRect(&r, src2, 0))) {
- BYTE* pBits = (BYTE*)r.pBits;
- if (pBitmapInfo->biHeight > 0) {
- pBits += r.Pitch*(src.Height()-1);
- r.Pitch = -r.Pitch;
- }
- BitBltFromRGBToRGB(src.Width(), src.Height(), pBits, r.Pitch, dbpp, rgb, pitch, pBitmapInfo->biBitCount);
- m_pVideoSurfaceOff->UnlockRect();
- fRGB = true;
- }
- }
-
- if (!fRGB && !fYUY2) {
- m_pD3DDev->ColorFill(m_pVideoSurfaceOff, NULL, 0);
-
- HDC hDC;
- if (SUCCEEDED(m_pVideoSurfaceOff->GetDC(&hDC))) {
- CString str;
- str.Format(_T("Sorry, this format is not supported"));
-
- SetBkColor(hDC, 0);
- SetTextColor(hDC, 0x404040);
- TextOut(hDC, 10, 10, str, str.GetLength());
-
- m_pVideoSurfaceOff->ReleaseDC(hDC);
-
- fRGB = true;
- }
- }
-
- HRESULT hr;
-
- if (fRGB) {
- hr = m_pD3DDev->StretchRect(m_pVideoSurfaceOff, src2, m_pVideoSurface[m_nCurSurface], dst, D3DTEXF_NONE);
- }
- if (fYUY2) {
- hr = m_pD3DDev->StretchRect(m_pVideoSurfaceYUY2, src2, m_pVideoSurface[m_nCurSurface], dst, D3DTEXF_NONE);
- }
-
- Paint(true);
-
- return PNR_OK;
+ if (!m_pVideoSurface || !m_pVideoSurfaceOff) {
+ return E_FAIL;
+ }
+
+ bool fRGB = false;
+ bool fYUY2 = false;
+
+ CRect src((RECT*)&inSrcRect), dst((RECT*)&inDestRect), src2(CPoint(0, 0), src.Size());
+ if (src.Width() > dst.Width() || src.Height() > dst.Height()) {
+ return E_FAIL;
+ }
+
+ D3DSURFACE_DESC d3dsd;
+ ZeroMemory(&d3dsd, sizeof(d3dsd));
+ if (FAILED(m_pVideoSurfaceOff->GetDesc(&d3dsd))) {
+ return E_FAIL;
+ }
+
+ int dbpp =
+ d3dsd.Format == D3DFMT_R8G8B8 || d3dsd.Format == D3DFMT_X8R8G8B8 || d3dsd.Format == D3DFMT_A8R8G8B8 ? 32 :
+ d3dsd.Format == D3DFMT_R5G6B5 ? 16 : 0;
+
+ if (pBitmapInfo->biCompression == '024I') {
+ DWORD pitch = pBitmapInfo->biWidth;
+ DWORD size = pitch * abs(pBitmapInfo->biHeight);
+
+ BYTE* y = pImageData + src.top * pitch + src.left;
+ BYTE* u = pImageData + size + src.top * (pitch / 2) + src.left / 2;
+ BYTE* v = pImageData + size + size / 4 + src.top * (pitch / 2) + src.left / 2;
+
+ if (m_pVideoSurfaceYUY2) {
+ D3DLOCKED_RECT r;
+ if (SUCCEEDED(m_pVideoSurfaceYUY2->LockRect(&r, src2, 0))) {
+ BitBltFromI420ToYUY2(src.Width(), src.Height(), (BYTE*)r.pBits, r.Pitch, y, u, v, pitch);
+ m_pVideoSurfaceYUY2->UnlockRect();
+ fYUY2 = true;
+ }
+ } else {
+ D3DLOCKED_RECT r;
+ if (SUCCEEDED(m_pVideoSurfaceOff->LockRect(&r, src2, 0))) {
+ BitBltFromI420ToRGB(src.Width(), src.Height(), (BYTE*)r.pBits, r.Pitch, dbpp, y, u, v, pitch);
+ m_pVideoSurfaceOff->UnlockRect();
+ fRGB = true;
+ }
+ }
+ } else if (pBitmapInfo->biCompression == '2YUY') {
+ DWORD w = pBitmapInfo->biWidth;
+ DWORD h = abs(pBitmapInfo->biHeight);
+ DWORD pitch = pBitmapInfo->biWidth * 2;
+ UNREFERENCED_PARAMETER(w);
+ UNREFERENCED_PARAMETER(h);
+
+ BYTE* yvyu = pImageData + src.top * pitch + src.left * 2;
+
+ if (m_pVideoSurfaceYUY2) {
+ D3DLOCKED_RECT r;
+ if (SUCCEEDED(m_pVideoSurfaceYUY2->LockRect(&r, src2, 0))) {
+ BitBltFromYUY2ToYUY2(src.Width(), src.Height(), (BYTE*)r.pBits, r.Pitch, yvyu, pitch);
+ m_pVideoSurfaceYUY2->UnlockRect();
+ fYUY2 = true;
+ }
+ } else {
+ D3DLOCKED_RECT r;
+ if (SUCCEEDED(m_pVideoSurfaceOff->LockRect(&r, src2, 0))) {
+ BitBltFromYUY2ToRGB(src.Width(), src.Height(), (BYTE*)r.pBits, r.Pitch, dbpp, yvyu, pitch);
+ m_pVideoSurfaceOff->UnlockRect();
+ fRGB = true;
+ }
+ }
+ } else if (pBitmapInfo->biCompression == 0 || pBitmapInfo->biCompression == 3
+ || pBitmapInfo->biCompression == 'BGRA') {
+ DWORD w = pBitmapInfo->biWidth;
+ DWORD h = abs(pBitmapInfo->biHeight);
+ DWORD pitch = pBitmapInfo->biWidth * pBitmapInfo->biBitCount >> 3;
+ UNREFERENCED_PARAMETER(w);
+ UNREFERENCED_PARAMETER(h);
+
+ BYTE* rgb = pImageData + src.top * pitch + src.left * (pBitmapInfo->biBitCount >> 3);
+
+ D3DLOCKED_RECT r;
+ if (SUCCEEDED(m_pVideoSurfaceOff->LockRect(&r, src2, 0))) {
+ BYTE* pBits = (BYTE*)r.pBits;
+ if (pBitmapInfo->biHeight > 0) {
+ pBits += r.Pitch * (src.Height() - 1);
+ r.Pitch = -r.Pitch;
+ }
+ BitBltFromRGBToRGB(src.Width(), src.Height(), pBits, r.Pitch, dbpp, rgb, pitch, pBitmapInfo->biBitCount);
+ m_pVideoSurfaceOff->UnlockRect();
+ fRGB = true;
+ }
+ }
+
+ if (!fRGB && !fYUY2) {
+ m_pD3DDev->ColorFill(m_pVideoSurfaceOff, NULL, 0);
+
+ HDC hDC;
+ if (SUCCEEDED(m_pVideoSurfaceOff->GetDC(&hDC))) {
+ CString str;
+ str.Format(_T("Sorry, this format is not supported"));
+
+ SetBkColor(hDC, 0);
+ SetTextColor(hDC, 0x404040);
+ TextOut(hDC, 10, 10, str, str.GetLength());
+
+ m_pVideoSurfaceOff->ReleaseDC(hDC);
+
+ fRGB = true;
+ }
+ }
+
+ HRESULT hr;
+
+ if (fRGB) {
+ hr = m_pD3DDev->StretchRect(m_pVideoSurfaceOff, src2, m_pVideoSurface[m_nCurSurface], dst, D3DTEXF_NONE);
+ }
+ if (fYUY2) {
+ hr = m_pD3DDev->StretchRect(m_pVideoSurfaceYUY2, src2, m_pVideoSurface[m_nCurSurface], dst, D3DTEXF_NONE);
+ }
+
+ Paint(true);
+
+ return PNR_OK;
}
STDMETHODIMP CRM9AllocatorPresenter::BeginOptimizedBlt(RMABitmapInfoHeader* pBitmapInfo)
{
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_RenderLock);
- DeleteSurfaces();
- m_NativeVideoSize = m_AspectRatio = CSize(pBitmapInfo->biWidth, abs(pBitmapInfo->biHeight));
- if (FAILED(AllocSurfaces())) {
- return E_FAIL;
- }
- return PNR_NOTIMPL;
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_RenderLock);
+ DeleteSurfaces();
+ m_NativeVideoSize = m_AspectRatio = CSize(pBitmapInfo->biWidth, abs(pBitmapInfo->biHeight));
+ if (FAILED(AllocSurfaces())) {
+ return E_FAIL;
+ }
+ return PNR_NOTIMPL;
}
STDMETHODIMP CRM9AllocatorPresenter::OptimizedBlt(UCHAR* pImageBits, REF(PNxRect) rDestRect, REF(PNxRect) rSrcRect)
{
- return PNR_NOTIMPL;
+ return PNR_NOTIMPL;
}
STDMETHODIMP CRM9AllocatorPresenter::EndOptimizedBlt()
{
- return PNR_NOTIMPL;
+ return PNR_NOTIMPL;
}
STDMETHODIMP CRM9AllocatorPresenter::GetOptimizedFormat(REF(RMA_COMPRESSION_TYPE) ulType)
{
- return PNR_NOTIMPL;
+ return PNR_NOTIMPL;
}
STDMETHODIMP CRM9AllocatorPresenter::GetPreferredFormat(REF(RMA_COMPRESSION_TYPE) ulType)
{
- ulType = RMA_I420;
- return PNR_OK;
+ ulType = RMA_I420;
+ return PNR_OK;
}
diff --git a/src/filters/renderer/VideoRenderers/RM9AllocatorPresenter.h b/src/filters/renderer/VideoRenderers/RM9AllocatorPresenter.h
index 8536c3d44..859b04282 100644
--- a/src/filters/renderer/VideoRenderers/RM9AllocatorPresenter.h
+++ b/src/filters/renderer/VideoRenderers/RM9AllocatorPresenter.h
@@ -31,32 +31,32 @@
namespace DSObjects
{
- class CRM9AllocatorPresenter
- : public CDX9AllocatorPresenter
- , public IRMAVideoSurface
- {
- CComPtr<IDirect3DSurface9> m_pVideoSurfaceOff;
- CComPtr<IDirect3DSurface9> m_pVideoSurfaceYUY2;
-
- RMABitmapInfoHeader m_bitmapInfo;
- RMABitmapInfoHeader m_lastBitmapInfo;
-
- protected:
- HRESULT AllocSurfaces();
- void DeleteSurfaces();
-
- public:
- CRM9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString &_Error);
-
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- // IRMAVideoSurface
- STDMETHODIMP Blt(UCHAR* pImageData, RMABitmapInfoHeader* pBitmapInfo, REF(PNxRect) inDestRect, REF(PNxRect) inSrcRect);
- STDMETHODIMP BeginOptimizedBlt(RMABitmapInfoHeader* pBitmapInfo);
- STDMETHODIMP OptimizedBlt(UCHAR* pImageBits, REF(PNxRect) rDestRect, REF(PNxRect) rSrcRect);
- STDMETHODIMP EndOptimizedBlt();
- STDMETHODIMP GetOptimizedFormat(REF(RMA_COMPRESSION_TYPE) ulType);
- STDMETHODIMP GetPreferredFormat(REF(RMA_COMPRESSION_TYPE) ulType);
- };
+ class CRM9AllocatorPresenter
+ : public CDX9AllocatorPresenter
+ , public IRMAVideoSurface
+ {
+ CComPtr<IDirect3DSurface9> m_pVideoSurfaceOff;
+ CComPtr<IDirect3DSurface9> m_pVideoSurfaceYUY2;
+
+ RMABitmapInfoHeader m_bitmapInfo;
+ RMABitmapInfoHeader m_lastBitmapInfo;
+
+ protected:
+ HRESULT AllocSurfaces();
+ void DeleteSurfaces();
+
+ public:
+ CRM9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString& _Error);
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ // IRMAVideoSurface
+ STDMETHODIMP Blt(UCHAR* pImageData, RMABitmapInfoHeader* pBitmapInfo, REF(PNxRect) inDestRect, REF(PNxRect) inSrcRect);
+ STDMETHODIMP BeginOptimizedBlt(RMABitmapInfoHeader* pBitmapInfo);
+ STDMETHODIMP OptimizedBlt(UCHAR* pImageBits, REF(PNxRect) rDestRect, REF(PNxRect) rSrcRect);
+ STDMETHODIMP EndOptimizedBlt();
+ STDMETHODIMP GetOptimizedFormat(REF(RMA_COMPRESSION_TYPE) ulType);
+ STDMETHODIMP GetPreferredFormat(REF(RMA_COMPRESSION_TYPE) ulType);
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/RenderersSettings.cpp b/src/filters/renderer/VideoRenderers/RenderersSettings.cpp
index 181724a36..40db3b7a5 100644
--- a/src/filters/renderer/VideoRenderers/RenderersSettings.cpp
+++ b/src/filters/renderer/VideoRenderers/RenderersSettings.cpp
@@ -29,75 +29,75 @@
void CRenderersSettings::UpdateData(bool fSave)
{
- AfxGetAppSettings().UpdateRenderersData(fSave);
+ AfxGetAppSettings().UpdateRenderersData(fSave);
}
void CRenderersSettings::CRendererSettingsShared::SetDefault()
{
- fVMR9AlterativeVSync = 0;
- iVMR9VSyncOffset = 0;
- iVMR9VSyncAccurate = 1;
- iVMR9FullscreenGUISupport = 0;
- iVMR9VSync = 1;
- iVMR9FullFloatingPointProcessing = 0;
- iVMR9HalfFloatingPointProcessing = 0;
- iVMR9ColorManagementEnable = 0;
- iVMR9ColorManagementInput = VIDEO_SYSTEM_UNKNOWN;
- iVMR9ColorManagementAmbientLight = AMBIENT_LIGHT_BRIGHT;
- iVMR9ColorManagementIntent = COLOR_RENDERING_INTENT_PERCEPTUAL;
- iVMRDisableDesktopComposition = 0;
- iVMRFlushGPUBeforeVSync = 1;
- iVMRFlushGPUAfterPresent = 1;
- iVMRFlushGPUWait = 0;
- bSynchronizeVideo = 0;
- bSynchronizeDisplay = 0;
- bSynchronizeNearest = 1;
- iLineDelta = 0;
- iColumnDelta = 0;
- fCycleDelta = 0.0012;
- fTargetSyncOffset = 12.0;
- fControlLimit = 2.0;
+ fVMR9AlterativeVSync = 0;
+ iVMR9VSyncOffset = 0;
+ iVMR9VSyncAccurate = 1;
+ iVMR9FullscreenGUISupport = 0;
+ iVMR9VSync = 1;
+ iVMR9FullFloatingPointProcessing = 0;
+ iVMR9HalfFloatingPointProcessing = 0;
+ iVMR9ColorManagementEnable = 0;
+ iVMR9ColorManagementInput = VIDEO_SYSTEM_UNKNOWN;
+ iVMR9ColorManagementAmbientLight = AMBIENT_LIGHT_BRIGHT;
+ iVMR9ColorManagementIntent = COLOR_RENDERING_INTENT_PERCEPTUAL;
+ iVMRDisableDesktopComposition = 0;
+ iVMRFlushGPUBeforeVSync = 1;
+ iVMRFlushGPUAfterPresent = 1;
+ iVMRFlushGPUWait = 0;
+ bSynchronizeVideo = 0;
+ bSynchronizeDisplay = 0;
+ bSynchronizeNearest = 1;
+ iLineDelta = 0;
+ iColumnDelta = 0;
+ fCycleDelta = 0.0012;
+ fTargetSyncOffset = 12.0;
+ fControlLimit = 2.0;
}
void CRenderersSettings::CRendererSettingsShared::SetOptimal()
{
- fVMR9AlterativeVSync = 1;
- iVMR9VSyncAccurate = 1;
- iVMR9VSync = 1;
- iVMR9FullFloatingPointProcessing = 1;
- iVMR9HalfFloatingPointProcessing = 0;
- iVMR9ColorManagementEnable = 0;
- iVMR9ColorManagementInput = VIDEO_SYSTEM_UNKNOWN;
- iVMR9ColorManagementAmbientLight = AMBIENT_LIGHT_BRIGHT;
- iVMR9ColorManagementIntent = COLOR_RENDERING_INTENT_PERCEPTUAL;
- iVMRDisableDesktopComposition = 1;
- iVMRFlushGPUBeforeVSync = 1;
- iVMRFlushGPUAfterPresent = 1;
- iVMRFlushGPUWait = 0;
- bSynchronizeVideo = 0;
- bSynchronizeDisplay = 0;
- bSynchronizeNearest = 1;
- iLineDelta = 0;
- iColumnDelta = 0;
- fCycleDelta = 0.0012;
- fTargetSyncOffset = 12.0;
- fControlLimit = 2.0;
+ fVMR9AlterativeVSync = 1;
+ iVMR9VSyncAccurate = 1;
+ iVMR9VSync = 1;
+ iVMR9FullFloatingPointProcessing = 1;
+ iVMR9HalfFloatingPointProcessing = 0;
+ iVMR9ColorManagementEnable = 0;
+ iVMR9ColorManagementInput = VIDEO_SYSTEM_UNKNOWN;
+ iVMR9ColorManagementAmbientLight = AMBIENT_LIGHT_BRIGHT;
+ iVMR9ColorManagementIntent = COLOR_RENDERING_INTENT_PERCEPTUAL;
+ iVMRDisableDesktopComposition = 1;
+ iVMRFlushGPUBeforeVSync = 1;
+ iVMRFlushGPUAfterPresent = 1;
+ iVMRFlushGPUWait = 0;
+ bSynchronizeVideo = 0;
+ bSynchronizeDisplay = 0;
+ bSynchronizeNearest = 1;
+ iLineDelta = 0;
+ iColumnDelta = 0;
+ fCycleDelta = 0.0012;
+ fTargetSyncOffset = 12.0;
+ fControlLimit = 2.0;
}
void CRenderersSettings::CRendererSettingsEVR::SetDefault()
{
- CRendererSettingsShared::SetDefault();
- iEVRHighColorResolution = 0;
- iEVRForceInputHighColorResolution = 0;
- iEVREnableFrameTimeCorrection = 0;
- iEVROutputRange = 0;
+ CRendererSettingsShared::SetDefault();
+ iEVRHighColorResolution = 0;
+ iEVRForceInputHighColorResolution = 0;
+ iEVREnableFrameTimeCorrection = 0;
+ iEVROutputRange = 0;
}
void CRenderersSettings::CRendererSettingsEVR::SetOptimal()
{
- CRendererSettingsShared::SetOptimal();
- iEVRHighColorResolution = 0;
- iEVRForceInputHighColorResolution = 0;
+ CRendererSettingsShared::SetOptimal();
+ iEVRHighColorResolution = 0;
+ iEVRForceInputHighColorResolution = 0;
}
/////////////////////////////////////////////////////////////////////////////
@@ -105,30 +105,30 @@ void CRenderersSettings::CRendererSettingsEVR::SetOptimal()
CRenderersData::CRenderersData()
{
- m_fTearingTest = false;
- m_fDisplayStats = false;
- m_bResetStats = false;
- m_hD3DX9Dll = NULL;
- m_nDXSdkRelease = 0;
+ m_fTearingTest = false;
+ m_fDisplayStats = false;
+ m_bResetStats = false;
+ m_hD3DX9Dll = NULL;
+ m_nDXSdkRelease = 0;
- // Don't disable hardware features before initializing a renderer
- m_bFP16Support = true;
- m_b10bitSupport = true;
+ // Don't disable hardware features before initializing a renderer
+ m_bFP16Support = true;
+ m_b10bitSupport = true;
}
LONGLONG CRenderersData::GetPerfCounter()
{
- LARGE_INTEGER i64Ticks100ns;
- LARGE_INTEGER llPerfFrequency;
+ LARGE_INTEGER i64Ticks100ns;
+ LARGE_INTEGER llPerfFrequency;
- QueryPerformanceFrequency(&llPerfFrequency);
- if (llPerfFrequency.QuadPart != 0) {
- QueryPerformanceCounter(&i64Ticks100ns);
- return llMulDiv(i64Ticks100ns.QuadPart, 10000000, llPerfFrequency.QuadPart, 0);
- } else {
- // ms to 100ns units
- return timeGetTime() * 10000;
- }
+ QueryPerformanceFrequency(&llPerfFrequency);
+ if (llPerfFrequency.QuadPart != 0) {
+ QueryPerformanceCounter(&i64Ticks100ns);
+ return llMulDiv(i64Ticks100ns.QuadPart, 10000000, llPerfFrequency.QuadPart, 0);
+ } else {
+ // ms to 100ns units
+ return timeGetTime() * 10000;
+ }
}
HINSTANCE CRenderersData::GetD3X9Dll()
@@ -137,19 +137,19 @@ HINSTANCE CRenderersData::GetD3X9Dll()
#pragma message("ERROR: DirectX SDK " MPC_DX_SDK_MONTH " " MAKE_STR(MPC_DX_SDK_YEAR) " (v" MAKE_STR(MPC_DX_SDK_NUMBER) ") or newer is required to build MPC-HC")
#endif
- if (m_hD3DX9Dll == NULL) {
- m_nDXSdkRelease = 0;
+ if (m_hD3DX9Dll == NULL) {
+ m_nDXSdkRelease = 0;
- // load latest compatible version of the DLL that is available
- for (UINT i=D3DX_SDK_VERSION; i>=MPC_DX_SDK_NUMBER; i--) {
- m_strD3DX9Version.Format(_T("d3dx9_%u.dll"), i);
- m_hD3DX9Dll = LoadLibrary(m_strD3DX9Version);
- if (m_hD3DX9Dll) {
- m_nDXSdkRelease = i;
- break;
- }
- }
- }
+ // load latest compatible version of the DLL that is available
+ for (UINT i = D3DX_SDK_VERSION; i >= MPC_DX_SDK_NUMBER; i--) {
+ m_strD3DX9Version.Format(_T("d3dx9_%u.dll"), i);
+ m_hD3DX9Dll = LoadLibrary(m_strD3DX9Version);
+ if (m_hD3DX9Dll) {
+ m_nDXSdkRelease = i;
+ break;
+ }
+ }
+ }
- return m_hD3DX9Dll;
+ return m_hD3DX9Dll;
}
diff --git a/src/filters/renderer/VideoRenderers/RenderersSettings.h b/src/filters/renderer/VideoRenderers/RenderersSettings.h
index 2744dc0f3..867b644af 100644
--- a/src/filters/renderer/VideoRenderers/RenderersSettings.h
+++ b/src/filters/renderer/VideoRenderers/RenderersSettings.h
@@ -24,143 +24,143 @@
#pragma once
enum {
- WM_REARRANGERENDERLESS = WM_APP+1,
- WM_RESET_DEVICE,
+ WM_REARRANGERENDERLESS = WM_APP + 1,
+ WM_RESET_DEVICE,
};
#define WM_MYMOUSELAST WM_XBUTTONDBLCLK
enum {
- VIDRNDT_RM_DEFAULT,
- VIDRNDT_RM_DX7,
- VIDRNDT_RM_DX9,
+ VIDRNDT_RM_DEFAULT,
+ VIDRNDT_RM_DX7,
+ VIDRNDT_RM_DX9,
};
enum {
- VIDRNDT_QT_DEFAULT,
- VIDRNDT_QT_DX7,
- VIDRNDT_QT_DX9,
+ VIDRNDT_QT_DEFAULT,
+ VIDRNDT_QT_DX7,
+ VIDRNDT_QT_DX9,
};
enum {
- VIDRNDT_AP_SURFACE,
- VIDRNDT_AP_TEXTURE2D,
- VIDRNDT_AP_TEXTURE3D,
+ VIDRNDT_AP_SURFACE,
+ VIDRNDT_AP_TEXTURE2D,
+ VIDRNDT_AP_TEXTURE3D,
};
enum VideoSystem {
- VIDEO_SYSTEM_UNKNOWN,
- VIDEO_SYSTEM_HDTV,
- VIDEO_SYSTEM_SDTV_NTSC,
- VIDEO_SYSTEM_SDTV_PAL,
+ VIDEO_SYSTEM_UNKNOWN,
+ VIDEO_SYSTEM_HDTV,
+ VIDEO_SYSTEM_SDTV_NTSC,
+ VIDEO_SYSTEM_SDTV_PAL,
};
enum AmbientLight {
- AMBIENT_LIGHT_BRIGHT,
- AMBIENT_LIGHT_DIM,
- AMBIENT_LIGHT_DARK,
+ AMBIENT_LIGHT_BRIGHT,
+ AMBIENT_LIGHT_DIM,
+ AMBIENT_LIGHT_DARK,
};
enum ColorRenderingIntent {
- COLOR_RENDERING_INTENT_PERCEPTUAL,
- COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC,
- COLOR_RENDERING_INTENT_SATURATION,
- COLOR_RENDERING_INTENT_ABSOLUTE_COLORIMETRIC,
+ COLOR_RENDERING_INTENT_PERCEPTUAL,
+ COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC,
+ COLOR_RENDERING_INTENT_SATURATION,
+ COLOR_RENDERING_INTENT_ABSOLUTE_COLORIMETRIC,
};
class CRenderersSettings
{
public:
- bool fResetDevice;
-
- class CRendererSettingsShared
- {
- public:
- CRendererSettingsShared() {SetDefault();}
- bool fVMR9AlterativeVSync;
- int iVMR9VSyncOffset;
- bool iVMR9VSyncAccurate;
- bool iVMR9FullscreenGUISupport;
- bool iVMR9VSync;
- bool iVMR9FullFloatingPointProcessing;
- bool iVMR9HalfFloatingPointProcessing;
- bool iVMR9ColorManagementEnable;
- int iVMR9ColorManagementInput;
- int iVMR9ColorManagementAmbientLight;
- int iVMR9ColorManagementIntent;
- bool iVMRDisableDesktopComposition;
- int iVMRFlushGPUBeforeVSync;
- int iVMRFlushGPUAfterPresent;
- int iVMRFlushGPUWait;
-
- // SyncRenderer settings
- int bSynchronizeVideo;
- int bSynchronizeDisplay;
- int bSynchronizeNearest;
- int iLineDelta;
- int iColumnDelta;
- double fCycleDelta;
- double fTargetSyncOffset;
- double fControlLimit;
- protected:
- void SetDefault();
- void SetOptimal();
- };
- class CRendererSettingsEVR : public CRendererSettingsShared
- {
- public:
- bool iEVRHighColorResolution;
- bool iEVRForceInputHighColorResolution;
- bool iEVREnableFrameTimeCorrection;
- int iEVROutputRange;
-
- CRendererSettingsEVR() {SetDefault();}
- void SetDefault();
- void SetOptimal();
- };
-
- CRendererSettingsEVR m_RenderSettings;
-
- int iAPSurfaceUsage;
- int iDX9Resizer;
- bool fVMR9MixerMode;
- bool fVMR9MixerYUV;
- int iEvrBuffers;
-
- int nSPCSize;
- int nSPCMaxRes;
- bool fSPCPow2Tex;
- bool fSPCAllowAnimationWhenBuffering;
-
- CString D3D9RenderDevice;
- void UpdateData(bool fSave);
+ bool fResetDevice;
+
+ class CRendererSettingsShared
+ {
+ public:
+ CRendererSettingsShared() {SetDefault();}
+ bool fVMR9AlterativeVSync;
+ int iVMR9VSyncOffset;
+ bool iVMR9VSyncAccurate;
+ bool iVMR9FullscreenGUISupport;
+ bool iVMR9VSync;
+ bool iVMR9FullFloatingPointProcessing;
+ bool iVMR9HalfFloatingPointProcessing;
+ bool iVMR9ColorManagementEnable;
+ int iVMR9ColorManagementInput;
+ int iVMR9ColorManagementAmbientLight;
+ int iVMR9ColorManagementIntent;
+ bool iVMRDisableDesktopComposition;
+ int iVMRFlushGPUBeforeVSync;
+ int iVMRFlushGPUAfterPresent;
+ int iVMRFlushGPUWait;
+
+ // SyncRenderer settings
+ int bSynchronizeVideo;
+ int bSynchronizeDisplay;
+ int bSynchronizeNearest;
+ int iLineDelta;
+ int iColumnDelta;
+ double fCycleDelta;
+ double fTargetSyncOffset;
+ double fControlLimit;
+ protected:
+ void SetDefault();
+ void SetOptimal();
+ };
+ class CRendererSettingsEVR : public CRendererSettingsShared
+ {
+ public:
+ bool iEVRHighColorResolution;
+ bool iEVRForceInputHighColorResolution;
+ bool iEVREnableFrameTimeCorrection;
+ int iEVROutputRange;
+
+ CRendererSettingsEVR() {SetDefault();}
+ void SetDefault();
+ void SetOptimal();
+ };
+
+ CRendererSettingsEVR m_RenderSettings;
+
+ int iAPSurfaceUsage;
+ int iDX9Resizer;
+ bool fVMR9MixerMode;
+ bool fVMR9MixerYUV;
+ int iEvrBuffers;
+
+ int nSPCSize;
+ int nSPCMaxRes;
+ bool fSPCPow2Tex;
+ bool fSPCAllowAnimationWhenBuffering;
+
+ CString D3D9RenderDevice;
+ void UpdateData(bool fSave);
};
class CRenderersData
{
- HINSTANCE m_hD3DX9Dll;
- UINT m_nDXSdkRelease;
+ HINSTANCE m_hD3DX9Dll;
+ UINT m_nDXSdkRelease;
public:
- CRenderersData();
+ CRenderersData();
- // Casimir666
- bool m_fTearingTest;
- int m_fDisplayStats;
- bool m_bResetStats; // Set to reset the presentation statistics
- CString m_strD3DX9Version;
+ // Casimir666
+ bool m_fTearingTest;
+ int m_fDisplayStats;
+ bool m_bResetStats; // Set to reset the presentation statistics
+ CString m_strD3DX9Version;
- // Hardware feature support
- bool m_bFP16Support;
- bool m_b10bitSupport;
+ // Hardware feature support
+ bool m_bFP16Support;
+ bool m_b10bitSupport;
- LONGLONG GetPerfCounter();
- HINSTANCE GetD3X9Dll();
- UINT GetDXSdkRelease() {return m_nDXSdkRelease;};
+ LONGLONG GetPerfCounter();
+ HINSTANCE GetD3X9Dll();
+ UINT GetDXSdkRelease() {return m_nDXSdkRelease;};
};
-extern CRenderersData* GetRenderersData();
-extern CRenderersSettings& GetRenderersSettings();
+extern CRenderersData* GetRenderersData();
+extern CRenderersSettings& GetRenderersSettings();
extern bool LoadResource(UINT resid, CStringA& str, LPCTSTR restype);
diff --git a/src/filters/renderer/VideoRenderers/SyncAllocatorPresenter.h b/src/filters/renderer/VideoRenderers/SyncAllocatorPresenter.h
index 52a0aab4b..baca58d3f 100644
--- a/src/filters/renderer/VideoRenderers/SyncAllocatorPresenter.h
+++ b/src/filters/renderer/VideoRenderers/SyncAllocatorPresenter.h
@@ -29,7 +29,7 @@ DEFINE_GUID(CLSID_SyncAllocatorPresenter, 0xf9f62627, 0xe3ef, 0x4a2e, 0xb6, 0xc9
interface __declspec(uuid("F891C2A9-1DFF-45e0-9129-30C0990C5A9F"))
ISyncClockAdviser :
public IUnknown {
- STDMETHOD (AdviseSyncClock)(ISyncClock* sC) PURE;
+ STDMETHOD(AdviseSyncClock)(ISyncClock * sC) PURE;
};
HRESULT CreateSyncRenderer(const CLSID& clsid, HWND hWnd, bool bFullscreen, ISubPicAllocatorPresenter** ppAP);
diff --git a/src/filters/renderer/VideoRenderers/SyncRenderer.cpp b/src/filters/renderer/VideoRenderers/SyncRenderer.cpp
index ea8601b6f..829c2559b 100644
--- a/src/filters/renderer/VideoRenderers/SyncRenderer.cpp
+++ b/src/filters/renderer/VideoRenderers/SyncRenderer.cpp
@@ -53,4325 +53,4328 @@ using namespace GothSync;
extern bool LoadResource(UINT resid, CStringA& str, LPCTSTR restype);
-CBaseAP::CBaseAP(HWND hWnd, bool bFullscreen, HRESULT& hr, CString &_Error):
- CSubPicAllocatorPresenterImpl(hWnd, hr, &_Error),
- m_ScreenSize(0, 0),
- m_bicubicA(0),
- m_nDXSurface(1),
- m_nVMR9Surfaces(0),
- m_iVMR9Surface(0),
- m_nCurSurface(0),
- m_bSnapToVSync(false),
- m_bInterlaced(0),
- m_nUsedBuffer(0),
- m_TextScale(1.0),
- m_dMainThreadId(0),
- m_bNeedCheckSample(true),
- m_hEvtQuit(INVALID_HANDLE_VALUE),
- m_bIsFullscreen(bFullscreen),
- m_uSyncGlitches(0),
- m_pGenlock(NULL),
- m_lAudioLag(0),
- m_lAudioLagMin(10000),
- m_lAudioLagMax(-10000),
- m_pAudioStats(NULL),
- m_nNextJitter(0),
- m_nNextSyncOffset(0),
- m_llLastSyncTime(0),
- m_fAvrFps(0.0),
- m_fJitterStdDev(0.0),
- m_fSyncOffsetStdDev(0.0),
- m_fSyncOffsetAvr(0.0),
- m_llHysteresis(0),
- m_uD3DRefreshRate(0),
- m_dD3DRefreshCycle(0),
- m_dDetectedScanlineTime(0.0),
- m_dEstRefreshCycle(0.0),
- m_dFrameCycle(0.0),
- m_dOptimumDisplayCycle(0.0),
- m_dCycleDifference(1.0),
- m_llEstVBlankTime(0),
- m_CurrentAdapter(0)
-{
- if (FAILED(hr)) {
- _Error += L"ISubPicAllocatorPresenterImpl failed\n";
- return;
- }
-
- HINSTANCE hDll;
- m_pD3DXLoadSurfaceFromMemory = NULL;
- m_pD3DXCreateLine = NULL;
- m_pD3DXCreateFont = NULL;
- m_pD3DXCreateSprite = NULL;
- hDll = GetRenderersData()->GetD3X9Dll();
- if (hDll) {
- (FARPROC &)m_pD3DXLoadSurfaceFromMemory = GetProcAddress(hDll, "D3DXLoadSurfaceFromMemory");
- (FARPROC &)m_pD3DXCreateLine = GetProcAddress(hDll, "D3DXCreateLine");
- (FARPROC &)m_pD3DXCreateFont = GetProcAddress(hDll, "D3DXCreateFontW");
- (FARPROC &)m_pD3DXCreateSprite = GetProcAddress(hDll, "D3DXCreateSprite");
- } else {
- _Error += L"The installed DirectX End-User Runtime is outdated. Please download and install the ";
- _Error += MPC_DX_SDK_MONTH " " MAKE_STR(MPC_DX_SDK_YEAR);
- _Error += L" release or newer in order for MPC-HC to function properly.\n";
- }
-
- m_pDwmIsCompositionEnabled = NULL;
- m_pDwmEnableComposition = NULL;
- m_hDWMAPI = LoadLibrary(L"dwmapi.dll");
- if (m_hDWMAPI) {
- (FARPROC &)m_pDwmIsCompositionEnabled = GetProcAddress(m_hDWMAPI, "DwmIsCompositionEnabled");
- (FARPROC &)m_pDwmEnableComposition = GetProcAddress(m_hDWMAPI, "DwmEnableComposition");
- }
-
- m_pDirect3DCreate9Ex = NULL;
- m_hD3D9 = LoadLibrary(L"d3d9.dll");
+CBaseAP::CBaseAP(HWND hWnd, bool bFullscreen, HRESULT& hr, CString& _Error):
+ CSubPicAllocatorPresenterImpl(hWnd, hr, &_Error),
+ m_ScreenSize(0, 0),
+ m_bicubicA(0),
+ m_nDXSurface(1),
+ m_nVMR9Surfaces(0),
+ m_iVMR9Surface(0),
+ m_nCurSurface(0),
+ m_bSnapToVSync(false),
+ m_bInterlaced(0),
+ m_nUsedBuffer(0),
+ m_TextScale(1.0),
+ m_dMainThreadId(0),
+ m_bNeedCheckSample(true),
+ m_hEvtQuit(INVALID_HANDLE_VALUE),
+ m_bIsFullscreen(bFullscreen),
+ m_uSyncGlitches(0),
+ m_pGenlock(NULL),
+ m_lAudioLag(0),
+ m_lAudioLagMin(10000),
+ m_lAudioLagMax(-10000),
+ m_pAudioStats(NULL),
+ m_nNextJitter(0),
+ m_nNextSyncOffset(0),
+ m_llLastSyncTime(0),
+ m_fAvrFps(0.0),
+ m_fJitterStdDev(0.0),
+ m_fSyncOffsetStdDev(0.0),
+ m_fSyncOffsetAvr(0.0),
+ m_llHysteresis(0),
+ m_uD3DRefreshRate(0),
+ m_dD3DRefreshCycle(0),
+ m_dDetectedScanlineTime(0.0),
+ m_dEstRefreshCycle(0.0),
+ m_dFrameCycle(0.0),
+ m_dOptimumDisplayCycle(0.0),
+ m_dCycleDifference(1.0),
+ m_llEstVBlankTime(0),
+ m_CurrentAdapter(0)
+{
+ if (FAILED(hr)) {
+ _Error += L"ISubPicAllocatorPresenterImpl failed\n";
+ return;
+ }
+
+ HINSTANCE hDll;
+ m_pD3DXLoadSurfaceFromMemory = NULL;
+ m_pD3DXCreateLine = NULL;
+ m_pD3DXCreateFont = NULL;
+ m_pD3DXCreateSprite = NULL;
+ hDll = GetRenderersData()->GetD3X9Dll();
+ if (hDll) {
+ (FARPROC&)m_pD3DXLoadSurfaceFromMemory = GetProcAddress(hDll, "D3DXLoadSurfaceFromMemory");
+ (FARPROC&)m_pD3DXCreateLine = GetProcAddress(hDll, "D3DXCreateLine");
+ (FARPROC&)m_pD3DXCreateFont = GetProcAddress(hDll, "D3DXCreateFontW");
+ (FARPROC&)m_pD3DXCreateSprite = GetProcAddress(hDll, "D3DXCreateSprite");
+ } else {
+ _Error += L"The installed DirectX End-User Runtime is outdated. Please download and install the ";
+ _Error += MPC_DX_SDK_MONTH " " MAKE_STR(MPC_DX_SDK_YEAR);
+ _Error += L" release or newer in order for MPC-HC to function properly.\n";
+ }
+
+ m_pDwmIsCompositionEnabled = NULL;
+ m_pDwmEnableComposition = NULL;
+ m_hDWMAPI = LoadLibrary(L"dwmapi.dll");
+ if (m_hDWMAPI) {
+ (FARPROC&)m_pDwmIsCompositionEnabled = GetProcAddress(m_hDWMAPI, "DwmIsCompositionEnabled");
+ (FARPROC&)m_pDwmEnableComposition = GetProcAddress(m_hDWMAPI, "DwmEnableComposition");
+ }
+
+ m_pDirect3DCreate9Ex = NULL;
+ m_hD3D9 = LoadLibrary(L"d3d9.dll");
#ifndef DISABLE_USING_D3D9EX
- if (m_hD3D9) {
- (FARPROC &)m_pDirect3DCreate9Ex = GetProcAddress(m_hD3D9, "Direct3DCreate9Ex");
- }
+ if (m_hD3D9) {
+ (FARPROC&)m_pDirect3DCreate9Ex = GetProcAddress(m_hD3D9, "Direct3DCreate9Ex");
+ }
#endif
- if (m_pDirect3DCreate9Ex) {
- DEBUG_ONLY(_tprintf_s(_T("m_pDirect3DCreate9Ex\n")));
- m_pDirect3DCreate9Ex(D3D_SDK_VERSION, &m_pD3DEx);
- if (!m_pD3DEx) {
- m_pDirect3DCreate9Ex(D3D9b_SDK_VERSION, &m_pD3DEx);
- }
- }
- if (!m_pD3DEx) {
- m_pD3D.Attach(Direct3DCreate9(D3D_SDK_VERSION));
- if (!m_pD3D) {
- m_pD3D.Attach(Direct3DCreate9(D3D9b_SDK_VERSION));
- }
- if (m_pD3D) {
- DEBUG_ONLY(_tprintf_s(_T("m_pDirect3DCreate9\n")));
- }
- } else {
- m_pD3D = m_pD3DEx;
- }
-
- ZeroMemory(&m_VMR9AlphaBitmap, sizeof(m_VMR9AlphaBitmap));
-
- CRenderersSettings& s = GetRenderersSettings();
- if (s.m_RenderSettings.iVMRDisableDesktopComposition) {
- m_bDesktopCompositionDisabled = true;
- if (m_pDwmEnableComposition) {
- m_pDwmEnableComposition(0);
- }
- } else {
- m_bDesktopCompositionDisabled = false;
- }
-
- m_pGenlock = DNew CGenlock(s.m_RenderSettings.fTargetSyncOffset, s.m_RenderSettings.fControlLimit, s.m_RenderSettings.iLineDelta, s.m_RenderSettings.iColumnDelta, s.m_RenderSettings.fCycleDelta, 0); // Must be done before CreateDXDevice
- hr = CreateDXDevice(_Error);
- memset (m_pllJitter, 0, sizeof(m_pllJitter));
- memset (m_pllSyncOffset, 0, sizeof(m_pllSyncOffset));
+ if (m_pDirect3DCreate9Ex) {
+ DEBUG_ONLY(_tprintf_s(_T("m_pDirect3DCreate9Ex\n")));
+ m_pDirect3DCreate9Ex(D3D_SDK_VERSION, &m_pD3DEx);
+ if (!m_pD3DEx) {
+ m_pDirect3DCreate9Ex(D3D9b_SDK_VERSION, &m_pD3DEx);
+ }
+ }
+ if (!m_pD3DEx) {
+ m_pD3D.Attach(Direct3DCreate9(D3D_SDK_VERSION));
+ if (!m_pD3D) {
+ m_pD3D.Attach(Direct3DCreate9(D3D9b_SDK_VERSION));
+ }
+ if (m_pD3D) {
+ DEBUG_ONLY(_tprintf_s(_T("m_pDirect3DCreate9\n")));
+ }
+ } else {
+ m_pD3D = m_pD3DEx;
+ }
+
+ ZeroMemory(&m_VMR9AlphaBitmap, sizeof(m_VMR9AlphaBitmap));
+
+ CRenderersSettings& s = GetRenderersSettings();
+ if (s.m_RenderSettings.iVMRDisableDesktopComposition) {
+ m_bDesktopCompositionDisabled = true;
+ if (m_pDwmEnableComposition) {
+ m_pDwmEnableComposition(0);
+ }
+ } else {
+ m_bDesktopCompositionDisabled = false;
+ }
+
+ m_pGenlock = DNew CGenlock(s.m_RenderSettings.fTargetSyncOffset, s.m_RenderSettings.fControlLimit, s.m_RenderSettings.iLineDelta, s.m_RenderSettings.iColumnDelta, s.m_RenderSettings.fCycleDelta, 0); // Must be done before CreateDXDevice
+ hr = CreateDXDevice(_Error);
+ memset(m_pllJitter, 0, sizeof(m_pllJitter));
+ memset(m_pllSyncOffset, 0, sizeof(m_pllSyncOffset));
}
CBaseAP::~CBaseAP()
{
- if (m_bDesktopCompositionDisabled) {
- m_bDesktopCompositionDisabled = false;
- if (m_pDwmEnableComposition) {
- m_pDwmEnableComposition(1);
- }
- }
-
- m_pFont = NULL;
- m_pLine = NULL;
- m_pD3DDev = NULL;
- m_pD3DDevEx = NULL;
- m_pPSC.Free();
- m_pD3D = NULL;
- m_pD3DEx = NULL;
- if (m_hDWMAPI) {
- FreeLibrary(m_hDWMAPI);
- m_hDWMAPI = NULL;
- }
- if (m_hD3D9) {
- FreeLibrary(m_hD3D9);
- m_hD3D9 = NULL;
- }
- m_pAudioStats = NULL;
- if (m_pGenlock) {
- delete m_pGenlock;
- m_pGenlock = NULL;
- }
+ if (m_bDesktopCompositionDisabled) {
+ m_bDesktopCompositionDisabled = false;
+ if (m_pDwmEnableComposition) {
+ m_pDwmEnableComposition(1);
+ }
+ }
+
+ m_pFont = NULL;
+ m_pLine = NULL;
+ m_pD3DDev = NULL;
+ m_pD3DDevEx = NULL;
+ m_pPSC.Free();
+ m_pD3D = NULL;
+ m_pD3DEx = NULL;
+ if (m_hDWMAPI) {
+ FreeLibrary(m_hDWMAPI);
+ m_hDWMAPI = NULL;
+ }
+ if (m_hD3D9) {
+ FreeLibrary(m_hD3D9);
+ m_hD3D9 = NULL;
+ }
+ m_pAudioStats = NULL;
+ if (m_pGenlock) {
+ delete m_pGenlock;
+ m_pGenlock = NULL;
+ }
}
template<int texcoords>
void CBaseAP::AdjustQuad(MYD3DVERTEX<texcoords>* v, double dx, double dy)
{
- float offset = 0.5;
+ float offset = 0.5;
- for (int i = 0; i < 4; i++) {
- v[i].x -= offset;
- v[i].y -= offset;
+ for (int i = 0; i < 4; i++) {
+ v[i].x -= offset;
+ v[i].y -= offset;
- for (int j = 0; j < max(texcoords-1, 1); j++) {
- v[i].t[j].u -= (float)(offset*dx);
- v[i].t[j].v -= (float)(offset*dy);
- }
+ for (int j = 0; j < max(texcoords - 1, 1); j++) {
+ v[i].t[j].u -= (float)(offset * dx);
+ v[i].t[j].v -= (float)(offset * dy);
+ }
- if (texcoords > 1) {
- v[i].t[texcoords-1].u -= offset;
- v[i].t[texcoords-1].v -= offset;
- }
- }
+ if (texcoords > 1) {
+ v[i].t[texcoords - 1].u -= offset;
+ v[i].t[texcoords - 1].v -= offset;
+ }
+ }
}
template<int texcoords>
HRESULT CBaseAP::TextureBlt(IDirect3DDevice9* pD3DDev, MYD3DVERTEX<texcoords> v[4], D3DTEXTUREFILTERTYPE filter = D3DTEXF_LINEAR)
{
- if (!pD3DDev) {
- return E_POINTER;
- }
-
- DWORD FVF = 0;
- switch (texcoords) {
- case 1:
- FVF = D3DFVF_TEX1;
- break;
- case 2:
- FVF = D3DFVF_TEX2;
- break;
- case 3:
- FVF = D3DFVF_TEX3;
- break;
- case 4:
- FVF = D3DFVF_TEX4;
- break;
- case 5:
- FVF = D3DFVF_TEX5;
- break;
- case 6:
- FVF = D3DFVF_TEX6;
- break;
- case 7:
- FVF = D3DFVF_TEX7;
- break;
- case 8:
- FVF = D3DFVF_TEX8;
- break;
- default:
- return E_FAIL;
- }
-
- HRESULT hr;
- hr = pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
- hr = pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_STENCILENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA|D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED);
-
- for (int i = 0; i < texcoords; i++) {
- hr = pD3DDev->SetSamplerState(i, D3DSAMP_MAGFILTER, filter);
- hr = pD3DDev->SetSamplerState(i, D3DSAMP_MINFILTER, filter);
- hr = pD3DDev->SetSamplerState(i, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
-
- hr = pD3DDev->SetSamplerState(i, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
- hr = pD3DDev->SetSamplerState(i, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
- }
-
- hr = pD3DDev->SetFVF(D3DFVF_XYZRHW | FVF);
-
- MYD3DVERTEX<texcoords> tmp = v[2];
- v[2] = v[3];
- v[3] = tmp;
- hr = pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(v[0]));
-
- for (int i = 0; i < texcoords; i++) {
- pD3DDev->SetTexture(i, NULL);
- }
-
- return S_OK;
+ if (!pD3DDev) {
+ return E_POINTER;
+ }
+
+ DWORD FVF = 0;
+ switch (texcoords) {
+ case 1:
+ FVF = D3DFVF_TEX1;
+ break;
+ case 2:
+ FVF = D3DFVF_TEX2;
+ break;
+ case 3:
+ FVF = D3DFVF_TEX3;
+ break;
+ case 4:
+ FVF = D3DFVF_TEX4;
+ break;
+ case 5:
+ FVF = D3DFVF_TEX5;
+ break;
+ case 6:
+ FVF = D3DFVF_TEX6;
+ break;
+ case 7:
+ FVF = D3DFVF_TEX7;
+ break;
+ case 8:
+ FVF = D3DFVF_TEX8;
+ break;
+ default:
+ return E_FAIL;
+ }
+
+ HRESULT hr;
+ hr = pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
+ hr = pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_STENCILENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED);
+
+ for (int i = 0; i < texcoords; i++) {
+ hr = pD3DDev->SetSamplerState(i, D3DSAMP_MAGFILTER, filter);
+ hr = pD3DDev->SetSamplerState(i, D3DSAMP_MINFILTER, filter);
+ hr = pD3DDev->SetSamplerState(i, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
+
+ hr = pD3DDev->SetSamplerState(i, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
+ hr = pD3DDev->SetSamplerState(i, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
+ }
+
+ hr = pD3DDev->SetFVF(D3DFVF_XYZRHW | FVF);
+
+ MYD3DVERTEX<texcoords> tmp = v[2];
+ v[2] = v[3];
+ v[3] = tmp;
+ hr = pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(v[0]));
+
+ for (int i = 0; i < texcoords; i++) {
+ pD3DDev->SetTexture(i, NULL);
+ }
+
+ return S_OK;
}
HRESULT CBaseAP::DrawRectBase(IDirect3DDevice9* pD3DDev, MYD3DVERTEX<0> v[4])
{
- if (!pD3DDev) {
- return E_POINTER;
- }
+ if (!pD3DDev) {
+ return E_POINTER;
+ }
- HRESULT hr = pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
- hr = pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_STENCILENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
- hr = pD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
- hr = pD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
- hr = pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
+ HRESULT hr = pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
+ hr = pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_STENCILENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
+ hr = pD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
+ hr = pD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
+ hr = pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
+ hr = pD3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
- hr = pD3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA|D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED);
+ hr = pD3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED);
- hr = pD3DDev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX0 | D3DFVF_DIFFUSE);
+ hr = pD3DDev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX0 | D3DFVF_DIFFUSE);
- MYD3DVERTEX<0> tmp = v[2];
- v[2] = v[3];
- v[3] = tmp;
- hr = pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(v[0]));
+ MYD3DVERTEX<0> tmp = v[2];
+ v[2] = v[3];
+ v[3] = tmp;
+ hr = pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(v[0]));
- return S_OK;
+ return S_OK;
}
MFOffset CBaseAP::GetOffset(float v)
{
- MFOffset offset;
- offset.value = short(v);
- offset.fract = WORD(65536 * (v-offset.value));
- return offset;
+ MFOffset offset;
+ offset.value = short(v);
+ offset.fract = WORD(65536 * (v - offset.value));
+ return offset;
}
MFVideoArea CBaseAP::GetArea(float x, float y, DWORD width, DWORD height)
{
- MFVideoArea area;
- area.OffsetX = GetOffset(x);
- area.OffsetY = GetOffset(y);
- area.Area.cx = width;
- area.Area.cy = height;
- return area;
+ MFVideoArea area;
+ area.OffsetX = GetOffset(x);
+ area.OffsetY = GetOffset(y);
+ area.Area.cx = width;
+ area.Area.cy = height;
+ return area;
}
void CBaseAP::ResetStats()
{
- m_pGenlock->ResetStats();
- m_lAudioLag = 0;
- m_lAudioLagMin = 10000;
- m_lAudioLagMax = -10000;
- m_MinJitter = MAXLONG64;
- m_MaxJitter = MINLONG64;
- m_MinSyncOffset = MAXLONG64;
- m_MaxSyncOffset = MINLONG64;
- m_uSyncGlitches = 0;
- m_pcFramesDropped = 0;
+ m_pGenlock->ResetStats();
+ m_lAudioLag = 0;
+ m_lAudioLagMin = 10000;
+ m_lAudioLagMax = -10000;
+ m_MinJitter = MAXLONG64;
+ m_MaxJitter = MINLONG64;
+ m_MinSyncOffset = MAXLONG64;
+ m_MaxSyncOffset = MINLONG64;
+ m_uSyncGlitches = 0;
+ m_pcFramesDropped = 0;
}
bool CBaseAP::SettingsNeedResetDevice()
{
- CRenderersSettings& s = GetRenderersSettings();
- CRenderersSettings::CRendererSettingsEVR & New = s.m_RenderSettings;
- CRenderersSettings::CRendererSettingsEVR & Current = m_LastRendererSettings;
-
- bool bRet = false;
- if (!m_bIsFullscreen) {
- if (Current.iVMRDisableDesktopComposition) {
- if (!m_bDesktopCompositionDisabled) {
- m_bDesktopCompositionDisabled = true;
- if (m_pDwmEnableComposition) {
- m_pDwmEnableComposition(0);
- }
- }
- } else {
- if (m_bDesktopCompositionDisabled) {
- m_bDesktopCompositionDisabled = false;
- if (m_pDwmEnableComposition) {
- m_pDwmEnableComposition(1);
- }
- }
- }
- }
- bRet = bRet || New.iEVRHighColorResolution != Current.iEVRHighColorResolution;
- m_LastRendererSettings = s.m_RenderSettings;
- return bRet;
-}
-
-HRESULT CBaseAP::CreateDXDevice(CString &_Error)
-{
- TRACE("--> CBaseAP::CreateDXDevice on thread: %d\n", GetCurrentThreadId());
- CRenderersSettings& s = GetRenderersSettings();
- m_LastRendererSettings = s.m_RenderSettings;
- HRESULT hr = E_FAIL;
-
- m_pFont = NULL;
- m_pSprite = NULL;
- m_pLine = NULL;
-
- m_pPSC.Free();
- m_pD3DDev = NULL;
- m_pD3DDevEx = NULL;
-
- m_pResizerPixelShader[0] = 0;
- m_pResizerPixelShader[1] = 0;
- m_pResizerPixelShader[2] = 0;
- m_pResizerPixelShader[3] = 0;
-
- POSITION pos = m_pPixelShadersScreenSpace.GetHeadPosition();
- while (pos) {
- CExternalPixelShader &Shader = m_pPixelShadersScreenSpace.GetNext(pos);
- Shader.m_pPixelShader = NULL;
- }
- pos = m_pPixelShaders.GetHeadPosition();
- while (pos) {
- CExternalPixelShader &Shader = m_pPixelShaders.GetNext(pos);
- Shader.m_pPixelShader = NULL;
- }
-
- if (!m_pD3D) {
- _Error += L"Failed to create Direct3D device\n";
- return E_UNEXPECTED;
- }
-
- D3DDISPLAYMODE d3ddm;
- ZeroMemory(&d3ddm, sizeof(d3ddm));
- m_CurrentAdapter = GetAdapter(m_pD3D);
- if (FAILED(m_pD3D->GetAdapterDisplayMode(m_CurrentAdapter, &d3ddm))) {
- _Error += L"Can not retrieve display mode data\n";
- return E_UNEXPECTED;
- }
-
- if (FAILED(m_pD3D->GetDeviceCaps(m_CurrentAdapter, D3DDEVTYPE_HAL, &m_caps)))
- if ((m_caps.Caps & D3DCAPS_READ_SCANLINE) == 0) {
- _Error += L"Video card does not have scanline access. Display synchronization is not possible.\n";
- return E_UNEXPECTED;
- }
-
- m_uD3DRefreshRate = d3ddm.RefreshRate;
- m_dD3DRefreshCycle = 1000.0 / (double)m_uD3DRefreshRate; // In ms
- m_ScreenSize.SetSize(d3ddm.Width, d3ddm.Height);
- m_pGenlock->SetDisplayResolution(d3ddm.Width, d3ddm.Height);
-
- BOOL bCompositionEnabled = false;
- if (m_pDwmIsCompositionEnabled) {
- m_pDwmIsCompositionEnabled(&bCompositionEnabled);
- }
- m_bCompositionEnabled = bCompositionEnabled != 0;
-
- ZeroMemory(&pp, sizeof(pp));
- if (m_bIsFullscreen) { // Exclusive mode fullscreen
- pp.Windowed = FALSE;
- pp.BackBufferWidth = d3ddm.Width;
- pp.BackBufferHeight = d3ddm.Height;
- pp.hDeviceWindow = m_hWnd;
- DEBUG_ONLY(_tprintf_s(_T("Wnd in CreateDXDevice: %p\n"), m_hWnd));
- pp.BackBufferCount = 3;
- pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
- pp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
- pp.Flags = D3DPRESENTFLAG_VIDEO;
- m_bHighColorResolution = s.m_RenderSettings.iEVRHighColorResolution;
- if (m_bHighColorResolution) {
- if (FAILED(m_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DFMT_A2R10G10B10, false))) {
- m_strStatsMsg[MSG_ERROR] = L"10 bit RGB is not supported by this graphics device in this resolution.";
- m_bHighColorResolution = false;
- }
- }
-
- if (m_bHighColorResolution) {
- pp.BackBufferFormat = D3DFMT_A2R10G10B10;
- } else {
- pp.BackBufferFormat = d3ddm.Format;
- }
-
- if (m_pD3DEx) {
- D3DDISPLAYMODEEX DisplayMode;
- ZeroMemory(&DisplayMode, sizeof(DisplayMode));
- DisplayMode.Size = sizeof(DisplayMode);
- m_pD3DEx->GetAdapterDisplayModeEx(m_CurrentAdapter, &DisplayMode, NULL);
-
- DisplayMode.Format = pp.BackBufferFormat;
- pp.FullScreen_RefreshRateInHz = DisplayMode.RefreshRate;
-
- if FAILED(hr = m_pD3DEx->CreateDeviceEx(m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
- D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_FPU_PRESERVE|D3DCREATE_MULTITHREADED|D3DCREATE_ENABLE_PRESENTSTATS,
- &pp, &DisplayMode, &m_pD3DDevEx)) {
- _Error += GetWindowsErrorMessage(hr, m_hD3D9);
- return hr;
- }
- if (m_pD3DDevEx) {
- m_pD3DDev = m_pD3DDevEx;
- m_BackbufferType = pp.BackBufferFormat;
- m_DisplayType = DisplayMode.Format;
- }
- } else {
- if FAILED(hr = m_pD3D->CreateDevice(m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_FPU_PRESERVE|D3DCREATE_MULTITHREADED, &pp, &m_pD3DDev)) {
- _Error += GetWindowsErrorMessage(hr, m_hD3D9);
- return hr;
- }
- DEBUG_ONLY(_tprintf_s(_T("Created full-screen device\n")));
- if (m_pD3DDev) {
- m_BackbufferType = pp.BackBufferFormat;
- m_DisplayType = d3ddm.Format;
- }
- }
- } else { // Windowed
- pp.Windowed = TRUE;
- pp.hDeviceWindow = m_hWnd;
- pp.SwapEffect = D3DSWAPEFFECT_COPY;
- pp.Flags = D3DPRESENTFLAG_VIDEO;
- pp.BackBufferCount = 1;
- pp.BackBufferWidth = d3ddm.Width;
- pp.BackBufferHeight = d3ddm.Height;
- m_BackbufferType = d3ddm.Format;
- m_DisplayType = d3ddm.Format;
- m_bHighColorResolution = s.m_RenderSettings.iEVRHighColorResolution;
- if (m_bHighColorResolution) {
- if (FAILED(m_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DFMT_A2R10G10B10, false))) {
- m_strStatsMsg[MSG_ERROR] = L"10 bit RGB is not supported by this graphics device in this resolution.";
- m_bHighColorResolution = false;
- }
- }
-
- if (m_bHighColorResolution) {
- m_BackbufferType = D3DFMT_A2R10G10B10;
- pp.BackBufferFormat = D3DFMT_A2R10G10B10;
- }
- if (bCompositionEnabled) {
- // Desktop composition presents the whole desktop
- pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
- } else {
- pp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
- }
- if (m_pD3DEx) {
- if FAILED(hr = m_pD3DEx->CreateDeviceEx(m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
- D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_FPU_PRESERVE|D3DCREATE_MULTITHREADED|D3DCREATE_ENABLE_PRESENTSTATS,
- &pp, NULL, &m_pD3DDevEx)) {
- _Error += GetWindowsErrorMessage(hr, m_hD3D9);
- return hr;
- }
- if (m_pD3DDevEx) {
- m_pD3DDev = m_pD3DDevEx;
- }
- } else {
- if FAILED(hr = m_pD3D->CreateDevice(m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
- D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_FPU_PRESERVE|D3DCREATE_MULTITHREADED,
- &pp, &m_pD3DDev)) {
- _Error += GetWindowsErrorMessage(hr, m_hD3D9);
- return hr;
- }
- DEBUG_ONLY(_tprintf_s(_T("Created windowed device\n")));
- }
- }
-
- while (hr == D3DERR_DEVICELOST) {
- TRACE("D3DERR_DEVICELOST. Trying to Reset.\n");
- hr = m_pD3DDev->TestCooperativeLevel();
- }
- if (hr == D3DERR_DEVICENOTRESET) {
- TRACE("D3DERR_DEVICENOTRESET\n");
- hr = m_pD3DDev->Reset(&pp);
- }
-
- TRACE("CreateDevice: %d\n", (LONG)hr);
- ASSERT (SUCCEEDED (hr));
-
- if (m_pD3DDevEx) {
- m_pD3DDevEx->SetGPUThreadPriority(7);
- }
-
- m_pPSC.Attach(DNew CPixelShaderCompiler(m_pD3DDev, true));
- m_filter = D3DTEXF_NONE;
-
- if (m_caps.StretchRectFilterCaps&D3DPTFILTERCAPS_MINFLINEAR && m_caps.StretchRectFilterCaps&D3DPTFILTERCAPS_MAGFLINEAR) {
- m_filter = D3DTEXF_LINEAR;
- }
-
- m_bicubicA = 0;
-
- CSize size;
- switch (GetRenderersSettings().nSPCMaxRes) {
- case 0:
- default:
- size = m_ScreenSize;
- break;
- case 1:
- size.SetSize(1024, 768);
- break;
- case 2:
- size.SetSize(800, 600);
- break;
- case 3:
- size.SetSize(640, 480);
- break;
- case 4:
- size.SetSize(512, 384);
- break;
- case 5:
- size.SetSize(384, 288);
- break;
- case 6:
- size.SetSize(2560, 1600);
- break;
- case 7:
- size.SetSize(1920, 1080);
- break;
- case 8:
- size.SetSize(1320, 900);
- break;
- case 9:
- size.SetSize(1280, 720);
- break;
- }
-
- if (m_pAllocator) {
- m_pAllocator->ChangeDevice(m_pD3DDev);
- } else {
- m_pAllocator = DNew CDX9SubPicAllocator(m_pD3DDev, size, GetRenderersSettings().fSPCPow2Tex, false);
- if (!m_pAllocator) {
- _Error += L"CDX9SubPicAllocator failed\n";
- return E_FAIL;
- }
- }
-
- hr = S_OK;
-
- CComPtr<ISubPicProvider> pSubPicProvider;
- if (m_pSubPicQueue) {
- DEBUG_ONLY(_tprintf_s(_T("m_pSubPicQueue != NULL\n")));
- m_pSubPicQueue->GetSubPicProvider(&pSubPicProvider);
- }
-
- m_pSubPicQueue = NULL;
- m_pSubPicQueue = GetRenderersSettings().nSPCSize > 0
- ? (ISubPicQueue*)DNew CSubPicQueue(GetRenderersSettings().nSPCSize, !GetRenderersSettings().fSPCAllowAnimationWhenBuffering, m_pAllocator, &hr)
- : (ISubPicQueue*)DNew CSubPicQueueNoThread(m_pAllocator, &hr);
- if (!m_pSubPicQueue || FAILED(hr)) {
- _Error += L"m_pSubPicQueue failed\n";
- return E_FAIL;
- }
-
- if (pSubPicProvider) {
- m_pSubPicQueue->SetSubPicProvider(pSubPicProvider);
- }
-
- if (m_pD3DXCreateFont) {
- int MinSize = 1600;
- int CurrentSize = min(m_ScreenSize.cx, MinSize);
- double Scale = double(CurrentSize) / double(MinSize);
- m_TextScale = Scale;
- m_pD3DXCreateFont(m_pD3DDev, (int)(-24.0*Scale), (UINT)(-11.0*Scale), CurrentSize < 800 ? FW_NORMAL : FW_BOLD, 0, FALSE,
- DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FIXED_PITCH | FF_DONTCARE, L"Lucida Console", &m_pFont);
- }
- if (m_pD3DXCreateSprite) {
- m_pD3DXCreateSprite(m_pD3DDev, &m_pSprite);
- }
- if (m_pD3DXCreateLine) {
- m_pD3DXCreateLine (m_pD3DDev, &m_pLine);
- }
- m_LastAdapterCheck = GetRenderersData()->GetPerfCounter();
- return S_OK;
-}
-
-HRESULT CBaseAP::ResetDXDevice(CString &_Error)
-{
- CRenderersSettings& s = GetRenderersSettings();
- m_LastRendererSettings = s.m_RenderSettings;
- HRESULT hr = E_FAIL;
-
- hr = m_pD3DDev->TestCooperativeLevel();
- if ((hr != D3DERR_DEVICENOTRESET) && (hr != D3D_OK)) {
- return hr;
- }
-
- CComPtr<IEnumPins> rendererInputEnum;
- std::vector<CComPtr<IPin>> decoderOutput;
- std::vector<CComPtr<IPin>> rendererInput;
- FILTER_INFO filterInfo;
-
- bool disconnected = FALSE;
-
- // Disconnect all pins to release video memory resources
- if (m_pD3DDev) {
- ZeroMemory(&filterInfo, sizeof(filterInfo));
- m_pOuterEVR->QueryFilterInfo(&filterInfo); // This addref's the pGraph member
- if (SUCCEEDED(m_pOuterEVR->EnumPins(&rendererInputEnum))) {
- CComPtr<IPin> input;
- CComPtr<IPin> output;
- while (hr = rendererInputEnum->Next(1, &input.p, 0), hr == S_OK) { // Must have .p here
- DEBUG_ONLY(_tprintf_s(_T("Pin found\n")));
- input->ConnectedTo(&output.p);
- if (output != NULL) {
- rendererInput.push_back(input);
- decoderOutput.push_back(output);
- }
- input.Release();
- output.Release();
- }
- } else {
- return hr;
- }
- for (DWORD i = 0; i < decoderOutput.size(); i++) {
- DEBUG_ONLY(_tprintf_s(_T("Disconnecting pin\n")));
- filterInfo.pGraph->Disconnect(decoderOutput.at(i).p);
- filterInfo.pGraph->Disconnect(rendererInput.at(i).p);
- DEBUG_ONLY(_tprintf_s(_T("Pin disconnected\n")));
- }
- disconnected = true;
- }
-
- // Release more resources
- m_pSubPicQueue = NULL;
- m_pFont = NULL;
- m_pSprite = NULL;
- m_pLine = NULL;
- m_pPSC.Free();
-
- m_pResizerPixelShader[0] = 0;
- m_pResizerPixelShader[1] = 0;
- m_pResizerPixelShader[2] = 0;
- m_pResizerPixelShader[3] = 0;
-
- POSITION pos = m_pPixelShadersScreenSpace.GetHeadPosition();
- while (pos) {
- CExternalPixelShader &Shader = m_pPixelShadersScreenSpace.GetNext(pos);
- Shader.m_pPixelShader = NULL;
- }
- pos = m_pPixelShaders.GetHeadPosition();
- while (pos) {
- CExternalPixelShader &Shader = m_pPixelShaders.GetNext(pos);
- Shader.m_pPixelShader = NULL;
- }
-
- D3DDISPLAYMODE d3ddm;
- ZeroMemory(&d3ddm, sizeof(d3ddm));
- if (FAILED(m_pD3D->GetAdapterDisplayMode(GetAdapter(m_pD3D), &d3ddm))) {
- _Error += L"Can not retrieve display mode data\n";
- return E_UNEXPECTED;
- }
-
- m_uD3DRefreshRate = d3ddm.RefreshRate;
- m_dD3DRefreshCycle = 1000.0 / (double)m_uD3DRefreshRate; // In ms
- m_ScreenSize.SetSize(d3ddm.Width, d3ddm.Height);
- m_pGenlock->SetDisplayResolution(d3ddm.Width, d3ddm.Height);
-
- D3DPRESENT_PARAMETERS pp;
- ZeroMemory(&pp, sizeof(pp));
-
- BOOL bCompositionEnabled = false;
- if (m_pDwmIsCompositionEnabled) {
- m_pDwmIsCompositionEnabled(&bCompositionEnabled);
- }
- m_bCompositionEnabled = bCompositionEnabled != 0;
- m_bHighColorResolution = s.m_RenderSettings.iEVRHighColorResolution;
-
- if (m_bIsFullscreen) { // Exclusive mode fullscreen
- pp.BackBufferWidth = d3ddm.Width;
- pp.BackBufferHeight = d3ddm.Height;
- if (m_bHighColorResolution) {
- pp.BackBufferFormat = D3DFMT_A2R10G10B10;
- } else {
- pp.BackBufferFormat = d3ddm.Format;
- }
- if (FAILED(m_pD3DEx->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, pp.BackBufferFormat, pp.BackBufferFormat, false))) {
- _Error += L"10 bit RGB is not supported by this graphics device in exclusive mode fullscreen.\n";
- return hr;
- }
-
- D3DDISPLAYMODEEX DisplayMode;
- ZeroMemory(&DisplayMode, sizeof(DisplayMode));
- DisplayMode.Size = sizeof(DisplayMode);
- if (m_pD3DDevEx) {
- m_pD3DEx->GetAdapterDisplayModeEx(GetAdapter(m_pD3DEx), &DisplayMode, NULL);
- DisplayMode.Format = pp.BackBufferFormat;
- pp.FullScreen_RefreshRateInHz = DisplayMode.RefreshRate;
- if FAILED(m_pD3DDevEx->Reset(&pp)) {
- _Error += GetWindowsErrorMessage(hr, m_hD3D9);
- return hr;
- }
- } else if (m_pD3DDev) {
- if FAILED(m_pD3DDev->Reset(&pp)) {
- _Error += GetWindowsErrorMessage(hr, m_hD3D9);
- return hr;
- }
- } else {
- _Error += L"No device.\n";
- return hr;
- }
- m_BackbufferType = pp.BackBufferFormat;
- m_DisplayType = d3ddm.Format;
- } else { // Windowed
- pp.BackBufferWidth = d3ddm.Width;
- pp.BackBufferHeight = d3ddm.Height;
- m_BackbufferType = d3ddm.Format;
- m_DisplayType = d3ddm.Format;
- if (m_bHighColorResolution) {
- m_BackbufferType = D3DFMT_A2R10G10B10;
- pp.BackBufferFormat = D3DFMT_A2R10G10B10;
- }
- if (FAILED(m_pD3DEx->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, pp.BackBufferFormat, pp.BackBufferFormat, false))) {
- _Error += L"10 bit RGB is not supported by this graphics device in windowed mode.\n";
- return hr;
- }
- if (bCompositionEnabled) {
- // Desktop composition presents the whole desktop
- pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
- } else {
- pp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
- }
- if (m_pD3DDevEx)
- if FAILED(m_pD3DDevEx->Reset(&pp)) {
- _Error += GetWindowsErrorMessage(hr, m_hD3D9);
- return hr;
- } else if (m_pD3DDev)
- if FAILED(m_pD3DDevEx->Reset(&pp)) {
- _Error += GetWindowsErrorMessage(hr, m_hD3D9);
- return hr;
- } else {
- _Error += L"No device.\n";
- return hr;
- }
- }
-
- if (disconnected) {
- for (DWORD i = 0; i < decoderOutput.size(); i++) {
- if (FAILED(filterInfo.pGraph->ConnectDirect(decoderOutput.at(i).p, rendererInput.at(i).p, NULL))) {
- return hr;
- }
- }
-
- if (filterInfo.pGraph != NULL) {
- filterInfo.pGraph->Release();
- }
- }
-
- m_pPSC.Attach(DNew CPixelShaderCompiler(m_pD3DDev, true));
- m_filter = D3DTEXF_NONE;
-
- if ((m_caps.StretchRectFilterCaps&D3DPTFILTERCAPS_MINFLINEAR)
- && (m_caps.StretchRectFilterCaps&D3DPTFILTERCAPS_MAGFLINEAR)) {
- m_filter = D3DTEXF_LINEAR;
- }
-
- m_bicubicA = 0;
-
- CComPtr<ISubPicProvider> pSubPicProvider;
- if (m_pSubPicQueue) {
- m_pSubPicQueue->GetSubPicProvider(&pSubPicProvider);
- }
- CSize size;
- switch (GetRenderersSettings().nSPCMaxRes) {
- case 0:
- default:
- size = m_ScreenSize;
- break;
- case 1:
- size.SetSize(1024, 768);
- break;
- case 2:
- size.SetSize(800, 600);
- break;
- case 3:
- size.SetSize(640, 480);
- break;
- case 4:
- size.SetSize(512, 384);
- break;
- case 5:
- size.SetSize(384, 288);
- break;
- case 6:
- size.SetSize(2560, 1600);
- break;
- case 7:
- size.SetSize(1920, 1080);
- break;
- case 8:
- size.SetSize(1320, 900);
- break;
- case 9:
- size.SetSize(1280, 720);
- break;
- }
-
- if (m_pAllocator) {
- m_pAllocator->ChangeDevice(m_pD3DDev);
- } else {
- m_pAllocator = DNew CDX9SubPicAllocator(m_pD3DDev, size, GetRenderersSettings().fSPCPow2Tex, false);
- if (!m_pAllocator) {
- _Error += L"CDX9SubPicAllocator failed\n";
-
- return E_FAIL;
- }
- }
-
- hr = S_OK;
- m_pSubPicQueue = GetRenderersSettings().nSPCSize > 0
- ? (ISubPicQueue*)DNew CSubPicQueue(GetRenderersSettings().nSPCSize, !GetRenderersSettings().fSPCAllowAnimationWhenBuffering, m_pAllocator, &hr)
- : (ISubPicQueue*)DNew CSubPicQueueNoThread(m_pAllocator, &hr);
- if (!m_pSubPicQueue || FAILED(hr)) {
- _Error += L"m_pSubPicQueue failed\n";
-
- return E_FAIL;
- }
-
- if (pSubPicProvider) {
- m_pSubPicQueue->SetSubPicProvider(pSubPicProvider);
- }
-
- m_pFont = NULL;
- if (m_pD3DXCreateFont) {
- int MinSize = 1600;
- int CurrentSize = min(m_ScreenSize.cx, MinSize);
- double Scale = double(CurrentSize) / double(MinSize);
- m_TextScale = Scale;
- m_pD3DXCreateFont(m_pD3DDev, (int)(-24.0*Scale), (UINT)(-11.0*Scale), CurrentSize < 800 ? FW_NORMAL : FW_BOLD, 0, FALSE,
- DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FIXED_PITCH | FF_DONTCARE, L"Lucida Console", &m_pFont);
- }
- m_pSprite = NULL;
- if (m_pD3DXCreateSprite) {
- m_pD3DXCreateSprite(m_pD3DDev, &m_pSprite);
- }
- m_pLine = NULL;
- if (m_pD3DXCreateLine) {
- m_pD3DXCreateLine (m_pD3DDev, &m_pLine);
- }
- return S_OK;
+ CRenderersSettings& s = GetRenderersSettings();
+ CRenderersSettings::CRendererSettingsEVR& New = s.m_RenderSettings;
+ CRenderersSettings::CRendererSettingsEVR& Current = m_LastRendererSettings;
+
+ bool bRet = false;
+ if (!m_bIsFullscreen) {
+ if (Current.iVMRDisableDesktopComposition) {
+ if (!m_bDesktopCompositionDisabled) {
+ m_bDesktopCompositionDisabled = true;
+ if (m_pDwmEnableComposition) {
+ m_pDwmEnableComposition(0);
+ }
+ }
+ } else {
+ if (m_bDesktopCompositionDisabled) {
+ m_bDesktopCompositionDisabled = false;
+ if (m_pDwmEnableComposition) {
+ m_pDwmEnableComposition(1);
+ }
+ }
+ }
+ }
+ bRet = bRet || New.iEVRHighColorResolution != Current.iEVRHighColorResolution;
+ m_LastRendererSettings = s.m_RenderSettings;
+ return bRet;
+}
+
+HRESULT CBaseAP::CreateDXDevice(CString& _Error)
+{
+ TRACE("--> CBaseAP::CreateDXDevice on thread: %d\n", GetCurrentThreadId());
+ CRenderersSettings& s = GetRenderersSettings();
+ m_LastRendererSettings = s.m_RenderSettings;
+ HRESULT hr = E_FAIL;
+
+ m_pFont = NULL;
+ m_pSprite = NULL;
+ m_pLine = NULL;
+
+ m_pPSC.Free();
+ m_pD3DDev = NULL;
+ m_pD3DDevEx = NULL;
+
+ m_pResizerPixelShader[0] = 0;
+ m_pResizerPixelShader[1] = 0;
+ m_pResizerPixelShader[2] = 0;
+ m_pResizerPixelShader[3] = 0;
+
+ POSITION pos = m_pPixelShadersScreenSpace.GetHeadPosition();
+ while (pos) {
+ CExternalPixelShader& Shader = m_pPixelShadersScreenSpace.GetNext(pos);
+ Shader.m_pPixelShader = NULL;
+ }
+ pos = m_pPixelShaders.GetHeadPosition();
+ while (pos) {
+ CExternalPixelShader& Shader = m_pPixelShaders.GetNext(pos);
+ Shader.m_pPixelShader = NULL;
+ }
+
+ if (!m_pD3D) {
+ _Error += L"Failed to create Direct3D device\n";
+ return E_UNEXPECTED;
+ }
+
+ D3DDISPLAYMODE d3ddm;
+ ZeroMemory(&d3ddm, sizeof(d3ddm));
+ m_CurrentAdapter = GetAdapter(m_pD3D);
+ if (FAILED(m_pD3D->GetAdapterDisplayMode(m_CurrentAdapter, &d3ddm))) {
+ _Error += L"Can not retrieve display mode data\n";
+ return E_UNEXPECTED;
+ }
+
+ if (FAILED(m_pD3D->GetDeviceCaps(m_CurrentAdapter, D3DDEVTYPE_HAL, &m_caps)))
+ if ((m_caps.Caps & D3DCAPS_READ_SCANLINE) == 0) {
+ _Error += L"Video card does not have scanline access. Display synchronization is not possible.\n";
+ return E_UNEXPECTED;
+ }
+
+ m_uD3DRefreshRate = d3ddm.RefreshRate;
+ m_dD3DRefreshCycle = 1000.0 / (double)m_uD3DRefreshRate; // In ms
+ m_ScreenSize.SetSize(d3ddm.Width, d3ddm.Height);
+ m_pGenlock->SetDisplayResolution(d3ddm.Width, d3ddm.Height);
+
+ BOOL bCompositionEnabled = false;
+ if (m_pDwmIsCompositionEnabled) {
+ m_pDwmIsCompositionEnabled(&bCompositionEnabled);
+ }
+ m_bCompositionEnabled = bCompositionEnabled != 0;
+
+ ZeroMemory(&pp, sizeof(pp));
+ if (m_bIsFullscreen) { // Exclusive mode fullscreen
+ pp.Windowed = FALSE;
+ pp.BackBufferWidth = d3ddm.Width;
+ pp.BackBufferHeight = d3ddm.Height;
+ pp.hDeviceWindow = m_hWnd;
+ DEBUG_ONLY(_tprintf_s(_T("Wnd in CreateDXDevice: %p\n"), m_hWnd));
+ pp.BackBufferCount = 3;
+ pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
+ pp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
+ pp.Flags = D3DPRESENTFLAG_VIDEO;
+ m_bHighColorResolution = s.m_RenderSettings.iEVRHighColorResolution;
+ if (m_bHighColorResolution) {
+ if (FAILED(m_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DFMT_A2R10G10B10, false))) {
+ m_strStatsMsg[MSG_ERROR] = L"10 bit RGB is not supported by this graphics device in this resolution.";
+ m_bHighColorResolution = false;
+ }
+ }
+
+ if (m_bHighColorResolution) {
+ pp.BackBufferFormat = D3DFMT_A2R10G10B10;
+ } else {
+ pp.BackBufferFormat = d3ddm.Format;
+ }
+
+ if (m_pD3DEx) {
+ D3DDISPLAYMODEEX DisplayMode;
+ ZeroMemory(&DisplayMode, sizeof(DisplayMode));
+ DisplayMode.Size = sizeof(DisplayMode);
+ m_pD3DEx->GetAdapterDisplayModeEx(m_CurrentAdapter, &DisplayMode, NULL);
+
+ DisplayMode.Format = pp.BackBufferFormat;
+ pp.FullScreen_RefreshRateInHz = DisplayMode.RefreshRate;
+
+ if FAILED(hr = m_pD3DEx->CreateDeviceEx(m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
+ D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED | D3DCREATE_ENABLE_PRESENTSTATS,
+ &pp, &DisplayMode, &m_pD3DDevEx)) {
+ _Error += GetWindowsErrorMessage(hr, m_hD3D9);
+ return hr;
+ }
+ if (m_pD3DDevEx) {
+ m_pD3DDev = m_pD3DDevEx;
+ m_BackbufferType = pp.BackBufferFormat;
+ m_DisplayType = DisplayMode.Format;
+ }
+ } else {
+ if FAILED(hr = m_pD3D->CreateDevice(m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED, &pp, &m_pD3DDev)) {
+ _Error += GetWindowsErrorMessage(hr, m_hD3D9);
+ return hr;
+ }
+ DEBUG_ONLY(_tprintf_s(_T("Created full-screen device\n")));
+ if (m_pD3DDev) {
+ m_BackbufferType = pp.BackBufferFormat;
+ m_DisplayType = d3ddm.Format;
+ }
+ }
+ } else { // Windowed
+ pp.Windowed = TRUE;
+ pp.hDeviceWindow = m_hWnd;
+ pp.SwapEffect = D3DSWAPEFFECT_COPY;
+ pp.Flags = D3DPRESENTFLAG_VIDEO;
+ pp.BackBufferCount = 1;
+ pp.BackBufferWidth = d3ddm.Width;
+ pp.BackBufferHeight = d3ddm.Height;
+ m_BackbufferType = d3ddm.Format;
+ m_DisplayType = d3ddm.Format;
+ m_bHighColorResolution = s.m_RenderSettings.iEVRHighColorResolution;
+ if (m_bHighColorResolution) {
+ if (FAILED(m_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DFMT_A2R10G10B10, false))) {
+ m_strStatsMsg[MSG_ERROR] = L"10 bit RGB is not supported by this graphics device in this resolution.";
+ m_bHighColorResolution = false;
+ }
+ }
+
+ if (m_bHighColorResolution) {
+ m_BackbufferType = D3DFMT_A2R10G10B10;
+ pp.BackBufferFormat = D3DFMT_A2R10G10B10;
+ }
+ if (bCompositionEnabled) {
+ // Desktop composition presents the whole desktop
+ pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
+ } else {
+ pp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
+ }
+ if (m_pD3DEx) {
+ if FAILED(hr = m_pD3DEx->CreateDeviceEx(m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
+ D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED | D3DCREATE_ENABLE_PRESENTSTATS,
+ &pp, NULL, &m_pD3DDevEx)) {
+ _Error += GetWindowsErrorMessage(hr, m_hD3D9);
+ return hr;
+ }
+ if (m_pD3DDevEx) {
+ m_pD3DDev = m_pD3DDevEx;
+ }
+ } else {
+ if FAILED(hr = m_pD3D->CreateDevice(m_CurrentAdapter, D3DDEVTYPE_HAL, m_hWnd,
+ D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED,
+ &pp, &m_pD3DDev)) {
+ _Error += GetWindowsErrorMessage(hr, m_hD3D9);
+ return hr;
+ }
+ DEBUG_ONLY(_tprintf_s(_T("Created windowed device\n")));
+ }
+ }
+
+ while (hr == D3DERR_DEVICELOST) {
+ TRACE("D3DERR_DEVICELOST. Trying to Reset.\n");
+ hr = m_pD3DDev->TestCooperativeLevel();
+ }
+ if (hr == D3DERR_DEVICENOTRESET) {
+ TRACE("D3DERR_DEVICENOTRESET\n");
+ hr = m_pD3DDev->Reset(&pp);
+ }
+
+ TRACE("CreateDevice: %d\n", (LONG)hr);
+ ASSERT(SUCCEEDED(hr));
+
+ if (m_pD3DDevEx) {
+ m_pD3DDevEx->SetGPUThreadPriority(7);
+ }
+
+ m_pPSC.Attach(DNew CPixelShaderCompiler(m_pD3DDev, true));
+ m_filter = D3DTEXF_NONE;
+
+ if (m_caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MINFLINEAR && m_caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR) {
+ m_filter = D3DTEXF_LINEAR;
+ }
+
+ m_bicubicA = 0;
+
+ CSize size;
+ switch (GetRenderersSettings().nSPCMaxRes) {
+ case 0:
+ default:
+ size = m_ScreenSize;
+ break;
+ case 1:
+ size.SetSize(1024, 768);
+ break;
+ case 2:
+ size.SetSize(800, 600);
+ break;
+ case 3:
+ size.SetSize(640, 480);
+ break;
+ case 4:
+ size.SetSize(512, 384);
+ break;
+ case 5:
+ size.SetSize(384, 288);
+ break;
+ case 6:
+ size.SetSize(2560, 1600);
+ break;
+ case 7:
+ size.SetSize(1920, 1080);
+ break;
+ case 8:
+ size.SetSize(1320, 900);
+ break;
+ case 9:
+ size.SetSize(1280, 720);
+ break;
+ }
+
+ if (m_pAllocator) {
+ m_pAllocator->ChangeDevice(m_pD3DDev);
+ } else {
+ m_pAllocator = DNew CDX9SubPicAllocator(m_pD3DDev, size, GetRenderersSettings().fSPCPow2Tex, false);
+ if (!m_pAllocator) {
+ _Error += L"CDX9SubPicAllocator failed\n";
+ return E_FAIL;
+ }
+ }
+
+ hr = S_OK;
+
+ CComPtr<ISubPicProvider> pSubPicProvider;
+ if (m_pSubPicQueue) {
+ DEBUG_ONLY(_tprintf_s(_T("m_pSubPicQueue != NULL\n")));
+ m_pSubPicQueue->GetSubPicProvider(&pSubPicProvider);
+ }
+
+ m_pSubPicQueue = NULL;
+ m_pSubPicQueue = GetRenderersSettings().nSPCSize > 0
+ ? (ISubPicQueue*)DNew CSubPicQueue(GetRenderersSettings().nSPCSize, !GetRenderersSettings().fSPCAllowAnimationWhenBuffering, m_pAllocator, &hr)
+ : (ISubPicQueue*)DNew CSubPicQueueNoThread(m_pAllocator, &hr);
+ if (!m_pSubPicQueue || FAILED(hr)) {
+ _Error += L"m_pSubPicQueue failed\n";
+ return E_FAIL;
+ }
+
+ if (pSubPicProvider) {
+ m_pSubPicQueue->SetSubPicProvider(pSubPicProvider);
+ }
+
+ if (m_pD3DXCreateFont) {
+ int MinSize = 1600;
+ int CurrentSize = min(m_ScreenSize.cx, MinSize);
+ double Scale = double(CurrentSize) / double(MinSize);
+ m_TextScale = Scale;
+ m_pD3DXCreateFont(m_pD3DDev, (int)(-24.0 * Scale), (UINT)(-11.0 * Scale), CurrentSize < 800 ? FW_NORMAL : FW_BOLD, 0, FALSE,
+ DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FIXED_PITCH | FF_DONTCARE, L"Lucida Console", &m_pFont);
+ }
+ if (m_pD3DXCreateSprite) {
+ m_pD3DXCreateSprite(m_pD3DDev, &m_pSprite);
+ }
+ if (m_pD3DXCreateLine) {
+ m_pD3DXCreateLine(m_pD3DDev, &m_pLine);
+ }
+ m_LastAdapterCheck = GetRenderersData()->GetPerfCounter();
+ return S_OK;
+}
+
+HRESULT CBaseAP::ResetDXDevice(CString& _Error)
+{
+ CRenderersSettings& s = GetRenderersSettings();
+ m_LastRendererSettings = s.m_RenderSettings;
+ HRESULT hr = E_FAIL;
+
+ hr = m_pD3DDev->TestCooperativeLevel();
+ if ((hr != D3DERR_DEVICENOTRESET) && (hr != D3D_OK)) {
+ return hr;
+ }
+
+ CComPtr<IEnumPins> rendererInputEnum;
+ std::vector<CComPtr<IPin>> decoderOutput;
+ std::vector<CComPtr<IPin>> rendererInput;
+ FILTER_INFO filterInfo;
+
+ bool disconnected = FALSE;
+
+ // Disconnect all pins to release video memory resources
+ if (m_pD3DDev) {
+ ZeroMemory(&filterInfo, sizeof(filterInfo));
+ m_pOuterEVR->QueryFilterInfo(&filterInfo); // This addref's the pGraph member
+ if (SUCCEEDED(m_pOuterEVR->EnumPins(&rendererInputEnum))) {
+ CComPtr<IPin> input;
+ CComPtr<IPin> output;
+ while (hr = rendererInputEnum->Next(1, &input.p, 0), hr == S_OK) { // Must have .p here
+ DEBUG_ONLY(_tprintf_s(_T("Pin found\n")));
+ input->ConnectedTo(&output.p);
+ if (output != NULL) {
+ rendererInput.push_back(input);
+ decoderOutput.push_back(output);
+ }
+ input.Release();
+ output.Release();
+ }
+ } else {
+ return hr;
+ }
+ for (DWORD i = 0; i < decoderOutput.size(); i++) {
+ DEBUG_ONLY(_tprintf_s(_T("Disconnecting pin\n")));
+ filterInfo.pGraph->Disconnect(decoderOutput.at(i).p);
+ filterInfo.pGraph->Disconnect(rendererInput.at(i).p);
+ DEBUG_ONLY(_tprintf_s(_T("Pin disconnected\n")));
+ }
+ disconnected = true;
+ }
+
+ // Release more resources
+ m_pSubPicQueue = NULL;
+ m_pFont = NULL;
+ m_pSprite = NULL;
+ m_pLine = NULL;
+ m_pPSC.Free();
+
+ m_pResizerPixelShader[0] = 0;
+ m_pResizerPixelShader[1] = 0;
+ m_pResizerPixelShader[2] = 0;
+ m_pResizerPixelShader[3] = 0;
+
+ POSITION pos = m_pPixelShadersScreenSpace.GetHeadPosition();
+ while (pos) {
+ CExternalPixelShader& Shader = m_pPixelShadersScreenSpace.GetNext(pos);
+ Shader.m_pPixelShader = NULL;
+ }
+ pos = m_pPixelShaders.GetHeadPosition();
+ while (pos) {
+ CExternalPixelShader& Shader = m_pPixelShaders.GetNext(pos);
+ Shader.m_pPixelShader = NULL;
+ }
+
+ D3DDISPLAYMODE d3ddm;
+ ZeroMemory(&d3ddm, sizeof(d3ddm));
+ if (FAILED(m_pD3D->GetAdapterDisplayMode(GetAdapter(m_pD3D), &d3ddm))) {
+ _Error += L"Can not retrieve display mode data\n";
+ return E_UNEXPECTED;
+ }
+
+ m_uD3DRefreshRate = d3ddm.RefreshRate;
+ m_dD3DRefreshCycle = 1000.0 / (double)m_uD3DRefreshRate; // In ms
+ m_ScreenSize.SetSize(d3ddm.Width, d3ddm.Height);
+ m_pGenlock->SetDisplayResolution(d3ddm.Width, d3ddm.Height);
+
+ D3DPRESENT_PARAMETERS pp;
+ ZeroMemory(&pp, sizeof(pp));
+
+ BOOL bCompositionEnabled = false;
+ if (m_pDwmIsCompositionEnabled) {
+ m_pDwmIsCompositionEnabled(&bCompositionEnabled);
+ }
+ m_bCompositionEnabled = bCompositionEnabled != 0;
+ m_bHighColorResolution = s.m_RenderSettings.iEVRHighColorResolution;
+
+ if (m_bIsFullscreen) { // Exclusive mode fullscreen
+ pp.BackBufferWidth = d3ddm.Width;
+ pp.BackBufferHeight = d3ddm.Height;
+ if (m_bHighColorResolution) {
+ pp.BackBufferFormat = D3DFMT_A2R10G10B10;
+ } else {
+ pp.BackBufferFormat = d3ddm.Format;
+ }
+ if (FAILED(m_pD3DEx->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, pp.BackBufferFormat, pp.BackBufferFormat, false))) {
+ _Error += L"10 bit RGB is not supported by this graphics device in exclusive mode fullscreen.\n";
+ return hr;
+ }
+
+ D3DDISPLAYMODEEX DisplayMode;
+ ZeroMemory(&DisplayMode, sizeof(DisplayMode));
+ DisplayMode.Size = sizeof(DisplayMode);
+ if (m_pD3DDevEx) {
+ m_pD3DEx->GetAdapterDisplayModeEx(GetAdapter(m_pD3DEx), &DisplayMode, NULL);
+ DisplayMode.Format = pp.BackBufferFormat;
+ pp.FullScreen_RefreshRateInHz = DisplayMode.RefreshRate;
+ if FAILED(m_pD3DDevEx->Reset(&pp)) {
+ _Error += GetWindowsErrorMessage(hr, m_hD3D9);
+ return hr;
+ }
+ } else if (m_pD3DDev) {
+ if FAILED(m_pD3DDev->Reset(&pp)) {
+ _Error += GetWindowsErrorMessage(hr, m_hD3D9);
+ return hr;
+ }
+ } else {
+ _Error += L"No device.\n";
+ return hr;
+ }
+ m_BackbufferType = pp.BackBufferFormat;
+ m_DisplayType = d3ddm.Format;
+ } else { // Windowed
+ pp.BackBufferWidth = d3ddm.Width;
+ pp.BackBufferHeight = d3ddm.Height;
+ m_BackbufferType = d3ddm.Format;
+ m_DisplayType = d3ddm.Format;
+ if (m_bHighColorResolution) {
+ m_BackbufferType = D3DFMT_A2R10G10B10;
+ pp.BackBufferFormat = D3DFMT_A2R10G10B10;
+ }
+ if (FAILED(m_pD3DEx->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, pp.BackBufferFormat, pp.BackBufferFormat, false))) {
+ _Error += L"10 bit RGB is not supported by this graphics device in windowed mode.\n";
+ return hr;
+ }
+ if (bCompositionEnabled) {
+ // Desktop composition presents the whole desktop
+ pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
+ } else {
+ pp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
+ }
+ if (m_pD3DDevEx)
+ if FAILED(m_pD3DDevEx->Reset(&pp)) {
+ _Error += GetWindowsErrorMessage(hr, m_hD3D9);
+ return hr;
+ } else if (m_pD3DDev)
+ if FAILED(m_pD3DDevEx->Reset(&pp)) {
+ _Error += GetWindowsErrorMessage(hr, m_hD3D9);
+ return hr;
+ } else {
+ _Error += L"No device.\n";
+ return hr;
+ }
+ }
+
+ if (disconnected) {
+ for (DWORD i = 0; i < decoderOutput.size(); i++) {
+ if (FAILED(filterInfo.pGraph->ConnectDirect(decoderOutput.at(i).p, rendererInput.at(i).p, NULL))) {
+ return hr;
+ }
+ }
+
+ if (filterInfo.pGraph != NULL) {
+ filterInfo.pGraph->Release();
+ }
+ }
+
+ m_pPSC.Attach(DNew CPixelShaderCompiler(m_pD3DDev, true));
+ m_filter = D3DTEXF_NONE;
+
+ if ((m_caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MINFLINEAR)
+ && (m_caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR)) {
+ m_filter = D3DTEXF_LINEAR;
+ }
+
+ m_bicubicA = 0;
+
+ CComPtr<ISubPicProvider> pSubPicProvider;
+ if (m_pSubPicQueue) {
+ m_pSubPicQueue->GetSubPicProvider(&pSubPicProvider);
+ }
+ CSize size;
+ switch (GetRenderersSettings().nSPCMaxRes) {
+ case 0:
+ default:
+ size = m_ScreenSize;
+ break;
+ case 1:
+ size.SetSize(1024, 768);
+ break;
+ case 2:
+ size.SetSize(800, 600);
+ break;
+ case 3:
+ size.SetSize(640, 480);
+ break;
+ case 4:
+ size.SetSize(512, 384);
+ break;
+ case 5:
+ size.SetSize(384, 288);
+ break;
+ case 6:
+ size.SetSize(2560, 1600);
+ break;
+ case 7:
+ size.SetSize(1920, 1080);
+ break;
+ case 8:
+ size.SetSize(1320, 900);
+ break;
+ case 9:
+ size.SetSize(1280, 720);
+ break;
+ }
+
+ if (m_pAllocator) {
+ m_pAllocator->ChangeDevice(m_pD3DDev);
+ } else {
+ m_pAllocator = DNew CDX9SubPicAllocator(m_pD3DDev, size, GetRenderersSettings().fSPCPow2Tex, false);
+ if (!m_pAllocator) {
+ _Error += L"CDX9SubPicAllocator failed\n";
+
+ return E_FAIL;
+ }
+ }
+
+ hr = S_OK;
+ m_pSubPicQueue = GetRenderersSettings().nSPCSize > 0
+ ? (ISubPicQueue*)DNew CSubPicQueue(GetRenderersSettings().nSPCSize, !GetRenderersSettings().fSPCAllowAnimationWhenBuffering, m_pAllocator, &hr)
+ : (ISubPicQueue*)DNew CSubPicQueueNoThread(m_pAllocator, &hr);
+ if (!m_pSubPicQueue || FAILED(hr)) {
+ _Error += L"m_pSubPicQueue failed\n";
+
+ return E_FAIL;
+ }
+
+ if (pSubPicProvider) {
+ m_pSubPicQueue->SetSubPicProvider(pSubPicProvider);
+ }
+
+ m_pFont = NULL;
+ if (m_pD3DXCreateFont) {
+ int MinSize = 1600;
+ int CurrentSize = min(m_ScreenSize.cx, MinSize);
+ double Scale = double(CurrentSize) / double(MinSize);
+ m_TextScale = Scale;
+ m_pD3DXCreateFont(m_pD3DDev, (int)(-24.0 * Scale), (UINT)(-11.0 * Scale), CurrentSize < 800 ? FW_NORMAL : FW_BOLD, 0, FALSE,
+ DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FIXED_PITCH | FF_DONTCARE, L"Lucida Console", &m_pFont);
+ }
+ m_pSprite = NULL;
+ if (m_pD3DXCreateSprite) {
+ m_pD3DXCreateSprite(m_pD3DDev, &m_pSprite);
+ }
+ m_pLine = NULL;
+ if (m_pD3DXCreateLine) {
+ m_pD3DXCreateLine(m_pD3DDev, &m_pLine);
+ }
+ return S_OK;
}
HRESULT CBaseAP::AllocSurfaces(D3DFORMAT Format)
{
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_allocatorLock);
-
- CRenderersSettings& s = GetRenderersSettings();
-
- for (int i = 0; i < m_nDXSurface+2; i++) {
- m_pVideoTexture[i] = NULL;
- m_pVideoSurface[i] = NULL;
- }
-
- m_pScreenSizeTemporaryTexture[0] = NULL;
- m_pScreenSizeTemporaryTexture[1] = NULL;
- m_SurfaceType = Format;
-
- HRESULT hr;
- if (s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE2D || s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D) {
- int nTexturesNeeded = s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D ? m_nDXSurface+2 : 1;
-
- for (int i = 0; i < nTexturesNeeded; i++) {
- if (FAILED(hr = m_pD3DDev->CreateTexture(
- m_NativeVideoSize.cx, m_NativeVideoSize.cy, 1, D3DUSAGE_RENDERTARGET, Format, D3DPOOL_DEFAULT, &m_pVideoTexture[i], NULL))) {
- return hr;
- }
-
- if (FAILED(hr = m_pVideoTexture[i]->GetSurfaceLevel(0, &m_pVideoSurface[i]))) {
- return hr;
- }
- }
- if (s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE2D) {
- for (int i = 0; i < m_nDXSurface+2; i++) {
- m_pVideoTexture[i] = NULL;
- }
- }
- } else {
- if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(m_NativeVideoSize.cx, m_NativeVideoSize.cy, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &m_pVideoSurface[m_nCurSurface], NULL))) {
- return hr;
- }
- }
-
- hr = m_pD3DDev->ColorFill(m_pVideoSurface[m_nCurSurface], NULL, 0);
- return S_OK;
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_allocatorLock);
+
+ CRenderersSettings& s = GetRenderersSettings();
+
+ for (int i = 0; i < m_nDXSurface + 2; i++) {
+ m_pVideoTexture[i] = NULL;
+ m_pVideoSurface[i] = NULL;
+ }
+
+ m_pScreenSizeTemporaryTexture[0] = NULL;
+ m_pScreenSizeTemporaryTexture[1] = NULL;
+ m_SurfaceType = Format;
+
+ HRESULT hr;
+ if (s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE2D || s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D) {
+ int nTexturesNeeded = s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D ? m_nDXSurface + 2 : 1;
+
+ for (int i = 0; i < nTexturesNeeded; i++) {
+ if (FAILED(hr = m_pD3DDev->CreateTexture(
+ m_NativeVideoSize.cx, m_NativeVideoSize.cy, 1, D3DUSAGE_RENDERTARGET, Format, D3DPOOL_DEFAULT, &m_pVideoTexture[i], NULL))) {
+ return hr;
+ }
+
+ if (FAILED(hr = m_pVideoTexture[i]->GetSurfaceLevel(0, &m_pVideoSurface[i]))) {
+ return hr;
+ }
+ }
+ if (s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE2D) {
+ for (int i = 0; i < m_nDXSurface + 2; i++) {
+ m_pVideoTexture[i] = NULL;
+ }
+ }
+ } else {
+ if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(m_NativeVideoSize.cx, m_NativeVideoSize.cy, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &m_pVideoSurface[m_nCurSurface], NULL))) {
+ return hr;
+ }
+ }
+
+ hr = m_pD3DDev->ColorFill(m_pVideoSurface[m_nCurSurface], NULL, 0);
+ return S_OK;
}
void CBaseAP::DeleteSurfaces()
{
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_allocatorLock);
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_allocatorLock);
- for (int i = 0; i < m_nDXSurface+2; i++) {
- m_pVideoTexture[i] = NULL;
- m_pVideoSurface[i] = NULL;
- }
+ for (int i = 0; i < m_nDXSurface + 2; i++) {
+ m_pVideoTexture[i] = NULL;
+ m_pVideoSurface[i] = NULL;
+ }
}
UINT CBaseAP::GetAdapter(IDirect3D9* pD3D)
{
- if (m_hWnd == NULL || pD3D == NULL) {
- return D3DADAPTER_DEFAULT;
- }
+ if (m_hWnd == NULL || pD3D == NULL) {
+ return D3DADAPTER_DEFAULT;
+ }
- HMONITOR hMonitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
- if (hMonitor == NULL) {
- return D3DADAPTER_DEFAULT;
- }
+ HMONITOR hMonitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
+ if (hMonitor == NULL) {
+ return D3DADAPTER_DEFAULT;
+ }
- for (UINT adp = 0, num_adp = pD3D->GetAdapterCount(); adp < num_adp; ++adp) {
- HMONITOR hAdpMon = pD3D->GetAdapterMonitor(adp);
- if (hAdpMon == hMonitor) {
- return adp;
- }
- }
- return D3DADAPTER_DEFAULT;
+ for (UINT adp = 0, num_adp = pD3D->GetAdapterCount(); adp < num_adp; ++adp) {
+ HMONITOR hAdpMon = pD3D->GetAdapterMonitor(adp);
+ if (hAdpMon == hMonitor) {
+ return adp;
+ }
+ }
+ return D3DADAPTER_DEFAULT;
}
// ISubPicAllocatorPresenter
STDMETHODIMP CBaseAP::CreateRenderer(IUnknown** ppRenderer)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
bool CBaseAP::ClipToSurface(IDirect3DSurface9* pSurface, CRect& s, CRect& d)
{
- D3DSURFACE_DESC d3dsd;
- ZeroMemory(&d3dsd, sizeof(d3dsd));
- if (FAILED(pSurface->GetDesc(&d3dsd))) {
- return false;
- }
-
- int w = d3dsd.Width, h = d3dsd.Height;
- int sw = s.Width(), sh = s.Height();
- int dw = d.Width(), dh = d.Height();
-
- if (d.left >= w || d.right < 0 || d.top >= h || d.bottom < 0
- || sw <= 0 || sh <= 0 || dw <= 0 || dh <= 0) {
- s.SetRectEmpty();
- d.SetRectEmpty();
- return true;
- }
- if (d.right > w) {
- s.right -= (d.right-w)*sw/dw;
- d.right = w;
- }
- if (d.bottom > h) {
- s.bottom -= (d.bottom-h)*sh/dh;
- d.bottom = h;
- }
- if (d.left < 0) {
- s.left += (0-d.left)*sw/dw;
- d.left = 0;
- }
- if (d.top < 0) {
- s.top += (0-d.top)*sh/dh;
- d.top = 0;
- }
- return true;
+ D3DSURFACE_DESC d3dsd;
+ ZeroMemory(&d3dsd, sizeof(d3dsd));
+ if (FAILED(pSurface->GetDesc(&d3dsd))) {
+ return false;
+ }
+
+ int w = d3dsd.Width, h = d3dsd.Height;
+ int sw = s.Width(), sh = s.Height();
+ int dw = d.Width(), dh = d.Height();
+
+ if (d.left >= w || d.right < 0 || d.top >= h || d.bottom < 0
+ || sw <= 0 || sh <= 0 || dw <= 0 || dh <= 0) {
+ s.SetRectEmpty();
+ d.SetRectEmpty();
+ return true;
+ }
+ if (d.right > w) {
+ s.right -= (d.right - w) * sw / dw;
+ d.right = w;
+ }
+ if (d.bottom > h) {
+ s.bottom -= (d.bottom - h) * sh / dh;
+ d.bottom = h;
+ }
+ if (d.left < 0) {
+ s.left += (0 - d.left) * sw / dw;
+ d.left = 0;
+ }
+ if (d.top < 0) {
+ s.top += (0 - d.top) * sh / dh;
+ d.top = 0;
+ }
+ return true;
}
HRESULT CBaseAP::InitResizers(float bicubicA, bool bNeedScreenSizeTexture)
{
- HRESULT hr;
- do {
- if (bicubicA) {
- if (!m_pResizerPixelShader[0]) {
- break;
- }
- if (!m_pResizerPixelShader[1]) {
- break;
- }
- if (!m_pResizerPixelShader[2]) {
- break;
- }
- if (!m_pResizerPixelShader[3]) {
- break;
- }
- if (m_bicubicA != bicubicA) {
- break;
- }
- if (!m_pScreenSizeTemporaryTexture[0]) {
- break;
- }
- if (bNeedScreenSizeTexture) {
- if (!m_pScreenSizeTemporaryTexture[1]) {
- break;
- }
- }
- } else {
- if (!m_pResizerPixelShader[0]) {
- break;
- }
- if (bNeedScreenSizeTexture) {
- if (!m_pScreenSizeTemporaryTexture[0]) {
- break;
- }
- if (!m_pScreenSizeTemporaryTexture[1]) {
- break;
- }
- }
- }
- return S_OK;
- } while (0);
-
- m_bicubicA = bicubicA;
- m_pScreenSizeTemporaryTexture[0] = NULL;
- m_pScreenSizeTemporaryTexture[1] = NULL;
-
- for (int i = 0; i < _countof(m_pResizerPixelShader); i++) {
- m_pResizerPixelShader[i] = NULL;
- }
-
- if (m_caps.PixelShaderVersion < D3DPS_VERSION(2, 0)) {
- return E_FAIL;
- }
-
- LPCSTR pProfile = m_caps.PixelShaderVersion >= D3DPS_VERSION(3, 0) ? "ps_3_0" : "ps_2_0";
-
- CStringA str;
- if (!LoadResource(IDF_SHADER_RESIZER, str, _T("FILE"))) {
- return E_FAIL;
- }
-
- CStringA A;
- A.Format("(%f)", bicubicA);
- str.Replace("_The_Value_Of_A_Is_Set_Here_", A);
-
- LPCSTR pEntries[] = {"main_bilinear", "main_bicubic1pass", "main_bicubic2pass_pass1", "main_bicubic2pass_pass2"};
-
- ASSERT(_countof(pEntries) == _countof(m_pResizerPixelShader));
- for (int i = 0; i < _countof(pEntries); i++) {
- CString ErrorMessage;
- CString DissAssembly;
- hr = m_pPSC->CompileShader(str, pEntries[i], pProfile, 0, &m_pResizerPixelShader[i], &DissAssembly, &ErrorMessage);
- if (FAILED(hr)) {
- TRACE("%ws", ErrorMessage.GetString());
- ASSERT (0);
- return hr;
- }
- }
- if (m_bicubicA || bNeedScreenSizeTexture) {
- if (FAILED(m_pD3DDev->CreateTexture(
- min(m_ScreenSize.cx, (int)m_caps.MaxTextureWidth), min(max(m_ScreenSize.cy, m_NativeVideoSize.cy), (int)m_caps.MaxTextureHeight), 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
- D3DPOOL_DEFAULT, &m_pScreenSizeTemporaryTexture[0], NULL))) {
- ASSERT(0);
- m_pScreenSizeTemporaryTexture[0] = NULL; // will do 1 pass then
- }
- }
- if (m_bicubicA || bNeedScreenSizeTexture) {
- if (FAILED(m_pD3DDev->CreateTexture(
- min(m_ScreenSize.cx, (int)m_caps.MaxTextureWidth), min(max(m_ScreenSize.cy, m_NativeVideoSize.cy), (int)m_caps.MaxTextureHeight), 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
- D3DPOOL_DEFAULT, &m_pScreenSizeTemporaryTexture[1], NULL))) {
- ASSERT(0);
- m_pScreenSizeTemporaryTexture[1] = NULL; // will do 1 pass then
- }
- }
- return S_OK;
+ HRESULT hr;
+ do {
+ if (bicubicA) {
+ if (!m_pResizerPixelShader[0]) {
+ break;
+ }
+ if (!m_pResizerPixelShader[1]) {
+ break;
+ }
+ if (!m_pResizerPixelShader[2]) {
+ break;
+ }
+ if (!m_pResizerPixelShader[3]) {
+ break;
+ }
+ if (m_bicubicA != bicubicA) {
+ break;
+ }
+ if (!m_pScreenSizeTemporaryTexture[0]) {
+ break;
+ }
+ if (bNeedScreenSizeTexture) {
+ if (!m_pScreenSizeTemporaryTexture[1]) {
+ break;
+ }
+ }
+ } else {
+ if (!m_pResizerPixelShader[0]) {
+ break;
+ }
+ if (bNeedScreenSizeTexture) {
+ if (!m_pScreenSizeTemporaryTexture[0]) {
+ break;
+ }
+ if (!m_pScreenSizeTemporaryTexture[1]) {
+ break;
+ }
+ }
+ }
+ return S_OK;
+ } while (0);
+
+ m_bicubicA = bicubicA;
+ m_pScreenSizeTemporaryTexture[0] = NULL;
+ m_pScreenSizeTemporaryTexture[1] = NULL;
+
+ for (int i = 0; i < _countof(m_pResizerPixelShader); i++) {
+ m_pResizerPixelShader[i] = NULL;
+ }
+
+ if (m_caps.PixelShaderVersion < D3DPS_VERSION(2, 0)) {
+ return E_FAIL;
+ }
+
+ LPCSTR pProfile = m_caps.PixelShaderVersion >= D3DPS_VERSION(3, 0) ? "ps_3_0" : "ps_2_0";
+
+ CStringA str;
+ if (!LoadResource(IDF_SHADER_RESIZER, str, _T("FILE"))) {
+ return E_FAIL;
+ }
+
+ CStringA A;
+ A.Format("(%f)", bicubicA);
+ str.Replace("_The_Value_Of_A_Is_Set_Here_", A);
+
+ LPCSTR pEntries[] = {"main_bilinear", "main_bicubic1pass", "main_bicubic2pass_pass1", "main_bicubic2pass_pass2"};
+
+ ASSERT(_countof(pEntries) == _countof(m_pResizerPixelShader));
+ for (int i = 0; i < _countof(pEntries); i++) {
+ CString ErrorMessage;
+ CString DissAssembly;
+ hr = m_pPSC->CompileShader(str, pEntries[i], pProfile, 0, &m_pResizerPixelShader[i], &DissAssembly, &ErrorMessage);
+ if (FAILED(hr)) {
+ TRACE("%ws", ErrorMessage.GetString());
+ ASSERT(0);
+ return hr;
+ }
+ }
+ if (m_bicubicA || bNeedScreenSizeTexture) {
+ if (FAILED(m_pD3DDev->CreateTexture(
+ min(m_ScreenSize.cx, (int)m_caps.MaxTextureWidth), min(max(m_ScreenSize.cy, m_NativeVideoSize.cy), (int)m_caps.MaxTextureHeight), 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
+ D3DPOOL_DEFAULT, &m_pScreenSizeTemporaryTexture[0], NULL))) {
+ ASSERT(0);
+ m_pScreenSizeTemporaryTexture[0] = NULL; // will do 1 pass then
+ }
+ }
+ if (m_bicubicA || bNeedScreenSizeTexture) {
+ if (FAILED(m_pD3DDev->CreateTexture(
+ min(m_ScreenSize.cx, (int)m_caps.MaxTextureWidth), min(max(m_ScreenSize.cy, m_NativeVideoSize.cy), (int)m_caps.MaxTextureHeight), 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
+ D3DPOOL_DEFAULT, &m_pScreenSizeTemporaryTexture[1], NULL))) {
+ ASSERT(0);
+ m_pScreenSizeTemporaryTexture[1] = NULL; // will do 1 pass then
+ }
+ }
+ return S_OK;
}
HRESULT CBaseAP::TextureCopy(IDirect3DTexture9* pTexture)
{
- HRESULT hr;
-
- D3DSURFACE_DESC desc;
- if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
- return E_FAIL;
- }
-
- float w = (float)desc.Width;
- float h = (float)desc.Height;
- MYD3DVERTEX<1> v[] = {
- {0, 0, 0.5f, 2.0f, 0, 0},
- {w, 0, 0.5f, 2.0f, 1, 0},
- {0, h, 0.5f, 2.0f, 0, 1},
- {w, h, 0.5f, 2.0f, 1, 1},
- };
- for (int i = 0; i < _countof(v); i++) {
- v[i].x -= 0.5;
- v[i].y -= 0.5;
- }
- hr = m_pD3DDev->SetTexture(0, pTexture);
- return TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
-}
-
-HRESULT CBaseAP::DrawRect(DWORD _Color, DWORD _Alpha, const CRect &_Rect)
-{
- DWORD Color = D3DCOLOR_ARGB(_Alpha, GetRValue(_Color), GetGValue(_Color), GetBValue(_Color));
- MYD3DVERTEX<0> v[] = {
- {float(_Rect.left), float(_Rect.top), 0.5f, 2.0f, Color},
- {float(_Rect.right), float(_Rect.top), 0.5f, 2.0f, Color},
- {float(_Rect.left), float(_Rect.bottom), 0.5f, 2.0f, Color},
- {float(_Rect.right), float(_Rect.bottom), 0.5f, 2.0f, Color},
- };
- for (int i = 0; i < _countof(v); i++) {
- v[i].x -= 0.5;
- v[i].y -= 0.5;
- }
- return DrawRectBase(m_pD3DDev, v);
-}
-
-HRESULT CBaseAP::TextureResize(IDirect3DTexture9* pTexture, Vector dst[4], D3DTEXTUREFILTERTYPE filter, const CRect &SrcRect)
-{
- HRESULT hr;
-
- D3DSURFACE_DESC desc;
- if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
- return E_FAIL;
- }
-
- float w = (float)desc.Width;
- float h = (float)desc.Height;
-
- float dx2 = 1.0f/w;
- float dy2 = 1.0f/h;
-
- MYD3DVERTEX<1> v[] = {
- {dst[0].x, dst[0].y, dst[0].z, 1.0f/dst[0].z, SrcRect.left * dx2, SrcRect.top * dy2},
- {dst[1].x, dst[1].y, dst[1].z, 1.0f/dst[1].z, SrcRect.right * dx2, SrcRect.top * dy2},
- {dst[2].x, dst[2].y, dst[2].z, 1.0f/dst[2].z, SrcRect.left * dx2, SrcRect.bottom * dy2},
- {dst[3].x, dst[3].y, dst[3].z, 1.0f/dst[3].z, SrcRect.right * dx2, SrcRect.bottom * dy2},
- };
- AdjustQuad(v, 0, 0);
- hr = m_pD3DDev->SetTexture(0, pTexture);
- hr = m_pD3DDev->SetPixelShader(NULL);
- hr = TextureBlt(m_pD3DDev, v, filter);
- return hr;
-}
-
-HRESULT CBaseAP::TextureResizeBilinear(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &SrcRect)
-{
- HRESULT hr;
-
- D3DSURFACE_DESC desc;
- if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
- return E_FAIL;
- }
-
- float w = (float)desc.Width;
- float h = (float)desc.Height;
-
- float tx0 = (float)SrcRect.left;
- float tx1 = (float)SrcRect.right;
- float ty0 = (float)SrcRect.top;
- float ty1 = (float)SrcRect.bottom;
-
- MYD3DVERTEX<1> v[] = {
- {dst[0].x, dst[0].y, dst[0].z, 1.0f/dst[0].z, tx0, ty0},
- {dst[1].x, dst[1].y, dst[1].z, 1.0f/dst[1].z, tx1, ty0},
- {dst[2].x, dst[2].y, dst[2].z, 1.0f/dst[2].z, tx0, ty1},
- {dst[3].x, dst[3].y, dst[3].z, 1.0f/dst[3].z, tx1, ty1},
- };
- AdjustQuad(v, 1.0, 1.0);
- float fConstData[][4] = {{0.5f / w, 0.5f / h, 0, 0}, {1.0f / w, 1.0f / h, 0, 0}, {1.0f / w, 0, 0, 0}, {0, 1.0f / h, 0, 0}, {w, h, 0, 0}};
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
- hr = m_pD3DDev->SetTexture(0, pTexture);
- hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShader[0]);
- hr = TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
- m_pD3DDev->SetPixelShader(NULL);
- return hr;
-}
-
-HRESULT CBaseAP::TextureResizeBicubic1pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &SrcRect)
-{
- HRESULT hr;
-
- D3DSURFACE_DESC desc;
- if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
- return E_FAIL;
- }
-
- float w = (float)desc.Width;
- float h = (float)desc.Height;
-
- float tx0 = (float)SrcRect.left;
- float tx1 = (float)SrcRect.right;
- float ty0 = (float)SrcRect.top;
- float ty1 = (float)SrcRect.bottom;
-
- MYD3DVERTEX<1> v[] = {
- {dst[0].x, dst[0].y, dst[0].z, 1.0f/dst[0].z, tx0, ty0},
- {dst[1].x, dst[1].y, dst[1].z, 1.0f/dst[1].z, tx1, ty0},
- {dst[2].x, dst[2].y, dst[2].z, 1.0f/dst[2].z, tx0, ty1},
- {dst[3].x, dst[3].y, dst[3].z, 1.0f/dst[3].z, tx1, ty1},
- };
- AdjustQuad(v, 1.0, 1.0);
- hr = m_pD3DDev->SetTexture(0, pTexture);
- float fConstData[][4] = {{0.5f / w, 0.5f / h, 0, 0}, {1.0f / w, 1.0f / h, 0, 0}, {1.0f / w, 0, 0, 0}, {0, 1.0f / h, 0, 0}, {w, h, 0, 0}};
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
- hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShader[1]);
- hr = TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
- m_pD3DDev->SetPixelShader(NULL);
- return hr;
-}
-
-HRESULT CBaseAP::TextureResizeBicubic2pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &SrcRect)
-{
- // The 2 pass sampler is incorrect in that it only does bilinear resampling in the y direction.
- return TextureResizeBicubic1pass(pTexture, dst, SrcRect);
-
- /*HRESULT hr;
-
- // rotated?
- if (dst[0].z != dst[1].z || dst[2].z != dst[3].z || dst[0].z != dst[3].z
- || dst[0].y != dst[1].y || dst[0].x != dst[2].x || dst[2].y != dst[3].y || dst[1].x != dst[3].x)
- return TextureResizeBicubic1pass(pTexture, dst, SrcRect);
-
- D3DSURFACE_DESC desc;
- if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc)))
- return E_FAIL;
-
- float Tex0_Width = desc.Width;
- float Tex0_Height = desc.Height;
-
- CSize SrcTextSize = CSize(desc.Width, desc.Height);
- double w = (double)SrcRect.Width();
- double h = (double)SrcRect.Height();
- UNREFERENCED_PARAMETER(w);
-
- CRect dst1(0, 0, (int)(dst[3].x - dst[0].x), (int)h);
-
- if (!m_pScreenSizeTemporaryTexture[0] || FAILED(m_pScreenSizeTemporaryTexture[0]->GetLevelDesc(0, &desc)))
- return TextureResizeBicubic1pass(pTexture, dst, SrcRect);
-
- float Tex1_Width = desc.Width;
- float Tex1_Height = desc.Height;
-
- float tx0 = SrcRect.left;
- float tx1 = SrcRect.right;
- float ty0 = SrcRect.top;
- float ty1 = SrcRect.bottom;
-
- float tx0_2 = 0;
- float tx1_2 = dst1.Width();
- float ty0_2 = 0;
- float ty1_2 = h;
-
- if (dst1.Width() > (int)desc.Width || dst1.Height() > (int)desc.Height)
- return TextureResizeBicubic1pass(pTexture, dst, SrcRect);
-
- MYD3DVERTEX<1> vx[] =
- {
- {(float)dst1.left, (float)dst1.top, 0.5f, 2.0f, tx0, ty0},
- {(float)dst1.right, (float)dst1.top, 0.5f, 2.0f, tx1, ty0},
- {(float)dst1.left, (float)dst1.bottom, 0.5f, 2.0f, tx0, ty1},
- {(float)dst1.right, (float)dst1.bottom, 0.5f, 2.0f, tx1, ty1},
- };
- AdjustQuad(vx, 1.0, 0.0); // Casimir666 : bug here, create vertical lines ! TODO : why ??????
- MYD3DVERTEX<1> vy[] =
- {
- {dst[0].x, dst[0].y, dst[0].z, 1.0/dst[0].z, tx0_2, ty0_2},
- {dst[1].x, dst[1].y, dst[1].z, 1.0/dst[1].z, tx1_2, ty0_2},
- {dst[2].x, dst[2].y, dst[2].z, 1.0/dst[2].z, tx0_2, ty1_2},
- {dst[3].x, dst[3].y, dst[3].z, 1.0/dst[3].z, tx1_2, ty1_2},
- };
- AdjustQuad(vy, 0.0, 1.0);
- hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShader[2]);
- {
- float fConstData[][4] = {{0.5f / Tex0_Width, 0.5f / Tex0_Height, 0, 0}, {1.0f / Tex0_Width, 1.0f / Tex0_Height, 0, 0}, {1.0f / Tex0_Width, 0, 0, 0}, {0, 1.0f / Tex0_Height, 0, 0}, {Tex0_Width, Tex0_Height, 0, 0}};
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
- }
- hr = m_pD3DDev->SetTexture(0, pTexture);
- CComPtr<IDirect3DSurface9> pRTOld;
- hr = m_pD3DDev->GetRenderTarget(0, &pRTOld);
- CComPtr<IDirect3DSurface9> pRT;
- hr = m_pScreenSizeTemporaryTexture[0]->GetSurfaceLevel(0, &pRT);
- hr = m_pD3DDev->SetRenderTarget(0, pRT);
- hr = TextureBlt(m_pD3DDev, vx, D3DTEXF_POINT);
- hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShader[3]);
- {
- float fConstData[][4] = {{0.5f / Tex1_Width, 0.5f / Tex1_Height, 0, 0}, {1.0f / Tex1_Width, 1.0f / Tex1_Height, 0, 0}, {1.0f / Tex1_Width, 0, 0, 0}, {0, 1.0f / Tex1_Height, 0, 0}, {Tex1_Width, Tex1_Height, 0, 0}};
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
- }
- hr = m_pD3DDev->SetTexture(0, m_pScreenSizeTemporaryTexture[0]);
- hr = m_pD3DDev->SetRenderTarget(0, pRTOld);
- hr = TextureBlt(m_pD3DDev, vy, D3DTEXF_POINT);
- m_pD3DDev->SetPixelShader(NULL);
- return hr;*/
+ HRESULT hr;
+
+ D3DSURFACE_DESC desc;
+ if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
+ return E_FAIL;
+ }
+
+ float w = (float)desc.Width;
+ float h = (float)desc.Height;
+ MYD3DVERTEX<1> v[] = {
+ {0, 0, 0.5f, 2.0f, 0, 0},
+ {w, 0, 0.5f, 2.0f, 1, 0},
+ {0, h, 0.5f, 2.0f, 0, 1},
+ {w, h, 0.5f, 2.0f, 1, 1},
+ };
+ for (int i = 0; i < _countof(v); i++) {
+ v[i].x -= 0.5;
+ v[i].y -= 0.5;
+ }
+ hr = m_pD3DDev->SetTexture(0, pTexture);
+ return TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
+}
+
+HRESULT CBaseAP::DrawRect(DWORD _Color, DWORD _Alpha, const CRect& _Rect)
+{
+ DWORD Color = D3DCOLOR_ARGB(_Alpha, GetRValue(_Color), GetGValue(_Color), GetBValue(_Color));
+ MYD3DVERTEX<0> v[] = {
+ {float(_Rect.left), float(_Rect.top), 0.5f, 2.0f, Color},
+ {float(_Rect.right), float(_Rect.top), 0.5f, 2.0f, Color},
+ {float(_Rect.left), float(_Rect.bottom), 0.5f, 2.0f, Color},
+ {float(_Rect.right), float(_Rect.bottom), 0.5f, 2.0f, Color},
+ };
+ for (int i = 0; i < _countof(v); i++) {
+ v[i].x -= 0.5;
+ v[i].y -= 0.5;
+ }
+ return DrawRectBase(m_pD3DDev, v);
+}
+
+HRESULT CBaseAP::TextureResize(IDirect3DTexture9* pTexture, Vector dst[4], D3DTEXTUREFILTERTYPE filter, const CRect& SrcRect)
+{
+ HRESULT hr;
+
+ D3DSURFACE_DESC desc;
+ if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
+ return E_FAIL;
+ }
+
+ float w = (float)desc.Width;
+ float h = (float)desc.Height;
+
+ float dx2 = 1.0f / w;
+ float dy2 = 1.0f / h;
+
+ MYD3DVERTEX<1> v[] = {
+ {dst[0].x, dst[0].y, dst[0].z, 1.0f / dst[0].z, SrcRect.left * dx2, SrcRect.top * dy2},
+ {dst[1].x, dst[1].y, dst[1].z, 1.0f / dst[1].z, SrcRect.right * dx2, SrcRect.top * dy2},
+ {dst[2].x, dst[2].y, dst[2].z, 1.0f / dst[2].z, SrcRect.left * dx2, SrcRect.bottom * dy2},
+ {dst[3].x, dst[3].y, dst[3].z, 1.0f / dst[3].z, SrcRect.right * dx2, SrcRect.bottom * dy2},
+ };
+ AdjustQuad(v, 0, 0);
+ hr = m_pD3DDev->SetTexture(0, pTexture);
+ hr = m_pD3DDev->SetPixelShader(NULL);
+ hr = TextureBlt(m_pD3DDev, v, filter);
+ return hr;
+}
+
+HRESULT CBaseAP::TextureResizeBilinear(IDirect3DTexture9* pTexture, Vector dst[4], const CRect& SrcRect)
+{
+ HRESULT hr;
+
+ D3DSURFACE_DESC desc;
+ if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
+ return E_FAIL;
+ }
+
+ float w = (float)desc.Width;
+ float h = (float)desc.Height;
+
+ float tx0 = (float)SrcRect.left;
+ float tx1 = (float)SrcRect.right;
+ float ty0 = (float)SrcRect.top;
+ float ty1 = (float)SrcRect.bottom;
+
+ MYD3DVERTEX<1> v[] = {
+ {dst[0].x, dst[0].y, dst[0].z, 1.0f / dst[0].z, tx0, ty0},
+ {dst[1].x, dst[1].y, dst[1].z, 1.0f / dst[1].z, tx1, ty0},
+ {dst[2].x, dst[2].y, dst[2].z, 1.0f / dst[2].z, tx0, ty1},
+ {dst[3].x, dst[3].y, dst[3].z, 1.0f / dst[3].z, tx1, ty1},
+ };
+ AdjustQuad(v, 1.0, 1.0);
+ float fConstData[][4] = {{0.5f / w, 0.5f / h, 0, 0}, {1.0f / w, 1.0f / h, 0, 0}, {1.0f / w, 0, 0, 0}, {0, 1.0f / h, 0, 0}, {w, h, 0, 0}};
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+ hr = m_pD3DDev->SetTexture(0, pTexture);
+ hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShader[0]);
+ hr = TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
+ m_pD3DDev->SetPixelShader(NULL);
+ return hr;
+}
+
+HRESULT CBaseAP::TextureResizeBicubic1pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect& SrcRect)
+{
+ HRESULT hr;
+
+ D3DSURFACE_DESC desc;
+ if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc))) {
+ return E_FAIL;
+ }
+
+ float w = (float)desc.Width;
+ float h = (float)desc.Height;
+
+ float tx0 = (float)SrcRect.left;
+ float tx1 = (float)SrcRect.right;
+ float ty0 = (float)SrcRect.top;
+ float ty1 = (float)SrcRect.bottom;
+
+ MYD3DVERTEX<1> v[] = {
+ {dst[0].x, dst[0].y, dst[0].z, 1.0f / dst[0].z, tx0, ty0},
+ {dst[1].x, dst[1].y, dst[1].z, 1.0f / dst[1].z, tx1, ty0},
+ {dst[2].x, dst[2].y, dst[2].z, 1.0f / dst[2].z, tx0, ty1},
+ {dst[3].x, dst[3].y, dst[3].z, 1.0f / dst[3].z, tx1, ty1},
+ };
+ AdjustQuad(v, 1.0, 1.0);
+ hr = m_pD3DDev->SetTexture(0, pTexture);
+ float fConstData[][4] = {{0.5f / w, 0.5f / h, 0, 0}, {1.0f / w, 1.0f / h, 0, 0}, {1.0f / w, 0, 0, 0}, {0, 1.0f / h, 0, 0}, {w, h, 0, 0}};
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+ hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShader[1]);
+ hr = TextureBlt(m_pD3DDev, v, D3DTEXF_POINT);
+ m_pD3DDev->SetPixelShader(NULL);
+ return hr;
+}
+
+HRESULT CBaseAP::TextureResizeBicubic2pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect& SrcRect)
+{
+ // The 2 pass sampler is incorrect in that it only does bilinear resampling in the y direction.
+ return TextureResizeBicubic1pass(pTexture, dst, SrcRect);
+
+ /*HRESULT hr;
+
+ // rotated?
+ if (dst[0].z != dst[1].z || dst[2].z != dst[3].z || dst[0].z != dst[3].z
+ || dst[0].y != dst[1].y || dst[0].x != dst[2].x || dst[2].y != dst[3].y || dst[1].x != dst[3].x)
+ return TextureResizeBicubic1pass(pTexture, dst, SrcRect);
+
+ D3DSURFACE_DESC desc;
+ if (!pTexture || FAILED(pTexture->GetLevelDesc(0, &desc)))
+ return E_FAIL;
+
+ float Tex0_Width = desc.Width;
+ float Tex0_Height = desc.Height;
+
+ CSize SrcTextSize = CSize(desc.Width, desc.Height);
+ double w = (double)SrcRect.Width();
+ double h = (double)SrcRect.Height();
+ UNREFERENCED_PARAMETER(w);
+
+ CRect dst1(0, 0, (int)(dst[3].x - dst[0].x), (int)h);
+
+ if (!m_pScreenSizeTemporaryTexture[0] || FAILED(m_pScreenSizeTemporaryTexture[0]->GetLevelDesc(0, &desc)))
+ return TextureResizeBicubic1pass(pTexture, dst, SrcRect);
+
+ float Tex1_Width = desc.Width;
+ float Tex1_Height = desc.Height;
+
+ float tx0 = SrcRect.left;
+ float tx1 = SrcRect.right;
+ float ty0 = SrcRect.top;
+ float ty1 = SrcRect.bottom;
+
+ float tx0_2 = 0;
+ float tx1_2 = dst1.Width();
+ float ty0_2 = 0;
+ float ty1_2 = h;
+
+ if (dst1.Width() > (int)desc.Width || dst1.Height() > (int)desc.Height)
+ return TextureResizeBicubic1pass(pTexture, dst, SrcRect);
+
+ MYD3DVERTEX<1> vx[] =
+ {
+ {(float)dst1.left, (float)dst1.top, 0.5f, 2.0f, tx0, ty0},
+ {(float)dst1.right, (float)dst1.top, 0.5f, 2.0f, tx1, ty0},
+ {(float)dst1.left, (float)dst1.bottom, 0.5f, 2.0f, tx0, ty1},
+ {(float)dst1.right, (float)dst1.bottom, 0.5f, 2.0f, tx1, ty1},
+ };
+ AdjustQuad(vx, 1.0, 0.0); // Casimir666 : bug here, create vertical lines ! TODO : why ??????
+ MYD3DVERTEX<1> vy[] =
+ {
+ {dst[0].x, dst[0].y, dst[0].z, 1.0/dst[0].z, tx0_2, ty0_2},
+ {dst[1].x, dst[1].y, dst[1].z, 1.0/dst[1].z, tx1_2, ty0_2},
+ {dst[2].x, dst[2].y, dst[2].z, 1.0/dst[2].z, tx0_2, ty1_2},
+ {dst[3].x, dst[3].y, dst[3].z, 1.0/dst[3].z, tx1_2, ty1_2},
+ };
+ AdjustQuad(vy, 0.0, 1.0);
+ hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShader[2]);
+ {
+ float fConstData[][4] = {{0.5f / Tex0_Width, 0.5f / Tex0_Height, 0, 0}, {1.0f / Tex0_Width, 1.0f / Tex0_Height, 0, 0}, {1.0f / Tex0_Width, 0, 0, 0}, {0, 1.0f / Tex0_Height, 0, 0}, {Tex0_Width, Tex0_Height, 0, 0}};
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+ }
+ hr = m_pD3DDev->SetTexture(0, pTexture);
+ CComPtr<IDirect3DSurface9> pRTOld;
+ hr = m_pD3DDev->GetRenderTarget(0, &pRTOld);
+ CComPtr<IDirect3DSurface9> pRT;
+ hr = m_pScreenSizeTemporaryTexture[0]->GetSurfaceLevel(0, &pRT);
+ hr = m_pD3DDev->SetRenderTarget(0, pRT);
+ hr = TextureBlt(m_pD3DDev, vx, D3DTEXF_POINT);
+ hr = m_pD3DDev->SetPixelShader(m_pResizerPixelShader[3]);
+ {
+ float fConstData[][4] = {{0.5f / Tex1_Width, 0.5f / Tex1_Height, 0, 0}, {1.0f / Tex1_Width, 1.0f / Tex1_Height, 0, 0}, {1.0f / Tex1_Width, 0, 0, 0}, {0, 1.0f / Tex1_Height, 0, 0}, {Tex1_Width, Tex1_Height, 0, 0}};
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+ }
+ hr = m_pD3DDev->SetTexture(0, m_pScreenSizeTemporaryTexture[0]);
+ hr = m_pD3DDev->SetRenderTarget(0, pRTOld);
+ hr = TextureBlt(m_pD3DDev, vy, D3DTEXF_POINT);
+ m_pD3DDev->SetPixelShader(NULL);
+ return hr;*/
}
HRESULT CBaseAP::AlphaBlt(RECT* pSrc, RECT* pDst, IDirect3DTexture9* pTexture)
{
- if (!pSrc || !pDst) {
- return E_POINTER;
- }
+ if (!pSrc || !pDst) {
+ return E_POINTER;
+ }
- CRect src(*pSrc), dst(*pDst);
+ CRect src(*pSrc), dst(*pDst);
- HRESULT hr;
+ HRESULT hr;
- do {
- D3DSURFACE_DESC d3dsd;
- ZeroMemory(&d3dsd, sizeof(d3dsd));
- if (FAILED(pTexture->GetLevelDesc(0, &d3dsd)) /*|| d3dsd.Type != D3DRTYPE_TEXTURE*/) {
- break;
- }
+ do {
+ D3DSURFACE_DESC d3dsd;
+ ZeroMemory(&d3dsd, sizeof(d3dsd));
+ if (FAILED(pTexture->GetLevelDesc(0, &d3dsd)) /*|| d3dsd.Type != D3DRTYPE_TEXTURE*/) {
+ break;
+ }
- float w = (float)d3dsd.Width;
- float h = (float)d3dsd.Height;
+ float w = (float)d3dsd.Width;
+ float h = (float)d3dsd.Height;
- struct {
- float x, y, z, rhw;
- float tu, tv;
- }
- pVertices[] = {
- {(float)dst.left, (float)dst.top, 0.5f, 2.0f, (float)src.left / w, (float)src.top / h},
- {(float)dst.right, (float)dst.top, 0.5f, 2.0f, (float)src.right / w, (float)src.top / h},
- {(float)dst.left, (float)dst.bottom, 0.5f, 2.0f, (float)src.left / w, (float)src.bottom / h},
- {(float)dst.right, (float)dst.bottom, 0.5f, 2.0f, (float)src.right / w, (float)src.bottom / h},
- };
+ struct {
+ float x, y, z, rhw;
+ float tu, tv;
+ }
+ pVertices[] = {
+ {(float)dst.left, (float)dst.top, 0.5f, 2.0f, (float)src.left / w, (float)src.top / h},
+ {(float)dst.right, (float)dst.top, 0.5f, 2.0f, (float)src.right / w, (float)src.top / h},
+ {(float)dst.left, (float)dst.bottom, 0.5f, 2.0f, (float)src.left / w, (float)src.bottom / h},
+ {(float)dst.right, (float)dst.bottom, 0.5f, 2.0f, (float)src.right / w, (float)src.bottom / h},
+ };
- hr = m_pD3DDev->SetTexture(0, pTexture);
+ hr = m_pD3DDev->SetTexture(0, pTexture);
- // GetRenderState fails for devices created with D3DCREATE_PUREDEVICE
- // so we need to provide default values in case GetRenderState fails
- DWORD abe, sb, db;
- if (FAILED(m_pD3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &abe)))
- abe = FALSE;
- if (FAILED(m_pD3DDev->GetRenderState(D3DRS_SRCBLEND, &sb)))
- sb = D3DBLEND_ONE;
- if (FAILED(m_pD3DDev->GetRenderState(D3DRS_DESTBLEND, &db)))
- db = D3DBLEND_ZERO;
+ // GetRenderState fails for devices created with D3DCREATE_PUREDEVICE
+ // so we need to provide default values in case GetRenderState fails
+ DWORD abe, sb, db;
+ if (FAILED(m_pD3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &abe))) {
+ abe = FALSE;
+ }
+ if (FAILED(m_pD3DDev->GetRenderState(D3DRS_SRCBLEND, &sb))) {
+ sb = D3DBLEND_ONE;
+ }
+ if (FAILED(m_pD3DDev->GetRenderState(D3DRS_DESTBLEND, &db))) {
+ db = D3DBLEND_ZERO;
+ }
- hr = m_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
- hr = m_pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
- hr = m_pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
- hr = m_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
- hr = m_pD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); // pre-multiplied src and ...
- hr = m_pD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCALPHA); // ... inverse alpha channel for dst
+ hr = m_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
+ hr = m_pD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); // pre-multiplied src and ...
+ hr = m_pD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCALPHA); // ... inverse alpha channel for dst
- hr = m_pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
- hr = m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- hr = m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
+ hr = m_pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
+ hr = m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
+ hr = m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
- hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
+ hr = m_pD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
- hr = m_pD3DDev->SetPixelShader(NULL);
+ hr = m_pD3DDev->SetPixelShader(NULL);
- hr = m_pD3DDev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
- hr = m_pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof(pVertices[0]));
+ hr = m_pD3DDev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
+ hr = m_pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof(pVertices[0]));
- m_pD3DDev->SetTexture(0, NULL);
+ m_pD3DDev->SetTexture(0, NULL);
- m_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, abe);
- m_pD3DDev->SetRenderState(D3DRS_SRCBLEND, sb);
- m_pD3DDev->SetRenderState(D3DRS_DESTBLEND, db);
+ m_pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, abe);
+ m_pD3DDev->SetRenderState(D3DRS_SRCBLEND, sb);
+ m_pD3DDev->SetRenderState(D3DRS_DESTBLEND, db);
- return S_OK;
- } while (0);
- return E_FAIL;
+ return S_OK;
+ } while (0);
+ return E_FAIL;
}
// Update the array m_pllJitter with a new vsync period. Calculate min, max and stddev.
void CBaseAP::SyncStats(LONGLONG syncTime)
{
- m_nNextJitter = (m_nNextJitter+1) % NB_JITTER;
- LONGLONG jitter = syncTime - m_llLastSyncTime;
- m_pllJitter[m_nNextJitter] = jitter;
- double syncDeviation = ((double)m_pllJitter[m_nNextJitter] - m_fJitterMean) / 10000.0;
- if (abs(syncDeviation) > (GetDisplayCycle() / 2)) {
- m_uSyncGlitches++;
- }
-
- LONGLONG llJitterSum = 0;
- LONGLONG llJitterSumAvg = 0;
- for (int i=0; i<NB_JITTER; i++) {
- LONGLONG Jitter = m_pllJitter[i];
- llJitterSum += Jitter;
- llJitterSumAvg += Jitter;
- }
- m_fJitterMean = double(llJitterSumAvg) / NB_JITTER;
- double DeviationSum = 0;
-
- for (int i=0; i<NB_JITTER; i++) {
- LONGLONG DevInt = m_pllJitter[i] - (LONGLONG)m_fJitterMean;
- double Deviation = (double)DevInt;
- DeviationSum += Deviation*Deviation;
- m_MaxJitter = max(m_MaxJitter, DevInt);
- m_MinJitter = min(m_MinJitter, DevInt);
- }
-
- m_fJitterStdDev = sqrt(DeviationSum/NB_JITTER);
- m_fAvrFps = 10000000.0/(double(llJitterSum)/NB_JITTER);
- m_llLastSyncTime = syncTime;
+ m_nNextJitter = (m_nNextJitter + 1) % NB_JITTER;
+ LONGLONG jitter = syncTime - m_llLastSyncTime;
+ m_pllJitter[m_nNextJitter] = jitter;
+ double syncDeviation = ((double)m_pllJitter[m_nNextJitter] - m_fJitterMean) / 10000.0;
+ if (abs(syncDeviation) > (GetDisplayCycle() / 2)) {
+ m_uSyncGlitches++;
+ }
+
+ LONGLONG llJitterSum = 0;
+ LONGLONG llJitterSumAvg = 0;
+ for (int i = 0; i < NB_JITTER; i++) {
+ LONGLONG Jitter = m_pllJitter[i];
+ llJitterSum += Jitter;
+ llJitterSumAvg += Jitter;
+ }
+ m_fJitterMean = double(llJitterSumAvg) / NB_JITTER;
+ double DeviationSum = 0;
+
+ for (int i = 0; i < NB_JITTER; i++) {
+ LONGLONG DevInt = m_pllJitter[i] - (LONGLONG)m_fJitterMean;
+ double Deviation = (double)DevInt;
+ DeviationSum += Deviation * Deviation;
+ m_MaxJitter = max(m_MaxJitter, DevInt);
+ m_MinJitter = min(m_MinJitter, DevInt);
+ }
+
+ m_fJitterStdDev = sqrt(DeviationSum / NB_JITTER);
+ m_fAvrFps = 10000000.0 / (double(llJitterSum) / NB_JITTER);
+ m_llLastSyncTime = syncTime;
}
// Collect the difference between periodEnd and periodStart in an array, calculate mean and stddev.
void CBaseAP::SyncOffsetStats(LONGLONG syncOffset)
{
- m_nNextSyncOffset = (m_nNextSyncOffset+1) % NB_JITTER;
- m_pllSyncOffset[m_nNextSyncOffset] = syncOffset;
+ m_nNextSyncOffset = (m_nNextSyncOffset + 1) % NB_JITTER;
+ m_pllSyncOffset[m_nNextSyncOffset] = syncOffset;
- LONGLONG AvrageSum = 0;
- for (int i=0; i<NB_JITTER; i++) {
- LONGLONG Offset = m_pllSyncOffset[i];
- AvrageSum += Offset;
- m_MaxSyncOffset = max(m_MaxSyncOffset, Offset);
- m_MinSyncOffset = min(m_MinSyncOffset, Offset);
- }
- double MeanOffset = double(AvrageSum)/NB_JITTER;
- double DeviationSum = 0;
- for (int i=0; i<NB_JITTER; i++) {
- double Deviation = double(m_pllSyncOffset[i]) - MeanOffset;
- DeviationSum += Deviation*Deviation;
- }
- double StdDev = sqrt(DeviationSum/NB_JITTER);
+ LONGLONG AvrageSum = 0;
+ for (int i = 0; i < NB_JITTER; i++) {
+ LONGLONG Offset = m_pllSyncOffset[i];
+ AvrageSum += Offset;
+ m_MaxSyncOffset = max(m_MaxSyncOffset, Offset);
+ m_MinSyncOffset = min(m_MinSyncOffset, Offset);
+ }
+ double MeanOffset = double(AvrageSum) / NB_JITTER;
+ double DeviationSum = 0;
+ for (int i = 0; i < NB_JITTER; i++) {
+ double Deviation = double(m_pllSyncOffset[i]) - MeanOffset;
+ DeviationSum += Deviation * Deviation;
+ }
+ double StdDev = sqrt(DeviationSum / NB_JITTER);
- m_fSyncOffsetAvr = MeanOffset;
- m_fSyncOffsetStdDev = StdDev;
+ m_fSyncOffsetAvr = MeanOffset;
+ m_fSyncOffsetStdDev = StdDev;
}
void CBaseAP::UpdateAlphaBitmap()
{
- m_VMR9AlphaBitmapData.Free();
+ m_VMR9AlphaBitmapData.Free();
- if ((m_VMR9AlphaBitmap.dwFlags & VMRBITMAP_DISABLE) == 0) {
- HBITMAP hBitmap = (HBITMAP)GetCurrentObject (m_VMR9AlphaBitmap.hdc, OBJ_BITMAP);
- if (!hBitmap) {
- return;
- }
- DIBSECTION info = {0};
- if (!::GetObject(hBitmap, sizeof( DIBSECTION ), &info )) {
- return;
- }
+ if ((m_VMR9AlphaBitmap.dwFlags & VMRBITMAP_DISABLE) == 0) {
+ HBITMAP hBitmap = (HBITMAP)GetCurrentObject(m_VMR9AlphaBitmap.hdc, OBJ_BITMAP);
+ if (!hBitmap) {
+ return;
+ }
+ DIBSECTION info = {0};
+ if (!::GetObject(hBitmap, sizeof(DIBSECTION), &info)) {
+ return;
+ }
- m_VMR9AlphaBitmapRect = CRect(0, 0, info.dsBm.bmWidth, info.dsBm.bmHeight);
- m_VMR9AlphaBitmapWidthBytes = info.dsBm.bmWidthBytes;
+ m_VMR9AlphaBitmapRect = CRect(0, 0, info.dsBm.bmWidth, info.dsBm.bmHeight);
+ m_VMR9AlphaBitmapWidthBytes = info.dsBm.bmWidthBytes;
- if (m_VMR9AlphaBitmapData.Allocate(info.dsBm.bmWidthBytes * info.dsBm.bmHeight)) {
- memcpy((BYTE *)m_VMR9AlphaBitmapData, info.dsBm.bmBits, info.dsBm.bmWidthBytes * info.dsBm.bmHeight);
- }
- }
+ if (m_VMR9AlphaBitmapData.Allocate(info.dsBm.bmWidthBytes * info.dsBm.bmHeight)) {
+ memcpy((BYTE*)m_VMR9AlphaBitmapData, info.dsBm.bmBits, info.dsBm.bmWidthBytes * info.dsBm.bmHeight);
+ }
+ }
}
// Present a sample (frame) using DirectX.
STDMETHODIMP_(bool) CBaseAP::Paint(bool fAll)
{
- if (m_bPendingResetDevice) {
- SendResetRequest();
- return false;
- }
-
- CRenderersSettings& s = GetRenderersSettings();
- CRenderersData *pApp = GetRenderersData();
- D3DRASTER_STATUS rasterStatus;
- REFERENCE_TIME llCurRefTime = 0;
- REFERENCE_TIME llSyncOffset = 0;
- double dSyncOffset = 0.0;
-
- CAutoLock cRenderLock(&m_allocatorLock);
-
- // Estimate time for next vblank based on number of remaining lines in this frame. This algorithm seems to be
- // accurate within one ms why there should not be any need for a more accurate one. The wiggly line seen
- // when using sync to nearest and sync display is most likely due to inaccuracies in the audio-card-based
- // reference clock. The wiggles are not seen with the perfcounter-based reference clock of the sync to video option.
- m_pD3DDev->GetRasterStatus(0, &rasterStatus);
- m_uScanLineEnteringPaint = rasterStatus.ScanLine;
- if (m_pRefClock) {
- m_pRefClock->GetTime(&llCurRefTime);
- }
- int dScanLines = max((int)m_ScreenSize.cy - m_uScanLineEnteringPaint, 0);
- dSyncOffset = dScanLines * m_dDetectedScanlineTime; // ms
- llSyncOffset = REFERENCE_TIME(10000.0 * dSyncOffset); // Reference time units (100 ns)
- m_llEstVBlankTime = llCurRefTime + llSyncOffset; // Estimated time for the start of next vblank
-
- if (m_WindowRect.right <= m_WindowRect.left || m_WindowRect.bottom <= m_WindowRect.top
- || m_NativeVideoSize.cx <= 0 || m_NativeVideoSize.cy <= 0
- || !m_pVideoSurface) {
- return false;
- }
-
- HRESULT hr;
- CRect rSrcVid(CPoint(0, 0), m_NativeVideoSize);
- CRect rDstVid(m_VideoRect);
- CRect rSrcPri(CPoint(0, 0), m_WindowRect.Size());
- CRect rDstPri(m_WindowRect);
-
- m_pD3DDev->BeginScene();
- CComPtr<IDirect3DSurface9> pBackBuffer;
- m_pD3DDev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
- m_pD3DDev->SetRenderTarget(0, pBackBuffer);
- hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1.0f, 0);
- if (!rDstVid.IsRectEmpty()) {
- if (m_pVideoTexture[m_nCurSurface]) {
- CComPtr<IDirect3DTexture9> pVideoTexture = m_pVideoTexture[m_nCurSurface];
-
- if (m_pVideoTexture[m_nDXSurface] && m_pVideoTexture[m_nDXSurface+1] && !m_pPixelShaders.IsEmpty()) {
- static __int64 counter = 0;
- static long start = clock();
-
- long stop = clock();
- long diff = stop - start;
-
- if (diff >= 10*60*CLOCKS_PER_SEC) {
- start = stop; // reset after 10 min (ps float has its limits in both range and accuracy)
- }
-
- int src = m_nCurSurface, dst = m_nDXSurface;
-
- D3DSURFACE_DESC desc;
- m_pVideoTexture[src]->GetLevelDesc(0, &desc);
-
- float fConstData[][4] = {
- {(float)desc.Width, (float)desc.Height, (float)(counter++), (float)diff / CLOCKS_PER_SEC},
- {1.0f / desc.Width, 1.0f / desc.Height, 0, 0},
- };
-
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
-
- CComPtr<IDirect3DSurface9> pRT;
- hr = m_pD3DDev->GetRenderTarget(0, &pRT);
-
- POSITION pos = m_pPixelShaders.GetHeadPosition();
- while (pos) {
- pVideoTexture = m_pVideoTexture[dst];
-
- hr = m_pD3DDev->SetRenderTarget(0, m_pVideoSurface[dst]);
- CExternalPixelShader &Shader = m_pPixelShaders.GetNext(pos);
- if (!Shader.m_pPixelShader) {
- Shader.Compile(m_pPSC);
- }
- hr = m_pD3DDev->SetPixelShader(Shader.m_pPixelShader);
- TextureCopy(m_pVideoTexture[src]);
-
- src = dst;
- if (++dst >= m_nDXSurface+2) {
- dst = m_nDXSurface;
- }
- }
-
- hr = m_pD3DDev->SetRenderTarget(0, pRT);
- hr = m_pD3DDev->SetPixelShader(NULL);
- }
-
- Vector dst[4];
- Transform(rDstVid, dst);
-
- DWORD iDX9Resizer = s.iDX9Resizer;
-
- float A = 0;
-
- switch (iDX9Resizer) {
- case 3:
- A = -0.60f;
- break;
- case 4:
- A = -0.751f;
- break; // FIXME : 0.75 crash recent D3D, or eat CPU
- case 5:
- A = -1.00f;
- break;
- }
- bool bScreenSpacePixelShaders = !m_pPixelShadersScreenSpace.IsEmpty();
-
- hr = InitResizers(A, bScreenSpacePixelShaders);
-
- if (!m_pScreenSizeTemporaryTexture[0] || !m_pScreenSizeTemporaryTexture[1]) {
- bScreenSpacePixelShaders = false;
- }
-
- if (bScreenSpacePixelShaders) {
- CComPtr<IDirect3DSurface9> pRT;
- hr = m_pScreenSizeTemporaryTexture[1]->GetSurfaceLevel(0, &pRT);
- if (hr != S_OK) {
- bScreenSpacePixelShaders = false;
- }
- if (bScreenSpacePixelShaders) {
- hr = m_pD3DDev->SetRenderTarget(0, pRT);
- if (hr != S_OK) {
- bScreenSpacePixelShaders = false;
- }
- hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1.0f, 0);
- }
- }
-
- if (rSrcVid.Size() != rDstVid.Size()) {
- if (iDX9Resizer == 0 || iDX9Resizer == 1) {
- D3DTEXTUREFILTERTYPE Filter = iDX9Resizer == 0 ? D3DTEXF_POINT : D3DTEXF_LINEAR;
- hr = TextureResize(pVideoTexture, dst, Filter, rSrcVid);
- } else if (iDX9Resizer == 2) {
- hr = TextureResizeBilinear(pVideoTexture, dst, rSrcVid);
- } else if (iDX9Resizer >= 3) {
- hr = TextureResizeBicubic2pass(pVideoTexture, dst, rSrcVid);
- }
- } else {
- hr = TextureResize(pVideoTexture, dst, D3DTEXF_POINT, rSrcVid);
- }
-
- if (bScreenSpacePixelShaders) {
- static __int64 counter = 555;
- static long start = clock() + 333;
-
- long stop = clock() + 333;
- long diff = stop - start;
-
- if (diff >= 10*60*CLOCKS_PER_SEC) {
- start = stop; // reset after 10 min (ps float has its limits in both range and accuracy)
- }
-
- D3DSURFACE_DESC desc;
- m_pScreenSizeTemporaryTexture[0]->GetLevelDesc(0, &desc);
-
- float fConstData[][4] = {
- {(float)desc.Width, (float)desc.Height, (float)(counter++), (float)diff / CLOCKS_PER_SEC},
- {1.0f / desc.Width, 1.0f / desc.Height, 0, 0},
- };
-
- hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
-
- int src = 1, dst = 0;
-
- POSITION pos = m_pPixelShadersScreenSpace.GetHeadPosition();
- while (pos) {
- if (m_pPixelShadersScreenSpace.GetTailPosition() == pos) {
- m_pD3DDev->SetRenderTarget(0, pBackBuffer);
- } else {
- CComPtr<IDirect3DSurface9> pRT;
- hr = m_pScreenSizeTemporaryTexture[dst]->GetSurfaceLevel(0, &pRT);
- m_pD3DDev->SetRenderTarget(0, pRT);
- }
-
- CExternalPixelShader &Shader = m_pPixelShadersScreenSpace.GetNext(pos);
- if (!Shader.m_pPixelShader) {
- Shader.Compile(m_pPSC);
- }
- hr = m_pD3DDev->SetPixelShader(Shader.m_pPixelShader);
- TextureCopy(m_pScreenSizeTemporaryTexture[src]);
-
- std::swap(src, dst);
- }
-
- hr = m_pD3DDev->SetPixelShader(NULL);
- }
- } else {
- if (pBackBuffer) {
- ClipToSurface(pBackBuffer, rSrcVid, rDstVid);
- // rSrcVid has to be aligned on mod2 for yuy2->rgb conversion with StretchRect
- rSrcVid.left &= ~1;
- rSrcVid.right &= ~1;
- rSrcVid.top &= ~1;
- rSrcVid.bottom &= ~1;
- hr = m_pD3DDev->StretchRect(m_pVideoSurface[m_nCurSurface], rSrcVid, pBackBuffer, rDstVid, m_filter);
- if (FAILED(hr)) {
- return false;
- }
- }
- }
- }
- AlphaBltSubPic(rSrcPri.Size());
- if (m_VMR9AlphaBitmap.dwFlags & VMRBITMAP_UPDATE) {
- CAutoLock BitMapLock(&m_VMR9AlphaBitmapLock);
- CRect rcSrc (m_VMR9AlphaBitmap.rSrc);
- m_pOSDTexture = NULL;
- m_pOSDSurface = NULL;
- if ((m_VMR9AlphaBitmap.dwFlags & VMRBITMAP_DISABLE) == 0 && (BYTE *)m_VMR9AlphaBitmapData) {
- if ( (m_pD3DXLoadSurfaceFromMemory != NULL) &&
- SUCCEEDED(hr = m_pD3DDev->CreateTexture(rcSrc.Width(), rcSrc.Height(), 1,
- D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
- D3DPOOL_DEFAULT, &m_pOSDTexture, NULL)) ) {
- if (SUCCEEDED (hr = m_pOSDTexture->GetSurfaceLevel(0, &m_pOSDSurface))) {
- hr = m_pD3DXLoadSurfaceFromMemory (m_pOSDSurface, NULL, NULL, (BYTE *)m_VMR9AlphaBitmapData, D3DFMT_A8R8G8B8, m_VMR9AlphaBitmapWidthBytes,
- NULL, &m_VMR9AlphaBitmapRect, D3DX_FILTER_NONE, m_VMR9AlphaBitmap.clrSrcKey);
- }
- if (FAILED (hr)) {
- m_pOSDTexture = NULL;
- m_pOSDSurface = NULL;
- }
- }
- }
- m_VMR9AlphaBitmap.dwFlags ^= VMRBITMAP_UPDATE;
- }
- if (pApp->m_fDisplayStats) {
- DrawStats();
- }
- if (m_pOSDTexture) {
- AlphaBlt(rSrcPri, rDstPri, m_pOSDTexture);
- }
- m_pD3DDev->EndScene();
-
- if (m_pD3DDevEx) {
- if (m_bIsFullscreen) {
- hr = m_pD3DDevEx->PresentEx(NULL, NULL, NULL, NULL, NULL);
- } else {
- hr = m_pD3DDevEx->PresentEx(rSrcPri, rDstPri, NULL, NULL, NULL);
- }
- } else {
- if (m_bIsFullscreen) {
- hr = m_pD3DDev->Present(NULL, NULL, NULL, NULL);
- } else {
- hr = m_pD3DDev->Present(rSrcPri, rDstPri, NULL, NULL);
- }
- }
- if (FAILED(hr)) {
- DEBUG_ONLY(_tprintf_s(_T("Device lost or something\n")));
- }
- // Calculate timing statistics
- if (m_pRefClock) {
- m_pRefClock->GetTime(&llCurRefTime); // To check if we called Present too late to hit the right vsync
- }
- m_llEstVBlankTime = max(m_llEstVBlankTime, llCurRefTime); // Sometimes the real value is larger than the estimated value (but never smaller)
- if (pApp->m_fDisplayStats < 3) { // Partial on-screen statistics
- SyncStats(m_llEstVBlankTime); // Max of estimate and real. Sometimes Present may actually return immediately so we need the estimate as a lower bound
- }
- if (pApp->m_fDisplayStats == 1) { // Full on-screen statistics
- SyncOffsetStats(-llSyncOffset); // Minus because we want time to flow downward in the graph in DrawStats
- }
-
- // Adjust sync
- double frameCycle = (double)((m_llSampleTime - m_llLastSampleTime) / 10000.0);
- if (frameCycle < 0) {
- frameCycle = 0.0; // Happens when searching.
- }
-
- if (s.m_RenderSettings.bSynchronizeVideo) {
- m_pGenlock->ControlClock(dSyncOffset, frameCycle);
- } else if (s.m_RenderSettings.bSynchronizeDisplay) {
- m_pGenlock->ControlDisplay(dSyncOffset, frameCycle);
- } else {
- m_pGenlock->UpdateStats(dSyncOffset, frameCycle); // No sync or sync to nearest neighbor
- }
-
- m_dFrameCycle = m_pGenlock->frameCycleAvg;
- if (m_dFrameCycle > 0.0) {
- m_fps = 1000.0 / m_dFrameCycle;
- }
- m_dCycleDifference = GetCycleDifference();
- if (abs(m_dCycleDifference) < 0.05) { // If less than 5% speed difference
- m_bSnapToVSync = true;
- } else {
- m_bSnapToVSync = false;
- }
-
- // Check how well audio is matching rate (if at all)
- DWORD tmp;
- if (m_pAudioStats != NULL) {
- m_pAudioStats->GetStatParam(AM_AUDREND_STAT_PARAM_SLAVE_ACCUMERROR, &m_lAudioLag, &tmp);
- m_lAudioLagMin = min((long)m_lAudioLag, m_lAudioLagMin);
- m_lAudioLagMax = max((long)m_lAudioLag, m_lAudioLagMax);
- m_pAudioStats->GetStatParam(AM_AUDREND_STAT_PARAM_SLAVE_MODE, &m_lAudioSlaveMode, &tmp);
- }
-
- if (pApp->m_bResetStats) {
- ResetStats();
- pApp->m_bResetStats = false;
- }
-
- bool fResetDevice = m_bPendingResetDevice;
- if (hr == D3DERR_DEVICELOST && m_pD3DDev->TestCooperativeLevel() == D3DERR_DEVICENOTRESET || hr == S_PRESENT_MODE_CHANGED) {
- fResetDevice = true;
- }
- if (SettingsNeedResetDevice()) {
- fResetDevice = true;
- }
-
- BOOL bCompositionEnabled = false;
- if (m_pDwmIsCompositionEnabled) {
- m_pDwmIsCompositionEnabled(&bCompositionEnabled);
- }
- if ((bCompositionEnabled != 0) != m_bCompositionEnabled) {
- if (m_bIsFullscreen) {
- m_bCompositionEnabled = (bCompositionEnabled != 0);
- } else {
- fResetDevice = true;
- }
- }
-
- if (s.fResetDevice) {
- LONGLONG time = GetRenderersData()->GetPerfCounter();
- if (time > m_LastAdapterCheck + 20000000) { // check every 2 sec.
- m_LastAdapterCheck = time;
+ if (m_bPendingResetDevice) {
+ SendResetRequest();
+ return false;
+ }
+
+ CRenderersSettings& s = GetRenderersSettings();
+ CRenderersData* pApp = GetRenderersData();
+ D3DRASTER_STATUS rasterStatus;
+ REFERENCE_TIME llCurRefTime = 0;
+ REFERENCE_TIME llSyncOffset = 0;
+ double dSyncOffset = 0.0;
+
+ CAutoLock cRenderLock(&m_allocatorLock);
+
+ // Estimate time for next vblank based on number of remaining lines in this frame. This algorithm seems to be
+ // accurate within one ms why there should not be any need for a more accurate one. The wiggly line seen
+ // when using sync to nearest and sync display is most likely due to inaccuracies in the audio-card-based
+ // reference clock. The wiggles are not seen with the perfcounter-based reference clock of the sync to video option.
+ m_pD3DDev->GetRasterStatus(0, &rasterStatus);
+ m_uScanLineEnteringPaint = rasterStatus.ScanLine;
+ if (m_pRefClock) {
+ m_pRefClock->GetTime(&llCurRefTime);
+ }
+ int dScanLines = max((int)m_ScreenSize.cy - m_uScanLineEnteringPaint, 0);
+ dSyncOffset = dScanLines * m_dDetectedScanlineTime; // ms
+ llSyncOffset = REFERENCE_TIME(10000.0 * dSyncOffset); // Reference time units (100 ns)
+ m_llEstVBlankTime = llCurRefTime + llSyncOffset; // Estimated time for the start of next vblank
+
+ if (m_WindowRect.right <= m_WindowRect.left || m_WindowRect.bottom <= m_WindowRect.top
+ || m_NativeVideoSize.cx <= 0 || m_NativeVideoSize.cy <= 0
+ || !m_pVideoSurface) {
+ return false;
+ }
+
+ HRESULT hr;
+ CRect rSrcVid(CPoint(0, 0), m_NativeVideoSize);
+ CRect rDstVid(m_VideoRect);
+ CRect rSrcPri(CPoint(0, 0), m_WindowRect.Size());
+ CRect rDstPri(m_WindowRect);
+
+ m_pD3DDev->BeginScene();
+ CComPtr<IDirect3DSurface9> pBackBuffer;
+ m_pD3DDev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
+ m_pD3DDev->SetRenderTarget(0, pBackBuffer);
+ hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1.0f, 0);
+ if (!rDstVid.IsRectEmpty()) {
+ if (m_pVideoTexture[m_nCurSurface]) {
+ CComPtr<IDirect3DTexture9> pVideoTexture = m_pVideoTexture[m_nCurSurface];
+
+ if (m_pVideoTexture[m_nDXSurface] && m_pVideoTexture[m_nDXSurface + 1] && !m_pPixelShaders.IsEmpty()) {
+ static __int64 counter = 0;
+ static long start = clock();
+
+ long stop = clock();
+ long diff = stop - start;
+
+ if (diff >= 10 * 60 * CLOCKS_PER_SEC) {
+ start = stop; // reset after 10 min (ps float has its limits in both range and accuracy)
+ }
+
+ int src = m_nCurSurface, dst = m_nDXSurface;
+
+ D3DSURFACE_DESC desc;
+ m_pVideoTexture[src]->GetLevelDesc(0, &desc);
+
+ float fConstData[][4] = {
+ {(float)desc.Width, (float)desc.Height, (float)(counter++), (float)diff / CLOCKS_PER_SEC},
+ {1.0f / desc.Width, 1.0f / desc.Height, 0, 0},
+ };
+
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+
+ CComPtr<IDirect3DSurface9> pRT;
+ hr = m_pD3DDev->GetRenderTarget(0, &pRT);
+
+ POSITION pos = m_pPixelShaders.GetHeadPosition();
+ while (pos) {
+ pVideoTexture = m_pVideoTexture[dst];
+
+ hr = m_pD3DDev->SetRenderTarget(0, m_pVideoSurface[dst]);
+ CExternalPixelShader& Shader = m_pPixelShaders.GetNext(pos);
+ if (!Shader.m_pPixelShader) {
+ Shader.Compile(m_pPSC);
+ }
+ hr = m_pD3DDev->SetPixelShader(Shader.m_pPixelShader);
+ TextureCopy(m_pVideoTexture[src]);
+
+ src = dst;
+ if (++dst >= m_nDXSurface + 2) {
+ dst = m_nDXSurface;
+ }
+ }
+
+ hr = m_pD3DDev->SetRenderTarget(0, pRT);
+ hr = m_pD3DDev->SetPixelShader(NULL);
+ }
+
+ Vector dst[4];
+ Transform(rDstVid, dst);
+
+ DWORD iDX9Resizer = s.iDX9Resizer;
+
+ float A = 0;
+
+ switch (iDX9Resizer) {
+ case 3:
+ A = -0.60f;
+ break;
+ case 4:
+ A = -0.751f;
+ break; // FIXME : 0.75 crash recent D3D, or eat CPU
+ case 5:
+ A = -1.00f;
+ break;
+ }
+ bool bScreenSpacePixelShaders = !m_pPixelShadersScreenSpace.IsEmpty();
+
+ hr = InitResizers(A, bScreenSpacePixelShaders);
+
+ if (!m_pScreenSizeTemporaryTexture[0] || !m_pScreenSizeTemporaryTexture[1]) {
+ bScreenSpacePixelShaders = false;
+ }
+
+ if (bScreenSpacePixelShaders) {
+ CComPtr<IDirect3DSurface9> pRT;
+ hr = m_pScreenSizeTemporaryTexture[1]->GetSurfaceLevel(0, &pRT);
+ if (hr != S_OK) {
+ bScreenSpacePixelShaders = false;
+ }
+ if (bScreenSpacePixelShaders) {
+ hr = m_pD3DDev->SetRenderTarget(0, pRT);
+ if (hr != S_OK) {
+ bScreenSpacePixelShaders = false;
+ }
+ hr = m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1.0f, 0);
+ }
+ }
+
+ if (rSrcVid.Size() != rDstVid.Size()) {
+ if (iDX9Resizer == 0 || iDX9Resizer == 1) {
+ D3DTEXTUREFILTERTYPE Filter = iDX9Resizer == 0 ? D3DTEXF_POINT : D3DTEXF_LINEAR;
+ hr = TextureResize(pVideoTexture, dst, Filter, rSrcVid);
+ } else if (iDX9Resizer == 2) {
+ hr = TextureResizeBilinear(pVideoTexture, dst, rSrcVid);
+ } else if (iDX9Resizer >= 3) {
+ hr = TextureResizeBicubic2pass(pVideoTexture, dst, rSrcVid);
+ }
+ } else {
+ hr = TextureResize(pVideoTexture, dst, D3DTEXF_POINT, rSrcVid);
+ }
+
+ if (bScreenSpacePixelShaders) {
+ static __int64 counter = 555;
+ static long start = clock() + 333;
+
+ long stop = clock() + 333;
+ long diff = stop - start;
+
+ if (diff >= 10 * 60 * CLOCKS_PER_SEC) {
+ start = stop; // reset after 10 min (ps float has its limits in both range and accuracy)
+ }
+
+ D3DSURFACE_DESC desc;
+ m_pScreenSizeTemporaryTexture[0]->GetLevelDesc(0, &desc);
+
+ float fConstData[][4] = {
+ {(float)desc.Width, (float)desc.Height, (float)(counter++), (float)diff / CLOCKS_PER_SEC},
+ {1.0f / desc.Width, 1.0f / desc.Height, 0, 0},
+ };
+
+ hr = m_pD3DDev->SetPixelShaderConstantF(0, (float*)fConstData, _countof(fConstData));
+
+ int src = 1, dst = 0;
+
+ POSITION pos = m_pPixelShadersScreenSpace.GetHeadPosition();
+ while (pos) {
+ if (m_pPixelShadersScreenSpace.GetTailPosition() == pos) {
+ m_pD3DDev->SetRenderTarget(0, pBackBuffer);
+ } else {
+ CComPtr<IDirect3DSurface9> pRT;
+ hr = m_pScreenSizeTemporaryTexture[dst]->GetSurfaceLevel(0, &pRT);
+ m_pD3DDev->SetRenderTarget(0, pRT);
+ }
+
+ CExternalPixelShader& Shader = m_pPixelShadersScreenSpace.GetNext(pos);
+ if (!Shader.m_pPixelShader) {
+ Shader.Compile(m_pPSC);
+ }
+ hr = m_pD3DDev->SetPixelShader(Shader.m_pPixelShader);
+ TextureCopy(m_pScreenSizeTemporaryTexture[src]);
+
+ std::swap(src, dst);
+ }
+
+ hr = m_pD3DDev->SetPixelShader(NULL);
+ }
+ } else {
+ if (pBackBuffer) {
+ ClipToSurface(pBackBuffer, rSrcVid, rDstVid);
+ // rSrcVid has to be aligned on mod2 for yuy2->rgb conversion with StretchRect
+ rSrcVid.left &= ~1;
+ rSrcVid.right &= ~1;
+ rSrcVid.top &= ~1;
+ rSrcVid.bottom &= ~1;
+ hr = m_pD3DDev->StretchRect(m_pVideoSurface[m_nCurSurface], rSrcVid, pBackBuffer, rDstVid, m_filter);
+ if (FAILED(hr)) {
+ return false;
+ }
+ }
+ }
+ }
+ AlphaBltSubPic(rSrcPri.Size());
+ if (m_VMR9AlphaBitmap.dwFlags & VMRBITMAP_UPDATE) {
+ CAutoLock BitMapLock(&m_VMR9AlphaBitmapLock);
+ CRect rcSrc(m_VMR9AlphaBitmap.rSrc);
+ m_pOSDTexture = NULL;
+ m_pOSDSurface = NULL;
+ if ((m_VMR9AlphaBitmap.dwFlags & VMRBITMAP_DISABLE) == 0 && (BYTE*)m_VMR9AlphaBitmapData) {
+ if ((m_pD3DXLoadSurfaceFromMemory != NULL) &&
+ SUCCEEDED(hr = m_pD3DDev->CreateTexture(rcSrc.Width(), rcSrc.Height(), 1,
+ D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
+ D3DPOOL_DEFAULT, &m_pOSDTexture, NULL))) {
+ if (SUCCEEDED(hr = m_pOSDTexture->GetSurfaceLevel(0, &m_pOSDSurface))) {
+ hr = m_pD3DXLoadSurfaceFromMemory(m_pOSDSurface, NULL, NULL, (BYTE*)m_VMR9AlphaBitmapData, D3DFMT_A8R8G8B8, m_VMR9AlphaBitmapWidthBytes,
+ NULL, &m_VMR9AlphaBitmapRect, D3DX_FILTER_NONE, m_VMR9AlphaBitmap.clrSrcKey);
+ }
+ if (FAILED(hr)) {
+ m_pOSDTexture = NULL;
+ m_pOSDSurface = NULL;
+ }
+ }
+ }
+ m_VMR9AlphaBitmap.dwFlags ^= VMRBITMAP_UPDATE;
+ }
+ if (pApp->m_fDisplayStats) {
+ DrawStats();
+ }
+ if (m_pOSDTexture) {
+ AlphaBlt(rSrcPri, rDstPri, m_pOSDTexture);
+ }
+ m_pD3DDev->EndScene();
+
+ if (m_pD3DDevEx) {
+ if (m_bIsFullscreen) {
+ hr = m_pD3DDevEx->PresentEx(NULL, NULL, NULL, NULL, NULL);
+ } else {
+ hr = m_pD3DDevEx->PresentEx(rSrcPri, rDstPri, NULL, NULL, NULL);
+ }
+ } else {
+ if (m_bIsFullscreen) {
+ hr = m_pD3DDev->Present(NULL, NULL, NULL, NULL);
+ } else {
+ hr = m_pD3DDev->Present(rSrcPri, rDstPri, NULL, NULL);
+ }
+ }
+ if (FAILED(hr)) {
+ DEBUG_ONLY(_tprintf_s(_T("Device lost or something\n")));
+ }
+ // Calculate timing statistics
+ if (m_pRefClock) {
+ m_pRefClock->GetTime(&llCurRefTime); // To check if we called Present too late to hit the right vsync
+ }
+ m_llEstVBlankTime = max(m_llEstVBlankTime, llCurRefTime); // Sometimes the real value is larger than the estimated value (but never smaller)
+ if (pApp->m_fDisplayStats < 3) { // Partial on-screen statistics
+ SyncStats(m_llEstVBlankTime); // Max of estimate and real. Sometimes Present may actually return immediately so we need the estimate as a lower bound
+ }
+ if (pApp->m_fDisplayStats == 1) { // Full on-screen statistics
+ SyncOffsetStats(-llSyncOffset); // Minus because we want time to flow downward in the graph in DrawStats
+ }
+
+ // Adjust sync
+ double frameCycle = (double)((m_llSampleTime - m_llLastSampleTime) / 10000.0);
+ if (frameCycle < 0) {
+ frameCycle = 0.0; // Happens when searching.
+ }
+
+ if (s.m_RenderSettings.bSynchronizeVideo) {
+ m_pGenlock->ControlClock(dSyncOffset, frameCycle);
+ } else if (s.m_RenderSettings.bSynchronizeDisplay) {
+ m_pGenlock->ControlDisplay(dSyncOffset, frameCycle);
+ } else {
+ m_pGenlock->UpdateStats(dSyncOffset, frameCycle); // No sync or sync to nearest neighbor
+ }
+
+ m_dFrameCycle = m_pGenlock->frameCycleAvg;
+ if (m_dFrameCycle > 0.0) {
+ m_fps = 1000.0 / m_dFrameCycle;
+ }
+ m_dCycleDifference = GetCycleDifference();
+ if (abs(m_dCycleDifference) < 0.05) { // If less than 5% speed difference
+ m_bSnapToVSync = true;
+ } else {
+ m_bSnapToVSync = false;
+ }
+
+ // Check how well audio is matching rate (if at all)
+ DWORD tmp;
+ if (m_pAudioStats != NULL) {
+ m_pAudioStats->GetStatParam(AM_AUDREND_STAT_PARAM_SLAVE_ACCUMERROR, &m_lAudioLag, &tmp);
+ m_lAudioLagMin = min((long)m_lAudioLag, m_lAudioLagMin);
+ m_lAudioLagMax = max((long)m_lAudioLag, m_lAudioLagMax);
+ m_pAudioStats->GetStatParam(AM_AUDREND_STAT_PARAM_SLAVE_MODE, &m_lAudioSlaveMode, &tmp);
+ }
+
+ if (pApp->m_bResetStats) {
+ ResetStats();
+ pApp->m_bResetStats = false;
+ }
+
+ bool fResetDevice = m_bPendingResetDevice;
+ if (hr == D3DERR_DEVICELOST && m_pD3DDev->TestCooperativeLevel() == D3DERR_DEVICENOTRESET || hr == S_PRESENT_MODE_CHANGED) {
+ fResetDevice = true;
+ }
+ if (SettingsNeedResetDevice()) {
+ fResetDevice = true;
+ }
+
+ BOOL bCompositionEnabled = false;
+ if (m_pDwmIsCompositionEnabled) {
+ m_pDwmIsCompositionEnabled(&bCompositionEnabled);
+ }
+ if ((bCompositionEnabled != 0) != m_bCompositionEnabled) {
+ if (m_bIsFullscreen) {
+ m_bCompositionEnabled = (bCompositionEnabled != 0);
+ } else {
+ fResetDevice = true;
+ }
+ }
+
+ if (s.fResetDevice) {
+ LONGLONG time = GetRenderersData()->GetPerfCounter();
+ if (time > m_LastAdapterCheck + 20000000) { // check every 2 sec.
+ m_LastAdapterCheck = time;
#ifdef _DEBUG
- D3DDEVICE_CREATION_PARAMETERS Parameters;
- if (SUCCEEDED(m_pD3DDev->GetCreationParameters(&Parameters))) {
- ASSERT(Parameters.AdapterOrdinal == m_CurrentAdapter);
- }
+ D3DDEVICE_CREATION_PARAMETERS Parameters;
+ if (SUCCEEDED(m_pD3DDev->GetCreationParameters(&Parameters))) {
+ ASSERT(Parameters.AdapterOrdinal == m_CurrentAdapter);
+ }
#endif
- if (m_CurrentAdapter != GetAdapter(m_pD3D)) {
- fResetDevice = true;
- }
+ if (m_CurrentAdapter != GetAdapter(m_pD3D)) {
+ fResetDevice = true;
+ }
#ifdef _DEBUG
- else {
- ASSERT(m_pD3D->GetAdapterMonitor(m_CurrentAdapter) == m_pD3D->GetAdapterMonitor(GetAdapter(m_pD3D)));
- }
+ else {
+ ASSERT(m_pD3D->GetAdapterMonitor(m_CurrentAdapter) == m_pD3D->GetAdapterMonitor(GetAdapter(m_pD3D)));
+ }
#endif
- }
- }
+ }
+ }
- if (fResetDevice) {
- m_bPendingResetDevice = true;
- SendResetRequest();
- }
- return true;
+ if (fResetDevice) {
+ m_bPendingResetDevice = true;
+ SendResetRequest();
+ }
+ return true;
}
void CBaseAP::SendResetRequest()
{
- if (!m_bDeviceResetRequested) {
- m_bDeviceResetRequested = true;
- AfxGetApp()->m_pMainWnd->PostMessage(WM_RESET_DEVICE);
- }
+ if (!m_bDeviceResetRequested) {
+ m_bDeviceResetRequested = true;
+ AfxGetApp()->m_pMainWnd->PostMessage(WM_RESET_DEVICE);
+ }
}
STDMETHODIMP_(bool) CBaseAP::ResetDevice()
{
- DeleteSurfaces();
- HRESULT hr;
- CString Error;
- if (FAILED(hr = CreateDXDevice(Error)) || FAILED(hr = AllocSurfaces())) {
- m_bDeviceResetRequested = false;
- return false;
- }
- m_pGenlock->SetMonitor(GetAdapter(m_pD3D));
- m_pGenlock->GetTiming();
- OnResetDevice();
- m_bDeviceResetRequested = false;
- m_bPendingResetDevice = false;
- return true;
+ DeleteSurfaces();
+ HRESULT hr;
+ CString Error;
+ if (FAILED(hr = CreateDXDevice(Error)) || FAILED(hr = AllocSurfaces())) {
+ m_bDeviceResetRequested = false;
+ return false;
+ }
+ m_pGenlock->SetMonitor(GetAdapter(m_pD3D));
+ m_pGenlock->GetTiming();
+ OnResetDevice();
+ m_bDeviceResetRequested = false;
+ m_bPendingResetDevice = false;
+ return true;
}
STDMETHODIMP_(bool) CBaseAP::DisplayChange()
{
- return true;
-}
-
-void CBaseAP::DrawText(const RECT &rc, const CString &strText, int _Priority)
-{
- if (_Priority < 1) {
- return;
- }
- int Quality = 1;
- D3DXCOLOR Color1(1.0f, 0.2f, 0.2f, 1.0f );
- D3DXCOLOR Color0(0.0f, 0.0f, 0.0f, 1.0f );
- RECT Rect1 = rc;
- RECT Rect2 = rc;
- if (Quality == 1) {
- OffsetRect(&Rect2 , 2, 2);
- } else {
- OffsetRect(&Rect2 , -1, -1);
- }
- if (Quality > 0) {
- m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , 1, 0);
- if (Quality > 3) {
- m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , 1, 0);
- if (Quality > 2) {
- m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , 0, 1);
- if (Quality > 3) {
- m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , 0, 1);
- if (Quality > 1) {
- m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , -1, 0);
- if (Quality > 3) {
- m_pFont->DrawText( m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , -1, 0);
- if (Quality > 2) {
- m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- OffsetRect (&Rect2 , 0, -1);
- if (Quality > 3) {
- m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
- }
- m_pFont->DrawText( m_pSprite, strText, -1, &Rect1, DT_NOCLIP, Color1);
+ return true;
+}
+
+void CBaseAP::DrawText(const RECT& rc, const CString& strText, int _Priority)
+{
+ if (_Priority < 1) {
+ return;
+ }
+ int Quality = 1;
+ D3DXCOLOR Color1(1.0f, 0.2f, 0.2f, 1.0f);
+ D3DXCOLOR Color0(0.0f, 0.0f, 0.0f, 1.0f);
+ RECT Rect1 = rc;
+ RECT Rect2 = rc;
+ if (Quality == 1) {
+ OffsetRect(&Rect2 , 2, 2);
+ } else {
+ OffsetRect(&Rect2 , -1, -1);
+ }
+ if (Quality > 0) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , 1, 0);
+ if (Quality > 3) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , 1, 0);
+ if (Quality > 2) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , 0, 1);
+ if (Quality > 3) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , 0, 1);
+ if (Quality > 1) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , -1, 0);
+ if (Quality > 3) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , -1, 0);
+ if (Quality > 2) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ OffsetRect(&Rect2 , 0, -1);
+ if (Quality > 3) {
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect2, DT_NOCLIP, Color0);
+ }
+ m_pFont->DrawText(m_pSprite, strText, -1, &Rect1, DT_NOCLIP, Color1);
}
void CBaseAP::DrawStats()
{
- CRenderersSettings& s = GetRenderersSettings();
- CRenderersData * pApp = GetRenderersData();
+ CRenderersSettings& s = GetRenderersSettings();
+ CRenderersData* pApp = GetRenderersData();
- LONGLONG llMaxJitter = m_MaxJitter;
- LONGLONG llMinJitter = m_MinJitter;
+ LONGLONG llMaxJitter = m_MaxJitter;
+ LONGLONG llMinJitter = m_MinJitter;
- RECT rc = {20, 20, 520, 520 };
- // pApp->m_fDisplayStats = 1 for full stats, 2 for little less, 3 for basic, 0 for no stats
- if (m_pFont && m_pSprite) {
- m_pSprite->Begin(D3DXSPRITE_ALPHABLEND);
- CString strText;
- int TextHeight = (int)(25.0*m_TextScale + 0.5);
+ RECT rc = {20, 20, 520, 520 };
+ // pApp->m_fDisplayStats = 1 for full stats, 2 for little less, 3 for basic, 0 for no stats
+ if (m_pFont && m_pSprite) {
+ m_pSprite->Begin(D3DXSPRITE_ALPHABLEND);
+ CString strText;
+ int TextHeight = (int)(25.0 * m_TextScale + 0.5);
- strText.Format(L"Frames drawn from stream start: %d | Sample time stamp: %d ms", m_pcFramesDrawn, (LONG)(m_llSampleTime / 10000));
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
+ strText.Format(L"Frames drawn from stream start: %d | Sample time stamp: %d ms", m_pcFramesDrawn, (LONG)(m_llSampleTime / 10000));
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
- if (pApp->m_fDisplayStats == 1) {
- strText.Format(L"Frame cycle : %.3f ms [%.3f ms, %.3f ms] Actual %+5.3f ms [%+.3f ms, %+.3f ms]", m_dFrameCycle, m_pGenlock->minFrameCycle, m_pGenlock->maxFrameCycle, m_fJitterMean / 10000.0, (double(llMinJitter)/10000.0), (double(llMaxJitter)/10000.0));
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
+ if (pApp->m_fDisplayStats == 1) {
+ strText.Format(L"Frame cycle : %.3f ms [%.3f ms, %.3f ms] Actual %+5.3f ms [%+.3f ms, %+.3f ms]", m_dFrameCycle, m_pGenlock->minFrameCycle, m_pGenlock->maxFrameCycle, m_fJitterMean / 10000.0, (double(llMinJitter) / 10000.0), (double(llMaxJitter) / 10000.0));
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
- strText.Format(L"Display cycle: Measured closest match %.3f ms Measured base %.3f ms", m_dOptimumDisplayCycle, m_dEstRefreshCycle);
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
+ strText.Format(L"Display cycle: Measured closest match %.3f ms Measured base %.3f ms", m_dOptimumDisplayCycle, m_dEstRefreshCycle);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
- strText.Format(L"Frame rate : %.3f fps Actual frame rate: %.3f fps", m_fps, 10000000.0 / m_fJitterMean);
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
+ strText.Format(L"Frame rate : %.3f fps Actual frame rate: %.3f fps", m_fps, 10000000.0 / m_fJitterMean);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
- strText.Format(L"Windows : Display cycle %.3f ms Display refresh rate %d Hz", m_dD3DRefreshCycle, m_uD3DRefreshRate);
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
+ strText.Format(L"Windows : Display cycle %.3f ms Display refresh rate %d Hz", m_dD3DRefreshCycle, m_uD3DRefreshRate);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
- if (m_pGenlock->powerstripTimingExists) {
- strText.Format(L"Powerstrip : Display cycle %.3f ms Display refresh rate %.3f Hz", 1000.0 / m_pGenlock->curDisplayFreq, m_pGenlock->curDisplayFreq);
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
- }
+ if (m_pGenlock->powerstripTimingExists) {
+ strText.Format(L"Powerstrip : Display cycle %.3f ms Display refresh rate %.3f Hz", 1000.0 / m_pGenlock->curDisplayFreq, m_pGenlock->curDisplayFreq);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
- if ((m_caps.Caps & D3DCAPS_READ_SCANLINE) == 0) {
- strText = L"Scan line err: Graphics device does not support scan line access. No sync is possible";
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
- }
+ if ((m_caps.Caps & D3DCAPS_READ_SCANLINE) == 0) {
+ strText = L"Scan line err: Graphics device does not support scan line access. No sync is possible";
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
#ifdef _DEBUG
- if (m_pD3DDevEx) {
- CComPtr<IDirect3DSwapChain9> pSC;
- HRESULT hr = m_pD3DDevEx->GetSwapChain(0, &pSC);
- CComQIPtr<IDirect3DSwapChain9Ex> pSCEx = pSC;
- if (pSCEx) {
- D3DPRESENTSTATS stats;
- hr = pSCEx->GetPresentStats(&stats);
- if (SUCCEEDED(hr)) {
- strText = L"Graphics device present stats:";
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
-
- strText.Format(L" PresentCount %d PresentRefreshCount %d SyncRefreshCount %d",
- stats.PresentCount, stats.PresentRefreshCount, stats.SyncRefreshCount);
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
-
- LARGE_INTEGER Freq;
- QueryPerformanceFrequency (&Freq);
- Freq.QuadPart /= 1000;
- strText.Format(L" SyncQPCTime %dms SyncGPUTime %dms",
- stats.SyncQPCTime.QuadPart / Freq.QuadPart, stats.SyncGPUTime.QuadPart / Freq.QuadPart);
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
- } else {
- strText = L"Graphics device does not support present stats";
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
- }
- }
- }
+ if (m_pD3DDevEx) {
+ CComPtr<IDirect3DSwapChain9> pSC;
+ HRESULT hr = m_pD3DDevEx->GetSwapChain(0, &pSC);
+ CComQIPtr<IDirect3DSwapChain9Ex> pSCEx = pSC;
+ if (pSCEx) {
+ D3DPRESENTSTATS stats;
+ hr = pSCEx->GetPresentStats(&stats);
+ if (SUCCEEDED(hr)) {
+ strText = L"Graphics device present stats:";
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ strText.Format(L" PresentCount %d PresentRefreshCount %d SyncRefreshCount %d",
+ stats.PresentCount, stats.PresentRefreshCount, stats.SyncRefreshCount);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ LARGE_INTEGER Freq;
+ QueryPerformanceFrequency(&Freq);
+ Freq.QuadPart /= 1000;
+ strText.Format(L" SyncQPCTime %dms SyncGPUTime %dms",
+ stats.SyncQPCTime.QuadPart / Freq.QuadPart, stats.SyncGPUTime.QuadPart / Freq.QuadPart);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ } else {
+ strText = L"Graphics device does not support present stats";
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+ }
+ }
#endif
- strText.Format(L"Video size : %d x %d (AR = %d : %d) Display resolution %d x %d ", m_NativeVideoSize.cx, m_NativeVideoSize.cy, m_AspectRatio.cx, m_AspectRatio.cy, m_ScreenSize.cx, m_ScreenSize.cy);
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
-
- if (s.m_RenderSettings.bSynchronizeDisplay || s.m_RenderSettings.bSynchronizeVideo) {
- if (s.m_RenderSettings.bSynchronizeDisplay && !m_pGenlock->PowerstripRunning()) {
- strText = L"Sync error : PowerStrip is not running. No display sync is possible.";
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
- } else {
- strText.Format(L"Sync adjust : %d | # of adjustments: %d", m_pGenlock->adjDelta, (m_pGenlock->clockAdjustmentsMade + m_pGenlock->displayAdjustmentsMade) / 2);
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
- }
- }
- }
-
- strText.Format(L"Sync offset : Average %3.1f ms [%.1f ms, %.1f ms] Target %3.1f ms", m_pGenlock->syncOffsetAvg, m_pGenlock->minSyncOffset, m_pGenlock->maxSyncOffset, s.m_RenderSettings.fTargetSyncOffset);
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
-
- strText.Format(L"Sync status : glitches %d, display-frame cycle mismatch: %7.3f %%, dropped frames %d", m_uSyncGlitches, 100 * m_dCycleDifference, m_pcFramesDropped);
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
-
- if (pApp->m_fDisplayStats == 1) {
- if (m_pAudioStats && s.m_RenderSettings.bSynchronizeVideo) {
- strText.Format(L"Audio lag : %3d ms [%d ms, %d ms] | %s", m_lAudioLag, m_lAudioLagMin, m_lAudioLagMax, (m_lAudioSlaveMode == 4) ? _T("Audio renderer is matching rate (for analog sound output)") : _T("Audio renderer is not matching rate"));
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
- }
-
- strText.Format(L"Sample time : waiting %3d ms", m_lNextSampleWait);
- if (s.m_RenderSettings.bSynchronizeNearest) {
- CString temp;
- temp.Format(L" paint time correction: %3d ms Hysteresis: %d", m_lShiftToNearest, m_llHysteresis /10000);
- strText += temp;
- }
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
-
- strText.Format(L"Buffering : Buffered %3d Free %3d Current Surface %3d", m_nUsedBuffer, m_nDXSurface - m_nUsedBuffer, m_nCurSurface, m_nVMR9Surfaces, m_iVMR9Surface);
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
-
- strText = L"Settings : ";
-
- if (m_bIsFullscreen) {
- strText += "D3DFS ";
- }
- if (s.m_RenderSettings.iVMRDisableDesktopComposition) {
- strText += "DisDC ";
- }
- if (s.m_RenderSettings.bSynchronizeVideo) {
- strText += "SyncVideo ";
- }
- if (s.m_RenderSettings.bSynchronizeDisplay) {
- strText += "SyncDisplay ";
- }
- if (s.m_RenderSettings.bSynchronizeNearest) {
- strText += "SyncNearest ";
- }
- if (m_bHighColorResolution) {
- strText += "10 bit ";
- }
- if (s.m_RenderSettings.iEVROutputRange == 0) {
- strText += "0-255 ";
- } else if (s.m_RenderSettings.iEVROutputRange == 1) {
- strText += "16-235 ";
- }
-
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
-
- strText.Format(L"%-13s: %s", GetDXVAVersion(), GetDXVADecoderDescription());
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
-
- strText.Format(L"DirectX SDK : %u", GetRenderersData()->GetDXSdkRelease());
- DrawText(rc, strText, 1);
- OffsetRect(&rc, 0, TextHeight);
-
- for (int i=0; i<6; i++) {
- if (m_strStatsMsg[i][0]) {
- DrawText(rc, m_strStatsMsg[i], 1);
- OffsetRect(&rc, 0, TextHeight);
- }
- }
- }
- OffsetRect(&rc, 0, TextHeight); // Extra "line feed"
- m_pSprite->End();
- }
-
- if (m_pLine && (pApp->m_fDisplayStats < 3)) {
- D3DXVECTOR2 Points[NB_JITTER];
- int nIndex;
-
- int DrawWidth = 625;
- int DrawHeight = 250;
- int Alpha = 80;
- int StartX = m_WindowRect.Width() - (DrawWidth + 20);
- int StartY = m_WindowRect.Height() - (DrawHeight + 20);
-
- DrawRect(RGB(0, 0, 0), Alpha, CRect(StartX, StartY, StartX + DrawWidth, StartY + DrawHeight));
- m_pLine->SetWidth(2.5);
- m_pLine->SetAntialias(1);
- m_pLine->Begin();
-
- for (int i = 0; i <= DrawHeight; i += 5) {
- Points[0].x = (FLOAT)StartX;
- Points[0].y = (FLOAT)(StartY + i);
- Points[1].x = (FLOAT)(StartX + (((i + 25) % 25) ? 50 : 625));
- Points[1].y = (FLOAT)(StartY + i);
- m_pLine->Draw(Points, 2, D3DCOLOR_XRGB(100, 100, 255));
- }
-
- for (int i = 0; i < DrawWidth; i += 125) { // Every 25:th sample
- Points[0].x = (FLOAT)(StartX + i);
- Points[0].y = (FLOAT)(StartY + DrawHeight / 2);
- Points[1].x = (FLOAT)(StartX + i);
- Points[1].y = (FLOAT)(StartY + DrawHeight / 2 + 10);
- m_pLine->Draw(Points, 2, D3DCOLOR_XRGB(100, 100, 255));
- }
-
- for (int i = 0; i < NB_JITTER; i++) {
- nIndex = (m_nNextJitter + 1 + i) % NB_JITTER;
- if (nIndex < 0) {
- nIndex += NB_JITTER;
- }
- double Jitter = m_pllJitter[nIndex] - m_fJitterMean;
- Points[i].x = (FLOAT)(StartX + (i * 5));
- Points[i].y = (FLOAT)(StartY + (Jitter / 2000.0 + 125.0));
- }
- m_pLine->Draw(Points, NB_JITTER, D3DCOLOR_XRGB(255, 100, 100));
-
- if (pApp->m_fDisplayStats == 1) { // Full on-screen statistics
- for (int i = 0; i < NB_JITTER; i++) {
- nIndex = (m_nNextSyncOffset + 1 + i) % NB_JITTER;
- if (nIndex < 0) {
- nIndex += NB_JITTER;
- }
- Points[i].x = (FLOAT)(StartX + (i * 5));
- Points[i].y = (FLOAT)(StartY + ((m_pllSyncOffset[nIndex]) / 2000 + 125));
- }
- m_pLine->Draw(Points, NB_JITTER, D3DCOLOR_XRGB(100, 200, 100));
- }
- m_pLine->End();
- }
+ strText.Format(L"Video size : %d x %d (AR = %d : %d) Display resolution %d x %d ", m_NativeVideoSize.cx, m_NativeVideoSize.cy, m_AspectRatio.cx, m_AspectRatio.cy, m_ScreenSize.cx, m_ScreenSize.cy);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ if (s.m_RenderSettings.bSynchronizeDisplay || s.m_RenderSettings.bSynchronizeVideo) {
+ if (s.m_RenderSettings.bSynchronizeDisplay && !m_pGenlock->PowerstripRunning()) {
+ strText = L"Sync error : PowerStrip is not running. No display sync is possible.";
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ } else {
+ strText.Format(L"Sync adjust : %d | # of adjustments: %d", m_pGenlock->adjDelta, (m_pGenlock->clockAdjustmentsMade + m_pGenlock->displayAdjustmentsMade) / 2);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+ }
+ }
+
+ strText.Format(L"Sync offset : Average %3.1f ms [%.1f ms, %.1f ms] Target %3.1f ms", m_pGenlock->syncOffsetAvg, m_pGenlock->minSyncOffset, m_pGenlock->maxSyncOffset, s.m_RenderSettings.fTargetSyncOffset);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ strText.Format(L"Sync status : glitches %d, display-frame cycle mismatch: %7.3f %%, dropped frames %d", m_uSyncGlitches, 100 * m_dCycleDifference, m_pcFramesDropped);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ if (pApp->m_fDisplayStats == 1) {
+ if (m_pAudioStats && s.m_RenderSettings.bSynchronizeVideo) {
+ strText.Format(L"Audio lag : %3d ms [%d ms, %d ms] | %s", m_lAudioLag, m_lAudioLagMin, m_lAudioLagMax, (m_lAudioSlaveMode == 4) ? _T("Audio renderer is matching rate (for analog sound output)") : _T("Audio renderer is not matching rate"));
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+
+ strText.Format(L"Sample time : waiting %3d ms", m_lNextSampleWait);
+ if (s.m_RenderSettings.bSynchronizeNearest) {
+ CString temp;
+ temp.Format(L" paint time correction: %3d ms Hysteresis: %d", m_lShiftToNearest, m_llHysteresis / 10000);
+ strText += temp;
+ }
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ strText.Format(L"Buffering : Buffered %3d Free %3d Current Surface %3d", m_nUsedBuffer, m_nDXSurface - m_nUsedBuffer, m_nCurSurface, m_nVMR9Surfaces, m_iVMR9Surface);
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ strText = L"Settings : ";
+
+ if (m_bIsFullscreen) {
+ strText += "D3DFS ";
+ }
+ if (s.m_RenderSettings.iVMRDisableDesktopComposition) {
+ strText += "DisDC ";
+ }
+ if (s.m_RenderSettings.bSynchronizeVideo) {
+ strText += "SyncVideo ";
+ }
+ if (s.m_RenderSettings.bSynchronizeDisplay) {
+ strText += "SyncDisplay ";
+ }
+ if (s.m_RenderSettings.bSynchronizeNearest) {
+ strText += "SyncNearest ";
+ }
+ if (m_bHighColorResolution) {
+ strText += "10 bit ";
+ }
+ if (s.m_RenderSettings.iEVROutputRange == 0) {
+ strText += "0-255 ";
+ } else if (s.m_RenderSettings.iEVROutputRange == 1) {
+ strText += "16-235 ";
+ }
+
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ strText.Format(L"%-13s: %s", GetDXVAVersion(), GetDXVADecoderDescription());
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ strText.Format(L"DirectX SDK : %u", GetRenderersData()->GetDXSdkRelease());
+ DrawText(rc, strText, 1);
+ OffsetRect(&rc, 0, TextHeight);
+
+ for (int i = 0; i < 6; i++) {
+ if (m_strStatsMsg[i][0]) {
+ DrawText(rc, m_strStatsMsg[i], 1);
+ OffsetRect(&rc, 0, TextHeight);
+ }
+ }
+ }
+ OffsetRect(&rc, 0, TextHeight); // Extra "line feed"
+ m_pSprite->End();
+ }
+
+ if (m_pLine && (pApp->m_fDisplayStats < 3)) {
+ D3DXVECTOR2 Points[NB_JITTER];
+ int nIndex;
+
+ int DrawWidth = 625;
+ int DrawHeight = 250;
+ int Alpha = 80;
+ int StartX = m_WindowRect.Width() - (DrawWidth + 20);
+ int StartY = m_WindowRect.Height() - (DrawHeight + 20);
+
+ DrawRect(RGB(0, 0, 0), Alpha, CRect(StartX, StartY, StartX + DrawWidth, StartY + DrawHeight));
+ m_pLine->SetWidth(2.5);
+ m_pLine->SetAntialias(1);
+ m_pLine->Begin();
+
+ for (int i = 0; i <= DrawHeight; i += 5) {
+ Points[0].x = (FLOAT)StartX;
+ Points[0].y = (FLOAT)(StartY + i);
+ Points[1].x = (FLOAT)(StartX + (((i + 25) % 25) ? 50 : 625));
+ Points[1].y = (FLOAT)(StartY + i);
+ m_pLine->Draw(Points, 2, D3DCOLOR_XRGB(100, 100, 255));
+ }
+
+ for (int i = 0; i < DrawWidth; i += 125) { // Every 25:th sample
+ Points[0].x = (FLOAT)(StartX + i);
+ Points[0].y = (FLOAT)(StartY + DrawHeight / 2);
+ Points[1].x = (FLOAT)(StartX + i);
+ Points[1].y = (FLOAT)(StartY + DrawHeight / 2 + 10);
+ m_pLine->Draw(Points, 2, D3DCOLOR_XRGB(100, 100, 255));
+ }
+
+ for (int i = 0; i < NB_JITTER; i++) {
+ nIndex = (m_nNextJitter + 1 + i) % NB_JITTER;
+ if (nIndex < 0) {
+ nIndex += NB_JITTER;
+ }
+ double Jitter = m_pllJitter[nIndex] - m_fJitterMean;
+ Points[i].x = (FLOAT)(StartX + (i * 5));
+ Points[i].y = (FLOAT)(StartY + (Jitter / 2000.0 + 125.0));
+ }
+ m_pLine->Draw(Points, NB_JITTER, D3DCOLOR_XRGB(255, 100, 100));
+
+ if (pApp->m_fDisplayStats == 1) { // Full on-screen statistics
+ for (int i = 0; i < NB_JITTER; i++) {
+ nIndex = (m_nNextSyncOffset + 1 + i) % NB_JITTER;
+ if (nIndex < 0) {
+ nIndex += NB_JITTER;
+ }
+ Points[i].x = (FLOAT)(StartX + (i * 5));
+ Points[i].y = (FLOAT)(StartY + ((m_pllSyncOffset[nIndex]) / 2000 + 125));
+ }
+ m_pLine->Draw(Points, NB_JITTER, D3DCOLOR_XRGB(100, 200, 100));
+ }
+ m_pLine->End();
+ }
}
double CBaseAP::GetRefreshRate()
{
- if (m_pGenlock->powerstripTimingExists) {
- return m_pGenlock->curDisplayFreq;
- } else {
- return (double)m_uD3DRefreshRate;
- }
+ if (m_pGenlock->powerstripTimingExists) {
+ return m_pGenlock->curDisplayFreq;
+ } else {
+ return (double)m_uD3DRefreshRate;
+ }
}
double CBaseAP::GetDisplayCycle()
{
- if (m_pGenlock->powerstripTimingExists) {
- return 1000.0 / m_pGenlock->curDisplayFreq;
- } else {
- return (double)m_dD3DRefreshCycle;
- }
+ if (m_pGenlock->powerstripTimingExists) {
+ return 1000.0 / m_pGenlock->curDisplayFreq;
+ } else {
+ return (double)m_dD3DRefreshCycle;
+ }
}
double CBaseAP::GetCycleDifference()
{
- double dBaseDisplayCycle = GetDisplayCycle();
- UINT i;
- double minDiff = 1.0;
- if (dBaseDisplayCycle == 0.0 || m_dFrameCycle == 0.0) {
- return 1.0;
- } else {
- for (i = 1; i <= 8; i++) { // Try a lot of multiples of the display frequency
- double dDisplayCycle = i * dBaseDisplayCycle;
- double diff = (dDisplayCycle - m_dFrameCycle) / m_dFrameCycle;
- if (abs(diff) < abs(minDiff)) {
- minDiff = diff;
- m_dOptimumDisplayCycle = dDisplayCycle;
- }
- }
- }
- return minDiff;
+ double dBaseDisplayCycle = GetDisplayCycle();
+ UINT i;
+ double minDiff = 1.0;
+ if (dBaseDisplayCycle == 0.0 || m_dFrameCycle == 0.0) {
+ return 1.0;
+ } else {
+ for (i = 1; i <= 8; i++) { // Try a lot of multiples of the display frequency
+ double dDisplayCycle = i * dBaseDisplayCycle;
+ double diff = (dDisplayCycle - m_dFrameCycle) / m_dFrameCycle;
+ if (abs(diff) < abs(minDiff)) {
+ minDiff = diff;
+ m_dOptimumDisplayCycle = dDisplayCycle;
+ }
+ }
+ }
+ return minDiff;
}
void CBaseAP::EstimateRefreshTimings()
{
- if (m_pD3DDev) {
- CRenderersData *pApp = GetRenderersData();
- D3DRASTER_STATUS rasterStatus;
- m_pD3DDev->GetRasterStatus(0, &rasterStatus);
- while (rasterStatus.ScanLine != 0) {
- m_pD3DDev->GetRasterStatus(0, &rasterStatus);
- }
- while (rasterStatus.ScanLine == 0) {
- m_pD3DDev->GetRasterStatus(0, &rasterStatus);
- }
- m_pD3DDev->GetRasterStatus(0, &rasterStatus);
- LONGLONG startTime = pApp->GetPerfCounter();
- UINT startLine = rasterStatus.ScanLine;
- LONGLONG endTime = 0;
- LONGLONG time = 0;
- UINT endLine = 0;
- UINT line = 0;
- bool done = false;
- while (!done) { // Estimate time for one scan line
- m_pD3DDev->GetRasterStatus(0, &rasterStatus);
- line = rasterStatus.ScanLine;
- time = pApp->GetPerfCounter();
- if (line > 0) {
- endLine = line;
- endTime = time;
- } else {
- done = true;
- }
- }
- m_dDetectedScanlineTime = (double)(endTime - startTime) / (double)((endLine - startLine) * 10000.0);
-
- // Estimate the display refresh rate from the vsyncs
- m_pD3DDev->GetRasterStatus(0, &rasterStatus);
- while (rasterStatus.ScanLine != 0) {
- m_pD3DDev->GetRasterStatus(0, &rasterStatus);
- }
- // Now we're at the start of a vsync
- startTime = pApp->GetPerfCounter();
- UINT i;
- for (i = 1; i <= 50; i++) {
- m_pD3DDev->GetRasterStatus(0, &rasterStatus);
- while (rasterStatus.ScanLine == 0) {
- m_pD3DDev->GetRasterStatus(0, &rasterStatus);
- }
- while (rasterStatus.ScanLine != 0) {
- m_pD3DDev->GetRasterStatus(0, &rasterStatus);
- }
- // Now we're at the next vsync
- }
- endTime = pApp->GetPerfCounter();
- m_dEstRefreshCycle = (double)(endTime - startTime) / ((i - 1) * 10000.0);
- }
+ if (m_pD3DDev) {
+ CRenderersData* pApp = GetRenderersData();
+ D3DRASTER_STATUS rasterStatus;
+ m_pD3DDev->GetRasterStatus(0, &rasterStatus);
+ while (rasterStatus.ScanLine != 0) {
+ m_pD3DDev->GetRasterStatus(0, &rasterStatus);
+ }
+ while (rasterStatus.ScanLine == 0) {
+ m_pD3DDev->GetRasterStatus(0, &rasterStatus);
+ }
+ m_pD3DDev->GetRasterStatus(0, &rasterStatus);
+ LONGLONG startTime = pApp->GetPerfCounter();
+ UINT startLine = rasterStatus.ScanLine;
+ LONGLONG endTime = 0;
+ LONGLONG time = 0;
+ UINT endLine = 0;
+ UINT line = 0;
+ bool done = false;
+ while (!done) { // Estimate time for one scan line
+ m_pD3DDev->GetRasterStatus(0, &rasterStatus);
+ line = rasterStatus.ScanLine;
+ time = pApp->GetPerfCounter();
+ if (line > 0) {
+ endLine = line;
+ endTime = time;
+ } else {
+ done = true;
+ }
+ }
+ m_dDetectedScanlineTime = (double)(endTime - startTime) / (double)((endLine - startLine) * 10000.0);
+
+ // Estimate the display refresh rate from the vsyncs
+ m_pD3DDev->GetRasterStatus(0, &rasterStatus);
+ while (rasterStatus.ScanLine != 0) {
+ m_pD3DDev->GetRasterStatus(0, &rasterStatus);
+ }
+ // Now we're at the start of a vsync
+ startTime = pApp->GetPerfCounter();
+ UINT i;
+ for (i = 1; i <= 50; i++) {
+ m_pD3DDev->GetRasterStatus(0, &rasterStatus);
+ while (rasterStatus.ScanLine == 0) {
+ m_pD3DDev->GetRasterStatus(0, &rasterStatus);
+ }
+ while (rasterStatus.ScanLine != 0) {
+ m_pD3DDev->GetRasterStatus(0, &rasterStatus);
+ }
+ // Now we're at the next vsync
+ }
+ endTime = pApp->GetPerfCounter();
+ m_dEstRefreshCycle = (double)(endTime - startTime) / ((i - 1) * 10000.0);
+ }
}
bool CBaseAP::ExtractInterlaced(const AM_MEDIA_TYPE* pmt)
{
- if (pmt->formattype==FORMAT_VideoInfo) {
- return false;
- } else if (pmt->formattype==FORMAT_VideoInfo2) {
- return (((VIDEOINFOHEADER2*)pmt->pbFormat)->dwInterlaceFlags & AMINTERLACE_IsInterlaced) != 0;
- } else if (pmt->formattype==FORMAT_MPEGVideo) {
- return false;
- } else if (pmt->formattype==FORMAT_MPEG2Video) {
- return (((MPEG2VIDEOINFO*)pmt->pbFormat)->hdr.dwInterlaceFlags & AMINTERLACE_IsInterlaced) != 0;
- } else {
- return false;
- }
+ if (pmt->formattype == FORMAT_VideoInfo) {
+ return false;
+ } else if (pmt->formattype == FORMAT_VideoInfo2) {
+ return (((VIDEOINFOHEADER2*)pmt->pbFormat)->dwInterlaceFlags & AMINTERLACE_IsInterlaced) != 0;
+ } else if (pmt->formattype == FORMAT_MPEGVideo) {
+ return false;
+ } else if (pmt->formattype == FORMAT_MPEG2Video) {
+ return (((MPEG2VIDEOINFO*)pmt->pbFormat)->hdr.dwInterlaceFlags & AMINTERLACE_IsInterlaced) != 0;
+ } else {
+ return false;
+ }
}
STDMETHODIMP CBaseAP::GetDIB(BYTE* lpDib, DWORD* size)
{
- CheckPointer(size, E_POINTER);
-
- HRESULT hr;
-
- D3DSURFACE_DESC desc;
- memset(&desc, 0, sizeof(desc));
- m_pVideoSurface[m_nCurSurface]->GetDesc(&desc);
-
- DWORD required = sizeof(BITMAPINFOHEADER) + (desc.Width * desc.Height * 32 >> 3);
- if (!lpDib) {
- *size = required;
- return S_OK;
- }
- if (*size < required) {
- return E_OUTOFMEMORY;
- }
- *size = required;
-
- CComPtr<IDirect3DSurface9> pSurface = m_pVideoSurface[m_nCurSurface];
- D3DLOCKED_RECT r;
- if (FAILED(hr = pSurface->LockRect(&r, NULL, D3DLOCK_READONLY))) {
- pSurface = NULL;
- if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &pSurface, NULL))
- || FAILED(hr = m_pD3DDev->GetRenderTargetData(m_pVideoSurface[m_nCurSurface], pSurface))
- || FAILED(hr = pSurface->LockRect(&r, NULL, D3DLOCK_READONLY))) {
- return hr;
- }
- }
-
- BITMAPINFOHEADER* bih = (BITMAPINFOHEADER*)lpDib;
- memset(bih, 0, sizeof(BITMAPINFOHEADER));
- bih->biSize = sizeof(BITMAPINFOHEADER);
- bih->biWidth = desc.Width;
- bih->biHeight = desc.Height;
- bih->biBitCount = 32;
- bih->biPlanes = 1;
- bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount >> 3;
-
- BitBltFromRGBToRGB(
- bih->biWidth, bih->biHeight,
- (BYTE*)(bih + 1), bih->biWidth*bih->biBitCount>>3, bih->biBitCount,
- (BYTE*)r.pBits + r.Pitch*(desc.Height-1), -(int)r.Pitch, 32);
-
- pSurface->UnlockRect();
-
- return S_OK;
+ CheckPointer(size, E_POINTER);
+
+ HRESULT hr;
+
+ D3DSURFACE_DESC desc;
+ memset(&desc, 0, sizeof(desc));
+ m_pVideoSurface[m_nCurSurface]->GetDesc(&desc);
+
+ DWORD required = sizeof(BITMAPINFOHEADER) + (desc.Width * desc.Height * 32 >> 3);
+ if (!lpDib) {
+ *size = required;
+ return S_OK;
+ }
+ if (*size < required) {
+ return E_OUTOFMEMORY;
+ }
+ *size = required;
+
+ CComPtr<IDirect3DSurface9> pSurface = m_pVideoSurface[m_nCurSurface];
+ D3DLOCKED_RECT r;
+ if (FAILED(hr = pSurface->LockRect(&r, NULL, D3DLOCK_READONLY))) {
+ pSurface = NULL;
+ if (FAILED(hr = m_pD3DDev->CreateOffscreenPlainSurface(desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &pSurface, NULL))
+ || FAILED(hr = m_pD3DDev->GetRenderTargetData(m_pVideoSurface[m_nCurSurface], pSurface))
+ || FAILED(hr = pSurface->LockRect(&r, NULL, D3DLOCK_READONLY))) {
+ return hr;
+ }
+ }
+
+ BITMAPINFOHEADER* bih = (BITMAPINFOHEADER*)lpDib;
+ memset(bih, 0, sizeof(BITMAPINFOHEADER));
+ bih->biSize = sizeof(BITMAPINFOHEADER);
+ bih->biWidth = desc.Width;
+ bih->biHeight = desc.Height;
+ bih->biBitCount = 32;
+ bih->biPlanes = 1;
+ bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount >> 3;
+
+ BitBltFromRGBToRGB(
+ bih->biWidth, bih->biHeight,
+ (BYTE*)(bih + 1), bih->biWidth * bih->biBitCount >> 3, bih->biBitCount,
+ (BYTE*)r.pBits + r.Pitch * (desc.Height - 1), -(int)r.Pitch, 32);
+
+ pSurface->UnlockRect();
+
+ return S_OK;
}
STDMETHODIMP CBaseAP::SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget)
{
- return SetPixelShader2(pSrcData, pTarget, false);
+ return SetPixelShader2(pSrcData, pTarget, false);
}
STDMETHODIMP CBaseAP::SetPixelShader2(LPCSTR pSrcData, LPCSTR pTarget, bool bScreenSpace)
{
- CAutoLock cRenderLock(&m_allocatorLock);
-
- CAtlList<CExternalPixelShader> *pPixelShaders;
- if (bScreenSpace) {
- pPixelShaders = &m_pPixelShadersScreenSpace;
- } else {
- pPixelShaders = &m_pPixelShaders;
- }
-
- if (!pSrcData && !pTarget) {
- pPixelShaders->RemoveAll();
- m_pD3DDev->SetPixelShader(NULL);
- return S_OK;
- }
-
- if (!pSrcData || !pTarget) {
- return E_INVALIDARG;
- }
-
- CExternalPixelShader Shader;
- Shader.m_SourceData = pSrcData;
- Shader.m_SourceTarget = pTarget;
-
- CComPtr<IDirect3DPixelShader9> pPixelShader;
-
- HRESULT hr = Shader.Compile(m_pPSC);
- if (FAILED(hr)) {
- return hr;
- }
-
- pPixelShaders->AddTail(Shader);
- Paint(true);
- return S_OK;
-}
-
-CSyncAP::CSyncAP(HWND hWnd, bool bFullscreen, HRESULT& hr, CString &_Error): CBaseAP(hWnd, bFullscreen, hr, _Error)
-{
- HMODULE hLib;
- CRenderersSettings& s = GetRenderersSettings();
-
- m_nResetToken = 0;
- m_hRenderThread = INVALID_HANDLE_VALUE;
- m_hMixerThread= INVALID_HANDLE_VALUE;
- m_hEvtFlush = INVALID_HANDLE_VALUE;
- m_hEvtQuit = INVALID_HANDLE_VALUE;
- m_hEvtSkip = INVALID_HANDLE_VALUE;
- m_bEvtQuit = 0;
- m_bEvtFlush = 0;
-
- if (FAILED (hr)) {
- _Error += L"SyncAP failed\n";
- return;
- }
-
- // Load EVR specifics DLLs
- hLib = LoadLibrary (L"dxva2.dll");
- pfDXVA2CreateDirect3DDeviceManager9 = hLib ? (PTR_DXVA2CreateDirect3DDeviceManager9) GetProcAddress (hLib, "DXVA2CreateDirect3DDeviceManager9") : NULL;
-
- // Load EVR functions
- hLib = LoadLibrary (L"evr.dll");
- pfMFCreateDXSurfaceBuffer = hLib ? (PTR_MFCreateDXSurfaceBuffer)GetProcAddress (hLib, "MFCreateDXSurfaceBuffer") : NULL;
- pfMFCreateVideoSampleFromSurface = hLib ? (PTR_MFCreateVideoSampleFromSurface)GetProcAddress (hLib, "MFCreateVideoSampleFromSurface") : NULL;
- pfMFCreateVideoMediaType = hLib ? (PTR_MFCreateVideoMediaType)GetProcAddress (hLib, "MFCreateVideoMediaType") : NULL;
-
- if (!pfDXVA2CreateDirect3DDeviceManager9 || !pfMFCreateDXSurfaceBuffer || !pfMFCreateVideoSampleFromSurface || !pfMFCreateVideoMediaType) {
- if (!pfDXVA2CreateDirect3DDeviceManager9) {
- _Error += L"Could not find DXVA2CreateDirect3DDeviceManager9 (dxva2.dll)\n";
- }
- if (!pfMFCreateDXSurfaceBuffer) {
- _Error += L"Could not find MFCreateDXSurfaceBuffer (evr.dll)\n";
- }
- if (!pfMFCreateVideoSampleFromSurface) {
- _Error += L"Could not find MFCreateVideoSampleFromSurface (evr.dll)\n";
- }
- if (!pfMFCreateVideoMediaType) {
- _Error += L"Could not find MFCreateVideoMediaType (evr.dll)\n";
- }
- hr = E_FAIL;
- return;
- }
-
- // Load Vista specific DLLs
- hLib = LoadLibrary (L"avrt.dll");
- pfAvSetMmThreadCharacteristicsW = hLib ? (PTR_AvSetMmThreadCharacteristicsW) GetProcAddress (hLib, "AvSetMmThreadCharacteristicsW") : NULL;
- pfAvSetMmThreadPriority = hLib ? (PTR_AvSetMmThreadPriority) GetProcAddress (hLib, "AvSetMmThreadPriority") : NULL;
- pfAvRevertMmThreadCharacteristics = hLib ? (PTR_AvRevertMmThreadCharacteristics) GetProcAddress (hLib, "AvRevertMmThreadCharacteristics") : NULL;
-
- // Init DXVA manager
- hr = pfDXVA2CreateDirect3DDeviceManager9(&m_nResetToken, &m_pD3DManager);
- if (SUCCEEDED (hr)) {
- hr = m_pD3DManager->ResetDevice(m_pD3DDev, m_nResetToken);
- if (!SUCCEEDED (hr)) {
- _Error += L"m_pD3DManager->ResetDevice failed\n";
- }
- } else {
- _Error += L"DXVA2CreateDirect3DDeviceManager9 failed\n";
- }
-
- CComPtr<IDirectXVideoDecoderService> pDecoderService;
- HANDLE hDevice;
- if (SUCCEEDED (m_pD3DManager->OpenDeviceHandle(&hDevice)) &&
- SUCCEEDED (m_pD3DManager->GetVideoService (hDevice, __uuidof(IDirectXVideoDecoderService), (void**)&pDecoderService))) {
- HookDirectXVideoDecoderService (pDecoderService);
- m_pD3DManager->CloseDeviceHandle (hDevice);
- }
-
- // Bufferize frame only with 3D texture
- if (s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D) {
- m_nDXSurface = max(min (s.iEvrBuffers, MAX_PICTURE_SLOTS-2), 4);
- } else {
- m_nDXSurface = 1;
- }
-
- m_nRenderState = Shutdown;
- m_bStepping = false;
- m_bUseInternalTimer = false;
- m_LastSetOutputRange = -1;
- m_bPendingRenegotiate = false;
- m_bPendingMediaFinished = false;
- m_pCurrentDisplaydSample = NULL;
- m_nStepCount = 0;
- m_dwVideoAspectRatioMode = MFVideoARMode_PreservePicture;
- m_dwVideoRenderPrefs = (MFVideoRenderPrefs)0;
- m_BorderColor = RGB (0,0,0);
- m_pOuterEVR = NULL;
- m_bPrerolled = false;
- m_lShiftToNearest = -1; // Illegal value to start with
+ CAutoLock cRenderLock(&m_allocatorLock);
+
+ CAtlList<CExternalPixelShader>* pPixelShaders;
+ if (bScreenSpace) {
+ pPixelShaders = &m_pPixelShadersScreenSpace;
+ } else {
+ pPixelShaders = &m_pPixelShaders;
+ }
+
+ if (!pSrcData && !pTarget) {
+ pPixelShaders->RemoveAll();
+ m_pD3DDev->SetPixelShader(NULL);
+ return S_OK;
+ }
+
+ if (!pSrcData || !pTarget) {
+ return E_INVALIDARG;
+ }
+
+ CExternalPixelShader Shader;
+ Shader.m_SourceData = pSrcData;
+ Shader.m_SourceTarget = pTarget;
+
+ CComPtr<IDirect3DPixelShader9> pPixelShader;
+
+ HRESULT hr = Shader.Compile(m_pPSC);
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ pPixelShaders->AddTail(Shader);
+ Paint(true);
+ return S_OK;
+}
+
+CSyncAP::CSyncAP(HWND hWnd, bool bFullscreen, HRESULT& hr, CString& _Error): CBaseAP(hWnd, bFullscreen, hr, _Error)
+{
+ HMODULE hLib;
+ CRenderersSettings& s = GetRenderersSettings();
+
+ m_nResetToken = 0;
+ m_hRenderThread = INVALID_HANDLE_VALUE;
+ m_hMixerThread = INVALID_HANDLE_VALUE;
+ m_hEvtFlush = INVALID_HANDLE_VALUE;
+ m_hEvtQuit = INVALID_HANDLE_VALUE;
+ m_hEvtSkip = INVALID_HANDLE_VALUE;
+ m_bEvtQuit = 0;
+ m_bEvtFlush = 0;
+
+ if (FAILED(hr)) {
+ _Error += L"SyncAP failed\n";
+ return;
+ }
+
+ // Load EVR specifics DLLs
+ hLib = LoadLibrary(L"dxva2.dll");
+ pfDXVA2CreateDirect3DDeviceManager9 = hLib ? (PTR_DXVA2CreateDirect3DDeviceManager9) GetProcAddress(hLib, "DXVA2CreateDirect3DDeviceManager9") : NULL;
+
+ // Load EVR functions
+ hLib = LoadLibrary(L"evr.dll");
+ pfMFCreateDXSurfaceBuffer = hLib ? (PTR_MFCreateDXSurfaceBuffer)GetProcAddress(hLib, "MFCreateDXSurfaceBuffer") : NULL;
+ pfMFCreateVideoSampleFromSurface = hLib ? (PTR_MFCreateVideoSampleFromSurface)GetProcAddress(hLib, "MFCreateVideoSampleFromSurface") : NULL;
+ pfMFCreateVideoMediaType = hLib ? (PTR_MFCreateVideoMediaType)GetProcAddress(hLib, "MFCreateVideoMediaType") : NULL;
+
+ if (!pfDXVA2CreateDirect3DDeviceManager9 || !pfMFCreateDXSurfaceBuffer || !pfMFCreateVideoSampleFromSurface || !pfMFCreateVideoMediaType) {
+ if (!pfDXVA2CreateDirect3DDeviceManager9) {
+ _Error += L"Could not find DXVA2CreateDirect3DDeviceManager9 (dxva2.dll)\n";
+ }
+ if (!pfMFCreateDXSurfaceBuffer) {
+ _Error += L"Could not find MFCreateDXSurfaceBuffer (evr.dll)\n";
+ }
+ if (!pfMFCreateVideoSampleFromSurface) {
+ _Error += L"Could not find MFCreateVideoSampleFromSurface (evr.dll)\n";
+ }
+ if (!pfMFCreateVideoMediaType) {
+ _Error += L"Could not find MFCreateVideoMediaType (evr.dll)\n";
+ }
+ hr = E_FAIL;
+ return;
+ }
+
+ // Load Vista specific DLLs
+ hLib = LoadLibrary(L"avrt.dll");
+ pfAvSetMmThreadCharacteristicsW = hLib ? (PTR_AvSetMmThreadCharacteristicsW) GetProcAddress(hLib, "AvSetMmThreadCharacteristicsW") : NULL;
+ pfAvSetMmThreadPriority = hLib ? (PTR_AvSetMmThreadPriority) GetProcAddress(hLib, "AvSetMmThreadPriority") : NULL;
+ pfAvRevertMmThreadCharacteristics = hLib ? (PTR_AvRevertMmThreadCharacteristics) GetProcAddress(hLib, "AvRevertMmThreadCharacteristics") : NULL;
+
+ // Init DXVA manager
+ hr = pfDXVA2CreateDirect3DDeviceManager9(&m_nResetToken, &m_pD3DManager);
+ if (SUCCEEDED(hr)) {
+ hr = m_pD3DManager->ResetDevice(m_pD3DDev, m_nResetToken);
+ if (!SUCCEEDED(hr)) {
+ _Error += L"m_pD3DManager->ResetDevice failed\n";
+ }
+ } else {
+ _Error += L"DXVA2CreateDirect3DDeviceManager9 failed\n";
+ }
+
+ CComPtr<IDirectXVideoDecoderService> pDecoderService;
+ HANDLE hDevice;
+ if (SUCCEEDED(m_pD3DManager->OpenDeviceHandle(&hDevice)) &&
+ SUCCEEDED(m_pD3DManager->GetVideoService(hDevice, __uuidof(IDirectXVideoDecoderService), (void**)&pDecoderService))) {
+ HookDirectXVideoDecoderService(pDecoderService);
+ m_pD3DManager->CloseDeviceHandle(hDevice);
+ }
+
+ // Bufferize frame only with 3D texture
+ if (s.iAPSurfaceUsage == VIDRNDT_AP_TEXTURE3D) {
+ m_nDXSurface = max(min(s.iEvrBuffers, MAX_PICTURE_SLOTS - 2), 4);
+ } else {
+ m_nDXSurface = 1;
+ }
+
+ m_nRenderState = Shutdown;
+ m_bStepping = false;
+ m_bUseInternalTimer = false;
+ m_LastSetOutputRange = -1;
+ m_bPendingRenegotiate = false;
+ m_bPendingMediaFinished = false;
+ m_pCurrentDisplaydSample = NULL;
+ m_nStepCount = 0;
+ m_dwVideoAspectRatioMode = MFVideoARMode_PreservePicture;
+ m_dwVideoRenderPrefs = (MFVideoRenderPrefs)0;
+ m_BorderColor = RGB(0, 0, 0);
+ m_pOuterEVR = NULL;
+ m_bPrerolled = false;
+ m_lShiftToNearest = -1; // Illegal value to start with
}
CSyncAP::~CSyncAP(void)
{
- StopWorkerThreads();
- m_pMediaType = NULL;
- m_pClock = NULL;
- m_pD3DManager = NULL;
+ StopWorkerThreads();
+ m_pMediaType = NULL;
+ m_pClock = NULL;
+ m_pD3DManager = NULL;
}
HRESULT CSyncAP::CheckShutdown() const
{
- if (m_nRenderState == Shutdown) {
- return MF_E_SHUTDOWN;
- } else {
- return S_OK;
- }
+ if (m_nRenderState == Shutdown) {
+ return MF_E_SHUTDOWN;
+ } else {
+ return S_OK;
+ }
}
void CSyncAP::StartWorkerThreads()
{
- DWORD dwThreadId;
- if (m_nRenderState == Shutdown) {
- m_hEvtQuit = CreateEvent(NULL, TRUE, FALSE, NULL);
- m_hEvtFlush = CreateEvent(NULL, TRUE, FALSE, NULL);
- m_hEvtSkip = CreateEvent(NULL, TRUE, FALSE, NULL);
- m_hMixerThread = ::CreateThread(NULL, 0, MixerThreadStatic, (LPVOID)this, 0, &dwThreadId);
- SetThreadPriority(m_hMixerThread, THREAD_PRIORITY_HIGHEST);
- m_hRenderThread = ::CreateThread(NULL, 0, RenderThreadStatic, (LPVOID)this, 0, &dwThreadId);
- SetThreadPriority(m_hRenderThread, THREAD_PRIORITY_TIME_CRITICAL);
- m_nRenderState = Stopped;
- }
+ DWORD dwThreadId;
+ if (m_nRenderState == Shutdown) {
+ m_hEvtQuit = CreateEvent(NULL, TRUE, FALSE, NULL);
+ m_hEvtFlush = CreateEvent(NULL, TRUE, FALSE, NULL);
+ m_hEvtSkip = CreateEvent(NULL, TRUE, FALSE, NULL);
+ m_hMixerThread = ::CreateThread(NULL, 0, MixerThreadStatic, (LPVOID)this, 0, &dwThreadId);
+ SetThreadPriority(m_hMixerThread, THREAD_PRIORITY_HIGHEST);
+ m_hRenderThread = ::CreateThread(NULL, 0, RenderThreadStatic, (LPVOID)this, 0, &dwThreadId);
+ SetThreadPriority(m_hRenderThread, THREAD_PRIORITY_TIME_CRITICAL);
+ m_nRenderState = Stopped;
+ }
}
void CSyncAP::StopWorkerThreads()
{
- if (m_nRenderState != Shutdown) {
- SetEvent(m_hEvtFlush);
- m_bEvtFlush = true;
- SetEvent(m_hEvtQuit);
- m_bEvtQuit = true;
- SetEvent(m_hEvtSkip);
- m_bEvtSkip = true;
- if ((m_hRenderThread != INVALID_HANDLE_VALUE) && (WaitForSingleObject (m_hRenderThread, 10000) == WAIT_TIMEOUT)) {
- ASSERT (FALSE);
- TerminateThread (m_hRenderThread, 0xDEAD);
- }
- if (m_hRenderThread != INVALID_HANDLE_VALUE) {
- CloseHandle (m_hRenderThread);
- }
- if ((m_hMixerThread != INVALID_HANDLE_VALUE) && (WaitForSingleObject (m_hMixerThread, 10000) == WAIT_TIMEOUT)) {
- ASSERT (FALSE);
- TerminateThread (m_hMixerThread, 0xDEAD);
- }
- if (m_hMixerThread != INVALID_HANDLE_VALUE) {
- CloseHandle (m_hMixerThread);
- }
-
- if (m_hEvtFlush != INVALID_HANDLE_VALUE) {
- CloseHandle(m_hEvtFlush);
- }
- if (m_hEvtQuit != INVALID_HANDLE_VALUE) {
- CloseHandle(m_hEvtQuit);
- }
- if (m_hEvtSkip != INVALID_HANDLE_VALUE) {
- CloseHandle(m_hEvtSkip);
- }
-
- m_bEvtFlush = false;
- m_bEvtQuit = false;
- m_bEvtSkip = false;
- }
- m_nRenderState = Shutdown;
+ if (m_nRenderState != Shutdown) {
+ SetEvent(m_hEvtFlush);
+ m_bEvtFlush = true;
+ SetEvent(m_hEvtQuit);
+ m_bEvtQuit = true;
+ SetEvent(m_hEvtSkip);
+ m_bEvtSkip = true;
+ if ((m_hRenderThread != INVALID_HANDLE_VALUE) && (WaitForSingleObject(m_hRenderThread, 10000) == WAIT_TIMEOUT)) {
+ ASSERT(FALSE);
+ TerminateThread(m_hRenderThread, 0xDEAD);
+ }
+ if (m_hRenderThread != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hRenderThread);
+ }
+ if ((m_hMixerThread != INVALID_HANDLE_VALUE) && (WaitForSingleObject(m_hMixerThread, 10000) == WAIT_TIMEOUT)) {
+ ASSERT(FALSE);
+ TerminateThread(m_hMixerThread, 0xDEAD);
+ }
+ if (m_hMixerThread != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hMixerThread);
+ }
+
+ if (m_hEvtFlush != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hEvtFlush);
+ }
+ if (m_hEvtQuit != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hEvtQuit);
+ }
+ if (m_hEvtSkip != INVALID_HANDLE_VALUE) {
+ CloseHandle(m_hEvtSkip);
+ }
+
+ m_bEvtFlush = false;
+ m_bEvtQuit = false;
+ m_bEvtSkip = false;
+ }
+ m_nRenderState = Shutdown;
}
STDMETHODIMP CSyncAP::CreateRenderer(IUnknown** ppRenderer)
{
- CheckPointer(ppRenderer, E_POINTER);
- *ppRenderer = NULL;
- HRESULT hr = E_FAIL;
+ CheckPointer(ppRenderer, E_POINTER);
+ *ppRenderer = NULL;
+ HRESULT hr = E_FAIL;
- do {
- CMacrovisionKicker* pMK = DNew CMacrovisionKicker(NAME("CMacrovisionKicker"), NULL);
- CComPtr<IUnknown> pUnk = (IUnknown*)(INonDelegatingUnknown*)pMK;
+ do {
+ CMacrovisionKicker* pMK = DNew CMacrovisionKicker(NAME("CMacrovisionKicker"), NULL);
+ CComPtr<IUnknown> pUnk = (IUnknown*)(INonDelegatingUnknown*)pMK;
- CSyncRenderer *pOuterEVR = DNew CSyncRenderer(NAME("CSyncRenderer"), pUnk, hr, &m_VMR9AlphaBitmap, this);
- m_pOuterEVR = pOuterEVR;
+ CSyncRenderer* pOuterEVR = DNew CSyncRenderer(NAME("CSyncRenderer"), pUnk, hr, &m_VMR9AlphaBitmap, this);
+ m_pOuterEVR = pOuterEVR;
- pMK->SetInner((IUnknown*)(INonDelegatingUnknown*)pOuterEVR);
- CComQIPtr<IBaseFilter> pBF = pUnk;
+ pMK->SetInner((IUnknown*)(INonDelegatingUnknown*)pOuterEVR);
+ CComQIPtr<IBaseFilter> pBF = pUnk;
- if (FAILED(hr)) {
- break;
- }
+ if (FAILED(hr)) {
+ break;
+ }
- // Set EVR custom presenter
- CComPtr<IMFVideoPresenter> pVP;
- CComPtr<IMFVideoRenderer> pMFVR;
- CComQIPtr<IMFGetService, &__uuidof(IMFGetService)> pMFGS = pBF;
- CComQIPtr<IEVRFilterConfig> pConfig = pBF;
- if (SUCCEEDED(hr)) {
- if (FAILED(pConfig->SetNumberOfStreams(3))) { // TODO - maybe need other number of input stream ...
- break;
- }
- }
+ // Set EVR custom presenter
+ CComPtr<IMFVideoPresenter> pVP;
+ CComPtr<IMFVideoRenderer> pMFVR;
+ CComQIPtr<IMFGetService, &__uuidof(IMFGetService)> pMFGS = pBF;
+ CComQIPtr<IEVRFilterConfig> pConfig = pBF;
+ if (SUCCEEDED(hr)) {
+ if (FAILED(pConfig->SetNumberOfStreams(3))) { // TODO - maybe need other number of input stream ...
+ break;
+ }
+ }
- hr = pMFGS->GetService (MR_VIDEO_RENDER_SERVICE, IID_IMFVideoRenderer, (void**)&pMFVR);
+ hr = pMFGS->GetService(MR_VIDEO_RENDER_SERVICE, IID_IMFVideoRenderer, (void**)&pMFVR);
- if (SUCCEEDED(hr)) {
- hr = QueryInterface(__uuidof(IMFVideoPresenter), (void**)&pVP);
- }
- if (SUCCEEDED(hr)) {
- hr = pMFVR->InitializeRenderer(NULL, pVP);
- }
+ if (SUCCEEDED(hr)) {
+ hr = QueryInterface(__uuidof(IMFVideoPresenter), (void**)&pVP);
+ }
+ if (SUCCEEDED(hr)) {
+ hr = pMFVR->InitializeRenderer(NULL, pVP);
+ }
- CComPtr<IPin> pPin = GetFirstPin(pBF);
- CComQIPtr<IMemInputPin> pMemInputPin = pPin;
+ CComPtr<IPin> pPin = GetFirstPin(pBF);
+ CComQIPtr<IMemInputPin> pMemInputPin = pPin;
- m_bUseInternalTimer = HookNewSegmentAndReceive((IPinC*)(IPin*)pPin, (IMemInputPinC*)(IMemInputPin*)pMemInputPin);
- if (FAILED(hr)) {
- *ppRenderer = NULL;
- } else {
- *ppRenderer = pBF.Detach();
- }
- } while (0);
+ m_bUseInternalTimer = HookNewSegmentAndReceive((IPinC*)(IPin*)pPin, (IMemInputPinC*)(IMemInputPin*)pMemInputPin);
+ if (FAILED(hr)) {
+ *ppRenderer = NULL;
+ } else {
+ *ppRenderer = pBF.Detach();
+ }
+ } while (0);
- return hr;
+ return hr;
}
STDMETHODIMP_(bool) CSyncAP::Paint(bool fAll)
{
- return __super::Paint(fAll);
+ return __super::Paint(fAll);
}
STDMETHODIMP CSyncAP::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- HRESULT hr;
- if (riid == __uuidof(IMFClockStateSink)) {
- hr = GetInterface((IMFClockStateSink*)this, ppv);
- } else if (riid == __uuidof(IMFVideoPresenter)) {
- hr = GetInterface((IMFVideoPresenter*)this, ppv);
- } else if (riid == __uuidof(IMFTopologyServiceLookupClient)) {
- hr = GetInterface((IMFTopologyServiceLookupClient*)this, ppv);
- } else if (riid == __uuidof(IMFVideoDeviceID)) {
- hr = GetInterface((IMFVideoDeviceID*)this, ppv);
- } else if (riid == __uuidof(IMFGetService)) {
- hr = GetInterface((IMFGetService*)this, ppv);
- } else if (riid == __uuidof(IMFAsyncCallback)) {
- hr = GetInterface((IMFAsyncCallback*)this, ppv);
- } else if (riid == __uuidof(IMFVideoDisplayControl)) {
- hr = GetInterface((IMFVideoDisplayControl*)this, ppv);
- } else if (riid == __uuidof(IEVRTrustedVideoPlugin)) {
- hr = GetInterface((IEVRTrustedVideoPlugin*)this, ppv);
- } else if (riid == IID_IQualProp) {
- hr = GetInterface((IQualProp*)this, ppv);
- } else if (riid == __uuidof(IMFRateSupport)) {
- hr = GetInterface((IMFRateSupport*)this, ppv);
- } else if (riid == __uuidof(IDirect3DDeviceManager9)) {
- hr = m_pD3DManager->QueryInterface (__uuidof(IDirect3DDeviceManager9), (void**) ppv);
- } else if (riid == __uuidof(ISyncClockAdviser)) {
- hr = GetInterface((ISyncClockAdviser*)this, ppv);
- } else {
- hr = __super::NonDelegatingQueryInterface(riid, ppv);
- }
-
- return hr;
+ HRESULT hr;
+ if (riid == __uuidof(IMFClockStateSink)) {
+ hr = GetInterface((IMFClockStateSink*)this, ppv);
+ } else if (riid == __uuidof(IMFVideoPresenter)) {
+ hr = GetInterface((IMFVideoPresenter*)this, ppv);
+ } else if (riid == __uuidof(IMFTopologyServiceLookupClient)) {
+ hr = GetInterface((IMFTopologyServiceLookupClient*)this, ppv);
+ } else if (riid == __uuidof(IMFVideoDeviceID)) {
+ hr = GetInterface((IMFVideoDeviceID*)this, ppv);
+ } else if (riid == __uuidof(IMFGetService)) {
+ hr = GetInterface((IMFGetService*)this, ppv);
+ } else if (riid == __uuidof(IMFAsyncCallback)) {
+ hr = GetInterface((IMFAsyncCallback*)this, ppv);
+ } else if (riid == __uuidof(IMFVideoDisplayControl)) {
+ hr = GetInterface((IMFVideoDisplayControl*)this, ppv);
+ } else if (riid == __uuidof(IEVRTrustedVideoPlugin)) {
+ hr = GetInterface((IEVRTrustedVideoPlugin*)this, ppv);
+ } else if (riid == IID_IQualProp) {
+ hr = GetInterface((IQualProp*)this, ppv);
+ } else if (riid == __uuidof(IMFRateSupport)) {
+ hr = GetInterface((IMFRateSupport*)this, ppv);
+ } else if (riid == __uuidof(IDirect3DDeviceManager9)) {
+ hr = m_pD3DManager->QueryInterface(__uuidof(IDirect3DDeviceManager9), (void**) ppv);
+ } else if (riid == __uuidof(ISyncClockAdviser)) {
+ hr = GetInterface((ISyncClockAdviser*)this, ppv);
+ } else {
+ hr = __super::NonDelegatingQueryInterface(riid, ppv);
+ }
+
+ return hr;
}
// IMFClockStateSink
STDMETHODIMP CSyncAP::OnClockStart(MFTIME hnsSystemTime, LONGLONG llClockStartOffset)
{
- m_nRenderState = Started;
- return S_OK;
+ m_nRenderState = Started;
+ return S_OK;
}
STDMETHODIMP CSyncAP::OnClockStop(MFTIME hnsSystemTime)
{
- m_nRenderState = Stopped;
- return S_OK;
+ m_nRenderState = Stopped;
+ return S_OK;
}
STDMETHODIMP CSyncAP::OnClockPause(MFTIME hnsSystemTime)
{
- m_nRenderState = Paused;
- return S_OK;
+ m_nRenderState = Paused;
+ return S_OK;
}
STDMETHODIMP CSyncAP::OnClockRestart(MFTIME hnsSystemTime)
{
- m_nRenderState = Started;
- return S_OK;
+ m_nRenderState = Started;
+ return S_OK;
}
STDMETHODIMP CSyncAP::OnClockSetRate(MFTIME hnsSystemTime, float flRate)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// IBaseFilter delegate
-bool CSyncAP::GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *State, HRESULT &_ReturnValue)
-{
- CAutoLock lock(&m_SampleQueueLock);
- switch (m_nRenderState) {
- case Started:
- *State = State_Running;
- break;
- case Paused:
- *State = State_Paused;
- break;
- case Stopped:
- *State = State_Stopped;
- break;
- default:
- *State = State_Stopped;
- _ReturnValue = E_FAIL;
- }
- _ReturnValue = S_OK;
- return true;
+bool CSyncAP::GetState(DWORD dwMilliSecsTimeout, FILTER_STATE* State, HRESULT& _ReturnValue)
+{
+ CAutoLock lock(&m_SampleQueueLock);
+ switch (m_nRenderState) {
+ case Started:
+ *State = State_Running;
+ break;
+ case Paused:
+ *State = State_Paused;
+ break;
+ case Stopped:
+ *State = State_Stopped;
+ break;
+ default:
+ *State = State_Stopped;
+ _ReturnValue = E_FAIL;
+ }
+ _ReturnValue = S_OK;
+ return true;
}
// IQualProp
-STDMETHODIMP CSyncAP::get_FramesDroppedInRenderer(int *pcFrames)
+STDMETHODIMP CSyncAP::get_FramesDroppedInRenderer(int* pcFrames)
{
- *pcFrames = m_pcFramesDropped;
- return S_OK;
+ *pcFrames = m_pcFramesDropped;
+ return S_OK;
}
-STDMETHODIMP CSyncAP::get_FramesDrawn(int *pcFramesDrawn)
+STDMETHODIMP CSyncAP::get_FramesDrawn(int* pcFramesDrawn)
{
- *pcFramesDrawn = m_pcFramesDrawn;
- return S_OK;
+ *pcFramesDrawn = m_pcFramesDrawn;
+ return S_OK;
}
-STDMETHODIMP CSyncAP::get_AvgFrameRate(int *piAvgFrameRate)
+STDMETHODIMP CSyncAP::get_AvgFrameRate(int* piAvgFrameRate)
{
- *piAvgFrameRate = (int)(m_fAvrFps * 100);
- return S_OK;
+ *piAvgFrameRate = (int)(m_fAvrFps * 100);
+ return S_OK;
}
-STDMETHODIMP CSyncAP::get_Jitter(int *iJitter)
+STDMETHODIMP CSyncAP::get_Jitter(int* iJitter)
{
- *iJitter = (int)((m_fJitterStdDev/10000.0) + 0.5);
- return S_OK;
+ *iJitter = (int)((m_fJitterStdDev / 10000.0) + 0.5);
+ return S_OK;
}
-STDMETHODIMP CSyncAP::get_AvgSyncOffset(int *piAvg)
+STDMETHODIMP CSyncAP::get_AvgSyncOffset(int* piAvg)
{
- *piAvg = (int)((m_fSyncOffsetAvr/10000.0) + 0.5);
- return S_OK;
+ *piAvg = (int)((m_fSyncOffsetAvr / 10000.0) + 0.5);
+ return S_OK;
}
-STDMETHODIMP CSyncAP::get_DevSyncOffset(int *piDev)
+STDMETHODIMP CSyncAP::get_DevSyncOffset(int* piDev)
{
- *piDev = (int)((m_fSyncOffsetStdDev/10000.0) + 0.5);
- return S_OK;
+ *piDev = (int)((m_fSyncOffsetStdDev / 10000.0) + 0.5);
+ return S_OK;
}
// IMFRateSupport
-STDMETHODIMP CSyncAP::GetSlowestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float *pflRate)
+STDMETHODIMP CSyncAP::GetSlowestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float* pflRate)
{
- *pflRate = 0;
- return S_OK;
+ *pflRate = 0;
+ return S_OK;
}
-STDMETHODIMP CSyncAP::GetFastestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float *pflRate)
+STDMETHODIMP CSyncAP::GetFastestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float* pflRate)
{
- HRESULT hr = S_OK;
- float fMaxRate = 0.0f;
+ HRESULT hr = S_OK;
+ float fMaxRate = 0.0f;
- CAutoLock lock(this);
+ CAutoLock lock(this);
- CheckPointer(pflRate, E_POINTER);
- CheckHR(CheckShutdown());
+ CheckPointer(pflRate, E_POINTER);
+ CheckHR(CheckShutdown());
- // Get the maximum forward rate.
- fMaxRate = GetMaxRate(fThin);
+ // Get the maximum forward rate.
+ fMaxRate = GetMaxRate(fThin);
- // For reverse playback, swap the sign.
- if (eDirection == MFRATE_REVERSE) {
- fMaxRate = -fMaxRate;
- }
+ // For reverse playback, swap the sign.
+ if (eDirection == MFRATE_REVERSE) {
+ fMaxRate = -fMaxRate;
+ }
- *pflRate = fMaxRate;
- return hr;
+ *pflRate = fMaxRate;
+ return hr;
}
-STDMETHODIMP CSyncAP::IsRateSupported(BOOL fThin, float flRate, float *pflNearestSupportedRate)
+STDMETHODIMP CSyncAP::IsRateSupported(BOOL fThin, float flRate, float* pflNearestSupportedRate)
{
- // fRate can be negative for reverse playback.
- // pfNearestSupportedRate can be NULL.
- CAutoLock lock(this);
- HRESULT hr = S_OK;
- float fMaxRate = 0.0f;
- float fNearestRate = flRate; // Default.
+ // fRate can be negative for reverse playback.
+ // pfNearestSupportedRate can be NULL.
+ CAutoLock lock(this);
+ HRESULT hr = S_OK;
+ float fMaxRate = 0.0f;
+ float fNearestRate = flRate; // Default.
- CheckPointer (pflNearestSupportedRate, E_POINTER);
- CheckHR(hr = CheckShutdown());
+ CheckPointer(pflNearestSupportedRate, E_POINTER);
+ CheckHR(hr = CheckShutdown());
- // Find the maximum forward rate.
- fMaxRate = GetMaxRate(fThin);
+ // Find the maximum forward rate.
+ fMaxRate = GetMaxRate(fThin);
- if (fabsf(flRate) > fMaxRate) {
- // The (absolute) requested rate exceeds the maximum rate.
- hr = MF_E_UNSUPPORTED_RATE;
+ if (fabsf(flRate) > fMaxRate) {
+ // The (absolute) requested rate exceeds the maximum rate.
+ hr = MF_E_UNSUPPORTED_RATE;
- // The nearest supported rate is fMaxRate.
- fNearestRate = fMaxRate;
- if (flRate < 0) {
- // For reverse playback, swap the sign.
- fNearestRate = -fNearestRate;
- }
- }
- // Return the nearest supported rate if the caller requested it.
- if (pflNearestSupportedRate != NULL) {
- *pflNearestSupportedRate = fNearestRate;
- }
- return hr;
+ // The nearest supported rate is fMaxRate.
+ fNearestRate = fMaxRate;
+ if (flRate < 0) {
+ // For reverse playback, swap the sign.
+ fNearestRate = -fNearestRate;
+ }
+ }
+ // Return the nearest supported rate if the caller requested it.
+ if (pflNearestSupportedRate != NULL) {
+ *pflNearestSupportedRate = fNearestRate;
+ }
+ return hr;
}
float CSyncAP::GetMaxRate(BOOL bThin)
{
- float fMaxRate = FLT_MAX; // Default.
- UINT32 fpsNumerator = 0, fpsDenominator = 0;
- UINT MonitorRateHz = 0;
+ float fMaxRate = FLT_MAX; // Default.
+ UINT32 fpsNumerator = 0, fpsDenominator = 0;
+ UINT MonitorRateHz = 0;
- if (!bThin && (m_pMediaType != NULL)) {
- // Non-thinned: Use the frame rate and monitor refresh rate.
+ if (!bThin && (m_pMediaType != NULL)) {
+ // Non-thinned: Use the frame rate and monitor refresh rate.
- // Frame rate:
- MFGetAttributeRatio(m_pMediaType, MF_MT_FRAME_RATE,
- &fpsNumerator, &fpsDenominator);
+ // Frame rate:
+ MFGetAttributeRatio(m_pMediaType, MF_MT_FRAME_RATE,
+ &fpsNumerator, &fpsDenominator);
- // Monitor refresh rate:
- MonitorRateHz = m_uD3DRefreshRate; // D3DDISPLAYMODE
+ // Monitor refresh rate:
+ MonitorRateHz = m_uD3DRefreshRate; // D3DDISPLAYMODE
- if (fpsDenominator && fpsNumerator && MonitorRateHz) {
- // Max Rate = Refresh Rate / Frame Rate
- fMaxRate = (float)MulDiv(MonitorRateHz, fpsDenominator, fpsNumerator);
- }
- }
- return fMaxRate;
+ if (fpsDenominator && fpsNumerator && MonitorRateHz) {
+ // Max Rate = Refresh Rate / Frame Rate
+ fMaxRate = (float)MulDiv(MonitorRateHz, fpsDenominator, fpsNumerator);
+ }
+ }
+ return fMaxRate;
}
void CSyncAP::CompleteFrameStep(bool bCancel)
{
- if (m_nStepCount > 0) {
- if (bCancel || (m_nStepCount == 1)) {
- m_pSink->Notify(EC_STEP_COMPLETE, bCancel ? TRUE : FALSE, 0);
- m_nStepCount = 0;
- } else {
- m_nStepCount--;
- }
- }
+ if (m_nStepCount > 0) {
+ if (bCancel || (m_nStepCount == 1)) {
+ m_pSink->Notify(EC_STEP_COMPLETE, bCancel ? TRUE : FALSE, 0);
+ m_nStepCount = 0;
+ } else {
+ m_nStepCount--;
+ }
+ }
}
// IMFVideoPresenter
STDMETHODIMP CSyncAP::ProcessMessage(MFVP_MESSAGE_TYPE eMessage, ULONG_PTR ulParam)
{
- HRESULT hr = S_OK;
-
- switch (eMessage) {
- case MFVP_MESSAGE_BEGINSTREAMING:
- hr = BeginStreaming();
- m_llHysteresis = 0;
- m_lShiftToNearest = 0;
- m_bStepping = false;
- break;
-
- case MFVP_MESSAGE_CANCELSTEP:
- m_bStepping = false;
- CompleteFrameStep(true);
- break;
-
- case MFVP_MESSAGE_ENDOFSTREAM:
- m_bPendingMediaFinished = true;
- break;
-
- case MFVP_MESSAGE_ENDSTREAMING:
- m_pGenlock->ResetTiming();
- m_pRefClock = NULL;
- break;
-
- case MFVP_MESSAGE_FLUSH:
- SetEvent(m_hEvtFlush);
- m_bEvtFlush = true;
- while (WaitForSingleObject(m_hEvtFlush, 1) == WAIT_OBJECT_0) {
- ;
- }
- break;
-
- case MFVP_MESSAGE_INVALIDATEMEDIATYPE:
- m_bPendingRenegotiate = true;
- while (*((volatile bool *)&m_bPendingRenegotiate)) {
- Sleep(1);
- }
- break;
-
- case MFVP_MESSAGE_PROCESSINPUTNOTIFY:
- break;
-
- case MFVP_MESSAGE_STEP:
- m_nStepCount = (int)ulParam;
- m_bStepping = true;
- break;
-
- default :
- ASSERT(FALSE);
- break;
- }
- return hr;
+ HRESULT hr = S_OK;
+
+ switch (eMessage) {
+ case MFVP_MESSAGE_BEGINSTREAMING:
+ hr = BeginStreaming();
+ m_llHysteresis = 0;
+ m_lShiftToNearest = 0;
+ m_bStepping = false;
+ break;
+
+ case MFVP_MESSAGE_CANCELSTEP:
+ m_bStepping = false;
+ CompleteFrameStep(true);
+ break;
+
+ case MFVP_MESSAGE_ENDOFSTREAM:
+ m_bPendingMediaFinished = true;
+ break;
+
+ case MFVP_MESSAGE_ENDSTREAMING:
+ m_pGenlock->ResetTiming();
+ m_pRefClock = NULL;
+ break;
+
+ case MFVP_MESSAGE_FLUSH:
+ SetEvent(m_hEvtFlush);
+ m_bEvtFlush = true;
+ while (WaitForSingleObject(m_hEvtFlush, 1) == WAIT_OBJECT_0) {
+ ;
+ }
+ break;
+
+ case MFVP_MESSAGE_INVALIDATEMEDIATYPE:
+ m_bPendingRenegotiate = true;
+ while (*((volatile bool*)&m_bPendingRenegotiate)) {
+ Sleep(1);
+ }
+ break;
+
+ case MFVP_MESSAGE_PROCESSINPUTNOTIFY:
+ break;
+
+ case MFVP_MESSAGE_STEP:
+ m_nStepCount = (int)ulParam;
+ m_bStepping = true;
+ break;
+
+ default :
+ ASSERT(FALSE);
+ break;
+ }
+ return hr;
}
HRESULT CSyncAP::IsMediaTypeSupported(IMFMediaType* pMixerType)
{
- HRESULT hr;
- AM_MEDIA_TYPE* pAMMedia;
- UINT nInterlaceMode;
+ HRESULT hr;
+ AM_MEDIA_TYPE* pAMMedia;
+ UINT nInterlaceMode;
- CheckHR (pMixerType->GetRepresentation(FORMAT_VideoInfo2, (void**)&pAMMedia));
- CheckHR (pMixerType->GetUINT32 (MF_MT_INTERLACE_MODE, &nInterlaceMode));
+ CheckHR(pMixerType->GetRepresentation(FORMAT_VideoInfo2, (void**)&pAMMedia));
+ CheckHR(pMixerType->GetUINT32(MF_MT_INTERLACE_MODE, &nInterlaceMode));
- if ( (pAMMedia->majortype != MEDIATYPE_Video)) {
- hr = MF_E_INVALIDMEDIATYPE;
- }
- pMixerType->FreeRepresentation(FORMAT_VideoInfo2, (void*)pAMMedia);
- return hr;
+ if ((pAMMedia->majortype != MEDIATYPE_Video)) {
+ hr = MF_E_INVALIDMEDIATYPE;
+ }
+ pMixerType->FreeRepresentation(FORMAT_VideoInfo2, (void*)pAMMedia);
+ return hr;
}
HRESULT CSyncAP::CreateProposedOutputType(IMFMediaType* pMixerType, IMFMediaType** pType)
{
- HRESULT hr;
- AM_MEDIA_TYPE *pAMMedia = NULL;
- LARGE_INTEGER i64Size;
- MFVIDEOFORMAT *VideoFormat;
-
- CheckHR(pMixerType->GetRepresentation(FORMAT_MFVideoFormat, (void**)&pAMMedia));
-
- VideoFormat = (MFVIDEOFORMAT*)pAMMedia->pbFormat;
- hr = pfMFCreateVideoMediaType(VideoFormat, &m_pMediaType);
-
- m_AspectRatio.cx = VideoFormat->videoInfo.PixelAspectRatio.Numerator;
- m_AspectRatio.cy = VideoFormat->videoInfo.PixelAspectRatio.Denominator;
-
- if (SUCCEEDED (hr)) {
- i64Size.HighPart = VideoFormat->videoInfo.dwWidth;
- i64Size.LowPart = VideoFormat->videoInfo.dwHeight;
- m_pMediaType->SetUINT64(MF_MT_FRAME_SIZE, i64Size.QuadPart);
- m_pMediaType->SetUINT32(MF_MT_PAN_SCAN_ENABLED, 0);
- CRenderersSettings& s = GetRenderersSettings();
-
- if (s.m_RenderSettings.iEVROutputRange == 1) {
- m_pMediaType->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_16_235);
- } else {
- m_pMediaType->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_0_255);
- }
-
- m_LastSetOutputRange = s.m_RenderSettings.iEVROutputRange;
- i64Size.HighPart = m_AspectRatio.cx;
- i64Size.LowPart = m_AspectRatio.cy;
- m_pMediaType->SetUINT64(MF_MT_PIXEL_ASPECT_RATIO, i64Size.QuadPart);
-
- MFVideoArea Area = GetArea(0, 0, VideoFormat->videoInfo.dwWidth, VideoFormat->videoInfo.dwHeight);
- m_pMediaType->SetBlob(MF_MT_GEOMETRIC_APERTURE, (UINT8*)&Area, sizeof(MFVideoArea));
- }
-
- m_AspectRatio.cx *= VideoFormat->videoInfo.dwWidth;
- m_AspectRatio.cy *= VideoFormat->videoInfo.dwHeight;
-
- bool bDoneSomething = true;
-
- if (m_AspectRatio.cx >= 1 && m_AspectRatio.cy >= 1) {
- while (bDoneSomething) {
- bDoneSomething = false;
- INT MinNum = min(m_AspectRatio.cx, m_AspectRatio.cy);
- INT i;
- for (i = 2; i < MinNum+1; ++i) {
- if (m_AspectRatio.cx%i == 0 && m_AspectRatio.cy%i ==0) {
- break;
- }
- }
- if (i != MinNum + 1) {
- m_AspectRatio.cx = m_AspectRatio.cx / i;
- m_AspectRatio.cy = m_AspectRatio.cy / i;
- bDoneSomething = true;
- }
- }
- }
-
- pMixerType->FreeRepresentation(FORMAT_MFVideoFormat, (void*)pAMMedia);
- m_pMediaType->QueryInterface(__uuidof(IMFMediaType), (void**) pType);
-
- return hr;
+ HRESULT hr;
+ AM_MEDIA_TYPE* pAMMedia = NULL;
+ LARGE_INTEGER i64Size;
+ MFVIDEOFORMAT* VideoFormat;
+
+ CheckHR(pMixerType->GetRepresentation(FORMAT_MFVideoFormat, (void**)&pAMMedia));
+
+ VideoFormat = (MFVIDEOFORMAT*)pAMMedia->pbFormat;
+ hr = pfMFCreateVideoMediaType(VideoFormat, &m_pMediaType);
+
+ m_AspectRatio.cx = VideoFormat->videoInfo.PixelAspectRatio.Numerator;
+ m_AspectRatio.cy = VideoFormat->videoInfo.PixelAspectRatio.Denominator;
+
+ if (SUCCEEDED(hr)) {
+ i64Size.HighPart = VideoFormat->videoInfo.dwWidth;
+ i64Size.LowPart = VideoFormat->videoInfo.dwHeight;
+ m_pMediaType->SetUINT64(MF_MT_FRAME_SIZE, i64Size.QuadPart);
+ m_pMediaType->SetUINT32(MF_MT_PAN_SCAN_ENABLED, 0);
+ CRenderersSettings& s = GetRenderersSettings();
+
+ if (s.m_RenderSettings.iEVROutputRange == 1) {
+ m_pMediaType->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_16_235);
+ } else {
+ m_pMediaType->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_0_255);
+ }
+
+ m_LastSetOutputRange = s.m_RenderSettings.iEVROutputRange;
+ i64Size.HighPart = m_AspectRatio.cx;
+ i64Size.LowPart = m_AspectRatio.cy;
+ m_pMediaType->SetUINT64(MF_MT_PIXEL_ASPECT_RATIO, i64Size.QuadPart);
+
+ MFVideoArea Area = GetArea(0, 0, VideoFormat->videoInfo.dwWidth, VideoFormat->videoInfo.dwHeight);
+ m_pMediaType->SetBlob(MF_MT_GEOMETRIC_APERTURE, (UINT8*)&Area, sizeof(MFVideoArea));
+ }
+
+ m_AspectRatio.cx *= VideoFormat->videoInfo.dwWidth;
+ m_AspectRatio.cy *= VideoFormat->videoInfo.dwHeight;
+
+ bool bDoneSomething = true;
+
+ if (m_AspectRatio.cx >= 1 && m_AspectRatio.cy >= 1) {
+ while (bDoneSomething) {
+ bDoneSomething = false;
+ INT MinNum = min(m_AspectRatio.cx, m_AspectRatio.cy);
+ INT i;
+ for (i = 2; i < MinNum + 1; ++i) {
+ if (m_AspectRatio.cx % i == 0 && m_AspectRatio.cy % i == 0) {
+ break;
+ }
+ }
+ if (i != MinNum + 1) {
+ m_AspectRatio.cx = m_AspectRatio.cx / i;
+ m_AspectRatio.cy = m_AspectRatio.cy / i;
+ bDoneSomething = true;
+ }
+ }
+ }
+
+ pMixerType->FreeRepresentation(FORMAT_MFVideoFormat, (void*)pAMMedia);
+ m_pMediaType->QueryInterface(__uuidof(IMFMediaType), (void**) pType);
+
+ return hr;
}
HRESULT CSyncAP::SetMediaType(IMFMediaType* pType)
{
- HRESULT hr;
- AM_MEDIA_TYPE* pAMMedia = NULL;
- CString strTemp;
+ HRESULT hr;
+ AM_MEDIA_TYPE* pAMMedia = NULL;
+ CString strTemp;
- CheckPointer(pType, E_POINTER);
- CheckHR(pType->GetRepresentation(FORMAT_VideoInfo2, (void**)&pAMMedia));
+ CheckPointer(pType, E_POINTER);
+ CheckHR(pType->GetRepresentation(FORMAT_VideoInfo2, (void**)&pAMMedia));
- hr = InitializeDevice(pAMMedia);
- if (SUCCEEDED(hr)) {
- strTemp = GetMediaTypeName(pAMMedia->subtype);
- strTemp.Replace(L"MEDIASUBTYPE_", L"");
- m_strStatsMsg[MSG_MIXEROUT].Format (L"Mixer output : %s", strTemp);
- }
+ hr = InitializeDevice(pAMMedia);
+ if (SUCCEEDED(hr)) {
+ strTemp = GetMediaTypeName(pAMMedia->subtype);
+ strTemp.Replace(L"MEDIASUBTYPE_", L"");
+ m_strStatsMsg[MSG_MIXEROUT].Format(L"Mixer output : %s", strTemp);
+ }
- pType->FreeRepresentation(FORMAT_VideoInfo2, (void*)pAMMedia);
+ pType->FreeRepresentation(FORMAT_VideoInfo2, (void*)pAMMedia);
- return hr;
+ return hr;
}
typedef struct {
- const int Format;
- const LPCTSTR Description;
+ const int Format;
+ const LPCTSTR Description;
} D3DFORMAT_TYPE;
-LONGLONG CSyncAP::GetMediaTypeMerit(IMFMediaType *pMediaType)
-{
- AM_MEDIA_TYPE *pAMMedia = NULL;
- MFVIDEOFORMAT *VideoFormat;
-
- HRESULT hr;
- CheckHR(pMediaType->GetRepresentation (FORMAT_MFVideoFormat, (void**)&pAMMedia));
- VideoFormat = (MFVIDEOFORMAT*)pAMMedia->pbFormat;
-
- LONGLONG Merit = 0;
- switch (VideoFormat->surfaceInfo.Format) {
- case FCC('NV12'):
- Merit = 90000000;
- break;
- case FCC('YV12'):
- Merit = 80000000;
- break;
- case FCC('YUY2'):
- Merit = 70000000;
- break;
- case FCC('UYVY'):
- Merit = 60000000;
- break;
-
- case D3DFMT_X8R8G8B8: // Never opt for RGB
- case D3DFMT_A8R8G8B8:
- case D3DFMT_R8G8B8:
- case D3DFMT_R5G6B5:
- Merit = 0;
- break;
- default:
- Merit = 1000;
- break;
- }
- pMediaType->FreeRepresentation(FORMAT_MFVideoFormat, (void*)pAMMedia);
- return Merit;
+LONGLONG CSyncAP::GetMediaTypeMerit(IMFMediaType* pMediaType)
+{
+ AM_MEDIA_TYPE* pAMMedia = NULL;
+ MFVIDEOFORMAT* VideoFormat;
+
+ HRESULT hr;
+ CheckHR(pMediaType->GetRepresentation(FORMAT_MFVideoFormat, (void**)&pAMMedia));
+ VideoFormat = (MFVIDEOFORMAT*)pAMMedia->pbFormat;
+
+ LONGLONG Merit = 0;
+ switch (VideoFormat->surfaceInfo.Format) {
+ case FCC('NV12'):
+ Merit = 90000000;
+ break;
+ case FCC('YV12'):
+ Merit = 80000000;
+ break;
+ case FCC('YUY2'):
+ Merit = 70000000;
+ break;
+ case FCC('UYVY'):
+ Merit = 60000000;
+ break;
+
+ case D3DFMT_X8R8G8B8: // Never opt for RGB
+ case D3DFMT_A8R8G8B8:
+ case D3DFMT_R8G8B8:
+ case D3DFMT_R5G6B5:
+ Merit = 0;
+ break;
+ default:
+ Merit = 1000;
+ break;
+ }
+ pMediaType->FreeRepresentation(FORMAT_MFVideoFormat, (void*)pAMMedia);
+ return Merit;
}
HRESULT CSyncAP::RenegotiateMediaType()
{
- HRESULT hr = S_OK;
-
- CComPtr<IMFMediaType> pMixerType;
- CComPtr<IMFMediaType> pType;
-
- if (!m_pMixer) {
- return MF_E_INVALIDREQUEST;
- }
-
- CInterfaceArray<IMFMediaType> ValidMixerTypes;
- // Loop through all of the mixer's proposed output types.
- DWORD iTypeIndex = 0;
- while ((hr != MF_E_NO_MORE_TYPES)) {
- pMixerType = NULL;
- pType = NULL;
- m_pMediaType = NULL;
-
- // Step 1. Get the next media type supported by mixer.
- hr = m_pMixer->GetOutputAvailableType(0, iTypeIndex++, &pMixerType);
- if (FAILED(hr)) {
- break;
- }
- // Step 2. Check if we support this media type.
- if (SUCCEEDED(hr)) {
- hr = IsMediaTypeSupported(pMixerType);
- }
- if (SUCCEEDED(hr)) {
- hr = CreateProposedOutputType(pMixerType, &pType);
- }
- // Step 4. Check if the mixer will accept this media type.
- if (SUCCEEDED(hr)) {
- hr = m_pMixer->SetOutputType(0, pType, MFT_SET_TYPE_TEST_ONLY);
- }
- if (SUCCEEDED(hr)) {
- LONGLONG Merit = GetMediaTypeMerit(pType);
-
- size_t nTypes = ValidMixerTypes.GetCount();
- size_t iInsertPos = 0;
- for (size_t i = 0; i < nTypes; ++i) {
- LONGLONG ThisMerit = GetMediaTypeMerit(ValidMixerTypes[i]);
- if (Merit > ThisMerit) {
- iInsertPos = i;
- break;
- } else {
- iInsertPos = i+1;
- }
- }
- ValidMixerTypes.InsertAt(iInsertPos, pType);
- }
- }
-
- size_t nValidTypes = ValidMixerTypes.GetCount();
- for (size_t i = 0; i < nValidTypes; ++i) {
- pType = ValidMixerTypes[i];
- }
-
- for (size_t i = 0; i < nValidTypes; ++i) {
- pType = ValidMixerTypes[i];
- hr = SetMediaType(pType);
- if (SUCCEEDED(hr)) {
- hr = m_pMixer->SetOutputType(0, pType, 0);
- // If something went wrong, clear the media type.
- if (FAILED(hr)) {
- SetMediaType(NULL);
- } else {
- break;
- }
- }
- }
-
- pMixerType = NULL;
- pType = NULL;
- return hr;
+ HRESULT hr = S_OK;
+
+ CComPtr<IMFMediaType> pMixerType;
+ CComPtr<IMFMediaType> pType;
+
+ if (!m_pMixer) {
+ return MF_E_INVALIDREQUEST;
+ }
+
+ CInterfaceArray<IMFMediaType> ValidMixerTypes;
+ // Loop through all of the mixer's proposed output types.
+ DWORD iTypeIndex = 0;
+ while ((hr != MF_E_NO_MORE_TYPES)) {
+ pMixerType = NULL;
+ pType = NULL;
+ m_pMediaType = NULL;
+
+ // Step 1. Get the next media type supported by mixer.
+ hr = m_pMixer->GetOutputAvailableType(0, iTypeIndex++, &pMixerType);
+ if (FAILED(hr)) {
+ break;
+ }
+ // Step 2. Check if we support this media type.
+ if (SUCCEEDED(hr)) {
+ hr = IsMediaTypeSupported(pMixerType);
+ }
+ if (SUCCEEDED(hr)) {
+ hr = CreateProposedOutputType(pMixerType, &pType);
+ }
+ // Step 4. Check if the mixer will accept this media type.
+ if (SUCCEEDED(hr)) {
+ hr = m_pMixer->SetOutputType(0, pType, MFT_SET_TYPE_TEST_ONLY);
+ }
+ if (SUCCEEDED(hr)) {
+ LONGLONG Merit = GetMediaTypeMerit(pType);
+
+ size_t nTypes = ValidMixerTypes.GetCount();
+ size_t iInsertPos = 0;
+ for (size_t i = 0; i < nTypes; ++i) {
+ LONGLONG ThisMerit = GetMediaTypeMerit(ValidMixerTypes[i]);
+ if (Merit > ThisMerit) {
+ iInsertPos = i;
+ break;
+ } else {
+ iInsertPos = i + 1;
+ }
+ }
+ ValidMixerTypes.InsertAt(iInsertPos, pType);
+ }
+ }
+
+ size_t nValidTypes = ValidMixerTypes.GetCount();
+ for (size_t i = 0; i < nValidTypes; ++i) {
+ pType = ValidMixerTypes[i];
+ }
+
+ for (size_t i = 0; i < nValidTypes; ++i) {
+ pType = ValidMixerTypes[i];
+ hr = SetMediaType(pType);
+ if (SUCCEEDED(hr)) {
+ hr = m_pMixer->SetOutputType(0, pType, 0);
+ // If something went wrong, clear the media type.
+ if (FAILED(hr)) {
+ SetMediaType(NULL);
+ } else {
+ break;
+ }
+ }
+ }
+
+ pMixerType = NULL;
+ pType = NULL;
+ return hr;
}
bool CSyncAP::GetSampleFromMixer()
{
- MFT_OUTPUT_DATA_BUFFER Buffer;
- HRESULT hr = S_OK;
- DWORD dwStatus;
- LONGLONG llClockBefore = 0;
- LONGLONG llClockAfter = 0;
- LONGLONG llMixerLatency;
-
- UINT dwSurface;
- bool newSample = false;
-
- while (SUCCEEDED(hr)) { // Get as many frames as there are and that we have samples for
- CComPtr<IMFSample> pSample;
- CComPtr<IMFSample> pNewSample;
- if (FAILED(GetFreeSample(&pSample))) { // All samples are taken for the moment. Better luck next time
- break;
- }
-
- memset(&Buffer, 0, sizeof(Buffer));
- Buffer.pSample = pSample;
- pSample->GetUINT32(GUID_SURFACE_INDEX, &dwSurface);
- {
- llClockBefore = GetRenderersData()->GetPerfCounter();
- hr = m_pMixer->ProcessOutput(0 , 1, &Buffer, &dwStatus);
- llClockAfter = GetRenderersData()->GetPerfCounter();
- }
-
- if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) { // There are no samples left in the mixer
- MoveToFreeList(pSample, false);
- break;
- }
- if (m_pSink) {
- llMixerLatency = llClockAfter - llClockBefore;
- m_pSink->Notify (EC_PROCESSING_LATENCY, (LONG_PTR)&llMixerLatency, 0);
- }
-
- newSample = true;
-
- if (GetRenderersData()->m_fTearingTest) {
- RECT rcTearing;
-
- rcTearing.left = m_nTearingPos;
- rcTearing.top = 0;
- rcTearing.right = rcTearing.left + 4;
- rcTearing.bottom = m_NativeVideoSize.cy;
- m_pD3DDev->ColorFill(m_pVideoSurface[dwSurface], &rcTearing, D3DCOLOR_ARGB (255,255,0,0));
-
- rcTearing.left = (rcTearing.right + 15) % m_NativeVideoSize.cx;
- rcTearing.right = rcTearing.left + 4;
- m_pD3DDev->ColorFill(m_pVideoSurface[dwSurface], &rcTearing, D3DCOLOR_ARGB (255,255,0,0));
- m_nTearingPos = (m_nTearingPos + 7) % m_NativeVideoSize.cx;
- }
- MoveToScheduledList(pSample, false); // Schedule, then go back to see if there is more where that came from
- }
- return newSample;
-}
-
-STDMETHODIMP CSyncAP::GetCurrentMediaType(__deref_out IMFVideoMediaType **ppMediaType)
-{
- HRESULT hr = S_OK;
- CAutoLock lock(this);
- CheckPointer(ppMediaType, E_POINTER);
- CheckHR(CheckShutdown());
-
- if (m_pMediaType == NULL) {
- CheckHR(MF_E_NOT_INITIALIZED);
- }
-
- CheckHR(m_pMediaType->QueryInterface(__uuidof(IMFVideoMediaType), (void**)&ppMediaType));
- return hr;
+ MFT_OUTPUT_DATA_BUFFER Buffer;
+ HRESULT hr = S_OK;
+ DWORD dwStatus;
+ LONGLONG llClockBefore = 0;
+ LONGLONG llClockAfter = 0;
+ LONGLONG llMixerLatency;
+
+ UINT dwSurface;
+ bool newSample = false;
+
+ while (SUCCEEDED(hr)) { // Get as many frames as there are and that we have samples for
+ CComPtr<IMFSample> pSample;
+ CComPtr<IMFSample> pNewSample;
+ if (FAILED(GetFreeSample(&pSample))) { // All samples are taken for the moment. Better luck next time
+ break;
+ }
+
+ memset(&Buffer, 0, sizeof(Buffer));
+ Buffer.pSample = pSample;
+ pSample->GetUINT32(GUID_SURFACE_INDEX, &dwSurface);
+ {
+ llClockBefore = GetRenderersData()->GetPerfCounter();
+ hr = m_pMixer->ProcessOutput(0 , 1, &Buffer, &dwStatus);
+ llClockAfter = GetRenderersData()->GetPerfCounter();
+ }
+
+ if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) { // There are no samples left in the mixer
+ MoveToFreeList(pSample, false);
+ break;
+ }
+ if (m_pSink) {
+ llMixerLatency = llClockAfter - llClockBefore;
+ m_pSink->Notify(EC_PROCESSING_LATENCY, (LONG_PTR)&llMixerLatency, 0);
+ }
+
+ newSample = true;
+
+ if (GetRenderersData()->m_fTearingTest) {
+ RECT rcTearing;
+
+ rcTearing.left = m_nTearingPos;
+ rcTearing.top = 0;
+ rcTearing.right = rcTearing.left + 4;
+ rcTearing.bottom = m_NativeVideoSize.cy;
+ m_pD3DDev->ColorFill(m_pVideoSurface[dwSurface], &rcTearing, D3DCOLOR_ARGB(255, 255, 0, 0));
+
+ rcTearing.left = (rcTearing.right + 15) % m_NativeVideoSize.cx;
+ rcTearing.right = rcTearing.left + 4;
+ m_pD3DDev->ColorFill(m_pVideoSurface[dwSurface], &rcTearing, D3DCOLOR_ARGB(255, 255, 0, 0));
+ m_nTearingPos = (m_nTearingPos + 7) % m_NativeVideoSize.cx;
+ }
+ MoveToScheduledList(pSample, false); // Schedule, then go back to see if there is more where that came from
+ }
+ return newSample;
+}
+
+STDMETHODIMP CSyncAP::GetCurrentMediaType(__deref_out IMFVideoMediaType** ppMediaType)
+{
+ HRESULT hr = S_OK;
+ CAutoLock lock(this);
+ CheckPointer(ppMediaType, E_POINTER);
+ CheckHR(CheckShutdown());
+
+ if (m_pMediaType == NULL) {
+ CheckHR(MF_E_NOT_INITIALIZED);
+ }
+
+ CheckHR(m_pMediaType->QueryInterface(__uuidof(IMFVideoMediaType), (void**)&ppMediaType));
+ return hr;
}
// IMFTopologyServiceLookupClient
-STDMETHODIMP CSyncAP::InitServicePointers(__in IMFTopologyServiceLookup *pLookup)
+STDMETHODIMP CSyncAP::InitServicePointers(__in IMFTopologyServiceLookup* pLookup)
{
- HRESULT hr;
- DWORD dwObjects = 1;
- hr = pLookup->LookupService(MF_SERVICE_LOOKUP_GLOBAL, 0, MR_VIDEO_MIXER_SERVICE, __uuidof (IMFTransform), (void**)&m_pMixer, &dwObjects);
- hr = pLookup->LookupService(MF_SERVICE_LOOKUP_GLOBAL, 0, MR_VIDEO_RENDER_SERVICE, __uuidof (IMediaEventSink ), (void**)&m_pSink, &dwObjects);
- hr = pLookup->LookupService(MF_SERVICE_LOOKUP_GLOBAL, 0, MR_VIDEO_RENDER_SERVICE, __uuidof (IMFClock ), (void**)&m_pClock, &dwObjects);
- StartWorkerThreads();
- return S_OK;
+ HRESULT hr;
+ DWORD dwObjects = 1;
+ hr = pLookup->LookupService(MF_SERVICE_LOOKUP_GLOBAL, 0, MR_VIDEO_MIXER_SERVICE, __uuidof(IMFTransform), (void**)&m_pMixer, &dwObjects);
+ hr = pLookup->LookupService(MF_SERVICE_LOOKUP_GLOBAL, 0, MR_VIDEO_RENDER_SERVICE, __uuidof(IMediaEventSink), (void**)&m_pSink, &dwObjects);
+ hr = pLookup->LookupService(MF_SERVICE_LOOKUP_GLOBAL, 0, MR_VIDEO_RENDER_SERVICE, __uuidof(IMFClock), (void**)&m_pClock, &dwObjects);
+ StartWorkerThreads();
+ return S_OK;
}
STDMETHODIMP CSyncAP::ReleaseServicePointers()
{
- StopWorkerThreads();
- m_pMixer = NULL;
- m_pSink = NULL;
- m_pClock = NULL;
- return S_OK;
+ StopWorkerThreads();
+ m_pMixer = NULL;
+ m_pSink = NULL;
+ m_pClock = NULL;
+ return S_OK;
}
// IMFVideoDeviceID
-STDMETHODIMP CSyncAP::GetDeviceID( __out IID *pDeviceID)
+STDMETHODIMP CSyncAP::GetDeviceID(__out IID* pDeviceID)
{
- CheckPointer(pDeviceID, E_POINTER);
- *pDeviceID = IID_IDirect3DDevice9;
- return S_OK;
+ CheckPointer(pDeviceID, E_POINTER);
+ *pDeviceID = IID_IDirect3DDevice9;
+ return S_OK;
}
// IMFGetService
-STDMETHODIMP CSyncAP::GetService( __RPC__in REFGUID guidService, __RPC__in REFIID riid, __RPC__deref_out_opt LPVOID *ppvObject)
+STDMETHODIMP CSyncAP::GetService(__RPC__in REFGUID guidService, __RPC__in REFIID riid, __RPC__deref_out_opt LPVOID* ppvObject)
{
- if (guidService == MR_VIDEO_RENDER_SERVICE) {
- return NonDelegatingQueryInterface (riid, ppvObject);
- } else if (guidService == MR_VIDEO_ACCELERATION_SERVICE) {
- return m_pD3DManager->QueryInterface (__uuidof(IDirect3DDeviceManager9), (void**) ppvObject);
- }
+ if (guidService == MR_VIDEO_RENDER_SERVICE) {
+ return NonDelegatingQueryInterface(riid, ppvObject);
+ } else if (guidService == MR_VIDEO_ACCELERATION_SERVICE) {
+ return m_pD3DManager->QueryInterface(__uuidof(IDirect3DDeviceManager9), (void**) ppvObject);
+ }
- return E_NOINTERFACE;
+ return E_NOINTERFACE;
}
// IMFAsyncCallback
-STDMETHODIMP CSyncAP::GetParameters( __RPC__out DWORD *pdwFlags, __RPC__out DWORD *pdwQueue)
+STDMETHODIMP CSyncAP::GetParameters(__RPC__out DWORD* pdwFlags, __RPC__out DWORD* pdwQueue)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
-STDMETHODIMP CSyncAP::Invoke( __RPC__in_opt IMFAsyncResult *pAsyncResult)
+STDMETHODIMP CSyncAP::Invoke(__RPC__in_opt IMFAsyncResult* pAsyncResult)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// IMFVideoDisplayControl
-STDMETHODIMP CSyncAP::GetNativeVideoSize(SIZE *pszVideo, SIZE *pszARVideo)
+STDMETHODIMP CSyncAP::GetNativeVideoSize(SIZE* pszVideo, SIZE* pszARVideo)
{
- if (pszVideo) {
- pszVideo->cx = m_NativeVideoSize.cx;
- pszVideo->cy = m_NativeVideoSize.cy;
- }
- if (pszARVideo) {
- pszARVideo->cx = m_NativeVideoSize.cx * m_AspectRatio.cx;
- pszARVideo->cy = m_NativeVideoSize.cy * m_AspectRatio.cy;
- }
- return S_OK;
+ if (pszVideo) {
+ pszVideo->cx = m_NativeVideoSize.cx;
+ pszVideo->cy = m_NativeVideoSize.cy;
+ }
+ if (pszARVideo) {
+ pszARVideo->cx = m_NativeVideoSize.cx * m_AspectRatio.cx;
+ pszARVideo->cy = m_NativeVideoSize.cy * m_AspectRatio.cy;
+ }
+ return S_OK;
}
-STDMETHODIMP CSyncAP::GetIdealVideoSize(SIZE *pszMin, SIZE *pszMax)
+STDMETHODIMP CSyncAP::GetIdealVideoSize(SIZE* pszMin, SIZE* pszMax)
{
- if (pszMin) {
- pszMin->cx = 1;
- pszMin->cy = 1;
- }
+ if (pszMin) {
+ pszMin->cx = 1;
+ pszMin->cy = 1;
+ }
- if (pszMax) {
- D3DDISPLAYMODE d3ddm;
+ if (pszMax) {
+ D3DDISPLAYMODE d3ddm;
- ZeroMemory(&d3ddm, sizeof(d3ddm));
- if (SUCCEEDED(m_pD3D->GetAdapterDisplayMode(GetAdapter(m_pD3D), &d3ddm))) {
- pszMax->cx = d3ddm.Width;
- pszMax->cy = d3ddm.Height;
- }
- }
- return S_OK;
+ ZeroMemory(&d3ddm, sizeof(d3ddm));
+ if (SUCCEEDED(m_pD3D->GetAdapterDisplayMode(GetAdapter(m_pD3D), &d3ddm))) {
+ pszMax->cx = d3ddm.Width;
+ pszMax->cy = d3ddm.Height;
+ }
+ }
+ return S_OK;
}
-STDMETHODIMP CSyncAP::SetVideoPosition(const MFVideoNormalizedRect *pnrcSource, const LPRECT prcDest)
+STDMETHODIMP CSyncAP::SetVideoPosition(const MFVideoNormalizedRect* pnrcSource, const LPRECT prcDest)
{
- return S_OK;
+ return S_OK;
}
-STDMETHODIMP CSyncAP::GetVideoPosition(MFVideoNormalizedRect *pnrcSource, LPRECT prcDest)
+STDMETHODIMP CSyncAP::GetVideoPosition(MFVideoNormalizedRect* pnrcSource, LPRECT prcDest)
{
- if (pnrcSource) {
- pnrcSource->left = 0.0;
- pnrcSource->top = 0.0;
- pnrcSource->right = 1.0;
- pnrcSource->bottom = 1.0;
- }
- if (prcDest) {
- memcpy (prcDest, &m_VideoRect, sizeof(m_VideoRect)); //GetClientRect (m_hWnd, prcDest);
- }
- return S_OK;
+ if (pnrcSource) {
+ pnrcSource->left = 0.0;
+ pnrcSource->top = 0.0;
+ pnrcSource->right = 1.0;
+ pnrcSource->bottom = 1.0;
+ }
+ if (prcDest) {
+ memcpy(prcDest, &m_VideoRect, sizeof(m_VideoRect)); //GetClientRect (m_hWnd, prcDest);
+ }
+ return S_OK;
}
STDMETHODIMP CSyncAP::SetAspectRatioMode(DWORD dwAspectRatioMode)
{
- m_dwVideoAspectRatioMode = (MFVideoAspectRatioMode)dwAspectRatioMode;
- return S_OK;
+ m_dwVideoAspectRatioMode = (MFVideoAspectRatioMode)dwAspectRatioMode;
+ return S_OK;
}
-STDMETHODIMP CSyncAP::GetAspectRatioMode(DWORD *pdwAspectRatioMode)
+STDMETHODIMP CSyncAP::GetAspectRatioMode(DWORD* pdwAspectRatioMode)
{
- CheckPointer (pdwAspectRatioMode, E_POINTER);
- *pdwAspectRatioMode = m_dwVideoAspectRatioMode;
- return S_OK;
+ CheckPointer(pdwAspectRatioMode, E_POINTER);
+ *pdwAspectRatioMode = m_dwVideoAspectRatioMode;
+ return S_OK;
}
STDMETHODIMP CSyncAP::SetVideoWindow(HWND hwndVideo)
{
- ASSERT (m_hWnd == hwndVideo);
- return S_OK;
+ ASSERT(m_hWnd == hwndVideo);
+ return S_OK;
}
-STDMETHODIMP CSyncAP::GetVideoWindow(HWND *phwndVideo)
+STDMETHODIMP CSyncAP::GetVideoWindow(HWND* phwndVideo)
{
- CheckPointer(phwndVideo, E_POINTER);
- *phwndVideo = m_hWnd;
- return S_OK;
+ CheckPointer(phwndVideo, E_POINTER);
+ *phwndVideo = m_hWnd;
+ return S_OK;
}
STDMETHODIMP CSyncAP::RepaintVideo()
{
- Paint(true);
- return S_OK;
+ Paint(true);
+ return S_OK;
}
-STDMETHODIMP CSyncAP::GetCurrentImage(BITMAPINFOHEADER *pBih, BYTE **pDib, DWORD *pcbDib, LONGLONG *pTimeStamp)
+STDMETHODIMP CSyncAP::GetCurrentImage(BITMAPINFOHEADER* pBih, BYTE** pDib, DWORD* pcbDib, LONGLONG* pTimeStamp)
{
- ASSERT (FALSE);
- return E_NOTIMPL;
+ ASSERT(FALSE);
+ return E_NOTIMPL;
}
STDMETHODIMP CSyncAP::SetBorderColor(COLORREF Clr)
{
- m_BorderColor = Clr;
- return S_OK;
+ m_BorderColor = Clr;
+ return S_OK;
}
-STDMETHODIMP CSyncAP::GetBorderColor(COLORREF *pClr)
+STDMETHODIMP CSyncAP::GetBorderColor(COLORREF* pClr)
{
- CheckPointer (pClr, E_POINTER);
- *pClr = m_BorderColor;
- return S_OK;
+ CheckPointer(pClr, E_POINTER);
+ *pClr = m_BorderColor;
+ return S_OK;
}
STDMETHODIMP CSyncAP::SetRenderingPrefs(DWORD dwRenderFlags)
{
- m_dwVideoRenderPrefs = (MFVideoRenderPrefs)dwRenderFlags;
- return S_OK;
+ m_dwVideoRenderPrefs = (MFVideoRenderPrefs)dwRenderFlags;
+ return S_OK;
}
-STDMETHODIMP CSyncAP::GetRenderingPrefs(DWORD *pdwRenderFlags)
+STDMETHODIMP CSyncAP::GetRenderingPrefs(DWORD* pdwRenderFlags)
{
- CheckPointer(pdwRenderFlags, E_POINTER);
- *pdwRenderFlags = m_dwVideoRenderPrefs;
- return S_OK;
+ CheckPointer(pdwRenderFlags, E_POINTER);
+ *pdwRenderFlags = m_dwVideoRenderPrefs;
+ return S_OK;
}
STDMETHODIMP CSyncAP::SetFullscreen(BOOL fFullscreen)
{
- ASSERT (FALSE);
- return E_NOTIMPL;
+ ASSERT(FALSE);
+ return E_NOTIMPL;
}
-STDMETHODIMP CSyncAP::GetFullscreen(BOOL *pfFullscreen)
+STDMETHODIMP CSyncAP::GetFullscreen(BOOL* pfFullscreen)
{
- ASSERT (FALSE);
- return E_NOTIMPL;
+ ASSERT(FALSE);
+ return E_NOTIMPL;
}
// IEVRTrustedVideoPlugin
-STDMETHODIMP CSyncAP::IsInTrustedVideoMode(BOOL *pYes)
+STDMETHODIMP CSyncAP::IsInTrustedVideoMode(BOOL* pYes)
{
- CheckPointer(pYes, E_POINTER);
- *pYes = TRUE;
- return S_OK;
+ CheckPointer(pYes, E_POINTER);
+ *pYes = TRUE;
+ return S_OK;
}
-STDMETHODIMP CSyncAP::CanConstrict(BOOL *pYes)
+STDMETHODIMP CSyncAP::CanConstrict(BOOL* pYes)
{
- CheckPointer(pYes, E_POINTER);
- *pYes = TRUE;
- return S_OK;
+ CheckPointer(pYes, E_POINTER);
+ *pYes = TRUE;
+ return S_OK;
}
STDMETHODIMP CSyncAP::SetConstriction(DWORD dwKPix)
{
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CSyncAP::DisableImageExport(BOOL bDisable)
{
- return S_OK;
+ return S_OK;
}
// IDirect3DDeviceManager9
-STDMETHODIMP CSyncAP::ResetDevice(IDirect3DDevice9 *pDevice,UINT resetToken)
+STDMETHODIMP CSyncAP::ResetDevice(IDirect3DDevice9* pDevice, UINT resetToken)
{
- HRESULT hr = m_pD3DManager->ResetDevice (pDevice, resetToken);
- return hr;
+ HRESULT hr = m_pD3DManager->ResetDevice(pDevice, resetToken);
+ return hr;
}
-STDMETHODIMP CSyncAP::OpenDeviceHandle(HANDLE *phDevice)
+STDMETHODIMP CSyncAP::OpenDeviceHandle(HANDLE* phDevice)
{
- HRESULT hr = m_pD3DManager->OpenDeviceHandle (phDevice);
- return hr;
+ HRESULT hr = m_pD3DManager->OpenDeviceHandle(phDevice);
+ return hr;
}
STDMETHODIMP CSyncAP::CloseDeviceHandle(HANDLE hDevice)
{
- HRESULT hr = m_pD3DManager->CloseDeviceHandle(hDevice);
- return hr;
+ HRESULT hr = m_pD3DManager->CloseDeviceHandle(hDevice);
+ return hr;
}
STDMETHODIMP CSyncAP::TestDevice(HANDLE hDevice)
{
- HRESULT hr = m_pD3DManager->TestDevice(hDevice);
- return hr;
+ HRESULT hr = m_pD3DManager->TestDevice(hDevice);
+ return hr;
}
-STDMETHODIMP CSyncAP::LockDevice(HANDLE hDevice, IDirect3DDevice9 **ppDevice, BOOL fBlock)
+STDMETHODIMP CSyncAP::LockDevice(HANDLE hDevice, IDirect3DDevice9** ppDevice, BOOL fBlock)
{
- HRESULT hr = m_pD3DManager->LockDevice(hDevice, ppDevice, fBlock);
- return hr;
+ HRESULT hr = m_pD3DManager->LockDevice(hDevice, ppDevice, fBlock);
+ return hr;
}
STDMETHODIMP CSyncAP::UnlockDevice(HANDLE hDevice, BOOL fSaveState)
{
- HRESULT hr = m_pD3DManager->UnlockDevice(hDevice, fSaveState);
- return hr;
+ HRESULT hr = m_pD3DManager->UnlockDevice(hDevice, fSaveState);
+ return hr;
}
-STDMETHODIMP CSyncAP::GetVideoService(HANDLE hDevice, REFIID riid, void **ppService)
+STDMETHODIMP CSyncAP::GetVideoService(HANDLE hDevice, REFIID riid, void** ppService)
{
- HRESULT hr = m_pD3DManager->GetVideoService(hDevice, riid, ppService);
+ HRESULT hr = m_pD3DManager->GetVideoService(hDevice, riid, ppService);
- if (riid == __uuidof(IDirectXVideoDecoderService)) {
- UINT nNbDecoder = 5;
- GUID* pDecoderGuid;
- IDirectXVideoDecoderService* pDXVAVideoDecoder = (IDirectXVideoDecoderService*) *ppService;
- pDXVAVideoDecoder->GetDecoderDeviceGuids (&nNbDecoder, &pDecoderGuid);
- } else if (riid == __uuidof(IDirectXVideoProcessorService)) {
- IDirectXVideoProcessorService* pDXVAProcessor = (IDirectXVideoProcessorService*) *ppService;
- UNREFERENCED_PARAMETER(pDXVAProcessor);
- }
+ if (riid == __uuidof(IDirectXVideoDecoderService)) {
+ UINT nNbDecoder = 5;
+ GUID* pDecoderGuid;
+ IDirectXVideoDecoderService* pDXVAVideoDecoder = (IDirectXVideoDecoderService*) *ppService;
+ pDXVAVideoDecoder->GetDecoderDeviceGuids(&nNbDecoder, &pDecoderGuid);
+ } else if (riid == __uuidof(IDirectXVideoProcessorService)) {
+ IDirectXVideoProcessorService* pDXVAProcessor = (IDirectXVideoProcessorService*) *ppService;
+ UNREFERENCED_PARAMETER(pDXVAProcessor);
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CSyncAP::GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight)
{
- // This function should be called...
- ASSERT (FALSE);
+ // This function should be called...
+ ASSERT(FALSE);
- if (lpWidth) {
- *lpWidth = m_NativeVideoSize.cx;
- }
- if (lpHeight) {
- *lpHeight = m_NativeVideoSize.cy;
- }
- if (lpARWidth) {
- *lpARWidth = m_AspectRatio.cx;
- }
- if (lpARHeight) {
- *lpARHeight = m_AspectRatio.cy;
- }
- return S_OK;
+ if (lpWidth) {
+ *lpWidth = m_NativeVideoSize.cx;
+ }
+ if (lpHeight) {
+ *lpHeight = m_NativeVideoSize.cy;
+ }
+ if (lpARWidth) {
+ *lpARWidth = m_AspectRatio.cx;
+ }
+ if (lpARHeight) {
+ *lpARHeight = m_AspectRatio.cy;
+ }
+ return S_OK;
}
STDMETHODIMP CSyncAP::InitializeDevice(AM_MEDIA_TYPE* pMediaType)
{
- HRESULT hr;
- CAutoLock lock(this);
- CAutoLock lock2(&m_ImageProcessingLock);
- CAutoLock cRenderLock(&m_allocatorLock);
-
- RemoveAllSamples();
- DeleteSurfaces();
-
- VIDEOINFOHEADER2* vih2 = (VIDEOINFOHEADER2*) pMediaType->pbFormat;
- int w = vih2->bmiHeader.biWidth;
- int h = abs(vih2->bmiHeader.biHeight);
-
- m_NativeVideoSize = CSize(w, h);
- if (m_bHighColorResolution) {
- hr = AllocSurfaces(D3DFMT_A2R10G10B10);
- } else {
- hr = AllocSurfaces(D3DFMT_X8R8G8B8);
- }
-
- for (int i = 0; i < m_nDXSurface; i++) {
- CComPtr<IMFSample> pMFSample;
- hr = pfMFCreateVideoSampleFromSurface(m_pVideoSurface[i], &pMFSample);
- if (SUCCEEDED (hr)) {
- pMFSample->SetUINT32(GUID_SURFACE_INDEX, i);
- m_FreeSamples.AddTail (pMFSample);
- }
- ASSERT (SUCCEEDED (hr));
- }
- return hr;
+ HRESULT hr;
+ CAutoLock lock(this);
+ CAutoLock lock2(&m_ImageProcessingLock);
+ CAutoLock cRenderLock(&m_allocatorLock);
+
+ RemoveAllSamples();
+ DeleteSurfaces();
+
+ VIDEOINFOHEADER2* vih2 = (VIDEOINFOHEADER2*) pMediaType->pbFormat;
+ int w = vih2->bmiHeader.biWidth;
+ int h = abs(vih2->bmiHeader.biHeight);
+
+ m_NativeVideoSize = CSize(w, h);
+ if (m_bHighColorResolution) {
+ hr = AllocSurfaces(D3DFMT_A2R10G10B10);
+ } else {
+ hr = AllocSurfaces(D3DFMT_X8R8G8B8);
+ }
+
+ for (int i = 0; i < m_nDXSurface; i++) {
+ CComPtr<IMFSample> pMFSample;
+ hr = pfMFCreateVideoSampleFromSurface(m_pVideoSurface[i], &pMFSample);
+ if (SUCCEEDED(hr)) {
+ pMFSample->SetUINT32(GUID_SURFACE_INDEX, i);
+ m_FreeSamples.AddTail(pMFSample);
+ }
+ ASSERT(SUCCEEDED(hr));
+ }
+ return hr;
}
DWORD WINAPI CSyncAP::MixerThreadStatic(LPVOID lpParam)
{
- CSyncAP *pThis = (CSyncAP*) lpParam;
- pThis->MixerThread();
- return 0;
+ CSyncAP* pThis = (CSyncAP*) lpParam;
+ pThis->MixerThread();
+ return 0;
}
void CSyncAP::MixerThread()
{
- HANDLE hEvts[] = {m_hEvtQuit};
- bool bQuit = false;
- TIMECAPS tc;
- DWORD dwResolution;
- DWORD dwUser = 0;
-
- timeGetDevCaps(&tc, sizeof(TIMECAPS));
- dwResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
- dwUser = timeBeginPeriod(dwResolution);
-
- while (!bQuit) {
- DWORD dwObject = WaitForMultipleObjects (_countof(hEvts), hEvts, FALSE, 1);
- switch (dwObject) {
- case WAIT_OBJECT_0 :
- bQuit = true;
- break;
- case WAIT_TIMEOUT : {
- bool bNewSample = false;
- {
- CAutoLock AutoLock(&m_ImageProcessingLock);
- bNewSample = GetSampleFromMixer();
- }
- if (m_bUseInternalTimer && m_pSubPicQueue) {
- m_pSubPicQueue->SetFPS(m_fps);
- }
- }
- break;
- }
- }
- timeEndPeriod (dwResolution);
+ HANDLE hEvts[] = {m_hEvtQuit};
+ bool bQuit = false;
+ TIMECAPS tc;
+ DWORD dwResolution;
+ DWORD dwUser = 0;
+
+ timeGetDevCaps(&tc, sizeof(TIMECAPS));
+ dwResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
+ dwUser = timeBeginPeriod(dwResolution);
+
+ while (!bQuit) {
+ DWORD dwObject = WaitForMultipleObjects(_countof(hEvts), hEvts, FALSE, 1);
+ switch (dwObject) {
+ case WAIT_OBJECT_0 :
+ bQuit = true;
+ break;
+ case WAIT_TIMEOUT : {
+ bool bNewSample = false;
+ {
+ CAutoLock AutoLock(&m_ImageProcessingLock);
+ bNewSample = GetSampleFromMixer();
+ }
+ if (m_bUseInternalTimer && m_pSubPicQueue) {
+ m_pSubPicQueue->SetFPS(m_fps);
+ }
+ }
+ break;
+ }
+ }
+ timeEndPeriod(dwResolution);
}
DWORD WINAPI CSyncAP::RenderThreadStatic(LPVOID lpParam)
{
- CSyncAP *pThis = (CSyncAP*)lpParam;
- pThis->RenderThread();
- return 0;
+ CSyncAP* pThis = (CSyncAP*)lpParam;
+ pThis->RenderThread();
+ return 0;
}
// Get samples that have been received and queued up by MixerThread() and present them at the correct time by calling Paint().
void CSyncAP::RenderThread()
{
- HANDLE hEvts[] = {m_hEvtQuit, m_hEvtFlush, m_hEvtSkip};
- bool bQuit = false;
- TIMECAPS tc;
- DWORD dwResolution;
- LONGLONG llRefClockTime;
- double dTargetSyncOffset;
- MFTIME llSystemTime;
- DWORD dwUser = 0;
- DWORD dwObject;
- int nSamplesLeft;
- CComPtr<IMFSample>pNewSample = NULL; // The sample next in line to be presented
-
- // Tell Vista Multimedia Class Scheduler we are doing threaded playback (increase priority)
- HANDLE hAvrt = 0;
- if (pfAvSetMmThreadCharacteristicsW) {
- DWORD dwTaskIndex = 0;
- hAvrt = pfAvSetMmThreadCharacteristicsW (L"Playback", &dwTaskIndex);
- if (pfAvSetMmThreadPriority) {
- pfAvSetMmThreadPriority (hAvrt, AVRT_PRIORITY_HIGH);
- }
- }
-
- // Set timer resolution
- timeGetDevCaps(&tc, sizeof(TIMECAPS));
- dwResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
- dwUser = timeBeginPeriod(dwResolution);
- pNewSample = NULL;
-
- while (!bQuit) {
- m_lNextSampleWait = 1; // Default value for running this loop
- nSamplesLeft = 0;
- bool stepForward = false;
- LONG lDisplayCycle = (LONG)(GetDisplayCycle());
- LONG lDisplayCycle2 = (LONG)(GetDisplayCycle() / 2.0); // These are a couple of empirically determined constants used the control the "snap" function
- LONG lDisplayCycle4 = (LONG)(GetDisplayCycle() / 4.0);
-
- CRenderersSettings& s = GetRenderersSettings();
- dTargetSyncOffset = s.m_RenderSettings.fTargetSyncOffset;
-
- if ((m_nRenderState == Started || !m_bPrerolled) && !pNewSample) { // If either streaming or the pre-roll sample and no sample yet fetched
- if (SUCCEEDED(GetScheduledSample(&pNewSample, nSamplesLeft))) { // Get the next sample
- m_llLastSampleTime = m_llSampleTime;
- if (!m_bPrerolled) {
- m_bPrerolled = true; // m_bPrerolled is a ticket to show one (1) frame immediately
- m_lNextSampleWait = 0; // Present immediately
- } else if (SUCCEEDED(pNewSample->GetSampleTime(&m_llSampleTime))) { // Get zero-based sample due time
- if (m_llLastSampleTime == m_llSampleTime) { // In the rare case there are duplicate frames in the movie. There really shouldn't be but it happens.
- MoveToFreeList(pNewSample, true);
- pNewSample = NULL;
- m_lNextSampleWait = 0;
- } else {
- m_pClock->GetCorrelatedTime(0, &llRefClockTime, &llSystemTime); // Get zero-based reference clock time. llSystemTime is not used for anything here
- m_lNextSampleWait = (LONG)((m_llSampleTime - llRefClockTime) / 10000); // Time left until sample is due, in ms
- if (m_bStepping) {
- m_lNextSampleWait = 0;
- } else if (s.m_RenderSettings.bSynchronizeNearest) { // Present at the closest "safe" occasion at dTargetSyncOffset ms before vsync to avoid tearing
- if (m_lNextSampleWait < -lDisplayCycle) { // We have to allow slightly negative numbers at this stage. Otherwise we get "choking" when frame rate > refresh rate
- SetEvent(m_hEvtSkip);
- m_bEvtSkip = true;
- }
- REFERENCE_TIME rtRefClockTimeNow;
- if (m_pRefClock) {
- m_pRefClock->GetTime(&rtRefClockTimeNow); // Reference clock time now
- }
- LONG lLastVsyncTime = (LONG)((m_llEstVBlankTime - rtRefClockTimeNow) / 10000); // Last vsync time relative to now
- if (abs(lLastVsyncTime) > lDisplayCycle) {
- lLastVsyncTime = - lDisplayCycle; // To even out glitches in the beginning
- }
-
- LONGLONG llNextSampleWait = (LONGLONG)(((double)lLastVsyncTime + GetDisplayCycle() - dTargetSyncOffset) * 10000); // Time from now util next safe time to Paint()
- while ((llRefClockTime + llNextSampleWait) < (m_llSampleTime + m_llHysteresis)) { // While the proposed time is in the past of sample presentation time
- llNextSampleWait = llNextSampleWait + (LONGLONG)(GetDisplayCycle() * 10000); // Try the next possible time, one display cycle ahead
- }
- m_lNextSampleWait = (LONG)(llNextSampleWait / 10000);
- m_lShiftToNearestPrev = m_lShiftToNearest;
- m_lShiftToNearest = (LONG)((llRefClockTime + llNextSampleWait - m_llSampleTime) / 10000); // The adjustment made to get to the sweet point in time, in ms
-
- // If m_lShiftToNearest is pushed a whole cycle into the future, then we are getting more frames
- // than we can chew and we need to throw one away. We don't want to wait many cycles and skip many
- // frames.
- if (m_lShiftToNearest > (lDisplayCycle + 1)) {
- SetEvent(m_hEvtSkip);
- m_bEvtSkip = true;
- }
-
- // We need to add a hysteresis to the control of the timing adjustment to avoid judder when
- // presentation time is close to vsync and the renderer couldn't otherwise make up its mind
- // whether to present before the vsync or after. That kind of indecisiveness leads to judder.
- if (m_bSnapToVSync) {
-
- if ((m_lShiftToNearestPrev - m_lShiftToNearest) > lDisplayCycle2) { // If a step down in the m_lShiftToNearest function. Display slower than video.
- m_bVideoSlowerThanDisplay = false;
- m_llHysteresis = -(LONGLONG)(10000 * lDisplayCycle4);
- } else if ((m_lShiftToNearest - m_lShiftToNearestPrev) > lDisplayCycle2) { // If a step up
- m_bVideoSlowerThanDisplay = true;
- m_llHysteresis = (LONGLONG)(10000 * lDisplayCycle4);
- } else if ((m_lShiftToNearest < (3 * lDisplayCycle4)) && (m_lShiftToNearest > lDisplayCycle4)) {
- m_llHysteresis = 0; // Reset when between 1/4 and 3/4 of the way either way
- }
-
- if ((m_lShiftToNearest < lDisplayCycle2) && (m_llHysteresis > 0)) {
- m_llHysteresis = 0; // Should never really be in this territory.
- }
- if (m_lShiftToNearest < 0) {
- m_llHysteresis = 0; // A glitch might get us to a sticky state where both these numbers are negative.
- }
- if ((m_lShiftToNearest > lDisplayCycle2) && (m_llHysteresis < 0)) {
- m_llHysteresis = 0;
- }
- }
- }
-
- if (m_lNextSampleWait < 0) { // Skip late or duplicate sample.
- SetEvent(m_hEvtSkip);
- m_bEvtSkip = true;
- }
-
- if (m_lNextSampleWait > 1000) {
- m_lNextSampleWait = 1000; // So as to avoid full a full stop when sample is far in the future (shouldn't really happen).
- }
- }
- } // if got new sample
- }
- }
- // Wait for the next presentation time (m_lNextSampleWait) or some other event.
- dwObject = WaitForMultipleObjects(_countof(hEvts), hEvts, FALSE, (DWORD)m_lNextSampleWait);
- switch (dwObject) {
- case WAIT_OBJECT_0: // Quit
- bQuit = true;
- break;
-
- case WAIT_OBJECT_0 + 1: // Flush
- if (pNewSample) {
- MoveToFreeList(pNewSample, true);
- }
- pNewSample = NULL;
- FlushSamples();
- m_bEvtFlush = false;
- ResetEvent(m_hEvtFlush);
- m_bPrerolled = false;
- m_lShiftToNearest = 0;
- stepForward = true;
- break;
-
- case WAIT_OBJECT_0 + 2: // Skip sample
- m_pcFramesDropped++;
- m_llSampleTime = m_llLastSampleTime; // This sample will never be shown
- m_bEvtSkip = false;
- ResetEvent(m_hEvtSkip);
- stepForward = true;
- break;
-
- case WAIT_TIMEOUT: // Time to show the sample or something
- if (m_LastSetOutputRange != -1 && m_LastSetOutputRange != s.m_RenderSettings.iEVROutputRange || m_bPendingRenegotiate) {
- if (pNewSample) {
- MoveToFreeList(pNewSample, true);
- }
- pNewSample = NULL;
- FlushSamples();
- RenegotiateMediaType();
- m_bPendingRenegotiate = false;
- }
-
- if (m_bPendingResetDevice) {
- if (pNewSample) {
- MoveToFreeList(pNewSample, true);
- }
- pNewSample = NULL;
- SendResetRequest();
- } else if (m_nStepCount < 0) {
- m_nStepCount = 0;
- m_pcFramesDropped++;
- stepForward = true;
- } else if (pNewSample && (m_nStepCount > 0)) {
- pNewSample->GetUINT32(GUID_SURFACE_INDEX, (UINT32 *)&m_nCurSurface);
- if (!g_bExternalSubtitleTime) {
- __super::SetTime (g_tSegmentStart + m_llSampleTime);
- }
- Paint(true);
- CompleteFrameStep(false);
- m_pcFramesDrawn++;
- stepForward = true;
- } else if (pNewSample && !m_bStepping) { // When a stepped frame is shown, a new one is fetched that we don't want to show here while stepping
- pNewSample->GetUINT32(GUID_SURFACE_INDEX, (UINT32*)&m_nCurSurface);
- if (!g_bExternalSubtitleTime) {
- __super::SetTime (g_tSegmentStart + m_llSampleTime);
- }
- Paint(true);
- m_pcFramesDrawn++;
- stepForward = true;
- }
- break;
- } // switch
- if (pNewSample && stepForward) {
- MoveToFreeList(pNewSample, true);
- pNewSample = NULL;
- }
- } // while
- if (pNewSample) {
- MoveToFreeList(pNewSample, true);
- pNewSample = NULL;
- }
- timeEndPeriod (dwResolution);
- if (pfAvRevertMmThreadCharacteristics) {
- pfAvRevertMmThreadCharacteristics(hAvrt);
- }
+ HANDLE hEvts[] = {m_hEvtQuit, m_hEvtFlush, m_hEvtSkip};
+ bool bQuit = false;
+ TIMECAPS tc;
+ DWORD dwResolution;
+ LONGLONG llRefClockTime;
+ double dTargetSyncOffset;
+ MFTIME llSystemTime;
+ DWORD dwUser = 0;
+ DWORD dwObject;
+ int nSamplesLeft;
+ CComPtr<IMFSample>pNewSample = NULL; // The sample next in line to be presented
+
+ // Tell Vista Multimedia Class Scheduler we are doing threaded playback (increase priority)
+ HANDLE hAvrt = 0;
+ if (pfAvSetMmThreadCharacteristicsW) {
+ DWORD dwTaskIndex = 0;
+ hAvrt = pfAvSetMmThreadCharacteristicsW(L"Playback", &dwTaskIndex);
+ if (pfAvSetMmThreadPriority) {
+ pfAvSetMmThreadPriority(hAvrt, AVRT_PRIORITY_HIGH);
+ }
+ }
+
+ // Set timer resolution
+ timeGetDevCaps(&tc, sizeof(TIMECAPS));
+ dwResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
+ dwUser = timeBeginPeriod(dwResolution);
+ pNewSample = NULL;
+
+ while (!bQuit) {
+ m_lNextSampleWait = 1; // Default value for running this loop
+ nSamplesLeft = 0;
+ bool stepForward = false;
+ LONG lDisplayCycle = (LONG)(GetDisplayCycle());
+ LONG lDisplayCycle2 = (LONG)(GetDisplayCycle() / 2.0); // These are a couple of empirically determined constants used the control the "snap" function
+ LONG lDisplayCycle4 = (LONG)(GetDisplayCycle() / 4.0);
+
+ CRenderersSettings& s = GetRenderersSettings();
+ dTargetSyncOffset = s.m_RenderSettings.fTargetSyncOffset;
+
+ if ((m_nRenderState == Started || !m_bPrerolled) && !pNewSample) { // If either streaming or the pre-roll sample and no sample yet fetched
+ if (SUCCEEDED(GetScheduledSample(&pNewSample, nSamplesLeft))) { // Get the next sample
+ m_llLastSampleTime = m_llSampleTime;
+ if (!m_bPrerolled) {
+ m_bPrerolled = true; // m_bPrerolled is a ticket to show one (1) frame immediately
+ m_lNextSampleWait = 0; // Present immediately
+ } else if (SUCCEEDED(pNewSample->GetSampleTime(&m_llSampleTime))) { // Get zero-based sample due time
+ if (m_llLastSampleTime == m_llSampleTime) { // In the rare case there are duplicate frames in the movie. There really shouldn't be but it happens.
+ MoveToFreeList(pNewSample, true);
+ pNewSample = NULL;
+ m_lNextSampleWait = 0;
+ } else {
+ m_pClock->GetCorrelatedTime(0, &llRefClockTime, &llSystemTime); // Get zero-based reference clock time. llSystemTime is not used for anything here
+ m_lNextSampleWait = (LONG)((m_llSampleTime - llRefClockTime) / 10000); // Time left until sample is due, in ms
+ if (m_bStepping) {
+ m_lNextSampleWait = 0;
+ } else if (s.m_RenderSettings.bSynchronizeNearest) { // Present at the closest "safe" occasion at dTargetSyncOffset ms before vsync to avoid tearing
+ if (m_lNextSampleWait < -lDisplayCycle) { // We have to allow slightly negative numbers at this stage. Otherwise we get "choking" when frame rate > refresh rate
+ SetEvent(m_hEvtSkip);
+ m_bEvtSkip = true;
+ }
+ REFERENCE_TIME rtRefClockTimeNow;
+ if (m_pRefClock) {
+ m_pRefClock->GetTime(&rtRefClockTimeNow); // Reference clock time now
+ }
+ LONG lLastVsyncTime = (LONG)((m_llEstVBlankTime - rtRefClockTimeNow) / 10000); // Last vsync time relative to now
+ if (abs(lLastVsyncTime) > lDisplayCycle) {
+ lLastVsyncTime = - lDisplayCycle; // To even out glitches in the beginning
+ }
+
+ LONGLONG llNextSampleWait = (LONGLONG)(((double)lLastVsyncTime + GetDisplayCycle() - dTargetSyncOffset) * 10000); // Time from now util next safe time to Paint()
+ while ((llRefClockTime + llNextSampleWait) < (m_llSampleTime + m_llHysteresis)) { // While the proposed time is in the past of sample presentation time
+ llNextSampleWait = llNextSampleWait + (LONGLONG)(GetDisplayCycle() * 10000); // Try the next possible time, one display cycle ahead
+ }
+ m_lNextSampleWait = (LONG)(llNextSampleWait / 10000);
+ m_lShiftToNearestPrev = m_lShiftToNearest;
+ m_lShiftToNearest = (LONG)((llRefClockTime + llNextSampleWait - m_llSampleTime) / 10000); // The adjustment made to get to the sweet point in time, in ms
+
+ // If m_lShiftToNearest is pushed a whole cycle into the future, then we are getting more frames
+ // than we can chew and we need to throw one away. We don't want to wait many cycles and skip many
+ // frames.
+ if (m_lShiftToNearest > (lDisplayCycle + 1)) {
+ SetEvent(m_hEvtSkip);
+ m_bEvtSkip = true;
+ }
+
+ // We need to add a hysteresis to the control of the timing adjustment to avoid judder when
+ // presentation time is close to vsync and the renderer couldn't otherwise make up its mind
+ // whether to present before the vsync or after. That kind of indecisiveness leads to judder.
+ if (m_bSnapToVSync) {
+
+ if ((m_lShiftToNearestPrev - m_lShiftToNearest) > lDisplayCycle2) { // If a step down in the m_lShiftToNearest function. Display slower than video.
+ m_bVideoSlowerThanDisplay = false;
+ m_llHysteresis = -(LONGLONG)(10000 * lDisplayCycle4);
+ } else if ((m_lShiftToNearest - m_lShiftToNearestPrev) > lDisplayCycle2) { // If a step up
+ m_bVideoSlowerThanDisplay = true;
+ m_llHysteresis = (LONGLONG)(10000 * lDisplayCycle4);
+ } else if ((m_lShiftToNearest < (3 * lDisplayCycle4)) && (m_lShiftToNearest > lDisplayCycle4)) {
+ m_llHysteresis = 0; // Reset when between 1/4 and 3/4 of the way either way
+ }
+
+ if ((m_lShiftToNearest < lDisplayCycle2) && (m_llHysteresis > 0)) {
+ m_llHysteresis = 0; // Should never really be in this territory.
+ }
+ if (m_lShiftToNearest < 0) {
+ m_llHysteresis = 0; // A glitch might get us to a sticky state where both these numbers are negative.
+ }
+ if ((m_lShiftToNearest > lDisplayCycle2) && (m_llHysteresis < 0)) {
+ m_llHysteresis = 0;
+ }
+ }
+ }
+
+ if (m_lNextSampleWait < 0) { // Skip late or duplicate sample.
+ SetEvent(m_hEvtSkip);
+ m_bEvtSkip = true;
+ }
+
+ if (m_lNextSampleWait > 1000) {
+ m_lNextSampleWait = 1000; // So as to avoid full a full stop when sample is far in the future (shouldn't really happen).
+ }
+ }
+ } // if got new sample
+ }
+ }
+ // Wait for the next presentation time (m_lNextSampleWait) or some other event.
+ dwObject = WaitForMultipleObjects(_countof(hEvts), hEvts, FALSE, (DWORD)m_lNextSampleWait);
+ switch (dwObject) {
+ case WAIT_OBJECT_0: // Quit
+ bQuit = true;
+ break;
+
+ case WAIT_OBJECT_0 + 1: // Flush
+ if (pNewSample) {
+ MoveToFreeList(pNewSample, true);
+ }
+ pNewSample = NULL;
+ FlushSamples();
+ m_bEvtFlush = false;
+ ResetEvent(m_hEvtFlush);
+ m_bPrerolled = false;
+ m_lShiftToNearest = 0;
+ stepForward = true;
+ break;
+
+ case WAIT_OBJECT_0 + 2: // Skip sample
+ m_pcFramesDropped++;
+ m_llSampleTime = m_llLastSampleTime; // This sample will never be shown
+ m_bEvtSkip = false;
+ ResetEvent(m_hEvtSkip);
+ stepForward = true;
+ break;
+
+ case WAIT_TIMEOUT: // Time to show the sample or something
+ if (m_LastSetOutputRange != -1 && m_LastSetOutputRange != s.m_RenderSettings.iEVROutputRange || m_bPendingRenegotiate) {
+ if (pNewSample) {
+ MoveToFreeList(pNewSample, true);
+ }
+ pNewSample = NULL;
+ FlushSamples();
+ RenegotiateMediaType();
+ m_bPendingRenegotiate = false;
+ }
+
+ if (m_bPendingResetDevice) {
+ if (pNewSample) {
+ MoveToFreeList(pNewSample, true);
+ }
+ pNewSample = NULL;
+ SendResetRequest();
+ } else if (m_nStepCount < 0) {
+ m_nStepCount = 0;
+ m_pcFramesDropped++;
+ stepForward = true;
+ } else if (pNewSample && (m_nStepCount > 0)) {
+ pNewSample->GetUINT32(GUID_SURFACE_INDEX, (UINT32*)&m_nCurSurface);
+ if (!g_bExternalSubtitleTime) {
+ __super::SetTime(g_tSegmentStart + m_llSampleTime);
+ }
+ Paint(true);
+ CompleteFrameStep(false);
+ m_pcFramesDrawn++;
+ stepForward = true;
+ } else if (pNewSample && !m_bStepping) { // When a stepped frame is shown, a new one is fetched that we don't want to show here while stepping
+ pNewSample->GetUINT32(GUID_SURFACE_INDEX, (UINT32*)&m_nCurSurface);
+ if (!g_bExternalSubtitleTime) {
+ __super::SetTime(g_tSegmentStart + m_llSampleTime);
+ }
+ Paint(true);
+ m_pcFramesDrawn++;
+ stepForward = true;
+ }
+ break;
+ } // switch
+ if (pNewSample && stepForward) {
+ MoveToFreeList(pNewSample, true);
+ pNewSample = NULL;
+ }
+ } // while
+ if (pNewSample) {
+ MoveToFreeList(pNewSample, true);
+ pNewSample = NULL;
+ }
+ timeEndPeriod(dwResolution);
+ if (pfAvRevertMmThreadCharacteristics) {
+ pfAvRevertMmThreadCharacteristics(hAvrt);
+ }
}
STDMETHODIMP_(bool) CSyncAP::ResetDevice()
{
- CAutoLock lock(this);
- CAutoLock lock2(&m_ImageProcessingLock);
- CAutoLock cRenderLock(&m_allocatorLock);
- RemoveAllSamples();
+ CAutoLock lock(this);
+ CAutoLock lock2(&m_ImageProcessingLock);
+ CAutoLock cRenderLock(&m_allocatorLock);
+ RemoveAllSamples();
- bool bResult = __super::ResetDevice();
+ bool bResult = __super::ResetDevice();
- for (int i = 0; i < m_nDXSurface; i++) {
- CComPtr<IMFSample> pMFSample;
- HRESULT hr = pfMFCreateVideoSampleFromSurface (m_pVideoSurface[i], &pMFSample);
- if (SUCCEEDED (hr)) {
- pMFSample->SetUINT32(GUID_SURFACE_INDEX, i);
- m_FreeSamples.AddTail(pMFSample);
- }
- ASSERT(SUCCEEDED (hr));
- }
- return bResult;
+ for (int i = 0; i < m_nDXSurface; i++) {
+ CComPtr<IMFSample> pMFSample;
+ HRESULT hr = pfMFCreateVideoSampleFromSurface(m_pVideoSurface[i], &pMFSample);
+ if (SUCCEEDED(hr)) {
+ pMFSample->SetUINT32(GUID_SURFACE_INDEX, i);
+ m_FreeSamples.AddTail(pMFSample);
+ }
+ ASSERT(SUCCEEDED(hr));
+ }
+ return bResult;
}
void CSyncAP::OnResetDevice()
{
- TRACE("--> CSyncAP::OnResetDevice on thread: %d\n", GetCurrentThreadId());
- HRESULT hr;
- hr = m_pD3DManager->ResetDevice(m_pD3DDev, m_nResetToken);
- if (m_pSink) {
- m_pSink->Notify(EC_DISPLAY_CHANGED, 0, 0);
- }
- CSize videoSize = GetVisibleVideoSize();
- if (m_pSink) {
- m_pSink->Notify(EC_VIDEO_SIZE_CHANGED, MAKELPARAM(videoSize.cx, videoSize.cy), 0);
- }
+ TRACE("--> CSyncAP::OnResetDevice on thread: %d\n", GetCurrentThreadId());
+ HRESULT hr;
+ hr = m_pD3DManager->ResetDevice(m_pD3DDev, m_nResetToken);
+ if (m_pSink) {
+ m_pSink->Notify(EC_DISPLAY_CHANGED, 0, 0);
+ }
+ CSize videoSize = GetVisibleVideoSize();
+ if (m_pSink) {
+ m_pSink->Notify(EC_VIDEO_SIZE_CHANGED, MAKELPARAM(videoSize.cx, videoSize.cy), 0);
+ }
}
void CSyncAP::RemoveAllSamples()
{
- CAutoLock AutoLock(&m_ImageProcessingLock);
- FlushSamples();
- m_ScheduledSamples.RemoveAll();
- m_FreeSamples.RemoveAll();
- m_nUsedBuffer = 0;
+ CAutoLock AutoLock(&m_ImageProcessingLock);
+ FlushSamples();
+ m_ScheduledSamples.RemoveAll();
+ m_FreeSamples.RemoveAll();
+ m_nUsedBuffer = 0;
}
HRESULT CSyncAP::GetFreeSample(IMFSample** ppSample)
{
- CAutoLock lock(&m_SampleQueueLock);
- HRESULT hr = S_OK;
+ CAutoLock lock(&m_SampleQueueLock);
+ HRESULT hr = S_OK;
- if (m_FreeSamples.GetCount() > 1) { // Cannot use first free buffer (can be currently displayed)
- InterlockedIncrement(&m_nUsedBuffer);
- *ppSample = m_FreeSamples.RemoveHead().Detach();
- } else {
- hr = MF_E_SAMPLEALLOCATOR_EMPTY;
- }
+ if (m_FreeSamples.GetCount() > 1) { // Cannot use first free buffer (can be currently displayed)
+ InterlockedIncrement(&m_nUsedBuffer);
+ *ppSample = m_FreeSamples.RemoveHead().Detach();
+ } else {
+ hr = MF_E_SAMPLEALLOCATOR_EMPTY;
+ }
- return hr;
+ return hr;
}
-HRESULT CSyncAP::GetScheduledSample(IMFSample** ppSample, int &_Count)
+HRESULT CSyncAP::GetScheduledSample(IMFSample** ppSample, int& _Count)
{
- CAutoLock lock(&m_SampleQueueLock);
- HRESULT hr = S_OK;
+ CAutoLock lock(&m_SampleQueueLock);
+ HRESULT hr = S_OK;
- _Count = (int)m_ScheduledSamples.GetCount();
- if (_Count > 0) {
- *ppSample = m_ScheduledSamples.RemoveHead().Detach();
- --_Count;
- } else {
- hr = MF_E_SAMPLEALLOCATOR_EMPTY;
- }
+ _Count = (int)m_ScheduledSamples.GetCount();
+ if (_Count > 0) {
+ *ppSample = m_ScheduledSamples.RemoveHead().Detach();
+ --_Count;
+ } else {
+ hr = MF_E_SAMPLEALLOCATOR_EMPTY;
+ }
- return hr;
+ return hr;
}
void CSyncAP::MoveToFreeList(IMFSample* pSample, bool bTail)
{
- CAutoLock lock(&m_SampleQueueLock);
- InterlockedDecrement(&m_nUsedBuffer);
- if (m_bPendingMediaFinished && m_nUsedBuffer == 0) {
- m_bPendingMediaFinished = false;
- m_pSink->Notify(EC_COMPLETE, 0, 0);
- }
- if (bTail) {
- m_FreeSamples.AddTail(pSample);
- } else {
- m_FreeSamples.AddHead(pSample);
- }
+ CAutoLock lock(&m_SampleQueueLock);
+ InterlockedDecrement(&m_nUsedBuffer);
+ if (m_bPendingMediaFinished && m_nUsedBuffer == 0) {
+ m_bPendingMediaFinished = false;
+ m_pSink->Notify(EC_COMPLETE, 0, 0);
+ }
+ if (bTail) {
+ m_FreeSamples.AddTail(pSample);
+ } else {
+ m_FreeSamples.AddHead(pSample);
+ }
}
void CSyncAP::MoveToScheduledList(IMFSample* pSample, bool _bSorted)
{
- if (_bSorted) {
- CAutoLock lock(&m_SampleQueueLock);
- m_ScheduledSamples.AddHead(pSample);
- } else {
- CAutoLock lock(&m_SampleQueueLock);
- m_ScheduledSamples.AddTail(pSample);
- }
+ if (_bSorted) {
+ CAutoLock lock(&m_SampleQueueLock);
+ m_ScheduledSamples.AddHead(pSample);
+ } else {
+ CAutoLock lock(&m_SampleQueueLock);
+ m_ScheduledSamples.AddTail(pSample);
+ }
}
void CSyncAP::FlushSamples()
{
- CAutoLock lock(this);
- CAutoLock lock2(&m_SampleQueueLock);
- FlushSamplesInternal();
+ CAutoLock lock(this);
+ CAutoLock lock2(&m_SampleQueueLock);
+ FlushSamplesInternal();
}
void CSyncAP::FlushSamplesInternal()
{
- m_bPrerolled = false;
- while (m_ScheduledSamples.GetCount() > 0) {
- CComPtr<IMFSample> pMFSample;
- pMFSample = m_ScheduledSamples.RemoveHead();
- MoveToFreeList(pMFSample, true);
- }
+ m_bPrerolled = false;
+ while (m_ScheduledSamples.GetCount() > 0) {
+ CComPtr<IMFSample> pMFSample;
+ pMFSample = m_ScheduledSamples.RemoveHead();
+ MoveToFreeList(pMFSample, true);
+ }
}
HRESULT CSyncAP::AdviseSyncClock(ISyncClock* sC)
{
- return m_pGenlock->AdviseSyncClock(sC);
+ return m_pGenlock->AdviseSyncClock(sC);
}
HRESULT CSyncAP::BeginStreaming()
{
- m_pcFramesDropped = 0;
- m_pcFramesDrawn = 0;
+ m_pcFramesDropped = 0;
+ m_pcFramesDrawn = 0;
- CComPtr<IBaseFilter> pEVR;
- FILTER_INFO filterInfo;
- ZeroMemory(&filterInfo, sizeof(filterInfo));
- m_pOuterEVR->QueryInterface (__uuidof(IBaseFilter), (void**)&pEVR);
- pEVR->QueryFilterInfo(&filterInfo); // This addref's the pGraph member
+ CComPtr<IBaseFilter> pEVR;
+ FILTER_INFO filterInfo;
+ ZeroMemory(&filterInfo, sizeof(filterInfo));
+ m_pOuterEVR->QueryInterface(__uuidof(IBaseFilter), (void**)&pEVR);
+ pEVR->QueryFilterInfo(&filterInfo); // This addref's the pGraph member
- BeginEnumFilters(filterInfo.pGraph, pEF, pBF)
- if (CComQIPtr<IAMAudioRendererStats> pAS = pBF) {
- m_pAudioStats = pAS;
- };
- EndEnumFilters
+ BeginEnumFilters(filterInfo.pGraph, pEF, pBF)
+ if (CComQIPtr<IAMAudioRendererStats> pAS = pBF) {
+ m_pAudioStats = pAS;
+ };
+ EndEnumFilters
- pEVR->GetSyncSource(&m_pRefClock);
- if (filterInfo.pGraph) {
- filterInfo.pGraph->Release();
- }
- m_pGenlock->SetMonitor(GetAdapter(m_pD3D));
- m_pGenlock->GetTiming();
+ pEVR->GetSyncSource(&m_pRefClock);
+ if (filterInfo.pGraph) {
+ filterInfo.pGraph->Release();
+ }
+ m_pGenlock->SetMonitor(GetAdapter(m_pD3D));
+ m_pGenlock->GetTiming();
- ResetStats();
- EstimateRefreshTimings();
- if (m_dFrameCycle > 0.0) {
- m_dCycleDifference = GetCycleDifference(); // Might have moved to another display
- }
- return S_OK;
+ ResetStats();
+ EstimateRefreshTimings();
+ if (m_dFrameCycle > 0.0) {
+ m_dCycleDifference = GetCycleDifference(); // Might have moved to another display
+ }
+ return S_OK;
}
HRESULT CreateSyncRenderer(const CLSID& clsid, HWND hWnd, bool bFullscreen, ISubPicAllocatorPresenter** ppAP)
{
- HRESULT hr = E_FAIL;
- if (clsid == CLSID_SyncAllocatorPresenter) {
- CString Error;
- *ppAP = DNew CSyncAP(hWnd, bFullscreen, hr, Error);
- (*ppAP)->AddRef();
+ HRESULT hr = E_FAIL;
+ if (clsid == CLSID_SyncAllocatorPresenter) {
+ CString Error;
+ *ppAP = DNew CSyncAP(hWnd, bFullscreen, hr, Error);
+ (*ppAP)->AddRef();
- if (FAILED(hr)) {
- Error += L"\n";
- Error += GetWindowsErrorMessage(hr, NULL);
- MessageBox(hWnd, Error, L"Error creating EVR Sync", MB_OK | MB_ICONERROR);
- (*ppAP)->Release();
- *ppAP = NULL;
- } else if (!Error.IsEmpty()) {
- MessageBox(hWnd, Error, L"Warning creating EVR Sync", MB_OK|MB_ICONWARNING);
- }
- }
- return hr;
+ if (FAILED(hr)) {
+ Error += L"\n";
+ Error += GetWindowsErrorMessage(hr, NULL);
+ MessageBox(hWnd, Error, L"Error creating EVR Sync", MB_OK | MB_ICONERROR);
+ (*ppAP)->Release();
+ *ppAP = NULL;
+ } else if (!Error.IsEmpty()) {
+ MessageBox(hWnd, Error, L"Warning creating EVR Sync", MB_OK | MB_ICONWARNING);
+ }
+ }
+ return hr;
}
-CSyncRenderer::CSyncRenderer(const TCHAR* pName, LPUNKNOWN pUnk, HRESULT& hr, VMR9AlphaBitmap* pVMR9AlphaBitmap, CSyncAP *pAllocatorPresenter): CUnknown(pName, pUnk)
+CSyncRenderer::CSyncRenderer(const TCHAR* pName, LPUNKNOWN pUnk, HRESULT& hr, VMR9AlphaBitmap* pVMR9AlphaBitmap, CSyncAP* pAllocatorPresenter): CUnknown(pName, pUnk)
{
- hr = m_pEVR.CoCreateInstance(CLSID_EnhancedVideoRenderer, GetOwner());
- m_pVMR9AlphaBitmap = pVMR9AlphaBitmap;
- m_pAllocatorPresenter = pAllocatorPresenter;
+ hr = m_pEVR.CoCreateInstance(CLSID_EnhancedVideoRenderer, GetOwner());
+ m_pVMR9AlphaBitmap = pVMR9AlphaBitmap;
+ m_pAllocatorPresenter = pAllocatorPresenter;
}
CSyncRenderer::~CSyncRenderer()
{
}
-HRESULT STDMETHODCALLTYPE CSyncRenderer::GetState(DWORD dwMilliSecsTimeout, __out FILTER_STATE *State)
+HRESULT STDMETHODCALLTYPE CSyncRenderer::GetState(DWORD dwMilliSecsTimeout, __out FILTER_STATE* State)
{
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->GetState(dwMilliSecsTimeout, State);
- }
- return E_NOTIMPL;
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->GetState(dwMilliSecsTimeout, State);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP CSyncRenderer::EnumPins(__out IEnumPins **ppEnum)
+STDMETHODIMP CSyncRenderer::EnumPins(__out IEnumPins** ppEnum)
{
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->EnumPins(ppEnum);
- }
- return E_NOTIMPL;
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->EnumPins(ppEnum);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP CSyncRenderer::FindPin(LPCWSTR Id, __out IPin **ppPin)
+STDMETHODIMP CSyncRenderer::FindPin(LPCWSTR Id, __out IPin** ppPin)
{
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->FindPin(Id, ppPin);
- }
- return E_NOTIMPL;
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->FindPin(Id, ppPin);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP CSyncRenderer::QueryFilterInfo(__out FILTER_INFO *pInfo)
+STDMETHODIMP CSyncRenderer::QueryFilterInfo(__out FILTER_INFO* pInfo)
{
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->QueryFilterInfo(pInfo);
- }
- return E_NOTIMPL;
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->QueryFilterInfo(pInfo);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP CSyncRenderer::JoinFilterGraph(__in_opt IFilterGraph *pGraph, __in_opt LPCWSTR pName)
+STDMETHODIMP CSyncRenderer::JoinFilterGraph(__in_opt IFilterGraph* pGraph, __in_opt LPCWSTR pName)
{
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->JoinFilterGraph(pGraph, pName);
- }
- return E_NOTIMPL;
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->JoinFilterGraph(pGraph, pName);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP CSyncRenderer::QueryVendorInfo(__out LPWSTR *pVendorInfo)
+STDMETHODIMP CSyncRenderer::QueryVendorInfo(__out LPWSTR* pVendorInfo)
{
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->QueryVendorInfo(pVendorInfo);
- }
- return E_NOTIMPL;
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->QueryVendorInfo(pVendorInfo);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP CSyncRenderer::Stop( void)
+STDMETHODIMP CSyncRenderer::Stop(void)
{
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->Stop();
- }
- return E_NOTIMPL;
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->Stop();
+ }
+ return E_NOTIMPL;
}
STDMETHODIMP CSyncRenderer::Pause(void)
{
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->Pause();
- }
- return E_NOTIMPL;
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->Pause();
+ }
+ return E_NOTIMPL;
}
STDMETHODIMP CSyncRenderer::Run(REFERENCE_TIME tStart)
{
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->Run(tStart);
- }
- return E_NOTIMPL;
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->Run(tStart);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP CSyncRenderer::SetSyncSource(__in_opt IReferenceClock *pClock)
+STDMETHODIMP CSyncRenderer::SetSyncSource(__in_opt IReferenceClock* pClock)
{
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->SetSyncSource(pClock);
- }
- return E_NOTIMPL;
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->SetSyncSource(pClock);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP CSyncRenderer::GetSyncSource(__deref_out_opt IReferenceClock **pClock)
+STDMETHODIMP CSyncRenderer::GetSyncSource(__deref_out_opt IReferenceClock** pClock)
{
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->GetSyncSource(pClock);
- }
- return E_NOTIMPL;
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->GetSyncSource(pClock);
+ }
+ return E_NOTIMPL;
}
-STDMETHODIMP CSyncRenderer::GetClassID(__RPC__out CLSID *pClassID)
+STDMETHODIMP CSyncRenderer::GetClassID(__RPC__out CLSID* pClassID)
{
- CComPtr<IBaseFilter> pEVRBase;
- if (m_pEVR) {
- m_pEVR->QueryInterface(&pEVRBase);
- }
- if (pEVRBase) {
- return pEVRBase->GetClassID(pClassID);
- }
- return E_NOTIMPL;
+ CComPtr<IBaseFilter> pEVRBase;
+ if (m_pEVR) {
+ m_pEVR->QueryInterface(&pEVRBase);
+ }
+ if (pEVRBase) {
+ return pEVRBase->GetClassID(pClassID);
+ }
+ return E_NOTIMPL;
}
STDMETHODIMP CSyncRenderer::GetAlphaBitmapParameters(VMR9AlphaBitmap* pBmpParms)
{
- CheckPointer(pBmpParms, E_POINTER);
- CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
- memcpy (pBmpParms, m_pVMR9AlphaBitmap, sizeof(VMR9AlphaBitmap));
- return S_OK;
+ CheckPointer(pBmpParms, E_POINTER);
+ CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
+ memcpy(pBmpParms, m_pVMR9AlphaBitmap, sizeof(VMR9AlphaBitmap));
+ return S_OK;
}
STDMETHODIMP CSyncRenderer::SetAlphaBitmap(const VMR9AlphaBitmap* pBmpParms)
{
- CheckPointer(pBmpParms, E_POINTER);
- CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
- memcpy (m_pVMR9AlphaBitmap, pBmpParms, sizeof(VMR9AlphaBitmap));
- m_pVMR9AlphaBitmap->dwFlags |= VMRBITMAP_UPDATE;
- m_pAllocatorPresenter->UpdateAlphaBitmap();
- return S_OK;
+ CheckPointer(pBmpParms, E_POINTER);
+ CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
+ memcpy(m_pVMR9AlphaBitmap, pBmpParms, sizeof(VMR9AlphaBitmap));
+ m_pVMR9AlphaBitmap->dwFlags |= VMRBITMAP_UPDATE;
+ m_pAllocatorPresenter->UpdateAlphaBitmap();
+ return S_OK;
}
STDMETHODIMP CSyncRenderer::UpdateAlphaBitmapParameters(const VMR9AlphaBitmap* pBmpParms)
{
- CheckPointer(pBmpParms, E_POINTER);
- CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
- memcpy (m_pVMR9AlphaBitmap, pBmpParms, sizeof(VMR9AlphaBitmap));
- m_pVMR9AlphaBitmap->dwFlags |= VMRBITMAP_UPDATE;
- m_pAllocatorPresenter->UpdateAlphaBitmap();
- return S_OK;
+ CheckPointer(pBmpParms, E_POINTER);
+ CAutoLock BitMapLock(&m_pAllocatorPresenter->m_VMR9AlphaBitmapLock);
+ memcpy(m_pVMR9AlphaBitmap, pBmpParms, sizeof(VMR9AlphaBitmap));
+ m_pVMR9AlphaBitmap->dwFlags |= VMRBITMAP_UPDATE;
+ m_pAllocatorPresenter->UpdateAlphaBitmap();
+ return S_OK;
}
STDMETHODIMP CSyncRenderer::support_ffdshow()
{
- queue_ffdshow_support = true;
- return S_OK;
+ queue_ffdshow_support = true;
+ return S_OK;
}
STDMETHODIMP CSyncRenderer::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- HRESULT hr;
+ HRESULT hr;
- if (riid == __uuidof(IVMRMixerBitmap9)) {
- return GetInterface((IVMRMixerBitmap9*)this, ppv);
- }
+ if (riid == __uuidof(IVMRMixerBitmap9)) {
+ return GetInterface((IVMRMixerBitmap9*)this, ppv);
+ }
- if (riid == __uuidof(IBaseFilter)) {
- return GetInterface((IBaseFilter*)this, ppv);
- }
+ if (riid == __uuidof(IBaseFilter)) {
+ return GetInterface((IBaseFilter*)this, ppv);
+ }
- if (riid == __uuidof(IMediaFilter)) {
- return GetInterface((IMediaFilter*)this, ppv);
- }
- if (riid == __uuidof(IPersist)) {
- return GetInterface((IPersist*)this, ppv);
- }
- if (riid == __uuidof(IBaseFilter)) {
- return GetInterface((IBaseFilter*)this, ppv);
- }
+ if (riid == __uuidof(IMediaFilter)) {
+ return GetInterface((IMediaFilter*)this, ppv);
+ }
+ if (riid == __uuidof(IPersist)) {
+ return GetInterface((IPersist*)this, ppv);
+ }
+ if (riid == __uuidof(IBaseFilter)) {
+ return GetInterface((IBaseFilter*)this, ppv);
+ }
- hr = m_pEVR ? m_pEVR->QueryInterface(riid, ppv) : E_NOINTERFACE;
- if (m_pEVR && FAILED(hr)) {
- if (riid == __uuidof(IVMRffdshow9)) { // Support ffdshow queueing. We show ffdshow that this is patched Media Player Classic.
- return GetInterface((IVMRffdshow9*)this, ppv);
- }
- }
- return SUCCEEDED(hr) ? hr : __super::NonDelegatingQueryInterface(riid, ppv);
+ hr = m_pEVR ? m_pEVR->QueryInterface(riid, ppv) : E_NOINTERFACE;
+ if (m_pEVR && FAILED(hr)) {
+ if (riid == __uuidof(IVMRffdshow9)) { // Support ffdshow queueing. We show ffdshow that this is patched Media Player Classic.
+ return GetInterface((IVMRffdshow9*)this, ppv);
+ }
+ }
+ return SUCCEEDED(hr) ? hr : __super::NonDelegatingQueryInterface(riid, ppv);
}
CGenlock::CGenlock(DOUBLE target, DOUBLE limit, INT lineD, INT colD, DOUBLE clockD, UINT mon):
- targetSyncOffset(target), // Target sync offset, typically around 10 ms
- controlLimit(limit), // How much sync offset is allowed to drift from target sync offset before control kicks in
- lineDelta(lineD), // Number of rows used in display frequency adjustment, typically 1 (one)
- columnDelta(colD), // Number of columns used in display frequency adjustment, typically 1 - 2
- cycleDelta(clockD), // Delta used in clock speed adjustment. In fractions of 1.0. Typically around 0.001
- monitor(mon) // The monitor to be adjusted if the display refresh rate is the controlled parameter
-{
- lowSyncOffset = targetSyncOffset - controlLimit;
- highSyncOffset = targetSyncOffset + controlLimit;
- adjDelta = 0;
- displayAdjustmentsMade = 0;
- clockAdjustmentsMade = 0;
- displayFreqCruise = 0;
- displayFreqFaster = 0;
- displayFreqSlower = 0;
- curDisplayFreq = 0;
- psWnd = NULL;
- liveSource = FALSE;
- powerstripTimingExists = FALSE;
- syncOffsetFifo = DNew MovingAverage(64);
- frameCycleFifo = DNew MovingAverage(4);
+ targetSyncOffset(target), // Target sync offset, typically around 10 ms
+ controlLimit(limit), // How much sync offset is allowed to drift from target sync offset before control kicks in
+ lineDelta(lineD), // Number of rows used in display frequency adjustment, typically 1 (one)
+ columnDelta(colD), // Number of columns used in display frequency adjustment, typically 1 - 2
+ cycleDelta(clockD), // Delta used in clock speed adjustment. In fractions of 1.0. Typically around 0.001
+ monitor(mon) // The monitor to be adjusted if the display refresh rate is the controlled parameter
+{
+ lowSyncOffset = targetSyncOffset - controlLimit;
+ highSyncOffset = targetSyncOffset + controlLimit;
+ adjDelta = 0;
+ displayAdjustmentsMade = 0;
+ clockAdjustmentsMade = 0;
+ displayFreqCruise = 0;
+ displayFreqFaster = 0;
+ displayFreqSlower = 0;
+ curDisplayFreq = 0;
+ psWnd = NULL;
+ liveSource = FALSE;
+ powerstripTimingExists = FALSE;
+ syncOffsetFifo = DNew MovingAverage(64);
+ frameCycleFifo = DNew MovingAverage(4);
}
CGenlock::~CGenlock()
{
- ResetTiming();
- if (syncOffsetFifo != NULL) {
- delete syncOffsetFifo;
- syncOffsetFifo = NULL;
- }
- if (frameCycleFifo != NULL) {
- delete frameCycleFifo;
- frameCycleFifo = NULL;
- }
- syncClock = NULL;
+ ResetTiming();
+ if (syncOffsetFifo != NULL) {
+ delete syncOffsetFifo;
+ syncOffsetFifo = NULL;
+ }
+ if (frameCycleFifo != NULL) {
+ delete frameCycleFifo;
+ frameCycleFifo = NULL;
+ }
+ syncClock = NULL;
};
BOOL CGenlock::PowerstripRunning()
{
- psWnd = FindWindow(_T("TPShidden"), NULL);
- if (!psWnd) {
- return FALSE; // Powerstrip is not running
- } else {
- return TRUE;
- }
+ psWnd = FindWindow(_T("TPShidden"), NULL);
+ if (!psWnd) {
+ return FALSE; // Powerstrip is not running
+ } else {
+ return TRUE;
+ }
}
// Get the display timing parameters through PowerStrip (if running).
HRESULT CGenlock::GetTiming()
{
- ATOM getTiming;
- LPARAM lParam = NULL;
- WPARAM wParam = monitor;
- INT i = 0;
- INT j = 0;
- INT params = 0;
- TCHAR tmpStr[MAX_LOADSTRING];
-
- CAutoLock lock(&csGenlockLock);
- if (!PowerstripRunning()) {
- return E_FAIL;
- }
-
- getTiming = static_cast<ATOM>(SendMessage(psWnd, UM_GETTIMING, wParam, lParam));
- GlobalGetAtomName(getTiming, savedTiming, MAX_LOADSTRING);
-
- while (params < TIMING_PARAM_CNT) {
- while (savedTiming[i] != _T(',') && savedTiming[i] != _T('\0')) {
- tmpStr[j++] = savedTiming[i];
- tmpStr[j] = _T('\0');
- i++;
- }
- i++; // Skip trailing comma
- j = 0;
- displayTiming[params] = _ttoi(tmpStr);
- displayTimingSave[params] = displayTiming[params];
- params++;
- }
-
- // The display update frequency is controlled by adding and subtracting pixels form the
- // image. This is done by either subtracting columns or rows or both. Some displays like
- // row adjustments and some column adjustments. One should probably not do both.
- StringCchPrintf(faster, MAX_LOADSTRING, _T("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\0"),
- displayTiming[0],
- displayTiming[HFRONTPORCH] - columnDelta,
- displayTiming[2],
- displayTiming[3],
- displayTiming[4],
- displayTiming[VFRONTPORCH] - lineDelta,
- displayTiming[6],
- displayTiming[7],
- displayTiming[PIXELCLOCK],
- displayTiming[9]
- );
-
- // Nominal update frequency
- StringCchPrintf(cruise, MAX_LOADSTRING, _T("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\0"),
- displayTiming[0],
- displayTiming[HFRONTPORCH],
- displayTiming[2],
- displayTiming[3],
- displayTiming[4],
- displayTiming[VFRONTPORCH],
- displayTiming[6],
- displayTiming[7],
- displayTiming[PIXELCLOCK],
- displayTiming[9]
- );
-
- // Lower than nominal update frequency
- StringCchPrintf(slower, MAX_LOADSTRING, _T("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\0"),
- displayTiming[0],
- displayTiming[HFRONTPORCH] + columnDelta,
- displayTiming[2],
- displayTiming[3],
- displayTiming[4],
- displayTiming[VFRONTPORCH] + lineDelta,
- displayTiming[6],
- displayTiming[7],
- displayTiming[PIXELCLOCK],
- displayTiming[9]
- );
-
- totalColumns = displayTiming[HACTIVE] + displayTiming[HFRONTPORCH] + displayTiming[HSYNCWIDTH] + displayTiming[HBACKPORCH];
- totalLines = displayTiming[VACTIVE] + displayTiming[VFRONTPORCH] + displayTiming[VSYNCWIDTH] + displayTiming[VBACKPORCH];
- pixelClock = 1000 * displayTiming[PIXELCLOCK]; // Pixels/s
- displayFreqCruise = (DOUBLE)pixelClock / (totalLines * totalColumns); // Frames/s
- displayFreqSlower = (DOUBLE)pixelClock / ((totalLines + lineDelta) * (totalColumns + columnDelta));
- displayFreqFaster = (DOUBLE)pixelClock / ((totalLines - lineDelta) * (totalColumns - columnDelta));
- curDisplayFreq = displayFreqCruise;
- GlobalDeleteAtom(getTiming);
- adjDelta = 0;
- powerstripTimingExists = TRUE;
- return S_OK;
+ ATOM getTiming;
+ LPARAM lParam = NULL;
+ WPARAM wParam = monitor;
+ INT i = 0;
+ INT j = 0;
+ INT params = 0;
+ TCHAR tmpStr[MAX_LOADSTRING];
+
+ CAutoLock lock(&csGenlockLock);
+ if (!PowerstripRunning()) {
+ return E_FAIL;
+ }
+
+ getTiming = static_cast<ATOM>(SendMessage(psWnd, UM_GETTIMING, wParam, lParam));
+ GlobalGetAtomName(getTiming, savedTiming, MAX_LOADSTRING);
+
+ while (params < TIMING_PARAM_CNT) {
+ while (savedTiming[i] != _T(',') && savedTiming[i] != _T('\0')) {
+ tmpStr[j++] = savedTiming[i];
+ tmpStr[j] = _T('\0');
+ i++;
+ }
+ i++; // Skip trailing comma
+ j = 0;
+ displayTiming[params] = _ttoi(tmpStr);
+ displayTimingSave[params] = displayTiming[params];
+ params++;
+ }
+
+ // The display update frequency is controlled by adding and subtracting pixels form the
+ // image. This is done by either subtracting columns or rows or both. Some displays like
+ // row adjustments and some column adjustments. One should probably not do both.
+ StringCchPrintf(faster, MAX_LOADSTRING, _T("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\0"),
+ displayTiming[0],
+ displayTiming[HFRONTPORCH] - columnDelta,
+ displayTiming[2],
+ displayTiming[3],
+ displayTiming[4],
+ displayTiming[VFRONTPORCH] - lineDelta,
+ displayTiming[6],
+ displayTiming[7],
+ displayTiming[PIXELCLOCK],
+ displayTiming[9]
+ );
+
+ // Nominal update frequency
+ StringCchPrintf(cruise, MAX_LOADSTRING, _T("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\0"),
+ displayTiming[0],
+ displayTiming[HFRONTPORCH],
+ displayTiming[2],
+ displayTiming[3],
+ displayTiming[4],
+ displayTiming[VFRONTPORCH],
+ displayTiming[6],
+ displayTiming[7],
+ displayTiming[PIXELCLOCK],
+ displayTiming[9]
+ );
+
+ // Lower than nominal update frequency
+ StringCchPrintf(slower, MAX_LOADSTRING, _T("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\0"),
+ displayTiming[0],
+ displayTiming[HFRONTPORCH] + columnDelta,
+ displayTiming[2],
+ displayTiming[3],
+ displayTiming[4],
+ displayTiming[VFRONTPORCH] + lineDelta,
+ displayTiming[6],
+ displayTiming[7],
+ displayTiming[PIXELCLOCK],
+ displayTiming[9]
+ );
+
+ totalColumns = displayTiming[HACTIVE] + displayTiming[HFRONTPORCH] + displayTiming[HSYNCWIDTH] + displayTiming[HBACKPORCH];
+ totalLines = displayTiming[VACTIVE] + displayTiming[VFRONTPORCH] + displayTiming[VSYNCWIDTH] + displayTiming[VBACKPORCH];
+ pixelClock = 1000 * displayTiming[PIXELCLOCK]; // Pixels/s
+ displayFreqCruise = (DOUBLE)pixelClock / (totalLines * totalColumns); // Frames/s
+ displayFreqSlower = (DOUBLE)pixelClock / ((totalLines + lineDelta) * (totalColumns + columnDelta));
+ displayFreqFaster = (DOUBLE)pixelClock / ((totalLines - lineDelta) * (totalColumns - columnDelta));
+ curDisplayFreq = displayFreqCruise;
+ GlobalDeleteAtom(getTiming);
+ adjDelta = 0;
+ powerstripTimingExists = TRUE;
+ return S_OK;
}
// Reset display timing parameters to nominal.
HRESULT CGenlock::ResetTiming()
{
- LPARAM lParam = NULL;
- WPARAM wParam = monitor;
- ATOM setTiming;
- LRESULT ret;
- CAutoLock lock(&csGenlockLock);
+ LPARAM lParam = NULL;
+ WPARAM wParam = monitor;
+ ATOM setTiming;
+ LRESULT ret;
+ CAutoLock lock(&csGenlockLock);
- if (!PowerstripRunning()) {
- return E_FAIL;
- }
+ if (!PowerstripRunning()) {
+ return E_FAIL;
+ }
- if (displayAdjustmentsMade > 0) {
- setTiming = GlobalAddAtom(cruise);
- lParam = setTiming;
- ret = SendMessage(psWnd, UM_SETCUSTOMTIMINGFAST, wParam, lParam);
- GlobalDeleteAtom(setTiming);
- curDisplayFreq = displayFreqCruise;
- }
- adjDelta = 0;
- return S_OK;
+ if (displayAdjustmentsMade > 0) {
+ setTiming = GlobalAddAtom(cruise);
+ lParam = setTiming;
+ ret = SendMessage(psWnd, UM_SETCUSTOMTIMINGFAST, wParam, lParam);
+ GlobalDeleteAtom(setTiming);
+ curDisplayFreq = displayFreqCruise;
+ }
+ adjDelta = 0;
+ return S_OK;
}
// Reset reference clock speed to nominal.
HRESULT CGenlock::ResetClock()
{
- adjDelta = 0;
- if (syncClock == NULL) {
- return E_FAIL;
- } else {
- return syncClock->AdjustClock(1.0);
- }
+ adjDelta = 0;
+ if (syncClock == NULL) {
+ return E_FAIL;
+ } else {
+ return syncClock->AdjustClock(1.0);
+ }
}
HRESULT CGenlock::SetTargetSyncOffset(DOUBLE targetD)
{
- targetSyncOffset = targetD;
- lowSyncOffset = targetD - controlLimit;
- highSyncOffset = targetD + controlLimit;
- return S_OK;
+ targetSyncOffset = targetD;
+ lowSyncOffset = targetD - controlLimit;
+ highSyncOffset = targetD + controlLimit;
+ return S_OK;
}
-HRESULT CGenlock::GetTargetSyncOffset(DOUBLE *targetD)
+HRESULT CGenlock::GetTargetSyncOffset(DOUBLE* targetD)
{
- *targetD = targetSyncOffset;
- return S_OK;
+ *targetD = targetSyncOffset;
+ return S_OK;
}
HRESULT CGenlock::SetControlLimit(DOUBLE cL)
{
- controlLimit = cL;
- return S_OK;
+ controlLimit = cL;
+ return S_OK;
}
-HRESULT CGenlock::GetControlLimit(DOUBLE *cL)
+HRESULT CGenlock::GetControlLimit(DOUBLE* cL)
{
- *cL = controlLimit;
- return S_OK;
+ *cL = controlLimit;
+ return S_OK;
}
HRESULT CGenlock::SetDisplayResolution(UINT columns, UINT lines)
{
- visibleColumns = columns;
- visibleLines = lines;
- return S_OK;
+ visibleColumns = columns;
+ visibleLines = lines;
+ return S_OK;
}
HRESULT CGenlock::AdviseSyncClock(ISyncClock* sC)
{
- if (!sC) {
- return E_FAIL;
- }
- if (syncClock) {
- syncClock = NULL; // Release any outstanding references if this is called repeatedly
- }
- syncClock = sC;
- return S_OK;
+ if (!sC) {
+ return E_FAIL;
+ }
+ if (syncClock) {
+ syncClock = NULL; // Release any outstanding references if this is called repeatedly
+ }
+ syncClock = sC;
+ return S_OK;
}
// Set the monitor to control. This is best done manually as not all monitors can be controlled
@@ -4379,141 +4382,141 @@ HRESULT CGenlock::AdviseSyncClock(ISyncClock* sC)
// The PowerStrip API uses zero-based monitor numbers, i.e. the default monitor is 0.
HRESULT CGenlock::SetMonitor(UINT mon)
{
- monitor = mon;
- return S_OK;
+ monitor = mon;
+ return S_OK;
}
HRESULT CGenlock::ResetStats()
{
- CAutoLock lock(&csGenlockLock);
- minSyncOffset = 1000000.0;
- maxSyncOffset = -1000000.0;
- minFrameCycle = 1000000.0;
- maxFrameCycle = -1000000.0;
- displayAdjustmentsMade = 0;
- clockAdjustmentsMade = 0;
- return S_OK;
+ CAutoLock lock(&csGenlockLock);
+ minSyncOffset = 1000000.0;
+ maxSyncOffset = -1000000.0;
+ minFrameCycle = 1000000.0;
+ maxFrameCycle = -1000000.0;
+ displayAdjustmentsMade = 0;
+ clockAdjustmentsMade = 0;
+ return S_OK;
}
// Synchronize by adjusting display refresh rate
HRESULT CGenlock::ControlDisplay(double syncOffset, double frameCycle)
{
- LPARAM lParam = NULL;
- WPARAM wParam = monitor;
- ATOM setTiming;
-
- CRenderersSettings& s = GetRenderersSettings();
- targetSyncOffset = s.m_RenderSettings.fTargetSyncOffset;
- lowSyncOffset = targetSyncOffset - s.m_RenderSettings.fControlLimit;
- highSyncOffset = targetSyncOffset + s.m_RenderSettings.fControlLimit;
-
- syncOffsetAvg = syncOffsetFifo->Average(syncOffset);
- minSyncOffset = min(minSyncOffset, syncOffset);
- maxSyncOffset = max(maxSyncOffset, syncOffset);
- frameCycleAvg = frameCycleFifo->Average(frameCycle);
- minFrameCycle = min(minFrameCycle, frameCycle);
- maxFrameCycle = max(maxFrameCycle, frameCycle);
-
- if (!PowerstripRunning() || !powerstripTimingExists) {
- return E_FAIL;
- }
- // Adjust as seldom as possible by checking the current controlState before changing it.
- if ((syncOffsetAvg > highSyncOffset) && (adjDelta != 1))
- // Speed up display refresh rate by subtracting pixels from the image.
- {
- adjDelta = 1; // Increase refresh rate
- curDisplayFreq = displayFreqFaster;
- setTiming = GlobalAddAtom(faster);
- lParam = setTiming;
- SendMessage(psWnd, UM_SETCUSTOMTIMINGFAST, wParam, lParam);
- GlobalDeleteAtom(setTiming);
- displayAdjustmentsMade++;
- } else
- // Slow down display refresh rate by adding pixels to the image.
- if ((syncOffsetAvg < lowSyncOffset) && (adjDelta != -1)) {
- adjDelta = -1;
- curDisplayFreq = displayFreqSlower;
- setTiming = GlobalAddAtom(slower);
- lParam = setTiming;
- SendMessage(psWnd, UM_SETCUSTOMTIMINGFAST, wParam, lParam);
- GlobalDeleteAtom(setTiming);
- displayAdjustmentsMade++;
- } else
- // Cruise.
- if ((syncOffsetAvg < targetSyncOffset) && (adjDelta == 1)) {
- adjDelta = 0;
- curDisplayFreq = displayFreqCruise;
- setTiming = GlobalAddAtom(cruise);
- lParam = setTiming;
- SendMessage(psWnd, UM_SETCUSTOMTIMINGFAST, wParam, lParam);
- GlobalDeleteAtom(setTiming);
- displayAdjustmentsMade++;
- } else if ((syncOffsetAvg > targetSyncOffset) && (adjDelta == -1)) {
- adjDelta = 0;
- curDisplayFreq = displayFreqCruise;
- setTiming = GlobalAddAtom(cruise);
- lParam = setTiming;
- SendMessage(psWnd, UM_SETCUSTOMTIMINGFAST, wParam, lParam);
- GlobalDeleteAtom(setTiming);
- displayAdjustmentsMade++;
- }
- return S_OK;
+ LPARAM lParam = NULL;
+ WPARAM wParam = monitor;
+ ATOM setTiming;
+
+ CRenderersSettings& s = GetRenderersSettings();
+ targetSyncOffset = s.m_RenderSettings.fTargetSyncOffset;
+ lowSyncOffset = targetSyncOffset - s.m_RenderSettings.fControlLimit;
+ highSyncOffset = targetSyncOffset + s.m_RenderSettings.fControlLimit;
+
+ syncOffsetAvg = syncOffsetFifo->Average(syncOffset);
+ minSyncOffset = min(minSyncOffset, syncOffset);
+ maxSyncOffset = max(maxSyncOffset, syncOffset);
+ frameCycleAvg = frameCycleFifo->Average(frameCycle);
+ minFrameCycle = min(minFrameCycle, frameCycle);
+ maxFrameCycle = max(maxFrameCycle, frameCycle);
+
+ if (!PowerstripRunning() || !powerstripTimingExists) {
+ return E_FAIL;
+ }
+ // Adjust as seldom as possible by checking the current controlState before changing it.
+ if ((syncOffsetAvg > highSyncOffset) && (adjDelta != 1))
+ // Speed up display refresh rate by subtracting pixels from the image.
+ {
+ adjDelta = 1; // Increase refresh rate
+ curDisplayFreq = displayFreqFaster;
+ setTiming = GlobalAddAtom(faster);
+ lParam = setTiming;
+ SendMessage(psWnd, UM_SETCUSTOMTIMINGFAST, wParam, lParam);
+ GlobalDeleteAtom(setTiming);
+ displayAdjustmentsMade++;
+ } else
+ // Slow down display refresh rate by adding pixels to the image.
+ if ((syncOffsetAvg < lowSyncOffset) && (adjDelta != -1)) {
+ adjDelta = -1;
+ curDisplayFreq = displayFreqSlower;
+ setTiming = GlobalAddAtom(slower);
+ lParam = setTiming;
+ SendMessage(psWnd, UM_SETCUSTOMTIMINGFAST, wParam, lParam);
+ GlobalDeleteAtom(setTiming);
+ displayAdjustmentsMade++;
+ } else
+ // Cruise.
+ if ((syncOffsetAvg < targetSyncOffset) && (adjDelta == 1)) {
+ adjDelta = 0;
+ curDisplayFreq = displayFreqCruise;
+ setTiming = GlobalAddAtom(cruise);
+ lParam = setTiming;
+ SendMessage(psWnd, UM_SETCUSTOMTIMINGFAST, wParam, lParam);
+ GlobalDeleteAtom(setTiming);
+ displayAdjustmentsMade++;
+ } else if ((syncOffsetAvg > targetSyncOffset) && (adjDelta == -1)) {
+ adjDelta = 0;
+ curDisplayFreq = displayFreqCruise;
+ setTiming = GlobalAddAtom(cruise);
+ lParam = setTiming;
+ SendMessage(psWnd, UM_SETCUSTOMTIMINGFAST, wParam, lParam);
+ GlobalDeleteAtom(setTiming);
+ displayAdjustmentsMade++;
+ }
+ return S_OK;
}
// Synchronize by adjusting reference clock rate (and therefore video FPS).
// Todo: check so that we don't have a live source
HRESULT CGenlock::ControlClock(double syncOffset, double frameCycle)
{
- CRenderersSettings& s = GetRenderersSettings();
- targetSyncOffset = s.m_RenderSettings.fTargetSyncOffset;
- lowSyncOffset = targetSyncOffset - s.m_RenderSettings.fControlLimit;
- highSyncOffset = targetSyncOffset + s.m_RenderSettings.fControlLimit;
-
- syncOffsetAvg = syncOffsetFifo->Average(syncOffset);
- minSyncOffset = min(minSyncOffset, syncOffset);
- maxSyncOffset = max(maxSyncOffset, syncOffset);
- frameCycleAvg = frameCycleFifo->Average(frameCycle);
- minFrameCycle = min(minFrameCycle, frameCycle);
- maxFrameCycle = max(maxFrameCycle, frameCycle);
-
- if (!syncClock) {
- return E_FAIL;
- }
- // Adjust as seldom as possible by checking the current controlState before changing it.
- if ((syncOffsetAvg > highSyncOffset) && (adjDelta != 1))
- // Slow down video stream.
- {
- adjDelta = 1;
- syncClock->AdjustClock(1.0 - cycleDelta); // Makes the clock move slower by providing smaller increments
- clockAdjustmentsMade++;
- } else
- // Speed up video stream.
- if ((syncOffsetAvg < lowSyncOffset) && (adjDelta != -1)) {
- adjDelta = -1;
- syncClock->AdjustClock(1.0 + cycleDelta);
- clockAdjustmentsMade++;
- } else
- // Cruise.
- if ((syncOffsetAvg < targetSyncOffset) && (adjDelta == 1)) {
- adjDelta = 0;
- syncClock->AdjustClock(1.0);
- clockAdjustmentsMade++;
- } else if ((syncOffsetAvg > targetSyncOffset) && (adjDelta == -1)) {
- adjDelta = 0;
- syncClock->AdjustClock(1.0);
- clockAdjustmentsMade++;
- }
- return S_OK;
+ CRenderersSettings& s = GetRenderersSettings();
+ targetSyncOffset = s.m_RenderSettings.fTargetSyncOffset;
+ lowSyncOffset = targetSyncOffset - s.m_RenderSettings.fControlLimit;
+ highSyncOffset = targetSyncOffset + s.m_RenderSettings.fControlLimit;
+
+ syncOffsetAvg = syncOffsetFifo->Average(syncOffset);
+ minSyncOffset = min(minSyncOffset, syncOffset);
+ maxSyncOffset = max(maxSyncOffset, syncOffset);
+ frameCycleAvg = frameCycleFifo->Average(frameCycle);
+ minFrameCycle = min(minFrameCycle, frameCycle);
+ maxFrameCycle = max(maxFrameCycle, frameCycle);
+
+ if (!syncClock) {
+ return E_FAIL;
+ }
+ // Adjust as seldom as possible by checking the current controlState before changing it.
+ if ((syncOffsetAvg > highSyncOffset) && (adjDelta != 1))
+ // Slow down video stream.
+ {
+ adjDelta = 1;
+ syncClock->AdjustClock(1.0 - cycleDelta); // Makes the clock move slower by providing smaller increments
+ clockAdjustmentsMade++;
+ } else
+ // Speed up video stream.
+ if ((syncOffsetAvg < lowSyncOffset) && (adjDelta != -1)) {
+ adjDelta = -1;
+ syncClock->AdjustClock(1.0 + cycleDelta);
+ clockAdjustmentsMade++;
+ } else
+ // Cruise.
+ if ((syncOffsetAvg < targetSyncOffset) && (adjDelta == 1)) {
+ adjDelta = 0;
+ syncClock->AdjustClock(1.0);
+ clockAdjustmentsMade++;
+ } else if ((syncOffsetAvg > targetSyncOffset) && (adjDelta == -1)) {
+ adjDelta = 0;
+ syncClock->AdjustClock(1.0);
+ clockAdjustmentsMade++;
+ }
+ return S_OK;
}
// Don't adjust anything, just update the syncOffset stats
HRESULT CGenlock::UpdateStats(double syncOffset, double frameCycle)
{
- syncOffsetAvg = syncOffsetFifo->Average(syncOffset);
- minSyncOffset = min(minSyncOffset, syncOffset);
- maxSyncOffset = max(maxSyncOffset, syncOffset);
- frameCycleAvg = frameCycleFifo->Average(frameCycle);
- minFrameCycle = min(minFrameCycle, frameCycle);
- maxFrameCycle = max(maxFrameCycle, frameCycle);
- return S_OK;
+ syncOffsetAvg = syncOffsetFifo->Average(syncOffset);
+ minSyncOffset = min(minSyncOffset, syncOffset);
+ maxSyncOffset = max(maxSyncOffset, syncOffset);
+ frameCycleAvg = frameCycleFifo->Average(frameCycle);
+ minFrameCycle = min(minFrameCycle, frameCycle);
+ maxFrameCycle = max(maxFrameCycle, frameCycle);
+ return S_OK;
} \ No newline at end of file
diff --git a/src/filters/renderer/VideoRenderers/SyncRenderer.h b/src/filters/renderer/VideoRenderers/SyncRenderer.h
index 337defcd9..fed422851 100644
--- a/src/filters/renderer/VideoRenderers/SyncRenderer.h
+++ b/src/filters/renderer/VideoRenderers/SyncRenderer.h
@@ -76,610 +76,610 @@ static const GUID GUID_SURFACE_INDEX = { 0x30c8e9f6, 0x415, 0x4b81, { 0xa3, 0x15
namespace GothSync
{
- typedef enum {
- MSG_MIXERIN,
- MSG_MIXEROUT,
- MSG_ERROR
- } EVR_STATS_MSG;
+ typedef enum {
+ MSG_MIXERIN,
+ MSG_MIXEROUT,
+ MSG_ERROR
+ } EVR_STATS_MSG;
#pragma pack(push, 1)
- template<int texcoords>
- struct MYD3DVERTEX {
- float x, y, z, rhw;
- struct {
- float u, v;
- } t[texcoords];
- };
+ template<int texcoords>
+ struct MYD3DVERTEX {
+ float x, y, z, rhw;
+ struct {
+ float u, v;
+ } t[texcoords];
+ };
- template<>
- struct MYD3DVERTEX<0> {
- float x, y, z, rhw;
- DWORD Diffuse;
- };
+ template<>
+ struct MYD3DVERTEX<0> {
+ float x, y, z, rhw;
+ DWORD Diffuse;
+ };
#pragma pack(pop)
- class CGenlock;
- class CSyncRenderer;
-
- // Base allocator-presenter
- class CBaseAP:
- public CSubPicAllocatorPresenterImpl
- {
- protected:
- CRenderersSettings::CRendererSettingsEVR m_LastRendererSettings;
-
- HMODULE m_hDWMAPI;
- HRESULT (__stdcall * m_pDwmIsCompositionEnabled)(__out BOOL* pfEnabled);
- HRESULT (__stdcall * m_pDwmEnableComposition)(UINT uCompositionAction);
- HMODULE m_hD3D9;
- HRESULT (__stdcall * m_pDirect3DCreate9Ex)(UINT SDKVersion, IDirect3D9Ex**);
-
- CCritSec m_allocatorLock;
- CComPtr<IDirect3D9Ex> m_pD3DEx;
- CComPtr<IDirect3D9> m_pD3D;
- CComPtr<IDirect3DDevice9Ex> m_pD3DDevEx;
- CComPtr<IDirect3DDevice9> m_pD3DDev;
-
- CComPtr<IDirect3DTexture9> m_pVideoTexture[MAX_PICTURE_SLOTS];
- CComPtr<IDirect3DSurface9> m_pVideoSurface[MAX_PICTURE_SLOTS];
- CComPtr<IDirect3DTexture9> m_pOSDTexture;
- CComPtr<IDirect3DSurface9> m_pOSDSurface;
- CComPtr<ID3DXLine> m_pLine;
- CComPtr<ID3DXFont> m_pFont;
- CComPtr<ID3DXSprite> m_pSprite;
- CSyncRenderer *m_pOuterEVR;
-
- class CExternalPixelShader
- {
- public:
- CComPtr<IDirect3DPixelShader9> m_pPixelShader;
- CStringA m_SourceData;
- CStringA m_SourceTarget;
- HRESULT Compile(CPixelShaderCompiler *pCompiler) {
- HRESULT hr = pCompiler->CompileShader(m_SourceData, "main", m_SourceTarget, 0, &m_pPixelShader);
- if (FAILED(hr)) {
- return hr;
- }
- return S_OK;
- }
- };
-
- CAutoPtr<CPixelShaderCompiler> m_pPSC;
- CAtlList<CExternalPixelShader> m_pPixelShaders;
- CAtlList<CExternalPixelShader> m_pPixelShadersScreenSpace;
- CComPtr<IDirect3DPixelShader9> m_pResizerPixelShader[4]; // bl, bc1, bc2_1, bc2_2
- CComPtr<IDirect3DTexture9> m_pScreenSizeTemporaryTexture[2];
-
- D3DFORMAT m_SurfaceType;
- D3DFORMAT m_BackbufferType;
- D3DFORMAT m_DisplayType;
- D3DTEXTUREFILTERTYPE m_filter;
- D3DCAPS9 m_caps;
- D3DPRESENT_PARAMETERS pp;
-
- bool SettingsNeedResetDevice();
- void SendResetRequest();
- virtual HRESULT CreateDXDevice(CString &_Error);
- virtual HRESULT ResetDXDevice(CString &_Error);
- virtual HRESULT AllocSurfaces(D3DFORMAT Format = D3DFMT_A8R8G8B8);
- virtual void DeleteSurfaces();
-
- HANDLE m_hEvtQuit; // Stop rendering thread event
- LONGLONG m_LastAdapterCheck;
- UINT m_CurrentAdapter;
- UINT GetAdapter(IDirect3D9 *pD3D);
-
- float m_bicubicA;
- HRESULT InitResizers(float bicubicA, bool bNeedScreenSizeTexture);
-
- // Functions to trace timing performance
- void SyncStats(LONGLONG syncTime);
- void SyncOffsetStats(LONGLONG syncOffset);
- void DrawText(const RECT &rc, const CString &strText, int _Priority);
- void DrawStats();
-
- template<int texcoords>
- void AdjustQuad(MYD3DVERTEX<texcoords>* v, double dx, double dy);
- template<int texcoords>
- HRESULT TextureBlt(IDirect3DDevice9* pD3DDev, MYD3DVERTEX<texcoords> v[4], D3DTEXTUREFILTERTYPE filter);
- MFOffset GetOffset(float v);
- MFVideoArea GetArea(float x, float y, DWORD width, DWORD height);
- bool ClipToSurface(IDirect3DSurface9* pSurface, CRect& s, CRect& d);
-
- HRESULT DrawRectBase(IDirect3DDevice9* pD3DDev, MYD3DVERTEX<0> v[4]);
- HRESULT DrawRect(DWORD _Color, DWORD _Alpha, const CRect &_Rect);
- HRESULT TextureCopy(IDirect3DTexture9* pTexture);
- HRESULT TextureResize(IDirect3DTexture9* pTexture, Vector dst[4], D3DTEXTUREFILTERTYPE filter, const CRect &SrcRect);
- HRESULT TextureResizeBilinear(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &SrcRect);
- HRESULT TextureResizeBicubic1pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &SrcRect);
- HRESULT TextureResizeBicubic2pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect &SrcRect);
-
- typedef HRESULT (WINAPI * D3DXLoadSurfaceFromMemoryPtr)(
- LPDIRECT3DSURFACE9 pDestSurface,
- CONST PALETTEENTRY* pDestPalette,
- CONST RECT* pDestRect,
- LPCVOID pSrcMemory,
- D3DFORMAT SrcFormat,
- UINT SrcPitch,
- CONST PALETTEENTRY* pSrcPalette,
- CONST RECT* pSrcRect,
- DWORD Filter,
- D3DCOLOR ColorKey);
-
- typedef HRESULT (WINAPI* D3DXCreateLinePtr)
- (LPDIRECT3DDEVICE9 pDevice,
- LPD3DXLINE* ppLine);
-
- typedef HRESULT (WINAPI* D3DXCreateFontPtr)(
- LPDIRECT3DDEVICE9 pDevice,
- int Height,
- UINT Width,
- UINT Weight,
- UINT MipLevels,
- bool Italic,
- DWORD CharSet,
- DWORD OutputPrecision,
- DWORD Quality,
- DWORD PitchAndFamily,
- LPCWSTR pFaceName,
- LPD3DXFONT* ppFont);
-
- HRESULT AlphaBlt(RECT* pSrc, RECT* pDst, IDirect3DTexture9* pTexture);
-
- virtual void OnResetDevice() {};
-
- int m_nTearingPos;
- VMR9AlphaBitmap m_VMR9AlphaBitmap;
- CAutoVectorPtr<BYTE> m_VMR9AlphaBitmapData;
- CRect m_VMR9AlphaBitmapRect;
- int m_VMR9AlphaBitmapWidthBytes;
-
- D3DXLoadSurfaceFromMemoryPtr m_pD3DXLoadSurfaceFromMemory;
- D3DXCreateLinePtr m_pD3DXCreateLine;
- D3DXCreateFontPtr m_pD3DXCreateFont;
- HRESULT (__stdcall *m_pD3DXCreateSprite)(LPDIRECT3DDEVICE9 pDevice, LPD3DXSPRITE * ppSprite);
-
- int m_nDXSurface; // Total number of DX Surfaces
- int m_nVMR9Surfaces;
- int m_iVMR9Surface;
- int m_nCurSurface; // Surface currently displayed
- long m_nUsedBuffer;
-
- LONG m_lNextSampleWait; // Waiting time for next sample in EVR
- bool m_bSnapToVSync; // True if framerate is low enough so that snap to vsync makes sense
-
- UINT m_uScanLineEnteringPaint; // The active scan line when entering Paint()
- REFERENCE_TIME m_llEstVBlankTime; // Next vblank start time in reference clock "coordinates"
-
- double m_fAvrFps; // Estimate the true FPS as given by the distance between vsyncs when a frame has been presented
- double m_fJitterStdDev; // VSync estimate std dev
- double m_fJitterMean; // Mean time between two syncpulses when a frame has been presented (i.e. when Paint() has been called
-
- double m_fSyncOffsetAvr; // Mean time between the call of Paint() and vsync. To avoid tearing this should be several ms at least
- double m_fSyncOffsetStdDev; // The std dev of the above
-
- bool m_bHighColorResolution;
- bool m_bCompositionEnabled;
- bool m_bDesktopCompositionDisabled;
- bool m_bIsFullscreen;
- bool m_bNeedCheckSample;
- DWORD m_dMainThreadId;
-
- CSize m_ScreenSize;
-
- // Display and frame rates and cycles
- double m_dDetectedScanlineTime; // Time for one (horizontal) scan line. Extracted at stream start and used to calculate vsync time
- UINT m_uD3DRefreshRate; // As got when creating the d3d device
- double m_dD3DRefreshCycle; // Display refresh cycle ms
- double m_dEstRefreshCycle; // As estimated from scan lines
- double m_dFrameCycle; // Average sample time, extracted from the samples themselves
- // double m_fps is defined in ISubPic.h
- double m_dOptimumDisplayCycle; // The display cycle that is closest to the frame rate. A multiple of the actual display cycle
- double m_dCycleDifference; // Difference in video and display cycle time relative to the video cycle time
-
- UINT m_pcFramesDropped;
- UINT m_pcFramesDuplicated;
- UINT m_pcFramesDrawn;
-
- LONGLONG m_pllJitter [NB_JITTER]; // Vertical sync time stats
- LONGLONG m_pllSyncOffset [NB_JITTER]; // Sync offset time stats
- int m_nNextJitter;
- int m_nNextSyncOffset;
- LONGLONG m_JitterStdDev;
-
- LONGLONG m_llLastSyncTime;
-
- LONGLONG m_MaxJitter;
- LONGLONG m_MinJitter;
- LONGLONG m_MaxSyncOffset;
- LONGLONG m_MinSyncOffset;
- UINT m_uSyncGlitches;
-
- LONGLONG m_llSampleTime, m_llLastSampleTime; // Present time for the current sample
- LONG m_lSampleLatency, m_lLastSampleLatency; // Time between intended and actual presentation time
- LONG m_lMinSampleLatency, m_lLastMinSampleLatency;
- LONGLONG m_llHysteresis;
- LONG m_lHysteresis;
- LONG m_lShiftToNearest, m_lShiftToNearestPrev;
- bool m_bVideoSlowerThanDisplay;
-
- int m_bInterlaced;
- double m_TextScale;
- CString m_strStatsMsg[10];
-
- CGenlock *m_pGenlock; // The video - display synchronizer class
- CComPtr<IReferenceClock> m_pRefClock; // The reference clock. Used in Paint()
- CComPtr<IAMAudioRendererStats> m_pAudioStats; // Audio statistics from audio renderer. To check so that audio is in sync
- DWORD m_lAudioLag; // Time difference between audio and video when the audio renderer is matching rate to the external reference clock
- long m_lAudioLagMin, m_lAudioLagMax; // The accumulated difference between the audio renderer and the master clock
- DWORD m_lAudioSlaveMode; // To check whether the audio renderer matches rate with SyncClock (returns the value 4 if it does)
-
- double GetRefreshRate(); // Get the best estimate of the display refresh rate in Hz
- double GetDisplayCycle(); // Get the best estimate of the display cycle time in milliseconds
- double GetCycleDifference(); // Get the difference in video and display cycle times.
- void EstimateRefreshTimings(); // Estimate the times for one scan line and one frame respectively from the actual refresh data
- bool ExtractInterlaced(const AM_MEDIA_TYPE* pmt);
-
- public:
- CBaseAP(HWND hWnd, bool bFullscreen, HRESULT& hr, CString &_Error);
- ~CBaseAP();
-
- CCritSec m_VMR9AlphaBitmapLock;
- void UpdateAlphaBitmap();
- void ResetStats();
-
- // ISubPicAllocatorPresenter
- STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
- STDMETHODIMP_(bool) Paint(bool fAll);
- STDMETHODIMP GetDIB(BYTE* lpDib, DWORD* size);
- STDMETHODIMP SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget);
- STDMETHODIMP SetPixelShader2(LPCSTR pSrcData, LPCSTR pTarget, bool bScreenSpace);
- STDMETHODIMP_(bool) ResetDevice();
- STDMETHODIMP_(bool) DisplayChange();
- };
-
- class CSyncAP:
- public CBaseAP,
- public IMFGetService,
- public IMFTopologyServiceLookupClient,
- public IMFVideoDeviceID,
- public IMFVideoPresenter,
- public IDirect3DDeviceManager9,
- public IMFAsyncCallback,
- public IQualProp,
- public IMFRateSupport,
- public IMFVideoDisplayControl,
- public IEVRTrustedVideoPlugin,
- public ISyncClockAdviser
-
- {
- public:
- CSyncAP(HWND hWnd, bool bFullscreen, HRESULT& hr, CString &_Error);
- ~CSyncAP(void);
-
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
- STDMETHODIMP_(bool) Paint(bool fAll);
- STDMETHODIMP GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight);
- STDMETHODIMP InitializeDevice(AM_MEDIA_TYPE* pMediaType);
- STDMETHODIMP_(bool) ResetDevice();
-
- // IMFClockStateSink
- STDMETHODIMP OnClockStart(MFTIME hnsSystemTime, LONGLONG llClockStartOffset);
- STDMETHODIMP OnClockStop(MFTIME hnsSystemTime);
- STDMETHODIMP OnClockPause(MFTIME hnsSystemTime);
- STDMETHODIMP OnClockRestart(MFTIME hnsSystemTime);
- STDMETHODIMP OnClockSetRate(MFTIME hnsSystemTime, float flRate);
-
- // IBaseFilter delegate
- bool GetState( DWORD dwMilliSecsTimeout, FILTER_STATE *State, HRESULT &_ReturnValue);
-
- // IQualProp (EVR statistics window). These are incompletely implemented currently
- STDMETHODIMP get_FramesDroppedInRenderer(int *pcFrames);
- STDMETHODIMP get_FramesDrawn(int *pcFramesDrawn);
- STDMETHODIMP get_AvgFrameRate(int *piAvgFrameRate);
- STDMETHODIMP get_Jitter(int *iJitter);
- STDMETHODIMP get_AvgSyncOffset(int *piAvg);
- STDMETHODIMP get_DevSyncOffset(int *piDev);
-
- // IMFRateSupport
- STDMETHODIMP GetSlowestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float *pflRate);
- STDMETHODIMP GetFastestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float *pflRate);
- STDMETHODIMP IsRateSupported(BOOL fThin, float flRate, float *pflNearestSupportedRate);
- float GetMaxRate(BOOL bThin);
-
- // IMFVideoPresenter
- STDMETHODIMP ProcessMessage(MFVP_MESSAGE_TYPE eMessage, ULONG_PTR ulParam);
- STDMETHODIMP GetCurrentMediaType(__deref_out IMFVideoMediaType **ppMediaType);
-
- // IMFTopologyServiceLookupClient
- STDMETHODIMP InitServicePointers(__in IMFTopologyServiceLookup *pLookup);
- STDMETHODIMP ReleaseServicePointers();
-
- // IMFVideoDeviceID
- STDMETHODIMP GetDeviceID(__out IID *pDeviceID);
-
- // IMFGetService
- STDMETHODIMP GetService (__RPC__in REFGUID guidService, __RPC__in REFIID riid, __RPC__deref_out_opt LPVOID *ppvObject);
-
- // IMFAsyncCallback
- STDMETHODIMP GetParameters(__RPC__out DWORD *pdwFlags, /* [out] */ __RPC__out DWORD *pdwQueue);
- STDMETHODIMP Invoke(__RPC__in_opt IMFAsyncResult *pAsyncResult);
-
- // IMFVideoDisplayControl
- STDMETHODIMP GetNativeVideoSize(SIZE *pszVideo, SIZE *pszARVideo);
- STDMETHODIMP GetIdealVideoSize(SIZE *pszMin, SIZE *pszMax);
- STDMETHODIMP SetVideoPosition(const MFVideoNormalizedRect *pnrcSource, const LPRECT prcDest);
- STDMETHODIMP GetVideoPosition(MFVideoNormalizedRect *pnrcSource, LPRECT prcDest);
- STDMETHODIMP SetAspectRatioMode(DWORD dwAspectRatioMode);
- STDMETHODIMP GetAspectRatioMode(DWORD *pdwAspectRatioMode);
- STDMETHODIMP SetVideoWindow(HWND hwndVideo);
- STDMETHODIMP GetVideoWindow(HWND *phwndVideo);
- STDMETHODIMP RepaintVideo( void);
- STDMETHODIMP GetCurrentImage(BITMAPINFOHEADER *pBih, BYTE **pDib, DWORD *pcbDib, LONGLONG *pTimeStamp);
- STDMETHODIMP SetBorderColor(COLORREF Clr);
- STDMETHODIMP GetBorderColor(COLORREF *pClr);
- STDMETHODIMP SetRenderingPrefs(DWORD dwRenderFlags);
- STDMETHODIMP GetRenderingPrefs(DWORD *pdwRenderFlags);
- STDMETHODIMP SetFullscreen(BOOL fFullscreen);
- STDMETHODIMP GetFullscreen(BOOL *pfFullscreen);
-
- // IEVRTrustedVideoPlugin
- STDMETHODIMP IsInTrustedVideoMode(BOOL *pYes);
- STDMETHODIMP CanConstrict(BOOL *pYes);
- STDMETHODIMP SetConstriction(DWORD dwKPix);
- STDMETHODIMP DisableImageExport(BOOL bDisable);
-
- // IDirect3DDeviceManager9
- STDMETHODIMP ResetDevice(IDirect3DDevice9 *pDevice,UINT resetToken);
- STDMETHODIMP OpenDeviceHandle(HANDLE *phDevice);
- STDMETHODIMP CloseDeviceHandle(HANDLE hDevice);
- STDMETHODIMP TestDevice(HANDLE hDevice);
- STDMETHODIMP LockDevice(HANDLE hDevice, IDirect3DDevice9 **ppDevice, BOOL fBlock);
- STDMETHODIMP UnlockDevice(HANDLE hDevice, BOOL fSaveState);
- STDMETHODIMP GetVideoService(HANDLE hDevice, REFIID riid, void **ppService);
-
- protected:
- void OnResetDevice();
- MFCLOCK_STATE m_LastClockState;
-
- private:
- // dxva.dll
- typedef HRESULT (__stdcall *PTR_DXVA2CreateDirect3DDeviceManager9)(UINT* pResetToken, IDirect3DDeviceManager9** ppDeviceManager);
- // mf.dll
- typedef HRESULT (__stdcall *PTR_MFCreatePresentationClock)(IMFPresentationClock** ppPresentationClock);
- // evr.dll
- typedef HRESULT (__stdcall *PTR_MFCreateDXSurfaceBuffer)(REFIID riid, IUnknown* punkSurface, BOOL fBottomUpWhenLinear, IMFMediaBuffer** ppBuffer);
- typedef HRESULT (__stdcall *PTR_MFCreateVideoSampleFromSurface)(IUnknown* pUnkSurface, IMFSample** ppSample);
- typedef HRESULT (__stdcall *PTR_MFCreateVideoMediaType)(const MFVIDEOFORMAT* pVideoFormat, IMFVideoMediaType** ppIVideoMediaType);
- // avrt.dll
- typedef HANDLE (__stdcall *PTR_AvSetMmThreadCharacteristicsW)(LPCWSTR TaskName, LPDWORD TaskIndex);
- typedef BOOL (__stdcall *PTR_AvSetMmThreadPriority)(HANDLE AvrtHandle, AVRT_PRIORITY Priority);
- typedef BOOL (__stdcall *PTR_AvRevertMmThreadCharacteristics)(HANDLE AvrtHandle);
-
- typedef enum {
- Started = State_Running,
- Stopped = State_Stopped,
- Paused = State_Paused,
- Shutdown = State_Running + 1
- } RENDER_STATE;
-
- CComPtr<IMFClock> m_pClock;
- CComPtr<IDirect3DDeviceManager9> m_pD3DManager;
- CComPtr<IMFTransform> m_pMixer;
- CComPtr<IMediaEventSink> m_pSink;
- CComPtr<IMFVideoMediaType> m_pMediaType;
- MFVideoAspectRatioMode m_dwVideoAspectRatioMode;
- MFVideoRenderPrefs m_dwVideoRenderPrefs;
- COLORREF m_BorderColor;
-
- HANDLE m_hEvtQuit; // Stop rendering thread event
- bool m_bEvtQuit;
- HANDLE m_hEvtFlush; // Discard all buffers
- bool m_bEvtFlush;
- HANDLE m_hEvtSkip; // Skip frame
- bool m_bEvtSkip;
-
- bool m_bUseInternalTimer;
- int32 m_LastSetOutputRange;
- bool m_bPendingRenegotiate;
- bool m_bPendingMediaFinished;
- bool m_bPrerolled; // true if first sample has been displayed.
-
- HANDLE m_hRenderThread;
- HANDLE m_hMixerThread;
- RENDER_STATE m_nRenderState;
- bool m_bStepping;
-
- CCritSec m_SampleQueueLock;
- CCritSec m_ImageProcessingLock;
-
- CInterfaceList<IMFSample, &IID_IMFSample> m_FreeSamples;
- CInterfaceList<IMFSample, &IID_IMFSample> m_ScheduledSamples;
- IMFSample *m_pCurrentDisplaydSample;
- UINT m_nResetToken;
- int m_nStepCount;
-
- bool GetSampleFromMixer();
- void MixerThread();
- static DWORD WINAPI MixerThreadStatic(LPVOID lpParam);
- void RenderThread();
- static DWORD WINAPI RenderThreadStatic(LPVOID lpParam);
-
- void StartWorkerThreads();
- void StopWorkerThreads();
- HRESULT CheckShutdown() const;
- void CompleteFrameStep(bool bCancel);
-
- void RemoveAllSamples();
- STDMETHODIMP AdviseSyncClock(ISyncClock* sC);
- HRESULT BeginStreaming();
- HRESULT GetFreeSample(IMFSample** ppSample);
- HRESULT GetScheduledSample(IMFSample** ppSample, int &_Count);
- void MoveToFreeList(IMFSample* pSample, bool bTail);
- void MoveToScheduledList(IMFSample* pSample, bool _bSorted);
- void FlushSamples();
- void FlushSamplesInternal();
-
- LONGLONG GetMediaTypeMerit(IMFMediaType *pMediaType);
- HRESULT RenegotiateMediaType();
- HRESULT IsMediaTypeSupported(IMFMediaType* pMixerType);
- HRESULT CreateProposedOutputType(IMFMediaType* pMixerType, IMFMediaType** pType);
- HRESULT SetMediaType(IMFMediaType* pType);
-
- // Functions pointers for Vista/.NET3 specific library
- PTR_DXVA2CreateDirect3DDeviceManager9 pfDXVA2CreateDirect3DDeviceManager9;
- PTR_MFCreateDXSurfaceBuffer pfMFCreateDXSurfaceBuffer;
- PTR_MFCreateVideoSampleFromSurface pfMFCreateVideoSampleFromSurface;
- PTR_MFCreateVideoMediaType pfMFCreateVideoMediaType;
-
- PTR_AvSetMmThreadCharacteristicsW pfAvSetMmThreadCharacteristicsW;
- PTR_AvSetMmThreadPriority pfAvSetMmThreadPriority;
- PTR_AvRevertMmThreadCharacteristics pfAvRevertMmThreadCharacteristics;
- };
-
- class CSyncRenderer:
- public CUnknown,
- public IVMRffdshow9,
- public IVMRMixerBitmap9,
- public IBaseFilter
- {
- CComPtr<IUnknown> m_pEVR;
- VMR9AlphaBitmap *m_pVMR9AlphaBitmap;
- CSyncAP *m_pAllocatorPresenter;
-
- public:
- CSyncRenderer(const TCHAR* pName, LPUNKNOWN pUnk, HRESULT& hr, VMR9AlphaBitmap* pVMR9AlphaBitmap, CSyncAP *pAllocatorPresenter);
- ~CSyncRenderer();
-
- // IBaseFilter
- virtual HRESULT STDMETHODCALLTYPE EnumPins(__out IEnumPins **ppEnum);
- virtual HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, __out IPin **ppPin);
- virtual HRESULT STDMETHODCALLTYPE QueryFilterInfo(__out FILTER_INFO *pInfo);
- virtual HRESULT STDMETHODCALLTYPE JoinFilterGraph(__in_opt IFilterGraph *pGraph, __in_opt LPCWSTR pName);
- virtual HRESULT STDMETHODCALLTYPE QueryVendorInfo(__out LPWSTR *pVendorInfo);
- virtual HRESULT STDMETHODCALLTYPE Stop(void);
- virtual HRESULT STDMETHODCALLTYPE Pause(void);
- virtual HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart);
- virtual HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, __out FILTER_STATE *State);
- virtual HRESULT STDMETHODCALLTYPE SetSyncSource(__in_opt IReferenceClock *pClock);
- virtual HRESULT STDMETHODCALLTYPE GetSyncSource(__deref_out_opt IReferenceClock **pClock);
- virtual HRESULT STDMETHODCALLTYPE GetClassID(__RPC__out CLSID *pClassID);
-
- // IVMRffdshow9
- virtual HRESULT STDMETHODCALLTYPE support_ffdshow();
-
- // IVMRMixerBitmap9
- STDMETHODIMP GetAlphaBitmapParameters(VMR9AlphaBitmap* pBmpParms);
- STDMETHODIMP SetAlphaBitmap(const VMR9AlphaBitmap* pBmpParms);
- STDMETHODIMP UpdateAlphaBitmapParameters(const VMR9AlphaBitmap* pBmpParms);
-
- DECLARE_IUNKNOWN;
- virtual HRESULT STDMETHODCALLTYPE NonDelegatingQueryInterface(REFIID riid, void** ppvObject);
- };
-
- class CGenlock
- {
- public:
- class MovingAverage
- {
- public:
- MovingAverage(INT size):
- fifoSize(size),
- oldestSample(0),
- sum(0) {
- if (fifoSize > MAX_FIFO_SIZE) {
- fifoSize = MAX_FIFO_SIZE;
- }
- for (INT i = 0; i < MAX_FIFO_SIZE; i++) {
- fifo[i] = 0;
- }
- }
-
- ~MovingAverage() {
- }
-
- double Average(double sample) {
- sum = sum + sample - fifo[oldestSample];
- fifo[oldestSample] = sample;
- oldestSample++;
- if (oldestSample == fifoSize) {
- oldestSample = 0;
- }
- return sum / fifoSize;
- }
-
- private:
- INT fifoSize;
- double fifo[MAX_FIFO_SIZE];
- INT oldestSample;
- double sum;
- };
-
- CGenlock(DOUBLE target, DOUBLE limit, INT rowD, INT colD, DOUBLE clockD, UINT mon);
- ~CGenlock();
-
- BOOL PowerstripRunning(); // TRUE if PowerStrip is running
- HRESULT GetTiming(); // Get the string representing the display's current timing parameters
- HRESULT ResetTiming(); // Reset timing to what was last registered by GetTiming()
- HRESULT ResetClock(); // Reset reference clock speed to nominal
- HRESULT SetTargetSyncOffset(DOUBLE targetD);
- HRESULT GetTargetSyncOffset(DOUBLE *targetD);
- HRESULT SetControlLimit(DOUBLE cL);
- HRESULT GetControlLimit(DOUBLE *cL);
- HRESULT SetDisplayResolution(UINT columns, UINT lines);
- HRESULT AdviseSyncClock(ISyncClock* sC);
- HRESULT SetMonitor(UINT mon); // Set the number of the monitor to synchronize
- HRESULT ResetStats(); // Reset timing statistics
-
- HRESULT ControlDisplay(double syncOffset, double frameCycle); // Adjust the frequency of the display if needed
- HRESULT ControlClock(double syncOffset, double frameCycle); // Adjust the frequency of the clock if needed
- HRESULT UpdateStats(double syncOffset, double frameCycle); // Don't adjust anything, just update the syncOffset stats
-
- BOOL powerstripTimingExists; // TRUE if display timing has been got through Powerstrip
- BOOL liveSource; // TRUE if live source -> display sync is the only option
- INT adjDelta; // -1 for display slower in relation to video, 0 for keep, 1 for faster
- INT lineDelta; // The number of rows added or subtracted when adjusting display fps
- INT columnDelta; // The number of colums added or subtracted when adjusting display fps
- DOUBLE cycleDelta; // Adjustment factor for cycle time as fraction of nominal value
- UINT displayAdjustmentsMade; // The number of adjustments made to display refresh rate
- UINT clockAdjustmentsMade; // The number of adjustments made to clock frequency
-
- UINT totalLines, totalColumns; // Including the porches and sync widths
- UINT visibleLines, visibleColumns; // The nominal resolution
- MovingAverage *syncOffsetFifo;
- MovingAverage *frameCycleFifo;
- DOUBLE minSyncOffset, maxSyncOffset;
- DOUBLE syncOffsetAvg; // Average of the above
- DOUBLE minFrameCycle, maxFrameCycle;
- DOUBLE frameCycleAvg;
-
- UINT pixelClock; // In pixels/s
- DOUBLE displayFreqCruise; // Nominal display frequency in frames/s
- DOUBLE displayFreqSlower;
- DOUBLE displayFreqFaster;
- DOUBLE curDisplayFreq; // Current (adjusted) display frequency
- DOUBLE controlLimit; // How much the sync offset is allowed to drift from target sync offset
- WPARAM monitor; // The monitor to be controlled. 0-based.
- CComPtr<ISyncClock> syncClock; // Interface to an adjustable reference clock
-
- private:
- HWND psWnd; // PowerStrip window
- const static INT TIMING_PARAM_CNT = 10;
- const static INT MAX_LOADSTRING = 100;
- UINT displayTiming[TIMING_PARAM_CNT]; // Display timing parameters
- UINT displayTimingSave[TIMING_PARAM_CNT]; // So that we can reset the display at exit
- TCHAR faster[MAX_LOADSTRING]; // String corresponding to faster display frequency
- TCHAR cruise[MAX_LOADSTRING]; // String corresponding to nominal display frequency
- TCHAR slower[MAX_LOADSTRING]; // String corresponding to slower display frequency
- TCHAR savedTiming[MAX_LOADSTRING]; // String version of saved timing (to be restored upon exit)
- DOUBLE lowSyncOffset; // The closest we want to let the scheduled render time to get to the next vsync. In % of the frame time
- DOUBLE targetSyncOffset; // Where we want the scheduled render time to be in relation to the next vsync
- DOUBLE highSyncOffset; // The furthers we want to let the scheduled render time to get to the next vsync
- CCritSec csGenlockLock;
- };
+ class CGenlock;
+ class CSyncRenderer;
+
+ // Base allocator-presenter
+ class CBaseAP:
+ public CSubPicAllocatorPresenterImpl
+ {
+ protected:
+ CRenderersSettings::CRendererSettingsEVR m_LastRendererSettings;
+
+ HMODULE m_hDWMAPI;
+ HRESULT(__stdcall* m_pDwmIsCompositionEnabled)(__out BOOL* pfEnabled);
+ HRESULT(__stdcall* m_pDwmEnableComposition)(UINT uCompositionAction);
+ HMODULE m_hD3D9;
+ HRESULT(__stdcall* m_pDirect3DCreate9Ex)(UINT SDKVersion, IDirect3D9Ex**);
+
+ CCritSec m_allocatorLock;
+ CComPtr<IDirect3D9Ex> m_pD3DEx;
+ CComPtr<IDirect3D9> m_pD3D;
+ CComPtr<IDirect3DDevice9Ex> m_pD3DDevEx;
+ CComPtr<IDirect3DDevice9> m_pD3DDev;
+
+ CComPtr<IDirect3DTexture9> m_pVideoTexture[MAX_PICTURE_SLOTS];
+ CComPtr<IDirect3DSurface9> m_pVideoSurface[MAX_PICTURE_SLOTS];
+ CComPtr<IDirect3DTexture9> m_pOSDTexture;
+ CComPtr<IDirect3DSurface9> m_pOSDSurface;
+ CComPtr<ID3DXLine> m_pLine;
+ CComPtr<ID3DXFont> m_pFont;
+ CComPtr<ID3DXSprite> m_pSprite;
+ CSyncRenderer* m_pOuterEVR;
+
+ class CExternalPixelShader
+ {
+ public:
+ CComPtr<IDirect3DPixelShader9> m_pPixelShader;
+ CStringA m_SourceData;
+ CStringA m_SourceTarget;
+ HRESULT Compile(CPixelShaderCompiler* pCompiler) {
+ HRESULT hr = pCompiler->CompileShader(m_SourceData, "main", m_SourceTarget, 0, &m_pPixelShader);
+ if (FAILED(hr)) {
+ return hr;
+ }
+ return S_OK;
+ }
+ };
+
+ CAutoPtr<CPixelShaderCompiler> m_pPSC;
+ CAtlList<CExternalPixelShader> m_pPixelShaders;
+ CAtlList<CExternalPixelShader> m_pPixelShadersScreenSpace;
+ CComPtr<IDirect3DPixelShader9> m_pResizerPixelShader[4]; // bl, bc1, bc2_1, bc2_2
+ CComPtr<IDirect3DTexture9> m_pScreenSizeTemporaryTexture[2];
+
+ D3DFORMAT m_SurfaceType;
+ D3DFORMAT m_BackbufferType;
+ D3DFORMAT m_DisplayType;
+ D3DTEXTUREFILTERTYPE m_filter;
+ D3DCAPS9 m_caps;
+ D3DPRESENT_PARAMETERS pp;
+
+ bool SettingsNeedResetDevice();
+ void SendResetRequest();
+ virtual HRESULT CreateDXDevice(CString& _Error);
+ virtual HRESULT ResetDXDevice(CString& _Error);
+ virtual HRESULT AllocSurfaces(D3DFORMAT Format = D3DFMT_A8R8G8B8);
+ virtual void DeleteSurfaces();
+
+ HANDLE m_hEvtQuit; // Stop rendering thread event
+ LONGLONG m_LastAdapterCheck;
+ UINT m_CurrentAdapter;
+ UINT GetAdapter(IDirect3D9* pD3D);
+
+ float m_bicubicA;
+ HRESULT InitResizers(float bicubicA, bool bNeedScreenSizeTexture);
+
+ // Functions to trace timing performance
+ void SyncStats(LONGLONG syncTime);
+ void SyncOffsetStats(LONGLONG syncOffset);
+ void DrawText(const RECT& rc, const CString& strText, int _Priority);
+ void DrawStats();
+
+ template<int texcoords>
+ void AdjustQuad(MYD3DVERTEX<texcoords>* v, double dx, double dy);
+ template<int texcoords>
+ HRESULT TextureBlt(IDirect3DDevice9* pD3DDev, MYD3DVERTEX<texcoords> v[4], D3DTEXTUREFILTERTYPE filter);
+ MFOffset GetOffset(float v);
+ MFVideoArea GetArea(float x, float y, DWORD width, DWORD height);
+ bool ClipToSurface(IDirect3DSurface9* pSurface, CRect& s, CRect& d);
+
+ HRESULT DrawRectBase(IDirect3DDevice9* pD3DDev, MYD3DVERTEX<0> v[4]);
+ HRESULT DrawRect(DWORD _Color, DWORD _Alpha, const CRect& _Rect);
+ HRESULT TextureCopy(IDirect3DTexture9* pTexture);
+ HRESULT TextureResize(IDirect3DTexture9* pTexture, Vector dst[4], D3DTEXTUREFILTERTYPE filter, const CRect& SrcRect);
+ HRESULT TextureResizeBilinear(IDirect3DTexture9* pTexture, Vector dst[4], const CRect& SrcRect);
+ HRESULT TextureResizeBicubic1pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect& SrcRect);
+ HRESULT TextureResizeBicubic2pass(IDirect3DTexture9* pTexture, Vector dst[4], const CRect& SrcRect);
+
+ typedef HRESULT(WINAPI* D3DXLoadSurfaceFromMemoryPtr)(
+ LPDIRECT3DSURFACE9 pDestSurface,
+ CONST PALETTEENTRY* pDestPalette,
+ CONST RECT* pDestRect,
+ LPCVOID pSrcMemory,
+ D3DFORMAT SrcFormat,
+ UINT SrcPitch,
+ CONST PALETTEENTRY* pSrcPalette,
+ CONST RECT* pSrcRect,
+ DWORD Filter,
+ D3DCOLOR ColorKey);
+
+ typedef HRESULT(WINAPI* D3DXCreateLinePtr)
+ (LPDIRECT3DDEVICE9 pDevice,
+ LPD3DXLINE* ppLine);
+
+ typedef HRESULT(WINAPI* D3DXCreateFontPtr)(
+ LPDIRECT3DDEVICE9 pDevice,
+ int Height,
+ UINT Width,
+ UINT Weight,
+ UINT MipLevels,
+ bool Italic,
+ DWORD CharSet,
+ DWORD OutputPrecision,
+ DWORD Quality,
+ DWORD PitchAndFamily,
+ LPCWSTR pFaceName,
+ LPD3DXFONT* ppFont);
+
+ HRESULT AlphaBlt(RECT* pSrc, RECT* pDst, IDirect3DTexture9* pTexture);
+
+ virtual void OnResetDevice() {};
+
+ int m_nTearingPos;
+ VMR9AlphaBitmap m_VMR9AlphaBitmap;
+ CAutoVectorPtr<BYTE> m_VMR9AlphaBitmapData;
+ CRect m_VMR9AlphaBitmapRect;
+ int m_VMR9AlphaBitmapWidthBytes;
+
+ D3DXLoadSurfaceFromMemoryPtr m_pD3DXLoadSurfaceFromMemory;
+ D3DXCreateLinePtr m_pD3DXCreateLine;
+ D3DXCreateFontPtr m_pD3DXCreateFont;
+ HRESULT(__stdcall* m_pD3DXCreateSprite)(LPDIRECT3DDEVICE9 pDevice, LPD3DXSPRITE* ppSprite);
+
+ int m_nDXSurface; // Total number of DX Surfaces
+ int m_nVMR9Surfaces;
+ int m_iVMR9Surface;
+ int m_nCurSurface; // Surface currently displayed
+ long m_nUsedBuffer;
+
+ LONG m_lNextSampleWait; // Waiting time for next sample in EVR
+ bool m_bSnapToVSync; // True if framerate is low enough so that snap to vsync makes sense
+
+ UINT m_uScanLineEnteringPaint; // The active scan line when entering Paint()
+ REFERENCE_TIME m_llEstVBlankTime; // Next vblank start time in reference clock "coordinates"
+
+ double m_fAvrFps; // Estimate the true FPS as given by the distance between vsyncs when a frame has been presented
+ double m_fJitterStdDev; // VSync estimate std dev
+ double m_fJitterMean; // Mean time between two syncpulses when a frame has been presented (i.e. when Paint() has been called
+
+ double m_fSyncOffsetAvr; // Mean time between the call of Paint() and vsync. To avoid tearing this should be several ms at least
+ double m_fSyncOffsetStdDev; // The std dev of the above
+
+ bool m_bHighColorResolution;
+ bool m_bCompositionEnabled;
+ bool m_bDesktopCompositionDisabled;
+ bool m_bIsFullscreen;
+ bool m_bNeedCheckSample;
+ DWORD m_dMainThreadId;
+
+ CSize m_ScreenSize;
+
+ // Display and frame rates and cycles
+ double m_dDetectedScanlineTime; // Time for one (horizontal) scan line. Extracted at stream start and used to calculate vsync time
+ UINT m_uD3DRefreshRate; // As got when creating the d3d device
+ double m_dD3DRefreshCycle; // Display refresh cycle ms
+ double m_dEstRefreshCycle; // As estimated from scan lines
+ double m_dFrameCycle; // Average sample time, extracted from the samples themselves
+ // double m_fps is defined in ISubPic.h
+ double m_dOptimumDisplayCycle; // The display cycle that is closest to the frame rate. A multiple of the actual display cycle
+ double m_dCycleDifference; // Difference in video and display cycle time relative to the video cycle time
+
+ UINT m_pcFramesDropped;
+ UINT m_pcFramesDuplicated;
+ UINT m_pcFramesDrawn;
+
+ LONGLONG m_pllJitter [NB_JITTER]; // Vertical sync time stats
+ LONGLONG m_pllSyncOffset [NB_JITTER]; // Sync offset time stats
+ int m_nNextJitter;
+ int m_nNextSyncOffset;
+ LONGLONG m_JitterStdDev;
+
+ LONGLONG m_llLastSyncTime;
+
+ LONGLONG m_MaxJitter;
+ LONGLONG m_MinJitter;
+ LONGLONG m_MaxSyncOffset;
+ LONGLONG m_MinSyncOffset;
+ UINT m_uSyncGlitches;
+
+ LONGLONG m_llSampleTime, m_llLastSampleTime; // Present time for the current sample
+ LONG m_lSampleLatency, m_lLastSampleLatency; // Time between intended and actual presentation time
+ LONG m_lMinSampleLatency, m_lLastMinSampleLatency;
+ LONGLONG m_llHysteresis;
+ LONG m_lHysteresis;
+ LONG m_lShiftToNearest, m_lShiftToNearestPrev;
+ bool m_bVideoSlowerThanDisplay;
+
+ int m_bInterlaced;
+ double m_TextScale;
+ CString m_strStatsMsg[10];
+
+ CGenlock* m_pGenlock; // The video - display synchronizer class
+ CComPtr<IReferenceClock> m_pRefClock; // The reference clock. Used in Paint()
+ CComPtr<IAMAudioRendererStats> m_pAudioStats; // Audio statistics from audio renderer. To check so that audio is in sync
+ DWORD m_lAudioLag; // Time difference between audio and video when the audio renderer is matching rate to the external reference clock
+ long m_lAudioLagMin, m_lAudioLagMax; // The accumulated difference between the audio renderer and the master clock
+ DWORD m_lAudioSlaveMode; // To check whether the audio renderer matches rate with SyncClock (returns the value 4 if it does)
+
+ double GetRefreshRate(); // Get the best estimate of the display refresh rate in Hz
+ double GetDisplayCycle(); // Get the best estimate of the display cycle time in milliseconds
+ double GetCycleDifference(); // Get the difference in video and display cycle times.
+ void EstimateRefreshTimings(); // Estimate the times for one scan line and one frame respectively from the actual refresh data
+ bool ExtractInterlaced(const AM_MEDIA_TYPE* pmt);
+
+ public:
+ CBaseAP(HWND hWnd, bool bFullscreen, HRESULT& hr, CString& _Error);
+ ~CBaseAP();
+
+ CCritSec m_VMR9AlphaBitmapLock;
+ void UpdateAlphaBitmap();
+ void ResetStats();
+
+ // ISubPicAllocatorPresenter
+ STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
+ STDMETHODIMP_(bool) Paint(bool fAll);
+ STDMETHODIMP GetDIB(BYTE* lpDib, DWORD* size);
+ STDMETHODIMP SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget);
+ STDMETHODIMP SetPixelShader2(LPCSTR pSrcData, LPCSTR pTarget, bool bScreenSpace);
+ STDMETHODIMP_(bool) ResetDevice();
+ STDMETHODIMP_(bool) DisplayChange();
+ };
+
+ class CSyncAP:
+ public CBaseAP,
+ public IMFGetService,
+ public IMFTopologyServiceLookupClient,
+ public IMFVideoDeviceID,
+ public IMFVideoPresenter,
+ public IDirect3DDeviceManager9,
+ public IMFAsyncCallback,
+ public IQualProp,
+ public IMFRateSupport,
+ public IMFVideoDisplayControl,
+ public IEVRTrustedVideoPlugin,
+ public ISyncClockAdviser
+
+ {
+ public:
+ CSyncAP(HWND hWnd, bool bFullscreen, HRESULT& hr, CString& _Error);
+ ~CSyncAP(void);
+
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
+ STDMETHODIMP_(bool) Paint(bool fAll);
+ STDMETHODIMP GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight);
+ STDMETHODIMP InitializeDevice(AM_MEDIA_TYPE* pMediaType);
+ STDMETHODIMP_(bool) ResetDevice();
+
+ // IMFClockStateSink
+ STDMETHODIMP OnClockStart(MFTIME hnsSystemTime, LONGLONG llClockStartOffset);
+ STDMETHODIMP OnClockStop(MFTIME hnsSystemTime);
+ STDMETHODIMP OnClockPause(MFTIME hnsSystemTime);
+ STDMETHODIMP OnClockRestart(MFTIME hnsSystemTime);
+ STDMETHODIMP OnClockSetRate(MFTIME hnsSystemTime, float flRate);
+
+ // IBaseFilter delegate
+ bool GetState(DWORD dwMilliSecsTimeout, FILTER_STATE* State, HRESULT& _ReturnValue);
+
+ // IQualProp (EVR statistics window). These are incompletely implemented currently
+ STDMETHODIMP get_FramesDroppedInRenderer(int* pcFrames);
+ STDMETHODIMP get_FramesDrawn(int* pcFramesDrawn);
+ STDMETHODIMP get_AvgFrameRate(int* piAvgFrameRate);
+ STDMETHODIMP get_Jitter(int* iJitter);
+ STDMETHODIMP get_AvgSyncOffset(int* piAvg);
+ STDMETHODIMP get_DevSyncOffset(int* piDev);
+
+ // IMFRateSupport
+ STDMETHODIMP GetSlowestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float* pflRate);
+ STDMETHODIMP GetFastestRate(MFRATE_DIRECTION eDirection, BOOL fThin, float* pflRate);
+ STDMETHODIMP IsRateSupported(BOOL fThin, float flRate, float* pflNearestSupportedRate);
+ float GetMaxRate(BOOL bThin);
+
+ // IMFVideoPresenter
+ STDMETHODIMP ProcessMessage(MFVP_MESSAGE_TYPE eMessage, ULONG_PTR ulParam);
+ STDMETHODIMP GetCurrentMediaType(__deref_out IMFVideoMediaType** ppMediaType);
+
+ // IMFTopologyServiceLookupClient
+ STDMETHODIMP InitServicePointers(__in IMFTopologyServiceLookup* pLookup);
+ STDMETHODIMP ReleaseServicePointers();
+
+ // IMFVideoDeviceID
+ STDMETHODIMP GetDeviceID(__out IID* pDeviceID);
+
+ // IMFGetService
+ STDMETHODIMP GetService(__RPC__in REFGUID guidService, __RPC__in REFIID riid, __RPC__deref_out_opt LPVOID* ppvObject);
+
+ // IMFAsyncCallback
+ STDMETHODIMP GetParameters(__RPC__out DWORD* pdwFlags, /* [out] */ __RPC__out DWORD* pdwQueue);
+ STDMETHODIMP Invoke(__RPC__in_opt IMFAsyncResult* pAsyncResult);
+
+ // IMFVideoDisplayControl
+ STDMETHODIMP GetNativeVideoSize(SIZE* pszVideo, SIZE* pszARVideo);
+ STDMETHODIMP GetIdealVideoSize(SIZE* pszMin, SIZE* pszMax);
+ STDMETHODIMP SetVideoPosition(const MFVideoNormalizedRect* pnrcSource, const LPRECT prcDest);
+ STDMETHODIMP GetVideoPosition(MFVideoNormalizedRect* pnrcSource, LPRECT prcDest);
+ STDMETHODIMP SetAspectRatioMode(DWORD dwAspectRatioMode);
+ STDMETHODIMP GetAspectRatioMode(DWORD* pdwAspectRatioMode);
+ STDMETHODIMP SetVideoWindow(HWND hwndVideo);
+ STDMETHODIMP GetVideoWindow(HWND* phwndVideo);
+ STDMETHODIMP RepaintVideo(void);
+ STDMETHODIMP GetCurrentImage(BITMAPINFOHEADER* pBih, BYTE** pDib, DWORD* pcbDib, LONGLONG* pTimeStamp);
+ STDMETHODIMP SetBorderColor(COLORREF Clr);
+ STDMETHODIMP GetBorderColor(COLORREF* pClr);
+ STDMETHODIMP SetRenderingPrefs(DWORD dwRenderFlags);
+ STDMETHODIMP GetRenderingPrefs(DWORD* pdwRenderFlags);
+ STDMETHODIMP SetFullscreen(BOOL fFullscreen);
+ STDMETHODIMP GetFullscreen(BOOL* pfFullscreen);
+
+ // IEVRTrustedVideoPlugin
+ STDMETHODIMP IsInTrustedVideoMode(BOOL* pYes);
+ STDMETHODIMP CanConstrict(BOOL* pYes);
+ STDMETHODIMP SetConstriction(DWORD dwKPix);
+ STDMETHODIMP DisableImageExport(BOOL bDisable);
+
+ // IDirect3DDeviceManager9
+ STDMETHODIMP ResetDevice(IDirect3DDevice9* pDevice, UINT resetToken);
+ STDMETHODIMP OpenDeviceHandle(HANDLE* phDevice);
+ STDMETHODIMP CloseDeviceHandle(HANDLE hDevice);
+ STDMETHODIMP TestDevice(HANDLE hDevice);
+ STDMETHODIMP LockDevice(HANDLE hDevice, IDirect3DDevice9** ppDevice, BOOL fBlock);
+ STDMETHODIMP UnlockDevice(HANDLE hDevice, BOOL fSaveState);
+ STDMETHODIMP GetVideoService(HANDLE hDevice, REFIID riid, void** ppService);
+
+ protected:
+ void OnResetDevice();
+ MFCLOCK_STATE m_LastClockState;
+
+ private:
+ // dxva.dll
+ typedef HRESULT(__stdcall* PTR_DXVA2CreateDirect3DDeviceManager9)(UINT* pResetToken, IDirect3DDeviceManager9** ppDeviceManager);
+ // mf.dll
+ typedef HRESULT(__stdcall* PTR_MFCreatePresentationClock)(IMFPresentationClock** ppPresentationClock);
+ // evr.dll
+ typedef HRESULT(__stdcall* PTR_MFCreateDXSurfaceBuffer)(REFIID riid, IUnknown* punkSurface, BOOL fBottomUpWhenLinear, IMFMediaBuffer** ppBuffer);
+ typedef HRESULT(__stdcall* PTR_MFCreateVideoSampleFromSurface)(IUnknown* pUnkSurface, IMFSample** ppSample);
+ typedef HRESULT(__stdcall* PTR_MFCreateVideoMediaType)(const MFVIDEOFORMAT* pVideoFormat, IMFVideoMediaType** ppIVideoMediaType);
+ // avrt.dll
+ typedef HANDLE(__stdcall* PTR_AvSetMmThreadCharacteristicsW)(LPCWSTR TaskName, LPDWORD TaskIndex);
+ typedef BOOL (__stdcall* PTR_AvSetMmThreadPriority)(HANDLE AvrtHandle, AVRT_PRIORITY Priority);
+ typedef BOOL (__stdcall* PTR_AvRevertMmThreadCharacteristics)(HANDLE AvrtHandle);
+
+ typedef enum {
+ Started = State_Running,
+ Stopped = State_Stopped,
+ Paused = State_Paused,
+ Shutdown = State_Running + 1
+ } RENDER_STATE;
+
+ CComPtr<IMFClock> m_pClock;
+ CComPtr<IDirect3DDeviceManager9> m_pD3DManager;
+ CComPtr<IMFTransform> m_pMixer;
+ CComPtr<IMediaEventSink> m_pSink;
+ CComPtr<IMFVideoMediaType> m_pMediaType;
+ MFVideoAspectRatioMode m_dwVideoAspectRatioMode;
+ MFVideoRenderPrefs m_dwVideoRenderPrefs;
+ COLORREF m_BorderColor;
+
+ HANDLE m_hEvtQuit; // Stop rendering thread event
+ bool m_bEvtQuit;
+ HANDLE m_hEvtFlush; // Discard all buffers
+ bool m_bEvtFlush;
+ HANDLE m_hEvtSkip; // Skip frame
+ bool m_bEvtSkip;
+
+ bool m_bUseInternalTimer;
+ int32 m_LastSetOutputRange;
+ bool m_bPendingRenegotiate;
+ bool m_bPendingMediaFinished;
+ bool m_bPrerolled; // true if first sample has been displayed.
+
+ HANDLE m_hRenderThread;
+ HANDLE m_hMixerThread;
+ RENDER_STATE m_nRenderState;
+ bool m_bStepping;
+
+ CCritSec m_SampleQueueLock;
+ CCritSec m_ImageProcessingLock;
+
+ CInterfaceList<IMFSample, &IID_IMFSample> m_FreeSamples;
+ CInterfaceList<IMFSample, &IID_IMFSample> m_ScheduledSamples;
+ IMFSample* m_pCurrentDisplaydSample;
+ UINT m_nResetToken;
+ int m_nStepCount;
+
+ bool GetSampleFromMixer();
+ void MixerThread();
+ static DWORD WINAPI MixerThreadStatic(LPVOID lpParam);
+ void RenderThread();
+ static DWORD WINAPI RenderThreadStatic(LPVOID lpParam);
+
+ void StartWorkerThreads();
+ void StopWorkerThreads();
+ HRESULT CheckShutdown() const;
+ void CompleteFrameStep(bool bCancel);
+
+ void RemoveAllSamples();
+ STDMETHODIMP AdviseSyncClock(ISyncClock* sC);
+ HRESULT BeginStreaming();
+ HRESULT GetFreeSample(IMFSample** ppSample);
+ HRESULT GetScheduledSample(IMFSample** ppSample, int& _Count);
+ void MoveToFreeList(IMFSample* pSample, bool bTail);
+ void MoveToScheduledList(IMFSample* pSample, bool _bSorted);
+ void FlushSamples();
+ void FlushSamplesInternal();
+
+ LONGLONG GetMediaTypeMerit(IMFMediaType* pMediaType);
+ HRESULT RenegotiateMediaType();
+ HRESULT IsMediaTypeSupported(IMFMediaType* pMixerType);
+ HRESULT CreateProposedOutputType(IMFMediaType* pMixerType, IMFMediaType** pType);
+ HRESULT SetMediaType(IMFMediaType* pType);
+
+ // Functions pointers for Vista/.NET3 specific library
+ PTR_DXVA2CreateDirect3DDeviceManager9 pfDXVA2CreateDirect3DDeviceManager9;
+ PTR_MFCreateDXSurfaceBuffer pfMFCreateDXSurfaceBuffer;
+ PTR_MFCreateVideoSampleFromSurface pfMFCreateVideoSampleFromSurface;
+ PTR_MFCreateVideoMediaType pfMFCreateVideoMediaType;
+
+ PTR_AvSetMmThreadCharacteristicsW pfAvSetMmThreadCharacteristicsW;
+ PTR_AvSetMmThreadPriority pfAvSetMmThreadPriority;
+ PTR_AvRevertMmThreadCharacteristics pfAvRevertMmThreadCharacteristics;
+ };
+
+ class CSyncRenderer:
+ public CUnknown,
+ public IVMRffdshow9,
+ public IVMRMixerBitmap9,
+ public IBaseFilter
+ {
+ CComPtr<IUnknown> m_pEVR;
+ VMR9AlphaBitmap* m_pVMR9AlphaBitmap;
+ CSyncAP* m_pAllocatorPresenter;
+
+ public:
+ CSyncRenderer(const TCHAR* pName, LPUNKNOWN pUnk, HRESULT& hr, VMR9AlphaBitmap* pVMR9AlphaBitmap, CSyncAP* pAllocatorPresenter);
+ ~CSyncRenderer();
+
+ // IBaseFilter
+ virtual HRESULT STDMETHODCALLTYPE EnumPins(__out IEnumPins** ppEnum);
+ virtual HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, __out IPin** ppPin);
+ virtual HRESULT STDMETHODCALLTYPE QueryFilterInfo(__out FILTER_INFO* pInfo);
+ virtual HRESULT STDMETHODCALLTYPE JoinFilterGraph(__in_opt IFilterGraph* pGraph, __in_opt LPCWSTR pName);
+ virtual HRESULT STDMETHODCALLTYPE QueryVendorInfo(__out LPWSTR* pVendorInfo);
+ virtual HRESULT STDMETHODCALLTYPE Stop(void);
+ virtual HRESULT STDMETHODCALLTYPE Pause(void);
+ virtual HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart);
+ virtual HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, __out FILTER_STATE* State);
+ virtual HRESULT STDMETHODCALLTYPE SetSyncSource(__in_opt IReferenceClock* pClock);
+ virtual HRESULT STDMETHODCALLTYPE GetSyncSource(__deref_out_opt IReferenceClock** pClock);
+ virtual HRESULT STDMETHODCALLTYPE GetClassID(__RPC__out CLSID* pClassID);
+
+ // IVMRffdshow9
+ virtual HRESULT STDMETHODCALLTYPE support_ffdshow();
+
+ // IVMRMixerBitmap9
+ STDMETHODIMP GetAlphaBitmapParameters(VMR9AlphaBitmap* pBmpParms);
+ STDMETHODIMP SetAlphaBitmap(const VMR9AlphaBitmap* pBmpParms);
+ STDMETHODIMP UpdateAlphaBitmapParameters(const VMR9AlphaBitmap* pBmpParms);
+
+ DECLARE_IUNKNOWN;
+ virtual HRESULT STDMETHODCALLTYPE NonDelegatingQueryInterface(REFIID riid, void** ppvObject);
+ };
+
+ class CGenlock
+ {
+ public:
+ class MovingAverage
+ {
+ public:
+ MovingAverage(INT size):
+ fifoSize(size),
+ oldestSample(0),
+ sum(0) {
+ if (fifoSize > MAX_FIFO_SIZE) {
+ fifoSize = MAX_FIFO_SIZE;
+ }
+ for (INT i = 0; i < MAX_FIFO_SIZE; i++) {
+ fifo[i] = 0;
+ }
+ }
+
+ ~MovingAverage() {
+ }
+
+ double Average(double sample) {
+ sum = sum + sample - fifo[oldestSample];
+ fifo[oldestSample] = sample;
+ oldestSample++;
+ if (oldestSample == fifoSize) {
+ oldestSample = 0;
+ }
+ return sum / fifoSize;
+ }
+
+ private:
+ INT fifoSize;
+ double fifo[MAX_FIFO_SIZE];
+ INT oldestSample;
+ double sum;
+ };
+
+ CGenlock(DOUBLE target, DOUBLE limit, INT rowD, INT colD, DOUBLE clockD, UINT mon);
+ ~CGenlock();
+
+ BOOL PowerstripRunning(); // TRUE if PowerStrip is running
+ HRESULT GetTiming(); // Get the string representing the display's current timing parameters
+ HRESULT ResetTiming(); // Reset timing to what was last registered by GetTiming()
+ HRESULT ResetClock(); // Reset reference clock speed to nominal
+ HRESULT SetTargetSyncOffset(DOUBLE targetD);
+ HRESULT GetTargetSyncOffset(DOUBLE* targetD);
+ HRESULT SetControlLimit(DOUBLE cL);
+ HRESULT GetControlLimit(DOUBLE* cL);
+ HRESULT SetDisplayResolution(UINT columns, UINT lines);
+ HRESULT AdviseSyncClock(ISyncClock* sC);
+ HRESULT SetMonitor(UINT mon); // Set the number of the monitor to synchronize
+ HRESULT ResetStats(); // Reset timing statistics
+
+ HRESULT ControlDisplay(double syncOffset, double frameCycle); // Adjust the frequency of the display if needed
+ HRESULT ControlClock(double syncOffset, double frameCycle); // Adjust the frequency of the clock if needed
+ HRESULT UpdateStats(double syncOffset, double frameCycle); // Don't adjust anything, just update the syncOffset stats
+
+ BOOL powerstripTimingExists; // TRUE if display timing has been got through Powerstrip
+ BOOL liveSource; // TRUE if live source -> display sync is the only option
+ INT adjDelta; // -1 for display slower in relation to video, 0 for keep, 1 for faster
+ INT lineDelta; // The number of rows added or subtracted when adjusting display fps
+ INT columnDelta; // The number of colums added or subtracted when adjusting display fps
+ DOUBLE cycleDelta; // Adjustment factor for cycle time as fraction of nominal value
+ UINT displayAdjustmentsMade; // The number of adjustments made to display refresh rate
+ UINT clockAdjustmentsMade; // The number of adjustments made to clock frequency
+
+ UINT totalLines, totalColumns; // Including the porches and sync widths
+ UINT visibleLines, visibleColumns; // The nominal resolution
+ MovingAverage* syncOffsetFifo;
+ MovingAverage* frameCycleFifo;
+ DOUBLE minSyncOffset, maxSyncOffset;
+ DOUBLE syncOffsetAvg; // Average of the above
+ DOUBLE minFrameCycle, maxFrameCycle;
+ DOUBLE frameCycleAvg;
+
+ UINT pixelClock; // In pixels/s
+ DOUBLE displayFreqCruise; // Nominal display frequency in frames/s
+ DOUBLE displayFreqSlower;
+ DOUBLE displayFreqFaster;
+ DOUBLE curDisplayFreq; // Current (adjusted) display frequency
+ DOUBLE controlLimit; // How much the sync offset is allowed to drift from target sync offset
+ WPARAM monitor; // The monitor to be controlled. 0-based.
+ CComPtr<ISyncClock> syncClock; // Interface to an adjustable reference clock
+
+ private:
+ HWND psWnd; // PowerStrip window
+ const static INT TIMING_PARAM_CNT = 10;
+ const static INT MAX_LOADSTRING = 100;
+ UINT displayTiming[TIMING_PARAM_CNT]; // Display timing parameters
+ UINT displayTimingSave[TIMING_PARAM_CNT]; // So that we can reset the display at exit
+ TCHAR faster[MAX_LOADSTRING]; // String corresponding to faster display frequency
+ TCHAR cruise[MAX_LOADSTRING]; // String corresponding to nominal display frequency
+ TCHAR slower[MAX_LOADSTRING]; // String corresponding to slower display frequency
+ TCHAR savedTiming[MAX_LOADSTRING]; // String version of saved timing (to be restored upon exit)
+ DOUBLE lowSyncOffset; // The closest we want to let the scheduled render time to get to the next vsync. In % of the frame time
+ DOUBLE targetSyncOffset; // Where we want the scheduled render time to be in relation to the next vsync
+ DOUBLE highSyncOffset; // The furthers we want to let the scheduled render time to get to the next vsync
+ CCritSec csGenlockLock;
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/VMR7AllocatorPresenter.cpp b/src/filters/renderer/VideoRenderers/VMR7AllocatorPresenter.cpp
index 4425fb592..03023bab5 100644
--- a/src/filters/renderer/VideoRenderers/VMR7AllocatorPresenter.cpp
+++ b/src/filters/renderer/VideoRenderers/VMR7AllocatorPresenter.cpp
@@ -39,259 +39,259 @@ using namespace DSObjects;
#define MY_USER_ID 0x6ABE51
CVMR7AllocatorPresenter::CVMR7AllocatorPresenter(HWND hWnd, HRESULT& hr)
- : CDX7AllocatorPresenter(hWnd, hr)
- , m_fUseInternalTimer(false)
+ : CDX7AllocatorPresenter(hWnd, hr)
+ , m_fUseInternalTimer(false)
{
- if (FAILED(hr)) {
- return;
- }
-
- if (FAILED(hr = m_pSA.CoCreateInstance(CLSID_AllocPresenter))) {
- hr = E_FAIL;
- return;
- }
+ if (FAILED(hr)) {
+ return;
+ }
+
+ if (FAILED(hr = m_pSA.CoCreateInstance(CLSID_AllocPresenter))) {
+ hr = E_FAIL;
+ return;
+ }
}
STDMETHODIMP CVMR7AllocatorPresenter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(IVMRSurfaceAllocator)
- QI(IVMRImagePresenter)
- QI(IVMRWindowlessControl)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IVMRSurfaceAllocator)
+ QI(IVMRImagePresenter)
+ QI(IVMRWindowlessControl)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CVMR7AllocatorPresenter::CreateDevice()
{
- HRESULT hr = __super::CreateDevice();
- if (FAILED(hr)) {
- return hr;
- }
-
- if (m_pIVMRSurfAllocNotify) {
- HMONITOR hMonitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
- if (FAILED(hr = m_pIVMRSurfAllocNotify->ChangeDDrawDevice(m_pDD, hMonitor))) {
- return hr; //return false;
- }
- }
-
- return hr;
+ HRESULT hr = __super::CreateDevice();
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ if (m_pIVMRSurfAllocNotify) {
+ HMONITOR hMonitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
+ if (FAILED(hr = m_pIVMRSurfAllocNotify->ChangeDDrawDevice(m_pDD, hMonitor))) {
+ return hr; //return false;
+ }
+ }
+
+ return hr;
}
void CVMR7AllocatorPresenter::DeleteSurfaces()
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- m_pSA->FreeSurface(MY_USER_ID);
+ m_pSA->FreeSurface(MY_USER_ID);
- __super::DeleteSurfaces();
+ __super::DeleteSurfaces();
}
// ISubPicAllocatorPresenter
STDMETHODIMP CVMR7AllocatorPresenter::CreateRenderer(IUnknown** ppRenderer)
{
- CheckPointer(ppRenderer, E_POINTER);
+ CheckPointer(ppRenderer, E_POINTER);
- *ppRenderer = NULL;
+ *ppRenderer = NULL;
- HRESULT hr;
+ HRESULT hr;
- do {
- CComPtr<IBaseFilter> pBF;
+ do {
+ CComPtr<IBaseFilter> pBF;
- if (FAILED(hr = pBF.CoCreateInstance(CLSID_VideoMixingRenderer))) {
- break;
- }
+ if (FAILED(hr = pBF.CoCreateInstance(CLSID_VideoMixingRenderer))) {
+ break;
+ }
- CComQIPtr<IVMRFilterConfig> pConfig = pBF;
- if (!pConfig) {
- break;
- }
+ CComQIPtr<IVMRFilterConfig> pConfig = pBF;
+ if (!pConfig) {
+ break;
+ }
- if (FAILED(hr = pConfig->SetRenderingMode(VMRMode_Renderless))) {
- break;
- }
+ if (FAILED(hr = pConfig->SetRenderingMode(VMRMode_Renderless))) {
+ break;
+ }
- CComQIPtr<IVMRSurfaceAllocatorNotify> pSAN = pBF;
- if (!pSAN) {
- break;
- }
+ CComQIPtr<IVMRSurfaceAllocatorNotify> pSAN = pBF;
+ if (!pSAN) {
+ break;
+ }
- if (FAILED(hr = pSAN->AdviseSurfaceAllocator(MY_USER_ID, static_cast<IVMRSurfaceAllocator*>(this)))
- || FAILED(hr = AdviseNotify(pSAN))) {
- break;
- }
+ if (FAILED(hr = pSAN->AdviseSurfaceAllocator(MY_USER_ID, static_cast<IVMRSurfaceAllocator*>(this)))
+ || FAILED(hr = AdviseNotify(pSAN))) {
+ break;
+ }
- CComPtr<IPin> pPin = GetFirstPin(pBF);
- CComQIPtr<IMemInputPin> pMemInputPin = pPin;
- m_fUseInternalTimer = HookNewSegmentAndReceive((IPinC*)(IPin*)pPin, (IMemInputPinC*)(IMemInputPin*)pMemInputPin);
+ CComPtr<IPin> pPin = GetFirstPin(pBF);
+ CComQIPtr<IMemInputPin> pMemInputPin = pPin;
+ m_fUseInternalTimer = HookNewSegmentAndReceive((IPinC*)(IPin*)pPin, (IMemInputPinC*)(IMemInputPin*)pMemInputPin);
- *ppRenderer = (IUnknown*)pBF.Detach();
+ *ppRenderer = (IUnknown*)pBF.Detach();
- return S_OK;
- } while (0);
+ return S_OK;
+ } while (0);
- return E_FAIL;
+ return E_FAIL;
}
STDMETHODIMP_(void) CVMR7AllocatorPresenter::SetTime(REFERENCE_TIME rtNow)
{
- __super::SetTime(rtNow);
- // m_fUseInternalTimer = false;
+ __super::SetTime(rtNow);
+ // m_fUseInternalTimer = false;
}
// IVMRSurfaceAllocator
STDMETHODIMP CVMR7AllocatorPresenter::AllocateSurface(DWORD_PTR dwUserID, VMRALLOCATIONINFO* lpAllocInfo, DWORD* lpdwBuffer, LPDIRECTDRAWSURFACE7* lplpSurface)
{
- if (!lpAllocInfo || !lpdwBuffer || !lplpSurface) {
- return E_POINTER;
- }
-
- if (!m_pIVMRSurfAllocNotify) {
- return E_FAIL;
- }
-
- HRESULT hr;
-
- DeleteSurfaces();
-
- // HACK: yv12 will fail to blt onto the backbuffer anyway, but if we first
- // allocate it and then let our FreeSurface callback call m_pSA->FreeSurface,
- // then that might stall for about 30 seconds because of some unknown buggy code
- // behind <ddraw surface>->Release()
-
- if (lpAllocInfo->lpHdr->biBitCount < 16) {
- return E_FAIL;
- }
-
- hr = m_pSA->AllocateSurface(dwUserID, lpAllocInfo, lpdwBuffer, lplpSurface);
- if (FAILED(hr)) {
- return hr;
- }
-
- m_NativeVideoSize = CSize(abs(lpAllocInfo->lpHdr->biWidth), abs(lpAllocInfo->lpHdr->biHeight));
- m_AspectRatio = m_NativeVideoSize;
- int arx = lpAllocInfo->szAspectRatio.cx, ary = lpAllocInfo->szAspectRatio.cy;
- if (arx > 0 && ary > 0) {
- m_AspectRatio.SetSize(arx, ary);
- }
-
- if (FAILED(hr = AllocSurfaces())) {
- return hr;
- }
-
- // test if the colorspace is acceptable
- if (FAILED(hr = m_pVideoSurface->Blt(NULL, *lplpSurface, NULL, DDBLT_WAIT, NULL))) {
- DeleteSurfaces();
- return hr;
- }
-
- DDBLTFX fx;
- INITDDSTRUCT(fx);
- fx.dwFillColor = 0;
- m_pVideoSurface->Blt(NULL, NULL, NULL, DDBLT_WAIT|DDBLT_COLORFILL, &fx);
-
- return hr;
+ if (!lpAllocInfo || !lpdwBuffer || !lplpSurface) {
+ return E_POINTER;
+ }
+
+ if (!m_pIVMRSurfAllocNotify) {
+ return E_FAIL;
+ }
+
+ HRESULT hr;
+
+ DeleteSurfaces();
+
+ // HACK: yv12 will fail to blt onto the backbuffer anyway, but if we first
+ // allocate it and then let our FreeSurface callback call m_pSA->FreeSurface,
+ // then that might stall for about 30 seconds because of some unknown buggy code
+ // behind <ddraw surface>->Release()
+
+ if (lpAllocInfo->lpHdr->biBitCount < 16) {
+ return E_FAIL;
+ }
+
+ hr = m_pSA->AllocateSurface(dwUserID, lpAllocInfo, lpdwBuffer, lplpSurface);
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ m_NativeVideoSize = CSize(abs(lpAllocInfo->lpHdr->biWidth), abs(lpAllocInfo->lpHdr->biHeight));
+ m_AspectRatio = m_NativeVideoSize;
+ int arx = lpAllocInfo->szAspectRatio.cx, ary = lpAllocInfo->szAspectRatio.cy;
+ if (arx > 0 && ary > 0) {
+ m_AspectRatio.SetSize(arx, ary);
+ }
+
+ if (FAILED(hr = AllocSurfaces())) {
+ return hr;
+ }
+
+ // test if the colorspace is acceptable
+ if (FAILED(hr = m_pVideoSurface->Blt(NULL, *lplpSurface, NULL, DDBLT_WAIT, NULL))) {
+ DeleteSurfaces();
+ return hr;
+ }
+
+ DDBLTFX fx;
+ INITDDSTRUCT(fx);
+ fx.dwFillColor = 0;
+ m_pVideoSurface->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &fx);
+
+ return hr;
}
STDMETHODIMP CVMR7AllocatorPresenter::FreeSurface(DWORD_PTR dwUserID)
{
- DeleteSurfaces();
- return S_OK;
+ DeleteSurfaces();
+ return S_OK;
}
STDMETHODIMP CVMR7AllocatorPresenter::PrepareSurface(DWORD_PTR dwUserID, IDirectDrawSurface7* lpSurface, DWORD dwSurfaceFlags)
{
- SetThreadName((DWORD)-1, "CVMR7AllocatorPresenter");
-
- if (!lpSurface) {
- return E_POINTER;
- }
-
- // FIXME: sometimes the msmpeg4/divx3/wmv decoder wants to reuse our
- // surface (expects it to point to the same mem every time), and to avoid
- // problems we can't call m_pSA->PrepareSurface (flips? clears?).
- return S_OK;
- /*
- return m_pSA->PrepareSurface(dwUserID, lpSurface, dwSurfaceFlags);
- */
+ SetThreadName((DWORD) - 1, "CVMR7AllocatorPresenter");
+
+ if (!lpSurface) {
+ return E_POINTER;
+ }
+
+ // FIXME: sometimes the msmpeg4/divx3/wmv decoder wants to reuse our
+ // surface (expects it to point to the same mem every time), and to avoid
+ // problems we can't call m_pSA->PrepareSurface (flips? clears?).
+ return S_OK;
+ /*
+ return m_pSA->PrepareSurface(dwUserID, lpSurface, dwSurfaceFlags);
+ */
}
STDMETHODIMP CVMR7AllocatorPresenter::AdviseNotify(IVMRSurfaceAllocatorNotify* lpIVMRSurfAllocNotify)
{
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- m_pIVMRSurfAllocNotify = lpIVMRSurfAllocNotify;
+ m_pIVMRSurfAllocNotify = lpIVMRSurfAllocNotify;
- HRESULT hr;
- HMONITOR hMonitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
- if (FAILED(hr = m_pIVMRSurfAllocNotify->SetDDrawDevice(m_pDD, hMonitor))) {
- return hr;
- }
+ HRESULT hr;
+ HMONITOR hMonitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
+ if (FAILED(hr = m_pIVMRSurfAllocNotify->SetDDrawDevice(m_pDD, hMonitor))) {
+ return hr;
+ }
- return m_pSA->AdviseNotify(lpIVMRSurfAllocNotify);
+ return m_pSA->AdviseNotify(lpIVMRSurfAllocNotify);
}
// IVMRImagePresenter
STDMETHODIMP CVMR7AllocatorPresenter::StartPresenting(DWORD_PTR dwUserID)
{
- if (!m_bPendingResetDevice) {
- ASSERT(m_pD3DDev);
- }
+ if (!m_bPendingResetDevice) {
+ ASSERT(m_pD3DDev);
+ }
- CAutoLock cAutoLock(this);
+ CAutoLock cAutoLock(this);
- return m_pD3DDev ? S_OK : E_FAIL;
+ return m_pD3DDev ? S_OK : E_FAIL;
}
STDMETHODIMP CVMR7AllocatorPresenter::StopPresenting(DWORD_PTR dwUserID)
{
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CVMR7AllocatorPresenter::PresentImage(DWORD_PTR dwUserID, VMRPRESENTATIONINFO* lpPresInfo)
{
- if (!lpPresInfo || !lpPresInfo->lpSurf) {
- return E_POINTER;
- }
-
- CAutoLock cAutoLock(this);
-
- if (!m_bPendingResetDevice) {
- m_pVideoSurface->Blt(NULL, lpPresInfo->lpSurf, NULL, DDBLT_WAIT, NULL);
- }
-
- if (lpPresInfo->rtEnd > lpPresInfo->rtStart) {
- REFERENCE_TIME rtTimePerFrame = lpPresInfo->rtEnd - lpPresInfo->rtStart;
- m_fps = 10000000.0 / rtTimePerFrame;
-
- if (m_pSubPicQueue) {
- m_pSubPicQueue->SetFPS(m_fps);
-
- if (m_fUseInternalTimer && !g_bExternalSubtitleTime) {
- __super::SetTime(g_tSegmentStart + g_tSampleStart);
- }
- }
- }
-
- CSize VideoSize = m_NativeVideoSize;
- int arx = lpPresInfo->szAspectRatio.cx, ary = lpPresInfo->szAspectRatio.cy;
- if (arx > 0 && ary > 0) {
- VideoSize.cx = VideoSize.cy*arx/ary;
- }
- if (VideoSize != GetVideoSize()) {
- m_AspectRatio.SetSize(arx, ary);
- AfxGetApp()->m_pMainWnd->PostMessage(WM_REARRANGERENDERLESS);
- }
-
- Paint(true);
-
- return S_OK;
+ if (!lpPresInfo || !lpPresInfo->lpSurf) {
+ return E_POINTER;
+ }
+
+ CAutoLock cAutoLock(this);
+
+ if (!m_bPendingResetDevice) {
+ m_pVideoSurface->Blt(NULL, lpPresInfo->lpSurf, NULL, DDBLT_WAIT, NULL);
+ }
+
+ if (lpPresInfo->rtEnd > lpPresInfo->rtStart) {
+ REFERENCE_TIME rtTimePerFrame = lpPresInfo->rtEnd - lpPresInfo->rtStart;
+ m_fps = 10000000.0 / rtTimePerFrame;
+
+ if (m_pSubPicQueue) {
+ m_pSubPicQueue->SetFPS(m_fps);
+
+ if (m_fUseInternalTimer && !g_bExternalSubtitleTime) {
+ __super::SetTime(g_tSegmentStart + g_tSampleStart);
+ }
+ }
+ }
+
+ CSize VideoSize = m_NativeVideoSize;
+ int arx = lpPresInfo->szAspectRatio.cx, ary = lpPresInfo->szAspectRatio.cy;
+ if (arx > 0 && ary > 0) {
+ VideoSize.cx = VideoSize.cy * arx / ary;
+ }
+ if (VideoSize != GetVideoSize()) {
+ m_AspectRatio.SetSize(arx, ary);
+ AfxGetApp()->m_pMainWnd->PostMessage(WM_REARRANGERENDERLESS);
+ }
+
+ Paint(true);
+
+ return S_OK;
}
// IVMRWindowlessControl
@@ -302,100 +302,100 @@ STDMETHODIMP CVMR7AllocatorPresenter::PresentImage(DWORD_PTR dwUserID, VMRPRESEN
STDMETHODIMP CVMR7AllocatorPresenter::GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight)
{
- CSize vs = m_NativeVideoSize, ar = m_AspectRatio;
- // DVD Nav. bug workaround fix
- vs.cx = vs.cy * ar.cx / ar.cy;
- if (lpWidth) {
- *lpWidth = vs.cx;
- }
- if (lpHeight) {
- *lpHeight = vs.cy;
- }
- if (lpARWidth) {
- *lpARWidth = ar.cx;
- }
- if (lpARHeight) {
- *lpARHeight = ar.cy;
- }
- return S_OK;
+ CSize vs = m_NativeVideoSize, ar = m_AspectRatio;
+ // DVD Nav. bug workaround fix
+ vs.cx = vs.cy * ar.cx / ar.cy;
+ if (lpWidth) {
+ *lpWidth = vs.cx;
+ }
+ if (lpHeight) {
+ *lpHeight = vs.cy;
+ }
+ if (lpARWidth) {
+ *lpARWidth = ar.cx;
+ }
+ if (lpARHeight) {
+ *lpARHeight = ar.cy;
+ }
+ return S_OK;
}
STDMETHODIMP CVMR7AllocatorPresenter::GetMinIdealVideoSize(LONG* lpWidth, LONG* lpHeight)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR7AllocatorPresenter::GetMaxIdealVideoSize(LONG* lpWidth, LONG* lpHeight)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR7AllocatorPresenter::SetVideoPosition(const LPRECT lpSRCRect, const LPRECT lpDSTRect)
{
- return E_NOTIMPL; // we have our own method for this
+ return E_NOTIMPL; // we have our own method for this
}
STDMETHODIMP CVMR7AllocatorPresenter::GetVideoPosition(LPRECT lpSRCRect, LPRECT lpDSTRect)
{
- CopyRect(lpSRCRect, CRect(CPoint(0, 0), m_NativeVideoSize));
- CopyRect(lpDSTRect, &m_VideoRect);
- // DVD Nav. bug workaround fix
- GetNativeVideoSize(&lpSRCRect->right, &lpSRCRect->bottom, NULL, NULL);
- return S_OK;
+ CopyRect(lpSRCRect, CRect(CPoint(0, 0), m_NativeVideoSize));
+ CopyRect(lpDSTRect, &m_VideoRect);
+ // DVD Nav. bug workaround fix
+ GetNativeVideoSize(&lpSRCRect->right, &lpSRCRect->bottom, NULL, NULL);
+ return S_OK;
}
STDMETHODIMP CVMR7AllocatorPresenter::GetAspectRatioMode(DWORD* lpAspectRatioMode)
{
- if (lpAspectRatioMode) {
- *lpAspectRatioMode = AM_ARMODE_STRETCHED;
- }
- return S_OK;
+ if (lpAspectRatioMode) {
+ *lpAspectRatioMode = AM_ARMODE_STRETCHED;
+ }
+ return S_OK;
}
STDMETHODIMP CVMR7AllocatorPresenter::SetAspectRatioMode(DWORD AspectRatioMode)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR7AllocatorPresenter::SetVideoClippingWindow(HWND hwnd)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR7AllocatorPresenter::RepaintVideo(HWND hwnd, HDC hdc)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR7AllocatorPresenter::DisplayModeChanged()
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR7AllocatorPresenter::GetCurrentImage(BYTE** lpDib)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR7AllocatorPresenter::SetBorderColor(COLORREF Clr)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR7AllocatorPresenter::GetBorderColor(COLORREF* lpClr)
{
- if (lpClr) {
- *lpClr = 0;
- }
- return S_OK;
+ if (lpClr) {
+ *lpClr = 0;
+ }
+ return S_OK;
}
STDMETHODIMP CVMR7AllocatorPresenter::SetColorKey(COLORREF Clr)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR7AllocatorPresenter::GetColorKey(COLORREF* lpClr)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
diff --git a/src/filters/renderer/VideoRenderers/VMR7AllocatorPresenter.h b/src/filters/renderer/VideoRenderers/VMR7AllocatorPresenter.h
index bb3c215d8..c62cc939b 100644
--- a/src/filters/renderer/VideoRenderers/VMR7AllocatorPresenter.h
+++ b/src/filters/renderer/VideoRenderers/VMR7AllocatorPresenter.h
@@ -28,57 +28,57 @@
namespace DSObjects
{
- class CVMR7AllocatorPresenter
- : public CDX7AllocatorPresenter
- , public IVMRSurfaceAllocator
- , public IVMRImagePresenter
- , public IVMRWindowlessControl
- {
- CComPtr<IVMRSurfaceAllocatorNotify> m_pIVMRSurfAllocNotify;
- CComPtr<IVMRSurfaceAllocator> m_pSA;
+ class CVMR7AllocatorPresenter
+ : public CDX7AllocatorPresenter
+ , public IVMRSurfaceAllocator
+ , public IVMRImagePresenter
+ , public IVMRWindowlessControl
+ {
+ CComPtr<IVMRSurfaceAllocatorNotify> m_pIVMRSurfAllocNotify;
+ CComPtr<IVMRSurfaceAllocator> m_pSA;
- HRESULT CreateDevice();
- void DeleteSurfaces();
+ HRESULT CreateDevice();
+ void DeleteSurfaces();
- bool m_fUseInternalTimer;
+ bool m_fUseInternalTimer;
- public:
- CVMR7AllocatorPresenter(HWND hWnd, HRESULT& hr);
+ public:
+ CVMR7AllocatorPresenter(HWND hWnd, HRESULT& hr);
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // ISubPicAllocatorPresenter
- STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
- STDMETHODIMP_(void) SetTime(REFERENCE_TIME rtNow);
+ // ISubPicAllocatorPresenter
+ STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
+ STDMETHODIMP_(void) SetTime(REFERENCE_TIME rtNow);
- // IVMRSurfaceAllocator
- STDMETHODIMP AllocateSurface(DWORD_PTR dwUserID, VMRALLOCATIONINFO* lpAllocInfo, DWORD* lpdwBuffer, LPDIRECTDRAWSURFACE7* lplpSurface);
- STDMETHODIMP FreeSurface(DWORD_PTR dwUserID);
- STDMETHODIMP PrepareSurface(DWORD_PTR dwUserID, IDirectDrawSurface7* lpSurface, DWORD dwSurfaceFlags);
- STDMETHODIMP AdviseNotify(IVMRSurfaceAllocatorNotify* lpIVMRSurfAllocNotify);
+ // IVMRSurfaceAllocator
+ STDMETHODIMP AllocateSurface(DWORD_PTR dwUserID, VMRALLOCATIONINFO* lpAllocInfo, DWORD* lpdwBuffer, LPDIRECTDRAWSURFACE7* lplpSurface);
+ STDMETHODIMP FreeSurface(DWORD_PTR dwUserID);
+ STDMETHODIMP PrepareSurface(DWORD_PTR dwUserID, IDirectDrawSurface7* lpSurface, DWORD dwSurfaceFlags);
+ STDMETHODIMP AdviseNotify(IVMRSurfaceAllocatorNotify* lpIVMRSurfAllocNotify);
- // IVMRImagePresenter
- STDMETHODIMP StartPresenting(DWORD_PTR dwUserID);
- STDMETHODIMP StopPresenting(DWORD_PTR dwUserID);
- STDMETHODIMP PresentImage(DWORD_PTR dwUserID, VMRPRESENTATIONINFO* lpPresInfo);
+ // IVMRImagePresenter
+ STDMETHODIMP StartPresenting(DWORD_PTR dwUserID);
+ STDMETHODIMP StopPresenting(DWORD_PTR dwUserID);
+ STDMETHODIMP PresentImage(DWORD_PTR dwUserID, VMRPRESENTATIONINFO* lpPresInfo);
- // IVMRWindowlessControl
- STDMETHODIMP GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight);
- STDMETHODIMP GetMinIdealVideoSize(LONG* lpWidth, LONG* lpHeight);
- STDMETHODIMP GetMaxIdealVideoSize(LONG* lpWidth, LONG* lpHeight);
- STDMETHODIMP SetVideoPosition(const LPRECT lpSRCRect, const LPRECT lpDSTRect);
- STDMETHODIMP GetVideoPosition(LPRECT lpSRCRect, LPRECT lpDSTRect);
- STDMETHODIMP GetAspectRatioMode(DWORD* lpAspectRatioMode);
- STDMETHODIMP SetAspectRatioMode(DWORD AspectRatioMode);
- STDMETHODIMP SetVideoClippingWindow(HWND hwnd);
- STDMETHODIMP RepaintVideo(HWND hwnd, HDC hdc);
- STDMETHODIMP DisplayModeChanged();
- STDMETHODIMP GetCurrentImage(BYTE** lpDib);
- STDMETHODIMP SetBorderColor(COLORREF Clr);
- STDMETHODIMP GetBorderColor(COLORREF* lpClr);
- STDMETHODIMP SetColorKey(COLORREF Clr);
- STDMETHODIMP GetColorKey(COLORREF* lpClr);
- };
+ // IVMRWindowlessControl
+ STDMETHODIMP GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight);
+ STDMETHODIMP GetMinIdealVideoSize(LONG* lpWidth, LONG* lpHeight);
+ STDMETHODIMP GetMaxIdealVideoSize(LONG* lpWidth, LONG* lpHeight);
+ STDMETHODIMP SetVideoPosition(const LPRECT lpSRCRect, const LPRECT lpDSTRect);
+ STDMETHODIMP GetVideoPosition(LPRECT lpSRCRect, LPRECT lpDSTRect);
+ STDMETHODIMP GetAspectRatioMode(DWORD* lpAspectRatioMode);
+ STDMETHODIMP SetAspectRatioMode(DWORD AspectRatioMode);
+ STDMETHODIMP SetVideoClippingWindow(HWND hwnd);
+ STDMETHODIMP RepaintVideo(HWND hwnd, HDC hdc);
+ STDMETHODIMP DisplayModeChanged();
+ STDMETHODIMP GetCurrentImage(BYTE** lpDib);
+ STDMETHODIMP SetBorderColor(COLORREF Clr);
+ STDMETHODIMP GetBorderColor(COLORREF* lpClr);
+ STDMETHODIMP SetColorKey(COLORREF Clr);
+ STDMETHODIMP GetColorKey(COLORREF* lpClr);
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/VMR9AllocatorPresenter.cpp b/src/filters/renderer/VideoRenderers/VMR9AllocatorPresenter.cpp
index 1683ed216..ba552aade 100644
--- a/src/filters/renderer/VideoRenderers/VMR9AllocatorPresenter.cpp
+++ b/src/filters/renderer/VideoRenderers/VMR9AllocatorPresenter.cpp
@@ -40,442 +40,442 @@ using namespace DSObjects;
#define MY_USER_ID 0x6ABE51
-CVMR9AllocatorPresenter::CVMR9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString &_Error)
- : CDX9AllocatorPresenter(hWnd, bFullscreen, hr, false, _Error)
- , m_fUseInternalTimer(false)
- , m_rtPrevStart(-1)
+CVMR9AllocatorPresenter::CVMR9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString& _Error)
+ : CDX9AllocatorPresenter(hWnd, bFullscreen, hr, false, _Error)
+ , m_fUseInternalTimer(false)
+ , m_rtPrevStart(-1)
{
}
STDMETHODIMP CVMR9AllocatorPresenter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(IVMRSurfaceAllocator9)
- QI(IVMRImagePresenter9)
- QI(IVMRWindowlessControl9)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IVMRSurfaceAllocator9)
+ QI(IVMRImagePresenter9)
+ QI(IVMRWindowlessControl9)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
-HRESULT CVMR9AllocatorPresenter::CreateDevice(CString &_Error)
+HRESULT CVMR9AllocatorPresenter::CreateDevice(CString& _Error)
{
- HRESULT hr = __super::CreateDevice(_Error);
- if (FAILED(hr)) {
- return hr;
- }
-
- if (m_pIVMRSurfAllocNotify) {
- HMONITOR hMonitor = m_pD3D->GetAdapterMonitor(m_CurrentAdapter);
- if (FAILED(hr = m_pIVMRSurfAllocNotify->ChangeD3DDevice(m_pD3DDev, hMonitor))) {
- _Error += L"m_pIVMRSurfAllocNotify->ChangeD3DDevice failed";
- return hr; //return false;
- }
- }
-
- return hr;
+ HRESULT hr = __super::CreateDevice(_Error);
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ if (m_pIVMRSurfAllocNotify) {
+ HMONITOR hMonitor = m_pD3D->GetAdapterMonitor(m_CurrentAdapter);
+ if (FAILED(hr = m_pIVMRSurfAllocNotify->ChangeD3DDevice(m_pD3DDev, hMonitor))) {
+ _Error += L"m_pIVMRSurfAllocNotify->ChangeD3DDevice failed";
+ return hr; //return false;
+ }
+ }
+
+ return hr;
}
void CVMR9AllocatorPresenter::DeleteSurfaces()
{
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_RenderLock);
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_RenderLock);
- m_pSurfaces.RemoveAll();
+ m_pSurfaces.RemoveAll();
- return __super::DeleteSurfaces();
+ return __super::DeleteSurfaces();
}
STDMETHODIMP CVMR9AllocatorPresenter::CreateRenderer(IUnknown** ppRenderer)
{
- CheckPointer(ppRenderer, E_POINTER);
+ CheckPointer(ppRenderer, E_POINTER);
- *ppRenderer = NULL;
+ *ppRenderer = NULL;
- HRESULT hr;
+ HRESULT hr;
- do {
- CMacrovisionKicker* pMK = DNew CMacrovisionKicker(NAME("CMacrovisionKicker"), NULL);
- CComPtr<IUnknown> pUnk = (IUnknown*)(INonDelegatingUnknown*)pMK;
+ do {
+ CMacrovisionKicker* pMK = DNew CMacrovisionKicker(NAME("CMacrovisionKicker"), NULL);
+ CComPtr<IUnknown> pUnk = (IUnknown*)(INonDelegatingUnknown*)pMK;
- COuterVMR9 *pOuter = DNew COuterVMR9(NAME("COuterVMR9"), pUnk, &m_VMR9AlphaBitmap, this);
+ COuterVMR9* pOuter = DNew COuterVMR9(NAME("COuterVMR9"), pUnk, &m_VMR9AlphaBitmap, this);
- pMK->SetInner((IUnknown*)(INonDelegatingUnknown*)pOuter);
- CComQIPtr<IBaseFilter> pBF = pUnk;
+ pMK->SetInner((IUnknown*)(INonDelegatingUnknown*)pOuter);
+ CComQIPtr<IBaseFilter> pBF = pUnk;
- CComPtr<IPin> pPin = GetFirstPin(pBF);
- CComQIPtr<IMemInputPin> pMemInputPin = pPin;
- m_fUseInternalTimer = HookNewSegmentAndReceive((IPinC*)(IPin*)pPin, (IMemInputPinC*)(IMemInputPin*)pMemInputPin);
+ CComPtr<IPin> pPin = GetFirstPin(pBF);
+ CComQIPtr<IMemInputPin> pMemInputPin = pPin;
+ m_fUseInternalTimer = HookNewSegmentAndReceive((IPinC*)(IPin*)pPin, (IMemInputPinC*)(IMemInputPin*)pMemInputPin);
- if (CComQIPtr<IAMVideoAccelerator> pAMVA = pPin) {
- HookAMVideoAccelerator((IAMVideoAcceleratorC*)(IAMVideoAccelerator*)pAMVA);
- }
+ if (CComQIPtr<IAMVideoAccelerator> pAMVA = pPin) {
+ HookAMVideoAccelerator((IAMVideoAcceleratorC*)(IAMVideoAccelerator*)pAMVA);
+ }
- CComQIPtr<IVMRFilterConfig9> pConfig = pBF;
- if (!pConfig) {
- break;
- }
+ CComQIPtr<IVMRFilterConfig9> pConfig = pBF;
+ if (!pConfig) {
+ break;
+ }
- CRenderersSettings& s = GetRenderersSettings();
+ CRenderersSettings& s = GetRenderersSettings();
- if (s.fVMR9MixerMode) {
- if (FAILED(hr = pConfig->SetNumberOfStreams(1))) {
- break;
- }
+ if (s.fVMR9MixerMode) {
+ if (FAILED(hr = pConfig->SetNumberOfStreams(1))) {
+ break;
+ }
- if (CComQIPtr<IVMRMixerControl9> pMC = pBF) {
- DWORD dwPrefs;
- pMC->GetMixingPrefs(&dwPrefs);
+ if (CComQIPtr<IVMRMixerControl9> pMC = pBF) {
+ DWORD dwPrefs;
+ pMC->GetMixingPrefs(&dwPrefs);
- // See http://msdn.microsoft.com/en-us/library/dd390928(VS.85).aspx
- dwPrefs |= MixerPref9_NonSquareMixing;
- dwPrefs |= MixerPref9_NoDecimation;
- if (s.fVMR9MixerYUV && !SysVersion::IsVistaOrLater()) {
- dwPrefs &= ~MixerPref9_RenderTargetMask;
- dwPrefs |= MixerPref9_RenderTargetYUV;
- }
- pMC->SetMixingPrefs(dwPrefs);
- }
- }
+ // See http://msdn.microsoft.com/en-us/library/dd390928(VS.85).aspx
+ dwPrefs |= MixerPref9_NonSquareMixing;
+ dwPrefs |= MixerPref9_NoDecimation;
+ if (s.fVMR9MixerYUV && !SysVersion::IsVistaOrLater()) {
+ dwPrefs &= ~MixerPref9_RenderTargetMask;
+ dwPrefs |= MixerPref9_RenderTargetYUV;
+ }
+ pMC->SetMixingPrefs(dwPrefs);
+ }
+ }
- if (FAILED(hr = pConfig->SetRenderingMode(VMR9Mode_Renderless))) {
- break;
- }
+ if (FAILED(hr = pConfig->SetRenderingMode(VMR9Mode_Renderless))) {
+ break;
+ }
- CComQIPtr<IVMRSurfaceAllocatorNotify9> pSAN = pBF;
- if (!pSAN) {
- break;
- }
+ CComQIPtr<IVMRSurfaceAllocatorNotify9> pSAN = pBF;
+ if (!pSAN) {
+ break;
+ }
- if (FAILED(hr = pSAN->AdviseSurfaceAllocator(MY_USER_ID, static_cast<IVMRSurfaceAllocator9*>(this)))
- || FAILED(hr = AdviseNotify(pSAN))) {
- break;
- }
+ if (FAILED(hr = pSAN->AdviseSurfaceAllocator(MY_USER_ID, static_cast<IVMRSurfaceAllocator9*>(this)))
+ || FAILED(hr = AdviseNotify(pSAN))) {
+ break;
+ }
- *ppRenderer = (IUnknown*)pBF.Detach();
+ *ppRenderer = (IUnknown*)pBF.Detach();
- return S_OK;
- } while (0);
+ return S_OK;
+ } while (0);
- return E_FAIL;
+ return E_FAIL;
}
STDMETHODIMP_(void) CVMR9AllocatorPresenter::SetTime(REFERENCE_TIME rtNow)
{
- __super::SetTime(rtNow);
- //m_fUseInternalTimer = false;
+ __super::SetTime(rtNow);
+ //m_fUseInternalTimer = false;
}
// IVMRSurfaceAllocator9
STDMETHODIMP CVMR9AllocatorPresenter::InitializeDevice(DWORD_PTR dwUserID, VMR9AllocationInfo* lpAllocInfo, DWORD* lpNumBuffers)
{
- CAutoLock lock(this);
- CAutoLock cRenderLock(&m_RenderLock);
-
- if (!lpAllocInfo || !lpNumBuffers) {
- return E_POINTER;
- }
-
- if (!m_pIVMRSurfAllocNotify) {
- return E_FAIL;
- }
-
- // WTF: Is this some kind of forgotten debug code ?
- if ((GetAsyncKeyState(VK_CONTROL)&0x80000000))
- if (lpAllocInfo->Format == '21VY' || lpAllocInfo->Format == '024I') {
- return E_FAIL;
- }
-
- // The surfaces should already be free when InitializeDevice is called
- DeleteSurfaces();
-
- DWORD nOriginal = *lpNumBuffers;
-
- if (*lpNumBuffers == 1) {
- *lpNumBuffers = 4;
- m_nVMR9Surfaces = 4;
- } else {
- m_nVMR9Surfaces = 0;
- }
- m_pSurfaces.SetCount(*lpNumBuffers);
-
- int w = lpAllocInfo->dwWidth;
- int h = abs((int)lpAllocInfo->dwHeight);
-
- HRESULT hr;
-
- if (lpAllocInfo->dwFlags & VMR9AllocFlag_3DRenderTarget) {
- lpAllocInfo->dwFlags |= VMR9AllocFlag_TextureSurface;
- }
-
- hr = m_pIVMRSurfAllocNotify->AllocateSurfaceHelper(lpAllocInfo, lpNumBuffers, &m_pSurfaces[0]);
- if (FAILED(hr)) {
- return hr;
- }
-
- m_pSurfaces.SetCount(*lpNumBuffers);
-
- m_bNeedCheckSample = true;
- m_NativeVideoSize = CSize(w, h);
- CSize VideoSize = GetVisibleVideoSize();
- int arx = lpAllocInfo->szAspectRatio.cx;
- int ary = lpAllocInfo->szAspectRatio.cy;
- if (arx > 0 && ary > 0) {
- arx = arx * VideoSize.cx / m_NativeVideoSize.cx;
- ary = ary * VideoSize.cy / m_NativeVideoSize.cy;
- m_AspectRatio.SetSize(arx, ary);
- } else {
- m_AspectRatio = VideoSize;
- }
-
- if (FAILED(hr = AllocSurfaces())) {
- return hr;
- }
-
- if (!(lpAllocInfo->dwFlags & VMR9AllocFlag_TextureSurface)) {
- // test if the colorspace is acceptable
- if (FAILED(hr = m_pD3DDev->StretchRect(m_pSurfaces[0], NULL, m_pVideoSurface[m_nCurSurface], NULL, D3DTEXF_NONE))) {
- DeleteSurfaces();
- return E_FAIL;
- }
- }
-
- hr = m_pD3DDev->ColorFill(m_pVideoSurface[m_nCurSurface], NULL, 0);
-
- if (m_nVMR9Surfaces && m_nVMR9Surfaces != (int)*lpNumBuffers) {
- m_nVMR9Surfaces = *lpNumBuffers;
- }
- *lpNumBuffers = min(nOriginal, *lpNumBuffers);
- m_iVMR9Surface = 0;
-
- return hr;
+ CAutoLock lock(this);
+ CAutoLock cRenderLock(&m_RenderLock);
+
+ if (!lpAllocInfo || !lpNumBuffers) {
+ return E_POINTER;
+ }
+
+ if (!m_pIVMRSurfAllocNotify) {
+ return E_FAIL;
+ }
+
+ // WTF: Is this some kind of forgotten debug code ?
+ if ((GetAsyncKeyState(VK_CONTROL) & 0x80000000))
+ if (lpAllocInfo->Format == '21VY' || lpAllocInfo->Format == '024I') {
+ return E_FAIL;
+ }
+
+ // The surfaces should already be free when InitializeDevice is called
+ DeleteSurfaces();
+
+ DWORD nOriginal = *lpNumBuffers;
+
+ if (*lpNumBuffers == 1) {
+ *lpNumBuffers = 4;
+ m_nVMR9Surfaces = 4;
+ } else {
+ m_nVMR9Surfaces = 0;
+ }
+ m_pSurfaces.SetCount(*lpNumBuffers);
+
+ int w = lpAllocInfo->dwWidth;
+ int h = abs((int)lpAllocInfo->dwHeight);
+
+ HRESULT hr;
+
+ if (lpAllocInfo->dwFlags & VMR9AllocFlag_3DRenderTarget) {
+ lpAllocInfo->dwFlags |= VMR9AllocFlag_TextureSurface;
+ }
+
+ hr = m_pIVMRSurfAllocNotify->AllocateSurfaceHelper(lpAllocInfo, lpNumBuffers, &m_pSurfaces[0]);
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ m_pSurfaces.SetCount(*lpNumBuffers);
+
+ m_bNeedCheckSample = true;
+ m_NativeVideoSize = CSize(w, h);
+ CSize VideoSize = GetVisibleVideoSize();
+ int arx = lpAllocInfo->szAspectRatio.cx;
+ int ary = lpAllocInfo->szAspectRatio.cy;
+ if (arx > 0 && ary > 0) {
+ arx = arx * VideoSize.cx / m_NativeVideoSize.cx;
+ ary = ary * VideoSize.cy / m_NativeVideoSize.cy;
+ m_AspectRatio.SetSize(arx, ary);
+ } else {
+ m_AspectRatio = VideoSize;
+ }
+
+ if (FAILED(hr = AllocSurfaces())) {
+ return hr;
+ }
+
+ if (!(lpAllocInfo->dwFlags & VMR9AllocFlag_TextureSurface)) {
+ // test if the colorspace is acceptable
+ if (FAILED(hr = m_pD3DDev->StretchRect(m_pSurfaces[0], NULL, m_pVideoSurface[m_nCurSurface], NULL, D3DTEXF_NONE))) {
+ DeleteSurfaces();
+ return E_FAIL;
+ }
+ }
+
+ hr = m_pD3DDev->ColorFill(m_pVideoSurface[m_nCurSurface], NULL, 0);
+
+ if (m_nVMR9Surfaces && m_nVMR9Surfaces != (int)*lpNumBuffers) {
+ m_nVMR9Surfaces = *lpNumBuffers;
+ }
+ *lpNumBuffers = min(nOriginal, *lpNumBuffers);
+ m_iVMR9Surface = 0;
+
+ return hr;
}
STDMETHODIMP CVMR9AllocatorPresenter::TerminateDevice(DWORD_PTR dwUserID)
{
- // We should not free the surfaces until we are told to !
- // Thats what TerminateDevice is for
- DeleteSurfaces();
- return S_OK;
+ // We should not free the surfaces until we are told to !
+ // Thats what TerminateDevice is for
+ DeleteSurfaces();
+ return S_OK;
}
STDMETHODIMP CVMR9AllocatorPresenter::GetSurface(DWORD_PTR dwUserID, DWORD SurfaceIndex, DWORD SurfaceFlags, IDirect3DSurface9** lplpSurface)
{
- if (!lplpSurface) {
- return E_POINTER;
- }
-
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_RenderLock);
-
- /*
- SurfaceIndex = 0
- m_pSurfaces.GetCount() = 0
-
- Scenario:
- Thread 1:
- Wait on m_RenderLock in this function
- Thread 2:
- Have m_RenderLock and removes all m_pSurfaces
- (Happens by calling ex CDX9AllocatorPresenter::ResetDevice)
-
- When thread 2 releases the lock thread 1 gets it and boom!
-
- Possible solution: Adding object lock and moving m_RenderLock to try to fix this threading issue.
- This problem occurs when moving the window from display a to display b.
-
- NOTE: This is just a workaround.
- CDX9AllocatorPresenter doesn't follow the rules which is why this happened.
- And it is used by EVR custom (which it really shouldn't) so i can't easily fix it without breaking EVR custom.
- */
- if (SurfaceIndex >= m_pSurfaces.GetCount()) {
- return E_FAIL;
- }
-
- if (m_nVMR9Surfaces) {
- ++m_iVMR9Surface;
- m_iVMR9Surface = m_iVMR9Surface % m_nVMR9Surfaces;
- *lplpSurface = m_pSurfaces[m_iVMR9Surface + SurfaceIndex];
- (*lplpSurface)->AddRef();
- } else {
- m_iVMR9Surface = SurfaceIndex;
- *lplpSurface = m_pSurfaces[SurfaceIndex];
- (*lplpSurface)->AddRef();
- }
-
- return S_OK;
+ if (!lplpSurface) {
+ return E_POINTER;
+ }
+
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_RenderLock);
+
+ /*
+ SurfaceIndex = 0
+ m_pSurfaces.GetCount() = 0
+
+ Scenario:
+ Thread 1:
+ Wait on m_RenderLock in this function
+ Thread 2:
+ Have m_RenderLock and removes all m_pSurfaces
+ (Happens by calling ex CDX9AllocatorPresenter::ResetDevice)
+
+ When thread 2 releases the lock thread 1 gets it and boom!
+
+ Possible solution: Adding object lock and moving m_RenderLock to try to fix this threading issue.
+ This problem occurs when moving the window from display a to display b.
+
+ NOTE: This is just a workaround.
+ CDX9AllocatorPresenter doesn't follow the rules which is why this happened.
+ And it is used by EVR custom (which it really shouldn't) so i can't easily fix it without breaking EVR custom.
+ */
+ if (SurfaceIndex >= m_pSurfaces.GetCount()) {
+ return E_FAIL;
+ }
+
+ if (m_nVMR9Surfaces) {
+ ++m_iVMR9Surface;
+ m_iVMR9Surface = m_iVMR9Surface % m_nVMR9Surfaces;
+ *lplpSurface = m_pSurfaces[m_iVMR9Surface + SurfaceIndex];
+ (*lplpSurface)->AddRef();
+ } else {
+ m_iVMR9Surface = SurfaceIndex;
+ *lplpSurface = m_pSurfaces[SurfaceIndex];
+ (*lplpSurface)->AddRef();
+ }
+
+ return S_OK;
}
STDMETHODIMP CVMR9AllocatorPresenter::AdviseNotify(IVMRSurfaceAllocatorNotify9* lpIVMRSurfAllocNotify)
{
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_RenderLock);
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_RenderLock);
- m_pIVMRSurfAllocNotify = lpIVMRSurfAllocNotify;
+ m_pIVMRSurfAllocNotify = lpIVMRSurfAllocNotify;
- HRESULT hr;
- HMONITOR hMonitor = m_pD3D->GetAdapterMonitor(GetAdapter(m_pD3D));
- if (FAILED(hr = m_pIVMRSurfAllocNotify->SetD3DDevice(m_pD3DDev, hMonitor))) {
- return hr;
- }
+ HRESULT hr;
+ HMONITOR hMonitor = m_pD3D->GetAdapterMonitor(GetAdapter(m_pD3D));
+ if (FAILED(hr = m_pIVMRSurfAllocNotify->SetD3DDevice(m_pD3DDev, hMonitor))) {
+ return hr;
+ }
- return S_OK;
+ return S_OK;
}
// IVMRImagePresenter9
STDMETHODIMP CVMR9AllocatorPresenter::StartPresenting(DWORD_PTR dwUserID)
{
- if (!m_bPendingResetDevice) {
- ASSERT(m_pD3DDev);
- }
+ if (!m_bPendingResetDevice) {
+ ASSERT(m_pD3DDev);
+ }
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_RenderLock);
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_RenderLock);
- return m_pD3DDev ? S_OK : E_FAIL;
+ return m_pD3DDev ? S_OK : E_FAIL;
}
STDMETHODIMP CVMR9AllocatorPresenter::StopPresenting(DWORD_PTR dwUserID)
{
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CVMR9AllocatorPresenter::PresentImage(DWORD_PTR dwUserID, VMR9PresentationInfo* lpPresInfo)
{
- SetThreadName((DWORD)-1, "CVMR9AllocatorPresenter");
- CheckPointer(m_pIVMRSurfAllocNotify, E_UNEXPECTED);
-
- if (m_rtTimePerFrame == 0 || m_bNeedCheckSample) {
- m_bNeedCheckSample = false;
- CComPtr<IBaseFilter> pVMR9;
- CComPtr<IPin> pPin;
- CMediaType mt;
-
- if (SUCCEEDED (m_pIVMRSurfAllocNotify->QueryInterface (__uuidof(IBaseFilter), (void**)&pVMR9)) &&
- SUCCEEDED (pVMR9->FindPin(L"VMR Input0", &pPin)) &&
- SUCCEEDED (pPin->ConnectionMediaType(&mt)) ) {
- ExtractAvgTimePerFrame (&mt, m_rtTimePerFrame);
-
- CSize NativeVideoSize = m_NativeVideoSize;
- CSize AspectRatio = m_AspectRatio;
- if (mt.formattype==FORMAT_VideoInfo || mt.formattype==FORMAT_MPEGVideo) {
- VIDEOINFOHEADER *vh = (VIDEOINFOHEADER*)mt.pbFormat;
-
- NativeVideoSize = CSize(vh->bmiHeader.biWidth, abs(vh->bmiHeader.biHeight));
- if (vh->rcTarget.right - vh->rcTarget.left > 0) {
- NativeVideoSize.cx = vh->rcTarget.right - vh->rcTarget.left;
- } else if (vh->rcSource.right - vh->rcSource.left > 0) {
- NativeVideoSize.cx = vh->rcSource.right - vh->rcSource.left;
- }
-
- if (vh->rcTarget.bottom - vh->rcTarget.top > 0) {
- NativeVideoSize.cy = vh->rcTarget.bottom - vh->rcTarget.top;
- } else if (vh->rcSource.bottom - vh->rcSource.top > 0) {
- NativeVideoSize.cy = vh->rcSource.bottom - vh->rcSource.top;
- }
- } else if (mt.formattype==FORMAT_VideoInfo2 || mt.formattype==FORMAT_MPEG2Video) {
- VIDEOINFOHEADER2 *vh = (VIDEOINFOHEADER2*)mt.pbFormat;
-
- if (vh->dwPictAspectRatioX && vh->dwPictAspectRatioY) {
- AspectRatio = CSize(vh->dwPictAspectRatioX, vh->dwPictAspectRatioY);
- }
-
- NativeVideoSize = CSize(vh->bmiHeader.biWidth, abs(vh->bmiHeader.biHeight));
- if (vh->rcTarget.right - vh->rcTarget.left > 0) {
- NativeVideoSize.cx = vh->rcTarget.right - vh->rcTarget.left;
- } else if (vh->rcSource.right - vh->rcSource.left > 0) {
- NativeVideoSize.cx = vh->rcSource.right - vh->rcSource.left;
- }
-
- if (vh->rcTarget.bottom - vh->rcTarget.top > 0) {
- NativeVideoSize.cy = vh->rcTarget.bottom - vh->rcTarget.top;
- } else if (vh->rcSource.bottom - vh->rcSource.top > 0) {
- NativeVideoSize.cy = vh->rcSource.bottom - vh->rcSource.top;
- }
- }
- if (m_NativeVideoSize != NativeVideoSize || m_AspectRatio != AspectRatio) {
- m_NativeVideoSize = NativeVideoSize;
- m_AspectRatio = AspectRatio;
- AfxGetApp()->m_pMainWnd->PostMessage(WM_REARRANGERENDERLESS);
- }
- }
- // If framerate not set by Video Decoder choose 23.97...
- if (m_rtTimePerFrame == 0) {
- m_rtTimePerFrame = 417166;
- }
-
- m_fps = 10000000.0 / m_rtTimePerFrame;
- }
-
- HRESULT hr;
-
- if (!lpPresInfo || !lpPresInfo->lpSurf) {
- return E_POINTER;
- }
-
- CAutoLock cAutoLock(this);
- CAutoLock cRenderLock(&m_RenderLock);
-
- if (lpPresInfo->rtEnd > lpPresInfo->rtStart) {
- if (m_pSubPicQueue) {
- m_pSubPicQueue->SetFPS(m_fps);
-
- if (m_fUseInternalTimer && !g_bExternalSubtitleTime) {
- __super::SetTime(g_tSegmentStart + g_tSampleStart);
- }
- }
- }
-
- CSize VideoSize = GetVisibleVideoSize();
- int arx = lpPresInfo->szAspectRatio.cx;
- int ary = lpPresInfo->szAspectRatio.cy;
- if (arx > 0 && ary > 0) {
- arx = arx * VideoSize.cx / m_NativeVideoSize.cx;
- ary = ary * VideoSize.cy / m_NativeVideoSize.cy;
- VideoSize.cx = VideoSize.cy*arx/ary;
- }
- if (VideoSize != GetVideoSize()) {
- m_AspectRatio.SetSize(arx, ary);
- AfxGetApp()->m_pMainWnd->PostMessage(WM_REARRANGERENDERLESS);
- }
-
- if (!m_bPendingResetDevice) {
- CComPtr<IDirect3DTexture9> pTexture;
- lpPresInfo->lpSurf->GetContainer(IID_IDirect3DTexture9, (void**)&pTexture);
-
- if (pTexture) {
- m_pVideoSurface[m_nCurSurface] = lpPresInfo->lpSurf;
- if (m_pVideoTexture[m_nCurSurface]) {
- m_pVideoTexture[m_nCurSurface] = pTexture;
- }
- } else {
- hr = m_pD3DDev->StretchRect(lpPresInfo->lpSurf, NULL, m_pVideoSurface[m_nCurSurface], NULL, D3DTEXF_NONE);
- }
-
- // Tear test bars
- if (GetRenderersData()->m_fTearingTest) {
- RECT rcTearing;
-
- rcTearing.left = m_nTearingPos;
- rcTearing.top = 0;
- rcTearing.right = rcTearing.left + 4;
- rcTearing.bottom = m_NativeVideoSize.cy;
- m_pD3DDev->ColorFill (m_pVideoSurface[m_nCurSurface], &rcTearing, D3DCOLOR_ARGB (255,255,0,0));
-
- rcTearing.left = (rcTearing.right + 15) % m_NativeVideoSize.cx;
- rcTearing.right = rcTearing.left + 4;
- m_pD3DDev->ColorFill (m_pVideoSurface[m_nCurSurface], &rcTearing, D3DCOLOR_ARGB (255,255,0,0));
-
- m_nTearingPos = (m_nTearingPos + 7) % m_NativeVideoSize.cx;
- }
- }
-
- Paint(true);
-
- return S_OK;
+ SetThreadName((DWORD) - 1, "CVMR9AllocatorPresenter");
+ CheckPointer(m_pIVMRSurfAllocNotify, E_UNEXPECTED);
+
+ if (m_rtTimePerFrame == 0 || m_bNeedCheckSample) {
+ m_bNeedCheckSample = false;
+ CComPtr<IBaseFilter> pVMR9;
+ CComPtr<IPin> pPin;
+ CMediaType mt;
+
+ if (SUCCEEDED(m_pIVMRSurfAllocNotify->QueryInterface(__uuidof(IBaseFilter), (void**)&pVMR9)) &&
+ SUCCEEDED(pVMR9->FindPin(L"VMR Input0", &pPin)) &&
+ SUCCEEDED(pPin->ConnectionMediaType(&mt))) {
+ ExtractAvgTimePerFrame(&mt, m_rtTimePerFrame);
+
+ CSize NativeVideoSize = m_NativeVideoSize;
+ CSize AspectRatio = m_AspectRatio;
+ if (mt.formattype == FORMAT_VideoInfo || mt.formattype == FORMAT_MPEGVideo) {
+ VIDEOINFOHEADER* vh = (VIDEOINFOHEADER*)mt.pbFormat;
+
+ NativeVideoSize = CSize(vh->bmiHeader.biWidth, abs(vh->bmiHeader.biHeight));
+ if (vh->rcTarget.right - vh->rcTarget.left > 0) {
+ NativeVideoSize.cx = vh->rcTarget.right - vh->rcTarget.left;
+ } else if (vh->rcSource.right - vh->rcSource.left > 0) {
+ NativeVideoSize.cx = vh->rcSource.right - vh->rcSource.left;
+ }
+
+ if (vh->rcTarget.bottom - vh->rcTarget.top > 0) {
+ NativeVideoSize.cy = vh->rcTarget.bottom - vh->rcTarget.top;
+ } else if (vh->rcSource.bottom - vh->rcSource.top > 0) {
+ NativeVideoSize.cy = vh->rcSource.bottom - vh->rcSource.top;
+ }
+ } else if (mt.formattype == FORMAT_VideoInfo2 || mt.formattype == FORMAT_MPEG2Video) {
+ VIDEOINFOHEADER2* vh = (VIDEOINFOHEADER2*)mt.pbFormat;
+
+ if (vh->dwPictAspectRatioX && vh->dwPictAspectRatioY) {
+ AspectRatio = CSize(vh->dwPictAspectRatioX, vh->dwPictAspectRatioY);
+ }
+
+ NativeVideoSize = CSize(vh->bmiHeader.biWidth, abs(vh->bmiHeader.biHeight));
+ if (vh->rcTarget.right - vh->rcTarget.left > 0) {
+ NativeVideoSize.cx = vh->rcTarget.right - vh->rcTarget.left;
+ } else if (vh->rcSource.right - vh->rcSource.left > 0) {
+ NativeVideoSize.cx = vh->rcSource.right - vh->rcSource.left;
+ }
+
+ if (vh->rcTarget.bottom - vh->rcTarget.top > 0) {
+ NativeVideoSize.cy = vh->rcTarget.bottom - vh->rcTarget.top;
+ } else if (vh->rcSource.bottom - vh->rcSource.top > 0) {
+ NativeVideoSize.cy = vh->rcSource.bottom - vh->rcSource.top;
+ }
+ }
+ if (m_NativeVideoSize != NativeVideoSize || m_AspectRatio != AspectRatio) {
+ m_NativeVideoSize = NativeVideoSize;
+ m_AspectRatio = AspectRatio;
+ AfxGetApp()->m_pMainWnd->PostMessage(WM_REARRANGERENDERLESS);
+ }
+ }
+ // If framerate not set by Video Decoder choose 23.97...
+ if (m_rtTimePerFrame == 0) {
+ m_rtTimePerFrame = 417166;
+ }
+
+ m_fps = 10000000.0 / m_rtTimePerFrame;
+ }
+
+ HRESULT hr;
+
+ if (!lpPresInfo || !lpPresInfo->lpSurf) {
+ return E_POINTER;
+ }
+
+ CAutoLock cAutoLock(this);
+ CAutoLock cRenderLock(&m_RenderLock);
+
+ if (lpPresInfo->rtEnd > lpPresInfo->rtStart) {
+ if (m_pSubPicQueue) {
+ m_pSubPicQueue->SetFPS(m_fps);
+
+ if (m_fUseInternalTimer && !g_bExternalSubtitleTime) {
+ __super::SetTime(g_tSegmentStart + g_tSampleStart);
+ }
+ }
+ }
+
+ CSize VideoSize = GetVisibleVideoSize();
+ int arx = lpPresInfo->szAspectRatio.cx;
+ int ary = lpPresInfo->szAspectRatio.cy;
+ if (arx > 0 && ary > 0) {
+ arx = arx * VideoSize.cx / m_NativeVideoSize.cx;
+ ary = ary * VideoSize.cy / m_NativeVideoSize.cy;
+ VideoSize.cx = VideoSize.cy * arx / ary;
+ }
+ if (VideoSize != GetVideoSize()) {
+ m_AspectRatio.SetSize(arx, ary);
+ AfxGetApp()->m_pMainWnd->PostMessage(WM_REARRANGERENDERLESS);
+ }
+
+ if (!m_bPendingResetDevice) {
+ CComPtr<IDirect3DTexture9> pTexture;
+ lpPresInfo->lpSurf->GetContainer(IID_IDirect3DTexture9, (void**)&pTexture);
+
+ if (pTexture) {
+ m_pVideoSurface[m_nCurSurface] = lpPresInfo->lpSurf;
+ if (m_pVideoTexture[m_nCurSurface]) {
+ m_pVideoTexture[m_nCurSurface] = pTexture;
+ }
+ } else {
+ hr = m_pD3DDev->StretchRect(lpPresInfo->lpSurf, NULL, m_pVideoSurface[m_nCurSurface], NULL, D3DTEXF_NONE);
+ }
+
+ // Tear test bars
+ if (GetRenderersData()->m_fTearingTest) {
+ RECT rcTearing;
+
+ rcTearing.left = m_nTearingPos;
+ rcTearing.top = 0;
+ rcTearing.right = rcTearing.left + 4;
+ rcTearing.bottom = m_NativeVideoSize.cy;
+ m_pD3DDev->ColorFill(m_pVideoSurface[m_nCurSurface], &rcTearing, D3DCOLOR_ARGB(255, 255, 0, 0));
+
+ rcTearing.left = (rcTearing.right + 15) % m_NativeVideoSize.cx;
+ rcTearing.right = rcTearing.left + 4;
+ m_pD3DDev->ColorFill(m_pVideoSurface[m_nCurSurface], &rcTearing, D3DCOLOR_ARGB(255, 255, 0, 0));
+
+ m_nTearingPos = (m_nTearingPos + 7) % m_NativeVideoSize.cx;
+ }
+ }
+
+ Paint(true);
+
+ return S_OK;
}
// IVMRWindowlessControl9
@@ -486,85 +486,85 @@ STDMETHODIMP CVMR9AllocatorPresenter::PresentImage(DWORD_PTR dwUserID, VMR9Prese
STDMETHODIMP CVMR9AllocatorPresenter::GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight)
{
- if (lpWidth) {
- *lpWidth = m_NativeVideoSize.cx;
- }
- if (lpHeight) {
- *lpHeight = m_NativeVideoSize.cy;
- }
- if (lpARWidth) {
- *lpARWidth = m_AspectRatio.cx;
- }
- if (lpARHeight) {
- *lpARHeight = m_AspectRatio.cy;
- }
- return S_OK;
+ if (lpWidth) {
+ *lpWidth = m_NativeVideoSize.cx;
+ }
+ if (lpHeight) {
+ *lpHeight = m_NativeVideoSize.cy;
+ }
+ if (lpARWidth) {
+ *lpARWidth = m_AspectRatio.cx;
+ }
+ if (lpARHeight) {
+ *lpARHeight = m_AspectRatio.cy;
+ }
+ return S_OK;
}
STDMETHODIMP CVMR9AllocatorPresenter::GetMinIdealVideoSize(LONG* lpWidth, LONG* lpHeight)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR9AllocatorPresenter::GetMaxIdealVideoSize(LONG* lpWidth, LONG* lpHeight)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR9AllocatorPresenter::SetVideoPosition(const LPRECT lpSRCRect, const LPRECT lpDSTRect)
{
- return E_NOTIMPL; // we have our own method for this
+ return E_NOTIMPL; // we have our own method for this
}
STDMETHODIMP CVMR9AllocatorPresenter::GetVideoPosition(LPRECT lpSRCRect, LPRECT lpDSTRect)
{
- CopyRect(lpSRCRect, CRect(CPoint(0, 0), GetVisibleVideoSize()));
- CopyRect(lpDSTRect, &m_VideoRect);
- return S_OK;
+ CopyRect(lpSRCRect, CRect(CPoint(0, 0), GetVisibleVideoSize()));
+ CopyRect(lpDSTRect, &m_VideoRect);
+ return S_OK;
}
STDMETHODIMP CVMR9AllocatorPresenter::GetAspectRatioMode(DWORD* lpAspectRatioMode)
{
- if (lpAspectRatioMode) {
- *lpAspectRatioMode = AM_ARMODE_STRETCHED;
- }
- return S_OK;
+ if (lpAspectRatioMode) {
+ *lpAspectRatioMode = AM_ARMODE_STRETCHED;
+ }
+ return S_OK;
}
STDMETHODIMP CVMR9AllocatorPresenter::SetAspectRatioMode(DWORD AspectRatioMode)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR9AllocatorPresenter::SetVideoClippingWindow(HWND hwnd)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR9AllocatorPresenter::RepaintVideo(HWND hwnd, HDC hdc)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR9AllocatorPresenter::DisplayModeChanged()
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR9AllocatorPresenter::GetCurrentImage(BYTE** lpDib)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR9AllocatorPresenter::SetBorderColor(COLORREF Clr)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CVMR9AllocatorPresenter::GetBorderColor(COLORREF* lpClr)
{
- if (lpClr) {
- *lpClr = 0;
- }
- return S_OK;
+ if (lpClr) {
+ *lpClr = 0;
+ }
+ return S_OK;
}
diff --git a/src/filters/renderer/VideoRenderers/VMR9AllocatorPresenter.h b/src/filters/renderer/VideoRenderers/VMR9AllocatorPresenter.h
index 5eeeddf46..be2e4f911 100644
--- a/src/filters/renderer/VideoRenderers/VMR9AllocatorPresenter.h
+++ b/src/filters/renderer/VideoRenderers/VMR9AllocatorPresenter.h
@@ -26,56 +26,56 @@
namespace DSObjects
{
- class CVMR9AllocatorPresenter
- : public CDX9AllocatorPresenter
- , public IVMRSurfaceAllocator9
- , public IVMRImagePresenter9
- , public IVMRWindowlessControl9
- {
- protected:
- CComPtr<IVMRSurfaceAllocatorNotify9> m_pIVMRSurfAllocNotify;
- CInterfaceArray<IDirect3DSurface9> m_pSurfaces;
+ class CVMR9AllocatorPresenter
+ : public CDX9AllocatorPresenter
+ , public IVMRSurfaceAllocator9
+ , public IVMRImagePresenter9
+ , public IVMRWindowlessControl9
+ {
+ protected:
+ CComPtr<IVMRSurfaceAllocatorNotify9> m_pIVMRSurfAllocNotify;
+ CInterfaceArray<IDirect3DSurface9> m_pSurfaces;
- HRESULT CreateDevice(CString &_Error);
- void DeleteSurfaces();
+ HRESULT CreateDevice(CString& _Error);
+ void DeleteSurfaces();
- bool m_fUseInternalTimer;
- REFERENCE_TIME m_rtPrevStart;
+ bool m_fUseInternalTimer;
+ REFERENCE_TIME m_rtPrevStart;
- public:
- CVMR9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString &_Error);
+ public:
+ CVMR9AllocatorPresenter(HWND hWnd, bool bFullscreen, HRESULT& hr, CString& _Error);
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // ISubPicAllocatorPresenter
- STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
- STDMETHODIMP_(void) SetTime(REFERENCE_TIME rtNow);
+ // ISubPicAllocatorPresenter
+ STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
+ STDMETHODIMP_(void) SetTime(REFERENCE_TIME rtNow);
- // IVMRSurfaceAllocator9
- STDMETHODIMP InitializeDevice(DWORD_PTR dwUserID, VMR9AllocationInfo* lpAllocInfo, DWORD* lpNumBuffers);
- STDMETHODIMP TerminateDevice(DWORD_PTR dwID);
- STDMETHODIMP GetSurface(DWORD_PTR dwUserID, DWORD SurfaceIndex, DWORD SurfaceFlags, IDirect3DSurface9** lplpSurface);
- STDMETHODIMP AdviseNotify(IVMRSurfaceAllocatorNotify9* lpIVMRSurfAllocNotify);
+ // IVMRSurfaceAllocator9
+ STDMETHODIMP InitializeDevice(DWORD_PTR dwUserID, VMR9AllocationInfo* lpAllocInfo, DWORD* lpNumBuffers);
+ STDMETHODIMP TerminateDevice(DWORD_PTR dwID);
+ STDMETHODIMP GetSurface(DWORD_PTR dwUserID, DWORD SurfaceIndex, DWORD SurfaceFlags, IDirect3DSurface9** lplpSurface);
+ STDMETHODIMP AdviseNotify(IVMRSurfaceAllocatorNotify9* lpIVMRSurfAllocNotify);
- // IVMRImagePresenter9
- STDMETHODIMP StartPresenting(DWORD_PTR dwUserID);
- STDMETHODIMP StopPresenting(DWORD_PTR dwUserID);
- STDMETHODIMP PresentImage(DWORD_PTR dwUserID, VMR9PresentationInfo* lpPresInfo);
+ // IVMRImagePresenter9
+ STDMETHODIMP StartPresenting(DWORD_PTR dwUserID);
+ STDMETHODIMP StopPresenting(DWORD_PTR dwUserID);
+ STDMETHODIMP PresentImage(DWORD_PTR dwUserID, VMR9PresentationInfo* lpPresInfo);
- // IVMRWindowlessControl9
- STDMETHODIMP GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight);
- STDMETHODIMP GetMinIdealVideoSize(LONG* lpWidth, LONG* lpHeight);
- STDMETHODIMP GetMaxIdealVideoSize(LONG* lpWidth, LONG* lpHeight);
- STDMETHODIMP SetVideoPosition(const LPRECT lpSRCRect, const LPRECT lpDSTRect);
- STDMETHODIMP GetVideoPosition(LPRECT lpSRCRect, LPRECT lpDSTRect);
- STDMETHODIMP GetAspectRatioMode(DWORD* lpAspectRatioMode);
- STDMETHODIMP SetAspectRatioMode(DWORD AspectRatioMode);
- STDMETHODIMP SetVideoClippingWindow(HWND hwnd);
- STDMETHODIMP RepaintVideo(HWND hwnd, HDC hdc);
- STDMETHODIMP DisplayModeChanged();
- STDMETHODIMP GetCurrentImage(BYTE** lpDib);
- STDMETHODIMP SetBorderColor(COLORREF Clr);
- STDMETHODIMP GetBorderColor(COLORREF* lpClr);
- };
+ // IVMRWindowlessControl9
+ STDMETHODIMP GetNativeVideoSize(LONG* lpWidth, LONG* lpHeight, LONG* lpARWidth, LONG* lpARHeight);
+ STDMETHODIMP GetMinIdealVideoSize(LONG* lpWidth, LONG* lpHeight);
+ STDMETHODIMP GetMaxIdealVideoSize(LONG* lpWidth, LONG* lpHeight);
+ STDMETHODIMP SetVideoPosition(const LPRECT lpSRCRect, const LPRECT lpDSTRect);
+ STDMETHODIMP GetVideoPosition(LPRECT lpSRCRect, LPRECT lpDSTRect);
+ STDMETHODIMP GetAspectRatioMode(DWORD* lpAspectRatioMode);
+ STDMETHODIMP SetAspectRatioMode(DWORD AspectRatioMode);
+ STDMETHODIMP SetVideoClippingWindow(HWND hwnd);
+ STDMETHODIMP RepaintVideo(HWND hwnd, HDC hdc);
+ STDMETHODIMP DisplayModeChanged();
+ STDMETHODIMP GetCurrentImage(BYTE** lpDib);
+ STDMETHODIMP SetBorderColor(COLORREF Clr);
+ STDMETHODIMP GetBorderColor(COLORREF* lpClr);
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/madVRAllocatorPresenter.cpp b/src/filters/renderer/VideoRenderers/madVRAllocatorPresenter.cpp
index de77b1524..a304476b2 100644
--- a/src/filters/renderer/VideoRenderers/madVRAllocatorPresenter.cpp
+++ b/src/filters/renderer/VideoRenderers/madVRAllocatorPresenter.cpp
@@ -33,8 +33,8 @@ using namespace DSObjects;
interface __declspec(uuid("D6EE8031-214E-4E9E-A3A7-458925F933AB"))
IMadVRExclusiveModeInfo :
public IUnknown {
- STDMETHOD_(BOOL, IsExclusiveModeActive)(void) = 0;
- STDMETHOD_(BOOL, IsMadVRSeekbarEnabled)(void) = 0;
+ STDMETHOD_(BOOL, IsExclusiveModeActive)(void) = 0;
+ STDMETHOD_(BOOL, IsMadVRSeekbarEnabled)(void) = 0;
};
@@ -42,220 +42,219 @@ public IUnknown {
// CmadVRAllocatorPresenter
//
-CmadVRAllocatorPresenter::CmadVRAllocatorPresenter(HWND hWnd, HRESULT& hr, CString &_Error)
- : CSubPicAllocatorPresenterImpl(hWnd, hr, &_Error)
- , m_ScreenSize(0, 0)
+CmadVRAllocatorPresenter::CmadVRAllocatorPresenter(HWND hWnd, HRESULT& hr, CString& _Error)
+ : CSubPicAllocatorPresenterImpl(hWnd, hr, &_Error)
+ , m_ScreenSize(0, 0)
{
- if (FAILED(hr)) {
- _Error += L"ISubPicAllocatorPresenterImpl failed\n";
- return;
- }
+ if (FAILED(hr)) {
+ _Error += L"ISubPicAllocatorPresenterImpl failed\n";
+ return;
+ }
- hr = S_OK;
+ hr = S_OK;
}
CmadVRAllocatorPresenter::~CmadVRAllocatorPresenter()
{
- if (m_pSRCB) {
- // nasty, but we have to let it know about our death somehow
- ((CSubRenderCallback*)(ISubRenderCallback2*)m_pSRCB)->SetDXRAP(NULL);
- }
-
- // the order is important here
- m_pSubPicQueue = NULL;
- m_pAllocator = NULL;
- m_pDXR = NULL;
+ if (m_pSRCB) {
+ // nasty, but we have to let it know about our death somehow
+ ((CSubRenderCallback*)(ISubRenderCallback2*)m_pSRCB)->SetDXRAP(NULL);
+ }
+
+ // the order is important here
+ m_pSubPicQueue = NULL;
+ m_pAllocator = NULL;
+ m_pDXR = NULL;
}
STDMETHODIMP CmadVRAllocatorPresenter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- /*
- if (riid == __uuidof(IVideoWindow))
- return GetInterface((IVideoWindow*)this, ppv);
- if (riid == __uuidof(IBasicVideo))
- return GetInterface((IBasicVideo*)this, ppv);
- if (riid == __uuidof(IBasicVideo2))
- return GetInterface((IBasicVideo2*)this, ppv);
- */
- /*
- if (riid == __uuidof(IVMRWindowlessControl))
- return GetInterface((IVMRWindowlessControl*)this, ppv);
- */
-
- if (riid != IID_IUnknown && m_pDXR) {
- if (SUCCEEDED(m_pDXR->QueryInterface(riid, ppv))) {
- return S_OK;
- }
- }
-
- return __super::NonDelegatingQueryInterface(riid, ppv);
+ /*
+ if (riid == __uuidof(IVideoWindow))
+ return GetInterface((IVideoWindow*)this, ppv);
+ if (riid == __uuidof(IBasicVideo))
+ return GetInterface((IBasicVideo*)this, ppv);
+ if (riid == __uuidof(IBasicVideo2))
+ return GetInterface((IBasicVideo2*)this, ppv);
+ */
+ /*
+ if (riid == __uuidof(IVMRWindowlessControl))
+ return GetInterface((IVMRWindowlessControl*)this, ppv);
+ */
+
+ if (riid != IID_IUnknown && m_pDXR) {
+ if (SUCCEEDED(m_pDXR->QueryInterface(riid, ppv))) {
+ return S_OK;
+ }
+ }
+
+ return __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CmadVRAllocatorPresenter::SetDevice(IDirect3DDevice9* pD3DDev)
{
- if (!pD3DDev)
- {
- // release all resources
- m_pSubPicQueue = NULL;
- m_pAllocator = NULL;
- return S_OK;
- }
-
- CSize size;
- switch (GetRenderersSettings().nSPCMaxRes) {
- case 0:
- default:
- size = m_ScreenSize;
- break;
- case 1:
- size.SetSize(1024, 768);
- break;
- case 2:
- size.SetSize(800, 600);
- break;
- case 3:
- size.SetSize(640, 480);
- break;
- case 4:
- size.SetSize(512, 384);
- break;
- case 5:
- size.SetSize(384, 288);
- break;
- case 6:
- size.SetSize(2560, 1600);
- break;
- case 7:
- size.SetSize(1920, 1080);
- break;
- case 8:
- size.SetSize(1320, 900);
- break;
- case 9:
- size.SetSize(1280, 720);
- break;
- }
-
- if (m_pAllocator) {
- m_pAllocator->ChangeDevice(pD3DDev);
- } else {
- m_pAllocator = DNew CDX9SubPicAllocator(pD3DDev, size, GetRenderersSettings().fSPCPow2Tex, true);
- if (!m_pAllocator) {
- return E_FAIL;
- }
- }
-
- HRESULT hr = S_OK;
-
- m_pSubPicQueue = GetRenderersSettings().nSPCSize > 0
- ? (ISubPicQueue*)DNew CSubPicQueue(GetRenderersSettings().nSPCSize, !GetRenderersSettings().fSPCAllowAnimationWhenBuffering, m_pAllocator, &hr)
- : (ISubPicQueue*)DNew CSubPicQueueNoThread(m_pAllocator, &hr);
- if (!m_pSubPicQueue || FAILED(hr)) {
- return E_FAIL;
- }
-
- if (m_SubPicProvider) {
- m_pSubPicQueue->SetSubPicProvider(m_SubPicProvider);
- }
-
- return S_OK;
+ if (!pD3DDev) {
+ // release all resources
+ m_pSubPicQueue = NULL;
+ m_pAllocator = NULL;
+ return S_OK;
+ }
+
+ CSize size;
+ switch (GetRenderersSettings().nSPCMaxRes) {
+ case 0:
+ default:
+ size = m_ScreenSize;
+ break;
+ case 1:
+ size.SetSize(1024, 768);
+ break;
+ case 2:
+ size.SetSize(800, 600);
+ break;
+ case 3:
+ size.SetSize(640, 480);
+ break;
+ case 4:
+ size.SetSize(512, 384);
+ break;
+ case 5:
+ size.SetSize(384, 288);
+ break;
+ case 6:
+ size.SetSize(2560, 1600);
+ break;
+ case 7:
+ size.SetSize(1920, 1080);
+ break;
+ case 8:
+ size.SetSize(1320, 900);
+ break;
+ case 9:
+ size.SetSize(1280, 720);
+ break;
+ }
+
+ if (m_pAllocator) {
+ m_pAllocator->ChangeDevice(pD3DDev);
+ } else {
+ m_pAllocator = DNew CDX9SubPicAllocator(pD3DDev, size, GetRenderersSettings().fSPCPow2Tex, true);
+ if (!m_pAllocator) {
+ return E_FAIL;
+ }
+ }
+
+ HRESULT hr = S_OK;
+
+ m_pSubPicQueue = GetRenderersSettings().nSPCSize > 0
+ ? (ISubPicQueue*)DNew CSubPicQueue(GetRenderersSettings().nSPCSize, !GetRenderersSettings().fSPCAllowAnimationWhenBuffering, m_pAllocator, &hr)
+ : (ISubPicQueue*)DNew CSubPicQueueNoThread(m_pAllocator, &hr);
+ if (!m_pSubPicQueue || FAILED(hr)) {
+ return E_FAIL;
+ }
+
+ if (m_SubPicProvider) {
+ m_pSubPicQueue->SetSubPicProvider(m_SubPicProvider);
+ }
+
+ return S_OK;
}
HRESULT CmadVRAllocatorPresenter::Render(
- REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, REFERENCE_TIME atpf,
- int left, int top, int right, int bottom, int width, int height)
+ REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, REFERENCE_TIME atpf,
+ int left, int top, int right, int bottom, int width, int height)
{
- __super::SetPosition(CRect(0, 0, width, height), CRect(left, top, right, bottom)); // needed? should be already set by the player
- SetTime(rtStart);
- if (atpf > 0 && m_pSubPicQueue) {
- m_fps = (double)(10000000.0 / atpf);
- m_pSubPicQueue->SetFPS(m_fps);
- }
- AlphaBltSubPic(CSize(width, height));
- return S_OK;
+ __super::SetPosition(CRect(0, 0, width, height), CRect(left, top, right, bottom)); // needed? should be already set by the player
+ SetTime(rtStart);
+ if (atpf > 0 && m_pSubPicQueue) {
+ m_fps = (double)(10000000.0 / atpf);
+ m_pSubPicQueue->SetFPS(m_fps);
+ }
+ AlphaBltSubPic(CSize(width, height));
+ return S_OK;
}
// ISubPicAllocatorPresenter
STDMETHODIMP CmadVRAllocatorPresenter::CreateRenderer(IUnknown** ppRenderer)
{
- CheckPointer(ppRenderer, E_POINTER);
-
- if (m_pDXR) {
- return E_UNEXPECTED;
- }
- m_pDXR.CoCreateInstance(CLSID_madVR, GetOwner());
- if (!m_pDXR) {
- return E_FAIL;
- }
-
- CComQIPtr<ISubRender> pSR = m_pDXR;
- if (!pSR) {
- m_pDXR = NULL;
- return E_FAIL;
- }
-
- m_pSRCB = DNew CSubRenderCallback(this);
- if (FAILED(pSR->SetCallback(m_pSRCB))) {
- m_pDXR = NULL;
- return E_FAIL;
- }
-
- (*ppRenderer = this)->AddRef();
-
- MONITORINFO mi;
- mi.cbSize = sizeof(MONITORINFO);
- if (GetMonitorInfo(MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST), &mi)) {
- m_ScreenSize.SetSize(mi.rcMonitor.right-mi.rcMonitor.left, mi.rcMonitor.bottom-mi.rcMonitor.top);
- }
-
- return S_OK;
+ CheckPointer(ppRenderer, E_POINTER);
+
+ if (m_pDXR) {
+ return E_UNEXPECTED;
+ }
+ m_pDXR.CoCreateInstance(CLSID_madVR, GetOwner());
+ if (!m_pDXR) {
+ return E_FAIL;
+ }
+
+ CComQIPtr<ISubRender> pSR = m_pDXR;
+ if (!pSR) {
+ m_pDXR = NULL;
+ return E_FAIL;
+ }
+
+ m_pSRCB = DNew CSubRenderCallback(this);
+ if (FAILED(pSR->SetCallback(m_pSRCB))) {
+ m_pDXR = NULL;
+ return E_FAIL;
+ }
+
+ (*ppRenderer = this)->AddRef();
+
+ MONITORINFO mi;
+ mi.cbSize = sizeof(MONITORINFO);
+ if (GetMonitorInfo(MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST), &mi)) {
+ m_ScreenSize.SetSize(mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top);
+ }
+
+ return S_OK;
}
STDMETHODIMP_(void) CmadVRAllocatorPresenter::SetPosition(RECT w, RECT v)
{
- if (CComQIPtr<IBasicVideo> pBV = m_pDXR) {
- pBV->SetDefaultSourcePosition();
- pBV->SetDestinationPosition(v.left, v.top, v.right - v.left, v.bottom - v.top);
- }
-
- if (CComQIPtr<IVideoWindow> pVW = m_pDXR) {
- pVW->SetWindowPosition(w.left, w.top, w.right - w.left, w.bottom - w.top);
- }
+ if (CComQIPtr<IBasicVideo> pBV = m_pDXR) {
+ pBV->SetDefaultSourcePosition();
+ pBV->SetDestinationPosition(v.left, v.top, v.right - v.left, v.bottom - v.top);
+ }
+
+ if (CComQIPtr<IVideoWindow> pVW = m_pDXR) {
+ pVW->SetWindowPosition(w.left, w.top, w.right - w.left, w.bottom - w.top);
+ }
}
STDMETHODIMP_(SIZE) CmadVRAllocatorPresenter::GetVideoSize(bool fCorrectAR)
{
- SIZE size = {0, 0};
-
- if (!fCorrectAR) {
- if (CComQIPtr<IBasicVideo> pBV = m_pDXR) {
- pBV->GetVideoSize(&size.cx, &size.cy);
- }
- } else {
- if (CComQIPtr<IBasicVideo2> pBV2 = m_pDXR) {
- pBV2->GetPreferredAspectRatio(&size.cx, &size.cy);
- }
- }
-
- return size;
+ SIZE size = {0, 0};
+
+ if (!fCorrectAR) {
+ if (CComQIPtr<IBasicVideo> pBV = m_pDXR) {
+ pBV->GetVideoSize(&size.cx, &size.cy);
+ }
+ } else {
+ if (CComQIPtr<IBasicVideo2> pBV2 = m_pDXR) {
+ pBV2->GetPreferredAspectRatio(&size.cx, &size.cy);
+ }
+ }
+
+ return size;
}
STDMETHODIMP_(bool) CmadVRAllocatorPresenter::Paint(bool fAll)
{
- return false; // TODO
+ return false; // TODO
}
STDMETHODIMP CmadVRAllocatorPresenter::GetDIB(BYTE* lpDib, DWORD* size)
{
- HRESULT hr = E_NOTIMPL;
- if (CComQIPtr<IBasicVideo> pBV = m_pDXR) {
- hr = pBV->GetCurrentImage((long*)size, (long*)lpDib);
- }
- return hr;
+ HRESULT hr = E_NOTIMPL;
+ if (CComQIPtr<IBasicVideo> pBV = m_pDXR) {
+ hr = pBV->GetCurrentImage((long*)size, (long*)lpDib);
+ }
+ return hr;
}
STDMETHODIMP CmadVRAllocatorPresenter::SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget)
{
- return E_NOTIMPL; // TODO
+ return E_NOTIMPL; // TODO
}
diff --git a/src/filters/renderer/VideoRenderers/madVRAllocatorPresenter.h b/src/filters/renderer/VideoRenderers/madVRAllocatorPresenter.h
index b37cdfe89..650d5f6b0 100644
--- a/src/filters/renderer/VideoRenderers/madVRAllocatorPresenter.h
+++ b/src/filters/renderer/VideoRenderers/madVRAllocatorPresenter.h
@@ -29,81 +29,81 @@
interface __declspec(uuid("ABA34FDA-DD22-4E00-9AB4-4ABF927D0B0C"))
IMadVRTextOsd :
public IUnknown {
- STDMETHOD(OsdDisplayMessage)(LPCWSTR text, DWORD milliseconds) = 0;
- STDMETHOD(OsdClearMessage)(void) = 0;
+ STDMETHOD(OsdDisplayMessage)(LPCWSTR text, DWORD milliseconds) = 0;
+ STDMETHOD(OsdClearMessage)(void) = 0;
};
namespace DSObjects
{
- class CmadVRAllocatorPresenter
- : public CSubPicAllocatorPresenterImpl
- {
- class CSubRenderCallback : public CUnknown, public ISubRenderCallback2, public CCritSec
- {
- CmadVRAllocatorPresenter* m_pDXRAP;
-
- public:
- CSubRenderCallback(CmadVRAllocatorPresenter* pDXRAP)
- : CUnknown(_T("CSubRender"), NULL)
- , m_pDXRAP(pDXRAP) {
- }
-
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
- return
- QI(ISubRenderCallback)
- QI(ISubRenderCallback2)
- __super::NonDelegatingQueryInterface(riid, ppv);
- }
-
- void SetDXRAP(CmadVRAllocatorPresenter* pDXRAP) {
- CAutoLock cAutoLock(this);
- m_pDXRAP = pDXRAP;
- }
-
- // ISubRenderCallback
-
- STDMETHODIMP SetDevice(IDirect3DDevice9* pD3DDev) {
- CAutoLock cAutoLock(this);
- return m_pDXRAP ? m_pDXRAP->SetDevice(pD3DDev) : E_UNEXPECTED;
- }
-
- STDMETHODIMP Render(REFERENCE_TIME rtStart, int left, int top, int right, int bottom, int width, int height) {
- CAutoLock cAutoLock(this);
- return m_pDXRAP ? m_pDXRAP->Render(rtStart, 0, 0, left, top, right, bottom, width, height) : E_UNEXPECTED;
- }
-
- // ISubRendererCallback2
-
- STDMETHODIMP RenderEx(REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, REFERENCE_TIME AvgTimePerFrame, int left, int top, int right, int bottom, int width, int height) {
- CAutoLock cAutoLock(this);
- return m_pDXRAP ? m_pDXRAP->Render(rtStart, rtStop, AvgTimePerFrame, left, top, right, bottom, width, height) : E_UNEXPECTED;
- }
- };
-
- CComPtr<IUnknown> m_pDXR;
- CComPtr<ISubRenderCallback2> m_pSRCB;
- CSize m_ScreenSize;
- bool m_bIsFullscreen;
-
- public:
- CmadVRAllocatorPresenter(HWND hWnd, HRESULT& hr, CString &_Error);
- virtual ~CmadVRAllocatorPresenter();
-
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- HRESULT SetDevice(IDirect3DDevice9* pD3DDev);
- HRESULT Render(
- REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, REFERENCE_TIME atpf,
- int left, int top, int bottom, int right, int width, int height);
-
- // ISubPicAllocatorPresenter
- STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
- STDMETHODIMP_(void) SetPosition(RECT w, RECT v);
- STDMETHODIMP_(SIZE) GetVideoSize(bool fCorrectAR);
- STDMETHODIMP_(bool) Paint(bool fAll);
- STDMETHODIMP GetDIB(BYTE* lpDib, DWORD* size);
- STDMETHODIMP SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget);
- };
+ class CmadVRAllocatorPresenter
+ : public CSubPicAllocatorPresenterImpl
+ {
+ class CSubRenderCallback : public CUnknown, public ISubRenderCallback2, public CCritSec
+ {
+ CmadVRAllocatorPresenter* m_pDXRAP;
+
+ public:
+ CSubRenderCallback(CmadVRAllocatorPresenter* pDXRAP)
+ : CUnknown(_T("CSubRender"), NULL)
+ , m_pDXRAP(pDXRAP) {
+ }
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
+ return
+ QI(ISubRenderCallback)
+ QI(ISubRenderCallback2)
+ __super::NonDelegatingQueryInterface(riid, ppv);
+ }
+
+ void SetDXRAP(CmadVRAllocatorPresenter* pDXRAP) {
+ CAutoLock cAutoLock(this);
+ m_pDXRAP = pDXRAP;
+ }
+
+ // ISubRenderCallback
+
+ STDMETHODIMP SetDevice(IDirect3DDevice9* pD3DDev) {
+ CAutoLock cAutoLock(this);
+ return m_pDXRAP ? m_pDXRAP->SetDevice(pD3DDev) : E_UNEXPECTED;
+ }
+
+ STDMETHODIMP Render(REFERENCE_TIME rtStart, int left, int top, int right, int bottom, int width, int height) {
+ CAutoLock cAutoLock(this);
+ return m_pDXRAP ? m_pDXRAP->Render(rtStart, 0, 0, left, top, right, bottom, width, height) : E_UNEXPECTED;
+ }
+
+ // ISubRendererCallback2
+
+ STDMETHODIMP RenderEx(REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, REFERENCE_TIME AvgTimePerFrame, int left, int top, int right, int bottom, int width, int height) {
+ CAutoLock cAutoLock(this);
+ return m_pDXRAP ? m_pDXRAP->Render(rtStart, rtStop, AvgTimePerFrame, left, top, right, bottom, width, height) : E_UNEXPECTED;
+ }
+ };
+
+ CComPtr<IUnknown> m_pDXR;
+ CComPtr<ISubRenderCallback2> m_pSRCB;
+ CSize m_ScreenSize;
+ bool m_bIsFullscreen;
+
+ public:
+ CmadVRAllocatorPresenter(HWND hWnd, HRESULT& hr, CString& _Error);
+ virtual ~CmadVRAllocatorPresenter();
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ HRESULT SetDevice(IDirect3DDevice9* pD3DDev);
+ HRESULT Render(
+ REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, REFERENCE_TIME atpf,
+ int left, int top, int bottom, int right, int width, int height);
+
+ // ISubPicAllocatorPresenter
+ STDMETHODIMP CreateRenderer(IUnknown** ppRenderer);
+ STDMETHODIMP_(void) SetPosition(RECT w, RECT v);
+ STDMETHODIMP_(SIZE) GetVideoSize(bool fCorrectAR);
+ STDMETHODIMP_(bool) Paint(bool fAll);
+ STDMETHODIMP GetDIB(BYTE* lpDib, DWORD* size);
+ STDMETHODIMP SetPixelShader(LPCSTR pSrcData, LPCSTR pTarget);
+ };
}
diff --git a/src/filters/renderer/VideoRenderers/stdafx.h b/src/filters/renderer/VideoRenderers/stdafx.h
index 6e1286783..9796ec998 100644
--- a/src/filters/renderer/VideoRenderers/stdafx.h
+++ b/src/filters/renderer/VideoRenderers/stdafx.h
@@ -26,7 +26,7 @@
#include "../../../DSUtil/SharedInclude.h"
#ifndef VC_EXTRALEAN
-#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
+#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#endif
#define ResStr(id) CString(MAKEINTRESOURCE(id))
diff --git a/src/filters/source/BaseSource/BaseSource.cpp b/src/filters/source/BaseSource/BaseSource.cpp
index 7a5f6bca7..7a6354d1e 100644
--- a/src/filters/source/BaseSource/BaseSource.cpp
+++ b/src/filters/source/BaseSource/BaseSource.cpp
@@ -34,161 +34,161 @@
//
CBaseStream::CBaseStream(TCHAR* name, CSource* pParent, HRESULT* phr)
- : CSourceStream(name, phr, pParent, L"Output")
- , CSourceSeeking(name, (IPin*)this, phr, &m_cSharedState)
- , m_bDiscontinuity(FALSE), m_bFlushing(FALSE)
+ : CSourceStream(name, phr, pParent, L"Output")
+ , CSourceSeeking(name, (IPin*)this, phr, &m_cSharedState)
+ , m_bDiscontinuity(FALSE), m_bFlushing(FALSE)
{
- CAutoLock cAutoLock(&m_cSharedState);
+ CAutoLock cAutoLock(&m_cSharedState);
- m_AvgTimePerFrame = 0;
- m_rtDuration = 0;
- m_rtStop = m_rtDuration;
+ m_AvgTimePerFrame = 0;
+ m_rtDuration = 0;
+ m_rtStop = m_rtDuration;
}
CBaseStream::~CBaseStream()
{
- CAutoLock cAutoLock(&m_cSharedState);
+ CAutoLock cAutoLock(&m_cSharedState);
}
STDMETHODIMP CBaseStream::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return (riid == IID_IMediaSeeking) ? CSourceSeeking::NonDelegatingQueryInterface(riid, ppv)
- : CSourceStream::NonDelegatingQueryInterface(riid, ppv);
+ return (riid == IID_IMediaSeeking) ? CSourceSeeking::NonDelegatingQueryInterface(riid, ppv)
+ : CSourceStream::NonDelegatingQueryInterface(riid, ppv);
}
void CBaseStream::UpdateFromSeek()
{
- if (ThreadExists()) {
- // next time around the loop, the worker thread will
- // pick up the position change.
- // We need to flush all the existing data - we must do that here
- // as our thread will probably be blocked in GetBuffer otherwise
+ if (ThreadExists()) {
+ // next time around the loop, the worker thread will
+ // pick up the position change.
+ // We need to flush all the existing data - we must do that here
+ // as our thread will probably be blocked in GetBuffer otherwise
- m_bFlushing = TRUE;
+ m_bFlushing = TRUE;
- DeliverBeginFlush();
- // make sure we have stopped pushing
- Stop();
- // complete the flush
- DeliverEndFlush();
+ DeliverBeginFlush();
+ // make sure we have stopped pushing
+ Stop();
+ // complete the flush
+ DeliverEndFlush();
- m_bFlushing = FALSE;
+ m_bFlushing = FALSE;
- // restart
- Run();
- }
+ // restart
+ Run();
+ }
}
HRESULT CBaseStream::SetRate(double dRate)
{
- if (dRate <= 0) {
- return E_INVALIDARG;
- }
+ if (dRate <= 0) {
+ return E_INVALIDARG;
+ }
- {
- CAutoLock lock(CSourceSeeking::m_pLock);
- m_dRateSeeking = dRate;
- }
+ {
+ CAutoLock lock(CSourceSeeking::m_pLock);
+ m_dRateSeeking = dRate;
+ }
- UpdateFromSeek();
+ UpdateFromSeek();
- return S_OK;
+ return S_OK;
}
HRESULT CBaseStream::OnThreadStartPlay()
{
- m_bDiscontinuity = TRUE;
- return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
+ m_bDiscontinuity = TRUE;
+ return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
}
HRESULT CBaseStream::ChangeStart()
{
- {
- CAutoLock lock(CSourceSeeking::m_pLock);
- m_rtSampleTime = 0;
- m_rtPosition = m_rtStart;
- }
+ {
+ CAutoLock lock(CSourceSeeking::m_pLock);
+ m_rtSampleTime = 0;
+ m_rtPosition = m_rtStart;
+ }
- UpdateFromSeek();
+ UpdateFromSeek();
- return S_OK;
+ return S_OK;
}
HRESULT CBaseStream::ChangeStop()
{
- {
- CAutoLock lock(CSourceSeeking::m_pLock);
- if (m_rtPosition < m_rtStop) {
- return S_OK;
- }
- }
+ {
+ CAutoLock lock(CSourceSeeking::m_pLock);
+ if (m_rtPosition < m_rtStop) {
+ return S_OK;
+ }
+ }
- // We're already past the new stop time -- better flush the graph.
- UpdateFromSeek();
+ // We're already past the new stop time -- better flush the graph.
+ UpdateFromSeek();
- return S_OK;
+ return S_OK;
}
HRESULT CBaseStream::OnThreadCreate()
{
- CAutoLock cAutoLockShared(&m_cSharedState);
+ CAutoLock cAutoLockShared(&m_cSharedState);
- m_rtSampleTime = 0;
- m_rtPosition = m_rtStart;
+ m_rtSampleTime = 0;
+ m_rtPosition = m_rtStart;
- return CSourceStream::OnThreadCreate();
+ return CSourceStream::OnThreadCreate();
}
HRESULT CBaseStream::FillBuffer(IMediaSample* pSample)
{
- HRESULT hr;
+ HRESULT hr;
- {
- CAutoLock cAutoLockShared(&m_cSharedState);
+ {
+ CAutoLock cAutoLockShared(&m_cSharedState);
- if (m_rtPosition >= m_rtStop) {
- return S_FALSE;
- }
+ if (m_rtPosition >= m_rtStop) {
+ return S_FALSE;
+ }
- BYTE* pOut = NULL;
- if (FAILED(hr = pSample->GetPointer(&pOut)) || !pOut) {
- return S_FALSE;
- }
+ BYTE* pOut = NULL;
+ if (FAILED(hr = pSample->GetPointer(&pOut)) || !pOut) {
+ return S_FALSE;
+ }
- int nFrame = (int)(m_rtPosition / m_AvgTimePerFrame);
+ int nFrame = (int)(m_rtPosition / m_AvgTimePerFrame);
- long len = pSample->GetSize();
+ long len = pSample->GetSize();
- hr = FillBuffer(pSample, nFrame, pOut, len);
- if (hr != S_OK) {
- return hr;
- }
+ hr = FillBuffer(pSample, nFrame, pOut, len);
+ if (hr != S_OK) {
+ return hr;
+ }
- pSample->SetActualDataLength(len);
+ pSample->SetActualDataLength(len);
- REFERENCE_TIME rtStart, rtStop;
- // The sample times are modified by the current rate.
- rtStart = static_cast<REFERENCE_TIME>(m_rtSampleTime / m_dRateSeeking);
- rtStop = rtStart + static_cast<int>(m_AvgTimePerFrame / m_dRateSeeking);
- pSample->SetTime(&rtStart, &rtStop);
+ REFERENCE_TIME rtStart, rtStop;
+ // The sample times are modified by the current rate.
+ rtStart = static_cast<REFERENCE_TIME>(m_rtSampleTime / m_dRateSeeking);
+ rtStop = rtStart + static_cast<int>(m_AvgTimePerFrame / m_dRateSeeking);
+ pSample->SetTime(&rtStart, &rtStop);
- m_rtSampleTime += m_AvgTimePerFrame;
- m_rtPosition += m_AvgTimePerFrame;
- }
+ m_rtSampleTime += m_AvgTimePerFrame;
+ m_rtPosition += m_AvgTimePerFrame;
+ }
- pSample->SetSyncPoint(TRUE);
+ pSample->SetSyncPoint(TRUE);
- if (m_bDiscontinuity) {
- pSample->SetDiscontinuity(TRUE);
- m_bDiscontinuity = FALSE;
- }
+ if (m_bDiscontinuity) {
+ pSample->SetDiscontinuity(TRUE);
+ m_bDiscontinuity = FALSE;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CBaseStream::Notify(IBaseFilter* pSender, Quality q)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
diff --git a/src/filters/source/BaseSource/BaseSource.h b/src/filters/source/BaseSource/BaseSource.h
index 3388ba083..a0c4d6071 100644
--- a/src/filters/source/BaseSource/BaseSource.h
+++ b/src/filters/source/BaseSource/BaseSource.h
@@ -27,111 +27,111 @@
template<class TStream>
class CBaseSource
- : public CSource
- , public IFileSourceFilter
- , public IAMFilterMiscFlags
+ : public CSource
+ , public IFileSourceFilter
+ , public IAMFilterMiscFlags
{
protected:
- CStringW m_fn;
+ CStringW m_fn;
public:
- CBaseSource(TCHAR* name, LPUNKNOWN lpunk, HRESULT* phr, const CLSID& clsid)
- : CSource(name, lpunk, clsid) {
- if (phr) {
- *phr = S_OK;
- }
- }
-
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
- CheckPointer(ppv, E_POINTER);
-
- return
- QI(IFileSourceFilter)
- QI(IAMFilterMiscFlags)
- __super::NonDelegatingQueryInterface(riid, ppv);
- }
-
- // IFileSourceFilter
-
- STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt) {
- // TODO: destroy any already existing pins and create new, now we are just going die nicely instead of doing it :)
- if (GetPinCount() > 0) {
- return VFW_E_ALREADY_CONNECTED;
- }
-
- HRESULT hr = S_OK;
- if (!(DNew TStream(pszFileName, this, &hr))) {
- return E_OUTOFMEMORY;
- }
-
- if (FAILED(hr)) {
- return hr;
- }
-
- m_fn = pszFileName;
-
- return S_OK;
- }
-
- STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt) {
- size_t nCount;
- if (!ppszFileName) {
- return E_POINTER;
- }
-
- nCount = m_fn.GetLength()+1;
- *ppszFileName = (LPOLESTR)CoTaskMemAlloc(nCount*sizeof(WCHAR));
- if (!(*ppszFileName)) {
- return E_OUTOFMEMORY;
- }
-
- wcscpy_s(*ppszFileName, nCount, m_fn);
-
- return S_OK;
- }
-
- // IAMFilterMiscFlags
-
- STDMETHODIMP_(ULONG) GetMiscFlags() {
- return AM_FILTER_MISC_FLAGS_IS_SOURCE;
- }
+ CBaseSource(TCHAR* name, LPUNKNOWN lpunk, HRESULT* phr, const CLSID& clsid)
+ : CSource(name, lpunk, clsid) {
+ if (phr) {
+ *phr = S_OK;
+ }
+ }
+
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
+ CheckPointer(ppv, E_POINTER);
+
+ return
+ QI(IFileSourceFilter)
+ QI(IAMFilterMiscFlags)
+ __super::NonDelegatingQueryInterface(riid, ppv);
+ }
+
+ // IFileSourceFilter
+
+ STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt) {
+ // TODO: destroy any already existing pins and create new, now we are just going die nicely instead of doing it :)
+ if (GetPinCount() > 0) {
+ return VFW_E_ALREADY_CONNECTED;
+ }
+
+ HRESULT hr = S_OK;
+ if (!(DNew TStream(pszFileName, this, &hr))) {
+ return E_OUTOFMEMORY;
+ }
+
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ m_fn = pszFileName;
+
+ return S_OK;
+ }
+
+ STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt) {
+ size_t nCount;
+ if (!ppszFileName) {
+ return E_POINTER;
+ }
+
+ nCount = m_fn.GetLength() + 1;
+ *ppszFileName = (LPOLESTR)CoTaskMemAlloc(nCount * sizeof(WCHAR));
+ if (!(*ppszFileName)) {
+ return E_OUTOFMEMORY;
+ }
+
+ wcscpy_s(*ppszFileName, nCount, m_fn);
+
+ return S_OK;
+ }
+
+ // IAMFilterMiscFlags
+
+ STDMETHODIMP_(ULONG) GetMiscFlags() {
+ return AM_FILTER_MISC_FLAGS_IS_SOURCE;
+ }
};
class CBaseStream
- : public CSourceStream
- , public CSourceSeeking
+ : public CSourceStream
+ , public CSourceSeeking
{
protected:
- CCritSec m_cSharedState;
+ CCritSec m_cSharedState;
- REFERENCE_TIME m_AvgTimePerFrame;
- REFERENCE_TIME m_rtSampleTime, m_rtPosition;
+ REFERENCE_TIME m_AvgTimePerFrame;
+ REFERENCE_TIME m_rtSampleTime, m_rtPosition;
- BOOL m_bDiscontinuity, m_bFlushing;
+ BOOL m_bDiscontinuity, m_bFlushing;
- HRESULT OnThreadStartPlay();
- HRESULT OnThreadCreate();
+ HRESULT OnThreadStartPlay();
+ HRESULT OnThreadCreate();
private:
- void UpdateFromSeek();
- STDMETHODIMP SetRate(double dRate);
+ void UpdateFromSeek();
+ STDMETHODIMP SetRate(double dRate);
- HRESULT ChangeStart();
- HRESULT ChangeStop();
- HRESULT ChangeRate() {
- return S_OK;
- }
+ HRESULT ChangeStart();
+ HRESULT ChangeStop();
+ HRESULT ChangeRate() {
+ return S_OK;
+ }
public:
- CBaseStream(TCHAR* name, CSource* pParent, HRESULT* phr);
- virtual ~CBaseStream();
+ CBaseStream(TCHAR* name, CSource* pParent, HRESULT* phr);
+ virtual ~CBaseStream();
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- HRESULT FillBuffer(IMediaSample* pSample);
+ HRESULT FillBuffer(IMediaSample* pSample);
- virtual HRESULT FillBuffer(IMediaSample* pSample, int nFrame, BYTE* pOut, long& len /*in+out*/) = 0;
+ virtual HRESULT FillBuffer(IMediaSample* pSample, int nFrame, BYTE* pOut, long& len /*in+out*/) = 0;
- STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
+ STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
};
diff --git a/src/filters/source/BaseSource/stdafx.h b/src/filters/source/BaseSource/stdafx.h
index 1a68ff4c6..51281debe 100644
--- a/src/filters/source/BaseSource/stdafx.h
+++ b/src/filters/source/BaseSource/stdafx.h
@@ -25,16 +25,16 @@
#include "../../../DSUtil/SharedInclude.h"
#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#endif
-#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
+#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
#ifndef VC_EXTRALEAN
-#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
+#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#endif
#include <afx.h>
-#include <afxwin.h> // MFC core and standard components
+#include <afxwin.h> // MFC core and standard components
#include <dshow.h>
#include <BaseClasses/streams.h>
diff --git a/src/filters/source/D2VSource/D2VSource.cpp b/src/filters/source/D2VSource/D2VSource.cpp
index 20570b179..5e3db93fb 100644
--- a/src/filters/source/D2VSource/D2VSource.cpp
+++ b/src/filters/source/D2VSource/D2VSource.cpp
@@ -29,46 +29,46 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Video, &MEDIASUBTYPE_YUY2}
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_YUY2}
};
const AMOVIESETUP_PIN sudOpPin[] = {
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CD2VSource), D2VSourceName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CD2VSource), D2VSourceName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CD2VSource>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CD2VSource>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{47CE0591-C4D5-4b41-BED7-28F59AD76228}"),
- _T("0"), _T("0,18,,4456443241564950726F6A65637446696C65")); // "DVD2AVIProjectFile"
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{47CE0591-C4D5-4b41-BED7-28F59AD76228}"),
+ _T("0"), _T("0,18,,4456443241564950726F6A65637446696C65")); // "DVD2AVIProjectFile"
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{47CE0591-C4D5-4b41-BED7-28F59AD76228}"),
- _T("Source Filter"), _T("{47CE0591-C4D5-4b41-BED7-28F59AD76228}"));
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{47CE0591-C4D5-4b41-BED7-28F59AD76228}"),
+ _T("Source Filter"), _T("{47CE0591-C4D5-4b41-BED7-28F59AD76228}"));
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".d2v"),
- _T("Source Filter"), _T("{47CE0591-C4D5-4b41-BED7-28F59AD76228}"));
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".d2v"),
+ _T("Source Filter"), _T("{47CE0591-C4D5-4b41-BED7-28F59AD76228}"));
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{47CE0591-C4D5-4b41-BED7-28F59AD76228}"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".d2v"));
+ DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{47CE0591-C4D5-4b41-BED7-28F59AD76228}"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".d2v"));
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -82,11 +82,11 @@ CFilterApp theApp;
//
CD2VSource::CD2VSource(LPUNKNOWN lpunk, HRESULT* phr)
- : CBaseSource<CD2VStream>(NAME("CD2VSource"), lpunk, phr, __uuidof(this))
+ : CBaseSource<CD2VStream>(NAME("CD2VSource"), lpunk, phr, __uuidof(this))
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
}
CD2VSource::~CD2VSource()
@@ -95,15 +95,15 @@ CD2VSource::~CD2VSource()
STDMETHODIMP CD2VSource::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
- wcscpy_s(pInfo->achName, D2VSourceName);
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+ wcscpy_s(pInfo->achName, D2VSourceName);
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
//
@@ -111,196 +111,196 @@ STDMETHODIMP CD2VSource::QueryFilterInfo(FILTER_INFO* pInfo)
//
CD2VStream::CD2VStream(const WCHAR* fn, CSource* pParent, HRESULT* phr)
- : CBaseStream(NAME("D2VSourceStream"), pParent, phr)
- , m_pFrameBuffer(NULL)
+ : CBaseStream(NAME("D2VSourceStream"), pParent, phr)
+ , m_pFrameBuffer(NULL)
{
- CAutoLock cAutoLock(&m_cSharedState);
-
- m_pDecoder.Attach(DNew CMPEG2Dec());
- if (!m_pDecoder) {
- if (phr) {
- *phr = E_OUTOFMEMORY;
- }
- return;
- }
-
- if (!m_pDecoder->Open(CString(fn), CMPEG2Dec::YUY2)) {
- if (phr) {
- *phr = E_FAIL;
- }
- return;
- }
-
- if (!m_pFrameBuffer.Allocate(m_pDecoder->Clip_Width*m_pDecoder->Clip_Height*4)) {
- if (phr) {
- *phr = E_OUTOFMEMORY;
- }
- return;
- }
-
- m_AvgTimePerFrame = 10000000000i64/m_pDecoder->VF_FrameRate;
- m_rtDuration = m_rtStop = m_AvgTimePerFrame*m_pDecoder->VF_FrameLimit;
-
- if (phr) {
- *phr = m_rtDuration > 0 ? S_OK : E_FAIL;
- }
+ CAutoLock cAutoLock(&m_cSharedState);
+
+ m_pDecoder.Attach(DNew CMPEG2Dec());
+ if (!m_pDecoder) {
+ if (phr) {
+ *phr = E_OUTOFMEMORY;
+ }
+ return;
+ }
+
+ if (!m_pDecoder->Open(CString(fn), CMPEG2Dec::YUY2)) {
+ if (phr) {
+ *phr = E_FAIL;
+ }
+ return;
+ }
+
+ if (!m_pFrameBuffer.Allocate(m_pDecoder->Clip_Width * m_pDecoder->Clip_Height * 4)) {
+ if (phr) {
+ *phr = E_OUTOFMEMORY;
+ }
+ return;
+ }
+
+ m_AvgTimePerFrame = 10000000000i64 / m_pDecoder->VF_FrameRate;
+ m_rtDuration = m_rtStop = m_AvgTimePerFrame * m_pDecoder->VF_FrameLimit;
+
+ if (phr) {
+ *phr = m_rtDuration > 0 ? S_OK : E_FAIL;
+ }
}
CD2VStream::~CD2VStream()
{
- CAutoLock cAutoLock(&m_cSharedState);
+ CAutoLock cAutoLock(&m_cSharedState);
}
HRESULT CD2VStream::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties)
{
- // CAutoLock cAutoLock(m_pFilter->pStateLock());
+ // CAutoLock cAutoLock(m_pFilter->pStateLock());
- ASSERT(pAlloc);
- ASSERT(pProperties);
+ ASSERT(pAlloc);
+ ASSERT(pProperties);
- HRESULT hr = NOERROR;
+ HRESULT hr = NOERROR;
- int w, h, bpp;
- if (!GetDim(w, h, bpp)) {
- return E_FAIL;
- }
+ int w, h, bpp;
+ if (!GetDim(w, h, bpp)) {
+ return E_FAIL;
+ }
- pProperties->cBuffers = 1;
- pProperties->cbBuffer = w*h*bpp>>3;
+ pProperties->cBuffers = 1;
+ pProperties->cbBuffer = w * h * bpp >> 3;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- if (Actual.cbBuffer < pProperties->cbBuffer) {
- return E_FAIL;
- }
- ASSERT(Actual.cBuffers == pProperties->cBuffers);
+ if (Actual.cbBuffer < pProperties->cbBuffer) {
+ return E_FAIL;
+ }
+ ASSERT(Actual.cBuffers == pProperties->cBuffers);
- return NOERROR;
+ return NOERROR;
}
HRESULT CD2VStream::FillBuffer(IMediaSample* pSample, int nFrame, BYTE* pOut, long& len)
{
- if (!m_pDecoder) {
- return S_FALSE;
- }
+ if (!m_pDecoder) {
+ return S_FALSE;
+ }
- AM_MEDIA_TYPE* pmt;
- if (SUCCEEDED(pSample->GetMediaType(&pmt)) && pmt) {
- CMediaType mt(*pmt);
- SetMediaType(&mt);
+ AM_MEDIA_TYPE* pmt;
+ if (SUCCEEDED(pSample->GetMediaType(&pmt)) && pmt) {
+ CMediaType mt(*pmt);
+ SetMediaType(&mt);
- DeleteMediaType(pmt);
- }
+ DeleteMediaType(pmt);
+ }
- int w, h, bpp;
- if (!GetDim(w, h, bpp)) {
- return S_FALSE;
- }
+ int w, h, bpp;
+ if (!GetDim(w, h, bpp)) {
+ return S_FALSE;
+ }
- BYTE* pIn = m_pFrameBuffer;
+ BYTE* pIn = m_pFrameBuffer;
- int pitchIn, pitchOut = 0;
+ int pitchIn, pitchOut = 0;
- pitchIn = m_pDecoder->Clip_Width*bpp>>3;
- pitchOut = w*bpp>>3;
+ pitchIn = m_pDecoder->Clip_Width * bpp >> 3;
+ pitchOut = w * bpp >> 3;
- m_pDecoder->Decode(pIn, (unsigned long)(nFrame), pitchIn);
+ m_pDecoder->Decode(pIn, (unsigned long)(nFrame), pitchIn);
- for (int y = 0, p = min(pitchIn, pitchOut);
- y < h;
- y++, pIn += pitchIn, pOut += pitchOut) {
- memcpy(pOut, pIn, p);
- }
+ for (int y = 0, p = min(pitchIn, pitchOut);
+ y < h;
+ y++, pIn += pitchIn, pOut += pitchOut) {
+ memcpy(pOut, pIn, p);
+ }
- len = pitchOut*h;
+ len = pitchOut * h;
- return S_OK;
+ return S_OK;
}
HRESULT CD2VStream::GetMediaType(int iPosition, CMediaType* pmt)
{
- CAutoLock cAutoLock(m_pFilter->pStateLock());
-
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > 0) {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- pmt->SetType(&MEDIATYPE_Video);
- pmt->SetSubtype(&MEDIASUBTYPE_YUY2);
- pmt->SetFormatType(&FORMAT_VideoInfo);
- pmt->SetTemporalCompression(FALSE);
-
- VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
- memset(vih, 0, sizeof(VIDEOINFOHEADER));
- vih->AvgTimePerFrame = m_AvgTimePerFrame;
- vih->bmiHeader.biSize = sizeof(vih->bmiHeader);
- vih->bmiHeader.biWidth = m_pDecoder->Clip_Width;
- vih->bmiHeader.biHeight = m_pDecoder->Clip_Height;
- vih->bmiHeader.biPlanes = 1;
- vih->bmiHeader.biBitCount = 16;
- vih->bmiHeader.biCompression = '2YUY';
- vih->bmiHeader.biSizeImage = vih->bmiHeader.biWidth*abs(vih->bmiHeader.biHeight)*vih->bmiHeader.biBitCount>>3;
-
- pmt->SetSampleSize(vih->bmiHeader.biSizeImage);
-
- return NOERROR;
+ CAutoLock cAutoLock(m_pFilter->pStateLock());
+
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > 0) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ pmt->SetType(&MEDIATYPE_Video);
+ pmt->SetSubtype(&MEDIASUBTYPE_YUY2);
+ pmt->SetFormatType(&FORMAT_VideoInfo);
+ pmt->SetTemporalCompression(FALSE);
+
+ VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
+ memset(vih, 0, sizeof(VIDEOINFOHEADER));
+ vih->AvgTimePerFrame = m_AvgTimePerFrame;
+ vih->bmiHeader.biSize = sizeof(vih->bmiHeader);
+ vih->bmiHeader.biWidth = m_pDecoder->Clip_Width;
+ vih->bmiHeader.biHeight = m_pDecoder->Clip_Height;
+ vih->bmiHeader.biPlanes = 1;
+ vih->bmiHeader.biBitCount = 16;
+ vih->bmiHeader.biCompression = '2YUY';
+ vih->bmiHeader.biSizeImage = vih->bmiHeader.biWidth * abs(vih->bmiHeader.biHeight) * vih->bmiHeader.biBitCount >> 3;
+
+ pmt->SetSampleSize(vih->bmiHeader.biSizeImage);
+
+ return NOERROR;
}
HRESULT CD2VStream::SetMediaType(const CMediaType* pmt)
{
- if (m_pDecoder) {
- if (pmt->subtype == MEDIASUBTYPE_YUY2) {
- m_pDecoder->m_dstFormat = CMPEG2Dec::YUY2;
- } else {
- return E_FAIL;
- }
- }
-
- return CSourceStream::SetMediaType(pmt);
+ if (m_pDecoder) {
+ if (pmt->subtype == MEDIASUBTYPE_YUY2) {
+ m_pDecoder->m_dstFormat = CMPEG2Dec::YUY2;
+ } else {
+ return E_FAIL;
+ }
+ }
+
+ return CSourceStream::SetMediaType(pmt);
}
HRESULT CD2VStream::CheckMediaType(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Video
- && pmt->subtype == MEDIASUBTYPE_YUY2
- && pmt->formattype == FORMAT_VideoInfo
- ? S_OK
- : E_INVALIDARG;
+ return pmt->majortype == MEDIATYPE_Video
+ && pmt->subtype == MEDIASUBTYPE_YUY2
+ && pmt->formattype == FORMAT_VideoInfo
+ ? S_OK
+ : E_INVALIDARG;
}
STDMETHODIMP CD2VStream::Notify(IBaseFilter* pSender, Quality q)
{
- if (q.Late > 0 && q.Late < 100000000) {
- CAutoLock cAutoLockShared(&m_cSharedState);
+ if (q.Late > 0 && q.Late < 100000000) {
+ CAutoLock cAutoLockShared(&m_cSharedState);
- m_rtSampleTime += (q.Late/m_AvgTimePerFrame)*m_AvgTimePerFrame;
- m_rtPosition += (q.Late/m_AvgTimePerFrame)*m_AvgTimePerFrame;
- }
+ m_rtSampleTime += (q.Late / m_AvgTimePerFrame) * m_AvgTimePerFrame;
+ m_rtPosition += (q.Late / m_AvgTimePerFrame) * m_AvgTimePerFrame;
+ }
- return S_OK;
+ return S_OK;
}
//
bool CD2VStream::GetDim(int& w, int& h, int& bpp)
{
- if (m_mt.formattype == FORMAT_VideoInfo) {
- w = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biWidth;
- h = abs(((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biHeight);
- bpp = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biBitCount;
- } else if (m_mt.formattype == FORMAT_VideoInfo2) {
- w = ((VIDEOINFOHEADER2*)m_mt.pbFormat)->bmiHeader.biWidth;
- h = abs(((VIDEOINFOHEADER2*)m_mt.pbFormat)->bmiHeader.biHeight);
- bpp = ((VIDEOINFOHEADER2*)m_mt.pbFormat)->bmiHeader.biBitCount;
- } else {
- return false;
- }
-
- return true;
+ if (m_mt.formattype == FORMAT_VideoInfo) {
+ w = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biWidth;
+ h = abs(((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biHeight);
+ bpp = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biBitCount;
+ } else if (m_mt.formattype == FORMAT_VideoInfo2) {
+ w = ((VIDEOINFOHEADER2*)m_mt.pbFormat)->bmiHeader.biWidth;
+ h = abs(((VIDEOINFOHEADER2*)m_mt.pbFormat)->bmiHeader.biHeight);
+ bpp = ((VIDEOINFOHEADER2*)m_mt.pbFormat)->bmiHeader.biBitCount;
+ } else {
+ return false;
+ }
+
+ return true;
}
diff --git a/src/filters/source/D2VSource/D2VSource.h b/src/filters/source/D2VSource/D2VSource.h
index e3a8fdec0..d696ed95c 100644
--- a/src/filters/source/D2VSource/D2VSource.h
+++ b/src/filters/source/D2VSource/D2VSource.h
@@ -30,14 +30,14 @@
class CD2VStream;
class __declspec(uuid("47CE0591-C4D5-4b41-BED7-28F59AD76228"))
- CD2VSource : public CBaseSource<CD2VStream>
+ CD2VSource : public CBaseSource<CD2VStream>
{
public:
- CD2VSource(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CD2VSource();
+ CD2VSource(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CD2VSource();
- // CBaseFilter
- STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
+ // CBaseFilter
+ STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
};
class CMPEG2Dec;
@@ -45,21 +45,21 @@ class CMPEG2Dec;
class CD2VStream : public CBaseStream
{
private:
- CAutoPtr<CMPEG2Dec> m_pDecoder;
- CAutoVectorPtr<BYTE> m_pFrameBuffer;
+ CAutoPtr<CMPEG2Dec> m_pDecoder;
+ CAutoVectorPtr<BYTE> m_pFrameBuffer;
- bool GetDim(int& w, int& h, int& bpp);
+ bool GetDim(int& w, int& h, int& bpp);
public:
- CD2VStream(const WCHAR* fn, CSource* pParent, HRESULT* phr);
- virtual ~CD2VStream();
+ CD2VStream(const WCHAR* fn, CSource* pParent, HRESULT* phr);
+ virtual ~CD2VStream();
- HRESULT FillBuffer(IMediaSample* pSample, int nFrame, BYTE* pOut, long& len /*in+out*/);
+ HRESULT FillBuffer(IMediaSample* pSample, int nFrame, BYTE* pOut, long& len /*in+out*/);
- HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT CheckMediaType(const CMediaType* pMediaType);
- HRESULT GetMediaType(int iPosition, CMediaType* pmt);
- HRESULT SetMediaType(const CMediaType* pmt);
+ HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT CheckMediaType(const CMediaType* pMediaType);
+ HRESULT GetMediaType(int iPosition, CMediaType* pmt);
+ HRESULT SetMediaType(const CMediaType* pmt);
- STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
+ STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
};
diff --git a/src/filters/source/DTSAC3Source/DTSAC3Source.cpp b/src/filters/source/DTSAC3Source/DTSAC3Source.cpp
index c48508510..11b0c928d 100644
--- a/src/filters/source/DTSAC3Source/DTSAC3Source.cpp
+++ b/src/filters/source/DTSAC3Source/DTSAC3Source.cpp
@@ -41,132 +41,133 @@
#include <libdca/include/dts.h>
enum {
- unknown,
- AC3,
- EAC3,
- //TrueHD,
- //TrueHDAC3,
- MLP,
- DTS,
- DTSHD,
- DTSPaded,
- SPDIF_AC3,
+ unknown,
+ AC3,
+ EAC3,
+ //TrueHD,
+ //TrueHDAC3,
+ MLP,
+ DTS,
+ DTSHD,
+ DTSPaded,
+ SPDIF_AC3,
};
bool isDTSSync(const DWORD sync)
{
- if (sync == 0x0180fe7f || // '7FFE8001' 16 bits and big endian bitstream
- sync == 0x80017ffe || // 'FE7F0180' 16 bits and little endian bitstream
- sync == 0x00e8ff1f || // '1FFFE800' 14 bits and big endian bitstream
- sync == 0xe8001fff) // 'FF1F00E8' 14 bits and little endian bitstream
- return true;
- else
- return false;
+ if (sync == 0x0180fe7f || // '7FFE8001' 16 bits and big endian bitstream
+ sync == 0x80017ffe || // 'FE7F0180' 16 bits and little endian bitstream
+ sync == 0x00e8ff1f || // '1FFFE800' 14 bits and big endian bitstream
+ sync == 0xe8001fff) { // 'FF1F00E8' 14 bits and little endian bitstream
+ return true;
+ } else {
+ return false;
+ }
}
DWORD ParseWAVECDHeader(const BYTE wh[44])
{
- if (*(DWORD*)wh != 0x46464952 //"RIFF"
- || *(DWORDLONG*)(wh+8) != 0x20746d6645564157 //"WAVEfmt "
- || *(DWORD*)(wh+36) != 0x61746164) { //"data"
- return 0;
- }
- PCMWAVEFORMAT pcmwf = *(PCMWAVEFORMAT*)(wh+20);
- if (pcmwf.wf.wFormatTag != 1
- || pcmwf.wf.nChannels != 2
- || pcmwf.wf.nSamplesPerSec != 44100
- || pcmwf.wf.nAvgBytesPerSec != 176400
- || pcmwf.wf.nBlockAlign != 4
- || pcmwf.wBitsPerSample != 16) {
- return 0;
- }
- return *(DWORD*)(wh+40); //return size of "data"
+ if (*(DWORD*)wh != 0x46464952 //"RIFF"
+ || *(DWORDLONG*)(wh + 8) != 0x20746d6645564157 //"WAVEfmt "
+ || *(DWORD*)(wh + 36) != 0x61746164) { //"data"
+ return 0;
+ }
+ PCMWAVEFORMAT pcmwf = *(PCMWAVEFORMAT*)(wh + 20);
+ if (pcmwf.wf.wFormatTag != 1
+ || pcmwf.wf.nChannels != 2
+ || pcmwf.wf.nSamplesPerSec != 44100
+ || pcmwf.wf.nAvgBytesPerSec != 176400
+ || pcmwf.wf.nBlockAlign != 4
+ || pcmwf.wBitsPerSample != 16) {
+ return 0;
+ }
+ return *(DWORD*)(wh + 40); //return size of "data"
}
-int ParseAC3IEC61937Header(const BYTE *buf)
+int ParseAC3IEC61937Header(const BYTE* buf)
{
- WORD* wbuf = (WORD*)buf;
- if (*(DWORD*)buf == IEC61937_SYNC_WORD
- && wbuf[2] == 0x0001
- && wbuf[3] > 0 && wbuf[3] < (6144-8)*8
- && wbuf[4] == 0x0B77 ) {
- return 6144;
- }
- return 0;
+ WORD* wbuf = (WORD*)buf;
+ if (*(DWORD*)buf == IEC61937_SYNC_WORD
+ && wbuf[2] == 0x0001
+ && wbuf[3] > 0 && wbuf[3] < (6144 - 8) * 8
+ && wbuf[4] == 0x0B77) {
+ return 6144;
+ }
+ return 0;
}
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_DTS},
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DTS},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_DOLBY_AC3},
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DOLBY_AC3},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_DTS},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DTS},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_DOLBY_AC3},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DOLBY_AC3},
};
const AMOVIESETUP_PIN sudOpPin[] = {
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CDTSAC3Source), DTSAC3SourceName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CDTSAC3Source), DTSAC3SourceName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CDTSAC3Source>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CDTSAC3Source>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"),
- _T("0"), _T("0,4,,7FFE8001")); // DTS
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"),
+ _T("0"), _T("0,4,,7FFE8001")); // DTS
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"),
- _T("0"), _T("0,4,,fE7f0180")); // DTS LE
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"),
+ _T("0"), _T("0,4,,fE7f0180")); // DTS LE
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"),
- _T("1"), _T("0,2,,0B77")); // AC3, E-AC3
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"),
+ _T("1"), _T("0,2,,0B77")); // AC3, E-AC3
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"),
- _T("2"), _T("0,16,,52494646xxxx57415645666D7420")); // RIFFxxxxWAVEfmt_ for DTSWAV
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"),
+ _T("2"), _T("0,16,,52494646xxxx57415645666D7420")); // RIFFxxxxWAVEfmt_ for DTSWAV
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"),
- _T("0"), _T("4,4,,F8726FBB")); // MLP
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"),
+ _T("0"), _T("4,4,,F8726FBB")); // MLP
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"),
- _T("Source Filter"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"));
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"),
+ _T("Source Filter"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"));
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".dts"),
- _T("Source Filter"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"));
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".dts"),
+ _T("Source Filter"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"));
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".ac3"),
- _T("Source Filter"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"));
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".ac3"),
+ _T("Source Filter"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"));
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".eac3"),
- _T("Source Filter"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"));
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".eac3"),
+ _T("Source Filter"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"));
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".dts"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".ac3"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".eac3"));
+ DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{B4A7BE85-551D-4594-BDC7-832B09185041}"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".dts"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".ac3"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".eac3"));
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -180,7 +181,7 @@ CFilterApp theApp;
//
CDTSAC3Source::CDTSAC3Source(LPUNKNOWN lpunk, HRESULT* phr)
- : CBaseSource<CDTSAC3Stream>(NAME("CDTSAC3Source"), lpunk, phr, __uuidof(this))
+ : CBaseSource<CDTSAC3Stream>(NAME("CDTSAC3Source"), lpunk, phr, __uuidof(this))
{
}
@@ -190,337 +191,348 @@ CDTSAC3Source::~CDTSAC3Source()
STDMETHODIMP CDTSAC3Source::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
- wcscpy_s(pInfo->achName, DTSAC3SourceName);
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+ wcscpy_s(pInfo->achName, DTSAC3SourceName);
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
// CDTSAC3Stream
CDTSAC3Stream::CDTSAC3Stream(const WCHAR* wfn, CSource* pParent, HRESULT* phr)
- : CBaseStream(NAME("CDTSAC3Stream"), pParent, phr)
- , m_dataOffset(0)
- , m_subtype(GUID_NULL)
- , m_wFormatTag(WAVE_FORMAT_UNKNOWN)
- , m_channels(0)
- , m_samplerate(0)
- , m_bitrate(0)
- , m_framesize(0)
- , m_fixedframesize(true)
- , m_framelength(0)
- , m_bitdepth(0)
- , m_streamtype(unknown)
+ : CBaseStream(NAME("CDTSAC3Stream"), pParent, phr)
+ , m_dataOffset(0)
+ , m_subtype(GUID_NULL)
+ , m_wFormatTag(WAVE_FORMAT_UNKNOWN)
+ , m_channels(0)
+ , m_samplerate(0)
+ , m_bitrate(0)
+ , m_framesize(0)
+ , m_fixedframesize(true)
+ , m_framelength(0)
+ , m_bitdepth(0)
+ , m_streamtype(unknown)
{
- CAutoLock cAutoLock(&m_cSharedState);
- CString fn(wfn);
- CFileException ex;
- HRESULT hr = E_FAIL;
- m_AvgTimePerFrame = 0;
-
- bool waveheader = false;
-
- do {
- if (!m_file.Open(fn, CFile::modeRead|CFile::shareDenyNone, &ex)) {
- hr = AmHresultFromWin32 (ex.m_lOsError);
- break;
- }
- const CString path = m_file.GetFilePath();
- const CString ext = CPath(m_file.GetFileName()).GetExtension().MakeLower();
-
- DWORD id = 0;
- DWORD id2 = 0;
- if (m_file.Read(&id, sizeof(id)) != sizeof(id) ||
- m_file.Read(&id2, sizeof(id2)) != sizeof(id2))
- break;
-
- // WAVE-CD header
- if (id == RIFF_DWORD) {
- if (ext != _T(".dtswav") && ext != _T(".dts") && ext != _T(".wav")) //check only specific extensions
- break;
- BYTE buf[44];
- m_file.SeekToBegin();
- if (m_file.Read(&buf, 44) != 44
- || ParseWAVECDHeader(buf) == 0
- || m_file.Read(&id, sizeof(id)) != sizeof(id))
- break;
- waveheader = true;
- }
-
- m_dataOffset = m_file.GetPosition() - sizeof(id) - (!waveheader ? sizeof(id2) : 0);
-
- bool isFound = isDTSSync(id) || (WORD)id==AC3_SYNC_WORD || id==IEC61937_SYNC_WORD || id2==MLP_SYNC_WORD /*|| id2!=TRUEHD_SYNC_WORD*/;
-
- // search DTS and AC3 headers (skip garbage in the beginning)
- if (!isFound) {
- UINT buflen = 0;
- if (waveheader && ext == _T(".wav") && PathFileExists(path.Left(path.GetLength()-ext.GetLength()) + _T(".cue"))) {
- buflen = 64 * 1024; // for .wav+.cue sometimes need to use a more deep search
- }
- else if (ext == _T(".dtswav") || ext == _T(".dts") || ext == _T(".wav") || ext == _T(".ac3") || ext == _T(".eac3")) { //check only specific extensions
- buflen = 6 * 1024;
- }
- else break;
-
- if (m_dataOffset < buflen) buflen -= (UINT)m_dataOffset; // tiny optimization
- m_file.Seek(m_dataOffset, CFile::begin);
-
- BYTE* buf = new BYTE[buflen];
- int len = m_file.Read(buf, buflen);
- if (len<100) break; // file is very small
-
- for (int i = 1; i < len - 4; i++) { // looking for DTS or AC3 sync
- id = *(DWORD*)(buf+i);
- if (isDTSSync(id) || (WORD)id==AC3_SYNC_WORD) {
- isFound = true;
- m_dataOffset += i;
- break;
- }
- }
- delete [] buf;
- }
- if (!isFound) break;
-
- m_file.Seek(m_dataOffset, CFile::begin);
-
- // DTS & DTS-HD
- if (isDTSSync(id)) {
- BYTE buf[16];
- if (m_file.Read(&buf, 16) != 16)
- break;
-
- // DTS header
- dts_state_t* m_dts_state;
- m_dts_state = dts_init(0);
- int fsize = 0, flags, targeted_bitrate;
- if ((fsize = dts_syncinfo(m_dts_state, buf, &flags, &m_samplerate, &targeted_bitrate, &m_framelength)) < 96) { //minimal valid fsize = 96
- break;
- }
- m_streamtype = DTS;
-
- // DTS-HD header and zero padded
- unsigned long sync = -1;
- unsigned int HD_size = 0;
- int zero_bytes = 0;
-
- m_file.Seek(m_dataOffset+fsize, CFile::begin);
- m_file.Read(&sync, sizeof(sync));
- if (id == DTS_SYNC_WORD && sync == DTSHD_SYNC_WORD && m_file.Read(&buf, 8)==8) {
- unsigned char isBlownUpHeader = (buf[1]>>5)&1;
- if (isBlownUpHeader)
- HD_size = ((buf[2]&1)<<19 | buf[3]<<11 | buf[4]<<3 | buf[5]>>5) + 1;
- else
- HD_size = ((buf[2]&31)<<11 | buf[3]<<3 | buf[4]>>5) + 1;
- //TODO: get more information about DTS-HD
- m_streamtype = DTSHD;
- m_fixedframesize = false;
- } else if (sync == 0 && fsize < 2048) { // zero padded?
- m_file.Seek(m_dataOffset+2048, CFile::begin);
- m_file.Read(&sync, sizeof(sync));
- if (sync == id) {
- zero_bytes = 2048 - fsize;
- m_streamtype = DTSPaded;
- }
- }
-
- /*const int bitratetbl[32] = {
- 32000, 56000, 64000, 96000,
- 112000, 128000, 192000, 224000,
- 256000, 320000, 384000, 448000,
- 512000, 576000, 640000, 768000,
- 960000, 1024000, 1152000, 1280000,
- 1344000, 1408000, 1411200, 1472000,
- 1536000, 1920000, 2048000, 3072000,
- 3840000, 0, 0, 0 //open, variable, lossless
- // [15] 768000 is actually 754500 for DVD
- // [24] 1536000 is actually 1509000 for ???
- // [24] 1536000 is actually 1509750 for DVD
- // [22] 1411200 is actually 1234800 for 14-bit DTS-CD audio
- };*/
- const int channels[16] = {1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8};
-
- // calculate actual bitrate
- m_framesize = fsize + HD_size + zero_bytes;
- m_bitrate = int ((m_framesize) * 8i64 * m_samplerate / m_framelength);
-
- // calculate framesize to support a sonic audio decoder 4.3 (TODO: make otherwise)
- // sonicDTSminsize = fsize + HD_size + 4096
- int k = (m_framesize + 4096 + m_framesize - 1) / m_framesize;
- m_framesize *= k;
- m_framelength *= k;
-
- if (flags & 0x70) //unknown number of channels
- m_channels = 6;
- else {
- m_channels = channels[flags & 0x0f];
- if (flags & DCA_LFE) m_channels += 1; //+LFE
- }
-
- if (m_bitrate!=0)
- m_AvgTimePerFrame = 10000000i64 * m_framesize * 8 / m_bitrate;
-
- m_wFormatTag = WAVE_FORMAT_DTS;
- m_subtype = MEDIASUBTYPE_DTS;
- }
- // AC3 & E-AC3
- else if ((WORD)id == AC3_SYNC_WORD) {
- BYTE buf[20];
- if (m_file.Read(&buf, 8) != 8)
- break;
-
- BYTE bsid = (buf[5] >> 3);
- int fsize = 0;
- int HD_size = 0;
-
- // AC3 header
- if (bsid < 12) {
- fsize = ParseAC3Header(buf, &m_samplerate, &m_channels, &m_framelength, &m_bitrate);
- if (fsize == 0) {
- break;
- }
- m_streamtype = AC3;
- /*
- // TrueHD+AC3
- m_file.Seek(m_dataOffset+fsize, CFile::begin);
- if (m_file.Read(&buf, 20) == 20) {
- int samplerate2, channels2, framelength2;
- HD_size = ParseTrueHDHeader(buf, &samplerate2, &channels2, &framelength2);
- if (HD_size > 0) {
- m_streamtype = TrueHDAC3;
- m_fixedframesize = false;
- }
- }
- */
- }
- // E-AC3 header
- else if (bsid == 16) {
- int frametype;
- fsize = ParseEAC3Header(buf, &m_samplerate, &m_channels, &m_framelength, &frametype);
- if (fsize == 0) {
- break;
- }
-
- m_file.Seek(m_dataOffset+fsize, CFile::begin);
- if (m_file.Read(&buf, 8) == 8) {
- int samplerate2, channels2, samples2, frametype2;
- int fsize2 = ParseEAC3Header(buf, &samplerate2, &channels2, &samples2, &frametype2);
- if (fsize2 > 0 && frametype2 == EAC3_FRAME_TYPE_DEPENDENT)
- fsize += fsize2;
- }
- m_bitrate = int (fsize * 8i64 * m_samplerate / m_framelength);
- m_streamtype = EAC3;
- } else { //unknown bsid
- break;
- }
-
- // calculate framesize to support a sonic audio decoder 4.3 (TODO: make otherwise)
- // sonicAC3minsize = framesize + 64
- m_framesize = fsize * 2;
- m_framelength *= 2;
-
- if (m_bitrate!=0)
- m_AvgTimePerFrame = 10000000i64 * m_framesize * 8 / m_bitrate;
-
- m_wFormatTag = WAVE_FORMAT_UNKNOWN;
- m_subtype = MEDIASUBTYPE_DOLBY_AC3;
- }
- // SPDIF AC3
- else if (waveheader && id == IEC61937_SYNC_WORD) {
- BYTE buf[16];
- if (m_file.Read(&buf, 16) != 16)
- break;
- m_framesize = ParseAC3IEC61937Header(buf);
- if (m_framesize == 0)
- break;
-
- m_wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF;
- m_channels = 2;
- m_samplerate = 44100;
- m_bitrate = 1411200;
- m_bitdepth = 16;
-
- m_AvgTimePerFrame = 10000000i64 * 1536 / 44100;
-
- m_subtype = MEDIASUBTYPE_DOLBY_AC3_SPDIF;
- m_streamtype = SPDIF_AC3;
- }
- // MLP
- else if (id2 == MLP_SYNC_WORD) {
- BYTE buf[20];
- if (m_file.Read(&buf, 20) != 20)
- break;
-
- bool istruehd;
- m_framesize = ParseMLPHeader(buf, &m_samplerate, &m_channels, &m_framelength, &m_bitdepth, &istruehd);
- if (m_framesize == 0) {
- break;
- }
-
- m_streamtype = MLP;
- m_fixedframesize = false;
-
- if (m_samplerate!=0)
- m_AvgTimePerFrame = 10000000i64 * m_framelength / m_samplerate;
-
- m_bitrate = (int)(m_framesize * 8i64 * m_samplerate / m_framelength); // inaccurate, because framesize is not constant
-
- m_wFormatTag = WAVE_FORMAT_UNKNOWN;
- m_subtype = MEDIASUBTYPE_MLP;
- }
- /*
- // TrueHD
- else if (id2 == TRUEHD_SYNC_WORD) {
- BYTE buf[20];
- if (m_file.Read(&buf, 20) != 20)
- break;
- int fsize = 0;
- int fsize2 = 0;
- fsize = ParseTrueHDHeader(buf, &m_samplerate, &m_channels, &m_framelength);
- if (fsize == 0)
- break;
- m_streamtype = TrueHD;
- m_fixedframesize = false;
-
- if (m_samplerate!=0)
- m_AvgTimePerFrame = 10000000i64 * m_framelength / m_samplerate;
-
- // TrueHD+AC3
- if (m_file.Read(&buf, 8) == 8) {
- int samplerate2, channels2, framelength2, bitrate2;
- fsize2 = ParseAC3Header(buf, &samplerate2, &channels2, &framelength2, &bitrate2);
- if (fsize2 > 0) {
- m_streamtype = TrueHDAC3;
-
- if (samplerate2!=0)
- m_AvgTimePerFrame = 10000000i64 * framelength2 / samplerate2;
- }
- }
-
- m_framesize = fsize + fsize2;
- m_bitrate = int ((m_framesize) * 8i64 * m_samplerate / m_framelength);
- //m_bitdepth = 24;
-
- m_wFormatTag = WAVE_FORMAT_UNKNOWN;
- m_subtype = MEDIASUBTYPE_DOLBY_TRUEHD;
- */
- else {
- break;
- }
-
- m_rtDuration = m_AvgTimePerFrame * (m_file.GetLength() - m_dataOffset) / m_framesize;
- m_rtStop = m_rtDuration;
-
- hr = S_OK;
- } while (false);
-
- if (phr) {
- *phr = hr;
- }
+ CAutoLock cAutoLock(&m_cSharedState);
+ CString fn(wfn);
+ CFileException ex;
+ HRESULT hr = E_FAIL;
+ m_AvgTimePerFrame = 0;
+
+ bool waveheader = false;
+
+ do {
+ if (!m_file.Open(fn, CFile::modeRead | CFile::shareDenyNone, &ex)) {
+ hr = AmHresultFromWin32(ex.m_lOsError);
+ break;
+ }
+ const CString path = m_file.GetFilePath();
+ const CString ext = CPath(m_file.GetFileName()).GetExtension().MakeLower();
+
+ DWORD id = 0;
+ DWORD id2 = 0;
+ if (m_file.Read(&id, sizeof(id)) != sizeof(id) ||
+ m_file.Read(&id2, sizeof(id2)) != sizeof(id2)) {
+ break;
+ }
+
+ // WAVE-CD header
+ if (id == RIFF_DWORD) {
+ if (ext != _T(".dtswav") && ext != _T(".dts") && ext != _T(".wav")) { //check only specific extensions
+ break;
+ }
+ BYTE buf[44];
+ m_file.SeekToBegin();
+ if (m_file.Read(&buf, 44) != 44
+ || ParseWAVECDHeader(buf) == 0
+ || m_file.Read(&id, sizeof(id)) != sizeof(id)) {
+ break;
+ }
+ waveheader = true;
+ }
+
+ m_dataOffset = m_file.GetPosition() - sizeof(id) - (!waveheader ? sizeof(id2) : 0);
+
+ bool isFound = isDTSSync(id) || (WORD)id == AC3_SYNC_WORD || id == IEC61937_SYNC_WORD || id2 == MLP_SYNC_WORD /*|| id2!=TRUEHD_SYNC_WORD*/;
+
+ // search DTS and AC3 headers (skip garbage in the beginning)
+ if (!isFound) {
+ UINT buflen = 0;
+ if (waveheader && ext == _T(".wav") && PathFileExists(path.Left(path.GetLength() - ext.GetLength()) + _T(".cue"))) {
+ buflen = 64 * 1024; // for .wav+.cue sometimes need to use a more deep search
+ } else if (ext == _T(".dtswav") || ext == _T(".dts") || ext == _T(".wav") || ext == _T(".ac3") || ext == _T(".eac3")) { //check only specific extensions
+ buflen = 6 * 1024;
+ } else { break; }
+
+ if (m_dataOffset < buflen) { buflen -= (UINT)m_dataOffset; } // tiny optimization
+ m_file.Seek(m_dataOffset, CFile::begin);
+
+ BYTE* buf = new BYTE[buflen];
+ int len = m_file.Read(buf, buflen);
+ if (len < 100) { break; } // file is very small
+
+ for (int i = 1; i < len - 4; i++) { // looking for DTS or AC3 sync
+ id = *(DWORD*)(buf + i);
+ if (isDTSSync(id) || (WORD)id == AC3_SYNC_WORD) {
+ isFound = true;
+ m_dataOffset += i;
+ break;
+ }
+ }
+ delete [] buf;
+ }
+ if (!isFound) { break; }
+
+ m_file.Seek(m_dataOffset, CFile::begin);
+
+ // DTS & DTS-HD
+ if (isDTSSync(id)) {
+ BYTE buf[16];
+ if (m_file.Read(&buf, 16) != 16) {
+ break;
+ }
+
+ // DTS header
+ dts_state_t* m_dts_state;
+ m_dts_state = dts_init(0);
+ int fsize = 0, flags, targeted_bitrate;
+ if ((fsize = dts_syncinfo(m_dts_state, buf, &flags, &m_samplerate, &targeted_bitrate, &m_framelength)) < 96) { //minimal valid fsize = 96
+ break;
+ }
+ m_streamtype = DTS;
+
+ // DTS-HD header and zero padded
+ unsigned long sync = -1;
+ unsigned int HD_size = 0;
+ int zero_bytes = 0;
+
+ m_file.Seek(m_dataOffset + fsize, CFile::begin);
+ m_file.Read(&sync, sizeof(sync));
+ if (id == DTS_SYNC_WORD && sync == DTSHD_SYNC_WORD && m_file.Read(&buf, 8) == 8) {
+ unsigned char isBlownUpHeader = (buf[1] >> 5) & 1;
+ if (isBlownUpHeader) {
+ HD_size = ((buf[2] & 1) << 19 | buf[3] << 11 | buf[4] << 3 | buf[5] >> 5) + 1;
+ } else {
+ HD_size = ((buf[2] & 31) << 11 | buf[3] << 3 | buf[4] >> 5) + 1;
+ }
+ //TODO: get more information about DTS-HD
+ m_streamtype = DTSHD;
+ m_fixedframesize = false;
+ } else if (sync == 0 && fsize < 2048) { // zero padded?
+ m_file.Seek(m_dataOffset + 2048, CFile::begin);
+ m_file.Read(&sync, sizeof(sync));
+ if (sync == id) {
+ zero_bytes = 2048 - fsize;
+ m_streamtype = DTSPaded;
+ }
+ }
+
+ /*const int bitratetbl[32] = {
+ 32000, 56000, 64000, 96000,
+ 112000, 128000, 192000, 224000,
+ 256000, 320000, 384000, 448000,
+ 512000, 576000, 640000, 768000,
+ 960000, 1024000, 1152000, 1280000,
+ 1344000, 1408000, 1411200, 1472000,
+ 1536000, 1920000, 2048000, 3072000,
+ 3840000, 0, 0, 0 //open, variable, lossless
+ // [15] 768000 is actually 754500 for DVD
+ // [24] 1536000 is actually 1509000 for ???
+ // [24] 1536000 is actually 1509750 for DVD
+ // [22] 1411200 is actually 1234800 for 14-bit DTS-CD audio
+ };*/
+ const int channels[16] = {1, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 6, 7, 8, 8};
+
+ // calculate actual bitrate
+ m_framesize = fsize + HD_size + zero_bytes;
+ m_bitrate = int ((m_framesize) * 8i64 * m_samplerate / m_framelength);
+
+ // calculate framesize to support a sonic audio decoder 4.3 (TODO: make otherwise)
+ // sonicDTSminsize = fsize + HD_size + 4096
+ int k = (m_framesize + 4096 + m_framesize - 1) / m_framesize;
+ m_framesize *= k;
+ m_framelength *= k;
+
+ if (flags & 0x70) { //unknown number of channels
+ m_channels = 6;
+ } else {
+ m_channels = channels[flags & 0x0f];
+ if (flags & DCA_LFE) { m_channels += 1; } //+LFE
+ }
+
+ if (m_bitrate != 0) {
+ m_AvgTimePerFrame = 10000000i64 * m_framesize * 8 / m_bitrate;
+ }
+
+ m_wFormatTag = WAVE_FORMAT_DTS;
+ m_subtype = MEDIASUBTYPE_DTS;
+ }
+ // AC3 & E-AC3
+ else if ((WORD)id == AC3_SYNC_WORD) {
+ BYTE buf[20];
+ if (m_file.Read(&buf, 8) != 8) {
+ break;
+ }
+
+ BYTE bsid = (buf[5] >> 3);
+ int fsize = 0;
+ int HD_size = 0;
+
+ // AC3 header
+ if (bsid < 12) {
+ fsize = ParseAC3Header(buf, &m_samplerate, &m_channels, &m_framelength, &m_bitrate);
+ if (fsize == 0) {
+ break;
+ }
+ m_streamtype = AC3;
+ /*
+ // TrueHD+AC3
+ m_file.Seek(m_dataOffset+fsize, CFile::begin);
+ if (m_file.Read(&buf, 20) == 20) {
+ int samplerate2, channels2, framelength2;
+ HD_size = ParseTrueHDHeader(buf, &samplerate2, &channels2, &framelength2);
+ if (HD_size > 0) {
+ m_streamtype = TrueHDAC3;
+ m_fixedframesize = false;
+ }
+ }
+ */
+ }
+ // E-AC3 header
+ else if (bsid == 16) {
+ int frametype;
+ fsize = ParseEAC3Header(buf, &m_samplerate, &m_channels, &m_framelength, &frametype);
+ if (fsize == 0) {
+ break;
+ }
+
+ m_file.Seek(m_dataOffset + fsize, CFile::begin);
+ if (m_file.Read(&buf, 8) == 8) {
+ int samplerate2, channels2, samples2, frametype2;
+ int fsize2 = ParseEAC3Header(buf, &samplerate2, &channels2, &samples2, &frametype2);
+ if (fsize2 > 0 && frametype2 == EAC3_FRAME_TYPE_DEPENDENT) {
+ fsize += fsize2;
+ }
+ }
+ m_bitrate = int (fsize * 8i64 * m_samplerate / m_framelength);
+ m_streamtype = EAC3;
+ } else { //unknown bsid
+ break;
+ }
+
+ // calculate framesize to support a sonic audio decoder 4.3 (TODO: make otherwise)
+ // sonicAC3minsize = framesize + 64
+ m_framesize = fsize * 2;
+ m_framelength *= 2;
+
+ if (m_bitrate != 0) {
+ m_AvgTimePerFrame = 10000000i64 * m_framesize * 8 / m_bitrate;
+ }
+
+ m_wFormatTag = WAVE_FORMAT_UNKNOWN;
+ m_subtype = MEDIASUBTYPE_DOLBY_AC3;
+ }
+ // SPDIF AC3
+ else if (waveheader && id == IEC61937_SYNC_WORD) {
+ BYTE buf[16];
+ if (m_file.Read(&buf, 16) != 16) {
+ break;
+ }
+ m_framesize = ParseAC3IEC61937Header(buf);
+ if (m_framesize == 0) {
+ break;
+ }
+
+ m_wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF;
+ m_channels = 2;
+ m_samplerate = 44100;
+ m_bitrate = 1411200;
+ m_bitdepth = 16;
+
+ m_AvgTimePerFrame = 10000000i64 * 1536 / 44100;
+
+ m_subtype = MEDIASUBTYPE_DOLBY_AC3_SPDIF;
+ m_streamtype = SPDIF_AC3;
+ }
+ // MLP
+ else if (id2 == MLP_SYNC_WORD) {
+ BYTE buf[20];
+ if (m_file.Read(&buf, 20) != 20) {
+ break;
+ }
+
+ bool istruehd;
+ m_framesize = ParseMLPHeader(buf, &m_samplerate, &m_channels, &m_framelength, &m_bitdepth, &istruehd);
+ if (m_framesize == 0) {
+ break;
+ }
+
+ m_streamtype = MLP;
+ m_fixedframesize = false;
+
+ if (m_samplerate != 0) {
+ m_AvgTimePerFrame = 10000000i64 * m_framelength / m_samplerate;
+ }
+
+ m_bitrate = (int)(m_framesize * 8i64 * m_samplerate / m_framelength); // inaccurate, because framesize is not constant
+
+ m_wFormatTag = WAVE_FORMAT_UNKNOWN;
+ m_subtype = MEDIASUBTYPE_MLP;
+ }
+ /*
+ // TrueHD
+ else if (id2 == TRUEHD_SYNC_WORD) {
+ BYTE buf[20];
+ if (m_file.Read(&buf, 20) != 20)
+ break;
+ int fsize = 0;
+ int fsize2 = 0;
+ fsize = ParseTrueHDHeader(buf, &m_samplerate, &m_channels, &m_framelength);
+ if (fsize == 0)
+ break;
+ m_streamtype = TrueHD;
+ m_fixedframesize = false;
+
+ if (m_samplerate!=0)
+ m_AvgTimePerFrame = 10000000i64 * m_framelength / m_samplerate;
+
+ // TrueHD+AC3
+ if (m_file.Read(&buf, 8) == 8) {
+ int samplerate2, channels2, framelength2, bitrate2;
+ fsize2 = ParseAC3Header(buf, &samplerate2, &channels2, &framelength2, &bitrate2);
+ if (fsize2 > 0) {
+ m_streamtype = TrueHDAC3;
+
+ if (samplerate2!=0)
+ m_AvgTimePerFrame = 10000000i64 * framelength2 / samplerate2;
+ }
+ }
+
+ m_framesize = fsize + fsize2;
+ m_bitrate = int ((m_framesize) * 8i64 * m_samplerate / m_framelength);
+ //m_bitdepth = 24;
+
+ m_wFormatTag = WAVE_FORMAT_UNKNOWN;
+ m_subtype = MEDIASUBTYPE_DOLBY_TRUEHD;
+ */
+ else {
+ break;
+ }
+
+ m_rtDuration = m_AvgTimePerFrame * (m_file.GetLength() - m_dataOffset) / m_framesize;
+ m_rtStop = m_rtDuration;
+
+ hr = S_OK;
+ } while (false);
+
+ if (phr) {
+ *phr = hr;
+ }
}
CDTSAC3Stream::~CDTSAC3Stream()
@@ -529,141 +541,141 @@ CDTSAC3Stream::~CDTSAC3Stream()
HRESULT CDTSAC3Stream::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties)
{
- ASSERT(pAlloc);
- ASSERT(pProperties);
+ ASSERT(pAlloc);
+ ASSERT(pProperties);
- HRESULT hr = NOERROR;
+ HRESULT hr = NOERROR;
- pProperties->cBuffers = 1;
- pProperties->cbBuffer = m_framesize;
+ pProperties->cBuffers = 1;
+ pProperties->cbBuffer = m_framesize;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- if (Actual.cbBuffer < pProperties->cbBuffer) {
- return E_FAIL;
- }
- ASSERT(Actual.cBuffers == pProperties->cBuffers);
+ if (Actual.cbBuffer < pProperties->cbBuffer) {
+ return E_FAIL;
+ }
+ ASSERT(Actual.cBuffers == pProperties->cBuffers);
- return NOERROR;
+ return NOERROR;
}
HRESULT CDTSAC3Stream::FillBuffer(IMediaSample* pSample, int nFrame, BYTE* pOut, long& len)
{
- BYTE* pOutOrg = pOut;
+ BYTE* pOutOrg = pOut;
- const GUID* majortype = &m_mt.majortype;
- const GUID* subtype = &m_mt.subtype;
- UNREFERENCED_PARAMETER(subtype);
+ const GUID* majortype = &m_mt.majortype;
+ const GUID* subtype = &m_mt.subtype;
+ UNREFERENCED_PARAMETER(subtype);
- if (*majortype == MEDIATYPE_Audio) {
- m_file.Seek(m_dataOffset + nFrame*m_framesize, CFile::begin);
- if ((int)m_file.Read(pOut, m_framesize) < m_framesize) {
- return S_FALSE;
- }
- pOut += m_framesize;
- }
+ if (*majortype == MEDIATYPE_Audio) {
+ m_file.Seek(m_dataOffset + nFrame * m_framesize, CFile::begin);
+ if ((int)m_file.Read(pOut, m_framesize) < m_framesize) {
+ return S_FALSE;
+ }
+ pOut += m_framesize;
+ }
- len = (long)(pOut - pOutOrg);
+ len = (long)(pOut - pOutOrg);
- return S_OK;
+ return S_OK;
}
bool CDTSAC3Stream::CheckDTS(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Audio
- && pmt->subtype == MEDIASUBTYPE_DTS
- && pmt->formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DTS;
+ return pmt->majortype == MEDIATYPE_Audio
+ && pmt->subtype == MEDIASUBTYPE_DTS
+ && pmt->formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DTS;
}
bool CDTSAC3Stream::CheckDTS2(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Audio
- && pmt->subtype == MEDIASUBTYPE_WAVE_DTS
- && pmt->formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DVD_DTS;
+ return pmt->majortype == MEDIATYPE_Audio
+ && pmt->subtype == MEDIASUBTYPE_WAVE_DTS
+ && pmt->formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DVD_DTS;
}
bool CDTSAC3Stream::CheckAC3(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Audio
- && pmt->subtype == MEDIASUBTYPE_DOLBY_AC3
- && pmt->formattype == FORMAT_WaveFormatEx
- && (((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_UNKNOWN
- || ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DOLBY_AC3);
+ return pmt->majortype == MEDIATYPE_Audio
+ && pmt->subtype == MEDIASUBTYPE_DOLBY_AC3
+ && pmt->formattype == FORMAT_WaveFormatEx
+ && (((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_UNKNOWN
+ || ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DOLBY_AC3);
}
bool CDTSAC3Stream::CheckSPDIFAC3(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Audio
- && pmt->subtype == MEDIASUBTYPE_DOLBY_AC3_SPDIF
- && pmt->formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DOLBY_AC3_SPDIF;
+ return pmt->majortype == MEDIATYPE_Audio
+ && pmt->subtype == MEDIASUBTYPE_DOLBY_AC3_SPDIF
+ && pmt->formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DOLBY_AC3_SPDIF;
}
bool CDTSAC3Stream::CheckMLP(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Audio
- && pmt->subtype == MEDIASUBTYPE_MLP
- && pmt->formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_UNKNOWN;
+ return pmt->majortype == MEDIATYPE_Audio
+ && pmt->subtype == MEDIASUBTYPE_MLP
+ && pmt->formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_UNKNOWN;
}
/*
bool CDTSAC3Stream::CheckTrueHD(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Audio
- && pmt->subtype == MEDIASUBTYPE_DOLBY_TRUEHD
- && pmt->formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_UNKNOWN;
+ return pmt->majortype == MEDIATYPE_Audio
+ && pmt->subtype == MEDIASUBTYPE_DOLBY_TRUEHD
+ && pmt->formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_UNKNOWN;
}
*/
HRESULT CDTSAC3Stream::GetMediaType(int iPosition, CMediaType* pmt)
{
- CAutoLock cAutoLock(m_pFilter->pStateLock());
-
- if (iPosition == 0) {
- pmt->majortype = MEDIATYPE_Audio;
- pmt->subtype = m_subtype;
- pmt->formattype = FORMAT_WaveFormatEx;
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)pmt->AllocFormatBuffer(sizeof(WAVEFORMATEX));
- wfe->wFormatTag = m_wFormatTag;
- wfe->nChannels = m_channels;
- wfe->nSamplesPerSec = m_samplerate;
- wfe->nAvgBytesPerSec = (m_bitrate + 4) /8;
- wfe->nBlockAlign = m_framesize < WORD_MAX ? m_framesize : WORD_MAX;
- wfe->wBitsPerSample = m_bitdepth;
- wfe->cbSize = 0;
-
- if (m_streamtype == SPDIF_AC3) {
- wfe->nBlockAlign = 4;
- pmt->SetSampleSize(m_framesize);
- } else if (m_streamtype == MLP /*|| m_streamtype == TrueHD*/) {
- pmt->SetSampleSize(0);
- }
-
- } else {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- pmt->SetTemporalCompression(FALSE);
-
- return S_OK;
+ CAutoLock cAutoLock(m_pFilter->pStateLock());
+
+ if (iPosition == 0) {
+ pmt->majortype = MEDIATYPE_Audio;
+ pmt->subtype = m_subtype;
+ pmt->formattype = FORMAT_WaveFormatEx;
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)pmt->AllocFormatBuffer(sizeof(WAVEFORMATEX));
+ wfe->wFormatTag = m_wFormatTag;
+ wfe->nChannels = m_channels;
+ wfe->nSamplesPerSec = m_samplerate;
+ wfe->nAvgBytesPerSec = (m_bitrate + 4) / 8;
+ wfe->nBlockAlign = m_framesize < WORD_MAX ? m_framesize : WORD_MAX;
+ wfe->wBitsPerSample = m_bitdepth;
+ wfe->cbSize = 0;
+
+ if (m_streamtype == SPDIF_AC3) {
+ wfe->nBlockAlign = 4;
+ pmt->SetSampleSize(m_framesize);
+ } else if (m_streamtype == MLP /*|| m_streamtype == TrueHD*/) {
+ pmt->SetSampleSize(0);
+ }
+
+ } else {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ pmt->SetTemporalCompression(FALSE);
+
+ return S_OK;
}
HRESULT CDTSAC3Stream::CheckMediaType(const CMediaType* pmt)
{
- return CheckDTS(pmt)
- || CheckDTS2(pmt)
- || CheckAC3(pmt)
- || CheckSPDIFAC3(pmt)
- || CheckMLP(pmt)
- //|| CheckTrueHD(pmt)
- ? S_OK
- : E_INVALIDARG;
+ return CheckDTS(pmt)
+ || CheckDTS2(pmt)
+ || CheckAC3(pmt)
+ || CheckSPDIFAC3(pmt)
+ || CheckMLP(pmt)
+ //|| CheckTrueHD(pmt)
+ ? S_OK
+ : E_INVALIDARG;
}
diff --git a/src/filters/source/DTSAC3Source/DTSAC3Source.h b/src/filters/source/DTSAC3Source/DTSAC3Source.h
index 75cd92b94..8da838b12 100644
--- a/src/filters/source/DTSAC3Source/DTSAC3Source.h
+++ b/src/filters/source/DTSAC3Source/DTSAC3Source.h
@@ -31,46 +31,46 @@
class CDTSAC3Stream;
class __declspec(uuid("B4A7BE85-551D-4594-BDC7-832B09185041"))
- CDTSAC3Source : public CBaseSource<CDTSAC3Stream>
+ CDTSAC3Source : public CBaseSource<CDTSAC3Stream>
{
public:
- CDTSAC3Source(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CDTSAC3Source();
+ CDTSAC3Source(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CDTSAC3Source();
- // CBaseFilter
- STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
+ // CBaseFilter
+ STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
};
class CDTSAC3Stream : public CBaseStream
{
- CFile m_file;
- LONGLONG m_dataOffset;
+ CFile m_file;
+ LONGLONG m_dataOffset;
- GUID m_subtype;
- WORD m_wFormatTag;
- int m_channels; // number of channels
- int m_samplerate; // samples per second
- int m_bitrate; // bits per second
- int m_framesize; // bytes per frame
- bool m_fixedframesize; // constant frame size
- int m_framelength; // sample per frame
- WORD m_bitdepth; // bits per sample
- BYTE m_streamtype;
+ GUID m_subtype;
+ WORD m_wFormatTag;
+ int m_channels; // number of channels
+ int m_samplerate; // samples per second
+ int m_bitrate; // bits per second
+ int m_framesize; // bytes per frame
+ bool m_fixedframesize; // constant frame size
+ int m_framelength; // sample per frame
+ WORD m_bitdepth; // bits per sample
+ BYTE m_streamtype;
- bool CheckDTS(const CMediaType* pmt);
- bool CheckDTS2(const CMediaType* pmt);
- bool CheckAC3(const CMediaType* pmt);
- bool CheckSPDIFAC3(const CMediaType* pmt);
- bool CheckMLP(const CMediaType* pmt);
- //bool CheckTrueHD(const CMediaType* pmt);
+ bool CheckDTS(const CMediaType* pmt);
+ bool CheckDTS2(const CMediaType* pmt);
+ bool CheckAC3(const CMediaType* pmt);
+ bool CheckSPDIFAC3(const CMediaType* pmt);
+ bool CheckMLP(const CMediaType* pmt);
+ //bool CheckTrueHD(const CMediaType* pmt);
public:
- CDTSAC3Stream(const WCHAR* wfn, CSource* pParent, HRESULT* phr);
- virtual ~CDTSAC3Stream();
+ CDTSAC3Stream(const WCHAR* wfn, CSource* pParent, HRESULT* phr);
+ virtual ~CDTSAC3Stream();
- HRESULT FillBuffer(IMediaSample* pSample, int nFrame, BYTE* pOut, long& len);
+ HRESULT FillBuffer(IMediaSample* pSample, int nFrame, BYTE* pOut, long& len);
- HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT CheckMediaType(const CMediaType* pMediaType);
- HRESULT GetMediaType(int iPosition, CMediaType* pmt);
+ HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT CheckMediaType(const CMediaType* pMediaType);
+ HRESULT GetMediaType(int iPosition, CMediaType* pmt);
};
diff --git a/src/filters/source/FLACSource/FLACSource.cpp b/src/filters/source/FLACSource/FLACSource.cpp
index 56315d67c..3dba4bd8a 100644
--- a/src/filters/source/FLACSource/FLACSource.cpp
+++ b/src/filters/source/FLACSource/FLACSource.cpp
@@ -38,46 +38,46 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_FLAC_FRAMED}
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_FLAC_FRAMED}
};
const AMOVIESETUP_PIN sudOpPin[] = {
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CFLACSource), FlacSourceName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CFLACSource), FlacSourceName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CFLACSource>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CFLACSource>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{1930D8FF-4739-4e42-9199-3B2EDEAA3BF2}"),
- _T("0"), _T("0,4,,664C6143"));
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{1930D8FF-4739-4e42-9199-3B2EDEAA3BF2}"),
+ _T("0"), _T("0,4,,664C6143"));
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{1930D8FF-4739-4e42-9199-3B2EDEAA3BF2}"),
- _T("Source Filter"), _T("{1930D8FF-4739-4e42-9199-3B2EDEAA3BF2}"));
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{1930D8FF-4739-4e42-9199-3B2EDEAA3BF2}"),
+ _T("Source Filter"), _T("{1930D8FF-4739-4e42-9199-3B2EDEAA3BF2}"));
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".flac"),
- _T("Source Filter"), _T("{1930D8FF-4739-4e42-9199-3B2EDEAA3BF2}"));
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".flac"),
+ _T("Source Filter"), _T("{1930D8FF-4739-4e42-9199-3B2EDEAA3BF2}"));
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{1930D8FF-4739-4e42-9199-3B2EDEAA3BF2}"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".flac"));
+ DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{1930D8FF-4739-4e42-9199-3B2EDEAA3BF2}"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".flac"));
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -88,14 +88,14 @@ CFilterApp theApp;
// Declaration for FLAC callbacks
-static FLAC__StreamDecoderReadStatus StreamDecoderRead(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data);
-static FLAC__StreamDecoderSeekStatus StreamDecoderSeek(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data);
-static FLAC__StreamDecoderTellStatus StreamDecoderTell(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data);
-static FLAC__StreamDecoderLengthStatus StreamDecoderLength(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data);
-static FLAC__bool StreamDecoderEof(const FLAC__StreamDecoder *decoder, void *client_data);
-static FLAC__StreamDecoderWriteStatus StreamDecoderWrite(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
-static void StreamDecoderError(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
-static void StreamDecoderMetadata(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
+static FLAC__StreamDecoderReadStatus StreamDecoderRead(const FLAC__StreamDecoder* decoder, FLAC__byte buffer[], size_t* bytes, void* client_data);
+static FLAC__StreamDecoderSeekStatus StreamDecoderSeek(const FLAC__StreamDecoder* decoder, FLAC__uint64 absolute_byte_offset, void* client_data);
+static FLAC__StreamDecoderTellStatus StreamDecoderTell(const FLAC__StreamDecoder* decoder, FLAC__uint64* absolute_byte_offset, void* client_data);
+static FLAC__StreamDecoderLengthStatus StreamDecoderLength(const FLAC__StreamDecoder* decoder, FLAC__uint64* stream_length, void* client_data);
+static FLAC__bool StreamDecoderEof(const FLAC__StreamDecoder* decoder, void* client_data);
+static FLAC__StreamDecoderWriteStatus StreamDecoderWrite(const FLAC__StreamDecoder* decoder, const FLAC__Frame* frame, const FLAC__int32* const buffer[], void* client_data);
+static void StreamDecoderError(const FLAC__StreamDecoder* decoder, FLAC__StreamDecoderErrorStatus status, void* client_data);
+static void StreamDecoderMetadata(const FLAC__StreamDecoder* decoder, const FLAC__StreamMetadata* metadata, void* client_data);
//
@@ -103,7 +103,7 @@ static void StreamDecoderMetadata(const FLAC__StreamDecoder *decoder, con
//
CFLACSource::CFLACSource(LPUNKNOWN lpunk, HRESULT* phr)
- : CBaseSource<CFLACStream>(NAME("CFLACSource"), lpunk, phr, __uuidof(this))
+ : CBaseSource<CFLACStream>(NAME("CFLACSource"), lpunk, phr, __uuidof(this))
{
}
@@ -113,253 +113,253 @@ CFLACSource::~CFLACSource()
STDMETHODIMP CFLACSource::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
- wcscpy_s(pInfo->achName, FlacSourceName);
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+ wcscpy_s(pInfo->achName, FlacSourceName);
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
// CFLACStream
CFLACStream::CFLACStream(const WCHAR* wfn, CSource* pParent, HRESULT* phr)
- : CBaseStream(NAME("CFLACStream"), pParent, phr)
- , m_bIsEOF (false)
- , m_pDecoder (NULL)
+ : CBaseStream(NAME("CFLACStream"), pParent, phr)
+ , m_bIsEOF(false)
+ , m_pDecoder(NULL)
{
- CAutoLock cAutoLock(&m_cSharedState);
- CString fn(wfn);
- CFileException ex;
- HRESULT hr = E_FAIL;
-
- do {
- if (!m_file.Open(fn, CFile::modeRead|CFile::shareDenyNone, &ex)) {
- hr = AmHresultFromWin32 (ex.m_lOsError);
- break;
- }
-
- m_pDecoder = FLAC__stream_decoder_new();
- if (!m_pDecoder) {
- break;
- }
-
- if (FLAC__STREAM_DECODER_INIT_STATUS_OK != FLAC__stream_decoder_init_stream (_DECODER_,
- StreamDecoderRead,
- StreamDecoderSeek,
- StreamDecoderTell,
- StreamDecoderLength,
- StreamDecoderEof,
- StreamDecoderWrite,
- StreamDecoderMetadata,
- StreamDecoderError,
- this)) {
- break;
- }
-
-
- if (!FLAC__stream_decoder_process_until_end_of_metadata (_DECODER_) ||
- !FLAC__stream_decoder_seek_absolute (_DECODER_, 0)) {
- break;
- }
-
- FLAC__stream_decoder_get_decode_position(_DECODER_, &m_llOffset);
-
- hr = S_OK;
- } while (false);
-
- if (phr) {
- *phr = hr;
- }
+ CAutoLock cAutoLock(&m_cSharedState);
+ CString fn(wfn);
+ CFileException ex;
+ HRESULT hr = E_FAIL;
+
+ do {
+ if (!m_file.Open(fn, CFile::modeRead | CFile::shareDenyNone, &ex)) {
+ hr = AmHresultFromWin32(ex.m_lOsError);
+ break;
+ }
+
+ m_pDecoder = FLAC__stream_decoder_new();
+ if (!m_pDecoder) {
+ break;
+ }
+
+ if (FLAC__STREAM_DECODER_INIT_STATUS_OK != FLAC__stream_decoder_init_stream(_DECODER_,
+ StreamDecoderRead,
+ StreamDecoderSeek,
+ StreamDecoderTell,
+ StreamDecoderLength,
+ StreamDecoderEof,
+ StreamDecoderWrite,
+ StreamDecoderMetadata,
+ StreamDecoderError,
+ this)) {
+ break;
+ }
+
+
+ if (!FLAC__stream_decoder_process_until_end_of_metadata(_DECODER_) ||
+ !FLAC__stream_decoder_seek_absolute(_DECODER_, 0)) {
+ break;
+ }
+
+ FLAC__stream_decoder_get_decode_position(_DECODER_, &m_llOffset);
+
+ hr = S_OK;
+ } while (false);
+
+ if (phr) {
+ *phr = hr;
+ }
}
CFLACStream::~CFLACStream()
{
- if (m_pDecoder) {
- FLAC__stream_decoder_delete (_DECODER_);
- m_pDecoder = NULL;
- }
+ if (m_pDecoder) {
+ FLAC__stream_decoder_delete(_DECODER_);
+ m_pDecoder = NULL;
+ }
}
HRESULT CFLACStream::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties)
{
- ASSERT(pAlloc);
- ASSERT(pProperties);
+ ASSERT(pAlloc);
+ ASSERT(pProperties);
- HRESULT hr = NOERROR;
+ HRESULT hr = NOERROR;
- pProperties->cBuffers = 1;
- pProperties->cbBuffer = m_nMaxFrameSize;
+ pProperties->cBuffers = 1;
+ pProperties->cbBuffer = m_nMaxFrameSize;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- if (Actual.cbBuffer < pProperties->cbBuffer) {
- return E_FAIL;
- }
- ASSERT(Actual.cBuffers == pProperties->cBuffers);
+ if (Actual.cbBuffer < pProperties->cbBuffer) {
+ return E_FAIL;
+ }
+ ASSERT(Actual.cBuffers == pProperties->cBuffers);
- return NOERROR;
+ return NOERROR;
}
HRESULT CFLACStream::FillBuffer(IMediaSample* pSample, int nFrame, BYTE* pOut, long& len)
{
- FLAC__uint64 llCurPos;
- FLAC__uint64 llNextPos;
+ FLAC__uint64 llCurPos;
+ FLAC__uint64 llNextPos;
- if (m_bDiscontinuity) {
- FLAC__stream_decoder_seek_absolute (_DECODER_, (m_rtPosition * m_i64TotalNumSamples) / m_rtDuration);
- }
+ if (m_bDiscontinuity) {
+ FLAC__stream_decoder_seek_absolute(_DECODER_, (m_rtPosition * m_i64TotalNumSamples) / m_rtDuration);
+ }
- FLAC__stream_decoder_get_decode_position(_DECODER_, &llCurPos);
+ FLAC__stream_decoder_get_decode_position(_DECODER_, &llCurPos);
- FLAC__stream_decoder_skip_single_frame (_DECODER_);
- if (m_bIsEOF) {
- return S_FALSE;
- }
- FLAC__stream_decoder_get_decode_position(_DECODER_, &llNextPos);
+ FLAC__stream_decoder_skip_single_frame(_DECODER_);
+ if (m_bIsEOF) {
+ return S_FALSE;
+ }
+ FLAC__stream_decoder_get_decode_position(_DECODER_, &llNextPos);
- FLAC__uint64 llCurFile = m_file.GetPosition();
- len = (long)(llNextPos - llCurPos);
- ASSERT (len > 0);
- if (len <= 0) {
- return S_FALSE;
- }
+ FLAC__uint64 llCurFile = m_file.GetPosition();
+ len = (long)(llNextPos - llCurPos);
+ ASSERT(len > 0);
+ if (len <= 0) {
+ return S_FALSE;
+ }
- m_file.Seek (llCurPos, CFile::begin);
- m_file.Read (pOut, len);
- m_file.Seek (llCurFile, CFile::begin);
+ m_file.Seek(llCurPos, CFile::begin);
+ m_file.Read(pOut, len);
+ m_file.Seek(llCurFile, CFile::begin);
- m_AvgTimePerFrame = m_rtDuration * len / (m_llFileSize-m_llOffset);
+ m_AvgTimePerFrame = m_rtDuration * len / (m_llFileSize - m_llOffset);
- return S_OK;
+ return S_OK;
}
HRESULT CFLACStream::GetMediaType(int iPosition, CMediaType* pmt)
{
- CAutoLock cAutoLock(m_pFilter->pStateLock());
-
- if (iPosition == 0) {
- pmt->majortype = MEDIATYPE_Audio;
- pmt->subtype = MEDIASUBTYPE_FLAC_FRAMED;
- pmt->formattype = FORMAT_WaveFormatEx;
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)pmt->AllocFormatBuffer(sizeof(WAVEFORMATEX));
- memset(wfe, 0, sizeof(WAVEFORMATEX));
- wfe->wFormatTag = WAVE_FORMAT_FLAC;
- wfe->nChannels = m_nChannels;
- wfe->nSamplesPerSec = m_nSamplesPerSec;
- wfe->nAvgBytesPerSec = m_nAvgBytesPerSec;
- wfe->nBlockAlign = 1;
- wfe->wBitsPerSample = m_wBitsPerSample;
- wfe->cbSize = 0;
- } else {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- pmt->SetTemporalCompression(FALSE);
-
- return S_OK;
+ CAutoLock cAutoLock(m_pFilter->pStateLock());
+
+ if (iPosition == 0) {
+ pmt->majortype = MEDIATYPE_Audio;
+ pmt->subtype = MEDIASUBTYPE_FLAC_FRAMED;
+ pmt->formattype = FORMAT_WaveFormatEx;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)pmt->AllocFormatBuffer(sizeof(WAVEFORMATEX));
+ memset(wfe, 0, sizeof(WAVEFORMATEX));
+ wfe->wFormatTag = WAVE_FORMAT_FLAC;
+ wfe->nChannels = m_nChannels;
+ wfe->nSamplesPerSec = m_nSamplesPerSec;
+ wfe->nAvgBytesPerSec = m_nAvgBytesPerSec;
+ wfe->nBlockAlign = 1;
+ wfe->wBitsPerSample = m_wBitsPerSample;
+ wfe->cbSize = 0;
+ } else {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ pmt->SetTemporalCompression(FALSE);
+
+ return S_OK;
}
HRESULT CFLACStream::CheckMediaType(const CMediaType* pmt)
{
- if ( pmt->majortype == MEDIATYPE_Audio
- && pmt->subtype == MEDIASUBTYPE_FLAC_FRAMED
- && pmt->formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_FLAC) {
- return S_OK;
- } else {
- return E_INVALIDARG;
- }
+ if (pmt->majortype == MEDIATYPE_Audio
+ && pmt->subtype == MEDIASUBTYPE_FLAC_FRAMED
+ && pmt->formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_FLAC) {
+ return S_OK;
+ } else {
+ return E_INVALIDARG;
+ }
}
-void CFLACStream::UpdateFromMetadata (void* pBuffer)
+void CFLACStream::UpdateFromMetadata(void* pBuffer)
{
- const FLAC__StreamMetadata* pMetadata = (const FLAC__StreamMetadata*) pBuffer;
-
- m_nMaxFrameSize = pMetadata->data.stream_info.max_framesize;
- m_nSamplesPerSec = pMetadata->data.stream_info.sample_rate;
- m_nChannels = pMetadata->data.stream_info.channels;
- m_wBitsPerSample = pMetadata->data.stream_info.bits_per_sample;
- m_i64TotalNumSamples = pMetadata->data.stream_info.total_samples;
- m_nAvgBytesPerSec = (m_nChannels * (m_wBitsPerSample >> 3)) * m_nSamplesPerSec;
-
- // === Init members from base classes
- GetFileSizeEx (m_file.m_hFile, (LARGE_INTEGER*)&m_llFileSize);
- m_rtDuration = (m_i64TotalNumSamples * UNITS) / m_nSamplesPerSec;
- m_rtStop = m_rtDuration;
- m_AvgTimePerFrame = (m_nMaxFrameSize + pMetadata->data.stream_info.min_framesize) * m_rtDuration / 2 / m_llFileSize;
+ const FLAC__StreamMetadata* pMetadata = (const FLAC__StreamMetadata*) pBuffer;
+
+ m_nMaxFrameSize = pMetadata->data.stream_info.max_framesize;
+ m_nSamplesPerSec = pMetadata->data.stream_info.sample_rate;
+ m_nChannels = pMetadata->data.stream_info.channels;
+ m_wBitsPerSample = pMetadata->data.stream_info.bits_per_sample;
+ m_i64TotalNumSamples = pMetadata->data.stream_info.total_samples;
+ m_nAvgBytesPerSec = (m_nChannels * (m_wBitsPerSample >> 3)) * m_nSamplesPerSec;
+
+ // === Init members from base classes
+ GetFileSizeEx(m_file.m_hFile, (LARGE_INTEGER*)&m_llFileSize);
+ m_rtDuration = (m_i64TotalNumSamples * UNITS) / m_nSamplesPerSec;
+ m_rtStop = m_rtDuration;
+ m_AvgTimePerFrame = (m_nMaxFrameSize + pMetadata->data.stream_info.min_framesize) * m_rtDuration / 2 / m_llFileSize;
}
-FLAC__StreamDecoderReadStatus StreamDecoderRead(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
+FLAC__StreamDecoderReadStatus StreamDecoderRead(const FLAC__StreamDecoder* decoder, FLAC__byte buffer[], size_t* bytes, void* client_data)
{
- CFLACStream* pThis = static_cast<CFLACStream*>(client_data);
- UINT nRead = pThis->GetFile()->Read(buffer, (UINT)*bytes);
+ CFLACStream* pThis = static_cast<CFLACStream*>(client_data);
+ UINT nRead = pThis->GetFile()->Read(buffer, (UINT) * bytes);
- pThis->m_bIsEOF = (nRead != *bytes);
- *bytes = nRead;
+ pThis->m_bIsEOF = (nRead != *bytes);
+ *bytes = nRead;
- return (*bytes == 0) ? FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM : FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
+ return (*bytes == 0) ? FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM : FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
}
-FLAC__StreamDecoderSeekStatus StreamDecoderSeek(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data)
+FLAC__StreamDecoderSeekStatus StreamDecoderSeek(const FLAC__StreamDecoder* decoder, FLAC__uint64 absolute_byte_offset, void* client_data)
{
- CFLACStream* pThis = static_cast<CFLACStream*> (client_data);
+ CFLACStream* pThis = static_cast<CFLACStream*>(client_data);
- pThis->m_bIsEOF = false;
- pThis->GetFile()->Seek (absolute_byte_offset, CFile::begin);
- return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
+ pThis->m_bIsEOF = false;
+ pThis->GetFile()->Seek(absolute_byte_offset, CFile::begin);
+ return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
}
-FLAC__StreamDecoderTellStatus StreamDecoderTell(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
+FLAC__StreamDecoderTellStatus StreamDecoderTell(const FLAC__StreamDecoder* decoder, FLAC__uint64* absolute_byte_offset, void* client_data)
{
- CFLACStream* pThis = static_cast<CFLACStream*> (client_data);
- *absolute_byte_offset = pThis->GetFile()->GetPosition();
- return FLAC__STREAM_DECODER_TELL_STATUS_OK;
+ CFLACStream* pThis = static_cast<CFLACStream*>(client_data);
+ *absolute_byte_offset = pThis->GetFile()->GetPosition();
+ return FLAC__STREAM_DECODER_TELL_STATUS_OK;
}
-FLAC__StreamDecoderLengthStatus StreamDecoderLength(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data)
+FLAC__StreamDecoderLengthStatus StreamDecoderLength(const FLAC__StreamDecoder* decoder, FLAC__uint64* stream_length, void* client_data)
{
- CFLACStream* pThis = static_cast<CFLACStream*> (client_data);
- CFile* pFile = pThis->GetFile();
-
- if (pFile == NULL) {
- return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED;
- } else {
- *stream_length = pFile->GetLength();
- return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
- }
+ CFLACStream* pThis = static_cast<CFLACStream*>(client_data);
+ CFile* pFile = pThis->GetFile();
+
+ if (pFile == NULL) {
+ return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED;
+ } else {
+ *stream_length = pFile->GetLength();
+ return FLAC__STREAM_DECODER_LENGTH_STATUS_OK;
+ }
}
-FLAC__bool StreamDecoderEof(const FLAC__StreamDecoder *decoder, void *client_data)
+FLAC__bool StreamDecoderEof(const FLAC__StreamDecoder* decoder, void* client_data)
{
- CFLACStream* pThis = static_cast<CFLACStream*> (client_data);
+ CFLACStream* pThis = static_cast<CFLACStream*>(client_data);
- return pThis->m_bIsEOF;
+ return pThis->m_bIsEOF;
}
-FLAC__StreamDecoderWriteStatus StreamDecoderWrite(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
+FLAC__StreamDecoderWriteStatus StreamDecoderWrite(const FLAC__StreamDecoder* decoder, const FLAC__Frame* frame, const FLAC__int32* const buffer[], void* client_data)
{
- CFLACStream* pThis = static_cast<CFLACStream*> (client_data);
- UNREFERENCED_PARAMETER(pThis);
+ CFLACStream* pThis = static_cast<CFLACStream*>(client_data);
+ UNREFERENCED_PARAMETER(pThis);
- return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
+ return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
}
-void StreamDecoderError(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
+void StreamDecoderError(const FLAC__StreamDecoder* decoder, FLAC__StreamDecoderErrorStatus status, void* client_data)
{
}
-void StreamDecoderMetadata(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
+void StreamDecoderMetadata(const FLAC__StreamDecoder* decoder, const FLAC__StreamMetadata* metadata, void* client_data)
{
- CFLACStream* pThis = static_cast<CFLACStream*> (client_data);
+ CFLACStream* pThis = static_cast<CFLACStream*>(client_data);
- if (pThis) {
- pThis->UpdateFromMetadata ((void*)metadata);
- }
+ if (pThis) {
+ pThis->UpdateFromMetadata((void*)metadata);
+ }
}
diff --git a/src/filters/source/FLACSource/FLACSource.h b/src/filters/source/FLACSource/FLACSource.h
index 164ced2b9..f009b27b9 100644
--- a/src/filters/source/FLACSource/FLACSource.h
+++ b/src/filters/source/FLACSource/FLACSource.h
@@ -31,48 +31,48 @@
class CFLACStream;
class __declspec(uuid("1930D8FF-4739-4e42-9199-3B2EDEAA3BF2"))
- CFLACSource : public CBaseSource<CFLACStream>
+ CFLACSource : public CBaseSource<CFLACStream>
{
public:
- CFLACSource(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CFLACSource();
+ CFLACSource(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CFLACSource();
- // CBaseFilter
- STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
+ // CBaseFilter
+ STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
};
class CGolombBuffer;
class CFLACStream : public CBaseStream
{
- CFile m_file;
- void* m_pDecoder;
+ CFile m_file;
+ void* m_pDecoder;
- int m_nMaxFrameSize;
- int m_nSamplesPerSec;
- int m_nChannels;
- WORD m_wBitsPerSample;
- __int64 m_i64TotalNumSamples;
- int m_nAvgBytesPerSec;
+ int m_nMaxFrameSize;
+ int m_nSamplesPerSec;
+ int m_nChannels;
+ WORD m_wBitsPerSample;
+ __int64 m_i64TotalNumSamples;
+ int m_nAvgBytesPerSec;
- ULONGLONG m_llOffset; // Position of first frame in file
- ULONGLONG m_llFileSize; // Size of the file
+ ULONGLONG m_llOffset; // Position of first frame in file
+ ULONGLONG m_llFileSize; // Size of the file
public:
- CFLACStream(const WCHAR* wfn, CSource* pParent, HRESULT* phr);
- virtual ~CFLACStream();
+ CFLACStream(const WCHAR* wfn, CSource* pParent, HRESULT* phr);
+ virtual ~CFLACStream();
- HRESULT FillBuffer(IMediaSample* pSample, int nFrame, BYTE* pOut, long& len);
+ HRESULT FillBuffer(IMediaSample* pSample, int nFrame, BYTE* pOut, long& len);
- HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT CheckMediaType(const CMediaType* pMediaType);
- HRESULT GetMediaType(int iPosition, CMediaType* pmt);
+ HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT CheckMediaType(const CMediaType* pMediaType);
+ HRESULT GetMediaType(int iPosition, CMediaType* pmt);
- void UpdateFromMetadata (void* pBuffer);
- inline CFile* GetFile() {
- return &m_file;
- };
+ void UpdateFromMetadata(void* pBuffer);
+ inline CFile* GetFile() {
+ return &m_file;
+ };
- bool m_bIsEOF;
+ bool m_bIsEOF;
};
diff --git a/src/filters/source/FLICSource/FLICSource.cpp b/src/filters/source/FLICSource/FLICSource.cpp
index 733294321..6ad5407b3 100644
--- a/src/filters/source/FLICSource/FLICSource.cpp
+++ b/src/filters/source/FLICSource/FLICSource.cpp
@@ -28,55 +28,55 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Video, &MEDIASUBTYPE_RGB32},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_RGB32},
};
const AMOVIESETUP_PIN sudOpPin[] = {
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CFLICSource), FlicSourceName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CFLICSource), FlicSourceName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CFLICSource>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CFLICSource>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"),
- _T("0"), _T("4,2,,11AF"));
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"),
+ _T("0"), _T("4,2,,11AF"));
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"),
- _T("1"), _T("4,2,,12AF"));
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"),
+ _T("1"), _T("4,2,,12AF"));
- SetRegKeyValue(
- _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"),
- _T("Source Filter"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"));
+ SetRegKeyValue(
+ _T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"),
+ _T("Source Filter"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"));
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".fli"),
- _T("Source Filter"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"));
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".fli"),
+ _T("Source Filter"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"));
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".flc"),
- _T("Source Filter"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"));
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".flc"),
+ _T("Source Filter"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"));
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".fli"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".flc"));
+ DeleteRegKey(_T("Media Type\\{e436eb83-524f-11ce-9f53-0020af0ba770}"), _T("{17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4}"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".fli"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".flc"));
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -90,7 +90,7 @@ CFilterApp theApp;
//
CFLICSource::CFLICSource(LPUNKNOWN lpunk, HRESULT* phr)
- : CSource(NAME("CFLICSource"), lpunk, __uuidof(this))
+ : CSource(NAME("CFLICSource"), lpunk, __uuidof(this))
{
}
@@ -100,683 +100,683 @@ CFLICSource::~CFLICSource()
STDMETHODIMP CFLICSource::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(IFileSourceFilter)
- QI(IAMFilterMiscFlags)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IFileSourceFilter)
+ QI(IAMFilterMiscFlags)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
// IFileSourceFilter
STDMETHODIMP CFLICSource::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt)
{
- if (GetPinCount() > 0) {
- return VFW_E_ALREADY_CONNECTED;
- }
+ if (GetPinCount() > 0) {
+ return VFW_E_ALREADY_CONNECTED;
+ }
- HRESULT hr = S_OK;
- if (!(DNew CFLICStream(pszFileName, this, &hr))) {
- return E_OUTOFMEMORY;
- }
+ HRESULT hr = S_OK;
+ if (!(DNew CFLICStream(pszFileName, this, &hr))) {
+ return E_OUTOFMEMORY;
+ }
- if (FAILED(hr)) {
- return hr;
- }
+ if (FAILED(hr)) {
+ return hr;
+ }
- m_fn = pszFileName;
+ m_fn = pszFileName;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CFLICSource::GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt)
{
- if (!ppszFileName) {
- return E_POINTER;
- }
+ if (!ppszFileName) {
+ return E_POINTER;
+ }
- *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength()+1)*sizeof(WCHAR));
- if (!(*ppszFileName)) {
- return E_OUTOFMEMORY;
- }
+ *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength() + 1) * sizeof(WCHAR));
+ if (!(*ppszFileName)) {
+ return E_OUTOFMEMORY;
+ }
- wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
+ wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
- return S_OK;
+ return S_OK;
}
// IAMFilterMiscFlags
ULONG CFLICSource::GetMiscFlags()
{
- return AM_FILTER_MISC_FLAGS_IS_SOURCE;
+ return AM_FILTER_MISC_FLAGS_IS_SOURCE;
}
STDMETHODIMP CFLICSource::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
- wcscpy_s(pInfo->achName, FlicSourceName);
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+ wcscpy_s(pInfo->achName, FlicSourceName);
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
- return S_OK;
+ return S_OK;
}
// CFLICStream
CFLICStream::CFLICStream(const WCHAR* wfn, CFLICSource* pParent, HRESULT* phr)
- : CSourceStream(NAME("FLICStream"), phr, pParent, L"Output")
- , CSourceSeeking(NAME("FLICStream"), (IPin*)this, phr, &m_cSharedState)
- , m_bDiscontinuity(FALSE), m_bFlushing(FALSE)
-{
- CAutoLock cAutoLock(&m_cSharedState);
-
- CString fn(wfn);
-
- if (!m_flic.Open(fn, CFile::modeRead|CFile::shareDenyNone)) {
- if (phr) *phr = E_FAIL;
- return;
- }
-
- if (m_flic.Read(&m_hdr, sizeof(m_hdr)) != sizeof(m_hdr)
- || (m_hdr.type != 0xAF11 && m_hdr.type != 0xAF12)
- || m_hdr.depth != 8) {
- if (phr) *phr = E_FAIL;
- return;
- }
-
- if (m_hdr.speed == 0) {
- m_hdr.speed = (m_hdr.type == 0xAF11) ? 5 : 67;
- }
- m_AvgTimePerFrame = (m_hdr.type == 0xAF11)
- ? 10000000i64 * m_hdr.speed / 70
- : 10000000i64 * m_hdr.speed / 1000;
-
- // not tested (lack of test files)
- {
- __int64 pos = m_flic.GetPosition();
- FLIC_PREFIX fp;
- if (m_flic.Read(&fp, sizeof(fp)) != sizeof(fp) || fp.type != 0xF100) {
- m_flic.Seek(pos, CFile::begin);
- } else {
- m_flic.Seek(pos + fp.size, CFile::begin);
- }
- }
-
- FLIC_FRAME_ENTRY ffe;
- unsigned int nFrames = 0;
- m_frames.SetCount(m_hdr.frames);
- while (nFrames < m_hdr.frames && m_flic.Read(&ffe.hdr, sizeof(ffe.hdr)) == sizeof(ffe.hdr) && ffe.hdr.type == 0xF1FA) {
-
- ffe.pos = m_flic.GetPosition();
- ffe.fKeyframe = false;
-
- int chunk = 0;
- while (chunk < ffe.hdr.chunks) {
- FLIC_CHUNK fc;
- if (m_flic.Read(&fc, sizeof(fc)) != sizeof(fc)) {
- break;
- }
- ffe.fKeyframe = ffe.fKeyframe
- || fc.type == FLIC_BRUN
- || fc.type == FLIC_BLACK
- || fc.type == FLIC_COPY
- || fc.type == DTA_BRUN
- || fc.type == DTA_COPY
- || fc.type == KEY_IMAGE;
-
- ULONGLONG pos = m_flic.GetPosition() + fc.size - sizeof(fc);
- if (pos < m_flic.GetLength()) {
- m_flic.Seek(pos, CFile::begin);
- } else break;
-
- chunk++;
- }
- if (chunk < ffe.hdr.chunks) {
- break;
- }
-
- ULONGLONG pos = ffe.pos + ffe.hdr.size - sizeof(ffe.hdr);
- if (pos < m_flic.GetLength()) {
- m_flic.Seek(pos, CFile::begin);
- } else break;
-
- m_frames[nFrames] = ffe;
- nFrames++;
- }
- if (nFrames>0) {
- m_frames.SetCount(nFrames); // if the file is incomplete, then truncate the index
- m_frames[0].fKeyframe = true;
- } else {
- if (phr) *phr = E_FAIL;
- return;
- }
-
- m_nLastFrameNum = -1;
- memset(m_pPalette, 0, sizeof(m_pPalette));
- m_nBufferSize = m_hdr.width*m_hdr.height*32>>3;
- if (!m_pFrameBuffer.Allocate(m_nBufferSize)) {
- if (phr) *phr = E_OUTOFMEMORY;
- return;
- }
-
- m_rtDuration = m_rtStop = m_AvgTimePerFrame*nFrames;
-
- if (phr) {
- *phr = m_rtDuration > 0 ? S_OK : E_FAIL;
- }
+ : CSourceStream(NAME("FLICStream"), phr, pParent, L"Output")
+ , CSourceSeeking(NAME("FLICStream"), (IPin*)this, phr, &m_cSharedState)
+ , m_bDiscontinuity(FALSE), m_bFlushing(FALSE)
+{
+ CAutoLock cAutoLock(&m_cSharedState);
+
+ CString fn(wfn);
+
+ if (!m_flic.Open(fn, CFile::modeRead | CFile::shareDenyNone)) {
+ if (phr) { *phr = E_FAIL; }
+ return;
+ }
+
+ if (m_flic.Read(&m_hdr, sizeof(m_hdr)) != sizeof(m_hdr)
+ || (m_hdr.type != 0xAF11 && m_hdr.type != 0xAF12)
+ || m_hdr.depth != 8) {
+ if (phr) { *phr = E_FAIL; }
+ return;
+ }
+
+ if (m_hdr.speed == 0) {
+ m_hdr.speed = (m_hdr.type == 0xAF11) ? 5 : 67;
+ }
+ m_AvgTimePerFrame = (m_hdr.type == 0xAF11)
+ ? 10000000i64 * m_hdr.speed / 70
+ : 10000000i64 * m_hdr.speed / 1000;
+
+ // not tested (lack of test files)
+ {
+ __int64 pos = m_flic.GetPosition();
+ FLIC_PREFIX fp;
+ if (m_flic.Read(&fp, sizeof(fp)) != sizeof(fp) || fp.type != 0xF100) {
+ m_flic.Seek(pos, CFile::begin);
+ } else {
+ m_flic.Seek(pos + fp.size, CFile::begin);
+ }
+ }
+
+ FLIC_FRAME_ENTRY ffe;
+ unsigned int nFrames = 0;
+ m_frames.SetCount(m_hdr.frames);
+ while (nFrames < m_hdr.frames && m_flic.Read(&ffe.hdr, sizeof(ffe.hdr)) == sizeof(ffe.hdr) && ffe.hdr.type == 0xF1FA) {
+
+ ffe.pos = m_flic.GetPosition();
+ ffe.fKeyframe = false;
+
+ int chunk = 0;
+ while (chunk < ffe.hdr.chunks) {
+ FLIC_CHUNK fc;
+ if (m_flic.Read(&fc, sizeof(fc)) != sizeof(fc)) {
+ break;
+ }
+ ffe.fKeyframe = ffe.fKeyframe
+ || fc.type == FLIC_BRUN
+ || fc.type == FLIC_BLACK
+ || fc.type == FLIC_COPY
+ || fc.type == DTA_BRUN
+ || fc.type == DTA_COPY
+ || fc.type == KEY_IMAGE;
+
+ ULONGLONG pos = m_flic.GetPosition() + fc.size - sizeof(fc);
+ if (pos < m_flic.GetLength()) {
+ m_flic.Seek(pos, CFile::begin);
+ } else { break; }
+
+ chunk++;
+ }
+ if (chunk < ffe.hdr.chunks) {
+ break;
+ }
+
+ ULONGLONG pos = ffe.pos + ffe.hdr.size - sizeof(ffe.hdr);
+ if (pos < m_flic.GetLength()) {
+ m_flic.Seek(pos, CFile::begin);
+ } else { break; }
+
+ m_frames[nFrames] = ffe;
+ nFrames++;
+ }
+ if (nFrames > 0) {
+ m_frames.SetCount(nFrames); // if the file is incomplete, then truncate the index
+ m_frames[0].fKeyframe = true;
+ } else {
+ if (phr) { *phr = E_FAIL; }
+ return;
+ }
+
+ m_nLastFrameNum = -1;
+ memset(m_pPalette, 0, sizeof(m_pPalette));
+ m_nBufferSize = m_hdr.width * m_hdr.height * 32 >> 3;
+ if (!m_pFrameBuffer.Allocate(m_nBufferSize)) {
+ if (phr) { *phr = E_OUTOFMEMORY; }
+ return;
+ }
+
+ m_rtDuration = m_rtStop = m_AvgTimePerFrame * nFrames;
+
+ if (phr) {
+ *phr = m_rtDuration > 0 ? S_OK : E_FAIL;
+ }
}
CFLICStream::~CFLICStream()
{
- CAutoLock cAutoLock(&m_cSharedState);
+ CAutoLock cAutoLock(&m_cSharedState);
}
STDMETHODIMP CFLICStream::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return (riid == IID_IMediaSeeking) ? CSourceSeeking::NonDelegatingQueryInterface(riid, ppv) //GetInterface((IMediaSeeking*)this, ppv)
- : CSourceStream::NonDelegatingQueryInterface(riid, ppv);
+ return (riid == IID_IMediaSeeking) ? CSourceSeeking::NonDelegatingQueryInterface(riid, ppv) //GetInterface((IMediaSeeking*)this, ppv)
+ : CSourceStream::NonDelegatingQueryInterface(riid, ppv);
}
void CFLICStream::UpdateFromSeek()
{
- if (ThreadExists()) {
- // next time around the loop, the worker thread will
- // pick up the position change.
- // We need to flush all the existing data - we must do that here
- // as our thread will probably be blocked in GetBuffer otherwise
+ if (ThreadExists()) {
+ // next time around the loop, the worker thread will
+ // pick up the position change.
+ // We need to flush all the existing data - we must do that here
+ // as our thread will probably be blocked in GetBuffer otherwise
- m_bFlushing = TRUE;
+ m_bFlushing = TRUE;
- DeliverBeginFlush();
- // make sure we have stopped pushing
- Stop();
- // complete the flush
- DeliverEndFlush();
+ DeliverBeginFlush();
+ // make sure we have stopped pushing
+ Stop();
+ // complete the flush
+ DeliverEndFlush();
- m_bFlushing = FALSE;
+ m_bFlushing = FALSE;
- // restart
- Run();
- }
+ // restart
+ Run();
+ }
}
HRESULT CFLICStream::SetRate(double dRate)
{
- if (dRate <= 0) {
- return E_INVALIDARG;
- }
+ if (dRate <= 0) {
+ return E_INVALIDARG;
+ }
- {
- CAutoLock lock(CSourceSeeking::m_pLock);
- m_dRateSeeking = dRate;
- }
+ {
+ CAutoLock lock(CSourceSeeking::m_pLock);
+ m_dRateSeeking = dRate;
+ }
- UpdateFromSeek();
+ UpdateFromSeek();
- return S_OK;
+ return S_OK;
}
HRESULT CFLICStream::OnThreadStartPlay()
{
- m_bDiscontinuity = TRUE;
- return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
+ m_bDiscontinuity = TRUE;
+ return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
}
HRESULT CFLICStream::ChangeStart()
{
- {
- CAutoLock lock(CSourceSeeking::m_pLock);
- m_rtSampleTime = 0;
- m_rtPosition = m_rtStart;
- }
+ {
+ CAutoLock lock(CSourceSeeking::m_pLock);
+ m_rtSampleTime = 0;
+ m_rtPosition = m_rtStart;
+ }
- UpdateFromSeek();
+ UpdateFromSeek();
- return S_OK;
+ return S_OK;
}
HRESULT CFLICStream::ChangeStop()
{
- {
- CAutoLock lock(CSourceSeeking::m_pLock);
- if (m_rtPosition < m_rtStop) {
- return S_OK;
- }
- }
+ {
+ CAutoLock lock(CSourceSeeking::m_pLock);
+ if (m_rtPosition < m_rtStop) {
+ return S_OK;
+ }
+ }
- // We're already past the new stop time -- better flush the graph.
- UpdateFromSeek();
+ // We're already past the new stop time -- better flush the graph.
+ UpdateFromSeek();
- return S_OK;
+ return S_OK;
}
HRESULT CFLICStream::OnThreadCreate()
{
- CAutoLock cAutoLockShared(&m_cSharedState);
- m_rtSampleTime = 0;
- m_rtPosition = m_rtStart;
+ CAutoLock cAutoLockShared(&m_cSharedState);
+ m_rtSampleTime = 0;
+ m_rtPosition = m_rtStart;
- return CSourceStream::OnThreadCreate();
+ return CSourceStream::OnThreadCreate();
}
HRESULT CFLICStream::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties)
{
- // CAutoLock cAutoLock(m_pFilter->pStateLock());
+ // CAutoLock cAutoLock(m_pFilter->pStateLock());
- ASSERT(pAlloc);
- ASSERT(pProperties);
+ ASSERT(pAlloc);
+ ASSERT(pProperties);
- HRESULT hr = NOERROR;
+ HRESULT hr = NOERROR;
- pProperties->cBuffers = 1;
- pProperties->cbBuffer = m_nBufferSize;
+ pProperties->cBuffers = 1;
+ pProperties->cbBuffer = m_nBufferSize;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- if (Actual.cbBuffer < pProperties->cbBuffer) {
- return E_FAIL;
- }
- ASSERT(Actual.cBuffers == pProperties->cBuffers);
+ if (Actual.cbBuffer < pProperties->cbBuffer) {
+ return E_FAIL;
+ }
+ ASSERT(Actual.cBuffers == pProperties->cBuffers);
- return NOERROR;
+ return NOERROR;
}
HRESULT CFLICStream::FillBuffer(IMediaSample* pSample)
{
- HRESULT hr;
+ HRESULT hr;
- {
- CAutoLock cAutoLockShared(&m_cSharedState);
+ {
+ CAutoLock cAutoLockShared(&m_cSharedState);
- if (m_rtPosition >= m_rtStop) {
- return S_FALSE;
- }
+ if (m_rtPosition >= m_rtStop) {
+ return S_FALSE;
+ }
- BYTE* pDataIn = m_pFrameBuffer;
- BYTE* pDataOut = NULL;
- if (!pDataIn || FAILED(hr = pSample->GetPointer(&pDataOut)) || !pDataOut) {
- return S_FALSE;
- }
+ BYTE* pDataIn = m_pFrameBuffer;
+ BYTE* pDataOut = NULL;
+ if (!pDataIn || FAILED(hr = pSample->GetPointer(&pDataOut)) || !pDataOut) {
+ return S_FALSE;
+ }
- AM_MEDIA_TYPE* pmt;
- if (SUCCEEDED(pSample->GetMediaType(&pmt)) && pmt) {
- CMediaType mt(*pmt);
- SetMediaType(&mt);
+ AM_MEDIA_TYPE* pmt;
+ if (SUCCEEDED(pSample->GetMediaType(&pmt)) && pmt) {
+ CMediaType mt(*pmt);
+ SetMediaType(&mt);
- DeleteMediaType(pmt);
- }
+ DeleteMediaType(pmt);
+ }
- int w, h, bpp;
- if (m_mt.formattype == FORMAT_VideoInfo) {
- w = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biWidth;
- h = abs(((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biHeight);
- bpp = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biBitCount;
- } else if (m_mt.formattype == FORMAT_VideoInfo2) {
- w = ((VIDEOINFOHEADER2*)m_mt.pbFormat)->bmiHeader.biWidth;
- h = abs(((VIDEOINFOHEADER2*)m_mt.pbFormat)->bmiHeader.biHeight);
- bpp = ((VIDEOINFOHEADER2*)m_mt.pbFormat)->bmiHeader.biBitCount;
- } else {
- return S_FALSE;
- }
+ int w, h, bpp;
+ if (m_mt.formattype == FORMAT_VideoInfo) {
+ w = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biWidth;
+ h = abs(((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biHeight);
+ bpp = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biBitCount;
+ } else if (m_mt.formattype == FORMAT_VideoInfo2) {
+ w = ((VIDEOINFOHEADER2*)m_mt.pbFormat)->bmiHeader.biWidth;
+ h = abs(((VIDEOINFOHEADER2*)m_mt.pbFormat)->bmiHeader.biHeight);
+ bpp = ((VIDEOINFOHEADER2*)m_mt.pbFormat)->bmiHeader.biBitCount;
+ } else {
+ return S_FALSE;
+ }
- int pitchIn = m_hdr.width;
- int pitchOut = w*bpp>>3;
+ int pitchIn = m_hdr.width;
+ int pitchOut = w * bpp >> 3;
- int nFrame = (int)(m_rtPosition / m_AvgTimePerFrame);
+ int nFrame = (int)(m_rtPosition / m_AvgTimePerFrame);
- {
- SeekToNearestKeyFrame(nFrame);
+ {
+ SeekToNearestKeyFrame(nFrame);
- while (m_nLastFrameNum < nFrame && !m_bFlushing) {
- ExtractFrame(++m_nLastFrameNum);
- }
+ while (m_nLastFrameNum < nFrame && !m_bFlushing) {
+ ExtractFrame(++m_nLastFrameNum);
+ }
- for (int y = 0, p = min(pitchIn, pitchOut);
- y < h;
- y++, pDataIn += pitchIn, pDataOut += pitchOut) {
- BYTE* src = pDataIn;
- BYTE* end = src + p;
- DWORD* dst = (DWORD*)pDataOut;
- while (src < end) {
- *dst++ = m_pPalette[*src++];
- }
- }
- }
+ for (int y = 0, p = min(pitchIn, pitchOut);
+ y < h;
+ y++, pDataIn += pitchIn, pDataOut += pitchOut) {
+ BYTE* src = pDataIn;
+ BYTE* end = src + p;
+ DWORD* dst = (DWORD*)pDataOut;
+ while (src < end) {
+ *dst++ = m_pPalette[*src++];
+ }
+ }
+ }
- pSample->SetActualDataLength(pitchOut*h);
+ pSample->SetActualDataLength(pitchOut * h);
- REFERENCE_TIME rtStart, rtStop;
- // The sample times are modified by the current rate.
- rtStart = static_cast<REFERENCE_TIME>(m_rtSampleTime / m_dRateSeeking);
- rtStop = rtStart + static_cast<int>(m_AvgTimePerFrame / m_dRateSeeking);
- pSample->SetTime(&rtStart, &rtStop);
+ REFERENCE_TIME rtStart, rtStop;
+ // The sample times are modified by the current rate.
+ rtStart = static_cast<REFERENCE_TIME>(m_rtSampleTime / m_dRateSeeking);
+ rtStop = rtStart + static_cast<int>(m_AvgTimePerFrame / m_dRateSeeking);
+ pSample->SetTime(&rtStart, &rtStop);
- m_rtSampleTime += m_AvgTimePerFrame;
- m_rtPosition += m_AvgTimePerFrame;
- }
+ m_rtSampleTime += m_AvgTimePerFrame;
+ m_rtPosition += m_AvgTimePerFrame;
+ }
- pSample->SetSyncPoint(TRUE);
+ pSample->SetSyncPoint(TRUE);
- if (m_bDiscontinuity) {
- pSample->SetDiscontinuity(TRUE);
- m_bDiscontinuity = FALSE;
- }
+ if (m_bDiscontinuity) {
+ pSample->SetDiscontinuity(TRUE);
+ m_bDiscontinuity = FALSE;
+ }
- return S_OK;
+ return S_OK;
}
HRESULT CFLICStream::GetMediaType(int iPosition, CMediaType* pmt)
{
- CAutoLock cAutoLock(m_pFilter->pStateLock());
+ CAutoLock cAutoLock(m_pFilter->pStateLock());
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > 0) {
- return VFW_S_NO_MORE_ITEMS;
- }
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > 0) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
- pmt->SetType(&MEDIATYPE_Video);
- pmt->SetSubtype(&MEDIASUBTYPE_RGB32);
- pmt->SetFormatType(&FORMAT_VideoInfo);
- pmt->SetTemporalCompression(TRUE);
+ pmt->SetType(&MEDIATYPE_Video);
+ pmt->SetSubtype(&MEDIASUBTYPE_RGB32);
+ pmt->SetFormatType(&FORMAT_VideoInfo);
+ pmt->SetTemporalCompression(TRUE);
- VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
- memset(vih, 0, sizeof(VIDEOINFOHEADER));
- vih->AvgTimePerFrame = m_AvgTimePerFrame;
- vih->bmiHeader.biSize = sizeof(vih->bmiHeader);
- vih->bmiHeader.biWidth = m_hdr.width;
- vih->bmiHeader.biHeight = -m_hdr.height;
- vih->bmiHeader.biPlanes = 1;
- vih->bmiHeader.biBitCount = 32;
- vih->bmiHeader.biCompression = BI_RGB;
- vih->bmiHeader.biSizeImage = m_nBufferSize;
+ VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
+ memset(vih, 0, sizeof(VIDEOINFOHEADER));
+ vih->AvgTimePerFrame = m_AvgTimePerFrame;
+ vih->bmiHeader.biSize = sizeof(vih->bmiHeader);
+ vih->bmiHeader.biWidth = m_hdr.width;
+ vih->bmiHeader.biHeight = -m_hdr.height;
+ vih->bmiHeader.biPlanes = 1;
+ vih->bmiHeader.biBitCount = 32;
+ vih->bmiHeader.biCompression = BI_RGB;
+ vih->bmiHeader.biSizeImage = m_nBufferSize;
- pmt->SetSampleSize(vih->bmiHeader.biSizeImage);
+ pmt->SetSampleSize(vih->bmiHeader.biSizeImage);
- return NOERROR;
+ return NOERROR;
}
HRESULT CFLICStream::CheckConnect(IPin* pPin)
{
- return CSourceStream::CheckConnect(pPin);
+ return CSourceStream::CheckConnect(pPin);
}
HRESULT CFLICStream::CheckMediaType(const CMediaType* pmt)
{
- if (pmt->majortype == MEDIATYPE_Video
- && pmt->subtype == MEDIASUBTYPE_RGB32
- && pmt->formattype == FORMAT_VideoInfo) {
- return S_OK;
- }
+ if (pmt->majortype == MEDIATYPE_Video
+ && pmt->subtype == MEDIASUBTYPE_RGB32
+ && pmt->formattype == FORMAT_VideoInfo) {
+ return S_OK;
+ }
- return E_INVALIDARG;
+ return E_INVALIDARG;
}
STDMETHODIMP CFLICStream::Notify(IBaseFilter* pSender, Quality q)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
////////
void CFLICStream::SeekToNearestKeyFrame(int nFrame)
{
- if (m_nLastFrameNum == nFrame) {
- return;
- }
+ if (m_nLastFrameNum == nFrame) {
+ return;
+ }
- if (m_nLastFrameNum > nFrame) {
- m_nLastFrameNum = -1;
- }
+ if (m_nLastFrameNum > nFrame) {
+ m_nLastFrameNum = -1;
+ }
- for (int i = m_nLastFrameNum+1, j = min((int)m_frames.GetCount(), nFrame); i < j; i++) {
- FLIC_FRAME_ENTRY& ffe = m_frames[i];
- if (ffe.fKeyframe) {
- m_nLastFrameNum = i-1;
- }
- }
+ for (int i = m_nLastFrameNum + 1, j = min((int)m_frames.GetCount(), nFrame); i < j; i++) {
+ FLIC_FRAME_ENTRY& ffe = m_frames[i];
+ if (ffe.fKeyframe) {
+ m_nLastFrameNum = i - 1;
+ }
+ }
}
void CFLICStream::ExtractFrame(int nFrame)
{
- FLIC_FRAME_ENTRY& ffe = m_frames[nFrame];
-
- bool fNewPalette = false;
- bool fNewFrame = false;
-
- m_flic.Seek(ffe.pos, CFile::begin);
-
- int chunk = 0;
- while (chunk < ffe.hdr.chunks) {
- FLIC_CHUNK fc;
- if (m_flic.Read(&fc, sizeof(fc)) != sizeof(fc)) {
- break;
- }
-
- ULONGLONG next = m_flic.GetPosition() + fc.size - sizeof(fc);
- if (next >= m_flic.GetLength()) {
- break;
- }
-
- switch (fc.type) {
- case FLIC_64_COLOR:
- fNewPalette = _colorchunk(true);
- break;
- case FLIC_256_COLOR:
- fNewPalette = _colorchunk(false);
- break;
- case FLIC_BRUN:
- _brunchunk();
- fNewFrame = true;
- break;
- case FLIC_LC:
- _lcchunk();
- break;
- case FLIC_DELTA:
- _deltachunk();
- break;
- case FLIC_BLACK:
- _blackchunk();
- fNewFrame = true;
- break;
- case FLIC_COPY:
- _copychunk();
- fNewFrame = true;
- break;
- case FLIC_MINI:
- break;
- default:
- break;
- }
-
- m_flic.Seek(next, CFile::begin);
-
- chunk++;
- }
-
- if (chunk < ffe.hdr.chunks) {
- ASSERT(0);
- }
-
- ffe.fKeyframe = (fNewPalette && fNewFrame);
+ FLIC_FRAME_ENTRY& ffe = m_frames[nFrame];
+
+ bool fNewPalette = false;
+ bool fNewFrame = false;
+
+ m_flic.Seek(ffe.pos, CFile::begin);
+
+ int chunk = 0;
+ while (chunk < ffe.hdr.chunks) {
+ FLIC_CHUNK fc;
+ if (m_flic.Read(&fc, sizeof(fc)) != sizeof(fc)) {
+ break;
+ }
+
+ ULONGLONG next = m_flic.GetPosition() + fc.size - sizeof(fc);
+ if (next >= m_flic.GetLength()) {
+ break;
+ }
+
+ switch (fc.type) {
+ case FLIC_64_COLOR:
+ fNewPalette = _colorchunk(true);
+ break;
+ case FLIC_256_COLOR:
+ fNewPalette = _colorchunk(false);
+ break;
+ case FLIC_BRUN:
+ _brunchunk();
+ fNewFrame = true;
+ break;
+ case FLIC_LC:
+ _lcchunk();
+ break;
+ case FLIC_DELTA:
+ _deltachunk();
+ break;
+ case FLIC_BLACK:
+ _blackchunk();
+ fNewFrame = true;
+ break;
+ case FLIC_COPY:
+ _copychunk();
+ fNewFrame = true;
+ break;
+ case FLIC_MINI:
+ break;
+ default:
+ break;
+ }
+
+ m_flic.Seek(next, CFile::begin);
+
+ chunk++;
+ }
+
+ if (chunk < ffe.hdr.chunks) {
+ ASSERT(0);
+ }
+
+ ffe.fKeyframe = (fNewPalette && fNewFrame);
}
void CFLICStream::_blackchunk()
{
- memset(m_pFrameBuffer, 0, m_nBufferSize);
+ memset(m_pFrameBuffer, 0, m_nBufferSize);
}
void CFLICStream::_copychunk()
{
- m_flic.Read(m_pFrameBuffer, m_nBufferSize);
+ m_flic.Read(m_pFrameBuffer, m_nBufferSize);
}
bool CFLICStream::_colorchunk(bool f64)
{
- int nColorsUpdated = 0;
+ int nColorsUpdated = 0;
- BYTE skip = 0;
+ BYTE skip = 0;
- WORD packets;
- m_flic.Read(&packets, sizeof(packets));
+ WORD packets;
+ m_flic.Read(&packets, sizeof(packets));
- while (packets--) {
- BYTE skip2;
- m_flic.Read(&skip2, sizeof(skip2));
- skip += skip2;
+ while (packets--) {
+ BYTE skip2;
+ m_flic.Read(&skip2, sizeof(skip2));
+ skip += skip2;
- BYTE count;
- m_flic.Read(&count, sizeof(count));
+ BYTE count;
+ m_flic.Read(&count, sizeof(count));
- int len = (count == 0 ? (256-skip) : count);
- while (len-- > 0) {
- BYTE r, g, b;
- m_flic.Read(&r, sizeof(r));
- m_flic.Read(&g, sizeof(g));
- m_flic.Read(&b, sizeof(b));
- m_pPalette[skip++] = f64
- ? ((r << 18)&0xff0000) | ((g << 10)&0xff00) | ((b << 2)&0xff)
- : ((r << 16)&0xff0000) | ((g << 8)&0xff00) | ((b << 0)&0xff);
- nColorsUpdated++;
- }
- }
+ int len = (count == 0 ? (256 - skip) : count);
+ while (len-- > 0) {
+ BYTE r, g, b;
+ m_flic.Read(&r, sizeof(r));
+ m_flic.Read(&g, sizeof(g));
+ m_flic.Read(&b, sizeof(b));
+ m_pPalette[skip++] = f64
+ ? ((r << 18) & 0xff0000) | ((g << 10) & 0xff00) | ((b << 2) & 0xff)
+ : ((r << 16) & 0xff0000) | ((g << 8) & 0xff00) | ((b << 0) & 0xff);
+ nColorsUpdated++;
+ }
+ }
- return (nColorsUpdated == 256);
+ return (nColorsUpdated == 256);
}
void CFLICStream::_brunchunk()
{
- BYTE* tmp = m_pFrameBuffer;
+ BYTE* tmp = m_pFrameBuffer;
- int lines = m_hdr.height;
- while (lines--) {
- BYTE packets;
- m_flic.Read(&packets, sizeof(packets));
+ int lines = m_hdr.height;
+ while (lines--) {
+ BYTE packets;
+ m_flic.Read(&packets, sizeof(packets));
- BYTE* ptr = tmp;
+ BYTE* ptr = tmp;
- while (ptr < tmp + m_hdr.width) {
- signed char count;
- m_flic.Read(&count, sizeof(count));
+ while (ptr < tmp + m_hdr.width) {
+ signed char count;
+ m_flic.Read(&count, sizeof(count));
- if (count >= 0) {
- BYTE c;
- m_flic.Read(&c, sizeof(c));
- memset(ptr, c, count);
- ptr += count;
- } else {
- m_flic.Read(ptr, -count);
- ptr += -count;
- }
- }
+ if (count >= 0) {
+ BYTE c;
+ m_flic.Read(&c, sizeof(c));
+ memset(ptr, c, count);
+ ptr += count;
+ } else {
+ m_flic.Read(ptr, -count);
+ ptr += -count;
+ }
+ }
- tmp += m_hdr.width;
- }
+ tmp += m_hdr.width;
+ }
}
void CFLICStream::_lcchunk()
{
- WORD y;
- m_flic.Read(&y, sizeof(y));
+ WORD y;
+ m_flic.Read(&y, sizeof(y));
- BYTE* tmp = &m_pFrameBuffer[y*m_hdr.width];
+ BYTE* tmp = &m_pFrameBuffer[y * m_hdr.width];
- WORD lines;
- m_flic.Read(&lines, sizeof(lines));
+ WORD lines;
+ m_flic.Read(&lines, sizeof(lines));
- while (lines--) {
- BYTE* ptr = tmp;
+ while (lines--) {
+ BYTE* ptr = tmp;
- BYTE packets;
- m_flic.Read(&packets, sizeof(packets));
+ BYTE packets;
+ m_flic.Read(&packets, sizeof(packets));
- while (packets--) {
- BYTE skip;
- m_flic.Read(&skip, sizeof(skip));
+ while (packets--) {
+ BYTE skip;
+ m_flic.Read(&skip, sizeof(skip));
- ptr += skip;
+ ptr += skip;
- signed char count;
- m_flic.Read(&count, sizeof(count));
+ signed char count;
+ m_flic.Read(&count, sizeof(count));
- if (count >= 0) {
- m_flic.Read(ptr, count);
- ptr += count;
- } else {
- BYTE c;
- m_flic.Read(&c, sizeof(c));
- memset(ptr, c, -count);
- ptr += -count;
- }
- }
+ if (count >= 0) {
+ m_flic.Read(ptr, count);
+ ptr += count;
+ } else {
+ BYTE c;
+ m_flic.Read(&c, sizeof(c));
+ memset(ptr, c, -count);
+ ptr += -count;
+ }
+ }
- tmp += m_hdr.width;
- }
+ tmp += m_hdr.width;
+ }
}
void CFLICStream::_deltachunk()
{
- BYTE* tmp = m_pFrameBuffer;
-
- WORD lines;
- m_flic.Read(&lines, sizeof(lines));
-
- while (lines--) {
- signed short packets;
- m_flic.Read(&packets, sizeof(packets));
-
- if (packets < 0) {
- if (packets&0x4000) {
- tmp += -packets * m_hdr.width;
- lines++;
- } else {
- signed char count;
- m_flic.Read(&count, sizeof(count));
- tmp[m_hdr.width-1] = (BYTE)packets;
- }
- } else {
- BYTE* ptr = tmp;
-
- while (packets--) {
- BYTE skip;
- m_flic.Read(&skip, sizeof(skip));
-
- ptr += skip;
-
- signed char count;
- m_flic.Read(&count, sizeof(count));
-
- if (count >= 0) {
- // Fix vulnerability : http://www.team509.com/modules.php?name=News&file=article&sid=38
- if ((count << 1) + (long)(ptr - m_pFrameBuffer) < m_nBufferSize) {
- m_flic.Read(ptr, count << 1);
- } else {
- ASSERT(FALSE);
- }
- ptr += count << 1;
- } else {
- WORD c;
- m_flic.Read(&c, sizeof(c));
- count = -count;
- while (count-- > 0) {
- *ptr++ = c>>8;
- *ptr++ = c&0xff;
- }
- }
- }
-
- tmp += m_hdr.width;
- }
- }
+ BYTE* tmp = m_pFrameBuffer;
+
+ WORD lines;
+ m_flic.Read(&lines, sizeof(lines));
+
+ while (lines--) {
+ signed short packets;
+ m_flic.Read(&packets, sizeof(packets));
+
+ if (packets < 0) {
+ if (packets & 0x4000) {
+ tmp += -packets * m_hdr.width;
+ lines++;
+ } else {
+ signed char count;
+ m_flic.Read(&count, sizeof(count));
+ tmp[m_hdr.width - 1] = (BYTE)packets;
+ }
+ } else {
+ BYTE* ptr = tmp;
+
+ while (packets--) {
+ BYTE skip;
+ m_flic.Read(&skip, sizeof(skip));
+
+ ptr += skip;
+
+ signed char count;
+ m_flic.Read(&count, sizeof(count));
+
+ if (count >= 0) {
+ // Fix vulnerability : http://www.team509.com/modules.php?name=News&file=article&sid=38
+ if ((count << 1) + (long)(ptr - m_pFrameBuffer) < m_nBufferSize) {
+ m_flic.Read(ptr, count << 1);
+ } else {
+ ASSERT(FALSE);
+ }
+ ptr += count << 1;
+ } else {
+ WORD c;
+ m_flic.Read(&c, sizeof(c));
+ count = -count;
+ while (count-- > 0) {
+ *ptr++ = c >> 8;
+ *ptr++ = c & 0xff;
+ }
+ }
+ }
+
+ tmp += m_hdr.width;
+ }
+ }
}
diff --git a/src/filters/source/FLICSource/FLICSource.h b/src/filters/source/FLICSource/FLICSource.h
index bd33f4b61..481d7db13 100644
--- a/src/filters/source/FLICSource/FLICSource.h
+++ b/src/filters/source/FLICSource/FLICSource.h
@@ -29,156 +29,156 @@
#pragma pack(push, 1)
enum {
- FLIC_256_COLOR = 4,
- FLIC_DELTA = 7,
- FLIC_64_COLOR = 11,
- FLIC_LC = 12,
- FLIC_BLACK = 13,
- FLIC_BRUN = 15,
- FLIC_COPY = 16,
- FLIC_MINI = 18,
- DTA_BRUN = 25,
- DTA_COPY = 26,
- KEY_IMAGE = 35,
+ FLIC_256_COLOR = 4,
+ FLIC_DELTA = 7,
+ FLIC_64_COLOR = 11,
+ FLIC_LC = 12,
+ FLIC_BLACK = 13,
+ FLIC_BRUN = 15,
+ FLIC_COPY = 16,
+ FLIC_MINI = 18,
+ DTA_BRUN = 25,
+ DTA_COPY = 26,
+ KEY_IMAGE = 35,
};
// http://www.compuphase.com/flic.htm
struct FLIC {
- DWORD size; // Size of FLIC including this header
- WORD type; // File type 0xAF11, 0xAF12, 0xAF30, 0xAF44, ...
- WORD frames; // Number of frames in first segment
- WORD width; // FLIC width in pixels
- WORD height; // FLIC height in pixels
- WORD depth; // Bits per pixel (usually 8)
- WORD flags; // Set to zero or to three
- DWORD speed; // Delay between frames
- WORD reserved1; // Set to zero
- DWORD created; // Date of FLIC creation (FLC only)
- DWORD creator; // Serial number or compiler id (FLC only)
- DWORD updated; // Date of FLIC update (FLC only)
- DWORD updater; // Serial number (FLC only), see creator
- WORD aspect_dx; // Width of square rectangle (FLC only)
- WORD aspect_dy; // Height of square rectangle (FLC only)
- WORD ext_flags; // EGI: flags for specific EGI extensions
- WORD keyframes; // EGI: key-image frequency
- WORD totalframes; // EGI: total number of frames (segments)
- DWORD req_memory; // EGI: maximum chunk size (uncompressed)
- WORD max_regions; // EGI: max. number of regions in a CHK_REGION chunk
- WORD transp_num; // EGI: number of transparent levels
- BYTE reserved2[24]; // Set to zero
- DWORD oframe1; // Offset to frame 1 (FLC only)
- DWORD oframe2; // Offset to frame 2 (FLC only)
- BYTE reserved3[40]; // Set to zero
+ DWORD size; // Size of FLIC including this header
+ WORD type; // File type 0xAF11, 0xAF12, 0xAF30, 0xAF44, ...
+ WORD frames; // Number of frames in first segment
+ WORD width; // FLIC width in pixels
+ WORD height; // FLIC height in pixels
+ WORD depth; // Bits per pixel (usually 8)
+ WORD flags; // Set to zero or to three
+ DWORD speed; // Delay between frames
+ WORD reserved1; // Set to zero
+ DWORD created; // Date of FLIC creation (FLC only)
+ DWORD creator; // Serial number or compiler id (FLC only)
+ DWORD updated; // Date of FLIC update (FLC only)
+ DWORD updater; // Serial number (FLC only), see creator
+ WORD aspect_dx; // Width of square rectangle (FLC only)
+ WORD aspect_dy; // Height of square rectangle (FLC only)
+ WORD ext_flags; // EGI: flags for specific EGI extensions
+ WORD keyframes; // EGI: key-image frequency
+ WORD totalframes; // EGI: total number of frames (segments)
+ DWORD req_memory; // EGI: maximum chunk size (uncompressed)
+ WORD max_regions; // EGI: max. number of regions in a CHK_REGION chunk
+ WORD transp_num; // EGI: number of transparent levels
+ BYTE reserved2[24]; // Set to zero
+ DWORD oframe1; // Offset to frame 1 (FLC only)
+ DWORD oframe2; // Offset to frame 2 (FLC only)
+ BYTE reserved3[40]; // Set to zero
};
struct FLIC_PREFIX {
- DWORD size; // Size of the chunk, including subchunks
- WORD type; // Chunk type: 0xF100
- WORD chunks; // Number of subchunks
- BYTE reserved[8]; // Reserved, set to 0
+ DWORD size; // Size of the chunk, including subchunks
+ WORD type; // Chunk type: 0xF100
+ WORD chunks; // Number of subchunks
+ BYTE reserved[8]; // Reserved, set to 0
};
struct FLIC_FRAME {
- DWORD size; // Size of the chunk, including subchunks
- WORD type; // Chunk type: 0xF1FA
- WORD chunks; // Number of subchunks
- WORD delay; // Delay in milliseconds
- SHORT reserved; // Always zero
- USHORT width; // Frame width override (if non-zero)
- USHORT height; // Frame height override (if non-zero)
+ DWORD size; // Size of the chunk, including subchunks
+ WORD type; // Chunk type: 0xF1FA
+ WORD chunks; // Number of subchunks
+ WORD delay; // Delay in milliseconds
+ SHORT reserved; // Always zero
+ USHORT width; // Frame width override (if non-zero)
+ USHORT height; // Frame height override (if non-zero)
};
struct FLIC_CHUNK {
- DWORD size; // Bytes in this chunk.
- WORD type; // Type of chunk
+ DWORD size; // Bytes in this chunk.
+ WORD type; // Type of chunk
};
#pragma pack(pop)
struct FLIC_FRAME_ENTRY {
- __int64 pos;
- bool fKeyframe;
- FLIC_FRAME hdr;
+ __int64 pos;
+ bool fKeyframe;
+ FLIC_FRAME hdr;
};
class __declspec(uuid("17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4"))
- CFLICSource
- : public CSource
- , public IFileSourceFilter
- , public IAMFilterMiscFlags
+ CFLICSource
+ : public CSource
+ , public IFileSourceFilter
+ , public IAMFilterMiscFlags
{
- CStringW m_fn;
+ CStringW m_fn;
public:
- CFLICSource(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CFLICSource();
+ CFLICSource(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CFLICSource();
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // IFileSourceFilter
- STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
- STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
+ // IFileSourceFilter
+ STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
- // IAMFilterMiscFlags
- STDMETHODIMP_(ULONG) GetMiscFlags();
+ // IAMFilterMiscFlags
+ STDMETHODIMP_(ULONG) GetMiscFlags();
- // CBaseFilter
- STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
+ // CBaseFilter
+ STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
};
class CFLICStream
- : public CSourceStream
- , public CSourceSeeking
+ : public CSourceStream
+ , public CSourceSeeking
{
- CFile m_flic;
- FLIC m_hdr;
- CAtlArray<FLIC_FRAME_ENTRY> m_frames;
+ CFile m_flic;
+ FLIC m_hdr;
+ CAtlArray<FLIC_FRAME_ENTRY> m_frames;
- CCritSec m_cSharedState;
+ CCritSec m_cSharedState;
- REFERENCE_TIME m_AvgTimePerFrame;
- REFERENCE_TIME m_rtSampleTime, m_rtPosition;
+ REFERENCE_TIME m_AvgTimePerFrame;
+ REFERENCE_TIME m_rtSampleTime, m_rtPosition;
- BOOL m_bDiscontinuity, m_bFlushing;
+ BOOL m_bDiscontinuity, m_bFlushing;
- HRESULT OnThreadStartPlay();
- HRESULT OnThreadCreate();
+ HRESULT OnThreadStartPlay();
+ HRESULT OnThreadCreate();
- void UpdateFromSeek();
- STDMETHODIMP SetRate(double dRate);
+ void UpdateFromSeek();
+ STDMETHODIMP SetRate(double dRate);
- HRESULT ChangeStart();
- HRESULT ChangeStop();
- HRESULT ChangeRate() {
- return S_OK;
- }
+ HRESULT ChangeStart();
+ HRESULT ChangeStop();
+ HRESULT ChangeRate() {
+ return S_OK;
+ }
private:
- int m_nLastFrameNum;
- DWORD m_pPalette[256];
- CAutoVectorPtr<BYTE> m_pFrameBuffer;
- int m_nBufferSize;
-
- void SeekToNearestKeyFrame(int nFrame);
- void ExtractFrame(int nFrame);
- void _blackchunk();
- void _copychunk();
- bool _colorchunk(bool f64);
- void _brunchunk();
- void _lcchunk();
- void _deltachunk();
+ int m_nLastFrameNum;
+ DWORD m_pPalette[256];
+ CAutoVectorPtr<BYTE> m_pFrameBuffer;
+ int m_nBufferSize;
+
+ void SeekToNearestKeyFrame(int nFrame);
+ void ExtractFrame(int nFrame);
+ void _blackchunk();
+ void _copychunk();
+ bool _colorchunk(bool f64);
+ void _brunchunk();
+ void _lcchunk();
+ void _deltachunk();
public:
- CFLICStream(const WCHAR* wfn, CFLICSource* pParent, HRESULT* phr);
- virtual ~CFLICStream();
+ CFLICStream(const WCHAR* wfn, CFLICSource* pParent, HRESULT* phr);
+ virtual ~CFLICStream();
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT FillBuffer(IMediaSample* pSample);
- HRESULT CheckConnect(IPin* pPin);
- HRESULT CheckMediaType(const CMediaType* pMediaType);
- HRESULT GetMediaType(int iPosition, CMediaType* pmt);
+ HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT FillBuffer(IMediaSample* pSample);
+ HRESULT CheckConnect(IPin* pPin);
+ HRESULT CheckMediaType(const CMediaType* pMediaType);
+ HRESULT GetMediaType(int iPosition, CMediaType* pmt);
- STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
+ STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
};
diff --git a/src/filters/source/ShoutcastSource/ShoutcastSource.cpp b/src/filters/source/ShoutcastSource/ShoutcastSource.cpp
index 4083d06f5..b7d9c6d80 100644
--- a/src/filters/source/ShoutcastSource/ShoutcastSource.cpp
+++ b/src/filters/source/ShoutcastSource/ShoutcastSource.cpp
@@ -36,77 +36,77 @@
#define MAXBUFFERLENGTH 100000000i64
static const DWORD s_bitrate[2][16] = {
- {1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0},
- {1,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}
+ {1, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0},
+ {1, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0}
};
static const DWORD s_freq[4][4] = {
- {11025,12000,8000,0},
- {0,0,0,0},
- {22050,24000,16000,0},
- {44100,48000,32000,0}
+ {11025, 12000, 8000, 0},
+ {0, 0, 0, 0},
+ {22050, 24000, 16000, 0},
+ {44100, 48000, 32000, 0}
};
static const BYTE s_channels[4] = {
- 2,2,2,1 // stereo, joint stereo, dual, mono
+ 2, 2, 2, 1 // stereo, joint stereo, dual, mono
};
typedef struct {
- WORD sync;
- BYTE version;
- BYTE layer;
- DWORD bitrate;
- DWORD freq;
- BYTE channels;
- DWORD framesize;
-
- bool ExtractHeader(CSocket& socket) {
- BYTE buff[4];
- if (4 != socket.Receive(buff, 4, MSG_PEEK)) {
- return false;
- }
-
- sync = (buff[0]<<4)|(buff[1]>>4)|1;
- version = (buff[1]>>3)&3;
- layer = 4 - ((buff[1]>>1)&3);
- bitrate = s_bitrate[version&1][buff[2]>>4]*1000;
- freq = s_freq[version][(buff[2]>>2)&3];
- channels = s_channels[(buff[3]>>6)&3];
- framesize = freq ? ((((version&1)?144:72) * bitrate / freq) + ((buff[2]>>1)&1)) : 0;
-
- return (sync == 0xfff && layer == 3 && bitrate != 0 && freq != 0);
- }
+ WORD sync;
+ BYTE version;
+ BYTE layer;
+ DWORD bitrate;
+ DWORD freq;
+ BYTE channels;
+ DWORD framesize;
+
+ bool ExtractHeader(CSocket& socket) {
+ BYTE buff[4];
+ if (4 != socket.Receive(buff, 4, MSG_PEEK)) {
+ return false;
+ }
+
+ sync = (buff[0] << 4) | (buff[1] >> 4) | 1;
+ version = (buff[1] >> 3) & 3;
+ layer = 4 - ((buff[1] >> 1) & 3);
+ bitrate = s_bitrate[version & 1][buff[2] >> 4] * 1000;
+ freq = s_freq[version][(buff[2] >> 2) & 3];
+ channels = s_channels[(buff[3] >> 6) & 3];
+ framesize = freq ? ((((version & 1) ? 144 : 72) * bitrate / freq) + ((buff[2] >> 1) & 1)) : 0;
+
+ return (sync == 0xfff && layer == 3 && bitrate != 0 && freq != 0);
+ }
} mp3hdr;
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_MP3},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_MP3},
};
const AMOVIESETUP_PIN sudOpPin[] = {
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CShoutcastSource), ShoutcastSourceName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CShoutcastSource), ShoutcastSourceName, MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CShoutcastSource>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CShoutcastSource>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -114,24 +114,24 @@ STDAPI DllUnregisterServer()
class CShoutcastSourceApp : public CFilterApp
{
public:
- BOOL InitInstance() {
- if (!__super::InitInstance()) {
- return FALSE;
- }
- /*
- if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
- {
- AfxMessageBox(_T("AfxWinInit failed!"));
- return FALSE;
- }
- */
- if (!AfxSocketInit(NULL)) {
- AfxMessageBox(_T("AfxSocketInit failed!"));
- return FALSE;
- }
-
- return TRUE;
- }
+ BOOL InitInstance() {
+ if (!__super::InitInstance()) {
+ return FALSE;
+ }
+ /*
+ if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
+ {
+ AfxMessageBox(_T("AfxWinInit failed!"));
+ return FALSE;
+ }
+ */
+ if (!AfxSocketInit(NULL)) {
+ AfxMessageBox(_T("AfxSocketInit failed!"));
+ return FALSE;
+ }
+
+ return TRUE;
+ }
};
CShoutcastSourceApp theApp;
@@ -143,10 +143,10 @@ CShoutcastSourceApp theApp;
//
CShoutcastSource::CShoutcastSource(LPUNKNOWN lpunk, HRESULT* phr)
- : CSource(NAME("CShoutcastSource"), lpunk, __uuidof(this))
+ : CSource(NAME("CShoutcastSource"), lpunk, __uuidof(this))
{
#ifndef REGISTER_FILTER
- AfxSocketInit();
+ AfxSocketInit();
#endif
}
@@ -156,146 +156,146 @@ CShoutcastSource::~CShoutcastSource()
STDMETHODIMP CShoutcastSource::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
-
- return
- QI(IFileSourceFilter)
- QI(IAMFilterMiscFlags)
- QI(IAMOpenProgress)
- QI2(IAMMediaContent)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ CheckPointer(ppv, E_POINTER);
+
+ return
+ QI(IFileSourceFilter)
+ QI(IAMFilterMiscFlags)
+ QI(IAMOpenProgress)
+ QI2(IAMMediaContent)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
// IFileSourceFilter
STDMETHODIMP CShoutcastSource::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt)
{
- if (GetPinCount() > 0) {
- return VFW_E_ALREADY_CONNECTED;
- }
+ if (GetPinCount() > 0) {
+ return VFW_E_ALREADY_CONNECTED;
+ }
- HRESULT hr = E_OUTOFMEMORY;
+ HRESULT hr = E_OUTOFMEMORY;
- if (!(DNew CShoutcastStream(pszFileName, this, &hr)) || FAILED(hr)) {
- return hr;
- }
+ if (!(DNew CShoutcastStream(pszFileName, this, &hr)) || FAILED(hr)) {
+ return hr;
+ }
- m_fn = pszFileName;
+ m_fn = pszFileName;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CShoutcastSource::GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt)
{
- if (!ppszFileName) {
- return E_POINTER;
- }
+ if (!ppszFileName) {
+ return E_POINTER;
+ }
- *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength()+1)*sizeof(WCHAR));
- if (!(*ppszFileName)) {
- return E_OUTOFMEMORY;
- }
+ *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength() + 1) * sizeof(WCHAR));
+ if (!(*ppszFileName)) {
+ return E_OUTOFMEMORY;
+ }
- wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
+ wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
- return S_OK;
+ return S_OK;
}
// IAMFilterMiscFlags
ULONG CShoutcastSource::GetMiscFlags()
{
- return AM_FILTER_MISC_FLAGS_IS_SOURCE;
+ return AM_FILTER_MISC_FLAGS_IS_SOURCE;
}
// IAMOpenProgress
STDMETHODIMP CShoutcastSource::QueryProgress(LONGLONG* pllTotal, LONGLONG* pllCurrent)
{
- if (m_iPins == 1) {
- if (pllTotal) {
- *pllTotal = 100;
- }
- if (pllCurrent) {
- *pllCurrent = (static_cast<CShoutcastStream*>(m_paStreams[0]))->GetBufferFullness();
- }
- return S_OK;
- }
-
- return E_UNEXPECTED;
+ if (m_iPins == 1) {
+ if (pllTotal) {
+ *pllTotal = 100;
+ }
+ if (pllCurrent) {
+ *pllCurrent = (static_cast<CShoutcastStream*>(m_paStreams[0]))->GetBufferFullness();
+ }
+ return S_OK;
+ }
+
+ return E_UNEXPECTED;
}
STDMETHODIMP CShoutcastSource::AbortOperation()
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// IAMMediaContent
STDMETHODIMP CShoutcastSource::get_Title(BSTR* pbstrTitle)
{
- CheckPointer(pbstrTitle, E_POINTER);
+ CheckPointer(pbstrTitle, E_POINTER);
- if (m_iPins == 1) {
- *pbstrTitle = (static_cast<CShoutcastStream*>(m_paStreams[0]))->GetTitle().AllocSysString();
- return S_OK;
- }
+ if (m_iPins == 1) {
+ *pbstrTitle = (static_cast<CShoutcastStream*>(m_paStreams[0]))->GetTitle().AllocSysString();
+ return S_OK;
+ }
- return E_UNEXPECTED;
+ return E_UNEXPECTED;
}
STDMETHODIMP CShoutcastSource::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
- wcscpy_s(pInfo->achName, ShoutcastSourceName);
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
-
- return S_OK;
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+ wcscpy_s(pInfo->achName, ShoutcastSourceName);
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
+
+ return S_OK;
}
// CShoutcastStream
CShoutcastStream::CShoutcastStream(const WCHAR* wfn, CShoutcastSource* pParent, HRESULT* phr)
- : CSourceStream(NAME("ShoutcastStream"), phr, pParent, L"Output")
- , m_fBuffering(false)
+ : CSourceStream(NAME("ShoutcastStream"), phr, pParent, L"Output")
+ , m_fBuffering(false)
{
- ASSERT(phr);
+ ASSERT(phr);
- *phr = S_OK;
+ *phr = S_OK;
- CString fn(wfn);
- if (fn.Find(_T("://")) < 0) {
- fn = _T("http://") + fn;
- }
+ CString fn(wfn);
+ if (fn.Find(_T("://")) < 0) {
+ fn = _T("http://") + fn;
+ }
- if (!m_url.CrackUrl(fn)) {
- *phr = E_FAIL;
- return;
- }
+ if (!m_url.CrackUrl(fn)) {
+ *phr = E_FAIL;
+ return;
+ }
- if (m_url.GetUrlPathLength() == 0) {
- m_url.SetUrlPath(_T("/"));
- }
+ if (m_url.GetUrlPathLength() == 0) {
+ m_url.SetUrlPath(_T("/"));
+ }
- if (m_url.GetPortNumber() == ATL_URL_INVALID_PORT_NUMBER) {
- m_url.SetPortNumber(ATL_URL_DEFAULT_HTTP_PORT);
- }
+ if (m_url.GetPortNumber() == ATL_URL_INVALID_PORT_NUMBER) {
+ m_url.SetPortNumber(ATL_URL_DEFAULT_HTTP_PORT);
+ }
- if (m_url.GetScheme() != ATL_URL_SCHEME_HTTP) {
- *phr = E_FAIL;
- return;
- }
+ if (m_url.GetScheme() != ATL_URL_SCHEME_HTTP) {
+ *phr = E_FAIL;
+ return;
+ }
- if (!m_socket.Create() || !m_socket.Connect(m_url)) {
- *phr = E_FAIL;
- return;
- }
+ if (!m_socket.Create() || !m_socket.Connect(m_url)) {
+ *phr = E_FAIL;
+ return;
+ }
- m_socket.Close();
+ m_socket.Close();
}
CShoutcastStream::~CShoutcastStream()
@@ -304,420 +304,420 @@ CShoutcastStream::~CShoutcastStream()
void CShoutcastStream::EmptyBuffer()
{
- CAutoLock cAutoLock(&m_queue);
- m_queue.RemoveAll();
+ CAutoLock cAutoLock(&m_queue);
+ m_queue.RemoveAll();
}
LONGLONG CShoutcastStream::GetBufferFullness()
{
- CAutoLock cAutoLock(&m_queue);
- if (!m_fBuffering) {
- return 100;
- }
- if (m_queue.IsEmpty()) {
- return 0;
- }
- LONGLONG ret = 100i64*(m_queue.GetTail().rtStart - m_queue.GetHead().rtStart) / AVGBUFFERLENGTH;
- return min(ret, 100);
+ CAutoLock cAutoLock(&m_queue);
+ if (!m_fBuffering) {
+ return 100;
+ }
+ if (m_queue.IsEmpty()) {
+ return 0;
+ }
+ LONGLONG ret = 100i64 * (m_queue.GetTail().rtStart - m_queue.GetHead().rtStart) / AVGBUFFERLENGTH;
+ return min(ret, 100);
}
CString CShoutcastStream::GetTitle()
{
- CAutoLock cAutoLock(&m_queue);
- return m_title;
+ CAutoLock cAutoLock(&m_queue);
+ return m_title;
}
HRESULT CShoutcastStream::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties)
{
- ASSERT(pAlloc);
- ASSERT(pProperties);
+ ASSERT(pAlloc);
+ ASSERT(pProperties);
- HRESULT hr = NOERROR;
+ HRESULT hr = NOERROR;
- pProperties->cBuffers = BUFFERS;
- pProperties->cbBuffer = MAXFRAMESIZE;
+ pProperties->cBuffers = BUFFERS;
+ pProperties->cbBuffer = MAXFRAMESIZE;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- if (Actual.cbBuffer < pProperties->cbBuffer) {
- return E_FAIL;
- }
- ASSERT(Actual.cBuffers == pProperties->cBuffers);
+ if (Actual.cbBuffer < pProperties->cbBuffer) {
+ return E_FAIL;
+ }
+ ASSERT(Actual.cBuffers == pProperties->cBuffers);
- return NOERROR;
+ return NOERROR;
}
HRESULT CShoutcastStream::FillBuffer(IMediaSample* pSample)
{
- HRESULT hr;
-
- BYTE* pData = NULL;
- if (FAILED(hr = pSample->GetPointer(&pData)) || !pData) {
- return S_FALSE;
- }
-
- do {
- // do we have to refill our buffer?
- {
- CAutoLock cAutoLock(&m_queue);
- if (!m_queue.IsEmpty() && m_queue.GetHead().rtStart < m_queue.GetTail().rtStart - MINBUFFERLENGTH) {
- break; // nope, that's great
- }
- }
-
- TRACE(_T("START BUFFERING\n"));
- m_fBuffering = true;
-
- for (;;) {
- if (fExitThread) { // playback stopped?
- return S_FALSE;
- }
-
- Sleep(50);
-
- CAutoLock cAutoLock(&m_queue);
- if (!m_queue.IsEmpty() && m_queue.GetHead().rtStart < m_queue.GetTail().rtStart - AVGBUFFERLENGTH) {
- break; // this is enough
- }
- }
-
- pSample->SetDiscontinuity(TRUE);
-
- DeliverBeginFlush();
- DeliverEndFlush();
-
- DeliverNewSegment(0, ~0, 1.0);
-
- TRACE(_T("END BUFFERING\n"));
- m_fBuffering = false;
- } while (false);
-
- {
- CAutoLock cAutoLock(&m_queue);
- ASSERT(!m_queue.IsEmpty());
- if (!m_queue.IsEmpty()) {
- mp3frame f = m_queue.RemoveHead();
- DWORD len = min((DWORD)pSample->GetSize(), f.len);
- memcpy(pData, f.pData, len);
- pSample->SetActualDataLength(len);
- pSample->SetTime(&f.rtStart, &f.rtStop);
- m_title = f.title;
- }
- }
-
- pSample->SetSyncPoint(TRUE);
-
- return S_OK;
+ HRESULT hr;
+
+ BYTE* pData = NULL;
+ if (FAILED(hr = pSample->GetPointer(&pData)) || !pData) {
+ return S_FALSE;
+ }
+
+ do {
+ // do we have to refill our buffer?
+ {
+ CAutoLock cAutoLock(&m_queue);
+ if (!m_queue.IsEmpty() && m_queue.GetHead().rtStart < m_queue.GetTail().rtStart - MINBUFFERLENGTH) {
+ break; // nope, that's great
+ }
+ }
+
+ TRACE(_T("START BUFFERING\n"));
+ m_fBuffering = true;
+
+ for (;;) {
+ if (fExitThread) { // playback stopped?
+ return S_FALSE;
+ }
+
+ Sleep(50);
+
+ CAutoLock cAutoLock(&m_queue);
+ if (!m_queue.IsEmpty() && m_queue.GetHead().rtStart < m_queue.GetTail().rtStart - AVGBUFFERLENGTH) {
+ break; // this is enough
+ }
+ }
+
+ pSample->SetDiscontinuity(TRUE);
+
+ DeliverBeginFlush();
+ DeliverEndFlush();
+
+ DeliverNewSegment(0, ~0, 1.0);
+
+ TRACE(_T("END BUFFERING\n"));
+ m_fBuffering = false;
+ } while (false);
+
+ {
+ CAutoLock cAutoLock(&m_queue);
+ ASSERT(!m_queue.IsEmpty());
+ if (!m_queue.IsEmpty()) {
+ mp3frame f = m_queue.RemoveHead();
+ DWORD len = min((DWORD)pSample->GetSize(), f.len);
+ memcpy(pData, f.pData, len);
+ pSample->SetActualDataLength(len);
+ pSample->SetTime(&f.rtStart, &f.rtStop);
+ m_title = f.title;
+ }
+ }
+
+ pSample->SetSyncPoint(TRUE);
+
+ return S_OK;
}
HRESULT CShoutcastStream::GetMediaType(int iPosition, CMediaType* pmt)
{
- CAutoLock cAutoLock(m_pFilter->pStateLock());
-
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > 0) {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- pmt->SetType(&MEDIATYPE_Audio);
- pmt->SetSubtype(&MEDIASUBTYPE_MP3);
- pmt->SetFormatType(&FORMAT_WaveFormatEx);
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)pmt->AllocFormatBuffer(sizeof(WAVEFORMATEX));
- memset(wfe, 0, sizeof(WAVEFORMATEX));
- wfe->wFormatTag = (WORD)MEDIASUBTYPE_MP3.Data1;
- wfe->nChannels = (WORD)m_socket.m_channels;
- wfe->nSamplesPerSec = m_socket.m_freq;
- wfe->nAvgBytesPerSec = m_socket.m_bitrate/8;
- wfe->nBlockAlign = 1;
- wfe->wBitsPerSample = 0;
-
- return NOERROR;
+ CAutoLock cAutoLock(m_pFilter->pStateLock());
+
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > 0) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ pmt->SetType(&MEDIATYPE_Audio);
+ pmt->SetSubtype(&MEDIASUBTYPE_MP3);
+ pmt->SetFormatType(&FORMAT_WaveFormatEx);
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)pmt->AllocFormatBuffer(sizeof(WAVEFORMATEX));
+ memset(wfe, 0, sizeof(WAVEFORMATEX));
+ wfe->wFormatTag = (WORD)MEDIASUBTYPE_MP3.Data1;
+ wfe->nChannels = (WORD)m_socket.m_channels;
+ wfe->nSamplesPerSec = m_socket.m_freq;
+ wfe->nAvgBytesPerSec = m_socket.m_bitrate / 8;
+ wfe->nBlockAlign = 1;
+ wfe->wBitsPerSample = 0;
+
+ return NOERROR;
}
HRESULT CShoutcastStream::CheckMediaType(const CMediaType* pmt)
{
- if (pmt->majortype == MEDIATYPE_Audio
- && pmt->subtype == MEDIASUBTYPE_MP3
- && pmt->formattype == FORMAT_WaveFormatEx) {
- return S_OK;
- }
+ if (pmt->majortype == MEDIATYPE_Audio
+ && pmt->subtype == MEDIASUBTYPE_MP3
+ && pmt->formattype == FORMAT_WaveFormatEx) {
+ return S_OK;
+ }
- return E_INVALIDARG;
+ return E_INVALIDARG;
}
static UINT SocketThreadProc(LPVOID pParam)
{
- return (static_cast<CShoutcastStream*>(pParam))->SocketThreadProc();
+ return (static_cast<CShoutcastStream*>(pParam))->SocketThreadProc();
}
UINT CShoutcastStream::SocketThreadProc()
{
- fExitThread = false;
+ fExitThread = false;
- SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
+ SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
- AfxSocketInit();
+ AfxSocketInit();
- CAutoVectorPtr<BYTE> pData;
- if (!m_socket.Create() || !m_socket.Connect(m_url)
- || !pData.Allocate(max(m_socket.m_metaint, MAXFRAMESIZE))) {
- m_socket.Close();
- return 1;
- }
+ CAutoVectorPtr<BYTE> pData;
+ if (!m_socket.Create() || !m_socket.Connect(m_url)
+ || !pData.Allocate(max(m_socket.m_metaint, MAXFRAMESIZE))) {
+ m_socket.Close();
+ return 1;
+ }
- REFERENCE_TIME m_rtSampleTime = 0;
+ REFERENCE_TIME m_rtSampleTime = 0;
- while (!fExitThread) {
- int len = MAXFRAMESIZE;
- len = m_socket.Receive(pData, len);
- if (len <= 0) {
- break;
- }
+ while (!fExitThread) {
+ int len = MAXFRAMESIZE;
+ len = m_socket.Receive(pData, len);
+ if (len <= 0) {
+ break;
+ }
- mp3frame f(len);
- memcpy(f.pData, pData, len);
- f.rtStop = (f.rtStart = m_rtSampleTime) + (10000000i64 * len * 8/m_socket.m_bitrate);
- m_rtSampleTime = f.rtStop;
- f.title = m_socket.m_title;
- if (f.title.IsEmpty()) {
- f.title = m_socket.m_url;
- }
+ mp3frame f(len);
+ memcpy(f.pData, pData, len);
+ f.rtStop = (f.rtStart = m_rtSampleTime) + (10000000i64 * len * 8 / m_socket.m_bitrate);
+ m_rtSampleTime = f.rtStop;
+ f.title = m_socket.m_title;
+ if (f.title.IsEmpty()) {
+ f.title = m_socket.m_url;
+ }
- CAutoLock cAutoLock(&m_queue);
- m_queue.AddTail(f);
- }
+ CAutoLock cAutoLock(&m_queue);
+ m_queue.AddTail(f);
+ }
- m_socket.Close();
+ m_socket.Close();
- return 0;
+ return 0;
}
HRESULT CShoutcastStream::OnThreadCreate()
{
- EmptyBuffer();
+ EmptyBuffer();
- fExitThread = true;
- m_hSocketThread = AfxBeginThread(::SocketThreadProc, this)->m_hThread;
- while (fExitThread) {
- Sleep(10);
- }
+ fExitThread = true;
+ m_hSocketThread = AfxBeginThread(::SocketThreadProc, this)->m_hThread;
+ while (fExitThread) {
+ Sleep(10);
+ }
- return NOERROR;
+ return NOERROR;
}
HRESULT CShoutcastStream::OnThreadDestroy()
{
- EmptyBuffer();
+ EmptyBuffer();
- fExitThread = true;
- m_socket.CancelBlockingCall();
- WaitForSingleObject(m_hSocketThread, (DWORD)-1);
+ fExitThread = true;
+ m_socket.CancelBlockingCall();
+ WaitForSingleObject(m_hSocketThread, (DWORD) - 1);
- return NOERROR;
+ return NOERROR;
}
HRESULT CShoutcastStream::Inactive()
{
- fExitThread = true;
- return __super::Inactive();
+ fExitThread = true;
+ return __super::Inactive();
}
//
int CShoutcastStream::CShoutcastSocket::Receive(void* lpBuf, int nBufLen, int nFlags)
{
- if (nFlags&MSG_PEEK) {
- return __super::Receive(lpBuf, nBufLen, nFlags);
- }
-
- if (m_metaint > 0 && m_nBytesRead + nBufLen > m_metaint) {
- nBufLen = m_metaint - m_nBytesRead;
- }
-
- int len = __super::Receive(lpBuf, nBufLen, nFlags);
- if (len <= 0) {
- return len;
- }
-
- if ((m_nBytesRead += len) == m_metaint) {
- m_nBytesRead = 0;
-
- static BYTE buff[255*16], b = 0;
- memset(buff, 0, sizeof(buff));
- if (1 == __super::Receive(&b, 1) && b && b*16 == __super::Receive(buff, b*16)) {
- CStringA str = (LPCSTR)buff;
-
- TRACE(_T("Metainfo: %s\n"), CString(str));
-
- CStringA title("StreamTitle='"), url("StreamUrl='");
-
- int i = str.Find(title);
- if (i >= 0) {
- i += title.GetLength();
- int j = str.Find('\'', i);
- if (j > i) {
- m_title = str.Mid(i, j - i);
- }
- } else {
- TRACE(_T("!!!!!!!!!Missing StreamTitle!!!!!!!!!\n"));
- }
-
- i = str.Find(url);
- if (i >= 0) {
- i += url.GetLength();
- int j = str.Find('\'', i);
- if (j > i) {
- m_url = str.Mid(i, j - i);
- }
- }
- }
- } else if (m_metaint > 0) {
- char* p = (char*)lpBuf;
- char* p0 = p;
- char* pend = p + len - 13;
- for (; p < pend; p++) {
- if (strncmp(p, "StreamTitle='", 13)) {
- continue;
- }
-
- TRACE(_T("!!!!!!!!!StreamTitle found inside mp3 data!!!!!!!!! offset=%d\n"), p - p0);
- TRACE(_T("resyncing...\n"));
- while (p-- > p0) {
- if ((BYTE)*p >= 0x20) {
- continue;
- }
-
- TRACE(_T("found possible length byte: %d, skipping %d bytes\n"), *p, 1 + *p*16);
- p += 1 + *p*16;
- len = (int)(p0 + len - p);
- TRACE(_T("returning the remaining bytes in the packet: %d\n"), len);
- if (len <= 0) {
- TRACE(_T("nothing to return, reading a bit more in\n"));
- if (len < 0) {
- __super::Receive(lpBuf, -len, nFlags);
- }
-
- int len = __super::Receive(lpBuf, nBufLen, nFlags);
- if (len <= 0) {
- return len;
- }
- }
-
- m_nBytesRead = len;
- memcpy(lpBuf, p, len);
-
- break;
- }
-
- break;
- }
- }
-
- return len;
+ if (nFlags & MSG_PEEK) {
+ return __super::Receive(lpBuf, nBufLen, nFlags);
+ }
+
+ if (m_metaint > 0 && m_nBytesRead + nBufLen > m_metaint) {
+ nBufLen = m_metaint - m_nBytesRead;
+ }
+
+ int len = __super::Receive(lpBuf, nBufLen, nFlags);
+ if (len <= 0) {
+ return len;
+ }
+
+ if ((m_nBytesRead += len) == m_metaint) {
+ m_nBytesRead = 0;
+
+ static BYTE buff[255 * 16], b = 0;
+ memset(buff, 0, sizeof(buff));
+ if (1 == __super::Receive(&b, 1) && b && b * 16 == __super::Receive(buff, b * 16)) {
+ CStringA str = (LPCSTR)buff;
+
+ TRACE(_T("Metainfo: %s\n"), CString(str));
+
+ CStringA title("StreamTitle='"), url("StreamUrl='");
+
+ int i = str.Find(title);
+ if (i >= 0) {
+ i += title.GetLength();
+ int j = str.Find('\'', i);
+ if (j > i) {
+ m_title = str.Mid(i, j - i);
+ }
+ } else {
+ TRACE(_T("!!!!!!!!!Missing StreamTitle!!!!!!!!!\n"));
+ }
+
+ i = str.Find(url);
+ if (i >= 0) {
+ i += url.GetLength();
+ int j = str.Find('\'', i);
+ if (j > i) {
+ m_url = str.Mid(i, j - i);
+ }
+ }
+ }
+ } else if (m_metaint > 0) {
+ char* p = (char*)lpBuf;
+ char* p0 = p;
+ char* pend = p + len - 13;
+ for (; p < pend; p++) {
+ if (strncmp(p, "StreamTitle='", 13)) {
+ continue;
+ }
+
+ TRACE(_T("!!!!!!!!!StreamTitle found inside mp3 data!!!!!!!!! offset=%d\n"), p - p0);
+ TRACE(_T("resyncing...\n"));
+ while (p-- > p0) {
+ if ((BYTE)*p >= 0x20) {
+ continue;
+ }
+
+ TRACE(_T("found possible length byte: %d, skipping %d bytes\n"), *p, 1 + *p * 16);
+ p += 1 + *p * 16;
+ len = (int)(p0 + len - p);
+ TRACE(_T("returning the remaining bytes in the packet: %d\n"), len);
+ if (len <= 0) {
+ TRACE(_T("nothing to return, reading a bit more in\n"));
+ if (len < 0) {
+ __super::Receive(lpBuf, -len, nFlags);
+ }
+
+ int len = __super::Receive(lpBuf, nBufLen, nFlags);
+ if (len <= 0) {
+ return len;
+ }
+ }
+
+ m_nBytesRead = len;
+ memcpy(lpBuf, p, len);
+
+ break;
+ }
+
+ break;
+ }
+ }
+
+ return len;
}
bool CShoutcastStream::CShoutcastSocket::Connect(CUrl& url)
{
- if (!__super::Connect(url.GetHostName(), url.GetPortNumber())) {
- return false;
- }
-
- CStringA str;
- str.Format(
- "GET %s HTTP/1.0\r\n"
- "Icy-MetaData:1\r\n"
- "User-Agent: shoutcastsource\r\n"
- "Host: %s\r\n"
- "Accept: */*\r\n"
- "Connection: Keep-Alive\r\n"
- "\r\n", CStringA(url.GetUrlPath()), CStringA(url.GetHostName()));
-
- bool fOK = false;
- bool fTryAgain = false;
- int metaint = 0;
-
- do {
- int len = Send((BYTE*)(LPCSTR)str, str.GetLength());
- UNREFERENCED_PARAMETER(len);
-
- m_nBytesRead = 0;
- m_metaint = metaint = 0;
- m_bitrate = 0;
-
- str.Empty();
- BYTE cur = 0, prev = 0;
- while (Receive(&cur, 1) == 1 && cur && !(cur == '\n' && prev == '\n')) {
- if (cur == '\r') {
- continue;
- }
-
- if (cur == '\n') {
- str.MakeLower();
- if (str.Find("icy 200 ok") >= 0) {
- fOK = true;
- } else if (1 == sscanf_s(str, "icy-br:%d", &m_bitrate)) {
- m_bitrate *= 1000;
- } else if (1 == sscanf_s(str, "icy-metaint:%d", &metaint)) {
- metaint = metaint;
- }
- str.Empty();
- } else {
- str += cur;
- }
-
- prev = cur;
- cur = 0;
- }
-
- if (!fOK && GetLastError() == WSAECONNRESET && !fTryAgain) {
- str.Format(
- "GET %s HTTP/1.0\r\n"
- "Icy-MetaData:1\r\n"
- "Host: %s\r\n"
- "Accept: */*\r\n"
- "Connection: Keep-Alive\r\n"
- "\r\n", CStringA(url.GetUrlPath()), CStringA(url.GetHostName()));
-
- fTryAgain = true;
- } else {
- fTryAgain = false;
- }
- } while (fTryAgain);
-
- if (!fOK || m_bitrate == 0) {
- Close();
- return false;
- }
-
- m_metaint = metaint;
- m_nBytesRead = 0;
-
- return FindSync();
+ if (!__super::Connect(url.GetHostName(), url.GetPortNumber())) {
+ return false;
+ }
+
+ CStringA str;
+ str.Format(
+ "GET %s HTTP/1.0\r\n"
+ "Icy-MetaData:1\r\n"
+ "User-Agent: shoutcastsource\r\n"
+ "Host: %s\r\n"
+ "Accept: */*\r\n"
+ "Connection: Keep-Alive\r\n"
+ "\r\n", CStringA(url.GetUrlPath()), CStringA(url.GetHostName()));
+
+ bool fOK = false;
+ bool fTryAgain = false;
+ int metaint = 0;
+
+ do {
+ int len = Send((BYTE*)(LPCSTR)str, str.GetLength());
+ UNREFERENCED_PARAMETER(len);
+
+ m_nBytesRead = 0;
+ m_metaint = metaint = 0;
+ m_bitrate = 0;
+
+ str.Empty();
+ BYTE cur = 0, prev = 0;
+ while (Receive(&cur, 1) == 1 && cur && !(cur == '\n' && prev == '\n')) {
+ if (cur == '\r') {
+ continue;
+ }
+
+ if (cur == '\n') {
+ str.MakeLower();
+ if (str.Find("icy 200 ok") >= 0) {
+ fOK = true;
+ } else if (1 == sscanf_s(str, "icy-br:%d", &m_bitrate)) {
+ m_bitrate *= 1000;
+ } else if (1 == sscanf_s(str, "icy-metaint:%d", &metaint)) {
+ metaint = metaint;
+ }
+ str.Empty();
+ } else {
+ str += cur;
+ }
+
+ prev = cur;
+ cur = 0;
+ }
+
+ if (!fOK && GetLastError() == WSAECONNRESET && !fTryAgain) {
+ str.Format(
+ "GET %s HTTP/1.0\r\n"
+ "Icy-MetaData:1\r\n"
+ "Host: %s\r\n"
+ "Accept: */*\r\n"
+ "Connection: Keep-Alive\r\n"
+ "\r\n", CStringA(url.GetUrlPath()), CStringA(url.GetHostName()));
+
+ fTryAgain = true;
+ } else {
+ fTryAgain = false;
+ }
+ } while (fTryAgain);
+
+ if (!fOK || m_bitrate == 0) {
+ Close();
+ return false;
+ }
+
+ m_metaint = metaint;
+ m_nBytesRead = 0;
+
+ return FindSync();
}
bool CShoutcastStream::CShoutcastSocket::FindSync()
{
- m_freq = (DWORD)-1;
- m_channels = (DWORD)-1;
-
- BYTE b;
- for (int i = MAXFRAMESIZE; i > 0; i--, Receive(&b, 1)) {
- mp3hdr h;
- if (h.ExtractHeader(*this) && m_bitrate == h.bitrate) {
- if (h.bitrate > 1) {
- m_bitrate = h.bitrate;
- }
- m_freq = h.freq;
- m_channels = h.channels;
- return true;
- }
- }
-
- return false;
+ m_freq = (DWORD) - 1;
+ m_channels = (DWORD) - 1;
+
+ BYTE b;
+ for (int i = MAXFRAMESIZE; i > 0; i--, Receive(&b, 1)) {
+ mp3hdr h;
+ if (h.ExtractHeader(*this) && m_bitrate == h.bitrate) {
+ if (h.bitrate > 1) {
+ m_bitrate = h.bitrate;
+ }
+ m_freq = h.freq;
+ m_channels = h.channels;
+ return true;
+ }
+ }
+
+ return false;
}
diff --git a/src/filters/source/ShoutcastSource/ShoutcastSource.h b/src/filters/source/ShoutcastSource/ShoutcastSource.h
index 3848409c0..9b7294957 100644
--- a/src/filters/source/ShoutcastSource/ShoutcastSource.h
+++ b/src/filters/source/ShoutcastSource/ShoutcastSource.h
@@ -32,168 +32,168 @@
#define ShoutcastSourceName L"MPC ShoutCast Source"
class __declspec(uuid("68F540E9-766F-44d2-AB07-E26CC6D27A79"))
- CShoutcastSource
- : public CSource
- , public IFileSourceFilter
- , public IAMFilterMiscFlags
- , public IAMOpenProgress
- , public IAMMediaContent
+ CShoutcastSource
+ : public CSource
+ , public IFileSourceFilter
+ , public IAMFilterMiscFlags
+ , public IAMOpenProgress
+ , public IAMMediaContent
{
- CStringW m_fn;
+ CStringW m_fn;
public:
- CShoutcastSource(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CShoutcastSource();
-
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- // IFileSourceFilter
- STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
- STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
-
- // IAMFilterMiscFlags
- STDMETHODIMP_(ULONG) GetMiscFlags();
-
- // IAMOpenProgress
- STDMETHODIMP QueryProgress(LONGLONG* pllTotal, LONGLONG* pllCurrent);
- STDMETHODIMP AbortOperation();
-
- // IAMMediaContent
- STDMETHODIMP GetTypeInfoCount(UINT* pctinfo) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) {
- return E_NOTIMPL;
- }
- STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid) {
- return E_NOTIMPL;
- }
- STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_AuthorName(BSTR* pbstrAuthorName) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_Title(BSTR* pbstrTitle);
- STDMETHODIMP get_Rating(BSTR* pbstrRating) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_Description(BSTR* pbstrDescription) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_Copyright(BSTR* pbstrCopyright) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_BaseURL(BSTR* pbstrBaseURL) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_LogoURL(BSTR* pbstrLogoURL) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_LogoIconURL(BSTR* pbstrLogoURL) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_WatermarkURL(BSTR* pbstrWatermarkURL) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_MoreInfoURL(BSTR* pbstrMoreInfoURL) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_MoreInfoBannerImage(BSTR* pbstrMoreInfoBannerImage) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_MoreInfoBannerURL(BSTR* pbstrMoreInfoBannerURL) {
- return E_NOTIMPL;
- }
- STDMETHODIMP get_MoreInfoText(BSTR* pbstrMoreInfoText) {
- return E_NOTIMPL;
- }
-
- // CBaseFilter
- STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
+ CShoutcastSource(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CShoutcastSource();
+
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ // IFileSourceFilter
+ STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
+
+ // IAMFilterMiscFlags
+ STDMETHODIMP_(ULONG) GetMiscFlags();
+
+ // IAMOpenProgress
+ STDMETHODIMP QueryProgress(LONGLONG* pllTotal, LONGLONG* pllCurrent);
+ STDMETHODIMP AbortOperation();
+
+ // IAMMediaContent
+ STDMETHODIMP GetTypeInfoCount(UINT* pctinfo) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_AuthorName(BSTR* pbstrAuthorName) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_Title(BSTR* pbstrTitle);
+ STDMETHODIMP get_Rating(BSTR* pbstrRating) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_Description(BSTR* pbstrDescription) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_Copyright(BSTR* pbstrCopyright) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_BaseURL(BSTR* pbstrBaseURL) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_LogoURL(BSTR* pbstrLogoURL) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_LogoIconURL(BSTR* pbstrLogoURL) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_WatermarkURL(BSTR* pbstrWatermarkURL) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_MoreInfoURL(BSTR* pbstrMoreInfoURL) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_MoreInfoBannerImage(BSTR* pbstrMoreInfoBannerImage) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_MoreInfoBannerURL(BSTR* pbstrMoreInfoBannerURL) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_MoreInfoText(BSTR* pbstrMoreInfoText) {
+ return E_NOTIMPL;
+ }
+
+ // CBaseFilter
+ STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
};
class CShoutcastStream : public CSourceStream
{
- class mp3frame
- {
- public:
- DWORD len;
- BYTE* pData;
- REFERENCE_TIME rtStart, rtStop;
- CString title;
- mp3frame(DWORD len = 0) {
- this->len = len;
- pData = len ? DNew BYTE[len] : NULL;
- rtStart = rtStop = 0;
- }
- mp3frame(const mp3frame& f) {
- *this = f;
- }
- ~mp3frame() {
- delete pData;
- }
- mp3frame& operator = (const mp3frame& f) {
- if (this != &f) {
- len = f.len;
- pData = f.pData;
- rtStart = f.rtStart;
- rtStop = f.rtStop;
- title = f.title;
- ((mp3frame*)&f)->pData = NULL;
- }
- return *this;
- }
- };
-
- class mp3queue : public CAtlList<mp3frame>, public CCritSec {} m_queue;
-
- class CShoutcastSocket : public CSocket
- {
- DWORD m_nBytesRead;
-
- public:
- CShoutcastSocket() {
- m_metaint = m_bitrate = m_freq = m_channels = 0;
- }
- int Receive(void* lpBuf, int nBufLen, int nFlags = 0);
-
- DWORD m_metaint, m_bitrate, m_freq, m_channels;
- CString m_title, m_url;
- bool Connect(CUrl& url);
- bool FindSync();
- } m_socket;
-
- HANDLE m_hSocketThread;
-
- CUrl m_url;
-
- bool m_fBuffering;
- CString m_title;
+ class mp3frame
+ {
+ public:
+ DWORD len;
+ BYTE* pData;
+ REFERENCE_TIME rtStart, rtStop;
+ CString title;
+ mp3frame(DWORD len = 0) {
+ this->len = len;
+ pData = len ? DNew BYTE[len] : NULL;
+ rtStart = rtStop = 0;
+ }
+ mp3frame(const mp3frame& f) {
+ *this = f;
+ }
+ ~mp3frame() {
+ delete pData;
+ }
+ mp3frame& operator = (const mp3frame& f) {
+ if (this != &f) {
+ len = f.len;
+ pData = f.pData;
+ rtStart = f.rtStart;
+ rtStop = f.rtStop;
+ title = f.title;
+ ((mp3frame*)&f)->pData = NULL;
+ }
+ return *this;
+ }
+ };
+
+ class mp3queue : public CAtlList<mp3frame>, public CCritSec {} m_queue;
+
+ class CShoutcastSocket : public CSocket
+ {
+ DWORD m_nBytesRead;
+
+ public:
+ CShoutcastSocket() {
+ m_metaint = m_bitrate = m_freq = m_channels = 0;
+ }
+ int Receive(void* lpBuf, int nBufLen, int nFlags = 0);
+
+ DWORD m_metaint, m_bitrate, m_freq, m_channels;
+ CString m_title, m_url;
+ bool Connect(CUrl& url);
+ bool FindSync();
+ } m_socket;
+
+ HANDLE m_hSocketThread;
+
+ CUrl m_url;
+
+ bool m_fBuffering;
+ CString m_title;
public:
- CShoutcastStream(const WCHAR* wfn, CShoutcastSource* pParent, HRESULT* phr);
- virtual ~CShoutcastStream();
+ CShoutcastStream(const WCHAR* wfn, CShoutcastSource* pParent, HRESULT* phr);
+ virtual ~CShoutcastStream();
- bool fExitThread;
- UINT SocketThreadProc();
+ bool fExitThread;
+ UINT SocketThreadProc();
- void EmptyBuffer();
- LONGLONG GetBufferFullness();
- CString GetTitle();
+ void EmptyBuffer();
+ LONGLONG GetBufferFullness();
+ CString GetTitle();
- HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT FillBuffer(IMediaSample* pSample);
- HRESULT CheckMediaType(const CMediaType* pMediaType);
- HRESULT GetMediaType(int iPosition, CMediaType* pmt);
+ HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT FillBuffer(IMediaSample* pSample);
+ HRESULT CheckMediaType(const CMediaType* pMediaType);
+ HRESULT GetMediaType(int iPosition, CMediaType* pmt);
- STDMETHODIMP Notify(IBaseFilter* pSender, Quality q) {
- return E_NOTIMPL;
- }
+ STDMETHODIMP Notify(IBaseFilter* pSender, Quality q) {
+ return E_NOTIMPL;
+ }
- HRESULT OnThreadCreate();
- HRESULT OnThreadDestroy();
- HRESULT Inactive();
- HRESULT Pause();
+ HRESULT OnThreadCreate();
+ HRESULT OnThreadDestroy();
+ HRESULT Inactive();
+ HRESULT Pause();
};
diff --git a/src/filters/source/SubtitleSource/SubtitleSource.cpp b/src/filters/source/SubtitleSource/SubtitleSource.cpp
index 1d7e9acd0..cf6424169 100644
--- a/src/filters/source/SubtitleSource/SubtitleSource.cpp
+++ b/src/filters/source/SubtitleSource/SubtitleSource.cpp
@@ -37,82 +37,82 @@ static int _ATPF = 400000;
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Subtitle, &MEDIASUBTYPE_NULL},
- {&MEDIATYPE_Text, &MEDIASUBTYPE_NULL},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_RGB32},
+ {&MEDIATYPE_Subtitle, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Text, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_RGB32},
};
const AMOVIESETUP_PIN sudOpPin[] = {
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut},
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CSubtitleSourceASCII), L"MPC SubtitleSource (S_TEXT/ASCII)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CSubtitleSourceUTF8), L"MPC SubtitleSource (S_TEXT/UTF8)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CSubtitleSourceSSA), L"MPC SubtitleSource (S_TEXT/SSA)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CSubtitleSourceASS), L"MPC SubtitleSource (S_TEXT/ASS)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CSubtitleSourceUSF), L"MPC SubtitleSource (S_TEXT/USF)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CSubtitleSourcePreview), L"MPC SubtitleSource (Preview)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CSubtitleSourceARGB), L"MPC SubtitleSource (ARGB)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CSubtitleSourceASCII), L"MPC SubtitleSource (S_TEXT/ASCII)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CSubtitleSourceUTF8), L"MPC SubtitleSource (S_TEXT/UTF8)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CSubtitleSourceSSA), L"MPC SubtitleSource (S_TEXT/SSA)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CSubtitleSourceASS), L"MPC SubtitleSource (S_TEXT/ASS)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CSubtitleSourceUSF), L"MPC SubtitleSource (S_TEXT/USF)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CSubtitleSourcePreview), L"MPC SubtitleSource (Preview)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CSubtitleSourceARGB), L"MPC SubtitleSource (ARGB)", MERIT_NORMAL, _countof(sudOpPin), sudOpPin, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CSubtitleSourceASCII>, NULL, &sudFilter[0]},
- {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CSubtitleSourceUTF8>, NULL, &sudFilter[1]},
- {sudFilter[2].strName, sudFilter[2].clsID, CreateInstance<CSubtitleSourceSSA>, NULL, &sudFilter[2]},
- {sudFilter[3].strName, sudFilter[3].clsID, CreateInstance<CSubtitleSourceASS>, NULL, &sudFilter[3]},
- // {sudFilter[4].strName, sudFilter[4].clsID, CreateInstance<CSubtitleSourceUSF>, NULL, &sudFilter[4]},
- {sudFilter[5].strName, sudFilter[5].clsID, CreateInstance<CSubtitleSourcePreview>, NULL, &sudFilter[5]},
- {sudFilter[6].strName, sudFilter[6].clsID, CreateInstance<CSubtitleSourceARGB>, NULL, &sudFilter[6]},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CSubtitleSourceASCII>, NULL, &sudFilter[0]},
+ {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CSubtitleSourceUTF8>, NULL, &sudFilter[1]},
+ {sudFilter[2].strName, sudFilter[2].clsID, CreateInstance<CSubtitleSourceSSA>, NULL, &sudFilter[2]},
+ {sudFilter[3].strName, sudFilter[3].clsID, CreateInstance<CSubtitleSourceASS>, NULL, &sudFilter[3]},
+ // {sudFilter[4].strName, sudFilter[4].clsID, CreateInstance<CSubtitleSourceUSF>, NULL, &sudFilter[4]},
+ {sudFilter[5].strName, sudFilter[5].clsID, CreateInstance<CSubtitleSourcePreview>, NULL, &sudFilter[5]},
+ {sudFilter[6].strName, sudFilter[6].clsID, CreateInstance<CSubtitleSourceARGB>, NULL, &sudFilter[6]},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- /*CString clsid = CStringFromGUID(__uuidof(CSubtitleSourcePreview));
+ /*CString clsid = CStringFromGUID(__uuidof(CSubtitleSourcePreview));
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".sub"),
- _T("Source Filter"), clsid);
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".sub"),
+ _T("Source Filter"), clsid);
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".srt"),
- _T("Source Filter"), clsid);
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".srt"),
+ _T("Source Filter"), clsid);
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".smi"),
- _T("Source Filter"), clsid);
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".smi"),
+ _T("Source Filter"), clsid);
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".ssa"),
- _T("Source Filter"), clsid);
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".ssa"),
+ _T("Source Filter"), clsid);
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".ass"),
- _T("Source Filter"), clsid);
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".ass"),
+ _T("Source Filter"), clsid);
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".xss"),
- _T("Source Filter"), clsid);
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".xss"),
+ _T("Source Filter"), clsid);
- SetRegKeyValue(
- _T("Media Type\\Extensions"), _T(".usf"),
- _T("Source Filter"), clsid);*/
- return AMovieDllRegisterServer2(TRUE);
+ SetRegKeyValue(
+ _T("Media Type\\Extensions"), _T(".usf"),
+ _T("Source Filter"), clsid);*/
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".sub"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".srt"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".smi"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".ssa"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".ass"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".xss"));
- DeleteRegKey(_T("Media Type\\Extensions"), _T(".usf"));
- /**/
- return AMovieDllRegisterServer2(FALSE);
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".sub"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".srt"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".smi"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".ssa"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".ass"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".xss"));
+ DeleteRegKey(_T("Media Type\\Extensions"), _T(".usf"));
+ /**/
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -120,23 +120,23 @@ STDAPI DllUnregisterServer()
class CSubtitleSourceApp : public CFilterApp
{
public:
- BOOL InitInstance() {
- if (!__super::InitInstance()) {
- return FALSE;
- }
-
- _WIDTH = GetProfileInt(_T("SubtitleSource"), _T("w"), 640);
- _HEIGHT = GetProfileInt(_T("SubtitleSource"), _T("h"), 480);
- _ATPF = GetProfileInt(_T("SubtitleSource"), _T("atpf"), 400000);
- if (_ATPF <= 0) {
- _ATPF = 400000;
- }
- WriteProfileInt(_T("SubtitleSource"), _T("w"), _WIDTH);
- WriteProfileInt(_T("SubtitleSource"), _T("h"), _HEIGHT);
- WriteProfileInt(_T("SubtitleSource"), _T("atpf"), _ATPF);
-
- return TRUE;
- }
+ BOOL InitInstance() {
+ if (!__super::InitInstance()) {
+ return FALSE;
+ }
+
+ _WIDTH = GetProfileInt(_T("SubtitleSource"), _T("w"), 640);
+ _HEIGHT = GetProfileInt(_T("SubtitleSource"), _T("h"), 480);
+ _ATPF = GetProfileInt(_T("SubtitleSource"), _T("atpf"), 400000);
+ if (_ATPF <= 0) {
+ _ATPF = 400000;
+ }
+ WriteProfileInt(_T("SubtitleSource"), _T("w"), _WIDTH);
+ WriteProfileInt(_T("SubtitleSource"), _T("h"), _HEIGHT);
+ WriteProfileInt(_T("SubtitleSource"), _T("atpf"), _ATPF);
+
+ return TRUE;
+ }
};
CSubtitleSourceApp theApp;
@@ -148,7 +148,7 @@ CSubtitleSourceApp theApp;
//
CSubtitleSource::CSubtitleSource(LPUNKNOWN lpunk, HRESULT* phr, const CLSID& clsid)
- : CSource(NAME("CSubtitleSource"), lpunk, clsid)
+ : CSource(NAME("CSubtitleSource"), lpunk, clsid)
{
}
@@ -158,70 +158,70 @@ CSubtitleSource::~CSubtitleSource()
STDMETHODIMP CSubtitleSource::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return
- QI(IFileSourceFilter)
- QI(IAMFilterMiscFlags)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IFileSourceFilter)
+ QI(IAMFilterMiscFlags)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
// IFileSourceFilter
STDMETHODIMP CSubtitleSource::Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt)
{
- if (GetPinCount() > 0) {
- return VFW_E_ALREADY_CONNECTED;
- }
+ if (GetPinCount() > 0) {
+ return VFW_E_ALREADY_CONNECTED;
+ }
- HRESULT hr = S_OK;
- if (!(DNew CSubtitleStream(pszFileName, this, &hr))) {
- return E_OUTOFMEMORY;
- }
+ HRESULT hr = S_OK;
+ if (!(DNew CSubtitleStream(pszFileName, this, &hr))) {
+ return E_OUTOFMEMORY;
+ }
- if (FAILED(hr)) {
- return hr;
- }
+ if (FAILED(hr)) {
+ return hr;
+ }
- m_fn = pszFileName;
+ m_fn = pszFileName;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CSubtitleSource::GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt)
{
- if (!ppszFileName) {
- return E_POINTER;
- }
+ if (!ppszFileName) {
+ return E_POINTER;
+ }
- *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength() + 1) * sizeof(WCHAR));
- if (!*ppszFileName) {
- return E_OUTOFMEMORY;
- }
+ *ppszFileName = (LPOLESTR)CoTaskMemAlloc((m_fn.GetLength() + 1) * sizeof(WCHAR));
+ if (!*ppszFileName) {
+ return E_OUTOFMEMORY;
+ }
- wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
+ wcscpy_s(*ppszFileName, m_fn.GetLength() + 1, m_fn);
- return S_OK;
+ return S_OK;
}
// IAMFilterMiscFlags
ULONG CSubtitleSource::GetMiscFlags()
{
- return AM_FILTER_MISC_FLAGS_IS_SOURCE;
+ return AM_FILTER_MISC_FLAGS_IS_SOURCE;
}
STDMETHODIMP CSubtitleSource::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
- wcscpy_s(pInfo->achName, SubtitleSourceName);
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+ wcscpy_s(pInfo->achName, SubtitleSourceName);
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
- return S_OK;
+ return S_OK;
}
//
@@ -229,350 +229,350 @@ STDMETHODIMP CSubtitleSource::QueryFilterInfo(FILTER_INFO* pInfo)
//
CSubtitleStream::CSubtitleStream(const WCHAR* wfn, CSubtitleSource* pParent, HRESULT* phr)
- : CSourceStream(NAME("SubtitleStream"), phr, pParent, L"Output")
- , CSourceSeeking(NAME("SubtitleStream"), (IPin*)this, phr, &m_cSharedState)
- , m_bDiscontinuity(FALSE), m_bFlushing(FALSE)
- , m_nPosition(0)
- , m_rts(NULL)
+ : CSourceStream(NAME("SubtitleStream"), phr, pParent, L"Output")
+ , CSourceSeeking(NAME("SubtitleStream"), (IPin*)this, phr, &m_cSharedState)
+ , m_bDiscontinuity(FALSE), m_bFlushing(FALSE)
+ , m_nPosition(0)
+ , m_rts(NULL)
{
- CAutoLock cAutoLock(&m_cSharedState);
+ CAutoLock cAutoLock(&m_cSharedState);
- CString fn(wfn);
+ CString fn(wfn);
- if (!m_rts.Open(fn, DEFAULT_CHARSET)) {
- if (phr) {
- *phr = E_FAIL;
- }
- return;
- }
+ if (!m_rts.Open(fn, DEFAULT_CHARSET)) {
+ if (phr) {
+ *phr = E_FAIL;
+ }
+ return;
+ }
- m_rts.CreateDefaultStyle(DEFAULT_CHARSET);
- m_rts.ConvertToTimeBased(25);
- m_rts.Sort();
+ m_rts.CreateDefaultStyle(DEFAULT_CHARSET);
+ m_rts.ConvertToTimeBased(25);
+ m_rts.Sort();
- m_rtDuration = 0;
- for (size_t i = 0, cnt = m_rts.GetCount(); i < cnt; i++) {
- m_rtDuration = max(m_rtDuration, 10000i64*m_rts[i].end);
- }
+ m_rtDuration = 0;
+ for (size_t i = 0, cnt = m_rts.GetCount(); i < cnt; i++) {
+ m_rtDuration = max(m_rtDuration, 10000i64 * m_rts[i].end);
+ }
- m_rtStop = m_rtDuration;
+ m_rtStop = m_rtDuration;
- if (phr) {
- *phr = m_rtDuration > 0 ? S_OK : E_FAIL;
- }
+ if (phr) {
+ *phr = m_rtDuration > 0 ? S_OK : E_FAIL;
+ }
}
CSubtitleStream::~CSubtitleStream()
{
- CAutoLock cAutoLock(&m_cSharedState);
+ CAutoLock cAutoLock(&m_cSharedState);
}
STDMETHODIMP CSubtitleStream::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
+ CheckPointer(ppv, E_POINTER);
- return (riid == IID_IMediaSeeking) ? CSourceSeeking::NonDelegatingQueryInterface(riid, ppv) //GetInterface((IMediaSeeking*)this, ppv)
- : CSourceStream::NonDelegatingQueryInterface(riid, ppv);
+ return (riid == IID_IMediaSeeking) ? CSourceSeeking::NonDelegatingQueryInterface(riid, ppv) //GetInterface((IMediaSeeking*)this, ppv)
+ : CSourceStream::NonDelegatingQueryInterface(riid, ppv);
}
void CSubtitleStream::UpdateFromSeek()
{
- if (ThreadExists()) {
- // next time around the loop, the worker thread will
- // pick up the position change.
- // We need to flush all the existing data - we must do that here
- // as our thread will probably be blocked in GetBuffer otherwise
+ if (ThreadExists()) {
+ // next time around the loop, the worker thread will
+ // pick up the position change.
+ // We need to flush all the existing data - we must do that here
+ // as our thread will probably be blocked in GetBuffer otherwise
- m_bFlushing = TRUE;
+ m_bFlushing = TRUE;
- DeliverBeginFlush();
- // make sure we have stopped pushing
- Stop();
- // complete the flush
- DeliverEndFlush();
+ DeliverBeginFlush();
+ // make sure we have stopped pushing
+ Stop();
+ // complete the flush
+ DeliverEndFlush();
- m_bFlushing = FALSE;
+ m_bFlushing = FALSE;
- // restart
- Run();
- }
+ // restart
+ Run();
+ }
}
HRESULT CSubtitleStream::SetRate(double dRate)
{
- if (dRate <= 0) {
- return E_INVALIDARG;
- }
+ if (dRate <= 0) {
+ return E_INVALIDARG;
+ }
- {
- CAutoLock lock(CSourceSeeking::m_pLock);
- m_dRateSeeking = dRate;
- }
+ {
+ CAutoLock lock(CSourceSeeking::m_pLock);
+ m_dRateSeeking = dRate;
+ }
- UpdateFromSeek();
+ UpdateFromSeek();
- return S_OK;
+ return S_OK;
}
HRESULT CSubtitleStream::OnThreadStartPlay()
{
- m_bDiscontinuity = TRUE;
- return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
+ m_bDiscontinuity = TRUE;
+ return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
}
HRESULT CSubtitleStream::ChangeStart()
{
- {
- CAutoLock lock(CSourceSeeking::m_pLock);
-
- OnThreadCreate();
- /*if (m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_ARGB32)
- {
- m_nPosition = (int)(m_rtStart/10000)*1/1000;
- }
- else if (m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_RGB32)
- {
- int m_nSegments = 0;
- if (!m_rts.SearchSubs((int)(m_rtStart/10000), 25, &m_nPosition, &m_nSegments))
- m_nPosition = m_nSegments;
- }
- else
- {
- m_nPosition = m_rts.SearchSub((int)(m_rtStart/10000), 25);
- if (m_nPosition < 0) m_nPosition = 0;
- else if (m_rts[m_nPosition].end <= (int)(m_rtStart/10000)) m_nPosition++;
- }*/
- }
-
- UpdateFromSeek();
-
- return S_OK;
+ {
+ CAutoLock lock(CSourceSeeking::m_pLock);
+
+ OnThreadCreate();
+ /*if (m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_ARGB32)
+ {
+ m_nPosition = (int)(m_rtStart/10000)*1/1000;
+ }
+ else if (m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_RGB32)
+ {
+ int m_nSegments = 0;
+ if (!m_rts.SearchSubs((int)(m_rtStart/10000), 25, &m_nPosition, &m_nSegments))
+ m_nPosition = m_nSegments;
+ }
+ else
+ {
+ m_nPosition = m_rts.SearchSub((int)(m_rtStart/10000), 25);
+ if (m_nPosition < 0) m_nPosition = 0;
+ else if (m_rts[m_nPosition].end <= (int)(m_rtStart/10000)) m_nPosition++;
+ }*/
+ }
+
+ UpdateFromSeek();
+
+ return S_OK;
}
HRESULT CSubtitleStream::ChangeStop()
{
-/*{
- CAutoLock lock(CSourceSeeking::m_pLock);
- if (m_rtPosition < m_rtStop)
- return S_OK;
-}*/
- // We're already past the new stop time -- better flush the graph.
- UpdateFromSeek();
+ /*{
+ CAutoLock lock(CSourceSeeking::m_pLock);
+ if (m_rtPosition < m_rtStop)
+ return S_OK;
+ }*/
+ // We're already past the new stop time -- better flush the graph.
+ UpdateFromSeek();
- return S_OK;
+ return S_OK;
}
HRESULT CSubtitleStream::OnThreadCreate()
{
- CAutoLock cAutoLockShared(&m_cSharedState);
+ CAutoLock cAutoLockShared(&m_cSharedState);
- if (m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_ARGB32) {
- m_nPosition = (int)(m_rtStart/_ATPF);
- } else if (m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_RGB32) {
- int m_nSegments = 0;
- if (!m_rts.SearchSubs((int)(m_rtStart/10000), 10000000.0/_ATPF, &m_nPosition, &m_nSegments)) {
- m_nPosition = m_nSegments;
- }
- } else {
- m_nPosition = m_rts.SearchSub((int)(m_rtStart/10000), 25);
- if (m_nPosition < 0) {
- m_nPosition = 0;
- } else if (m_rts[m_nPosition].end <= (int)(m_rtStart/10000)) {
- m_nPosition++;
- }
- }
+ if (m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_ARGB32) {
+ m_nPosition = (int)(m_rtStart / _ATPF);
+ } else if (m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_RGB32) {
+ int m_nSegments = 0;
+ if (!m_rts.SearchSubs((int)(m_rtStart / 10000), 10000000.0 / _ATPF, &m_nPosition, &m_nSegments)) {
+ m_nPosition = m_nSegments;
+ }
+ } else {
+ m_nPosition = m_rts.SearchSub((int)(m_rtStart / 10000), 25);
+ if (m_nPosition < 0) {
+ m_nPosition = 0;
+ } else if (m_rts[m_nPosition].end <= (int)(m_rtStart / 10000)) {
+ m_nPosition++;
+ }
+ }
- return CSourceStream::OnThreadCreate();
+ return CSourceStream::OnThreadCreate();
}
HRESULT CSubtitleStream::DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProperties)
{
- //CAutoLock cAutoLock(m_pFilter->pStateLock());
+ //CAutoLock cAutoLock(m_pFilter->pStateLock());
- ASSERT(pAlloc);
- ASSERT(pProperties);
+ ASSERT(pAlloc);
+ ASSERT(pProperties);
- HRESULT hr = NOERROR;
+ HRESULT hr = NOERROR;
- if (m_mt.majortype == MEDIATYPE_Video) {
- pProperties->cBuffers = 2;
- pProperties->cbBuffer = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biSizeImage;
- } else {
- pProperties->cBuffers = 1;
- pProperties->cbBuffer = 0x10000;
- }
+ if (m_mt.majortype == MEDIATYPE_Video) {
+ pProperties->cBuffers = 2;
+ pProperties->cbBuffer = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biSizeImage;
+ } else {
+ pProperties->cBuffers = 1;
+ pProperties->cbBuffer = 0x10000;
+ }
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAlloc->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- if (Actual.cbBuffer < pProperties->cbBuffer) {
- return E_FAIL;
- }
- ASSERT(Actual.cBuffers == pProperties->cBuffers);
+ if (Actual.cbBuffer < pProperties->cbBuffer) {
+ return E_FAIL;
+ }
+ ASSERT(Actual.cBuffers == pProperties->cBuffers);
- return NOERROR;
+ return NOERROR;
}
HRESULT CSubtitleStream::FillBuffer(IMediaSample* pSample)
{
- HRESULT hr;
-
- {
- CAutoLock cAutoLockShared(&m_cSharedState);
-
- BYTE* pData = NULL;
- if (FAILED(hr = pSample->GetPointer(&pData)) || !pData) {
- return S_FALSE;
- }
-
- AM_MEDIA_TYPE* pmt;
- if (SUCCEEDED(pSample->GetMediaType(&pmt)) && pmt) {
- CMediaType mt(*pmt);
- SetMediaType(&mt);
- DeleteMediaType(pmt);
- }
-
- int len = 0;
- REFERENCE_TIME rtStart, rtStop;
-
- if (m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_ARGB32) {
- rtStart = (REFERENCE_TIME)((m_nPosition*_ATPF - m_rtStart) / m_dRateSeeking);
- rtStop = (REFERENCE_TIME)(((m_nPosition+1)*_ATPF - m_rtStart) / m_dRateSeeking);
- if (m_rtStart+rtStart >= m_rtDuration) {
- return S_FALSE;
- }
-
- BITMAPINFOHEADER& bmi = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader;
-
- SubPicDesc spd;
- spd.w = _WIDTH;
- spd.h = _HEIGHT;
- spd.bpp = 32;
- spd.pitch = bmi.biWidth*4;
- spd.bits = pData;
-
- len = spd.h*spd.pitch;
-
- for (int y = 0; y < spd.h; y++) {
- memsetd((DWORD*)(pData + spd.pitch*y), 0xff000000, spd.w*4);
- }
-
- RECT bbox;
- m_rts.Render(spd, m_nPosition*_ATPF, 10000000.0/_ATPF, bbox);
-
- for (int y = 0; y < spd.h; y++) {
- DWORD* p = (DWORD*)(pData + spd.pitch*y);
- for (int x = 0; x < spd.w; x++, p++) {
- *p = (0xff000000-(*p&0xff000000))|(*p&0xffffff);
- }
- }
- } else if (m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_RGB32) {
- const STSSegment* stss = m_rts.GetSegment(m_nPosition);
- if (!stss) {
- return S_FALSE;
- }
-
- BITMAPINFOHEADER& bmi = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader;
-
- SubPicDesc spd;
- spd.w = _WIDTH;
- spd.h = _HEIGHT;
- spd.bpp = 32;
- spd.pitch = bmi.biWidth*4;
- spd.bits = pData;
-
- len = spd.h*spd.pitch;
-
- for (int y = 0; y < spd.h; y++) {
- DWORD c1 = 0xff606060, c2 = 0xffa0a0a0;
- if (y&32) {
- c1 ^= c2, c2 ^= c1, c1 ^= c2;
- }
- DWORD* p = (DWORD*)(pData + spd.pitch*y);
- for (int x = 0; x < spd.w; x+=32, p+=32) {
- memsetd(p, (x&32) ? c1 : c2, min(spd.w-x,32)*4);
- }
- }
-
- RECT bbox;
- m_rts.Render(spd, 10000i64*(stss->start+stss->end)/2, 10000000.0/_ATPF, bbox);
-
- rtStart = (REFERENCE_TIME)((10000i64*stss->start - m_rtStart) / m_dRateSeeking);
- rtStop = (REFERENCE_TIME)((10000i64*stss->end - m_rtStart) / m_dRateSeeking);
- } else {
- if ((size_t)m_nPosition >= m_rts.GetCount()) {
- return S_FALSE;
- }
-
- STSEntry& stse = m_rts[m_nPosition];
-
- if (stse.start >= m_rtStop/10000) {
- return S_FALSE;
- }
-
- if (m_mt.majortype == MEDIATYPE_Subtitle && m_mt.subtype == MEDIASUBTYPE_UTF8) {
- CStringA str = UTF16To8(m_rts.GetStrW(m_nPosition, false));
- memcpy((char*)pData, str, len = str.GetLength());
- } else if (m_mt.majortype == MEDIATYPE_Subtitle && (m_mt.subtype == MEDIASUBTYPE_SSA || m_mt.subtype == MEDIASUBTYPE_ASS)) {
- CStringW line;
- line.Format(L"%d,%d,%s,%s,%d,%d,%d,%s,%s",
- stse.readorder, stse.layer, CStringW(stse.style), CStringW(stse.actor),
- stse.marginRect.left, stse.marginRect.right, (stse.marginRect.top+stse.marginRect.bottom)/2,
- CStringW(stse.effect), m_rts.GetStrW(m_nPosition, true));
-
- CStringA str = UTF16To8(line);
- memcpy((char*)pData, str, len = str.GetLength());
- } else if (m_mt.majortype == MEDIATYPE_Text && m_mt.subtype == MEDIASUBTYPE_NULL) {
- CStringA str = m_rts.GetStrA(m_nPosition, false);
- memcpy((char*)pData, str, len = str.GetLength());
- } else {
- return S_FALSE;
- }
-
- rtStart = (REFERENCE_TIME)((10000i64*stse.start - m_rtStart) / m_dRateSeeking);
- rtStop = (REFERENCE_TIME)((10000i64*stse.end - m_rtStart) / m_dRateSeeking);
- }
-
- pSample->SetTime(&rtStart, &rtStop);
- pSample->SetActualDataLength(len);
-
- m_nPosition++;
- }
-
- pSample->SetSyncPoint(TRUE);
-
- if (m_bDiscontinuity) {
- pSample->SetDiscontinuity(TRUE);
- m_bDiscontinuity = FALSE;
- }
-
- return S_OK;
+ HRESULT hr;
+
+ {
+ CAutoLock cAutoLockShared(&m_cSharedState);
+
+ BYTE* pData = NULL;
+ if (FAILED(hr = pSample->GetPointer(&pData)) || !pData) {
+ return S_FALSE;
+ }
+
+ AM_MEDIA_TYPE* pmt;
+ if (SUCCEEDED(pSample->GetMediaType(&pmt)) && pmt) {
+ CMediaType mt(*pmt);
+ SetMediaType(&mt);
+ DeleteMediaType(pmt);
+ }
+
+ int len = 0;
+ REFERENCE_TIME rtStart, rtStop;
+
+ if (m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_ARGB32) {
+ rtStart = (REFERENCE_TIME)((m_nPosition * _ATPF - m_rtStart) / m_dRateSeeking);
+ rtStop = (REFERENCE_TIME)(((m_nPosition + 1) * _ATPF - m_rtStart) / m_dRateSeeking);
+ if (m_rtStart + rtStart >= m_rtDuration) {
+ return S_FALSE;
+ }
+
+ BITMAPINFOHEADER& bmi = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader;
+
+ SubPicDesc spd;
+ spd.w = _WIDTH;
+ spd.h = _HEIGHT;
+ spd.bpp = 32;
+ spd.pitch = bmi.biWidth * 4;
+ spd.bits = pData;
+
+ len = spd.h * spd.pitch;
+
+ for (int y = 0; y < spd.h; y++) {
+ memsetd((DWORD*)(pData + spd.pitch * y), 0xff000000, spd.w * 4);
+ }
+
+ RECT bbox;
+ m_rts.Render(spd, m_nPosition * _ATPF, 10000000.0 / _ATPF, bbox);
+
+ for (int y = 0; y < spd.h; y++) {
+ DWORD* p = (DWORD*)(pData + spd.pitch * y);
+ for (int x = 0; x < spd.w; x++, p++) {
+ *p = (0xff000000 - (*p & 0xff000000)) | (*p & 0xffffff);
+ }
+ }
+ } else if (m_mt.majortype == MEDIATYPE_Video && m_mt.subtype == MEDIASUBTYPE_RGB32) {
+ const STSSegment* stss = m_rts.GetSegment(m_nPosition);
+ if (!stss) {
+ return S_FALSE;
+ }
+
+ BITMAPINFOHEADER& bmi = ((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader;
+
+ SubPicDesc spd;
+ spd.w = _WIDTH;
+ spd.h = _HEIGHT;
+ spd.bpp = 32;
+ spd.pitch = bmi.biWidth * 4;
+ spd.bits = pData;
+
+ len = spd.h * spd.pitch;
+
+ for (int y = 0; y < spd.h; y++) {
+ DWORD c1 = 0xff606060, c2 = 0xffa0a0a0;
+ if (y & 32) {
+ c1 ^= c2, c2 ^= c1, c1 ^= c2;
+ }
+ DWORD* p = (DWORD*)(pData + spd.pitch * y);
+ for (int x = 0; x < spd.w; x += 32, p += 32) {
+ memsetd(p, (x & 32) ? c1 : c2, min(spd.w - x, 32) * 4);
+ }
+ }
+
+ RECT bbox;
+ m_rts.Render(spd, 10000i64 * (stss->start + stss->end) / 2, 10000000.0 / _ATPF, bbox);
+
+ rtStart = (REFERENCE_TIME)((10000i64 * stss->start - m_rtStart) / m_dRateSeeking);
+ rtStop = (REFERENCE_TIME)((10000i64 * stss->end - m_rtStart) / m_dRateSeeking);
+ } else {
+ if ((size_t)m_nPosition >= m_rts.GetCount()) {
+ return S_FALSE;
+ }
+
+ STSEntry& stse = m_rts[m_nPosition];
+
+ if (stse.start >= m_rtStop / 10000) {
+ return S_FALSE;
+ }
+
+ if (m_mt.majortype == MEDIATYPE_Subtitle && m_mt.subtype == MEDIASUBTYPE_UTF8) {
+ CStringA str = UTF16To8(m_rts.GetStrW(m_nPosition, false));
+ memcpy((char*)pData, str, len = str.GetLength());
+ } else if (m_mt.majortype == MEDIATYPE_Subtitle && (m_mt.subtype == MEDIASUBTYPE_SSA || m_mt.subtype == MEDIASUBTYPE_ASS)) {
+ CStringW line;
+ line.Format(L"%d,%d,%s,%s,%d,%d,%d,%s,%s",
+ stse.readorder, stse.layer, CStringW(stse.style), CStringW(stse.actor),
+ stse.marginRect.left, stse.marginRect.right, (stse.marginRect.top + stse.marginRect.bottom) / 2,
+ CStringW(stse.effect), m_rts.GetStrW(m_nPosition, true));
+
+ CStringA str = UTF16To8(line);
+ memcpy((char*)pData, str, len = str.GetLength());
+ } else if (m_mt.majortype == MEDIATYPE_Text && m_mt.subtype == MEDIASUBTYPE_NULL) {
+ CStringA str = m_rts.GetStrA(m_nPosition, false);
+ memcpy((char*)pData, str, len = str.GetLength());
+ } else {
+ return S_FALSE;
+ }
+
+ rtStart = (REFERENCE_TIME)((10000i64 * stse.start - m_rtStart) / m_dRateSeeking);
+ rtStop = (REFERENCE_TIME)((10000i64 * stse.end - m_rtStart) / m_dRateSeeking);
+ }
+
+ pSample->SetTime(&rtStart, &rtStop);
+ pSample->SetActualDataLength(len);
+
+ m_nPosition++;
+ }
+
+ pSample->SetSyncPoint(TRUE);
+
+ if (m_bDiscontinuity) {
+ pSample->SetDiscontinuity(TRUE);
+ m_bDiscontinuity = FALSE;
+ }
+
+ return S_OK;
}
HRESULT CSubtitleStream::GetMediaType(CMediaType* pmt)
{
- return (static_cast<CSubtitleSource*>(m_pFilter))->GetMediaType(pmt);
+ return (static_cast<CSubtitleSource*>(m_pFilter))->GetMediaType(pmt);
}
HRESULT CSubtitleStream::CheckMediaType(const CMediaType* pmt)
{
- CAutoLock lock(m_pFilter->pStateLock());
+ CAutoLock lock(m_pFilter->pStateLock());
- CMediaType mt;
- GetMediaType(&mt);
+ CMediaType mt;
+ GetMediaType(&mt);
- if (mt.majortype == pmt->majortype && mt.subtype == pmt->subtype) {
- return NOERROR;
- }
+ if (mt.majortype == pmt->majortype && mt.subtype == pmt->subtype) {
+ return NOERROR;
+ }
- return E_FAIL;
+ return E_FAIL;
}
STDMETHODIMP CSubtitleStream::Notify(IBaseFilter* pSender, Quality q)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
//
@@ -580,21 +580,21 @@ STDMETHODIMP CSubtitleStream::Notify(IBaseFilter* pSender, Quality q)
//
CSubtitleSourceASCII::CSubtitleSourceASCII(LPUNKNOWN lpunk, HRESULT* phr)
- : CSubtitleSource(lpunk, phr, __uuidof(this))
+ : CSubtitleSource(lpunk, phr, __uuidof(this))
{
}
HRESULT CSubtitleSourceASCII::GetMediaType(CMediaType* pmt)
{
- CAutoLock cAutoLock(pStateLock());
+ CAutoLock cAutoLock(pStateLock());
- pmt->InitMediaType();
- pmt->SetType(&MEDIATYPE_Text);
- pmt->SetSubtype(&MEDIASUBTYPE_NULL);
- pmt->SetFormatType(&FORMAT_None);
- pmt->ResetFormatBuffer();
+ pmt->InitMediaType();
+ pmt->SetType(&MEDIATYPE_Text);
+ pmt->SetSubtype(&MEDIASUBTYPE_NULL);
+ pmt->SetFormatType(&FORMAT_None);
+ pmt->ResetFormatBuffer();
- return NOERROR;
+ return NOERROR;
}
//
@@ -602,23 +602,23 @@ HRESULT CSubtitleSourceASCII::GetMediaType(CMediaType* pmt)
//
CSubtitleSourceUTF8::CSubtitleSourceUTF8(LPUNKNOWN lpunk, HRESULT* phr)
- : CSubtitleSource(lpunk, phr, __uuidof(this))
+ : CSubtitleSource(lpunk, phr, __uuidof(this))
{
}
HRESULT CSubtitleSourceUTF8::GetMediaType(CMediaType* pmt)
{
- CAutoLock cAutoLock(pStateLock());
+ CAutoLock cAutoLock(pStateLock());
- pmt->InitMediaType();
- pmt->SetType(&MEDIATYPE_Subtitle);
- pmt->SetSubtype(&MEDIASUBTYPE_UTF8);
- pmt->SetFormatType(&FORMAT_SubtitleInfo);
- SUBTITLEINFO* psi = (SUBTITLEINFO*)pmt->AllocFormatBuffer(sizeof(SUBTITLEINFO));
- memset(psi, 0, pmt->FormatLength());
- strcpy_s(psi->IsoLang, "eng");
+ pmt->InitMediaType();
+ pmt->SetType(&MEDIATYPE_Subtitle);
+ pmt->SetSubtype(&MEDIASUBTYPE_UTF8);
+ pmt->SetFormatType(&FORMAT_SubtitleInfo);
+ SUBTITLEINFO* psi = (SUBTITLEINFO*)pmt->AllocFormatBuffer(sizeof(SUBTITLEINFO));
+ memset(psi, 0, pmt->FormatLength());
+ strcpy_s(psi->IsoLang, "eng");
- return NOERROR;
+ return NOERROR;
}
//
@@ -626,50 +626,50 @@ HRESULT CSubtitleSourceUTF8::GetMediaType(CMediaType* pmt)
//
CSubtitleSourceSSA::CSubtitleSourceSSA(LPUNKNOWN lpunk, HRESULT* phr)
- : CSubtitleSource(lpunk, phr, __uuidof(this))
+ : CSubtitleSource(lpunk, phr, __uuidof(this))
{
}
HRESULT CSubtitleSourceSSA::GetMediaType(CMediaType* pmt)
{
- CAutoLock cAutoLock(pStateLock());
+ CAutoLock cAutoLock(pStateLock());
- pmt->InitMediaType();
- pmt->SetType(&MEDIATYPE_Subtitle);
- pmt->SetSubtype(&MEDIASUBTYPE_SSA);
- pmt->SetFormatType(&FORMAT_SubtitleInfo);
+ pmt->InitMediaType();
+ pmt->SetType(&MEDIATYPE_Subtitle);
+ pmt->SetSubtype(&MEDIASUBTYPE_SSA);
+ pmt->SetFormatType(&FORMAT_SubtitleInfo);
- CSimpleTextSubtitle sts;
- sts.Open(CString(m_fn), DEFAULT_CHARSET);
- sts.RemoveAll();
+ CSimpleTextSubtitle sts;
+ sts.Open(CString(m_fn), DEFAULT_CHARSET);
+ sts.RemoveAll();
- CFile f;
- TCHAR path[_MAX_PATH], fn[_MAX_PATH];
- if (!GetTempPath(_MAX_PATH, path) || !GetTempFileName(path, _T("mpc_sts"), 0, fn)) {
- return E_FAIL;
- }
+ CFile f;
+ TCHAR path[_MAX_PATH], fn[_MAX_PATH];
+ if (!GetTempPath(_MAX_PATH, path) || !GetTempFileName(path, _T("mpc_sts"), 0, fn)) {
+ return E_FAIL;
+ }
- _tremove(fn);
+ _tremove(fn);
- _tcscat_s(fn, _T(".ssa"));
+ _tcscat_s(fn, _T(".ssa"));
- if (!sts.SaveAs(fn, EXTSSA, -1, CTextFile::UTF8) || !f.Open(fn, CFile::modeRead)) {
- return E_FAIL;
- }
+ if (!sts.SaveAs(fn, EXTSSA, -1, CTextFile::UTF8) || !f.Open(fn, CFile::modeRead)) {
+ return E_FAIL;
+ }
- int len = (int)f.GetLength()-3;
- f.Seek(3, CFile::begin);
+ int len = (int)f.GetLength() - 3;
+ f.Seek(3, CFile::begin);
- SUBTITLEINFO* psi = (SUBTITLEINFO*)pmt->AllocFormatBuffer(sizeof(SUBTITLEINFO) + len);
- memset(psi, 0, pmt->FormatLength());
- psi->dwOffset = sizeof(SUBTITLEINFO);
- strcpy_s(psi->IsoLang, "eng");
- f.Read(pmt->pbFormat + psi->dwOffset, len);
- f.Close();
+ SUBTITLEINFO* psi = (SUBTITLEINFO*)pmt->AllocFormatBuffer(sizeof(SUBTITLEINFO) + len);
+ memset(psi, 0, pmt->FormatLength());
+ psi->dwOffset = sizeof(SUBTITLEINFO);
+ strcpy_s(psi->IsoLang, "eng");
+ f.Read(pmt->pbFormat + psi->dwOffset, len);
+ f.Close();
- _tremove(fn);
+ _tremove(fn);
- return NOERROR;
+ return NOERROR;
}
//
@@ -677,49 +677,49 @@ HRESULT CSubtitleSourceSSA::GetMediaType(CMediaType* pmt)
//
CSubtitleSourceASS::CSubtitleSourceASS(LPUNKNOWN lpunk, HRESULT* phr)
- : CSubtitleSource(lpunk, phr, __uuidof(this))
+ : CSubtitleSource(lpunk, phr, __uuidof(this))
{
}
HRESULT CSubtitleSourceASS::GetMediaType(CMediaType* pmt)
{
- CAutoLock cAutoLock(pStateLock());
+ CAutoLock cAutoLock(pStateLock());
- pmt->InitMediaType();
- pmt->SetType(&MEDIATYPE_Subtitle);
- pmt->SetSubtype(&MEDIASUBTYPE_ASS);
- pmt->SetFormatType(&FORMAT_SubtitleInfo);
+ pmt->InitMediaType();
+ pmt->SetType(&MEDIATYPE_Subtitle);
+ pmt->SetSubtype(&MEDIASUBTYPE_ASS);
+ pmt->SetFormatType(&FORMAT_SubtitleInfo);
- CSimpleTextSubtitle sts;
- sts.Open(CString(m_fn), DEFAULT_CHARSET);
- sts.RemoveAll();
+ CSimpleTextSubtitle sts;
+ sts.Open(CString(m_fn), DEFAULT_CHARSET);
+ sts.RemoveAll();
- CFile f;
- TCHAR path[_MAX_PATH], fn[_MAX_PATH];
- if (!GetTempPath(_MAX_PATH, path) || !GetTempFileName(path, _T("mpc_sts"), 0, fn)) {
- return E_FAIL;
- }
+ CFile f;
+ TCHAR path[_MAX_PATH], fn[_MAX_PATH];
+ if (!GetTempPath(_MAX_PATH, path) || !GetTempFileName(path, _T("mpc_sts"), 0, fn)) {
+ return E_FAIL;
+ }
- _tremove(fn);
+ _tremove(fn);
- _tcscat_s(fn, _T(".ass"));
+ _tcscat_s(fn, _T(".ass"));
- if (!sts.SaveAs(fn, EXTASS, -1, CTextFile::UTF8) || !f.Open(fn, CFile::modeRead)) {
- return E_FAIL;
- }
+ if (!sts.SaveAs(fn, EXTASS, -1, CTextFile::UTF8) || !f.Open(fn, CFile::modeRead)) {
+ return E_FAIL;
+ }
- int len = (int)f.GetLength();
+ int len = (int)f.GetLength();
- SUBTITLEINFO* psi = (SUBTITLEINFO*)pmt->AllocFormatBuffer(sizeof(SUBTITLEINFO) + len);
- memset(psi, 0, pmt->FormatLength());
- psi->dwOffset = sizeof(SUBTITLEINFO);
- strcpy_s(psi->IsoLang, "eng");
- f.Read(pmt->pbFormat + psi->dwOffset, len);
- f.Close();
+ SUBTITLEINFO* psi = (SUBTITLEINFO*)pmt->AllocFormatBuffer(sizeof(SUBTITLEINFO) + len);
+ memset(psi, 0, pmt->FormatLength());
+ psi->dwOffset = sizeof(SUBTITLEINFO);
+ strcpy_s(psi->IsoLang, "eng");
+ f.Read(pmt->pbFormat + psi->dwOffset, len);
+ f.Close();
- _tremove(fn);
+ _tremove(fn);
- return NOERROR;
+ return NOERROR;
}
//
@@ -727,24 +727,24 @@ HRESULT CSubtitleSourceASS::GetMediaType(CMediaType* pmt)
//
CSubtitleSourceUSF::CSubtitleSourceUSF(LPUNKNOWN lpunk, HRESULT* phr)
- : CSubtitleSource(lpunk, phr, __uuidof(this))
+ : CSubtitleSource(lpunk, phr, __uuidof(this))
{
}
HRESULT CSubtitleSourceUSF::GetMediaType(CMediaType* pmt)
{
- CAutoLock cAutoLock(pStateLock());
+ CAutoLock cAutoLock(pStateLock());
- pmt->InitMediaType();
- pmt->SetType(&MEDIATYPE_Subtitle);
- pmt->SetSubtype(&MEDIASUBTYPE_USF);
- pmt->SetFormatType(&FORMAT_SubtitleInfo);
- SUBTITLEINFO* psi = (SUBTITLEINFO*)pmt->AllocFormatBuffer(sizeof(SUBTITLEINFO));
- memset(psi, 0, pmt->FormatLength());
- strcpy_s(psi->IsoLang, "eng");
- // TODO: ...
+ pmt->InitMediaType();
+ pmt->SetType(&MEDIATYPE_Subtitle);
+ pmt->SetSubtype(&MEDIASUBTYPE_USF);
+ pmt->SetFormatType(&FORMAT_SubtitleInfo);
+ SUBTITLEINFO* psi = (SUBTITLEINFO*)pmt->AllocFormatBuffer(sizeof(SUBTITLEINFO));
+ memset(psi, 0, pmt->FormatLength());
+ strcpy_s(psi->IsoLang, "eng");
+ // TODO: ...
- return NOERROR;
+ return NOERROR;
}
//
@@ -752,29 +752,29 @@ HRESULT CSubtitleSourceUSF::GetMediaType(CMediaType* pmt)
//
CSubtitleSourcePreview::CSubtitleSourcePreview(LPUNKNOWN lpunk, HRESULT* phr)
- : CSubtitleSource(lpunk, phr, __uuidof(this))
+ : CSubtitleSource(lpunk, phr, __uuidof(this))
{
}
HRESULT CSubtitleSourcePreview::GetMediaType(CMediaType* pmt)
{
- CAutoLock cAutoLock(pStateLock());
+ CAutoLock cAutoLock(pStateLock());
- pmt->InitMediaType();
- pmt->SetType(&MEDIATYPE_Video);
- pmt->SetSubtype(&MEDIASUBTYPE_RGB32);
- pmt->SetFormatType(&FORMAT_VideoInfo);
- VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
- memset(pvih, 0, pmt->FormatLength());
- pvih->bmiHeader.biSize = sizeof(pvih->bmiHeader);
- pvih->bmiHeader.biWidth = _WIDTH;
- pvih->bmiHeader.biHeight = _HEIGHT;
- pvih->bmiHeader.biBitCount = 32;
- pvih->bmiHeader.biCompression = BI_RGB;
- pvih->bmiHeader.biPlanes = 1;
- pvih->bmiHeader.biSizeImage = pvih->bmiHeader.biWidth*abs(pvih->bmiHeader.biHeight)*pvih->bmiHeader.biBitCount>>3;
+ pmt->InitMediaType();
+ pmt->SetType(&MEDIATYPE_Video);
+ pmt->SetSubtype(&MEDIASUBTYPE_RGB32);
+ pmt->SetFormatType(&FORMAT_VideoInfo);
+ VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
+ memset(pvih, 0, pmt->FormatLength());
+ pvih->bmiHeader.biSize = sizeof(pvih->bmiHeader);
+ pvih->bmiHeader.biWidth = _WIDTH;
+ pvih->bmiHeader.biHeight = _HEIGHT;
+ pvih->bmiHeader.biBitCount = 32;
+ pvih->bmiHeader.biCompression = BI_RGB;
+ pvih->bmiHeader.biPlanes = 1;
+ pvih->bmiHeader.biSizeImage = pvih->bmiHeader.biWidth * abs(pvih->bmiHeader.biHeight) * pvih->bmiHeader.biBitCount >> 3;
- return NOERROR;
+ return NOERROR;
}
//
@@ -782,28 +782,28 @@ HRESULT CSubtitleSourcePreview::GetMediaType(CMediaType* pmt)
//
CSubtitleSourceARGB::CSubtitleSourceARGB(LPUNKNOWN lpunk, HRESULT* phr)
- : CSubtitleSource(lpunk, phr, __uuidof(this))
+ : CSubtitleSource(lpunk, phr, __uuidof(this))
{
}
HRESULT CSubtitleSourceARGB::GetMediaType(CMediaType* pmt)
{
- CAutoLock cAutoLock(pStateLock());
-
- pmt->InitMediaType();
- pmt->SetType(&MEDIATYPE_Video);
- pmt->SetSubtype(&MEDIASUBTYPE_ARGB32);
- pmt->SetFormatType(&FORMAT_VideoInfo);
- VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
- memset(pvih, 0, pmt->FormatLength());
- pvih->bmiHeader.biSize = sizeof(pvih->bmiHeader);
- // TODO: read w,h,fps from a config file or registry
- pvih->bmiHeader.biWidth = _WIDTH;
- pvih->bmiHeader.biHeight = _HEIGHT;
- pvih->bmiHeader.biBitCount = 32;
- pvih->bmiHeader.biCompression = BI_RGB;
- pvih->bmiHeader.biPlanes = 1;
- pvih->bmiHeader.biSizeImage = pvih->bmiHeader.biWidth*abs(pvih->bmiHeader.biHeight)*pvih->bmiHeader.biBitCount>>3;
-
- return NOERROR;
+ CAutoLock cAutoLock(pStateLock());
+
+ pmt->InitMediaType();
+ pmt->SetType(&MEDIATYPE_Video);
+ pmt->SetSubtype(&MEDIASUBTYPE_ARGB32);
+ pmt->SetFormatType(&FORMAT_VideoInfo);
+ VIDEOINFOHEADER* pvih = (VIDEOINFOHEADER*)pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
+ memset(pvih, 0, pmt->FormatLength());
+ pvih->bmiHeader.biSize = sizeof(pvih->bmiHeader);
+ // TODO: read w,h,fps from a config file or registry
+ pvih->bmiHeader.biWidth = _WIDTH;
+ pvih->bmiHeader.biHeight = _HEIGHT;
+ pvih->bmiHeader.biBitCount = 32;
+ pvih->bmiHeader.biCompression = BI_RGB;
+ pvih->bmiHeader.biPlanes = 1;
+ pvih->bmiHeader.biSizeImage = pvih->bmiHeader.biWidth * abs(pvih->bmiHeader.biHeight) * pvih->bmiHeader.biBitCount >> 3;
+
+ return NOERROR;
}
diff --git a/src/filters/source/SubtitleSource/SubtitleSource.h b/src/filters/source/SubtitleSource/SubtitleSource.h
index 747e8c8d6..9f42d933a 100644
--- a/src/filters/source/SubtitleSource/SubtitleSource.h
+++ b/src/filters/source/SubtitleSource/SubtitleSource.h
@@ -29,131 +29,131 @@
#define SubtitleSourceName L"MPC Subtitle Source"
class CSubtitleSource
- : public CSource
- , public IFileSourceFilter
- , public IAMFilterMiscFlags
+ : public CSource
+ , public IFileSourceFilter
+ , public IAMFilterMiscFlags
{
protected:
- CStringW m_fn;
+ CStringW m_fn;
public:
- CSubtitleSource(LPUNKNOWN lpunk, HRESULT* phr, const CLSID& clsid);
- virtual ~CSubtitleSource();
+ CSubtitleSource(LPUNKNOWN lpunk, HRESULT* phr, const CLSID& clsid);
+ virtual ~CSubtitleSource();
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // IFileSourceFilter
- STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
- STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
+ // IFileSourceFilter
+ STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
- // IAMFilterMiscFlags
- STDMETHODIMP_(ULONG) GetMiscFlags();
+ // IAMFilterMiscFlags
+ STDMETHODIMP_(ULONG) GetMiscFlags();
- virtual HRESULT GetMediaType(CMediaType* pmt) = 0;
+ virtual HRESULT GetMediaType(CMediaType* pmt) = 0;
- // CBaseFilter
- STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
+ // CBaseFilter
+ STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
};
class CSubtitleStream
- : public CSourceStream
- , public CSourceSeeking
+ : public CSourceStream
+ , public CSourceSeeking
{
- CCritSec m_cSharedState;
+ CCritSec m_cSharedState;
- int m_nPosition;
+ int m_nPosition;
- BOOL m_bDiscontinuity, m_bFlushing;
+ BOOL m_bDiscontinuity, m_bFlushing;
- HRESULT OnThreadStartPlay();
- HRESULT OnThreadCreate();
+ HRESULT OnThreadStartPlay();
+ HRESULT OnThreadCreate();
- void UpdateFromSeek();
- STDMETHODIMP SetRate(double dRate);
+ void UpdateFromSeek();
+ STDMETHODIMP SetRate(double dRate);
- HRESULT ChangeStart();
- HRESULT ChangeStop();
- HRESULT ChangeRate() {
- return S_OK;
- }
+ HRESULT ChangeStart();
+ HRESULT ChangeStop();
+ HRESULT ChangeRate() {
+ return S_OK;
+ }
protected:
- CRenderedTextSubtitle m_rts;
+ CRenderedTextSubtitle m_rts;
public:
- CSubtitleStream(const WCHAR* wfn, CSubtitleSource* pParent, HRESULT* phr);
- virtual ~CSubtitleStream();
+ CSubtitleStream(const WCHAR* wfn, CSubtitleSource* pParent, HRESULT* phr);
+ virtual ~CSubtitleStream();
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT FillBuffer(IMediaSample* pSample);
- HRESULT GetMediaType(CMediaType* pmt);
- HRESULT CheckMediaType(const CMediaType* pmt);
+ HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT FillBuffer(IMediaSample* pSample);
+ HRESULT GetMediaType(CMediaType* pmt);
+ HRESULT CheckMediaType(const CMediaType* pmt);
- STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
+ STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
};
class __declspec(uuid("E44CA3B5-A0FF-41A0-AF16-42429B1095EA"))
- CSubtitleSourceASCII : public CSubtitleSource
+ CSubtitleSourceASCII : public CSubtitleSource
{
public:
- CSubtitleSourceASCII(LPUNKNOWN lpunk, HRESULT* phr);
+ CSubtitleSourceASCII(LPUNKNOWN lpunk, HRESULT* phr);
- HRESULT GetMediaType(CMediaType* pmt);
+ HRESULT GetMediaType(CMediaType* pmt);
};
class __declspec(uuid("87864E0F-7073-4E39-B802-143DE0ED4964"))
- CSubtitleSourceUTF8 : public CSubtitleSource
+ CSubtitleSourceUTF8 : public CSubtitleSource
{
public:
- CSubtitleSourceUTF8(LPUNKNOWN lpunk, HRESULT* phr);
+ CSubtitleSourceUTF8(LPUNKNOWN lpunk, HRESULT* phr);
- HRESULT GetMediaType(CMediaType* pmt);
+ HRESULT GetMediaType(CMediaType* pmt);
};
class __declspec(uuid("18316B1A-5877-4CC4-85FD-EDE65CD489EC"))
- CSubtitleSourceSSA : public CSubtitleSource
+ CSubtitleSourceSSA : public CSubtitleSource
{
public:
- CSubtitleSourceSSA(LPUNKNOWN lpunk, HRESULT* phr);
+ CSubtitleSourceSSA(LPUNKNOWN lpunk, HRESULT* phr);
- HRESULT GetMediaType(CMediaType* pmt);
+ HRESULT GetMediaType(CMediaType* pmt);
};
class __declspec(uuid("416782BC-1D87-48C0-8F65-F113A5CB8E15"))
- CSubtitleSourceASS : public CSubtitleSource
+ CSubtitleSourceASS : public CSubtitleSource
{
public:
- CSubtitleSourceASS(LPUNKNOWN lpunk, HRESULT* phr);
+ CSubtitleSourceASS(LPUNKNOWN lpunk, HRESULT* phr);
- HRESULT GetMediaType(CMediaType* pmt);
+ HRESULT GetMediaType(CMediaType* pmt);
};
class __declspec(uuid("D7215AFC-DFE6-483B-9AF3-6BBECFF14CF4"))
- CSubtitleSourceUSF : public CSubtitleSource
+ CSubtitleSourceUSF : public CSubtitleSource
{
public:
- CSubtitleSourceUSF(LPUNKNOWN lpunk, HRESULT* phr);
+ CSubtitleSourceUSF(LPUNKNOWN lpunk, HRESULT* phr);
- HRESULT GetMediaType(CMediaType* pmt);
+ HRESULT GetMediaType(CMediaType* pmt);
};
class __declspec(uuid("932E75D4-BBD4-4A0F-9071-6728FBDC4C98"))
- CSubtitleSourcePreview : public CSubtitleSource
+ CSubtitleSourcePreview : public CSubtitleSource
{
public:
- CSubtitleSourcePreview(LPUNKNOWN lpunk, HRESULT* phr);
+ CSubtitleSourcePreview(LPUNKNOWN lpunk, HRESULT* phr);
- HRESULT GetMediaType(CMediaType* pmt);
+ HRESULT GetMediaType(CMediaType* pmt);
};
class __declspec(uuid("CF0D7280-527D-415E-BA02-56017484D73E"))
- CSubtitleSourceARGB : public CSubtitleSource
+ CSubtitleSourceARGB : public CSubtitleSource
{
public:
- CSubtitleSourceARGB(LPUNKNOWN lpunk, HRESULT* phr);
+ CSubtitleSourceARGB(LPUNKNOWN lpunk, HRESULT* phr);
- HRESULT GetMediaType(CMediaType* pmt);
+ HRESULT GetMediaType(CMediaType* pmt);
};
diff --git a/src/filters/switcher/AudioSwitcher/Audio.cpp b/src/filters/switcher/AudioSwitcher/Audio.cpp
index 7a400dde5..0ef740e6a 100644
--- a/src/filters/switcher/AudioSwitcher/Audio.cpp
+++ b/src/filters/switcher/AudioSwitcher/Audio.cpp
@@ -25,300 +25,300 @@
#include "stdafx.h"
#include "Audio.h"
-static long audio_pointsample_8(void *dst, void *src, long accum, long samp_frac, long cnt)
+static long audio_pointsample_8(void* dst, void* src, long accum, long samp_frac, long cnt)
{
- unsigned char *d = (unsigned char *)dst;
- unsigned char *s = (unsigned char *)src;
+ unsigned char* d = (unsigned char*)dst;
+ unsigned char* s = (unsigned char*)src;
- do {
- *d++ = s[accum>>19];
- accum += samp_frac;
- } while (--cnt);
+ do {
+ *d++ = s[accum >> 19];
+ accum += samp_frac;
+ } while (--cnt);
- return accum;
+ return accum;
}
-static long audio_pointsample_16(void *dst, void *src, long accum, long samp_frac, long cnt)
+static long audio_pointsample_16(void* dst, void* src, long accum, long samp_frac, long cnt)
{
- unsigned short *d = (unsigned short *)dst;
- unsigned short *s = (unsigned short *)src;
+ unsigned short* d = (unsigned short*)dst;
+ unsigned short* s = (unsigned short*)src;
- do {
- *d++ = s[accum>>19];
- accum += samp_frac;
- } while (--cnt);
+ do {
+ *d++ = s[accum >> 19];
+ accum += samp_frac;
+ } while (--cnt);
- return accum;
+ return accum;
}
-static long audio_pointsample_32(void *dst, void *src, long accum, long samp_frac, long cnt)
+static long audio_pointsample_32(void* dst, void* src, long accum, long samp_frac, long cnt)
{
- unsigned long *d = (unsigned long *)dst;
- unsigned long *s = (unsigned long *)src;
+ unsigned long* d = (unsigned long*)dst;
+ unsigned long* s = (unsigned long*)src;
- do {
- *d++ = s[accum>>19];
- accum += samp_frac;
- } while (--cnt);
+ do {
+ *d++ = s[accum >> 19];
+ accum += samp_frac;
+ } while (--cnt);
- return accum;
+ return accum;
}
-static long audio_downsample_mono8(void *dst, void *src, long *filter_bank, int filter_width, long accum, long samp_frac, long cnt)
+static long audio_downsample_mono8(void* dst, void* src, long* filter_bank, int filter_width, long accum, long samp_frac, long cnt)
{
- unsigned char *d = (unsigned char *)dst;
- unsigned char *s = (unsigned char *)src;
-
- do {
- long sum = 0;
- int w;
- long *fb_ptr;
- unsigned char *s_ptr;
-
- w = filter_width;
- fb_ptr = filter_bank + filter_width * ((accum>>11)&0xff);
- s_ptr = s + (accum>>19);
- do {
- sum += *fb_ptr++ * (int)*s_ptr++;
- } while (--w);
-
- if (sum < 0) {
- *d++ = 0;
- } else if (sum > 0x3fffff) {
- *d++ = 0xff;
- } else {
- *d++ = (unsigned char)((sum + 0x2000) >> 14);
- }
-
- accum += samp_frac;
- } while (--cnt);
-
- return accum;
+ unsigned char* d = (unsigned char*)dst;
+ unsigned char* s = (unsigned char*)src;
+
+ do {
+ long sum = 0;
+ int w;
+ long* fb_ptr;
+ unsigned char* s_ptr;
+
+ w = filter_width;
+ fb_ptr = filter_bank + filter_width * ((accum >> 11) & 0xff);
+ s_ptr = s + (accum >> 19);
+ do {
+ sum += *fb_ptr++ * (int) * s_ptr++;
+ } while (--w);
+
+ if (sum < 0) {
+ *d++ = 0;
+ } else if (sum > 0x3fffff) {
+ *d++ = 0xff;
+ } else {
+ *d++ = (unsigned char)((sum + 0x2000) >> 14);
+ }
+
+ accum += samp_frac;
+ } while (--cnt);
+
+ return accum;
}
-static long audio_downsample_mono16(void *dst, void *src, long *filter_bank, int filter_width, long accum, long samp_frac, long cnt)
+static long audio_downsample_mono16(void* dst, void* src, long* filter_bank, int filter_width, long accum, long samp_frac, long cnt)
{
- signed short *d = (signed short *)dst;
- signed short *s = (signed short *)src;
-
- do {
- long sum = 0;
- int w;
- long *fb_ptr;
- signed short *s_ptr;
-
- w = filter_width;
- fb_ptr = filter_bank + filter_width * ((accum>>11)&0xff);
- s_ptr = s + (accum>>19);
- do {
- sum += *fb_ptr++ * (int)*s_ptr++;
- } while (--w);
-
- if (sum < -0x20000000) {
- *d++ = -0x8000;
- } else if (sum > 0x1fffffff) {
- *d++ = 0x7fff;
- } else {
- *d++ = (signed short)((sum + 0x2000) >> 14);
- }
-
- accum += samp_frac;
- } while (--cnt);
-
- return accum;
+ signed short* d = (signed short*)dst;
+ signed short* s = (signed short*)src;
+
+ do {
+ long sum = 0;
+ int w;
+ long* fb_ptr;
+ signed short* s_ptr;
+
+ w = filter_width;
+ fb_ptr = filter_bank + filter_width * ((accum >> 11) & 0xff);
+ s_ptr = s + (accum >> 19);
+ do {
+ sum += *fb_ptr++ * (int) * s_ptr++;
+ } while (--w);
+
+ if (sum < -0x20000000) {
+ *d++ = -0x8000;
+ } else if (sum > 0x1fffffff) {
+ *d++ = 0x7fff;
+ } else {
+ *d++ = (signed short)((sum + 0x2000) >> 14);
+ }
+
+ accum += samp_frac;
+ } while (--cnt);
+
+ return accum;
}
static int permute_index(int a, int b)
{
- return (b-(a>>8)-1) + (a&255)*b;
+ return (b - (a >> 8) - 1) + (a & 255) * b;
}
-static void make_downsample_filter(long *filter_bank, int filter_width, long samp_frac)
+static void make_downsample_filter(long* filter_bank, int filter_width, long samp_frac)
{
- int i, j, v;
- double filt_max;
- double filtwidth_frac;
+ int i, j, v;
+ double filt_max;
+ double filtwidth_frac;
- filtwidth_frac = samp_frac/2048.0;
+ filtwidth_frac = samp_frac / 2048.0;
- filter_bank[filter_width-1] = 0;
+ filter_bank[filter_width - 1] = 0;
- filt_max = (16384.0 * 524288.0) / samp_frac;
+ filt_max = (16384.0 * 524288.0) / samp_frac;
- for (i=0; i<128*filter_width; i++) {
- int y = 0;
- double d = i / filtwidth_frac;
+ for (i = 0; i < 128 * filter_width; i++) {
+ int y = 0;
+ double d = i / filtwidth_frac;
- if (d<1.0) {
- y = (int)(0.5 + filt_max*(1.0 - d));
- }
+ if (d < 1.0) {
+ y = (int)(0.5 + filt_max * (1.0 - d));
+ }
- filter_bank[permute_index(128*filter_width + i, filter_width)]
- = filter_bank[permute_index(128*filter_width - i, filter_width)]
- = y;
- }
+ filter_bank[permute_index(128 * filter_width + i, filter_width)]
+ = filter_bank[permute_index(128 * filter_width - i, filter_width)]
+ = y;
+ }
- // Normalize the filter to correct for integer roundoff errors
+ // Normalize the filter to correct for integer roundoff errors
- for (i=0; i<256*filter_width; i+=filter_width) {
- v=0;
- for (j=0; j<filter_width; j++) {
- v += filter_bank[i+j];
- }
+ for (i = 0; i < 256 * filter_width; i += filter_width) {
+ v = 0;
+ for (j = 0; j < filter_width; j++) {
+ v += filter_bank[i + j];
+ }
- // _RPT2(0,"error[%02x] = %04x\n", i/filter_width, 0x4000 - v);
+ // _RPT2(0,"error[%02x] = %04x\n", i/filter_width, 0x4000 - v);
- v = (0x4000 - v)/filter_width;
- for (j=0; j<filter_width; j++) {
- filter_bank[i+j] += v;
- }
- }
+ v = (0x4000 - v) / filter_width;
+ for (j = 0; j < filter_width; j++) {
+ filter_bank[i + j] += v;
+ }
+ }
- // _CrtCheckMemory();
+ // _CrtCheckMemory();
}
AudioStreamResampler::AudioStreamResampler(int bps, long org_rate, long new_rate, bool fHighQuality)
{
- samp_frac = 0x80000;
+ samp_frac = 0x80000;
- this->bps = bps;
+ this->bps = bps;
- if (bps == 1) {
- ptsampleRout = audio_pointsample_8;
- dnsampleRout = audio_downsample_mono8;
- } else if (bps >= 2) {
- ptsampleRout = audio_pointsample_16;
- dnsampleRout = audio_downsample_mono16;
- } else {
- return;
- }
+ if (bps == 1) {
+ ptsampleRout = audio_pointsample_8;
+ dnsampleRout = audio_downsample_mono8;
+ } else if (bps >= 2) {
+ ptsampleRout = audio_pointsample_16;
+ dnsampleRout = audio_downsample_mono16;
+ } else {
+ return;
+ }
- // org_rate > new_rate!
- samp_frac = MulDiv(org_rate, 0x80000, new_rate);
+ // org_rate > new_rate!
+ samp_frac = MulDiv(org_rate, 0x80000, new_rate);
- holdover = 0;
- filter_bank = NULL;
- filter_width = 1;
- accum = 0;
+ holdover = 0;
+ filter_bank = NULL;
+ filter_width = 1;
+ accum = 0;
- // If this is a high-quality downsample, allocate memory for the filter bank
+ // If this is a high-quality downsample, allocate memory for the filter bank
- if (fHighQuality) {
- if (samp_frac>0x80000) {
- // HQ downsample: allocate filter bank
+ if (fHighQuality) {
+ if (samp_frac > 0x80000) {
+ // HQ downsample: allocate filter bank
- filter_width = ((samp_frac + 0x7ffff)>>19)<<1 <<1;
+ filter_width = ((samp_frac + 0x7ffff) >> 19) << 1 << 1;
- filter_bank = DNew long[filter_width * 256];
- if (!filter_bank) {
- filter_width = 1;
- return;
- }
+ filter_bank = DNew long[filter_width * 256];
+ if (!filter_bank) {
+ filter_width = 1;
+ return;
+ }
- make_downsample_filter(filter_bank, filter_width, samp_frac);
+ make_downsample_filter(filter_bank, filter_width, samp_frac);
- // Clear lower samples
+ // Clear lower samples
- memset(cbuffer, bps >= 2 ? 0 : 0x80, bps*filter_width);
+ memset(cbuffer, bps >= 2 ? 0 : 0x80, bps * filter_width);
- holdover = filter_width/2;
- }
- }
+ holdover = filter_width / 2;
+ }
+ }
}
AudioStreamResampler::~AudioStreamResampler()
{
- delete [] filter_bank;
+ delete [] filter_bank;
}
long AudioStreamResampler::Downsample(void* input, long samplesin, void* output, long samplesout)
{
- long lActualSamples = 0;
+ long lActualSamples = 0;
- // Downsampling is even worse because we have overlap to the left and to the
- // right of the interpolated point.
- //
- // We need (n/2) points to the left and (n/2-1) points to the right.
+ // Downsampling is even worse because we have overlap to the left and to the
+ // right of the interpolated point.
+ //
+ // We need (n/2) points to the left and (n/2-1) points to the right.
- while (samplesin > 0 && samplesout > 0) {
- long srcSamples, dstSamples;
- int nhold;
+ while (samplesin > 0 && samplesout > 0) {
+ long srcSamples, dstSamples;
+ int nhold;
- // Figure out how many source samples we need.
- //
- // To do this, compute the highest fixed-point accumulator we'll reach.
- // Truncate that, and add the filter width. Then subtract however many
- // samples are sitting at the bottom of the buffer.
+ // Figure out how many source samples we need.
+ //
+ // To do this, compute the highest fixed-point accumulator we'll reach.
+ // Truncate that, and add the filter width. Then subtract however many
+ // samples are sitting at the bottom of the buffer.
- srcSamples = (long)(((__int64)samp_frac*(samplesout-1) + accum) >> 19) + filter_width - holdover;
+ srcSamples = (long)(((__int64)samp_frac * (samplesout - 1) + accum) >> 19) + filter_width - holdover;
- // Don't exceed the buffer (BUFFER_SIZE - holdover).
+ // Don't exceed the buffer (BUFFER_SIZE - holdover).
- if (srcSamples > BUFFER_SIZE - holdover) {
- srcSamples = BUFFER_SIZE - holdover;
- }
+ if (srcSamples > BUFFER_SIZE - holdover) {
+ srcSamples = BUFFER_SIZE - holdover;
+ }
- // Read into buffer.
+ // Read into buffer.
- srcSamples = min(srcSamples, samplesin);
- if (!srcSamples) {
- break;
- }
+ srcSamples = min(srcSamples, samplesin);
+ if (!srcSamples) {
+ break;
+ }
- memcpy((char*)cbuffer + holdover*bps, (char*)input, srcSamples*bps);
- input = (void *)((char *)input + srcSamples*bps);
+ memcpy((char*)cbuffer + holdover * bps, (char*)input, srcSamples * bps);
+ input = (void*)((char*)input + srcSamples * bps);
- // Figure out how many destination samples we'll get out of what we
- // read. We'll have (srcSamples+holdover) bytes, so the maximum
- // fixed-pt accumulator we can hit is
- // (srcSamples+holdover-filter_width)<<16 + 0xffff.
+ // Figure out how many destination samples we'll get out of what we
+ // read. We'll have (srcSamples+holdover) bytes, so the maximum
+ // fixed-pt accumulator we can hit is
+ // (srcSamples+holdover-filter_width)<<16 + 0xffff.
- dstSamples = (((__int64)(srcSamples+holdover-filter_width)<<19) + 0x7ffff - accum) / samp_frac + 1;
+ dstSamples = (((__int64)(srcSamples + holdover - filter_width) << 19) + 0x7ffff - accum) / samp_frac + 1;
- if (dstSamples > samplesout) {
- dstSamples = samplesout;
- }
+ if (dstSamples > samplesout) {
+ dstSamples = samplesout;
+ }
- if (dstSamples >= 1) {
- if (filter_bank) {
- accum = dnsampleRout(output, cbuffer, filter_bank, filter_width, accum, samp_frac, dstSamples);
- } else {
- accum = ptsampleRout(output, cbuffer, accum, samp_frac, dstSamples);
- }
+ if (dstSamples >= 1) {
+ if (filter_bank) {
+ accum = dnsampleRout(output, cbuffer, filter_bank, filter_width, accum, samp_frac, dstSamples);
+ } else {
+ accum = ptsampleRout(output, cbuffer, accum, samp_frac, dstSamples);
+ }
- output = (void *)((char *)output + bps * dstSamples);
- lActualSamples += dstSamples;
- samplesout -= dstSamples;
- }
+ output = (void*)((char*)output + bps * dstSamples);
+ lActualSamples += dstSamples;
+ samplesout -= dstSamples;
+ }
- // We're "shifting" the new samples down to the bottom by discarding
- // all the samples in the buffer, so adjust the fixed-pt accum
- // accordingly.
+ // We're "shifting" the new samples down to the bottom by discarding
+ // all the samples in the buffer, so adjust the fixed-pt accum
+ // accordingly.
- accum -= ((srcSamples+holdover)<<19);
+ accum -= ((srcSamples + holdover) << 19);
- // Oops, did we need some of those?
- //
- // If accum=0, we need (n/2) samples back. accum>=0x10000 is fewer,
- // accum<0 is more.
+ // Oops, did we need some of those?
+ //
+ // If accum=0, we need (n/2) samples back. accum>=0x10000 is fewer,
+ // accum<0 is more.
- nhold = - (accum>>19);
+ nhold = - (accum >> 19);
- //_ASSERT(nhold<=(filter_width/2));
+ //_ASSERT(nhold<=(filter_width/2));
- if (nhold>0) {
- memmove(cbuffer, (char *)cbuffer+bps*(srcSamples+holdover-nhold), bps*nhold);
- holdover = nhold;
- accum += nhold<<19;
- } else {
- holdover = 0;
- }
+ if (nhold > 0) {
+ memmove(cbuffer, (char*)cbuffer + bps * (srcSamples + holdover - nhold), bps * nhold);
+ holdover = nhold;
+ accum += nhold << 19;
+ } else {
+ holdover = 0;
+ }
- //_ASSERT(accum>=0);
- }
+ //_ASSERT(accum>=0);
+ }
- int Bytes = lActualSamples * bps;
- UNREFERENCED_PARAMETER(Bytes);
+ int Bytes = lActualSamples * bps;
+ UNREFERENCED_PARAMETER(Bytes);
- return lActualSamples;
+ return lActualSamples;
}
diff --git a/src/filters/switcher/AudioSwitcher/Audio.h b/src/filters/switcher/AudioSwitcher/Audio.h
index d5230e74a..1611bda44 100644
--- a/src/filters/switcher/AudioSwitcher/Audio.h
+++ b/src/filters/switcher/AudioSwitcher/Audio.h
@@ -28,28 +28,28 @@
#include <mmsystem.h>
#include <msacm.h>
-typedef long (*AudioPointSampler)(void *, void *, long, long, long);
-typedef long (*AudioDownSampler)(void *, void *, long *, int, long, long, long);
+typedef long(*AudioPointSampler)(void*, void*, long, long, long);
+typedef long(*AudioDownSampler)(void*, void*, long*, int, long, long, long);
class AudioStreamResampler
{
private:
- AudioPointSampler ptsampleRout;
- AudioDownSampler dnsampleRout;
- long samp_frac;
- long accum;
- int holdover;
- long *filter_bank;
- int filter_width;
- bool fHighQuality;
+ AudioPointSampler ptsampleRout;
+ AudioDownSampler dnsampleRout;
+ long samp_frac;
+ long accum;
+ int holdover;
+ long* filter_bank;
+ int filter_width;
+ bool fHighQuality;
- enum { BUFFER_SIZE=512 };
- BYTE cbuffer[4*BUFFER_SIZE];
- int bps;
+ enum { BUFFER_SIZE = 512 };
+ BYTE cbuffer[4 * BUFFER_SIZE];
+ int bps;
public:
- AudioStreamResampler(int bps, long org_rate, long new_rate, bool fHighQuality);
- ~AudioStreamResampler();
+ AudioStreamResampler(int bps, long org_rate, long new_rate, bool fHighQuality);
+ ~AudioStreamResampler();
- long Downsample(void* input, long samplesin, void* output, long samplesout);
+ long Downsample(void* input, long samplesin, void* output, long samplesout);
};
diff --git a/src/filters/switcher/AudioSwitcher/AudioSwitcher.cpp b/src/filters/switcher/AudioSwitcher/AudioSwitcher.cpp
index 883a58fbe..4ba2ff5d4 100644
--- a/src/filters/switcher/AudioSwitcher/AudioSwitcher.cpp
+++ b/src/filters/switcher/AudioSwitcher/AudioSwitcher.cpp
@@ -44,36 +44,36 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_NULL}
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_NULL}
};
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_NULL}
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_NULL}
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CAudioSwitcherFilter), AudioSwitcherName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CAudioSwitcherFilter), AudioSwitcherName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CAudioSwitcherFilter>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CAudioSwitcherFilter>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -87,577 +87,577 @@ CFilterApp theApp;
//
CAudioSwitcherFilter::CAudioSwitcherFilter(LPUNKNOWN lpunk, HRESULT* phr)
- : CStreamSwitcherFilter(lpunk, phr, __uuidof(this))
- , m_fCustomChannelMapping(false)
- , m_fDownSampleTo441(false)
- , m_rtAudioTimeShift(0)
- , m_rtNextStart(0)
- , m_rtNextStop(1)
- , m_fNormalize(false)
- , m_fNormalizeRecover(false)
- , m_boost_mul(1)
- , m_sample_max(0.1f)
+ : CStreamSwitcherFilter(lpunk, phr, __uuidof(this))
+ , m_fCustomChannelMapping(false)
+ , m_fDownSampleTo441(false)
+ , m_rtAudioTimeShift(0)
+ , m_rtNextStart(0)
+ , m_rtNextStop(1)
+ , m_fNormalize(false)
+ , m_fNormalizeRecover(false)
+ , m_boost_mul(1)
+ , m_sample_max(0.1f)
{
- memset(m_pSpeakerToChannelMap, 0, sizeof(m_pSpeakerToChannelMap));
-
- if (phr) {
- if (FAILED(*phr)) {
- return;
- } else {
- *phr = S_OK;
- }
- }
+ memset(m_pSpeakerToChannelMap, 0, sizeof(m_pSpeakerToChannelMap));
+
+ if (phr) {
+ if (FAILED(*phr)) {
+ return;
+ } else {
+ *phr = S_OK;
+ }
+ }
}
STDMETHODIMP CAudioSwitcherFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- return
- QI(IAudioSwitcherFilter)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IAudioSwitcherFilter)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CAudioSwitcherFilter::CheckMediaType(const CMediaType* pmt)
{
- if (pmt->formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)pmt->pbFormat)->nChannels > 2
- && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag != WAVE_FORMAT_EXTENSIBLE) {
- return VFW_E_INVALIDMEDIATYPE; // stupid iviaudio tries to fool us
- }
-
- return (pmt->majortype == MEDIATYPE_Audio
- && pmt->formattype == FORMAT_WaveFormatEx
- && (((WAVEFORMATEX*)pmt->pbFormat)->wBitsPerSample == 8
- || ((WAVEFORMATEX*)pmt->pbFormat)->wBitsPerSample == 16
- || ((WAVEFORMATEX*)pmt->pbFormat)->wBitsPerSample == 24
- || ((WAVEFORMATEX*)pmt->pbFormat)->wBitsPerSample == 32)
- && (((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_PCM
- || ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_IEEE_FLOAT
- || ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DOLBY_AC3_SPDIF
- || ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_EXTENSIBLE))
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ if (pmt->formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)pmt->pbFormat)->nChannels > 2
+ && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag != WAVE_FORMAT_EXTENSIBLE) {
+ return VFW_E_INVALIDMEDIATYPE; // stupid iviaudio tries to fool us
+ }
+
+ return (pmt->majortype == MEDIATYPE_Audio
+ && pmt->formattype == FORMAT_WaveFormatEx
+ && (((WAVEFORMATEX*)pmt->pbFormat)->wBitsPerSample == 8
+ || ((WAVEFORMATEX*)pmt->pbFormat)->wBitsPerSample == 16
+ || ((WAVEFORMATEX*)pmt->pbFormat)->wBitsPerSample == 24
+ || ((WAVEFORMATEX*)pmt->pbFormat)->wBitsPerSample == 32)
+ && (((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_PCM
+ || ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_IEEE_FLOAT
+ || ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DOLBY_AC3_SPDIF
+ || ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_EXTENSIBLE))
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
template<class T, class U, int Umin, int Umax>
__forceinline void mix(DWORD mask, int ch, int bps, BYTE* src, BYTE* dst)
{
- U sum = 0;
+ U sum = 0;
- for (int i = 0, j = ch; i < j; i++) {
- if (mask & (1<<i)) {
- sum += *(T*)&src[bps*i];
- }
- }
+ for (int i = 0, j = ch; i < j; i++) {
+ if (mask & (1 << i)) {
+ sum += *(T*)&src[bps * i];
+ }
+ }
- if (sum < Umin) {
- sum = Umin;
- } else if (sum > Umax) {
- sum = Umax;
- }
+ if (sum < Umin) {
+ sum = Umin;
+ } else if (sum > Umax) {
+ sum = Umax;
+ }
- *(T*)dst = (T)sum;
+ *(T*)dst = (T)sum;
}
template<>
__forceinline void mix<int, INT64, INT24_MIN, INT24_MAX>(DWORD mask, int ch, int bps, BYTE* src, BYTE* dst)
{
- INT64 sum = 0;
+ INT64 sum = 0;
- for (int i = 0, j = ch; i < j; i++) {
- if (mask & (1<<i)) {
- int tmp;
- memcpy((BYTE*)&tmp+1, &src[bps*i], 3);
- sum += tmp >> 8;
- }
- }
+ for (int i = 0, j = ch; i < j; i++) {
+ if (mask & (1 << i)) {
+ int tmp;
+ memcpy((BYTE*)&tmp + 1, &src[bps * i], 3);
+ sum += tmp >> 8;
+ }
+ }
- sum = min(max(sum, INT24_MIN), INT24_MAX);
+ sum = min(max(sum, INT24_MIN), INT24_MAX);
- memcpy(dst, (BYTE*)&sum, 3);
+ memcpy(dst, (BYTE*)&sum, 3);
}
template<class T, class U, int Umin, int Umax>
__forceinline void mix4(DWORD mask, BYTE* src, BYTE* dst)
{
- U sum = 0;
- int bps = sizeof T;
-
- if (mask & (1<<0)) {
- sum += *(T*)&src[bps*0];
- }
- if (mask & (1<<1)) {
- sum += *(T*)&src[bps*1];
- }
- if (mask & (1<<2)) {
- sum += *(T*)&src[bps*2];
- }
- if (mask & (1<<3)) {
- sum += *(T*)&src[bps*3];
- }
-
- if (sum < Umin) {
- sum = Umin;
- } else if (sum > Umax) {
- sum = Umax;
- }
-
- *(T*)dst = (T)sum;
+ U sum = 0;
+ int bps = sizeof T;
+
+ if (mask & (1 << 0)) {
+ sum += *(T*)&src[bps * 0];
+ }
+ if (mask & (1 << 1)) {
+ sum += *(T*)&src[bps * 1];
+ }
+ if (mask & (1 << 2)) {
+ sum += *(T*)&src[bps * 2];
+ }
+ if (mask & (1 << 3)) {
+ sum += *(T*)&src[bps * 3];
+ }
+
+ if (sum < Umin) {
+ sum = Umin;
+ } else if (sum > Umax) {
+ sum = Umax;
+ }
+
+ *(T*)dst = (T)sum;
}
template<class T>
T clamp(double s, T smin, T smax)
{
- if (s < -1) {
- s = -1;
- } else if (s > 1) {
- s = 1;
- }
- T t = (T)(s * smax);
- if (t < smin) {
- t = smin;
- } else if (t > smax) {
- t = smax;
- }
- return t;
+ if (s < -1) {
+ s = -1;
+ } else if (s > 1) {
+ s = 1;
+ }
+ T t = (T)(s * smax);
+ if (t < smin) {
+ t = smin;
+ } else if (t > smax) {
+ t = smax;
+ }
+ return t;
}
HRESULT CAudioSwitcherFilter::Transform(IMediaSample* pIn, IMediaSample* pOut)
{
- CStreamSwitcherInputPin* pInPin = GetInputPin();
- CStreamSwitcherOutputPin* pOutPin = GetOutputPin();
- if (!pInPin || !pOutPin) {
- return __super::Transform(pIn, pOut);
- }
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)pInPin->CurrentMediaType().pbFormat;
- WAVEFORMATEX* wfeout = (WAVEFORMATEX*)pOutPin->CurrentMediaType().pbFormat;
- WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)wfe;
-
- int bps = wfe->wBitsPerSample>>3;
-
- int len = pIn->GetActualDataLength() / (bps*wfe->nChannels);
- int lenout = (UINT64)len * wfeout->nSamplesPerSec / wfe->nSamplesPerSec;
-
- REFERENCE_TIME rtStart, rtStop;
- if (SUCCEEDED(pIn->GetTime(&rtStart, &rtStop))) {
- rtStart += m_rtAudioTimeShift;
- rtStop += m_rtAudioTimeShift;
- pOut->SetTime(&rtStart, &rtStop);
-
- m_rtNextStart = rtStart;
- m_rtNextStop = rtStop;
- } else {
- pOut->SetTime(&m_rtNextStart, &m_rtNextStop);
- }
-
- REFERENCE_TIME rtDur = 10000000i64*len/wfe->nSamplesPerSec;
-
- m_rtNextStart += rtDur;
- m_rtNextStop += rtDur;
-
- if (pIn->IsDiscontinuity() == S_OK) {
- m_sample_max = 0.1f;
- }
-
- WORD tag = wfe->wFormatTag;
- bool fPCM = tag == WAVE_FORMAT_PCM || tag == WAVE_FORMAT_EXTENSIBLE && wfex->SubFormat == KSDATAFORMAT_SUBTYPE_PCM;
- bool fFloat = tag == WAVE_FORMAT_IEEE_FLOAT || tag == WAVE_FORMAT_EXTENSIBLE && wfex->SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;
- if (!fPCM && !fFloat) {
- return __super::Transform(pIn, pOut);
- }
-
- BYTE* pDataIn = NULL;
- BYTE* pDataOut = NULL;
-
- HRESULT hr;
- if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
- return hr;
- }
- if (FAILED(hr = pOut->GetPointer(&pDataOut))) {
- return hr;
- }
-
- if (!pDataIn || !pDataOut || len < 0 || lenout < 0) {
- return S_FALSE;
- }
- // len = 0 doesn't mean it's failed, return S_OK otherwise might screw the sound
- if (len == 0) {
- pOut->SetActualDataLength(0);
- return S_OK;
- }
-
- if (m_fCustomChannelMapping) {
- size_t channelsCount = m_chs[wfe->nChannels-1].GetCount();
- if (channelsCount > 0 && wfeout->nChannels <= channelsCount) {
- for (int i = 0; i < wfeout->nChannels; i++) {
- DWORD mask = m_chs[wfe->nChannels-1][i].Channel;
-
- BYTE* src = pDataIn;
- BYTE* dst = &pDataOut[bps*i];
-
- int srcstep = bps*wfe->nChannels;
- int dststep = bps*wfeout->nChannels;
- int channels = min(18, wfe->nChannels);
- if (fPCM && wfe->wBitsPerSample == 8) {
- for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
- mix<unsigned char, INT64, 0, UCHAR_MAX>(mask, channels, bps, src, dst);
- }
- } else if (fPCM && wfe->wBitsPerSample == 16) {
- if (wfe->nChannels != 4 || wfeout->nChannels != 4) {
- for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
- mix<short, INT64, SHRT_MIN, SHRT_MAX>(mask, channels, bps, src, dst);
- }
- } else { // most popular channels count
- for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
- mix4<short, INT64, SHRT_MIN, SHRT_MAX>(mask, src, dst);
- }
- }
- } else if (fPCM && wfe->wBitsPerSample == 24) {
- for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
- mix<int, INT64, INT24_MIN, INT24_MAX>(mask, channels, bps, src, dst);
- }
- } else if (fPCM && wfe->wBitsPerSample == 32) {
- for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
- mix<int, __int64, INT_MIN, INT_MAX>(mask, channels, bps, src, dst);
- }
- } else if (fFloat && wfe->wBitsPerSample == 32) {
- for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
- mix<float, double, -1, 1>(mask, channels, bps, src, dst);
- }
- } else if (fFloat && wfe->wBitsPerSample == 64) {
- for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
- mix<double, double, -1, 1>(mask, channels, bps, src, dst);
- }
- }
- }
- } else {
- BYTE* pDataOut = NULL;
- HRESULT hr;
- if (FAILED(hr = pOut->GetPointer(&pDataOut)) || !pDataOut) {
- return hr;
- }
- memset(pDataOut, 0, pOut->GetSize());
- }
- } else {
- HRESULT hr;
- if (S_OK != (hr = __super::Transform(pIn, pOut))) {
- return hr;
- }
- }
-
- if (m_fDownSampleTo441
- && wfe->nSamplesPerSec > 44100 && wfeout->nSamplesPerSec == 44100
- && wfe->wBitsPerSample <= 16 && fPCM) {
- if (BYTE* buff = DNew BYTE[len*bps]) {
- for (int ch = 0; ch < wfeout->nChannels; ch++) {
- memset(buff, 0, len*bps);
-
- for (int i = 0; i < len; i++) {
- memcpy(buff + i*bps, (char*)pDataOut + (ch + i*wfeout->nChannels)*bps, bps);
- }
-
- m_pResamplers[ch]->Downsample(buff, len, buff, lenout);
-
- for (int i = 0; i < lenout; i++) {
- memcpy((char*)pDataOut + (ch + i*wfeout->nChannels)*bps, buff + i*bps, bps);
- }
- }
-
- delete [] buff;
- }
- }
-
- if (m_fNormalize || m_boost_mul > 1) {
- int samples = lenout*wfeout->nChannels;
-
- if (double* buff = DNew double[samples]) {
- for (int i = 0; i < samples; i++) {
- if (fPCM && wfe->wBitsPerSample == 8) {
- buff[i] = (double)((BYTE*)pDataOut)[i] / UCHAR_MAX;
- } else if (fPCM && wfe->wBitsPerSample == 16) {
- buff[i] = (double)((short*)pDataOut)[i] / SHRT_MAX;
- } else if (fPCM && wfe->wBitsPerSample == 24) {
- int tmp;
- memcpy(((BYTE*)&tmp)+1, &pDataOut[i*3], 3);
- buff[i] = (float)(tmp >> 8) / ((1<<23)-1);
- } else if (fPCM && wfe->wBitsPerSample == 32) {
- buff[i] = (double)((int*)pDataOut)[i] / INT_MAX;
- } else if (fFloat && wfe->wBitsPerSample == 32) {
- buff[i] = (double)((float*)pDataOut)[i];
- } else if (fFloat && wfe->wBitsPerSample == 64) {
- buff[i] = ((double*)pDataOut)[i];
- }
- }
-
- double sample_mul = 1;
-
- if (m_fNormalize) {
- for (int i = 0; i < samples; i++) {
- double s = buff[i];
- if (s < 0) {
- s = -s;
- }
- if (s > 1) {
- s = 1;
- }
- if (m_sample_max < s) {
- m_sample_max = s;
- }
- }
-
- sample_mul = 1.0f / m_sample_max;
-
- if (m_fNormalizeRecover) {
- m_sample_max -= 1.0*rtDur/200000000; // -5%/sec
- }
- if (m_sample_max < 0.1) {
- m_sample_max = 0.1;
- }
- }
-
- if (m_boost_mul > 1) {
- sample_mul *= m_boost_mul;
- }
-
- for (int i = 0; i < samples; i++) {
- double s = buff[i] * sample_mul;
-
- if (fPCM && wfe->wBitsPerSample == 8) {
- ((BYTE*)pDataOut)[i] = clamp<BYTE>(s, 0, UCHAR_MAX);
- } else if (fPCM && wfe->wBitsPerSample == 16) {
- ((short*)pDataOut)[i] = clamp<short>(s, SHRT_MIN, SHRT_MAX);
- } else if (fPCM && wfe->wBitsPerSample == 24) {
- int tmp = clamp<int>(s, -1<<23, (1<<23)-1);
- memcpy(&pDataOut[i*3], &tmp, 3);
- } else if (fPCM && wfe->wBitsPerSample == 32) {
- ((int*)pDataOut)[i] = clamp<int>(s, INT_MIN, INT_MAX);
- } else if (fFloat && wfe->wBitsPerSample == 32) {
- ((float*)pDataOut)[i] = clamp<float>(s, -1, +1);
- } else if (fFloat && wfe->wBitsPerSample == 64) {
- ((double*)pDataOut)[i] = clamp<double>(s, -1, +1);
- }
- }
-
- delete [] buff;
- }
- }
-
- pOut->SetActualDataLength(lenout*bps*wfeout->nChannels);
-
- return S_OK;
+ CStreamSwitcherInputPin* pInPin = GetInputPin();
+ CStreamSwitcherOutputPin* pOutPin = GetOutputPin();
+ if (!pInPin || !pOutPin) {
+ return __super::Transform(pIn, pOut);
+ }
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)pInPin->CurrentMediaType().pbFormat;
+ WAVEFORMATEX* wfeout = (WAVEFORMATEX*)pOutPin->CurrentMediaType().pbFormat;
+ WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)wfe;
+
+ int bps = wfe->wBitsPerSample >> 3;
+
+ int len = pIn->GetActualDataLength() / (bps * wfe->nChannels);
+ int lenout = (UINT64)len * wfeout->nSamplesPerSec / wfe->nSamplesPerSec;
+
+ REFERENCE_TIME rtStart, rtStop;
+ if (SUCCEEDED(pIn->GetTime(&rtStart, &rtStop))) {
+ rtStart += m_rtAudioTimeShift;
+ rtStop += m_rtAudioTimeShift;
+ pOut->SetTime(&rtStart, &rtStop);
+
+ m_rtNextStart = rtStart;
+ m_rtNextStop = rtStop;
+ } else {
+ pOut->SetTime(&m_rtNextStart, &m_rtNextStop);
+ }
+
+ REFERENCE_TIME rtDur = 10000000i64 * len / wfe->nSamplesPerSec;
+
+ m_rtNextStart += rtDur;
+ m_rtNextStop += rtDur;
+
+ if (pIn->IsDiscontinuity() == S_OK) {
+ m_sample_max = 0.1f;
+ }
+
+ WORD tag = wfe->wFormatTag;
+ bool fPCM = tag == WAVE_FORMAT_PCM || tag == WAVE_FORMAT_EXTENSIBLE && wfex->SubFormat == KSDATAFORMAT_SUBTYPE_PCM;
+ bool fFloat = tag == WAVE_FORMAT_IEEE_FLOAT || tag == WAVE_FORMAT_EXTENSIBLE && wfex->SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;
+ if (!fPCM && !fFloat) {
+ return __super::Transform(pIn, pOut);
+ }
+
+ BYTE* pDataIn = NULL;
+ BYTE* pDataOut = NULL;
+
+ HRESULT hr;
+ if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
+ return hr;
+ }
+ if (FAILED(hr = pOut->GetPointer(&pDataOut))) {
+ return hr;
+ }
+
+ if (!pDataIn || !pDataOut || len < 0 || lenout < 0) {
+ return S_FALSE;
+ }
+ // len = 0 doesn't mean it's failed, return S_OK otherwise might screw the sound
+ if (len == 0) {
+ pOut->SetActualDataLength(0);
+ return S_OK;
+ }
+
+ if (m_fCustomChannelMapping) {
+ size_t channelsCount = m_chs[wfe->nChannels - 1].GetCount();
+ if (channelsCount > 0 && wfeout->nChannels <= channelsCount) {
+ for (int i = 0; i < wfeout->nChannels; i++) {
+ DWORD mask = m_chs[wfe->nChannels - 1][i].Channel;
+
+ BYTE* src = pDataIn;
+ BYTE* dst = &pDataOut[bps * i];
+
+ int srcstep = bps * wfe->nChannels;
+ int dststep = bps * wfeout->nChannels;
+ int channels = min(18, wfe->nChannels);
+ if (fPCM && wfe->wBitsPerSample == 8) {
+ for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
+ mix<unsigned char, INT64, 0, UCHAR_MAX>(mask, channels, bps, src, dst);
+ }
+ } else if (fPCM && wfe->wBitsPerSample == 16) {
+ if (wfe->nChannels != 4 || wfeout->nChannels != 4) {
+ for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
+ mix<short, INT64, SHRT_MIN, SHRT_MAX>(mask, channels, bps, src, dst);
+ }
+ } else { // most popular channels count
+ for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
+ mix4<short, INT64, SHRT_MIN, SHRT_MAX>(mask, src, dst);
+ }
+ }
+ } else if (fPCM && wfe->wBitsPerSample == 24) {
+ for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
+ mix<int, INT64, INT24_MIN, INT24_MAX>(mask, channels, bps, src, dst);
+ }
+ } else if (fPCM && wfe->wBitsPerSample == 32) {
+ for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
+ mix<int, __int64, INT_MIN, INT_MAX>(mask, channels, bps, src, dst);
+ }
+ } else if (fFloat && wfe->wBitsPerSample == 32) {
+ for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
+ mix < float, double, -1, 1 > (mask, channels, bps, src, dst);
+ }
+ } else if (fFloat && wfe->wBitsPerSample == 64) {
+ for (int k = 0; k < len; k++, src += srcstep, dst += dststep) {
+ mix < double, double, -1, 1 > (mask, channels, bps, src, dst);
+ }
+ }
+ }
+ } else {
+ BYTE* pDataOut = NULL;
+ HRESULT hr;
+ if (FAILED(hr = pOut->GetPointer(&pDataOut)) || !pDataOut) {
+ return hr;
+ }
+ memset(pDataOut, 0, pOut->GetSize());
+ }
+ } else {
+ HRESULT hr;
+ if (S_OK != (hr = __super::Transform(pIn, pOut))) {
+ return hr;
+ }
+ }
+
+ if (m_fDownSampleTo441
+ && wfe->nSamplesPerSec > 44100 && wfeout->nSamplesPerSec == 44100
+ && wfe->wBitsPerSample <= 16 && fPCM) {
+ if (BYTE* buff = DNew BYTE[len * bps]) {
+ for (int ch = 0; ch < wfeout->nChannels; ch++) {
+ memset(buff, 0, len * bps);
+
+ for (int i = 0; i < len; i++) {
+ memcpy(buff + i * bps, (char*)pDataOut + (ch + i * wfeout->nChannels)*bps, bps);
+ }
+
+ m_pResamplers[ch]->Downsample(buff, len, buff, lenout);
+
+ for (int i = 0; i < lenout; i++) {
+ memcpy((char*)pDataOut + (ch + i * wfeout->nChannels)*bps, buff + i * bps, bps);
+ }
+ }
+
+ delete [] buff;
+ }
+ }
+
+ if (m_fNormalize || m_boost_mul > 1) {
+ int samples = lenout * wfeout->nChannels;
+
+ if (double* buff = DNew double[samples]) {
+ for (int i = 0; i < samples; i++) {
+ if (fPCM && wfe->wBitsPerSample == 8) {
+ buff[i] = (double)((BYTE*)pDataOut)[i] / UCHAR_MAX;
+ } else if (fPCM && wfe->wBitsPerSample == 16) {
+ buff[i] = (double)((short*)pDataOut)[i] / SHRT_MAX;
+ } else if (fPCM && wfe->wBitsPerSample == 24) {
+ int tmp;
+ memcpy(((BYTE*)&tmp) + 1, &pDataOut[i * 3], 3);
+ buff[i] = (float)(tmp >> 8) / ((1 << 23) - 1);
+ } else if (fPCM && wfe->wBitsPerSample == 32) {
+ buff[i] = (double)((int*)pDataOut)[i] / INT_MAX;
+ } else if (fFloat && wfe->wBitsPerSample == 32) {
+ buff[i] = (double)((float*)pDataOut)[i];
+ } else if (fFloat && wfe->wBitsPerSample == 64) {
+ buff[i] = ((double*)pDataOut)[i];
+ }
+ }
+
+ double sample_mul = 1;
+
+ if (m_fNormalize) {
+ for (int i = 0; i < samples; i++) {
+ double s = buff[i];
+ if (s < 0) {
+ s = -s;
+ }
+ if (s > 1) {
+ s = 1;
+ }
+ if (m_sample_max < s) {
+ m_sample_max = s;
+ }
+ }
+
+ sample_mul = 1.0f / m_sample_max;
+
+ if (m_fNormalizeRecover) {
+ m_sample_max -= 1.0 * rtDur / 200000000; // -5%/sec
+ }
+ if (m_sample_max < 0.1) {
+ m_sample_max = 0.1;
+ }
+ }
+
+ if (m_boost_mul > 1) {
+ sample_mul *= m_boost_mul;
+ }
+
+ for (int i = 0; i < samples; i++) {
+ double s = buff[i] * sample_mul;
+
+ if (fPCM && wfe->wBitsPerSample == 8) {
+ ((BYTE*)pDataOut)[i] = clamp<BYTE>(s, 0, UCHAR_MAX);
+ } else if (fPCM && wfe->wBitsPerSample == 16) {
+ ((short*)pDataOut)[i] = clamp<short>(s, SHRT_MIN, SHRT_MAX);
+ } else if (fPCM && wfe->wBitsPerSample == 24) {
+ int tmp = clamp<int>(s, -1 << 23, (1 << 23) - 1);
+ memcpy(&pDataOut[i * 3], &tmp, 3);
+ } else if (fPCM && wfe->wBitsPerSample == 32) {
+ ((int*)pDataOut)[i] = clamp<int>(s, INT_MIN, INT_MAX);
+ } else if (fFloat && wfe->wBitsPerSample == 32) {
+ ((float*)pDataOut)[i] = clamp<float>(s, -1, +1);
+ } else if (fFloat && wfe->wBitsPerSample == 64) {
+ ((double*)pDataOut)[i] = clamp<double>(s, -1, +1);
+ }
+ }
+
+ delete [] buff;
+ }
+ }
+
+ pOut->SetActualDataLength(lenout * bps * wfeout->nChannels);
+
+ return S_OK;
}
CMediaType CAudioSwitcherFilter::CreateNewOutputMediaType(CMediaType mt, long& cbBuffer)
{
- CStreamSwitcherInputPin* pInPin = GetInputPin();
- CStreamSwitcherOutputPin* pOutPin = GetOutputPin();
- if (!pInPin || !pOutPin || ((WAVEFORMATEX*)mt.pbFormat)->wFormatTag == WAVE_FORMAT_DOLBY_AC3_SPDIF) {
- return __super::CreateNewOutputMediaType(mt, cbBuffer);
- }
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)pInPin->CurrentMediaType().pbFormat;
-
- if (m_fCustomChannelMapping) {
- m_chs[wfe->nChannels-1].RemoveAll();
-
- DWORD mask = DWORD((__int64(1)<<wfe->nChannels)-1);
- for (int i = 0; i < 18; i++) {
- if (m_pSpeakerToChannelMap[wfe->nChannels-1][i]&mask) {
- ChMap cm = {1<<i, m_pSpeakerToChannelMap[wfe->nChannels-1][i]};
- m_chs[wfe->nChannels-1].Add(cm);
- }
- }
-
- if (m_chs[wfe->nChannels-1].GetCount() > 0) {
- mt.ReallocFormatBuffer(sizeof(WAVEFORMATEXTENSIBLE));
- WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)mt.pbFormat;
- wfex->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX);
- wfex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
- wfex->Samples.wValidBitsPerSample = wfe->wBitsPerSample;
- wfex->SubFormat =
- wfe->wFormatTag == WAVE_FORMAT_PCM ? KSDATAFORMAT_SUBTYPE_PCM :
- wfe->wFormatTag == WAVE_FORMAT_IEEE_FLOAT ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT :
- wfe->wFormatTag == WAVE_FORMAT_EXTENSIBLE ? ((WAVEFORMATEXTENSIBLE*)wfe)->SubFormat :
- KSDATAFORMAT_SUBTYPE_PCM; // can't happen
-
- wfex->dwChannelMask = 0;
- for (size_t i = 0; i < m_chs[wfe->nChannels-1].GetCount(); i++) {
- wfex->dwChannelMask |= m_chs[wfe->nChannels-1][i].Speaker;
- }
-
- wfex->Format.nChannels = (WORD)m_chs[wfe->nChannels-1].GetCount();
- wfex->Format.nBlockAlign = wfex->Format.nChannels*wfex->Format.wBitsPerSample>>3;
- wfex->Format.nAvgBytesPerSec = wfex->Format.nBlockAlign*wfex->Format.nSamplesPerSec;
- }
- }
-
- WAVEFORMATEX* wfeout = (WAVEFORMATEX*)mt.pbFormat;
-
- if (m_fDownSampleTo441) {
- if (wfeout->nSamplesPerSec > 44100 && wfeout->wBitsPerSample <= 16) {
- wfeout->nSamplesPerSec = 44100;
- wfeout->nAvgBytesPerSec = wfeout->nBlockAlign*wfeout->nSamplesPerSec;
- }
- }
-
- int bps = wfe->wBitsPerSample>>3;
- int len = cbBuffer / (bps*wfe->nChannels);
- int lenout = len * wfeout->nSamplesPerSec / wfe->nSamplesPerSec;
- cbBuffer = lenout*bps*wfeout->nChannels;
-
- // mt.lSampleSize = (ULONG)max(mt.lSampleSize, wfe->nAvgBytesPerSec * rtLen / 10000000i64);
- // mt.lSampleSize = (mt.lSampleSize + (wfe->nBlockAlign-1)) & ~(wfe->nBlockAlign-1);
-
- return mt;
+ CStreamSwitcherInputPin* pInPin = GetInputPin();
+ CStreamSwitcherOutputPin* pOutPin = GetOutputPin();
+ if (!pInPin || !pOutPin || ((WAVEFORMATEX*)mt.pbFormat)->wFormatTag == WAVE_FORMAT_DOLBY_AC3_SPDIF) {
+ return __super::CreateNewOutputMediaType(mt, cbBuffer);
+ }
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)pInPin->CurrentMediaType().pbFormat;
+
+ if (m_fCustomChannelMapping) {
+ m_chs[wfe->nChannels - 1].RemoveAll();
+
+ DWORD mask = DWORD((__int64(1) << wfe->nChannels) - 1);
+ for (int i = 0; i < 18; i++) {
+ if (m_pSpeakerToChannelMap[wfe->nChannels - 1][i]&mask) {
+ ChMap cm = {1 << i, m_pSpeakerToChannelMap[wfe->nChannels - 1][i]};
+ m_chs[wfe->nChannels - 1].Add(cm);
+ }
+ }
+
+ if (m_chs[wfe->nChannels - 1].GetCount() > 0) {
+ mt.ReallocFormatBuffer(sizeof(WAVEFORMATEXTENSIBLE));
+ WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)mt.pbFormat;
+ wfex->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
+ wfex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+ wfex->Samples.wValidBitsPerSample = wfe->wBitsPerSample;
+ wfex->SubFormat =
+ wfe->wFormatTag == WAVE_FORMAT_PCM ? KSDATAFORMAT_SUBTYPE_PCM :
+ wfe->wFormatTag == WAVE_FORMAT_IEEE_FLOAT ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT :
+ wfe->wFormatTag == WAVE_FORMAT_EXTENSIBLE ? ((WAVEFORMATEXTENSIBLE*)wfe)->SubFormat :
+ KSDATAFORMAT_SUBTYPE_PCM; // can't happen
+
+ wfex->dwChannelMask = 0;
+ for (size_t i = 0; i < m_chs[wfe->nChannels - 1].GetCount(); i++) {
+ wfex->dwChannelMask |= m_chs[wfe->nChannels - 1][i].Speaker;
+ }
+
+ wfex->Format.nChannels = (WORD)m_chs[wfe->nChannels - 1].GetCount();
+ wfex->Format.nBlockAlign = wfex->Format.nChannels * wfex->Format.wBitsPerSample >> 3;
+ wfex->Format.nAvgBytesPerSec = wfex->Format.nBlockAlign * wfex->Format.nSamplesPerSec;
+ }
+ }
+
+ WAVEFORMATEX* wfeout = (WAVEFORMATEX*)mt.pbFormat;
+
+ if (m_fDownSampleTo441) {
+ if (wfeout->nSamplesPerSec > 44100 && wfeout->wBitsPerSample <= 16) {
+ wfeout->nSamplesPerSec = 44100;
+ wfeout->nAvgBytesPerSec = wfeout->nBlockAlign * wfeout->nSamplesPerSec;
+ }
+ }
+
+ int bps = wfe->wBitsPerSample >> 3;
+ int len = cbBuffer / (bps * wfe->nChannels);
+ int lenout = len * wfeout->nSamplesPerSec / wfe->nSamplesPerSec;
+ cbBuffer = lenout * bps * wfeout->nChannels;
+
+ // mt.lSampleSize = (ULONG)max(mt.lSampleSize, wfe->nAvgBytesPerSec * rtLen / 10000000i64);
+ // mt.lSampleSize = (mt.lSampleSize + (wfe->nBlockAlign-1)) & ~(wfe->nBlockAlign-1);
+
+ return mt;
}
void CAudioSwitcherFilter::OnNewOutputMediaType(const CMediaType& mtIn, const CMediaType& mtOut)
{
- const WAVEFORMATEX* wfe = (WAVEFORMATEX*)mtIn.pbFormat;
- const WAVEFORMATEX* wfeout = (WAVEFORMATEX*)mtOut.pbFormat;
-
- m_pResamplers.RemoveAll();
- for (int i = 0; i < wfeout->nChannels; i++) {
- CAutoPtr<AudioStreamResampler> pResampler;
- pResampler.Attach(DNew AudioStreamResampler(wfeout->wBitsPerSample>>3, wfe->nSamplesPerSec, wfeout->nSamplesPerSec, true));
- m_pResamplers.Add(pResampler);
- }
-
- TRACE(_T("CAudioSwitcherFilter::OnNewOutputMediaType\n"));
- m_sample_max = 0.1f;
+ const WAVEFORMATEX* wfe = (WAVEFORMATEX*)mtIn.pbFormat;
+ const WAVEFORMATEX* wfeout = (WAVEFORMATEX*)mtOut.pbFormat;
+
+ m_pResamplers.RemoveAll();
+ for (int i = 0; i < wfeout->nChannels; i++) {
+ CAutoPtr<AudioStreamResampler> pResampler;
+ pResampler.Attach(DNew AudioStreamResampler(wfeout->wBitsPerSample >> 3, wfe->nSamplesPerSec, wfeout->nSamplesPerSec, true));
+ m_pResamplers.Add(pResampler);
+ }
+
+ TRACE(_T("CAudioSwitcherFilter::OnNewOutputMediaType\n"));
+ m_sample_max = 0.1f;
}
HRESULT CAudioSwitcherFilter::DeliverEndFlush()
{
- TRACE(_T("CAudioSwitcherFilter::DeliverEndFlush\n"));
- m_sample_max = 0.1f;
- return __super::DeliverEndFlush();
+ TRACE(_T("CAudioSwitcherFilter::DeliverEndFlush\n"));
+ m_sample_max = 0.1f;
+ return __super::DeliverEndFlush();
}
HRESULT CAudioSwitcherFilter::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- TRACE(_T("CAudioSwitcherFilter::DeliverNewSegment\n"));
- m_sample_max = 0.1f;
- return __super::DeliverNewSegment(tStart, tStop, dRate);
+ TRACE(_T("CAudioSwitcherFilter::DeliverNewSegment\n"));
+ m_sample_max = 0.1f;
+ return __super::DeliverNewSegment(tStart, tStop, dRate);
}
// IAudioSwitcherFilter
STDMETHODIMP CAudioSwitcherFilter::GetInputSpeakerConfig(DWORD* pdwChannelMask)
{
- if (!pdwChannelMask) {
- return E_POINTER;
- }
+ if (!pdwChannelMask) {
+ return E_POINTER;
+ }
- *pdwChannelMask = 0;
+ *pdwChannelMask = 0;
- CStreamSwitcherInputPin* pInPin = GetInputPin();
- if (!pInPin || !pInPin->IsConnected()) {
- return E_UNEXPECTED;
- }
+ CStreamSwitcherInputPin* pInPin = GetInputPin();
+ if (!pInPin || !pInPin->IsConnected()) {
+ return E_UNEXPECTED;
+ }
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)pInPin->CurrentMediaType().pbFormat;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)pInPin->CurrentMediaType().pbFormat;
- if (wfe->wFormatTag == WAVE_FORMAT_EXTENSIBLE) {
- WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)wfe;
- *pdwChannelMask = wfex->dwChannelMask;
- } else {
- *pdwChannelMask = 0/*wfe->nChannels == 1 ? 4 : wfe->nChannels == 2 ? 3 : 0*/;
- }
+ if (wfe->wFormatTag == WAVE_FORMAT_EXTENSIBLE) {
+ WAVEFORMATEXTENSIBLE* wfex = (WAVEFORMATEXTENSIBLE*)wfe;
+ *pdwChannelMask = wfex->dwChannelMask;
+ } else {
+ *pdwChannelMask = 0/*wfe->nChannels == 1 ? 4 : wfe->nChannels == 2 ? 3 : 0*/;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CAudioSwitcherFilter::GetSpeakerConfig(bool* pfCustomChannelMapping, DWORD pSpeakerToChannelMap[18][18])
{
- if (pfCustomChannelMapping) {
- *pfCustomChannelMapping = m_fCustomChannelMapping;
- }
- memcpy(pSpeakerToChannelMap, m_pSpeakerToChannelMap, sizeof(m_pSpeakerToChannelMap));
+ if (pfCustomChannelMapping) {
+ *pfCustomChannelMapping = m_fCustomChannelMapping;
+ }
+ memcpy(pSpeakerToChannelMap, m_pSpeakerToChannelMap, sizeof(m_pSpeakerToChannelMap));
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CAudioSwitcherFilter::SetSpeakerConfig(bool fCustomChannelMapping, DWORD pSpeakerToChannelMap[18][18])
{
- if (m_State == State_Stopped || m_fCustomChannelMapping != fCustomChannelMapping
- || memcmp(m_pSpeakerToChannelMap, pSpeakerToChannelMap, sizeof(m_pSpeakerToChannelMap))) {
- PauseGraph;
+ if (m_State == State_Stopped || m_fCustomChannelMapping != fCustomChannelMapping
+ || memcmp(m_pSpeakerToChannelMap, pSpeakerToChannelMap, sizeof(m_pSpeakerToChannelMap))) {
+ PauseGraph;
- CStreamSwitcherInputPin* pInput = GetInputPin();
+ CStreamSwitcherInputPin* pInput = GetInputPin();
- SelectInput(NULL);
+ SelectInput(NULL);
- m_fCustomChannelMapping = fCustomChannelMapping;
- memcpy(m_pSpeakerToChannelMap, pSpeakerToChannelMap, sizeof(m_pSpeakerToChannelMap));
+ m_fCustomChannelMapping = fCustomChannelMapping;
+ memcpy(m_pSpeakerToChannelMap, pSpeakerToChannelMap, sizeof(m_pSpeakerToChannelMap));
- SelectInput(pInput);
+ SelectInput(pInput);
- ResumeGraph;
- }
+ ResumeGraph;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP_(int) CAudioSwitcherFilter::GetNumberOfInputChannels()
{
- CStreamSwitcherInputPin* pInPin = GetInputPin();
- return pInPin ? ((WAVEFORMATEX*)pInPin->CurrentMediaType().pbFormat)->nChannels : 0;
+ CStreamSwitcherInputPin* pInPin = GetInputPin();
+ return pInPin ? ((WAVEFORMATEX*)pInPin->CurrentMediaType().pbFormat)->nChannels : 0;
}
STDMETHODIMP_(bool) CAudioSwitcherFilter::IsDownSamplingTo441Enabled()
{
- return m_fDownSampleTo441;
+ return m_fDownSampleTo441;
}
STDMETHODIMP CAudioSwitcherFilter::EnableDownSamplingTo441(bool fEnable)
{
- if (m_fDownSampleTo441 != fEnable) {
- PauseGraph;
- m_fDownSampleTo441 = fEnable;
- ResumeGraph;
- }
+ if (m_fDownSampleTo441 != fEnable) {
+ PauseGraph;
+ m_fDownSampleTo441 = fEnable;
+ ResumeGraph;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP_(REFERENCE_TIME) CAudioSwitcherFilter::GetAudioTimeShift()
{
- return m_rtAudioTimeShift;
+ return m_rtAudioTimeShift;
}
STDMETHODIMP CAudioSwitcherFilter::SetAudioTimeShift(REFERENCE_TIME rtAudioTimeShift)
{
- m_rtAudioTimeShift = rtAudioTimeShift;
- return S_OK;
+ m_rtAudioTimeShift = rtAudioTimeShift;
+ return S_OK;
}
STDMETHODIMP CAudioSwitcherFilter::GetNormalizeBoost(bool& fNormalize, bool& fNormalizeRecover, float& boost_dB)
{
- fNormalize = m_fNormalize;
- fNormalizeRecover = m_fNormalizeRecover;
- boost_dB = 20*log10(m_boost_mul);
- return S_OK;
+ fNormalize = m_fNormalize;
+ fNormalizeRecover = m_fNormalizeRecover;
+ boost_dB = 20 * log10(m_boost_mul);
+ return S_OK;
}
STDMETHODIMP CAudioSwitcherFilter::SetNormalizeBoost(bool fNormalize, bool fNormalizeRecover, float boost_dB)
{
- if (m_fNormalize != fNormalize) {
- m_sample_max = 0.1f;
- }
- m_fNormalize = fNormalize;
- m_fNormalizeRecover = fNormalizeRecover;
- m_boost_mul = pow(10.0f, boost_dB/20);
- return S_OK;
+ if (m_fNormalize != fNormalize) {
+ m_sample_max = 0.1f;
+ }
+ m_fNormalize = fNormalize;
+ m_fNormalizeRecover = fNormalizeRecover;
+ m_boost_mul = pow(10.0f, boost_dB / 20);
+ return S_OK;
}
// IAMStreamSelect
STDMETHODIMP CAudioSwitcherFilter::Enable(long lIndex, DWORD dwFlags)
{
- HRESULT hr = __super::Enable(lIndex, dwFlags);
- if (S_OK == hr) {
- m_sample_max = 0.1f;
- }
- return hr;
+ HRESULT hr = __super::Enable(lIndex, dwFlags);
+ if (S_OK == hr) {
+ m_sample_max = 0.1f;
+ }
+ return hr;
}
diff --git a/src/filters/switcher/AudioSwitcher/AudioSwitcher.h b/src/filters/switcher/AudioSwitcher/AudioSwitcher.h
index aa895355c..09006bce0 100644
--- a/src/filters/switcher/AudioSwitcher/AudioSwitcher.h
+++ b/src/filters/switcher/AudioSwitcher/AudioSwitcher.h
@@ -30,65 +30,65 @@
interface __declspec(uuid("CEDB2890-53AE-4231-91A3-B0AAFCD1DBDE"))
IAudioSwitcherFilter :
public IUnknown {
- STDMETHOD(GetInputSpeakerConfig) (DWORD* pdwChannelMask) = 0;
- STDMETHOD(GetSpeakerConfig) (bool* pfCustomChannelMapping, DWORD pSpeakerToChannelMap[18][18]) = 0;
- STDMETHOD(SetSpeakerConfig) (bool fCustomChannelMapping, DWORD pSpeakerToChannelMap[18][18]) = 0;
- STDMETHOD_(int, GetNumberOfInputChannels) () = 0;
- STDMETHOD_(bool, IsDownSamplingTo441Enabled) () = 0;
- STDMETHOD(EnableDownSamplingTo441) (bool fEnable) = 0;
- STDMETHOD_(REFERENCE_TIME, GetAudioTimeShift) () = 0;
- STDMETHOD(SetAudioTimeShift) (REFERENCE_TIME rtAudioTimeShift) = 0;
- STDMETHOD(GetNormalizeBoost) (bool& fNormalize, bool& fNormalizeRecover, float& boost) = 0;
- STDMETHOD(SetNormalizeBoost) (bool fNormalize, bool fNormalizeRecover, float boost) = 0;
+ STDMETHOD(GetInputSpeakerConfig)(DWORD * pdwChannelMask) = 0;
+ STDMETHOD(GetSpeakerConfig)(bool * pfCustomChannelMapping, DWORD pSpeakerToChannelMap[18][18]) = 0;
+ STDMETHOD(SetSpeakerConfig)(bool fCustomChannelMapping, DWORD pSpeakerToChannelMap[18][18]) = 0;
+ STDMETHOD_(int, GetNumberOfInputChannels)() = 0;
+ STDMETHOD_(bool, IsDownSamplingTo441Enabled)() = 0;
+ STDMETHOD(EnableDownSamplingTo441)(bool fEnable) = 0;
+ STDMETHOD_(REFERENCE_TIME, GetAudioTimeShift)() = 0;
+ STDMETHOD(SetAudioTimeShift)(REFERENCE_TIME rtAudioTimeShift) = 0;
+ STDMETHOD(GetNormalizeBoost)(bool & fNormalize, bool & fNormalizeRecover, float & boost) = 0;
+ STDMETHOD(SetNormalizeBoost)(bool fNormalize, bool fNormalizeRecover, float boost) = 0;
};
class AudioStreamResampler;
class __declspec(uuid("18C16B08-6497-420e-AD14-22D21C2CEAB7"))
- CAudioSwitcherFilter : public CStreamSwitcherFilter, public IAudioSwitcherFilter
+ CAudioSwitcherFilter : public CStreamSwitcherFilter, public IAudioSwitcherFilter
{
- typedef struct {
- DWORD Speaker, Channel;
- } ChMap;
- CAtlArray<ChMap> m_chs[18];
+ typedef struct {
+ DWORD Speaker, Channel;
+ } ChMap;
+ CAtlArray<ChMap> m_chs[18];
- bool m_fCustomChannelMapping;
- DWORD m_pSpeakerToChannelMap[18][18];
- bool m_fDownSampleTo441;
- REFERENCE_TIME m_rtAudioTimeShift;
- CAutoPtrArray<AudioStreamResampler> m_pResamplers;
- double m_sample_max;
- bool m_fNormalize, m_fNormalizeRecover;
- float m_boost_mul;
+ bool m_fCustomChannelMapping;
+ DWORD m_pSpeakerToChannelMap[18][18];
+ bool m_fDownSampleTo441;
+ REFERENCE_TIME m_rtAudioTimeShift;
+ CAutoPtrArray<AudioStreamResampler> m_pResamplers;
+ double m_sample_max;
+ bool m_fNormalize, m_fNormalizeRecover;
+ float m_boost_mul;
- REFERENCE_TIME m_rtNextStart, m_rtNextStop;
+ REFERENCE_TIME m_rtNextStart, m_rtNextStop;
public:
- CAudioSwitcherFilter(LPUNKNOWN lpunk, HRESULT* phr);
+ CAudioSwitcherFilter(LPUNKNOWN lpunk, HRESULT* phr);
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- HRESULT CheckMediaType(const CMediaType* pmt);
- HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
- CMediaType CreateNewOutputMediaType(CMediaType mt, long& cbBuffer);
- void OnNewOutputMediaType(const CMediaType& mtIn, const CMediaType& mtOut);
+ HRESULT CheckMediaType(const CMediaType* pmt);
+ HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
+ CMediaType CreateNewOutputMediaType(CMediaType mt, long& cbBuffer);
+ void OnNewOutputMediaType(const CMediaType& mtIn, const CMediaType& mtOut);
- HRESULT DeliverEndFlush();
- HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT DeliverEndFlush();
+ HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
- // IAudioSwitcherFilter
- STDMETHODIMP GetInputSpeakerConfig(DWORD* pdwChannelMask);
- STDMETHODIMP GetSpeakerConfig(bool* pfCustomChannelMapping, DWORD pSpeakerToChannelMap[18][18]);
- STDMETHODIMP SetSpeakerConfig(bool fCustomChannelMapping, DWORD pSpeakerToChannelMap[18][18]);
- STDMETHODIMP_(int) GetNumberOfInputChannels();
- STDMETHODIMP_(bool) IsDownSamplingTo441Enabled();
- STDMETHODIMP EnableDownSamplingTo441(bool fEnable);
- STDMETHODIMP_(REFERENCE_TIME) GetAudioTimeShift();
- STDMETHODIMP SetAudioTimeShift(REFERENCE_TIME rtAudioTimeShift);
- STDMETHODIMP GetNormalizeBoost(bool& fNormalize, bool& fNormalizeRecover, float& boost);
- STDMETHODIMP SetNormalizeBoost(bool fNormalize, bool fNormalizeRecover, float boost);
+ // IAudioSwitcherFilter
+ STDMETHODIMP GetInputSpeakerConfig(DWORD* pdwChannelMask);
+ STDMETHODIMP GetSpeakerConfig(bool* pfCustomChannelMapping, DWORD pSpeakerToChannelMap[18][18]);
+ STDMETHODIMP SetSpeakerConfig(bool fCustomChannelMapping, DWORD pSpeakerToChannelMap[18][18]);
+ STDMETHODIMP_(int) GetNumberOfInputChannels();
+ STDMETHODIMP_(bool) IsDownSamplingTo441Enabled();
+ STDMETHODIMP EnableDownSamplingTo441(bool fEnable);
+ STDMETHODIMP_(REFERENCE_TIME) GetAudioTimeShift();
+ STDMETHODIMP SetAudioTimeShift(REFERENCE_TIME rtAudioTimeShift);
+ STDMETHODIMP GetNormalizeBoost(bool& fNormalize, bool& fNormalizeRecover, float& boost);
+ STDMETHODIMP SetNormalizeBoost(bool fNormalize, bool fNormalizeRecover, float boost);
- // IAMStreamSelect
- STDMETHODIMP Enable(long lIndex, DWORD dwFlags);
+ // IAMStreamSelect
+ STDMETHODIMP Enable(long lIndex, DWORD dwFlags);
};
diff --git a/src/filters/switcher/AudioSwitcher/StreamSwitcher.cpp b/src/filters/switcher/AudioSwitcher/StreamSwitcher.cpp
index 4b40e604e..ffa66a1b7 100644
--- a/src/filters/switcher/AudioSwitcher/StreamSwitcher.cpp
+++ b/src/filters/switcher/AudioSwitcher/StreamSwitcher.cpp
@@ -45,42 +45,42 @@
//
CStreamSwitcherPassThru::CStreamSwitcherPassThru(LPUNKNOWN pUnk, HRESULT* phr, CStreamSwitcherFilter* pFilter)
- : CMediaPosition(NAME("CStreamSwitcherPassThru"), pUnk)
- , m_pFilter(pFilter)
+ : CMediaPosition(NAME("CStreamSwitcherPassThru"), pUnk)
+ , m_pFilter(pFilter)
{
}
STDMETHODIMP CStreamSwitcherPassThru::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
- *ppv = NULL;
+ CheckPointer(ppv, E_POINTER);
+ *ppv = NULL;
- return
- QI(IMediaSeeking)
- CMediaPosition::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IMediaSeeking)
+ CMediaPosition::NonDelegatingQueryInterface(riid, ppv);
}
template<class T>
HRESULT GetPeer(CStreamSwitcherFilter* pFilter, T** ppT)
{
- *ppT = NULL;
+ *ppT = NULL;
- CBasePin* pPin = pFilter->GetInputPin();
- if (!pPin) {
- return E_NOTIMPL;
- }
+ CBasePin* pPin = pFilter->GetInputPin();
+ if (!pPin) {
+ return E_NOTIMPL;
+ }
- CComPtr<IPin> pConnected;
- if (FAILED(pPin->ConnectedTo(&pConnected))) {
- return E_NOTIMPL;
- }
+ CComPtr<IPin> pConnected;
+ if (FAILED(pPin->ConnectedTo(&pConnected))) {
+ return E_NOTIMPL;
+ }
- if (CComQIPtr<T> pT = pConnected) {
- *ppT = pT.Detach();
- return S_OK;
- }
+ if (CComQIPtr<T> pT = pConnected) {
+ *ppT = pT.Detach();
+ return S_OK;
+ }
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
@@ -135,150 +135,150 @@ HRESULT GetPeer(CStreamSwitcherFilter* pFilter, T** ppT)
STDMETHODIMP CStreamSwitcherPassThru::GetCapabilities(DWORD* pCaps)
{
- CallPeerSeeking(GetCapabilities(pCaps));
+ CallPeerSeeking(GetCapabilities(pCaps));
}
STDMETHODIMP CStreamSwitcherPassThru::CheckCapabilities(DWORD* pCaps)
{
- CallPeerSeeking(CheckCapabilities(pCaps));
+ CallPeerSeeking(CheckCapabilities(pCaps));
}
STDMETHODIMP CStreamSwitcherPassThru::IsFormatSupported(const GUID* pFormat)
{
- CallPeerSeeking(IsFormatSupported(pFormat));
+ CallPeerSeeking(IsFormatSupported(pFormat));
}
STDMETHODIMP CStreamSwitcherPassThru::QueryPreferredFormat(GUID* pFormat)
{
- CallPeerSeeking(QueryPreferredFormat(pFormat));
+ CallPeerSeeking(QueryPreferredFormat(pFormat));
}
STDMETHODIMP CStreamSwitcherPassThru::SetTimeFormat(const GUID* pFormat)
{
- CallPeerSeeking(SetTimeFormat(pFormat));
+ CallPeerSeeking(SetTimeFormat(pFormat));
}
STDMETHODIMP CStreamSwitcherPassThru::GetTimeFormat(GUID* pFormat)
{
- CallPeerSeeking(GetTimeFormat(pFormat));
+ CallPeerSeeking(GetTimeFormat(pFormat));
}
STDMETHODIMP CStreamSwitcherPassThru::IsUsingTimeFormat(const GUID* pFormat)
{
- CallPeerSeeking(IsUsingTimeFormat(pFormat));
+ CallPeerSeeking(IsUsingTimeFormat(pFormat));
}
STDMETHODIMP CStreamSwitcherPassThru::ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat)
{
- CallPeerSeeking(ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat));
+ CallPeerSeeking(ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat));
}
STDMETHODIMP CStreamSwitcherPassThru::SetPositions(LONGLONG* pCurrent, DWORD CurrentFlags, LONGLONG* pStop, DWORD StopFlags)
{
- CallPeerSeekingAll(SetPositions(pCurrent, CurrentFlags, pStop, StopFlags));
+ CallPeerSeekingAll(SetPositions(pCurrent, CurrentFlags, pStop, StopFlags));
}
STDMETHODIMP CStreamSwitcherPassThru::GetPositions(LONGLONG* pCurrent, LONGLONG* pStop)
{
- CallPeerSeeking(GetPositions(pCurrent, pStop));
+ CallPeerSeeking(GetPositions(pCurrent, pStop));
}
STDMETHODIMP CStreamSwitcherPassThru::GetCurrentPosition(LONGLONG* pCurrent)
{
- CallPeerSeeking(GetCurrentPosition(pCurrent));
+ CallPeerSeeking(GetCurrentPosition(pCurrent));
}
STDMETHODIMP CStreamSwitcherPassThru::GetStopPosition(LONGLONG* pStop)
{
- CallPeerSeeking(GetStopPosition(pStop));
+ CallPeerSeeking(GetStopPosition(pStop));
}
STDMETHODIMP CStreamSwitcherPassThru::GetDuration(LONGLONG* pDuration)
{
- CallPeerSeeking(GetDuration(pDuration));
+ CallPeerSeeking(GetDuration(pDuration));
}
STDMETHODIMP CStreamSwitcherPassThru::GetPreroll(LONGLONG* pllPreroll)
{
- CallPeerSeeking(GetPreroll(pllPreroll));
+ CallPeerSeeking(GetPreroll(pllPreroll));
}
STDMETHODIMP CStreamSwitcherPassThru::GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest)
{
- CallPeerSeeking(GetAvailable(pEarliest, pLatest));
+ CallPeerSeeking(GetAvailable(pEarliest, pLatest));
}
STDMETHODIMP CStreamSwitcherPassThru::GetRate(double* pdRate)
{
- CallPeerSeeking(GetRate(pdRate));
+ CallPeerSeeking(GetRate(pdRate));
}
STDMETHODIMP CStreamSwitcherPassThru::SetRate(double dRate)
{
- if (0.0 == dRate) {
- return E_INVALIDARG;
- }
- CallPeerSeekingAll(SetRate(dRate));
+ if (0.0 == dRate) {
+ return E_INVALIDARG;
+ }
+ CallPeerSeekingAll(SetRate(dRate));
}
// IMediaPosition
STDMETHODIMP CStreamSwitcherPassThru::get_Duration(REFTIME* plength)
{
- CallPeer(get_Duration(plength));
+ CallPeer(get_Duration(plength));
}
STDMETHODIMP CStreamSwitcherPassThru::get_CurrentPosition(REFTIME* pllTime)
{
- CallPeer(get_CurrentPosition(pllTime));
+ CallPeer(get_CurrentPosition(pllTime));
}
STDMETHODIMP CStreamSwitcherPassThru::put_CurrentPosition(REFTIME llTime)
{
- CallPeerAll(put_CurrentPosition(llTime));
+ CallPeerAll(put_CurrentPosition(llTime));
}
STDMETHODIMP CStreamSwitcherPassThru::get_StopTime(REFTIME* pllTime)
{
- CallPeer(get_StopTime(pllTime));
+ CallPeer(get_StopTime(pllTime));
}
STDMETHODIMP CStreamSwitcherPassThru::put_StopTime(REFTIME llTime)
{
- CallPeerAll(put_StopTime(llTime));
+ CallPeerAll(put_StopTime(llTime));
}
-STDMETHODIMP CStreamSwitcherPassThru::get_PrerollTime(REFTIME * pllTime)
+STDMETHODIMP CStreamSwitcherPassThru::get_PrerollTime(REFTIME* pllTime)
{
- CallPeer(get_PrerollTime(pllTime));
+ CallPeer(get_PrerollTime(pllTime));
}
STDMETHODIMP CStreamSwitcherPassThru::put_PrerollTime(REFTIME llTime)
{
- CallPeerAll(put_PrerollTime(llTime));
+ CallPeerAll(put_PrerollTime(llTime));
}
STDMETHODIMP CStreamSwitcherPassThru::get_Rate(double* pdRate)
{
- CallPeer(get_Rate(pdRate));
+ CallPeer(get_Rate(pdRate));
}
STDMETHODIMP CStreamSwitcherPassThru::put_Rate(double dRate)
{
- if (0.0 == dRate) {
- return E_INVALIDARG;
- }
- CallPeerAll(put_Rate(dRate));
+ if (0.0 == dRate) {
+ return E_INVALIDARG;
+ }
+ CallPeerAll(put_Rate(dRate));
}
STDMETHODIMP CStreamSwitcherPassThru::CanSeekForward(LONG* pCanSeekForward)
{
- CallPeer(CanSeekForward(pCanSeekForward));
+ CallPeer(CanSeekForward(pCanSeekForward));
}
STDMETHODIMP CStreamSwitcherPassThru::CanSeekBackward(LONG* pCanSeekBackward)
{
- CallPeer(CanSeekBackward(pCanSeekBackward));
+ CallPeer(CanSeekBackward(pCanSeekBackward));
}
//
@@ -286,96 +286,96 @@ STDMETHODIMP CStreamSwitcherPassThru::CanSeekBackward(LONG* pCanSeekBackward)
//
CStreamSwitcherAllocator::CStreamSwitcherAllocator(CStreamSwitcherInputPin* pPin, HRESULT* phr)
- : CMemAllocator(NAME("CStreamSwitcherAllocator"), NULL, phr)
- , m_pPin(pPin)
- , m_fMediaTypeChanged(false)
+ : CMemAllocator(NAME("CStreamSwitcherAllocator"), NULL, phr)
+ , m_pPin(pPin)
+ , m_fMediaTypeChanged(false)
{
- ASSERT(phr);
- ASSERT(pPin);
+ ASSERT(phr);
+ ASSERT(pPin);
}
#ifdef _DEBUG
CStreamSwitcherAllocator::~CStreamSwitcherAllocator()
{
- ASSERT(m_bCommitted == FALSE);
+ ASSERT(m_bCommitted == FALSE);
}
#endif
STDMETHODIMP_(ULONG) CStreamSwitcherAllocator::NonDelegatingAddRef()
{
- return m_pPin->m_pFilter->AddRef();
+ return m_pPin->m_pFilter->AddRef();
}
STDMETHODIMP_(ULONG) CStreamSwitcherAllocator::NonDelegatingRelease()
{
- return m_pPin->m_pFilter->Release();
+ return m_pPin->m_pFilter->Release();
}
STDMETHODIMP CStreamSwitcherAllocator::GetBuffer(
- IMediaSample** ppBuffer,
- REFERENCE_TIME* pStartTime, REFERENCE_TIME* pEndTime,
- DWORD dwFlags)
-{
- HRESULT hr = VFW_E_NOT_COMMITTED;
-
- if (!m_bCommitted) {
- return hr;
- }
- /*
- TRACE(_T("CStreamSwitcherAllocator::GetBuffer m_pPin->m_evBlock.Wait() + %x\n"), this);
- m_pPin->m_evBlock.Wait();
- TRACE(_T("CStreamSwitcherAllocator::GetBuffer m_pPin->m_evBlock.Wait() - %x\n"), this);
- */
- if (m_fMediaTypeChanged) {
- if (!m_pPin || !m_pPin->m_pFilter) {
- return hr;
- }
-
- CStreamSwitcherOutputPin* pOut = (static_cast<CStreamSwitcherFilter*>(m_pPin->m_pFilter))->GetOutputPin();
- if (!pOut || !pOut->CurrentAllocator()) {
- return hr;
- }
-
- ALLOCATOR_PROPERTIES Properties, Actual;
- if (FAILED(pOut->CurrentAllocator()->GetProperties(&Actual))) {
- return hr;
- }
- if (FAILED(GetProperties(&Properties))) {
- return hr;
- }
-
- if (!m_bCommitted || Properties.cbBuffer < Actual.cbBuffer) {
- Properties.cbBuffer = Actual.cbBuffer;
- if (FAILED(Decommit())) {
- return hr;
- }
- if (FAILED(SetProperties(&Properties, &Actual))) {
- return hr;
- }
- if (FAILED(Commit())) {
- return hr;
- }
- ASSERT(Actual.cbBuffer >= Properties.cbBuffer);
- if (Actual.cbBuffer < Properties.cbBuffer) {
- return hr;
- }
- }
- }
-
- hr = CMemAllocator::GetBuffer(ppBuffer, pStartTime, pEndTime, dwFlags);
-
- if (m_fMediaTypeChanged && SUCCEEDED(hr)) {
- (*ppBuffer)->SetMediaType(&m_mt);
- m_fMediaTypeChanged = false;
- }
-
- return hr;
+ IMediaSample** ppBuffer,
+ REFERENCE_TIME* pStartTime, REFERENCE_TIME* pEndTime,
+ DWORD dwFlags)
+{
+ HRESULT hr = VFW_E_NOT_COMMITTED;
+
+ if (!m_bCommitted) {
+ return hr;
+ }
+ /*
+ TRACE(_T("CStreamSwitcherAllocator::GetBuffer m_pPin->m_evBlock.Wait() + %x\n"), this);
+ m_pPin->m_evBlock.Wait();
+ TRACE(_T("CStreamSwitcherAllocator::GetBuffer m_pPin->m_evBlock.Wait() - %x\n"), this);
+ */
+ if (m_fMediaTypeChanged) {
+ if (!m_pPin || !m_pPin->m_pFilter) {
+ return hr;
+ }
+
+ CStreamSwitcherOutputPin* pOut = (static_cast<CStreamSwitcherFilter*>(m_pPin->m_pFilter))->GetOutputPin();
+ if (!pOut || !pOut->CurrentAllocator()) {
+ return hr;
+ }
+
+ ALLOCATOR_PROPERTIES Properties, Actual;
+ if (FAILED(pOut->CurrentAllocator()->GetProperties(&Actual))) {
+ return hr;
+ }
+ if (FAILED(GetProperties(&Properties))) {
+ return hr;
+ }
+
+ if (!m_bCommitted || Properties.cbBuffer < Actual.cbBuffer) {
+ Properties.cbBuffer = Actual.cbBuffer;
+ if (FAILED(Decommit())) {
+ return hr;
+ }
+ if (FAILED(SetProperties(&Properties, &Actual))) {
+ return hr;
+ }
+ if (FAILED(Commit())) {
+ return hr;
+ }
+ ASSERT(Actual.cbBuffer >= Properties.cbBuffer);
+ if (Actual.cbBuffer < Properties.cbBuffer) {
+ return hr;
+ }
+ }
+ }
+
+ hr = CMemAllocator::GetBuffer(ppBuffer, pStartTime, pEndTime, dwFlags);
+
+ if (m_fMediaTypeChanged && SUCCEEDED(hr)) {
+ (*ppBuffer)->SetMediaType(&m_mt);
+ m_fMediaTypeChanged = false;
+ }
+
+ return hr;
}
void CStreamSwitcherAllocator::NotifyMediaType(const CMediaType& mt)
{
- CopyMediaType(&m_mt, &mt);
- m_fMediaTypeChanged = true;
+ CopyMediaType(&m_mt, &mt);
+ m_fMediaTypeChanged = true;
}
@@ -384,565 +384,565 @@ void CStreamSwitcherAllocator::NotifyMediaType(const CMediaType& mt)
//
CStreamSwitcherInputPin::CStreamSwitcherInputPin(CStreamSwitcherFilter* pFilter, HRESULT* phr, LPCWSTR pName)
- : CBaseInputPin(NAME("CStreamSwitcherInputPin"), pFilter, &pFilter->m_csState, phr, pName)
- , m_Allocator(this, phr)
- , m_bSampleSkipped(FALSE)
- , m_bQualityChanged(FALSE)
- , m_bUsingOwnAllocator(FALSE)
- , m_evBlock(TRUE)
- , m_fCanBlock(false)
- , m_hNotifyEvent(NULL)
+ : CBaseInputPin(NAME("CStreamSwitcherInputPin"), pFilter, &pFilter->m_csState, phr, pName)
+ , m_Allocator(this, phr)
+ , m_bSampleSkipped(FALSE)
+ , m_bQualityChanged(FALSE)
+ , m_bUsingOwnAllocator(FALSE)
+ , m_evBlock(TRUE)
+ , m_fCanBlock(false)
+ , m_hNotifyEvent(NULL)
{
- m_bCanReconnectWhenActive = TRUE;
+ m_bCanReconnectWhenActive = TRUE;
}
class __declspec(uuid("138130AF-A79B-45D5-B4AA-87697457BA87"))
- NeroAudioDecoder {};
+ NeroAudioDecoder {};
STDMETHODIMP CStreamSwitcherInputPin::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- return
- QI(IStreamSwitcherInputPin)
- IsConnected() && GetCLSID(GetFilterFromPin(GetConnected())) == __uuidof(NeroAudioDecoder) && QI(IPinConnection)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IStreamSwitcherInputPin)
+ IsConnected() && GetCLSID(GetFilterFromPin(GetConnected())) == __uuidof(NeroAudioDecoder) && QI(IPinConnection)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
// IPinConnection
STDMETHODIMP CStreamSwitcherInputPin::DynamicQueryAccept(const AM_MEDIA_TYPE* pmt)
{
- return QueryAccept(pmt);
+ return QueryAccept(pmt);
}
STDMETHODIMP CStreamSwitcherInputPin::NotifyEndOfStream(HANDLE hNotifyEvent)
{
- if (m_hNotifyEvent) {
- SetEvent(m_hNotifyEvent);
- }
- m_hNotifyEvent = hNotifyEvent;
- return S_OK;
+ if (m_hNotifyEvent) {
+ SetEvent(m_hNotifyEvent);
+ }
+ m_hNotifyEvent = hNotifyEvent;
+ return S_OK;
}
STDMETHODIMP CStreamSwitcherInputPin::IsEndPin()
{
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CStreamSwitcherInputPin::DynamicDisconnect()
{
- CAutoLock cAutoLock(&m_csReceive);
- Disconnect();
- return S_OK;
+ CAutoLock cAutoLock(&m_csReceive);
+ Disconnect();
+ return S_OK;
}
// IStreamSwitcherInputPin
STDMETHODIMP_(bool) CStreamSwitcherInputPin::IsActive()
{
- // TODO: lock onto something here
- return (this == (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetInputPin());
+ // TODO: lock onto something here
+ return (this == (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetInputPin());
}
//
HRESULT CStreamSwitcherInputPin::QueryAcceptDownstream(const AM_MEDIA_TYPE* pmt)
{
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- CStreamSwitcherOutputPin* pOut = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetOutputPin();
+ CStreamSwitcherOutputPin* pOut = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetOutputPin();
- if (pOut && pOut->IsConnected()) {
- if (CComPtr<IPinConnection> pPC = pOut->CurrentPinConnection()) {
- hr = pPC->DynamicQueryAccept(pmt);
- if (hr == S_OK) {
- return S_OK;
- }
- }
+ if (pOut && pOut->IsConnected()) {
+ if (CComPtr<IPinConnection> pPC = pOut->CurrentPinConnection()) {
+ hr = pPC->DynamicQueryAccept(pmt);
+ if (hr == S_OK) {
+ return S_OK;
+ }
+ }
- hr = pOut->GetConnected()->QueryAccept(pmt);
- }
+ hr = pOut->GetConnected()->QueryAccept(pmt);
+ }
- return hr;
+ return hr;
}
void CStreamSwitcherInputPin::Block(bool fBlock)
{
- if (fBlock) {
- m_evBlock.Reset();
- } else {
- m_evBlock.Set();
- }
+ if (fBlock) {
+ m_evBlock.Reset();
+ } else {
+ m_evBlock.Set();
+ }
}
HRESULT CStreamSwitcherInputPin::InitializeOutputSample(IMediaSample* pInSample, IMediaSample** ppOutSample)
{
- if (!pInSample || !ppOutSample) {
- return E_POINTER;
- }
+ if (!pInSample || !ppOutSample) {
+ return E_POINTER;
+ }
- CStreamSwitcherOutputPin* pOut = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetOutputPin();
- ASSERT(pOut->GetConnected());
+ CStreamSwitcherOutputPin* pOut = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetOutputPin();
+ ASSERT(pOut->GetConnected());
- CComPtr<IMediaSample> pOutSample;
+ CComPtr<IMediaSample> pOutSample;
- DWORD dwFlags = m_bSampleSkipped ? AM_GBF_PREVFRAMESKIPPED : 0;
+ DWORD dwFlags = m_bSampleSkipped ? AM_GBF_PREVFRAMESKIPPED : 0;
- if (!(m_SampleProps.dwSampleFlags & AM_SAMPLE_SPLICEPOINT)) {
- dwFlags |= AM_GBF_NOTASYNCPOINT;
- }
+ if (!(m_SampleProps.dwSampleFlags & AM_SAMPLE_SPLICEPOINT)) {
+ dwFlags |= AM_GBF_NOTASYNCPOINT;
+ }
- HRESULT hr = pOut->GetDeliveryBuffer(&pOutSample
- , m_SampleProps.dwSampleFlags & AM_SAMPLE_TIMEVALID ? &m_SampleProps.tStart : NULL
- , m_SampleProps.dwSampleFlags & AM_SAMPLE_STOPVALID ? &m_SampleProps.tStop : NULL
- , dwFlags);
+ HRESULT hr = pOut->GetDeliveryBuffer(&pOutSample
+ , m_SampleProps.dwSampleFlags & AM_SAMPLE_TIMEVALID ? &m_SampleProps.tStart : NULL
+ , m_SampleProps.dwSampleFlags & AM_SAMPLE_STOPVALID ? &m_SampleProps.tStop : NULL
+ , dwFlags);
- if (FAILED(hr)) {
- return hr;
- }
+ if (FAILED(hr)) {
+ return hr;
+ }
- if (!pOutSample) {
- return E_FAIL;
- }
+ if (!pOutSample) {
+ return E_FAIL;
+ }
- if (CComQIPtr<IMediaSample2> pOutSample2 = pOutSample) {
- AM_SAMPLE2_PROPERTIES OutProps;
- EXECUTE_ASSERT(SUCCEEDED(pOutSample2->GetProperties(FIELD_OFFSET(AM_SAMPLE2_PROPERTIES, tStart), (PBYTE)&OutProps)));
- OutProps.dwTypeSpecificFlags = m_SampleProps.dwTypeSpecificFlags;
- OutProps.dwSampleFlags =
- (OutProps.dwSampleFlags & AM_SAMPLE_TYPECHANGED) |
- (m_SampleProps.dwSampleFlags & ~AM_SAMPLE_TYPECHANGED);
+ if (CComQIPtr<IMediaSample2> pOutSample2 = pOutSample) {
+ AM_SAMPLE2_PROPERTIES OutProps;
+ EXECUTE_ASSERT(SUCCEEDED(pOutSample2->GetProperties(FIELD_OFFSET(AM_SAMPLE2_PROPERTIES, tStart), (PBYTE)&OutProps)));
+ OutProps.dwTypeSpecificFlags = m_SampleProps.dwTypeSpecificFlags;
+ OutProps.dwSampleFlags =
+ (OutProps.dwSampleFlags & AM_SAMPLE_TYPECHANGED) |
+ (m_SampleProps.dwSampleFlags & ~AM_SAMPLE_TYPECHANGED);
- OutProps.tStart = m_SampleProps.tStart;
- OutProps.tStop = m_SampleProps.tStop;
- OutProps.cbData = FIELD_OFFSET(AM_SAMPLE2_PROPERTIES, dwStreamId);
+ OutProps.tStart = m_SampleProps.tStart;
+ OutProps.tStop = m_SampleProps.tStop;
+ OutProps.cbData = FIELD_OFFSET(AM_SAMPLE2_PROPERTIES, dwStreamId);
- hr = pOutSample2->SetProperties(FIELD_OFFSET(AM_SAMPLE2_PROPERTIES, dwStreamId), (PBYTE)&OutProps);
- if (m_SampleProps.dwSampleFlags & AM_SAMPLE_DATADISCONTINUITY) {
- m_bSampleSkipped = FALSE;
- }
- } else {
- if (m_SampleProps.dwSampleFlags & AM_SAMPLE_TIMEVALID) {
- pOutSample->SetTime(&m_SampleProps.tStart, &m_SampleProps.tStop);
- }
+ hr = pOutSample2->SetProperties(FIELD_OFFSET(AM_SAMPLE2_PROPERTIES, dwStreamId), (PBYTE)&OutProps);
+ if (m_SampleProps.dwSampleFlags & AM_SAMPLE_DATADISCONTINUITY) {
+ m_bSampleSkipped = FALSE;
+ }
+ } else {
+ if (m_SampleProps.dwSampleFlags & AM_SAMPLE_TIMEVALID) {
+ pOutSample->SetTime(&m_SampleProps.tStart, &m_SampleProps.tStop);
+ }
- if (m_SampleProps.dwSampleFlags & AM_SAMPLE_SPLICEPOINT) {
- pOutSample->SetSyncPoint(TRUE);
- }
+ if (m_SampleProps.dwSampleFlags & AM_SAMPLE_SPLICEPOINT) {
+ pOutSample->SetSyncPoint(TRUE);
+ }
- if (m_SampleProps.dwSampleFlags & AM_SAMPLE_DATADISCONTINUITY) {
- pOutSample->SetDiscontinuity(TRUE);
- m_bSampleSkipped = FALSE;
- }
+ if (m_SampleProps.dwSampleFlags & AM_SAMPLE_DATADISCONTINUITY) {
+ pOutSample->SetDiscontinuity(TRUE);
+ m_bSampleSkipped = FALSE;
+ }
- LONGLONG MediaStart, MediaEnd;
- if (pInSample->GetMediaTime(&MediaStart, &MediaEnd) == NOERROR) {
- pOutSample->SetMediaTime(&MediaStart, &MediaEnd);
- }
- }
+ LONGLONG MediaStart, MediaEnd;
+ if (pInSample->GetMediaTime(&MediaStart, &MediaEnd) == NOERROR) {
+ pOutSample->SetMediaTime(&MediaStart, &MediaEnd);
+ }
+ }
- *ppOutSample = pOutSample.Detach();
+ *ppOutSample = pOutSample.Detach();
- return S_OK;
+ return S_OK;
}
// pure virtual
HRESULT CStreamSwitcherInputPin::CheckMediaType(const CMediaType* pmt)
{
- return (static_cast<CStreamSwitcherFilter*>(m_pFilter))->CheckMediaType(pmt);
+ return (static_cast<CStreamSwitcherFilter*>(m_pFilter))->CheckMediaType(pmt);
}
// virtual
HRESULT CStreamSwitcherInputPin::CheckConnect(IPin* pPin)
{
- return (IPin*)(static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetOutputPin() == pPin
- ? E_FAIL
- : __super::CheckConnect(pPin);
+ return (IPin*)(static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetOutputPin() == pPin
+ ? E_FAIL
+ : __super::CheckConnect(pPin);
}
HRESULT CStreamSwitcherInputPin::CompleteConnect(IPin* pReceivePin)
{
- HRESULT hr = __super::CompleteConnect(pReceivePin);
- if (FAILED(hr)) {
- return hr;
- }
-
- (static_cast<CStreamSwitcherFilter*>(m_pFilter))->CompleteConnect(PINDIR_INPUT, this, pReceivePin);
-
- m_fCanBlock = false;
- bool fForkedSomewhere = false;
-
- CStringW fileName;
- CStringW pinName;
-
- IPin* pPin = (IPin*)this;
- IBaseFilter* pBF = (IBaseFilter*)m_pFilter;
-
- pPin = GetUpStreamPin(pBF, pPin);
- if (pPin) {
- pBF = GetFilterFromPin(pPin);
- }
- while (pPin && pBF) {
- if (IsSplitter(pBF)) {
- pinName = GetPinName(pPin);
- }
-
- CLSID clsid = GetCLSID(pBF);
- if (clsid == CLSID_AviSplitter || clsid == CLSID_OggSplitter) {
- m_fCanBlock = true;
- }
-
- int nIn, nOut, nInC, nOutC;
- CountPins(pBF, nIn, nOut, nInC, nOutC);
- fForkedSomewhere = fForkedSomewhere || nIn > 1 || nOut > 1;
-
- if (CComQIPtr<IFileSourceFilter> pFSF = pBF) {
- WCHAR* pszName = NULL;
- AM_MEDIA_TYPE mt;
- if (SUCCEEDED(pFSF->GetCurFile(&pszName, &mt)) && pszName) {
- fileName = pszName;
- CoTaskMemFree(pszName);
-
- fileName.Replace('\\', '/');
- CStringW fn = fileName.Mid(fileName.ReverseFind('/')+1);
- if (!fn.IsEmpty()) {
- fileName = fn;
- }
-
- // Haali & LAVFSplitter return only one "Audio" pin name, cause CMainFrame::OnInitMenuPopup lookup find the wrong popmenu,
- // add space at the end to prevent this, internal filter never return "Audio" only.
- if (!pinName.IsEmpty()) {
- fileName = pinName + L" ";
- }
-
- WCHAR* pName = DNew WCHAR[fileName.GetLength()+1];
- if (pName) {
- wcscpy_s(pName, fileName.GetLength() + 1, fileName);
- if (m_pName) {
- delete [] m_pName;
- }
- m_pName = pName;
- }
- }
-
- break;
- }
-
- pPin = GetFirstPin(pBF);
-
- pPin = GetUpStreamPin(pBF, pPin);
- if (pPin) {
- pBF = GetFilterFromPin(pPin);
- }
- }
-
- if (!fForkedSomewhere) {
- m_fCanBlock = true;
- }
-
- m_hNotifyEvent = NULL;
-
- return S_OK;
+ HRESULT hr = __super::CompleteConnect(pReceivePin);
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ (static_cast<CStreamSwitcherFilter*>(m_pFilter))->CompleteConnect(PINDIR_INPUT, this, pReceivePin);
+
+ m_fCanBlock = false;
+ bool fForkedSomewhere = false;
+
+ CStringW fileName;
+ CStringW pinName;
+
+ IPin* pPin = (IPin*)this;
+ IBaseFilter* pBF = (IBaseFilter*)m_pFilter;
+
+ pPin = GetUpStreamPin(pBF, pPin);
+ if (pPin) {
+ pBF = GetFilterFromPin(pPin);
+ }
+ while (pPin && pBF) {
+ if (IsSplitter(pBF)) {
+ pinName = GetPinName(pPin);
+ }
+
+ CLSID clsid = GetCLSID(pBF);
+ if (clsid == CLSID_AviSplitter || clsid == CLSID_OggSplitter) {
+ m_fCanBlock = true;
+ }
+
+ int nIn, nOut, nInC, nOutC;
+ CountPins(pBF, nIn, nOut, nInC, nOutC);
+ fForkedSomewhere = fForkedSomewhere || nIn > 1 || nOut > 1;
+
+ if (CComQIPtr<IFileSourceFilter> pFSF = pBF) {
+ WCHAR* pszName = NULL;
+ AM_MEDIA_TYPE mt;
+ if (SUCCEEDED(pFSF->GetCurFile(&pszName, &mt)) && pszName) {
+ fileName = pszName;
+ CoTaskMemFree(pszName);
+
+ fileName.Replace('\\', '/');
+ CStringW fn = fileName.Mid(fileName.ReverseFind('/') + 1);
+ if (!fn.IsEmpty()) {
+ fileName = fn;
+ }
+
+ // Haali & LAVFSplitter return only one "Audio" pin name, cause CMainFrame::OnInitMenuPopup lookup find the wrong popmenu,
+ // add space at the end to prevent this, internal filter never return "Audio" only.
+ if (!pinName.IsEmpty()) {
+ fileName = pinName + L" ";
+ }
+
+ WCHAR* pName = DNew WCHAR[fileName.GetLength() + 1];
+ if (pName) {
+ wcscpy_s(pName, fileName.GetLength() + 1, fileName);
+ if (m_pName) {
+ delete [] m_pName;
+ }
+ m_pName = pName;
+ }
+ }
+
+ break;
+ }
+
+ pPin = GetFirstPin(pBF);
+
+ pPin = GetUpStreamPin(pBF, pPin);
+ if (pPin) {
+ pBF = GetFilterFromPin(pPin);
+ }
+ }
+
+ if (!fForkedSomewhere) {
+ m_fCanBlock = true;
+ }
+
+ m_hNotifyEvent = NULL;
+
+ return S_OK;
}
HRESULT CStreamSwitcherInputPin::Active()
{
- Block(!IsActive());
+ Block(!IsActive());
- return __super::Active();
+ return __super::Active();
}
HRESULT CStreamSwitcherInputPin::Inactive()
{
- Block(false);
+ Block(false);
- return __super::Inactive();
+ return __super::Inactive();
}
// IPin
STDMETHODIMP CStreamSwitcherInputPin::QueryAccept(const AM_MEDIA_TYPE* pmt)
{
- HRESULT hr = __super::QueryAccept(pmt);
- if (S_OK != hr) {
- return hr;
- }
+ HRESULT hr = __super::QueryAccept(pmt);
+ if (S_OK != hr) {
+ return hr;
+ }
- return QueryAcceptDownstream(pmt);
+ return QueryAcceptDownstream(pmt);
}
STDMETHODIMP CStreamSwitcherInputPin::ReceiveConnection(IPin* pConnector, const AM_MEDIA_TYPE* pmt)
{
- // FIXME: this locked up once
- // CAutoLock cAutoLock(&((CStreamSwitcherFilter*)m_pFilter)->m_csReceive);
+ // FIXME: this locked up once
+ // CAutoLock cAutoLock(&((CStreamSwitcherFilter*)m_pFilter)->m_csReceive);
- HRESULT hr;
- if (S_OK != (hr = QueryAcceptDownstream(pmt))) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
+ HRESULT hr;
+ if (S_OK != (hr = QueryAcceptDownstream(pmt))) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
- if (m_Connected && m_Connected != pConnector) {
- return VFW_E_ALREADY_CONNECTED;
- }
+ if (m_Connected && m_Connected != pConnector) {
+ return VFW_E_ALREADY_CONNECTED;
+ }
- if (m_Connected) {
- m_Connected->Release(), m_Connected = NULL;
- }
+ if (m_Connected) {
+ m_Connected->Release(), m_Connected = NULL;
+ }
- return SUCCEEDED(__super::ReceiveConnection(pConnector, pmt)) ? S_OK : E_FAIL;
+ return SUCCEEDED(__super::ReceiveConnection(pConnector, pmt)) ? S_OK : E_FAIL;
}
STDMETHODIMP CStreamSwitcherInputPin::GetAllocator(IMemAllocator** ppAllocator)
{
- CheckPointer(ppAllocator, E_POINTER);
+ CheckPointer(ppAllocator, E_POINTER);
- if (m_pAllocator == NULL) {
- (m_pAllocator = &m_Allocator)->AddRef();
- }
+ if (m_pAllocator == NULL) {
+ (m_pAllocator = &m_Allocator)->AddRef();
+ }
- (*ppAllocator = m_pAllocator)->AddRef();
+ (*ppAllocator = m_pAllocator)->AddRef();
- return NOERROR;
+ return NOERROR;
}
STDMETHODIMP CStreamSwitcherInputPin::NotifyAllocator(IMemAllocator* pAllocator, BOOL bReadOnly)
{
- HRESULT hr = __super::NotifyAllocator(pAllocator, bReadOnly);
- if (FAILED(hr)) {
- return hr;
- }
+ HRESULT hr = __super::NotifyAllocator(pAllocator, bReadOnly);
+ if (FAILED(hr)) {
+ return hr;
+ }
- m_bUsingOwnAllocator = (pAllocator == (IMemAllocator*)&m_Allocator);
+ m_bUsingOwnAllocator = (pAllocator == (IMemAllocator*)&m_Allocator);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CStreamSwitcherInputPin::BeginFlush()
{
- CAutoLock cAutoLock(&(static_cast<CStreamSwitcherFilter*>(m_pFilter))->m_csState);
+ CAutoLock cAutoLock(&(static_cast<CStreamSwitcherFilter*>(m_pFilter))->m_csState);
- HRESULT hr;
+ HRESULT hr;
- CStreamSwitcherFilter* pSSF = static_cast<CStreamSwitcherFilter*>(m_pFilter);
+ CStreamSwitcherFilter* pSSF = static_cast<CStreamSwitcherFilter*>(m_pFilter);
- CStreamSwitcherOutputPin* pOut = pSSF->GetOutputPin();
- if (!IsConnected() || !pOut || !pOut->IsConnected()) {
- return VFW_E_NOT_CONNECTED;
- }
+ CStreamSwitcherOutputPin* pOut = pSSF->GetOutputPin();
+ if (!IsConnected() || !pOut || !pOut->IsConnected()) {
+ return VFW_E_NOT_CONNECTED;
+ }
- if (FAILED(hr = __super::BeginFlush())) {
- return hr;
- }
+ if (FAILED(hr = __super::BeginFlush())) {
+ return hr;
+ }
- return IsActive() ? pSSF->DeliverBeginFlush() : Block(false), S_OK;
+ return IsActive() ? pSSF->DeliverBeginFlush() : Block(false), S_OK;
}
STDMETHODIMP CStreamSwitcherInputPin::EndFlush()
{
- CAutoLock cAutoLock(&(static_cast<CStreamSwitcherFilter*>(m_pFilter))->m_csState);
+ CAutoLock cAutoLock(&(static_cast<CStreamSwitcherFilter*>(m_pFilter))->m_csState);
- HRESULT hr;
+ HRESULT hr;
- CStreamSwitcherFilter* pSSF = static_cast<CStreamSwitcherFilter*>(m_pFilter);
+ CStreamSwitcherFilter* pSSF = static_cast<CStreamSwitcherFilter*>(m_pFilter);
- CStreamSwitcherOutputPin* pOut = pSSF->GetOutputPin();
- if (!IsConnected() || !pOut || !pOut->IsConnected()) {
- return VFW_E_NOT_CONNECTED;
- }
+ CStreamSwitcherOutputPin* pOut = pSSF->GetOutputPin();
+ if (!IsConnected() || !pOut || !pOut->IsConnected()) {
+ return VFW_E_NOT_CONNECTED;
+ }
- if (FAILED(hr = __super::EndFlush())) {
- return hr;
- }
+ if (FAILED(hr = __super::EndFlush())) {
+ return hr;
+ }
- return IsActive() ? pSSF->DeliverEndFlush() : Block(true), S_OK;
+ return IsActive() ? pSSF->DeliverEndFlush() : Block(true), S_OK;
}
STDMETHODIMP CStreamSwitcherInputPin::EndOfStream()
{
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- CStreamSwitcherFilter* pSSF = static_cast<CStreamSwitcherFilter*>(m_pFilter);
+ CStreamSwitcherFilter* pSSF = static_cast<CStreamSwitcherFilter*>(m_pFilter);
- CStreamSwitcherOutputPin* pOut = pSSF->GetOutputPin();
- if (!IsConnected() || !pOut || !pOut->IsConnected()) {
- return VFW_E_NOT_CONNECTED;
- }
+ CStreamSwitcherOutputPin* pOut = pSSF->GetOutputPin();
+ if (!IsConnected() || !pOut || !pOut->IsConnected()) {
+ return VFW_E_NOT_CONNECTED;
+ }
- if (m_hNotifyEvent) {
- SetEvent(m_hNotifyEvent), m_hNotifyEvent = NULL;
- return S_OK;
- }
+ if (m_hNotifyEvent) {
+ SetEvent(m_hNotifyEvent), m_hNotifyEvent = NULL;
+ return S_OK;
+ }
- return IsActive() ? pSSF->DeliverEndOfStream() : S_OK;
+ return IsActive() ? pSSF->DeliverEndOfStream() : S_OK;
}
// IMemInputPin
STDMETHODIMP CStreamSwitcherInputPin::Receive(IMediaSample* pSample)
{
- AM_MEDIA_TYPE* pmt = NULL;
- if (SUCCEEDED(pSample->GetMediaType(&pmt)) && pmt) {
- const CMediaType mt(*pmt);
- DeleteMediaType(pmt), pmt = NULL;
- SetMediaType(&mt);
- }
+ AM_MEDIA_TYPE* pmt = NULL;
+ if (SUCCEEDED(pSample->GetMediaType(&pmt)) && pmt) {
+ const CMediaType mt(*pmt);
+ DeleteMediaType(pmt), pmt = NULL;
+ SetMediaType(&mt);
+ }
- // DAMN!!!!!! this doesn't work if the stream we are blocking
- // shares the same thread with another stream, mpeg splitters
- // are usually like that. Our nicely built up multithreaded
- // strategy is useless because of this, ARRRRRRGHHHHHH.
+ // DAMN!!!!!! this doesn't work if the stream we are blocking
+ // shares the same thread with another stream, mpeg splitters
+ // are usually like that. Our nicely built up multithreaded
+ // strategy is useless because of this, ARRRRRRGHHHHHH.
#ifdef BLOCKSTREAM
- if (m_fCanBlock) {
- m_evBlock.Wait();
- }
+ if (m_fCanBlock) {
+ m_evBlock.Wait();
+ }
#endif
- if (!IsActive()) {
+ if (!IsActive()) {
#ifdef BLOCKSTREAM
- if (m_fCanBlock) {
- return S_FALSE;
- }
+ if (m_fCanBlock) {
+ return S_FALSE;
+ }
#endif
- TRACE(_T("&^$#@ : a stupid fix for this stupid problem\n"));
- //Sleep(32);
- return E_FAIL; // a stupid fix for this stupid problem
- }
-
- CAutoLock cAutoLock(&m_csReceive);
-
- CStreamSwitcherOutputPin* pOut = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetOutputPin();
- ASSERT(pOut->GetConnected());
-
- HRESULT hr = __super::Receive(pSample);
- if (S_OK != hr) {
- return hr;
- }
-
- if (m_SampleProps.dwStreamId != AM_STREAM_MEDIA) {
- return pOut->Deliver(pSample);
- }
-
- //
-
- ALLOCATOR_PROPERTIES props, actual;
- hr = m_pAllocator->GetProperties(&props);
- hr = pOut->CurrentAllocator()->GetProperties(&actual);
-
- REFERENCE_TIME rtStart = 0, rtStop = 0;
- if (S_OK == pSample->GetTime(&rtStart, &rtStop)) {
- //
- }
-
- long cbBuffer = pSample->GetActualDataLength();
-
- CMediaType mtOut = m_mt;
- mtOut = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->CreateNewOutputMediaType(mtOut, cbBuffer);
-
- bool fTypeChanged = false;
-
- if (mtOut != pOut->CurrentMediaType() || cbBuffer > actual.cbBuffer) {
- fTypeChanged = true;
-
- m_SampleProps.dwSampleFlags |= AM_SAMPLE_TYPECHANGED/*|AM_SAMPLE_DATADISCONTINUITY|AM_SAMPLE_TIMEDISCONTINUITY*/;
-
- /*
- if (CComQIPtr<IPinConnection> pPC = pOut->CurrentPinConnection())
- {
- HANDLE hEOS = CreateEvent(NULL, FALSE, FALSE, NULL);
- hr = pPC->NotifyEndOfStream(hEOS);
- hr = pOut->DeliverEndOfStream();
- WaitForSingleObject(hEOS, 3000);
- CloseHandle(hEOS);
- hr = pOut->DeliverBeginFlush();
- hr = pOut->DeliverEndFlush();
- }
- */
-
- if (props.cBuffers < 8 && mtOut.majortype == MEDIATYPE_Audio) {
- props.cBuffers = 8;
- }
-
- props.cbBuffer = cbBuffer;
-
- if (actual.cbAlign != props.cbAlign
- || actual.cbPrefix != props.cbPrefix
- || actual.cBuffers < props.cBuffers
- || actual.cbBuffer < props.cbBuffer) {
- hr = pOut->DeliverBeginFlush();
- hr = pOut->DeliverEndFlush();
- hr = pOut->CurrentAllocator()->Decommit();
- hr = pOut->CurrentAllocator()->SetProperties(&props, &actual);
- hr = pOut->CurrentAllocator()->Commit();
- }
- }
-
- CComPtr<IMediaSample> pOutSample;
- if (FAILED(InitializeOutputSample(pSample, &pOutSample))) {
- return E_FAIL;
- }
-
- pmt = NULL;
- if (SUCCEEDED(pOutSample->GetMediaType(&pmt)) && pmt) {
- const CMediaType mt(*pmt);
- DeleteMediaType(pmt), pmt = NULL;
- // TODO
- ASSERT(0);
- }
-
- if (fTypeChanged) {
- pOut->SetMediaType(&mtOut);
- (static_cast<CStreamSwitcherFilter*>(m_pFilter))->OnNewOutputMediaType(m_mt, mtOut);
- pOutSample->SetMediaType(&mtOut);
- }
-
- // Transform
-
- hr = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->Transform(pSample, pOutSample);
-
- //
-
- if (S_OK == hr) {
- hr = pOut->Deliver(pOutSample);
- m_bSampleSkipped = FALSE;
- /*
- if (FAILED(hr))
- {
- ASSERT(0);
- }
- */
- } else if (S_FALSE == hr) {
- hr = S_OK;
- pOutSample = NULL;
- m_bSampleSkipped = TRUE;
-
- if (!m_bQualityChanged) {
- m_pFilter->NotifyEvent(EC_QUALITY_CHANGE, 0, 0);
- m_bQualityChanged = TRUE;
- }
- }
-
- return hr;
+ TRACE(_T("&^$#@ : a stupid fix for this stupid problem\n"));
+ //Sleep(32);
+ return E_FAIL; // a stupid fix for this stupid problem
+ }
+
+ CAutoLock cAutoLock(&m_csReceive);
+
+ CStreamSwitcherOutputPin* pOut = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetOutputPin();
+ ASSERT(pOut->GetConnected());
+
+ HRESULT hr = __super::Receive(pSample);
+ if (S_OK != hr) {
+ return hr;
+ }
+
+ if (m_SampleProps.dwStreamId != AM_STREAM_MEDIA) {
+ return pOut->Deliver(pSample);
+ }
+
+ //
+
+ ALLOCATOR_PROPERTIES props, actual;
+ hr = m_pAllocator->GetProperties(&props);
+ hr = pOut->CurrentAllocator()->GetProperties(&actual);
+
+ REFERENCE_TIME rtStart = 0, rtStop = 0;
+ if (S_OK == pSample->GetTime(&rtStart, &rtStop)) {
+ //
+ }
+
+ long cbBuffer = pSample->GetActualDataLength();
+
+ CMediaType mtOut = m_mt;
+ mtOut = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->CreateNewOutputMediaType(mtOut, cbBuffer);
+
+ bool fTypeChanged = false;
+
+ if (mtOut != pOut->CurrentMediaType() || cbBuffer > actual.cbBuffer) {
+ fTypeChanged = true;
+
+ m_SampleProps.dwSampleFlags |= AM_SAMPLE_TYPECHANGED/*|AM_SAMPLE_DATADISCONTINUITY|AM_SAMPLE_TIMEDISCONTINUITY*/;
+
+ /*
+ if (CComQIPtr<IPinConnection> pPC = pOut->CurrentPinConnection())
+ {
+ HANDLE hEOS = CreateEvent(NULL, FALSE, FALSE, NULL);
+ hr = pPC->NotifyEndOfStream(hEOS);
+ hr = pOut->DeliverEndOfStream();
+ WaitForSingleObject(hEOS, 3000);
+ CloseHandle(hEOS);
+ hr = pOut->DeliverBeginFlush();
+ hr = pOut->DeliverEndFlush();
+ }
+ */
+
+ if (props.cBuffers < 8 && mtOut.majortype == MEDIATYPE_Audio) {
+ props.cBuffers = 8;
+ }
+
+ props.cbBuffer = cbBuffer;
+
+ if (actual.cbAlign != props.cbAlign
+ || actual.cbPrefix != props.cbPrefix
+ || actual.cBuffers < props.cBuffers
+ || actual.cbBuffer < props.cbBuffer) {
+ hr = pOut->DeliverBeginFlush();
+ hr = pOut->DeliverEndFlush();
+ hr = pOut->CurrentAllocator()->Decommit();
+ hr = pOut->CurrentAllocator()->SetProperties(&props, &actual);
+ hr = pOut->CurrentAllocator()->Commit();
+ }
+ }
+
+ CComPtr<IMediaSample> pOutSample;
+ if (FAILED(InitializeOutputSample(pSample, &pOutSample))) {
+ return E_FAIL;
+ }
+
+ pmt = NULL;
+ if (SUCCEEDED(pOutSample->GetMediaType(&pmt)) && pmt) {
+ const CMediaType mt(*pmt);
+ DeleteMediaType(pmt), pmt = NULL;
+ // TODO
+ ASSERT(0);
+ }
+
+ if (fTypeChanged) {
+ pOut->SetMediaType(&mtOut);
+ (static_cast<CStreamSwitcherFilter*>(m_pFilter))->OnNewOutputMediaType(m_mt, mtOut);
+ pOutSample->SetMediaType(&mtOut);
+ }
+
+ // Transform
+
+ hr = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->Transform(pSample, pOutSample);
+
+ //
+
+ if (S_OK == hr) {
+ hr = pOut->Deliver(pOutSample);
+ m_bSampleSkipped = FALSE;
+ /*
+ if (FAILED(hr))
+ {
+ ASSERT(0);
+ }
+ */
+ } else if (S_FALSE == hr) {
+ hr = S_OK;
+ pOutSample = NULL;
+ m_bSampleSkipped = TRUE;
+
+ if (!m_bQualityChanged) {
+ m_pFilter->NotifyEvent(EC_QUALITY_CHANGE, 0, 0);
+ m_bQualityChanged = TRUE;
+ }
+ }
+
+ return hr;
}
STDMETHODIMP CStreamSwitcherInputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- if (!IsConnected()) {
- return S_OK;
- }
+ if (!IsConnected()) {
+ return S_OK;
+ }
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- CStreamSwitcherFilter* pSSF = static_cast<CStreamSwitcherFilter*>(m_pFilter);
+ CStreamSwitcherFilter* pSSF = static_cast<CStreamSwitcherFilter*>(m_pFilter);
- CStreamSwitcherOutputPin* pOut = pSSF->GetOutputPin();
- if (!pOut || !pOut->IsConnected()) {
- return VFW_E_NOT_CONNECTED;
- }
+ CStreamSwitcherOutputPin* pOut = pSSF->GetOutputPin();
+ if (!pOut || !pOut->IsConnected()) {
+ return VFW_E_NOT_CONNECTED;
+ }
- return pSSF->DeliverNewSegment(tStart, tStop, dRate);
+ return pSSF->DeliverNewSegment(tStart, tStop, dRate);
}
//
@@ -950,206 +950,206 @@ STDMETHODIMP CStreamSwitcherInputPin::NewSegment(REFERENCE_TIME tStart, REFERENC
//
CStreamSwitcherOutputPin::CStreamSwitcherOutputPin(CStreamSwitcherFilter* pFilter, HRESULT* phr)
- : CBaseOutputPin(NAME("CStreamSwitcherOutputPin"), pFilter, &pFilter->m_csState, phr, L"Out")
+ : CBaseOutputPin(NAME("CStreamSwitcherOutputPin"), pFilter, &pFilter->m_csState, phr, L"Out")
{
- // m_bCanReconnectWhenActive = TRUE;
+ // m_bCanReconnectWhenActive = TRUE;
}
-STDMETHODIMP CStreamSwitcherOutputPin::NonDelegatingQueryInterface(REFIID riid, void **ppv)
+STDMETHODIMP CStreamSwitcherOutputPin::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv,E_POINTER);
- ValidateReadWritePtr(ppv, sizeof(PVOID));
- *ppv = NULL;
+ CheckPointer(ppv, E_POINTER);
+ ValidateReadWritePtr(ppv, sizeof(PVOID));
+ *ppv = NULL;
- if (riid == IID_IMediaPosition || riid == IID_IMediaSeeking) {
- if (m_pStreamSwitcherPassThru == NULL) {
- HRESULT hr = S_OK;
- m_pStreamSwitcherPassThru = (IUnknown*)(INonDelegatingUnknown*)
- DNew CStreamSwitcherPassThru(GetOwner(), &hr, static_cast<CStreamSwitcherFilter*>(m_pFilter));
+ if (riid == IID_IMediaPosition || riid == IID_IMediaSeeking) {
+ if (m_pStreamSwitcherPassThru == NULL) {
+ HRESULT hr = S_OK;
+ m_pStreamSwitcherPassThru = (IUnknown*)(INonDelegatingUnknown*)
+ DNew CStreamSwitcherPassThru(GetOwner(), &hr, static_cast<CStreamSwitcherFilter*>(m_pFilter));
- if (!m_pStreamSwitcherPassThru) {
- return E_OUTOFMEMORY;
- }
- if (FAILED(hr)) {
- return hr;
- }
- }
+ if (!m_pStreamSwitcherPassThru) {
+ return E_OUTOFMEMORY;
+ }
+ if (FAILED(hr)) {
+ return hr;
+ }
+ }
- return m_pStreamSwitcherPassThru->QueryInterface(riid, ppv);
- }
- /*
- else if (riid == IID_IStreamBuilder)
- {
- return GetInterface((IStreamBuilder*)this, ppv);
- }
- */
- return CBaseOutputPin::NonDelegatingQueryInterface(riid, ppv);
+ return m_pStreamSwitcherPassThru->QueryInterface(riid, ppv);
+ }
+ /*
+ else if (riid == IID_IStreamBuilder)
+ {
+ return GetInterface((IStreamBuilder*)this, ppv);
+ }
+ */
+ return CBaseOutputPin::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CStreamSwitcherOutputPin::QueryAcceptUpstream(const AM_MEDIA_TYPE* pmt)
{
- HRESULT hr = S_FALSE;
+ HRESULT hr = S_FALSE;
- CStreamSwitcherInputPin* pIn = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetInputPin();
+ CStreamSwitcherInputPin* pIn = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetInputPin();
- if (pIn && pIn->IsConnected() && (pIn->IsUsingOwnAllocator() || pIn->CurrentMediaType() == *pmt)) {
- if (CComQIPtr<IPin> pPinTo = pIn->GetConnected()) {
- if (S_OK != (hr = pPinTo->QueryAccept(pmt))) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- } else {
- return E_FAIL;
- }
- }
+ if (pIn && pIn->IsConnected() && (pIn->IsUsingOwnAllocator() || pIn->CurrentMediaType() == *pmt)) {
+ if (CComQIPtr<IPin> pPinTo = pIn->GetConnected()) {
+ if (S_OK != (hr = pPinTo->QueryAccept(pmt))) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ } else {
+ return E_FAIL;
+ }
+ }
- return hr;
+ return hr;
}
// pure virtual
HRESULT CStreamSwitcherOutputPin::DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties)
{
- CStreamSwitcherInputPin* pIn = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetInputPin();
- if (!pIn || !pIn->IsConnected()) {
- return E_UNEXPECTED;
- }
+ CStreamSwitcherInputPin* pIn = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetInputPin();
+ if (!pIn || !pIn->IsConnected()) {
+ return E_UNEXPECTED;
+ }
- CComPtr<IMemAllocator> pAllocatorIn;
- pIn->GetAllocator(&pAllocatorIn);
- if (!pAllocatorIn) {
- return E_UNEXPECTED;
- }
+ CComPtr<IMemAllocator> pAllocatorIn;
+ pIn->GetAllocator(&pAllocatorIn);
+ if (!pAllocatorIn) {
+ return E_UNEXPECTED;
+ }
- HRESULT hr;
- if (FAILED(hr = pAllocatorIn->GetProperties(pProperties))) {
- return hr;
- }
+ HRESULT hr;
+ if (FAILED(hr = pAllocatorIn->GetProperties(pProperties))) {
+ return hr;
+ }
- if (pProperties->cBuffers < 8 && pIn->CurrentMediaType().majortype == MEDIATYPE_Audio) {
- pProperties->cBuffers = 8;
- }
+ if (pProperties->cBuffers < 8 && pIn->CurrentMediaType().majortype == MEDIATYPE_Audio) {
+ pProperties->cBuffers = 8;
+ }
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- return (pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
- ? E_FAIL
- : NOERROR);
+ return (pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
+ ? E_FAIL
+ : NOERROR);
}
// virtual
class __declspec(uuid("AEFA5024-215A-4FC7-97A4-1043C86FD0B8"))
- MatrixMixer {};
+ MatrixMixer {};
HRESULT CStreamSwitcherOutputPin::CheckConnect(IPin* pPin)
{
- CComPtr<IBaseFilter> pBF = GetFilterFromPin(pPin);
+ CComPtr<IBaseFilter> pBF = GetFilterFromPin(pPin);
- return
- IsAudioWaveRenderer(pBF) || GetCLSID(pBF) == __uuidof(MatrixMixer)
- ? __super::CheckConnect(pPin)
- : E_FAIL;
+ return
+ IsAudioWaveRenderer(pBF) || GetCLSID(pBF) == __uuidof(MatrixMixer)
+ ? __super::CheckConnect(pPin)
+ : E_FAIL;
- // return CComQIPtr<IPinConnection>(pPin) ? CBaseOutputPin::CheckConnect(pPin) : E_NOINTERFACE;
- // return CBaseOutputPin::CheckConnect(pPin);
+ // return CComQIPtr<IPinConnection>(pPin) ? CBaseOutputPin::CheckConnect(pPin) : E_NOINTERFACE;
+ // return CBaseOutputPin::CheckConnect(pPin);
}
HRESULT CStreamSwitcherOutputPin::BreakConnect()
{
- m_pPinConnection = NULL;
- return __super::BreakConnect();
+ m_pPinConnection = NULL;
+ return __super::BreakConnect();
}
HRESULT CStreamSwitcherOutputPin::CompleteConnect(IPin* pReceivePin)
{
- m_pPinConnection = CComQIPtr<IPinConnection>(pReceivePin);
- return __super::CompleteConnect(pReceivePin);
+ m_pPinConnection = CComQIPtr<IPinConnection>(pReceivePin);
+ return __super::CompleteConnect(pReceivePin);
}
HRESULT CStreamSwitcherOutputPin::CheckMediaType(const CMediaType* pmt)
{
- return (static_cast<CStreamSwitcherFilter*>(m_pFilter))->CheckMediaType(pmt);
+ return (static_cast<CStreamSwitcherFilter*>(m_pFilter))->CheckMediaType(pmt);
}
HRESULT CStreamSwitcherOutputPin::GetMediaType(int iPosition, CMediaType* pmt)
{
- CStreamSwitcherInputPin* pIn = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetInputPin();
- if (!pIn || !pIn->IsConnected()) {
- return E_UNEXPECTED;
- }
+ CStreamSwitcherInputPin* pIn = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetInputPin();
+ if (!pIn || !pIn->IsConnected()) {
+ return E_UNEXPECTED;
+ }
- CComPtr<IEnumMediaTypes> pEM;
- if (FAILED(pIn->GetConnected()->EnumMediaTypes(&pEM))) {
- return VFW_S_NO_MORE_ITEMS;
- }
+ CComPtr<IEnumMediaTypes> pEM;
+ if (FAILED(pIn->GetConnected()->EnumMediaTypes(&pEM))) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
- if (iPosition > 0 && FAILED(pEM->Skip(iPosition))) {
- return VFW_S_NO_MORE_ITEMS;
- }
+ if (iPosition > 0 && FAILED(pEM->Skip(iPosition))) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
- AM_MEDIA_TYPE* tmp = NULL;
- if (S_OK != pEM->Next(1, &tmp, NULL) || !tmp) {
- return VFW_S_NO_MORE_ITEMS;
- }
+ AM_MEDIA_TYPE* tmp = NULL;
+ if (S_OK != pEM->Next(1, &tmp, NULL) || !tmp) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
- CopyMediaType(pmt, tmp);
- DeleteMediaType(tmp);
- /*
- if (iPosition < 0) return E_INVALIDARG;
- if (iPosition > 0) return VFW_S_NO_MORE_ITEMS;
+ CopyMediaType(pmt, tmp);
+ DeleteMediaType(tmp);
+ /*
+ if (iPosition < 0) return E_INVALIDARG;
+ if (iPosition > 0) return VFW_S_NO_MORE_ITEMS;
- CopyMediaType(pmt, &pIn->CurrentMediaType());
- */
- return S_OK;
+ CopyMediaType(pmt, &pIn->CurrentMediaType());
+ */
+ return S_OK;
}
// IPin
STDMETHODIMP CStreamSwitcherOutputPin::QueryAccept(const AM_MEDIA_TYPE* pmt)
{
- HRESULT hr = __super::QueryAccept(pmt);
- if (S_OK != hr) {
- return hr;
- }
+ HRESULT hr = __super::QueryAccept(pmt);
+ if (S_OK != hr) {
+ return hr;
+ }
- return QueryAcceptUpstream(pmt);
+ return QueryAcceptUpstream(pmt);
}
// IQualityControl
STDMETHODIMP CStreamSwitcherOutputPin::Notify(IBaseFilter* pSender, Quality q)
{
- CStreamSwitcherInputPin* pIn = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetInputPin();
- if (!pIn || !pIn->IsConnected()) {
- return VFW_E_NOT_CONNECTED;
- }
- return pIn->PassNotify(q);
+ CStreamSwitcherInputPin* pIn = (static_cast<CStreamSwitcherFilter*>(m_pFilter))->GetInputPin();
+ if (!pIn || !pIn->IsConnected()) {
+ return VFW_E_NOT_CONNECTED;
+ }
+ return pIn->PassNotify(q);
}
// IStreamBuilder
STDMETHODIMP CStreamSwitcherOutputPin::Render(IPin* ppinOut, IGraphBuilder* pGraph)
{
- CComPtr<IBaseFilter> pBF;
- pBF.CoCreateInstance(CLSID_DSoundRender);
- if (!pBF || FAILED(pGraph->AddFilter(pBF, L"Default DirectSound Device"))) {
- return E_FAIL;
- }
+ CComPtr<IBaseFilter> pBF;
+ pBF.CoCreateInstance(CLSID_DSoundRender);
+ if (!pBF || FAILED(pGraph->AddFilter(pBF, L"Default DirectSound Device"))) {
+ return E_FAIL;
+ }
- if (FAILED(pGraph->ConnectDirect(ppinOut, GetFirstDisconnectedPin(pBF, PINDIR_INPUT), NULL))) {
- pGraph->RemoveFilter(pBF);
- return E_FAIL;
- }
+ if (FAILED(pGraph->ConnectDirect(ppinOut, GetFirstDisconnectedPin(pBF, PINDIR_INPUT), NULL))) {
+ pGraph->RemoveFilter(pBF);
+ return E_FAIL;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CStreamSwitcherOutputPin::Backout(IPin* ppinOut, IGraphBuilder* pGraph)
{
- return S_OK;
+ return S_OK;
}
//
@@ -1157,321 +1157,321 @@ STDMETHODIMP CStreamSwitcherOutputPin::Backout(IPin* ppinOut, IGraphBuilder* pGr
//
CStreamSwitcherFilter::CStreamSwitcherFilter(LPUNKNOWN lpunk, HRESULT* phr, const CLSID& clsid)
- : CBaseFilter(NAME("CStreamSwitcherFilter"), lpunk, &m_csState, clsid)
+ : CBaseFilter(NAME("CStreamSwitcherFilter"), lpunk, &m_csState, clsid)
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- do {
- CAutoPtr<CStreamSwitcherInputPin> pInput;
- CAutoPtr<CStreamSwitcherOutputPin> pOutput;
+ do {
+ CAutoPtr<CStreamSwitcherInputPin> pInput;
+ CAutoPtr<CStreamSwitcherOutputPin> pOutput;
- hr = S_OK;
- pInput.Attach(DNew CStreamSwitcherInputPin(this, &hr, L"Channel 1"));
- if (!pInput || FAILED(hr)) {
- break;
- }
+ hr = S_OK;
+ pInput.Attach(DNew CStreamSwitcherInputPin(this, &hr, L"Channel 1"));
+ if (!pInput || FAILED(hr)) {
+ break;
+ }
- hr = S_OK;
- pOutput.Attach(DNew CStreamSwitcherOutputPin(this, &hr));
- if (!pOutput || FAILED(hr)) {
- break;
- }
+ hr = S_OK;
+ pOutput.Attach(DNew CStreamSwitcherOutputPin(this, &hr));
+ if (!pOutput || FAILED(hr)) {
+ break;
+ }
- CAutoLock cAutoLock(&m_csPins);
+ CAutoLock cAutoLock(&m_csPins);
- m_pInputs.AddHead(m_pInput = pInput.Detach());
- m_pOutput = pOutput.Detach();
+ m_pInputs.AddHead(m_pInput = pInput.Detach());
+ m_pOutput = pOutput.Detach();
- return;
- } while (false);
+ return;
+ } while (false);
- if (phr) {
- *phr = E_FAIL;
- }
+ if (phr) {
+ *phr = E_FAIL;
+ }
}
CStreamSwitcherFilter::~CStreamSwitcherFilter()
{
- CAutoLock cAutoLock(&m_csPins);
+ CAutoLock cAutoLock(&m_csPins);
- POSITION pos = m_pInputs.GetHeadPosition();
- while (pos) {
- delete m_pInputs.GetNext(pos);
- }
- m_pInputs.RemoveAll();
- m_pInput = NULL;
+ POSITION pos = m_pInputs.GetHeadPosition();
+ while (pos) {
+ delete m_pInputs.GetNext(pos);
+ }
+ m_pInputs.RemoveAll();
+ m_pInput = NULL;
- delete m_pOutput;
- m_pOutput = NULL;
+ delete m_pOutput;
+ m_pOutput = NULL;
}
STDMETHODIMP CStreamSwitcherFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- return
- QI(IAMStreamSelect)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IAMStreamSelect)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
//
int CStreamSwitcherFilter::GetPinCount()
{
- CAutoLock cAutoLock(&m_csPins);
+ CAutoLock cAutoLock(&m_csPins);
- return (1 + (int)m_pInputs.GetCount());
+ return (1 + (int)m_pInputs.GetCount());
}
CBasePin* CStreamSwitcherFilter::GetPin(int n)
{
- CAutoLock cAutoLock(&m_csPins);
+ CAutoLock cAutoLock(&m_csPins);
- if (n < 0 || n >= GetPinCount()) {
- return NULL;
- } else if (n == 0) {
- return m_pOutput;
- } else {
- return m_pInputs.GetAt(m_pInputs.FindIndex(n-1));
- }
+ if (n < 0 || n >= GetPinCount()) {
+ return NULL;
+ } else if (n == 0) {
+ return m_pOutput;
+ } else {
+ return m_pInputs.GetAt(m_pInputs.FindIndex(n - 1));
+ }
}
int CStreamSwitcherFilter::GetConnectedInputPinCount()
{
- CAutoLock cAutoLock(&m_csPins);
+ CAutoLock cAutoLock(&m_csPins);
- int nConnected = 0;
+ int nConnected = 0;
- POSITION pos = m_pInputs.GetHeadPosition();
- while (pos) {
- if (m_pInputs.GetNext(pos)->IsConnected()) {
- nConnected++;
- }
- }
+ POSITION pos = m_pInputs.GetHeadPosition();
+ while (pos) {
+ if (m_pInputs.GetNext(pos)->IsConnected()) {
+ nConnected++;
+ }
+ }
- return nConnected;
+ return nConnected;
}
CStreamSwitcherInputPin* CStreamSwitcherFilter::GetConnectedInputPin(int n)
{
- if (n >= 0) {
- POSITION pos = m_pInputs.GetHeadPosition();
- while (pos) {
- CStreamSwitcherInputPin* pPin = m_pInputs.GetNext(pos);
- if (pPin->IsConnected()) {
- if (n == 0) {
- return pPin;
- }
- n--;
- }
- }
- }
+ if (n >= 0) {
+ POSITION pos = m_pInputs.GetHeadPosition();
+ while (pos) {
+ CStreamSwitcherInputPin* pPin = m_pInputs.GetNext(pos);
+ if (pPin->IsConnected()) {
+ if (n == 0) {
+ return pPin;
+ }
+ n--;
+ }
+ }
+ }
- return NULL;
+ return NULL;
}
CStreamSwitcherInputPin* CStreamSwitcherFilter::GetInputPin()
{
- return m_pInput;
+ return m_pInput;
}
CStreamSwitcherOutputPin* CStreamSwitcherFilter::GetOutputPin()
{
- return m_pOutput;
+ return m_pOutput;
}
//
HRESULT CStreamSwitcherFilter::CompleteConnect(PIN_DIRECTION dir, CBasePin* pPin, IPin* pReceivePin)
{
- if (dir == PINDIR_INPUT) {
- CAutoLock cAutoLock(&m_csPins);
+ if (dir == PINDIR_INPUT) {
+ CAutoLock cAutoLock(&m_csPins);
- int nConnected = GetConnectedInputPinCount();
+ int nConnected = GetConnectedInputPinCount();
- if (nConnected == 1) {
- m_pInput = static_cast<CStreamSwitcherInputPin*>(pPin);
- }
+ if (nConnected == 1) {
+ m_pInput = static_cast<CStreamSwitcherInputPin*>(pPin);
+ }
- if ((size_t)nConnected == m_pInputs.GetCount()) {
- CStringW name;
- name.Format(L"Channel %d", ++m_PinVersion);
+ if ((size_t)nConnected == m_pInputs.GetCount()) {
+ CStringW name;
+ name.Format(L"Channel %d", ++m_PinVersion);
- HRESULT hr = S_OK;
- CStreamSwitcherInputPin* pPin = DNew CStreamSwitcherInputPin(this, &hr, name);
- if (!pPin || FAILED(hr)) {
- delete pPin;
- return E_FAIL;
- }
- m_pInputs.AddTail(pPin);
- }
- }
+ HRESULT hr = S_OK;
+ CStreamSwitcherInputPin* pPin = DNew CStreamSwitcherInputPin(this, &hr, name);
+ if (!pPin || FAILED(hr)) {
+ delete pPin;
+ return E_FAIL;
+ }
+ m_pInputs.AddTail(pPin);
+ }
+ }
- return S_OK;
+ return S_OK;
}
// this should be very thread safe, I hope it is, it must be... :)
void CStreamSwitcherFilter::SelectInput(CStreamSwitcherInputPin* pInput)
{
- // make sure no input thinks it is active
- m_pInput = NULL;
+ // make sure no input thinks it is active
+ m_pInput = NULL;
- // release blocked GetBuffer in our own allocator & block all Receive
- POSITION pos = m_pInputs.GetHeadPosition();
- while (pos) {
- CStreamSwitcherInputPin* pPin = m_pInputs.GetNext(pos);
- pPin->Block(false);
- // a few Receive calls can arrive here, but since m_pInput == NULL neighter of them gets delivered
- pPin->Block(true);
- }
+ // release blocked GetBuffer in our own allocator & block all Receive
+ POSITION pos = m_pInputs.GetHeadPosition();
+ while (pos) {
+ CStreamSwitcherInputPin* pPin = m_pInputs.GetNext(pos);
+ pPin->Block(false);
+ // a few Receive calls can arrive here, but since m_pInput == NULL neighter of them gets delivered
+ pPin->Block(true);
+ }
- // this will let waiting GetBuffer() calls go on inside our Receive()
- if (m_pOutput) {
- m_pOutput->DeliverBeginFlush();
- m_pOutput->DeliverEndFlush();
- }
+ // this will let waiting GetBuffer() calls go on inside our Receive()
+ if (m_pOutput) {
+ m_pOutput->DeliverBeginFlush();
+ m_pOutput->DeliverEndFlush();
+ }
- if (!pInput) {
- return;
- }
+ if (!pInput) {
+ return;
+ }
- // set new input
- m_pInput = pInput;
+ // set new input
+ m_pInput = pInput;
- // let it go
- m_pInput->Block(false);
+ // let it go
+ m_pInput->Block(false);
}
//
HRESULT CStreamSwitcherFilter::Transform(IMediaSample* pIn, IMediaSample* pOut)
{
- BYTE* pDataIn = NULL;
- BYTE* pDataOut = NULL;
+ BYTE* pDataIn = NULL;
+ BYTE* pDataOut = NULL;
- HRESULT hr;
- if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
- return hr;
- }
- if (FAILED(hr = pOut->GetPointer(&pDataOut))) {
- return hr;
- }
+ HRESULT hr;
+ if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
+ return hr;
+ }
+ if (FAILED(hr = pOut->GetPointer(&pDataOut))) {
+ return hr;
+ }
- long len = pIn->GetActualDataLength();
- long size = pOut->GetSize();
+ long len = pIn->GetActualDataLength();
+ long size = pOut->GetSize();
- if (!pDataIn || !pDataOut /*|| len > size || len <= 0*/) {
- return S_FALSE; // FIXME
- }
+ if (!pDataIn || !pDataOut /*|| len > size || len <= 0*/) {
+ return S_FALSE; // FIXME
+ }
- memcpy(pDataOut, pDataIn, min(len, size));
- pOut->SetActualDataLength(min(len, size));
+ memcpy(pDataOut, pDataIn, min(len, size));
+ pOut->SetActualDataLength(min(len, size));
- return S_OK;
+ return S_OK;
}
CMediaType CStreamSwitcherFilter::CreateNewOutputMediaType(CMediaType mt, long& cbBuffer)
{
- return mt;
+ return mt;
}
HRESULT CStreamSwitcherFilter::DeliverEndOfStream()
{
- return m_pOutput ? m_pOutput->DeliverEndOfStream() : E_FAIL;
+ return m_pOutput ? m_pOutput->DeliverEndOfStream() : E_FAIL;
}
HRESULT CStreamSwitcherFilter::DeliverBeginFlush()
{
- return m_pOutput ? m_pOutput->DeliverBeginFlush() : E_FAIL;
+ return m_pOutput ? m_pOutput->DeliverBeginFlush() : E_FAIL;
}
HRESULT CStreamSwitcherFilter::DeliverEndFlush()
{
- return m_pOutput ? m_pOutput->DeliverEndFlush() : E_FAIL;
+ return m_pOutput ? m_pOutput->DeliverEndFlush() : E_FAIL;
}
HRESULT CStreamSwitcherFilter::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- return m_pOutput ? m_pOutput->DeliverNewSegment(tStart, tStop, dRate) : E_FAIL;
+ return m_pOutput ? m_pOutput->DeliverNewSegment(tStart, tStop, dRate) : E_FAIL;
}
// IAMStreamSelect
STDMETHODIMP CStreamSwitcherFilter::Count(DWORD* pcStreams)
{
- if (!pcStreams) {
- return E_POINTER;
- }
+ if (!pcStreams) {
+ return E_POINTER;
+ }
- CAutoLock cAutoLock(&m_csPins);
+ CAutoLock cAutoLock(&m_csPins);
- *pcStreams = GetConnectedInputPinCount();
+ *pcStreams = GetConnectedInputPinCount();
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CStreamSwitcherFilter::Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD* pdwFlags, LCID* plcid, DWORD* pdwGroup, WCHAR** ppszName, IUnknown** ppObject, IUnknown** ppUnk)
{
- CAutoLock cAutoLock(&m_csPins);
+ CAutoLock cAutoLock(&m_csPins);
- CBasePin* pPin = GetConnectedInputPin(lIndex);
- if (!pPin) {
- return E_INVALIDARG;
- }
+ CBasePin* pPin = GetConnectedInputPin(lIndex);
+ if (!pPin) {
+ return E_INVALIDARG;
+ }
- if (ppmt) {
- *ppmt = CreateMediaType(&m_pOutput->CurrentMediaType());
- }
+ if (ppmt) {
+ *ppmt = CreateMediaType(&m_pOutput->CurrentMediaType());
+ }
- if (pdwFlags) {
- *pdwFlags = (m_pInput == pPin) ? AMSTREAMSELECTINFO_EXCLUSIVE : 0;
- }
+ if (pdwFlags) {
+ *pdwFlags = (m_pInput == pPin) ? AMSTREAMSELECTINFO_EXCLUSIVE : 0;
+ }
- if (plcid) {
- *plcid = 0;
- }
+ if (plcid) {
+ *plcid = 0;
+ }
- if (pdwGroup) {
- *pdwGroup = 0;
- }
+ if (pdwGroup) {
+ *pdwGroup = 0;
+ }
- if (ppszName) {
- *ppszName = (WCHAR*)CoTaskMemAlloc((wcslen(pPin->Name())+1)*sizeof(WCHAR));
- if (*ppszName) {
- wcscpy_s(*ppszName, wcslen(pPin->Name()) + 1, pPin->Name());
- }
- }
+ if (ppszName) {
+ *ppszName = (WCHAR*)CoTaskMemAlloc((wcslen(pPin->Name()) + 1) * sizeof(WCHAR));
+ if (*ppszName) {
+ wcscpy_s(*ppszName, wcslen(pPin->Name()) + 1, pPin->Name());
+ }
+ }
- if (ppObject) {
- *ppObject = NULL;
- }
+ if (ppObject) {
+ *ppObject = NULL;
+ }
- if (ppUnk) {
- *ppUnk = NULL;
- }
+ if (ppUnk) {
+ *ppUnk = NULL;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CStreamSwitcherFilter::Enable(long lIndex, DWORD dwFlags)
{
- if (dwFlags != AMSTREAMSELECTENABLE_ENABLE) {
- return E_NOTIMPL;
- }
+ if (dwFlags != AMSTREAMSELECTENABLE_ENABLE) {
+ return E_NOTIMPL;
+ }
- PauseGraph;
+ PauseGraph;
- CStreamSwitcherInputPin* pNewInput = GetConnectedInputPin(lIndex);
- if (!pNewInput) {
- return E_INVALIDARG;
- }
+ CStreamSwitcherInputPin* pNewInput = GetConnectedInputPin(lIndex);
+ if (!pNewInput) {
+ return E_INVALIDARG;
+ }
- SelectInput(pNewInput);
+ SelectInput(pNewInput);
- ResumeGraph;
+ ResumeGraph;
- return S_OK;
+ return S_OK;
}
diff --git a/src/filters/switcher/AudioSwitcher/StreamSwitcher.h b/src/filters/switcher/AudioSwitcher/StreamSwitcher.h
index de2309285..5e5cd89c7 100644
--- a/src/filters/switcher/AudioSwitcher/StreamSwitcher.h
+++ b/src/filters/switcher/AudioSwitcher/StreamSwitcher.h
@@ -52,45 +52,45 @@ class CStreamSwitcherFilter;
class CStreamSwitcherPassThru : public IMediaSeeking, public CMediaPosition
{
protected:
- CStreamSwitcherFilter* m_pFilter;
+ CStreamSwitcherFilter* m_pFilter;
public:
- CStreamSwitcherPassThru(LPUNKNOWN, HRESULT* phr, CStreamSwitcherFilter* pFilter);
-
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- // IMediaSeeking methods
- STDMETHODIMP GetCapabilities(DWORD* pCapabilities);
- STDMETHODIMP CheckCapabilities(DWORD* pCapabilities);
- STDMETHODIMP SetTimeFormat(const GUID* pFormat);
- STDMETHODIMP GetTimeFormat(GUID* pFormat);
- STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
- STDMETHODIMP IsFormatSupported(const GUID* pFormat);
- STDMETHODIMP QueryPreferredFormat(GUID* pFormat);
- STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
- STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD CurrentFlags, LONGLONG* pStop, DWORD StopFlags);
- STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
- STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent);
- STDMETHODIMP GetStopPosition(LONGLONG* pStop);
- STDMETHODIMP SetRate(double dRate);
- STDMETHODIMP GetRate(double* pdRate);
- STDMETHODIMP GetDuration(LONGLONG* pDuration);
- STDMETHODIMP GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest);
- STDMETHODIMP GetPreroll(LONGLONG* pllPreroll);
-
- // IMediaPosition properties
- STDMETHODIMP get_Duration(REFTIME* plength);
- STDMETHODIMP put_CurrentPosition(REFTIME llTime);
- STDMETHODIMP get_StopTime(REFTIME* pllTime);
- STDMETHODIMP put_StopTime(REFTIME llTime);
- STDMETHODIMP get_PrerollTime(REFTIME* pllTime);
- STDMETHODIMP put_PrerollTime(REFTIME llTime);
- STDMETHODIMP get_Rate(double* pdRate);
- STDMETHODIMP put_Rate(double dRate);
- STDMETHODIMP get_CurrentPosition(REFTIME* pllTime);
- STDMETHODIMP CanSeekForward(LONG* pCanSeekForward);
- STDMETHODIMP CanSeekBackward(LONG* pCanSeekBackward);
+ CStreamSwitcherPassThru(LPUNKNOWN, HRESULT* phr, CStreamSwitcherFilter* pFilter);
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ // IMediaSeeking methods
+ STDMETHODIMP GetCapabilities(DWORD* pCapabilities);
+ STDMETHODIMP CheckCapabilities(DWORD* pCapabilities);
+ STDMETHODIMP SetTimeFormat(const GUID* pFormat);
+ STDMETHODIMP GetTimeFormat(GUID* pFormat);
+ STDMETHODIMP IsUsingTimeFormat(const GUID* pFormat);
+ STDMETHODIMP IsFormatSupported(const GUID* pFormat);
+ STDMETHODIMP QueryPreferredFormat(GUID* pFormat);
+ STDMETHODIMP ConvertTimeFormat(LONGLONG* pTarget, const GUID* pTargetFormat, LONGLONG Source, const GUID* pSourceFormat);
+ STDMETHODIMP SetPositions(LONGLONG* pCurrent, DWORD CurrentFlags, LONGLONG* pStop, DWORD StopFlags);
+ STDMETHODIMP GetPositions(LONGLONG* pCurrent, LONGLONG* pStop);
+ STDMETHODIMP GetCurrentPosition(LONGLONG* pCurrent);
+ STDMETHODIMP GetStopPosition(LONGLONG* pStop);
+ STDMETHODIMP SetRate(double dRate);
+ STDMETHODIMP GetRate(double* pdRate);
+ STDMETHODIMP GetDuration(LONGLONG* pDuration);
+ STDMETHODIMP GetAvailable(LONGLONG* pEarliest, LONGLONG* pLatest);
+ STDMETHODIMP GetPreroll(LONGLONG* pllPreroll);
+
+ // IMediaPosition properties
+ STDMETHODIMP get_Duration(REFTIME* plength);
+ STDMETHODIMP put_CurrentPosition(REFTIME llTime);
+ STDMETHODIMP get_StopTime(REFTIME* pllTime);
+ STDMETHODIMP put_StopTime(REFTIME llTime);
+ STDMETHODIMP get_PrerollTime(REFTIME* pllTime);
+ STDMETHODIMP put_PrerollTime(REFTIME llTime);
+ STDMETHODIMP get_Rate(double* pdRate);
+ STDMETHODIMP put_Rate(double dRate);
+ STDMETHODIMP get_CurrentPosition(REFTIME* pllTime);
+ STDMETHODIMP CanSeekForward(LONG* pCanSeekForward);
+ STDMETHODIMP CanSeekBackward(LONG* pCanSeekBackward);
};
class CStreamSwitcherInputPin;
@@ -98,202 +98,202 @@ class CStreamSwitcherInputPin;
class CStreamSwitcherAllocator : public CMemAllocator
{
protected:
- CStreamSwitcherInputPin* m_pPin;
+ CStreamSwitcherInputPin* m_pPin;
- CMediaType m_mt;
- bool m_fMediaTypeChanged;
+ CMediaType m_mt;
+ bool m_fMediaTypeChanged;
public:
- CStreamSwitcherAllocator(CStreamSwitcherInputPin* pPin, HRESULT* phr);
+ CStreamSwitcherAllocator(CStreamSwitcherInputPin* pPin, HRESULT* phr);
#ifdef _DEBUG
- ~CStreamSwitcherAllocator();
+ ~CStreamSwitcherAllocator();
#endif
- STDMETHODIMP_(ULONG) NonDelegatingAddRef();
- STDMETHODIMP_(ULONG) NonDelegatingRelease();
+ STDMETHODIMP_(ULONG) NonDelegatingAddRef();
+ STDMETHODIMP_(ULONG) NonDelegatingRelease();
- STDMETHODIMP GetBuffer(
- IMediaSample** ppBuffer,
- REFERENCE_TIME* pStartTime, REFERENCE_TIME* pEndTime,
- DWORD dwFlags);
+ STDMETHODIMP GetBuffer(
+ IMediaSample** ppBuffer,
+ REFERENCE_TIME* pStartTime, REFERENCE_TIME* pEndTime,
+ DWORD dwFlags);
- void NotifyMediaType(const CMediaType& mt);
+ void NotifyMediaType(const CMediaType& mt);
};
interface __declspec(uuid("DA395FA3-4A3E-4D85-805E-0BEFF53D4BCD"))
IStreamSwitcherInputPin :
public IUnknown {
- STDMETHOD_(bool, IsActive)() = 0;
+ STDMETHOD_(bool, IsActive)() = 0;
};
class CStreamSwitcherInputPin : public CBaseInputPin, public IPinConnection, public IStreamSwitcherInputPin
{
- friend class CStreamSwitcherAllocator;
+ friend class CStreamSwitcherAllocator;
- CStreamSwitcherAllocator m_Allocator;
+ CStreamSwitcherAllocator m_Allocator;
- BOOL m_bSampleSkipped;
- BOOL m_bQualityChanged;
- BOOL m_bUsingOwnAllocator;
+ BOOL m_bSampleSkipped;
+ BOOL m_bQualityChanged;
+ BOOL m_bUsingOwnAllocator;
- CAMEvent m_evBlock;
- bool m_fCanBlock;
- HRESULT Active();
- HRESULT Inactive();
+ CAMEvent m_evBlock;
+ bool m_fCanBlock;
+ HRESULT Active();
+ HRESULT Inactive();
- HRESULT QueryAcceptDownstream(const AM_MEDIA_TYPE* pmt);
+ HRESULT QueryAcceptDownstream(const AM_MEDIA_TYPE* pmt);
- HRESULT InitializeOutputSample(IMediaSample* pInSample, IMediaSample** ppOutSample);
+ HRESULT InitializeOutputSample(IMediaSample* pInSample, IMediaSample** ppOutSample);
- HANDLE m_hNotifyEvent;
+ HANDLE m_hNotifyEvent;
public:
- CStreamSwitcherInputPin(CStreamSwitcherFilter* pFilter, HRESULT* phr, LPCWSTR pName);
-
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- CMediaType& CurrentMediaType() {
- return m_mt;
- }
- IMemAllocator* CurrentAllocator() {
- return m_pAllocator;
- }
-
- bool IsUsingOwnAllocator() {
- return m_bUsingOwnAllocator == TRUE;
- }
-
- void Block(bool fBlock);
-
- CCritSec m_csReceive;
-
- // pure virtual
- HRESULT CheckMediaType(const CMediaType* pmt);
-
- // virtual
- HRESULT CheckConnect(IPin* pPin);
- HRESULT CompleteConnect(IPin* pReceivePin);
-
- // IPin
- STDMETHODIMP QueryAccept(const AM_MEDIA_TYPE* pmt);
- STDMETHODIMP ReceiveConnection(IPin* pConnector, const AM_MEDIA_TYPE* pmt);
- STDMETHODIMP GetAllocator(IMemAllocator** ppAllocator);
- STDMETHODIMP NotifyAllocator(IMemAllocator* pAllocator, BOOL bReadOnly);
- STDMETHODIMP BeginFlush();
- STDMETHODIMP EndFlush();
- STDMETHODIMP EndOfStream();
-
- // IMemInputPin
- STDMETHODIMP Receive(IMediaSample* pSample);
- STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
-
- // IPinConnection
- STDMETHODIMP DynamicQueryAccept(const AM_MEDIA_TYPE* pmt);
- STDMETHODIMP NotifyEndOfStream(HANDLE hNotifyEvent);
- STDMETHODIMP IsEndPin();
- STDMETHODIMP DynamicDisconnect();
-
- // IStreamSwitcherInputPin
- STDMETHODIMP_(bool) IsActive();
+ CStreamSwitcherInputPin(CStreamSwitcherFilter* pFilter, HRESULT* phr, LPCWSTR pName);
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ CMediaType& CurrentMediaType() {
+ return m_mt;
+ }
+ IMemAllocator* CurrentAllocator() {
+ return m_pAllocator;
+ }
+
+ bool IsUsingOwnAllocator() {
+ return m_bUsingOwnAllocator == TRUE;
+ }
+
+ void Block(bool fBlock);
+
+ CCritSec m_csReceive;
+
+ // pure virtual
+ HRESULT CheckMediaType(const CMediaType* pmt);
+
+ // virtual
+ HRESULT CheckConnect(IPin* pPin);
+ HRESULT CompleteConnect(IPin* pReceivePin);
+
+ // IPin
+ STDMETHODIMP QueryAccept(const AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP ReceiveConnection(IPin* pConnector, const AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP GetAllocator(IMemAllocator** ppAllocator);
+ STDMETHODIMP NotifyAllocator(IMemAllocator* pAllocator, BOOL bReadOnly);
+ STDMETHODIMP BeginFlush();
+ STDMETHODIMP EndFlush();
+ STDMETHODIMP EndOfStream();
+
+ // IMemInputPin
+ STDMETHODIMP Receive(IMediaSample* pSample);
+ STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+
+ // IPinConnection
+ STDMETHODIMP DynamicQueryAccept(const AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP NotifyEndOfStream(HANDLE hNotifyEvent);
+ STDMETHODIMP IsEndPin();
+ STDMETHODIMP DynamicDisconnect();
+
+ // IStreamSwitcherInputPin
+ STDMETHODIMP_(bool) IsActive();
};
class CStreamSwitcherOutputPin : public CBaseOutputPin, public IStreamBuilder
{
- CComPtr<IUnknown> m_pStreamSwitcherPassThru;
- CComPtr<IPinConnection> m_pPinConnection;
+ CComPtr<IUnknown> m_pStreamSwitcherPassThru;
+ CComPtr<IPinConnection> m_pPinConnection;
- HRESULT QueryAcceptUpstream(const AM_MEDIA_TYPE* pmt);
+ HRESULT QueryAcceptUpstream(const AM_MEDIA_TYPE* pmt);
public:
- CStreamSwitcherOutputPin(CStreamSwitcherFilter* pFilter, HRESULT* phr);
+ CStreamSwitcherOutputPin(CStreamSwitcherFilter* pFilter, HRESULT* phr);
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- CMediaType& CurrentMediaType() {
- return m_mt;
- }
- IMemAllocator* CurrentAllocator() {
- return m_pAllocator;
- }
- IPinConnection* CurrentPinConnection() {
- return m_pPinConnection;
- }
+ CMediaType& CurrentMediaType() {
+ return m_mt;
+ }
+ IMemAllocator* CurrentAllocator() {
+ return m_pAllocator;
+ }
+ IPinConnection* CurrentPinConnection() {
+ return m_pPinConnection;
+ }
- // pure virtual
- HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
+ // pure virtual
+ HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
- // virtual
- HRESULT CheckConnect(IPin* pPin);
- HRESULT BreakConnect();
- HRESULT CompleteConnect(IPin* pReceivePin);
+ // virtual
+ HRESULT CheckConnect(IPin* pPin);
+ HRESULT BreakConnect();
+ HRESULT CompleteConnect(IPin* pReceivePin);
- HRESULT CheckMediaType(const CMediaType* pmt);
- HRESULT GetMediaType(int iPosition, CMediaType* pmt);
+ HRESULT CheckMediaType(const CMediaType* pmt);
+ HRESULT GetMediaType(int iPosition, CMediaType* pmt);
- // IPin
- STDMETHODIMP QueryAccept(const AM_MEDIA_TYPE* pmt);
+ // IPin
+ STDMETHODIMP QueryAccept(const AM_MEDIA_TYPE* pmt);
- // IQualityControl
- STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
+ // IQualityControl
+ STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
- // IStreamBuilder
- STDMETHODIMP Render(IPin* ppinOut, IGraphBuilder* pGraph);
- STDMETHODIMP Backout(IPin* ppinOut, IGraphBuilder* pGraph);
+ // IStreamBuilder
+ STDMETHODIMP Render(IPin* ppinOut, IGraphBuilder* pGraph);
+ STDMETHODIMP Backout(IPin* ppinOut, IGraphBuilder* pGraph);
};
class CStreamSwitcherFilter : public CBaseFilter, public IAMStreamSelect
{
- friend class CStreamSwitcherInputPin;
- friend class CStreamSwitcherOutputPin;
- friend class CStreamSwitcherPassThru;
+ friend class CStreamSwitcherInputPin;
+ friend class CStreamSwitcherOutputPin;
+ friend class CStreamSwitcherPassThru;
- CAtlList<CStreamSwitcherInputPin*> m_pInputs;
- CStreamSwitcherInputPin* m_pInput;
- CStreamSwitcherOutputPin* m_pOutput;
+ CAtlList<CStreamSwitcherInputPin*> m_pInputs;
+ CStreamSwitcherInputPin* m_pInput;
+ CStreamSwitcherOutputPin* m_pOutput;
- CCritSec m_csState, m_csPins;
+ CCritSec m_csState, m_csPins;
- HRESULT CompleteConnect(PIN_DIRECTION dir, CBasePin* pPin, IPin* pReceivePin);
+ HRESULT CompleteConnect(PIN_DIRECTION dir, CBasePin* pPin, IPin* pReceivePin);
protected:
- void SelectInput(CStreamSwitcherInputPin* pInput);
+ void SelectInput(CStreamSwitcherInputPin* pInput);
public:
- CStreamSwitcherFilter(LPUNKNOWN lpunk, HRESULT* phr, const CLSID& clsid);
- virtual ~CStreamSwitcherFilter();
-
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- int GetPinCount();
- CBasePin* GetPin(int n);
-
- int GetConnectedInputPinCount();
- CStreamSwitcherInputPin* GetConnectedInputPin(int n);
- CStreamSwitcherInputPin* GetInputPin();
- CStreamSwitcherOutputPin* GetOutputPin();
-
- bool m_fResetOutputMediaType;
- void ResetOutputMediaType() {
- m_fResetOutputMediaType = true;
- }
-
- // override these
- virtual HRESULT CheckMediaType(const CMediaType* pmt) = 0;
- virtual HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
- virtual CMediaType CreateNewOutputMediaType(CMediaType mt, long& cbBuffer);
- virtual void OnNewOutputMediaType(const CMediaType& mtIn, const CMediaType& mtOut) {}
-
- // and maybe these
- virtual HRESULT DeliverEndOfStream();
- virtual HRESULT DeliverBeginFlush();
- virtual HRESULT DeliverEndFlush();
- virtual HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
-
- // IAMStreamSelect
- STDMETHODIMP Count(DWORD* pcStreams);
- STDMETHODIMP Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD* pdwFlags, LCID* plcid, DWORD* pdwGroup, WCHAR** ppszName, IUnknown** ppObject, IUnknown** ppUnk);
- STDMETHODIMP Enable(long lIndex, DWORD dwFlags);
+ CStreamSwitcherFilter(LPUNKNOWN lpunk, HRESULT* phr, const CLSID& clsid);
+ virtual ~CStreamSwitcherFilter();
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ int GetPinCount();
+ CBasePin* GetPin(int n);
+
+ int GetConnectedInputPinCount();
+ CStreamSwitcherInputPin* GetConnectedInputPin(int n);
+ CStreamSwitcherInputPin* GetInputPin();
+ CStreamSwitcherOutputPin* GetOutputPin();
+
+ bool m_fResetOutputMediaType;
+ void ResetOutputMediaType() {
+ m_fResetOutputMediaType = true;
+ }
+
+ // override these
+ virtual HRESULT CheckMediaType(const CMediaType* pmt) = 0;
+ virtual HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
+ virtual CMediaType CreateNewOutputMediaType(CMediaType mt, long& cbBuffer);
+ virtual void OnNewOutputMediaType(const CMediaType& mtIn, const CMediaType& mtOut) {}
+
+ // and maybe these
+ virtual HRESULT DeliverEndOfStream();
+ virtual HRESULT DeliverBeginFlush();
+ virtual HRESULT DeliverEndFlush();
+ virtual HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+
+ // IAMStreamSelect
+ STDMETHODIMP Count(DWORD* pcStreams);
+ STDMETHODIMP Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD* pdwFlags, LCID* plcid, DWORD* pdwGroup, WCHAR** ppszName, IUnknown** ppObject, IUnknown** ppUnk);
+ STDMETHODIMP Enable(long lIndex, DWORD dwFlags);
};
diff --git a/src/filters/transform/AVI2AC3Filter/AVI2AC3Filter.cpp b/src/filters/transform/AVI2AC3Filter/AVI2AC3Filter.cpp
index da74226a0..37d212064 100644
--- a/src/filters/transform/AVI2AC3Filter/AVI2AC3Filter.cpp
+++ b/src/filters/transform/AVI2AC3Filter/AVI2AC3Filter.cpp
@@ -34,37 +34,37 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_WAVE_DOLBY_AC3},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_WAVE_DTS},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_WAVE_DOLBY_AC3},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_WAVE_DTS},
};
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CAVI2AC3Filter), AVI2AC3FilterName, MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CAVI2AC3Filter), AVI2AC3FilterName, MERIT_NORMAL, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CAVI2AC3Filter>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CAVI2AC3Filter>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -78,11 +78,11 @@ CFilterApp theApp;
//
CAVI2AC3Filter::CAVI2AC3Filter(LPUNKNOWN lpunk, HRESULT* phr)
- : CTransformFilter(NAME("CAVI2AC3Filter"), lpunk, __uuidof(this))
+ : CTransformFilter(NAME("CAVI2AC3Filter"), lpunk, __uuidof(this))
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
}
CAVI2AC3Filter::~CAVI2AC3Filter()
@@ -91,420 +91,420 @@ CAVI2AC3Filter::~CAVI2AC3Filter()
HRESULT CAVI2AC3Filter::Transform(IMediaSample* pSample, IMediaSample* pOutSample)
{
- HRESULT hr;
-
- BYTE* pIn = NULL;
- if (FAILED(hr = pSample->GetPointer(&pIn))) {
- return hr;
- }
- BYTE* pInOrg = pIn;
-
- long len = pSample->GetActualDataLength();
- if (len <= 0) {
- return S_FALSE;
- }
-
- BYTE* pOut = NULL;
- if (FAILED(hr = pOutSample->GetPointer(&pOut))) {
- return hr;
- }
- BYTE* pOutOrg = pOut;
-
- int size = pOutSample->GetSize();
-
- if ((CheckAC3(&m_pInput->CurrentMediaType()) || CheckDTS(&m_pInput->CurrentMediaType()))
- && (CheckWAVEAC3(&m_pOutput->CurrentMediaType()) || CheckWAVEDTS(&m_pOutput->CurrentMediaType()))) {
- if (*(DWORD*)pIn == 0xBA010000) {
- pIn += 14;
- }
-
- if (*(DWORD*)pIn == 0xBD010000) {
- pIn += 8 + 1 + pIn[8] + 1 + 3;
- }
-
- len -= (pInOrg - pIn);
-
- if (size < len) {
- return E_FAIL;
- }
-
- memcpy(pOut, pIn, len);
- pOut += len;
- } else if ((CheckWAVEAC3(&m_pInput->CurrentMediaType()) || CheckWAVEDTS(&m_pInput->CurrentMediaType()))
- && (CheckAC3(&m_pOutput->CurrentMediaType()) || CheckDTS(&m_pOutput->CurrentMediaType()))) {
- if ((m_pOutput->CurrentMediaType().majortype == MEDIATYPE_DVD_ENCRYPTED_PACK
- || m_pOutput->CurrentMediaType().majortype == MEDIATYPE_MPEG2_PES)
- && (len + 12 + 3) >= 0x10000) { // damn, this can happen if the interleave time is too big
- REFERENCE_TIME rtStart = 0, rtStop = 1;
- bool fHasTime = (S_OK == pSample->GetTime(&rtStart, &rtStop));
-
- bool fDiscontinuity = (S_OK == pOutSample->IsDiscontinuity());
-
- int pos = 0;
- while (pos < len) {
- int curlen = min(len - pos, 2013);
- pos += 2013;
-
- CComPtr<IMediaSample> pOutSample;
- hr = InitializeOutputSample(pSample, &pOutSample);
-
- if (fDiscontinuity) {
- if (fHasTime) {
- rtStop = rtStart + (rtStop - rtStart) * curlen / len;
- pOutSample->SetTime(&rtStart, &rtStop);
- }
-
- fDiscontinuity = false;
- } else {
- pOutSample->SetTime(NULL, NULL);
- pOutSample->SetDiscontinuity(FALSE);
- }
-
- BYTE* pOut = NULL;
- if (FAILED(hr = pOutSample->GetPointer(&pOut))) {
- return hr;
- }
- BYTE* pOutOrg = pOut;
-
- int size = pOutSample->GetSize();
-
- const GUID* majortype = &m_pOutput->CurrentMediaType().majortype;
- const GUID* subtype = &m_pOutput->CurrentMediaType().subtype;
-
- if (*majortype == MEDIATYPE_DVD_ENCRYPTED_PACK) {
- if (size < curlen + 32 + 3) {
- return E_FAIL;
- }
-
- BYTE PESHeader[] = {
- 0x00,0x00,0x01,0xBA, // PES id
- 0x44,0x00,0x04,0x00,0x04,0x01, // SCR (0)
- 0x01,0x89,0xC3,0xF8, // mux rate (1260000 bytes/sec, 22bits), marker (2bits), reserved (~0, 5bits), stuffing (0, 3bits)
- };
-
- memcpy(pOut, &PESHeader, sizeof(PESHeader));
- pOut += sizeof(PESHeader);
-
- majortype = &MEDIATYPE_MPEG2_PES;
- }
-
- if (*majortype == MEDIATYPE_MPEG2_PES) {
- if (size < curlen + 20 + 3) {
- return E_FAIL;
- }
-
- BYTE Private1Header[] = {
- 0x00,0x00,0x01,0xBD, // private stream 1 id
- 0x07,0xEC, // packet length (TODO: modify it later)
- 0x81,0x80, // marker, original, PTS - flags
- 0x08, // packet data starting offset
- 0x21,0x00,0x01,0x00,0x01, // PTS (0)
- 0xFF,0xFF,0xFF, // stuffing
- 0x80, // stream id (0)
- 0x01,0x00,0x01, // no idea about the first byte, the sencond+third seem to show the ac3/dts header sync offset plus one (dvd2avi doesn't output it to the ac3/dts file so we have to put it back)
- };
-
- int packetlen = curlen + 12 + 3;
- ASSERT(packetlen <= 0xffff);
- Private1Header[4] = (packetlen>>8)&0xff;
- Private1Header[5] = packetlen&0xff;
-
- if (*subtype == MEDIASUBTYPE_DTS) {
- Private1Header[17] += 8;
- }
-
- if (*subtype == MEDIASUBTYPE_DOLBY_AC3) {
- for (int i = 0; i < curlen; i++) {
- if (*(DWORD*)&pIn[i] == 0x770B) {
- i++;
- Private1Header[19] = (i>>8)&0xff;
- Private1Header[20] = i&0xff;
- break;
- }
- }
- } else if (*subtype == MEDIASUBTYPE_DTS) {
- for (int i = 0; i < curlen; i++) {
- if (*(DWORD*)&pIn[i] == 0x0180FE7F) {
- i++;
- Private1Header[19] = (i>>8)&0xff;
- Private1Header[20] = i&0xff;
- break;
- }
- }
- }
-
- memcpy(pOut, &Private1Header, sizeof(Private1Header));
- pOut += sizeof(Private1Header);
-
- majortype = &MEDIATYPE_Audio;
- }
-
- if (*majortype == MEDIATYPE_Audio) {
- if (size < curlen) {
- return E_FAIL;
- }
- memcpy(pOut, pIn, curlen);
- pIn += curlen;
- pOut += curlen;
- }
-
- pOutSample->SetActualDataLength(pOut - pOutOrg);
-
- hr = m_pOutput->Deliver(pOutSample);
- }
-
- return S_FALSE;
- } else { // phew, we can do the easier way
- const GUID* majortype = &m_pOutput->CurrentMediaType().majortype;
- const GUID* subtype = &m_pOutput->CurrentMediaType().subtype;
-
- if (*majortype == MEDIATYPE_DVD_ENCRYPTED_PACK) {
- if (size < len + 32 + 3) {
- return E_FAIL;
- }
-
- BYTE PESHeader[] = {
- 0x00,0x00,0x01,0xBA, // PES id
- 0x44,0x00,0x04,0x00,0x04,0x01, // SCR (0)
- 0x01,0x89,0xC3,0xF8, // mux rate (1260000 bytes/sec, 22bits), marker (2bits), reserved (~0, 5bits), stuffing (0, 3bits)
- };
-
- memcpy(pOut, &PESHeader, sizeof(PESHeader));
- pOut += sizeof(PESHeader);
-
- majortype = &MEDIATYPE_MPEG2_PES;
- }
-
- if (*majortype == MEDIATYPE_MPEG2_PES) {
- if (size < len + 20 + 3) {
- return E_FAIL;
- }
-
- BYTE Private1Header[] = {
- 0x00,0x00,0x01,0xBD, // private stream 1 id
- 0x07,0xEC, // packet length (TODO: modify it later)
- 0x81,0x80, // marker, original, PTS - flags
- 0x08, // packet data starting offset
- 0x21,0x00,0x01,0x00,0x01, // PTS (0)
- 0xFF,0xFF,0xFF, // stuffing
- 0x80, // stream id (0)
- 0x01,0x00,0x01, // no idea about the first byte, the sencond+third seem to show the ac3/dts header sync offset plus one (dvd2avi doesn't output it to the ac3/dts file so we have to put it back)
- };
-
- int packetlen = len + 12 + 3;
- ASSERT(packetlen <= 0xffff);
- Private1Header[4] = (packetlen>>8)&0xff;
- Private1Header[5] = packetlen&0xff;
-
- if (*subtype == MEDIASUBTYPE_DTS) {
- Private1Header[17] += 8;
- }
-
- memcpy(pOut, &Private1Header, sizeof(Private1Header));
- pOut += sizeof(Private1Header);
-
- majortype = &MEDIATYPE_Audio;
- }
-
- if (*majortype == MEDIATYPE_Audio) {
- if (size < len) {
- return E_FAIL;
- }
-
- memcpy(pOut, pIn, len);
- pIn += len;
- pOut += len;
- }
- }
- } else {
- return E_FAIL;
- }
-
- pOutSample->SetActualDataLength(pOut - pOutOrg);
-
- return S_OK;
+ HRESULT hr;
+
+ BYTE* pIn = NULL;
+ if (FAILED(hr = pSample->GetPointer(&pIn))) {
+ return hr;
+ }
+ BYTE* pInOrg = pIn;
+
+ long len = pSample->GetActualDataLength();
+ if (len <= 0) {
+ return S_FALSE;
+ }
+
+ BYTE* pOut = NULL;
+ if (FAILED(hr = pOutSample->GetPointer(&pOut))) {
+ return hr;
+ }
+ BYTE* pOutOrg = pOut;
+
+ int size = pOutSample->GetSize();
+
+ if ((CheckAC3(&m_pInput->CurrentMediaType()) || CheckDTS(&m_pInput->CurrentMediaType()))
+ && (CheckWAVEAC3(&m_pOutput->CurrentMediaType()) || CheckWAVEDTS(&m_pOutput->CurrentMediaType()))) {
+ if (*(DWORD*)pIn == 0xBA010000) {
+ pIn += 14;
+ }
+
+ if (*(DWORD*)pIn == 0xBD010000) {
+ pIn += 8 + 1 + pIn[8] + 1 + 3;
+ }
+
+ len -= (pInOrg - pIn);
+
+ if (size < len) {
+ return E_FAIL;
+ }
+
+ memcpy(pOut, pIn, len);
+ pOut += len;
+ } else if ((CheckWAVEAC3(&m_pInput->CurrentMediaType()) || CheckWAVEDTS(&m_pInput->CurrentMediaType()))
+ && (CheckAC3(&m_pOutput->CurrentMediaType()) || CheckDTS(&m_pOutput->CurrentMediaType()))) {
+ if ((m_pOutput->CurrentMediaType().majortype == MEDIATYPE_DVD_ENCRYPTED_PACK
+ || m_pOutput->CurrentMediaType().majortype == MEDIATYPE_MPEG2_PES)
+ && (len + 12 + 3) >= 0x10000) { // damn, this can happen if the interleave time is too big
+ REFERENCE_TIME rtStart = 0, rtStop = 1;
+ bool fHasTime = (S_OK == pSample->GetTime(&rtStart, &rtStop));
+
+ bool fDiscontinuity = (S_OK == pOutSample->IsDiscontinuity());
+
+ int pos = 0;
+ while (pos < len) {
+ int curlen = min(len - pos, 2013);
+ pos += 2013;
+
+ CComPtr<IMediaSample> pOutSample;
+ hr = InitializeOutputSample(pSample, &pOutSample);
+
+ if (fDiscontinuity) {
+ if (fHasTime) {
+ rtStop = rtStart + (rtStop - rtStart) * curlen / len;
+ pOutSample->SetTime(&rtStart, &rtStop);
+ }
+
+ fDiscontinuity = false;
+ } else {
+ pOutSample->SetTime(NULL, NULL);
+ pOutSample->SetDiscontinuity(FALSE);
+ }
+
+ BYTE* pOut = NULL;
+ if (FAILED(hr = pOutSample->GetPointer(&pOut))) {
+ return hr;
+ }
+ BYTE* pOutOrg = pOut;
+
+ int size = pOutSample->GetSize();
+
+ const GUID* majortype = &m_pOutput->CurrentMediaType().majortype;
+ const GUID* subtype = &m_pOutput->CurrentMediaType().subtype;
+
+ if (*majortype == MEDIATYPE_DVD_ENCRYPTED_PACK) {
+ if (size < curlen + 32 + 3) {
+ return E_FAIL;
+ }
+
+ BYTE PESHeader[] = {
+ 0x00, 0x00, 0x01, 0xBA, // PES id
+ 0x44, 0x00, 0x04, 0x00, 0x04, 0x01, // SCR (0)
+ 0x01, 0x89, 0xC3, 0xF8, // mux rate (1260000 bytes/sec, 22bits), marker (2bits), reserved (~0, 5bits), stuffing (0, 3bits)
+ };
+
+ memcpy(pOut, &PESHeader, sizeof(PESHeader));
+ pOut += sizeof(PESHeader);
+
+ majortype = &MEDIATYPE_MPEG2_PES;
+ }
+
+ if (*majortype == MEDIATYPE_MPEG2_PES) {
+ if (size < curlen + 20 + 3) {
+ return E_FAIL;
+ }
+
+ BYTE Private1Header[] = {
+ 0x00, 0x00, 0x01, 0xBD, // private stream 1 id
+ 0x07, 0xEC, // packet length (TODO: modify it later)
+ 0x81, 0x80, // marker, original, PTS - flags
+ 0x08, // packet data starting offset
+ 0x21, 0x00, 0x01, 0x00, 0x01, // PTS (0)
+ 0xFF, 0xFF, 0xFF, // stuffing
+ 0x80, // stream id (0)
+ 0x01, 0x00, 0x01, // no idea about the first byte, the sencond+third seem to show the ac3/dts header sync offset plus one (dvd2avi doesn't output it to the ac3/dts file so we have to put it back)
+ };
+
+ int packetlen = curlen + 12 + 3;
+ ASSERT(packetlen <= 0xffff);
+ Private1Header[4] = (packetlen >> 8) & 0xff;
+ Private1Header[5] = packetlen & 0xff;
+
+ if (*subtype == MEDIASUBTYPE_DTS) {
+ Private1Header[17] += 8;
+ }
+
+ if (*subtype == MEDIASUBTYPE_DOLBY_AC3) {
+ for (int i = 0; i < curlen; i++) {
+ if (*(DWORD*)&pIn[i] == 0x770B) {
+ i++;
+ Private1Header[19] = (i >> 8) & 0xff;
+ Private1Header[20] = i & 0xff;
+ break;
+ }
+ }
+ } else if (*subtype == MEDIASUBTYPE_DTS) {
+ for (int i = 0; i < curlen; i++) {
+ if (*(DWORD*)&pIn[i] == 0x0180FE7F) {
+ i++;
+ Private1Header[19] = (i >> 8) & 0xff;
+ Private1Header[20] = i & 0xff;
+ break;
+ }
+ }
+ }
+
+ memcpy(pOut, &Private1Header, sizeof(Private1Header));
+ pOut += sizeof(Private1Header);
+
+ majortype = &MEDIATYPE_Audio;
+ }
+
+ if (*majortype == MEDIATYPE_Audio) {
+ if (size < curlen) {
+ return E_FAIL;
+ }
+ memcpy(pOut, pIn, curlen);
+ pIn += curlen;
+ pOut += curlen;
+ }
+
+ pOutSample->SetActualDataLength(pOut - pOutOrg);
+
+ hr = m_pOutput->Deliver(pOutSample);
+ }
+
+ return S_FALSE;
+ } else { // phew, we can do the easier way
+ const GUID* majortype = &m_pOutput->CurrentMediaType().majortype;
+ const GUID* subtype = &m_pOutput->CurrentMediaType().subtype;
+
+ if (*majortype == MEDIATYPE_DVD_ENCRYPTED_PACK) {
+ if (size < len + 32 + 3) {
+ return E_FAIL;
+ }
+
+ BYTE PESHeader[] = {
+ 0x00, 0x00, 0x01, 0xBA, // PES id
+ 0x44, 0x00, 0x04, 0x00, 0x04, 0x01, // SCR (0)
+ 0x01, 0x89, 0xC3, 0xF8, // mux rate (1260000 bytes/sec, 22bits), marker (2bits), reserved (~0, 5bits), stuffing (0, 3bits)
+ };
+
+ memcpy(pOut, &PESHeader, sizeof(PESHeader));
+ pOut += sizeof(PESHeader);
+
+ majortype = &MEDIATYPE_MPEG2_PES;
+ }
+
+ if (*majortype == MEDIATYPE_MPEG2_PES) {
+ if (size < len + 20 + 3) {
+ return E_FAIL;
+ }
+
+ BYTE Private1Header[] = {
+ 0x00, 0x00, 0x01, 0xBD, // private stream 1 id
+ 0x07, 0xEC, // packet length (TODO: modify it later)
+ 0x81, 0x80, // marker, original, PTS - flags
+ 0x08, // packet data starting offset
+ 0x21, 0x00, 0x01, 0x00, 0x01, // PTS (0)
+ 0xFF, 0xFF, 0xFF, // stuffing
+ 0x80, // stream id (0)
+ 0x01, 0x00, 0x01, // no idea about the first byte, the sencond+third seem to show the ac3/dts header sync offset plus one (dvd2avi doesn't output it to the ac3/dts file so we have to put it back)
+ };
+
+ int packetlen = len + 12 + 3;
+ ASSERT(packetlen <= 0xffff);
+ Private1Header[4] = (packetlen >> 8) & 0xff;
+ Private1Header[5] = packetlen & 0xff;
+
+ if (*subtype == MEDIASUBTYPE_DTS) {
+ Private1Header[17] += 8;
+ }
+
+ memcpy(pOut, &Private1Header, sizeof(Private1Header));
+ pOut += sizeof(Private1Header);
+
+ majortype = &MEDIATYPE_Audio;
+ }
+
+ if (*majortype == MEDIATYPE_Audio) {
+ if (size < len) {
+ return E_FAIL;
+ }
+
+ memcpy(pOut, pIn, len);
+ pIn += len;
+ pOut += len;
+ }
+ }
+ } else {
+ return E_FAIL;
+ }
+
+ pOutSample->SetActualDataLength(pOut - pOutOrg);
+
+ return S_OK;
}
bool CAVI2AC3Filter::CheckAC3(const CMediaType* pmt)
{
- return (pmt->majortype == MEDIATYPE_Audio
- || pmt->majortype == MEDIATYPE_MPEG2_PES
- || pmt->majortype == MEDIATYPE_DVD_ENCRYPTED_PACK)
- && pmt->subtype == MEDIASUBTYPE_DOLBY_AC3;
+ return (pmt->majortype == MEDIATYPE_Audio
+ || pmt->majortype == MEDIATYPE_MPEG2_PES
+ || pmt->majortype == MEDIATYPE_DVD_ENCRYPTED_PACK)
+ && pmt->subtype == MEDIASUBTYPE_DOLBY_AC3;
}
bool CAVI2AC3Filter::CheckDTS(const CMediaType* pmt)
{
- return (pmt->majortype == MEDIATYPE_Audio
- || pmt->majortype == MEDIATYPE_MPEG2_PES
- || pmt->majortype == MEDIATYPE_DVD_ENCRYPTED_PACK)
- && pmt->subtype == MEDIASUBTYPE_DTS;
+ return (pmt->majortype == MEDIATYPE_Audio
+ || pmt->majortype == MEDIATYPE_MPEG2_PES
+ || pmt->majortype == MEDIATYPE_DVD_ENCRYPTED_PACK)
+ && pmt->subtype == MEDIASUBTYPE_DTS;
}
bool CAVI2AC3Filter::CheckWAVEAC3(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Audio
- && pmt->subtype == MEDIASUBTYPE_WAVE_DOLBY_AC3
- && pmt->formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DOLBY_AC3;
+ return pmt->majortype == MEDIATYPE_Audio
+ && pmt->subtype == MEDIASUBTYPE_WAVE_DOLBY_AC3
+ && pmt->formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DOLBY_AC3;
}
bool CAVI2AC3Filter::CheckWAVEDTS(const CMediaType* pmt)
{
- return pmt->majortype == MEDIATYPE_Audio
- && pmt->subtype == MEDIASUBTYPE_WAVE_DTS
- && pmt->formattype == FORMAT_WaveFormatEx
- && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DVD_DTS;
+ return pmt->majortype == MEDIATYPE_Audio
+ && pmt->subtype == MEDIASUBTYPE_WAVE_DTS
+ && pmt->formattype == FORMAT_WaveFormatEx
+ && ((WAVEFORMATEX*)pmt->pbFormat)->wFormatTag == WAVE_FORMAT_DVD_DTS;
}
HRESULT CAVI2AC3Filter::CheckInputType(const CMediaType* mtIn)
{
- bool fWaveFormatEx = !!(mtIn->formattype == FORMAT_WaveFormatEx);
+ bool fWaveFormatEx = !!(mtIn->formattype == FORMAT_WaveFormatEx);
- return CheckAC3(mtIn) && fWaveFormatEx || CheckDTS(mtIn) && fWaveFormatEx
- || CheckWAVEAC3(mtIn) || CheckWAVEDTS(mtIn)
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ return CheckAC3(mtIn) && fWaveFormatEx || CheckDTS(mtIn) && fWaveFormatEx
+ || CheckWAVEAC3(mtIn) || CheckWAVEDTS(mtIn)
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CAVI2AC3Filter::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut)
{
- return CheckAC3(mtIn) && CheckWAVEAC3(mtOut)
- || CheckWAVEAC3(mtIn) && CheckAC3(mtOut)
- || CheckDTS(mtIn) && CheckWAVEDTS(mtOut)
- || CheckWAVEDTS(mtIn) && CheckDTS(mtOut)
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ return CheckAC3(mtIn) && CheckWAVEAC3(mtOut)
+ || CheckWAVEAC3(mtIn) && CheckAC3(mtOut)
+ || CheckDTS(mtIn) && CheckWAVEDTS(mtOut)
+ || CheckWAVEDTS(mtIn) && CheckDTS(mtOut)
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CAVI2AC3Filter::DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties)
{
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
-
- CComPtr<IMemAllocator> pAllocatorIn;
- m_pInput->GetAllocator(&pAllocatorIn);
- if (!pAllocatorIn) {
- return E_UNEXPECTED;
- }
-
- pAllocatorIn->GetProperties(pProperties);
-
- pProperties->cBuffers = 2;
- pProperties->cbBuffer = max(pProperties->cbBuffer, 1024*1024); // this should be enough...
- pProperties->cbAlign = 1;
- pProperties->cbPrefix = 0;
-
- HRESULT hr;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
- return hr;
- }
-
- return (pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
- ? E_FAIL
- : NOERROR);
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
+
+ CComPtr<IMemAllocator> pAllocatorIn;
+ m_pInput->GetAllocator(&pAllocatorIn);
+ if (!pAllocatorIn) {
+ return E_UNEXPECTED;
+ }
+
+ pAllocatorIn->GetProperties(pProperties);
+
+ pProperties->cBuffers = 2;
+ pProperties->cbBuffer = max(pProperties->cbBuffer, 1024 * 1024); // this should be enough...
+ pProperties->cbAlign = 1;
+ pProperties->cbPrefix = 0;
+
+ HRESULT hr;
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
+
+ return (pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
+ ? E_FAIL
+ : NOERROR);
}
HRESULT CAVI2AC3Filter::GetMediaType(int iPosition, CMediaType* pMediaType)
{
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
-
- const GUID& majortype = m_pInput->CurrentMediaType().majortype;
- const GUID& subtype = m_pInput->CurrentMediaType().subtype;
- UNREFERENCED_PARAMETER(majortype);
-
- if (CheckAC3(&m_pInput->CurrentMediaType()) || CheckDTS(&m_pInput->CurrentMediaType())) {
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > 0) {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- pMediaType->majortype = MEDIATYPE_Audio;
-
- pMediaType->formattype = FORMAT_WaveFormatEx;
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)pMediaType->AllocFormatBuffer(sizeof(WAVEFORMATEX));
- memset(wfe, 0, sizeof(WAVEFORMATEX));
- wfe->cbSize = sizeof(WAVEFORMATEX);
- wfe->nAvgBytesPerSec = ((WAVEFORMATEX*)m_pInput->CurrentMediaType().pbFormat)->nAvgBytesPerSec;
- wfe->nSamplesPerSec = ((WAVEFORMATEX*)m_pInput->CurrentMediaType().pbFormat)->nSamplesPerSec;
- wfe->wBitsPerSample = ((WAVEFORMATEX*)m_pInput->CurrentMediaType().pbFormat)->wBitsPerSample;
- wfe->nChannels = 2;
- wfe->nBlockAlign = 1;
-
- if (subtype == MEDIASUBTYPE_DOLBY_AC3) {
- pMediaType->subtype = MEDIASUBTYPE_WAVE_DOLBY_AC3;
- wfe->wFormatTag = WAVE_FORMAT_DOLBY_AC3;
- } else if (subtype == MEDIASUBTYPE_DTS) {
- pMediaType->subtype = MEDIASUBTYPE_WAVE_DTS;
- wfe->wFormatTag = WAVE_FORMAT_DVD_DTS;
- } else {
- return E_INVALIDARG;
- }
- } else if (CheckWAVEAC3(&m_pInput->CurrentMediaType()) || CheckWAVEDTS(&m_pInput->CurrentMediaType())) {
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > 4) {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- if (subtype == MEDIASUBTYPE_WAVE_DOLBY_AC3) {
- pMediaType->subtype = MEDIASUBTYPE_DOLBY_AC3;
-
- pMediaType->formattype = FORMAT_WaveFormatEx;
- DOLBYAC3WAVEFORMAT* wfe = (DOLBYAC3WAVEFORMAT*)pMediaType->AllocFormatBuffer(sizeof(DOLBYAC3WAVEFORMAT));
- memset(wfe, 0, sizeof(DOLBYAC3WAVEFORMAT));
- // unfortunately we can't tell what we are going to get in transform,
- // so we just set the most common values and hope that the ac3 decoder
- // is flexible enough (it is usually :) to find out these from the bitstream
- wfe->wfx.cbSize = sizeof(DOLBYAC3WAVEFORMAT) - sizeof(WAVEFORMATEX);
- wfe->wfx.wFormatTag = WAVE_FORMAT_DOLBY_AC3;
- wfe->wfx.nSamplesPerSec = 48000;
- wfe->wfx.nChannels = 6;
- wfe->bBigEndian = TRUE;
- } else if (subtype == MEDIASUBTYPE_WAVE_DTS) {
- pMediaType->subtype = MEDIASUBTYPE_DTS;
-
- pMediaType->formattype = FORMAT_WaveFormatEx;
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)pMediaType->AllocFormatBuffer(sizeof(WAVEFORMATEX));
- memset(wfe, 0, sizeof(WAVEFORMATEX));
- // same case as with ac3, but this time we don't even know the structure
- wfe->cbSize = sizeof(WAVEFORMATEX);
- wfe->wFormatTag = WAVE_FORMAT_PCM;
- wfe->nSamplesPerSec = 48000;
- wfe->nChannels = 6;
- } else {
- return E_INVALIDARG;
- }
-
- switch (iPosition) {
- case 0:
- pMediaType->majortype = MEDIATYPE_Audio;
- break;
- case 1:
- pMediaType->ResetFormatBuffer();
- pMediaType->formattype = FORMAT_None;
- case 2:
- pMediaType->majortype = MEDIATYPE_MPEG2_PES;
- break;
- case 3:
- pMediaType->ResetFormatBuffer();
- pMediaType->formattype = FORMAT_None;
- case 4:
- pMediaType->majortype = MEDIATYPE_DVD_ENCRYPTED_PACK;
- break;
- default:
- return E_INVALIDARG;
- }
- } else {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- return S_OK;
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
+
+ const GUID& majortype = m_pInput->CurrentMediaType().majortype;
+ const GUID& subtype = m_pInput->CurrentMediaType().subtype;
+ UNREFERENCED_PARAMETER(majortype);
+
+ if (CheckAC3(&m_pInput->CurrentMediaType()) || CheckDTS(&m_pInput->CurrentMediaType())) {
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > 0) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ pMediaType->majortype = MEDIATYPE_Audio;
+
+ pMediaType->formattype = FORMAT_WaveFormatEx;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)pMediaType->AllocFormatBuffer(sizeof(WAVEFORMATEX));
+ memset(wfe, 0, sizeof(WAVEFORMATEX));
+ wfe->cbSize = sizeof(WAVEFORMATEX);
+ wfe->nAvgBytesPerSec = ((WAVEFORMATEX*)m_pInput->CurrentMediaType().pbFormat)->nAvgBytesPerSec;
+ wfe->nSamplesPerSec = ((WAVEFORMATEX*)m_pInput->CurrentMediaType().pbFormat)->nSamplesPerSec;
+ wfe->wBitsPerSample = ((WAVEFORMATEX*)m_pInput->CurrentMediaType().pbFormat)->wBitsPerSample;
+ wfe->nChannels = 2;
+ wfe->nBlockAlign = 1;
+
+ if (subtype == MEDIASUBTYPE_DOLBY_AC3) {
+ pMediaType->subtype = MEDIASUBTYPE_WAVE_DOLBY_AC3;
+ wfe->wFormatTag = WAVE_FORMAT_DOLBY_AC3;
+ } else if (subtype == MEDIASUBTYPE_DTS) {
+ pMediaType->subtype = MEDIASUBTYPE_WAVE_DTS;
+ wfe->wFormatTag = WAVE_FORMAT_DVD_DTS;
+ } else {
+ return E_INVALIDARG;
+ }
+ } else if (CheckWAVEAC3(&m_pInput->CurrentMediaType()) || CheckWAVEDTS(&m_pInput->CurrentMediaType())) {
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > 4) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ if (subtype == MEDIASUBTYPE_WAVE_DOLBY_AC3) {
+ pMediaType->subtype = MEDIASUBTYPE_DOLBY_AC3;
+
+ pMediaType->formattype = FORMAT_WaveFormatEx;
+ DOLBYAC3WAVEFORMAT* wfe = (DOLBYAC3WAVEFORMAT*)pMediaType->AllocFormatBuffer(sizeof(DOLBYAC3WAVEFORMAT));
+ memset(wfe, 0, sizeof(DOLBYAC3WAVEFORMAT));
+ // unfortunately we can't tell what we are going to get in transform,
+ // so we just set the most common values and hope that the ac3 decoder
+ // is flexible enough (it is usually :) to find out these from the bitstream
+ wfe->wfx.cbSize = sizeof(DOLBYAC3WAVEFORMAT) - sizeof(WAVEFORMATEX);
+ wfe->wfx.wFormatTag = WAVE_FORMAT_DOLBY_AC3;
+ wfe->wfx.nSamplesPerSec = 48000;
+ wfe->wfx.nChannels = 6;
+ wfe->bBigEndian = TRUE;
+ } else if (subtype == MEDIASUBTYPE_WAVE_DTS) {
+ pMediaType->subtype = MEDIASUBTYPE_DTS;
+
+ pMediaType->formattype = FORMAT_WaveFormatEx;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)pMediaType->AllocFormatBuffer(sizeof(WAVEFORMATEX));
+ memset(wfe, 0, sizeof(WAVEFORMATEX));
+ // same case as with ac3, but this time we don't even know the structure
+ wfe->cbSize = sizeof(WAVEFORMATEX);
+ wfe->wFormatTag = WAVE_FORMAT_PCM;
+ wfe->nSamplesPerSec = 48000;
+ wfe->nChannels = 6;
+ } else {
+ return E_INVALIDARG;
+ }
+
+ switch (iPosition) {
+ case 0:
+ pMediaType->majortype = MEDIATYPE_Audio;
+ break;
+ case 1:
+ pMediaType->ResetFormatBuffer();
+ pMediaType->formattype = FORMAT_None;
+ case 2:
+ pMediaType->majortype = MEDIATYPE_MPEG2_PES;
+ break;
+ case 3:
+ pMediaType->ResetFormatBuffer();
+ pMediaType->formattype = FORMAT_None;
+ case 4:
+ pMediaType->majortype = MEDIATYPE_DVD_ENCRYPTED_PACK;
+ break;
+ default:
+ return E_INVALIDARG;
+ }
+ } else {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ return S_OK;
}
diff --git a/src/filters/transform/AVI2AC3Filter/AVI2AC3Filter.h b/src/filters/transform/AVI2AC3Filter/AVI2AC3Filter.h
index 91c5990d7..56d49dc67 100644
--- a/src/filters/transform/AVI2AC3Filter/AVI2AC3Filter.h
+++ b/src/filters/transform/AVI2AC3Filter/AVI2AC3Filter.h
@@ -37,12 +37,12 @@
*/
typedef struct tagDOLBYAC3WAVEFORMAT {
- WAVEFORMATEX wfx;
- BYTE bBigEndian; // TRUE = Big Endian, FALSE little endian
- BYTE bsid;
- BYTE lfeon;
- BYTE copyrightb;
- BYTE nAuxBitsCode; // Aux bits per frame
+ WAVEFORMATEX wfx;
+ BYTE bBigEndian; // TRUE = Big Endian, FALSE little endian
+ BYTE bsid;
+ BYTE lfeon;
+ BYTE copyrightb;
+ BYTE nAuxBitsCode; // Aux bits per frame
} DOLBYAC3WAVEFORMAT;
//
@@ -50,20 +50,20 @@ typedef struct tagDOLBYAC3WAVEFORMAT {
//
class __declspec(uuid("93230DD0-7B3C-4efb-AFBB-DC380FEC9E6B"))
- CAVI2AC3Filter : public CTransformFilter
+ CAVI2AC3Filter : public CTransformFilter
{
- bool CheckAC3(const CMediaType* pmt);
- bool CheckDTS(const CMediaType* pmt);
- bool CheckWAVEAC3(const CMediaType* pmt);
- bool CheckWAVEDTS(const CMediaType* pmt);
+ bool CheckAC3(const CMediaType* pmt);
+ bool CheckDTS(const CMediaType* pmt);
+ bool CheckWAVEAC3(const CMediaType* pmt);
+ bool CheckWAVEDTS(const CMediaType* pmt);
public:
- CAVI2AC3Filter(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CAVI2AC3Filter();
+ CAVI2AC3Filter(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CAVI2AC3Filter();
- HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
- HRESULT CheckInputType(const CMediaType* mtIn);
- HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
- HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
+ HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
+ HRESULT CheckInputType(const CMediaType* mtIn);
+ HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
+ HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
};
diff --git a/src/filters/transform/BaseVideoFilter/BaseVideoFilter.cpp b/src/filters/transform/BaseVideoFilter/BaseVideoFilter.cpp
index 62f002a58..9465047cb 100644
--- a/src/filters/transform/BaseVideoFilter/BaseVideoFilter.cpp
+++ b/src/filters/transform/BaseVideoFilter/BaseVideoFilter.cpp
@@ -36,36 +36,36 @@
bool f_need_set_aspect;
CBaseVideoFilter::CBaseVideoFilter(TCHAR* pName, LPUNKNOWN lpunk, HRESULT* phr, REFCLSID clsid, long cBuffers)
- : CTransformFilter(pName, lpunk, clsid)
- , m_cBuffers(cBuffers)
+ : CTransformFilter(pName, lpunk, clsid)
+ , m_cBuffers(cBuffers)
{
- if (phr) {
- *phr = S_OK;
- }
-
- m_pInput = DNew CBaseVideoInputPin(NAME("CBaseVideoInputPin"), this, phr, L"Video");
- if (!m_pInput) {
- *phr = E_OUTOFMEMORY;
- }
- if (FAILED(*phr)) {
- return;
- }
-
- m_pOutput = DNew CBaseVideoOutputPin(NAME("CBaseVideoOutputPin"), this, phr, L"Output");
- if (!m_pOutput) {
- *phr = E_OUTOFMEMORY;
- }
- if (FAILED(*phr)) {
- delete m_pInput, m_pInput = NULL;
- return;
- }
-
- m_wout = m_win = m_w = 0;
- m_hout = m_hin = m_h = 0;
- m_arxout = m_arxin = m_arx = 0;
- m_aryout = m_aryin = m_ary = 0;
-
- f_need_set_aspect = false;
+ if (phr) {
+ *phr = S_OK;
+ }
+
+ m_pInput = DNew CBaseVideoInputPin(NAME("CBaseVideoInputPin"), this, phr, L"Video");
+ if (!m_pInput) {
+ *phr = E_OUTOFMEMORY;
+ }
+ if (FAILED(*phr)) {
+ return;
+ }
+
+ m_pOutput = DNew CBaseVideoOutputPin(NAME("CBaseVideoOutputPin"), this, phr, L"Output");
+ if (!m_pOutput) {
+ *phr = E_OUTOFMEMORY;
+ }
+ if (FAILED(*phr)) {
+ delete m_pInput, m_pInput = NULL;
+ return;
+ }
+
+ m_wout = m_win = m_w = 0;
+ m_hout = m_hin = m_h = 0;
+ m_arxout = m_arxin = m_arx = 0;
+ m_aryout = m_aryin = m_ary = 0;
+
+ f_need_set_aspect = false;
}
CBaseVideoFilter::~CBaseVideoFilter()
@@ -74,567 +74,567 @@ CBaseVideoFilter::~CBaseVideoFilter()
void CBaseVideoFilter::SetAspect(CSize aspect)
{
- f_need_set_aspect = true;
- m_arx = aspect.cx;
- m_ary = aspect.cy;
+ f_need_set_aspect = true;
+ m_arx = aspect.cx;
+ m_ary = aspect.cy;
}
int CBaseVideoFilter::GetPinCount()
{
- return 2;
+ return 2;
}
CBasePin* CBaseVideoFilter::GetPin(int n)
{
- switch (n) {
- case 0:
- return m_pInput;
- case 1:
- return m_pOutput;
- }
- return NULL;
+ switch (n) {
+ case 0:
+ return m_pInput;
+ case 1:
+ return m_pOutput;
+ }
+ return NULL;
}
HRESULT CBaseVideoFilter::Receive(IMediaSample* pIn)
{
#ifndef _WIN64
- // TODOX64 : fixme!
- _mm_empty(); // just for safety
+ // TODOX64 : fixme!
+ _mm_empty(); // just for safety
#endif
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- HRESULT hr;
+ HRESULT hr;
- AM_SAMPLE2_PROPERTIES* const pProps = m_pInput->SampleProps();
- if (pProps->dwStreamId != AM_STREAM_MEDIA) {
- return m_pOutput->Deliver(pIn);
- }
+ AM_SAMPLE2_PROPERTIES* const pProps = m_pInput->SampleProps();
+ if (pProps->dwStreamId != AM_STREAM_MEDIA) {
+ return m_pOutput->Deliver(pIn);
+ }
- AM_MEDIA_TYPE* pmt;
- if (SUCCEEDED(pIn->GetMediaType(&pmt)) && pmt) {
- CMediaType mt(*pmt);
- m_pInput->SetMediaType(&mt);
- DeleteMediaType(pmt);
- }
+ AM_MEDIA_TYPE* pmt;
+ if (SUCCEEDED(pIn->GetMediaType(&pmt)) && pmt) {
+ CMediaType mt(*pmt);
+ m_pInput->SetMediaType(&mt);
+ DeleteMediaType(pmt);
+ }
- if (FAILED(hr = Transform(pIn))) {
- return hr;
- }
+ if (FAILED(hr = Transform(pIn))) {
+ return hr;
+ }
- return S_OK;
+ return S_OK;
}
HRESULT CBaseVideoFilter::GetDeliveryBuffer(int w, int h, IMediaSample** ppOut)
{
- CheckPointer(ppOut, E_POINTER);
+ CheckPointer(ppOut, E_POINTER);
- HRESULT hr;
+ HRESULT hr;
- if (FAILED(hr = ReconnectOutput(w, h))) {
- return hr;
- }
+ if (FAILED(hr = ReconnectOutput(w, h))) {
+ return hr;
+ }
- if (FAILED(hr = m_pOutput->GetDeliveryBuffer(ppOut, NULL, NULL, 0))) {
- return hr;
- }
+ if (FAILED(hr = m_pOutput->GetDeliveryBuffer(ppOut, NULL, NULL, 0))) {
+ return hr;
+ }
- AM_MEDIA_TYPE* pmt;
- if (SUCCEEDED((*ppOut)->GetMediaType(&pmt)) && pmt) {
- CMediaType mt = *pmt;
- m_pOutput->SetMediaType(&mt);
- DeleteMediaType(pmt);
- }
+ AM_MEDIA_TYPE* pmt;
+ if (SUCCEEDED((*ppOut)->GetMediaType(&pmt)) && pmt) {
+ CMediaType mt = *pmt;
+ m_pOutput->SetMediaType(&mt);
+ DeleteMediaType(pmt);
+ }
- (*ppOut)->SetDiscontinuity(FALSE);
- (*ppOut)->SetSyncPoint(TRUE);
+ (*ppOut)->SetDiscontinuity(FALSE);
+ (*ppOut)->SetSyncPoint(TRUE);
- // FIXME: hell knows why but without this the overlay mixer starts very skippy
- // (don't enable this for other renderers, the old for example will go crazy if you do)
- if (GetCLSID(m_pOutput->GetConnected()) == CLSID_OverlayMixer) {
- (*ppOut)->SetDiscontinuity(TRUE);
- }
+ // FIXME: hell knows why but without this the overlay mixer starts very skippy
+ // (don't enable this for other renderers, the old for example will go crazy if you do)
+ if (GetCLSID(m_pOutput->GetConnected()) == CLSID_OverlayMixer) {
+ (*ppOut)->SetDiscontinuity(TRUE);
+ }
- return S_OK;
+ return S_OK;
}
HRESULT CBaseVideoFilter::ReconnectOutput(int w, int h, bool bSendSample, int realWidth, int realHeight)
{
- CMediaType& mt = m_pOutput->CurrentMediaType();
-
- bool m_update_aspect = false;
- if (f_need_set_aspect) {
- int wout = 0, hout = 0, arxout = 0, aryout = 0;
- ExtractDim(&mt, wout, hout, arxout, aryout);
- if (arxout != m_arx || aryout != m_ary) {
- TRACE(_T("\nCBaseVideoFilter::ReconnectOutput; wout = %d, hout = %d, current = %dx%d, set = %dx%d\n"), wout, hout, arxout, aryout, m_arx, m_ary);
- m_update_aspect = true;
- }
- }
-
- int w_org = m_w;
- int h_org = m_h;
-
- bool fForceReconnection = false;
- if (w != m_w || h != m_h) {
- fForceReconnection = true;
- m_w = w;
- m_h = h;
- }
-
- HRESULT hr = S_OK;
-
- if (m_update_aspect || fForceReconnection || m_w != m_wout || m_h != m_hout || m_arx != m_arxout || m_ary != m_aryout) {
- if (GetCLSID(m_pOutput->GetConnected()) == CLSID_VideoRenderer) {
- NotifyEvent(EC_ERRORABORT, 0, 0);
- return E_FAIL;
- }
-
- BITMAPINFOHEADER* bmi = NULL;
-
- if (mt.formattype == FORMAT_VideoInfo) {
- VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)mt.Format();
- if (realWidth > 0 && realHeight > 0) {
- SetRect(&vih->rcSource, 0, 0, realWidth, realHeight);
- SetRect(&vih->rcTarget, 0, 0, realWidth, realHeight);
- } else {
- SetRect(&vih->rcSource, 0, 0, m_w, m_h);
- SetRect(&vih->rcTarget, 0, 0, m_w, m_h);
- }
- bmi = &vih->bmiHeader;
- bmi->biXPelsPerMeter = m_w * m_ary;
- bmi->biYPelsPerMeter = m_h * m_arx;
- } else if (mt.formattype == FORMAT_VideoInfo2) {
- VIDEOINFOHEADER2* vih = (VIDEOINFOHEADER2*)mt.Format();
- if (realWidth > 0 && realHeight > 0) {
- SetRect(&vih->rcSource, 0, 0, realWidth, realHeight);
- SetRect(&vih->rcTarget, 0, 0, realWidth, realHeight);
- } else {
- SetRect(&vih->rcSource, 0, 0, m_w, m_h);
- SetRect(&vih->rcTarget, 0, 0, m_w, m_h);
- }
- bmi = &vih->bmiHeader;
- vih->dwPictAspectRatioX = m_arx;
- vih->dwPictAspectRatioY = m_ary;
- } else {
- return E_FAIL; //should never be here? prevent null pointer refs for bmi
- }
-
- bmi->biWidth = m_w;
- bmi->biHeight = m_h;
- bmi->biSizeImage = m_w*m_h*bmi->biBitCount>>3;
-
- hr = m_pOutput->GetConnected()->QueryAccept(&mt);
- ASSERT(SUCCEEDED(hr)); // should better not fail, after all "mt" is the current media type, just with a different resolution
- HRESULT hr1 = 0;
- CComPtr<IMediaSample> pOut;
- if (SUCCEEDED(hr1 = m_pOutput->GetConnected()->ReceiveConnection(m_pOutput, &mt))) {
- if (bSendSample) {
- HRESULT hr2 = 0;
- if (SUCCEEDED(hr2 = m_pOutput->GetDeliveryBuffer(&pOut, NULL, NULL, 0))) {
- AM_MEDIA_TYPE* pmt;
- if (SUCCEEDED(pOut->GetMediaType(&pmt)) && pmt) {
- CMediaType mt = *pmt;
- m_pOutput->SetMediaType(&mt);
- DeleteMediaType(pmt);
- } else { // stupid overlay mixer won't let us know the new pitch...
- long size = pOut->GetSize();
- bmi->biWidth = size ? (size / abs(bmi->biHeight) * 8 / bmi->biBitCount) : bmi->biWidth;
- }
- } else {
- m_w = w_org;
- m_h = h_org;
- return E_FAIL;
- }
- }
- }
-
- m_wout = m_w;
- m_hout = m_h;
- m_arxout = m_arx;
- m_aryout = m_ary;
-
- // some renderers don't send this
- NotifyEvent(EC_VIDEO_SIZE_CHANGED, MAKELPARAM(m_w, m_h), 0);
-
- return S_OK;
- }
-
- return S_FALSE;
+ CMediaType& mt = m_pOutput->CurrentMediaType();
+
+ bool m_update_aspect = false;
+ if (f_need_set_aspect) {
+ int wout = 0, hout = 0, arxout = 0, aryout = 0;
+ ExtractDim(&mt, wout, hout, arxout, aryout);
+ if (arxout != m_arx || aryout != m_ary) {
+ TRACE(_T("\nCBaseVideoFilter::ReconnectOutput; wout = %d, hout = %d, current = %dx%d, set = %dx%d\n"), wout, hout, arxout, aryout, m_arx, m_ary);
+ m_update_aspect = true;
+ }
+ }
+
+ int w_org = m_w;
+ int h_org = m_h;
+
+ bool fForceReconnection = false;
+ if (w != m_w || h != m_h) {
+ fForceReconnection = true;
+ m_w = w;
+ m_h = h;
+ }
+
+ HRESULT hr = S_OK;
+
+ if (m_update_aspect || fForceReconnection || m_w != m_wout || m_h != m_hout || m_arx != m_arxout || m_ary != m_aryout) {
+ if (GetCLSID(m_pOutput->GetConnected()) == CLSID_VideoRenderer) {
+ NotifyEvent(EC_ERRORABORT, 0, 0);
+ return E_FAIL;
+ }
+
+ BITMAPINFOHEADER* bmi = NULL;
+
+ if (mt.formattype == FORMAT_VideoInfo) {
+ VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)mt.Format();
+ if (realWidth > 0 && realHeight > 0) {
+ SetRect(&vih->rcSource, 0, 0, realWidth, realHeight);
+ SetRect(&vih->rcTarget, 0, 0, realWidth, realHeight);
+ } else {
+ SetRect(&vih->rcSource, 0, 0, m_w, m_h);
+ SetRect(&vih->rcTarget, 0, 0, m_w, m_h);
+ }
+ bmi = &vih->bmiHeader;
+ bmi->biXPelsPerMeter = m_w * m_ary;
+ bmi->biYPelsPerMeter = m_h * m_arx;
+ } else if (mt.formattype == FORMAT_VideoInfo2) {
+ VIDEOINFOHEADER2* vih = (VIDEOINFOHEADER2*)mt.Format();
+ if (realWidth > 0 && realHeight > 0) {
+ SetRect(&vih->rcSource, 0, 0, realWidth, realHeight);
+ SetRect(&vih->rcTarget, 0, 0, realWidth, realHeight);
+ } else {
+ SetRect(&vih->rcSource, 0, 0, m_w, m_h);
+ SetRect(&vih->rcTarget, 0, 0, m_w, m_h);
+ }
+ bmi = &vih->bmiHeader;
+ vih->dwPictAspectRatioX = m_arx;
+ vih->dwPictAspectRatioY = m_ary;
+ } else {
+ return E_FAIL; //should never be here? prevent null pointer refs for bmi
+ }
+
+ bmi->biWidth = m_w;
+ bmi->biHeight = m_h;
+ bmi->biSizeImage = m_w * m_h * bmi->biBitCount >> 3;
+
+ hr = m_pOutput->GetConnected()->QueryAccept(&mt);
+ ASSERT(SUCCEEDED(hr)); // should better not fail, after all "mt" is the current media type, just with a different resolution
+ HRESULT hr1 = 0;
+ CComPtr<IMediaSample> pOut;
+ if (SUCCEEDED(hr1 = m_pOutput->GetConnected()->ReceiveConnection(m_pOutput, &mt))) {
+ if (bSendSample) {
+ HRESULT hr2 = 0;
+ if (SUCCEEDED(hr2 = m_pOutput->GetDeliveryBuffer(&pOut, NULL, NULL, 0))) {
+ AM_MEDIA_TYPE* pmt;
+ if (SUCCEEDED(pOut->GetMediaType(&pmt)) && pmt) {
+ CMediaType mt = *pmt;
+ m_pOutput->SetMediaType(&mt);
+ DeleteMediaType(pmt);
+ } else { // stupid overlay mixer won't let us know the new pitch...
+ long size = pOut->GetSize();
+ bmi->biWidth = size ? (size / abs(bmi->biHeight) * 8 / bmi->biBitCount) : bmi->biWidth;
+ }
+ } else {
+ m_w = w_org;
+ m_h = h_org;
+ return E_FAIL;
+ }
+ }
+ }
+
+ m_wout = m_w;
+ m_hout = m_h;
+ m_arxout = m_arx;
+ m_aryout = m_ary;
+
+ // some renderers don't send this
+ NotifyEvent(EC_VIDEO_SIZE_CHANGED, MAKELPARAM(m_w, m_h), 0);
+
+ return S_OK;
+ }
+
+ return S_FALSE;
}
HRESULT CBaseVideoFilter::CopyBuffer(BYTE* pOut, BYTE* pIn, int w, int h, int pitchIn, const GUID& subtype, bool fInterlaced)
{
- int abs_h = abs(h);
- BYTE* pInYUV[3] = {pIn, pIn + pitchIn*abs_h, pIn + pitchIn*abs_h + (pitchIn>>1)*(abs_h>>1)};
- return CopyBuffer(pOut, pInYUV, w, h, pitchIn, subtype, fInterlaced);
+ int abs_h = abs(h);
+ BYTE* pInYUV[3] = {pIn, pIn + pitchIn * abs_h, pIn + pitchIn* abs_h + (pitchIn >> 1)* (abs_h >> 1)};
+ return CopyBuffer(pOut, pInYUV, w, h, pitchIn, subtype, fInterlaced);
}
HRESULT CBaseVideoFilter::CopyBuffer(BYTE* pOut, BYTE** ppIn, int w, int h, int pitchIn, const GUID& subtype, bool fInterlaced)
{
- BITMAPINFOHEADER bihOut;
- ExtractBIH(&m_pOutput->CurrentMediaType(), &bihOut);
-
- int pitchOut = 0;
-
- if (bihOut.biCompression == BI_RGB || bihOut.biCompression == BI_BITFIELDS) {
- pitchOut = bihOut.biWidth*bihOut.biBitCount>>3;
-
- if (bihOut.biHeight > 0) {
- pOut += pitchOut*(h-1);
- pitchOut = -pitchOut;
- if (h < 0) {
- h = -h;
- }
- }
- }
-
- if (h < 0) {
- h = -h;
- ppIn[0] += pitchIn*(h-1);
- ppIn[1] += (pitchIn>>1)*((h>>1)-1);
- ppIn[2] += (pitchIn>>1)*((h>>1)-1);
- pitchIn = -pitchIn;
- }
-
- if (subtype == MEDIASUBTYPE_I420 || subtype == MEDIASUBTYPE_IYUV || subtype == MEDIASUBTYPE_YV12) {
- BYTE* pIn = ppIn[0];
- BYTE* pInU = ppIn[1];
- BYTE* pInV = ppIn[2];
-
- if (subtype == MEDIASUBTYPE_YV12) {
- BYTE* tmp = pInU;
- pInU = pInV;
- pInV = tmp;
- }
-
- BYTE* pOutU = pOut + bihOut.biWidth*h;
- BYTE* pOutV = pOut + bihOut.biWidth*h*5/4;
-
- if (bihOut.biCompression == '21VY') {
- BYTE* tmp = pOutU;
- pOutU = pOutV;
- pOutV = tmp;
- }
-
- ASSERT(w <= abs(pitchIn));
-
- if (bihOut.biCompression == '2YUY') {
- if (!fInterlaced) {
- BitBltFromI420ToYUY2(w, h, pOut, bihOut.biWidth*2, pIn, pInU, pInV, pitchIn);
- } else {
- BitBltFromI420ToYUY2Interlaced(w, h, pOut, bihOut.biWidth*2, pIn, pInU, pInV, pitchIn);
- }
- } else if (bihOut.biCompression == '024I' || bihOut.biCompression == 'VUYI' || bihOut.biCompression == '21VY') {
- BitBltFromI420ToI420(w, h, pOut, pOutU, pOutV, bihOut.biWidth, pIn, pInU, pInV, pitchIn);
- } else if (bihOut.biCompression == BI_RGB || bihOut.biCompression == BI_BITFIELDS) {
- if (!BitBltFromI420ToRGB(w, h, pOut, pitchOut, bihOut.biBitCount, pIn, pInU, pInV, pitchIn)) {
- for (int y = 0; y < h; y++, pOut += pitchOut) {
- memset(pOut, 0, pitchOut);
- }
- }
- }
- } else if (subtype == MEDIASUBTYPE_YUY2) {
- if (bihOut.biCompression == '2YUY') {
- BitBltFromYUY2ToYUY2(w, h, pOut, bihOut.biWidth*2, ppIn[0], pitchIn);
- } else if (bihOut.biCompression == BI_RGB || bihOut.biCompression == BI_BITFIELDS) {
- if (!BitBltFromYUY2ToRGB(w, h, pOut, pitchOut, bihOut.biBitCount, ppIn[0], pitchIn)) {
- for (int y = 0; y < h; y++, pOut += pitchOut) {
- memset(pOut, 0, pitchOut);
- }
- }
- }
- } else if (subtype == MEDIASUBTYPE_ARGB32 || subtype == MEDIASUBTYPE_RGB32 || subtype == MEDIASUBTYPE_RGB24 || subtype == MEDIASUBTYPE_RGB565) {
- int sbpp =
- subtype == MEDIASUBTYPE_ARGB32 || subtype == MEDIASUBTYPE_RGB32 ? 32 :
- subtype == MEDIASUBTYPE_RGB24 ? 24 :
- subtype == MEDIASUBTYPE_RGB565 ? 16 : 0;
-
- if (bihOut.biCompression == '2YUY') {
- // TODO
- // BitBltFromRGBToYUY2();
- } else if (bihOut.biCompression == BI_RGB || bihOut.biCompression == BI_BITFIELDS) {
- if (!BitBltFromRGBToRGB(w, h, pOut, pitchOut, bihOut.biBitCount, ppIn[0], pitchIn, sbpp)) {
- for (int y = 0; y < h; y++, pOut += pitchOut) {
- memset(pOut, 0, pitchOut);
- }
- }
- }
- } else {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- return S_OK;
+ BITMAPINFOHEADER bihOut;
+ ExtractBIH(&m_pOutput->CurrentMediaType(), &bihOut);
+
+ int pitchOut = 0;
+
+ if (bihOut.biCompression == BI_RGB || bihOut.biCompression == BI_BITFIELDS) {
+ pitchOut = bihOut.biWidth * bihOut.biBitCount >> 3;
+
+ if (bihOut.biHeight > 0) {
+ pOut += pitchOut * (h - 1);
+ pitchOut = -pitchOut;
+ if (h < 0) {
+ h = -h;
+ }
+ }
+ }
+
+ if (h < 0) {
+ h = -h;
+ ppIn[0] += pitchIn * (h - 1);
+ ppIn[1] += (pitchIn >> 1) * ((h >> 1) - 1);
+ ppIn[2] += (pitchIn >> 1) * ((h >> 1) - 1);
+ pitchIn = -pitchIn;
+ }
+
+ if (subtype == MEDIASUBTYPE_I420 || subtype == MEDIASUBTYPE_IYUV || subtype == MEDIASUBTYPE_YV12) {
+ BYTE* pIn = ppIn[0];
+ BYTE* pInU = ppIn[1];
+ BYTE* pInV = ppIn[2];
+
+ if (subtype == MEDIASUBTYPE_YV12) {
+ BYTE* tmp = pInU;
+ pInU = pInV;
+ pInV = tmp;
+ }
+
+ BYTE* pOutU = pOut + bihOut.biWidth * h;
+ BYTE* pOutV = pOut + bihOut.biWidth * h * 5 / 4;
+
+ if (bihOut.biCompression == '21VY') {
+ BYTE* tmp = pOutU;
+ pOutU = pOutV;
+ pOutV = tmp;
+ }
+
+ ASSERT(w <= abs(pitchIn));
+
+ if (bihOut.biCompression == '2YUY') {
+ if (!fInterlaced) {
+ BitBltFromI420ToYUY2(w, h, pOut, bihOut.biWidth * 2, pIn, pInU, pInV, pitchIn);
+ } else {
+ BitBltFromI420ToYUY2Interlaced(w, h, pOut, bihOut.biWidth * 2, pIn, pInU, pInV, pitchIn);
+ }
+ } else if (bihOut.biCompression == '024I' || bihOut.biCompression == 'VUYI' || bihOut.biCompression == '21VY') {
+ BitBltFromI420ToI420(w, h, pOut, pOutU, pOutV, bihOut.biWidth, pIn, pInU, pInV, pitchIn);
+ } else if (bihOut.biCompression == BI_RGB || bihOut.biCompression == BI_BITFIELDS) {
+ if (!BitBltFromI420ToRGB(w, h, pOut, pitchOut, bihOut.biBitCount, pIn, pInU, pInV, pitchIn)) {
+ for (int y = 0; y < h; y++, pOut += pitchOut) {
+ memset(pOut, 0, pitchOut);
+ }
+ }
+ }
+ } else if (subtype == MEDIASUBTYPE_YUY2) {
+ if (bihOut.biCompression == '2YUY') {
+ BitBltFromYUY2ToYUY2(w, h, pOut, bihOut.biWidth * 2, ppIn[0], pitchIn);
+ } else if (bihOut.biCompression == BI_RGB || bihOut.biCompression == BI_BITFIELDS) {
+ if (!BitBltFromYUY2ToRGB(w, h, pOut, pitchOut, bihOut.biBitCount, ppIn[0], pitchIn)) {
+ for (int y = 0; y < h; y++, pOut += pitchOut) {
+ memset(pOut, 0, pitchOut);
+ }
+ }
+ }
+ } else if (subtype == MEDIASUBTYPE_ARGB32 || subtype == MEDIASUBTYPE_RGB32 || subtype == MEDIASUBTYPE_RGB24 || subtype == MEDIASUBTYPE_RGB565) {
+ int sbpp =
+ subtype == MEDIASUBTYPE_ARGB32 || subtype == MEDIASUBTYPE_RGB32 ? 32 :
+ subtype == MEDIASUBTYPE_RGB24 ? 24 :
+ subtype == MEDIASUBTYPE_RGB565 ? 16 : 0;
+
+ if (bihOut.biCompression == '2YUY') {
+ // TODO
+ // BitBltFromRGBToYUY2();
+ } else if (bihOut.biCompression == BI_RGB || bihOut.biCompression == BI_BITFIELDS) {
+ if (!BitBltFromRGBToRGB(w, h, pOut, pitchOut, bihOut.biBitCount, ppIn[0], pitchIn, sbpp)) {
+ for (int y = 0; y < h; y++, pOut += pitchOut) {
+ memset(pOut, 0, pitchOut);
+ }
+ }
+ }
+ } else {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ return S_OK;
}
HRESULT CBaseVideoFilter::CheckInputType(const CMediaType* mtIn)
{
- BITMAPINFOHEADER bih;
- ExtractBIH(mtIn, &bih);
-
- return mtIn->majortype == MEDIATYPE_Video
- && (mtIn->subtype == MEDIASUBTYPE_YV12
- || mtIn->subtype == MEDIASUBTYPE_I420
- || mtIn->subtype == MEDIASUBTYPE_IYUV
- || mtIn->subtype == MEDIASUBTYPE_YUY2
- || mtIn->subtype == MEDIASUBTYPE_ARGB32
- || mtIn->subtype == MEDIASUBTYPE_RGB32
- || mtIn->subtype == MEDIASUBTYPE_RGB24
- || mtIn->subtype == MEDIASUBTYPE_RGB565)
- && (mtIn->formattype == FORMAT_VideoInfo
- || mtIn->formattype == FORMAT_VideoInfo2)
- && bih.biHeight > 0
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ BITMAPINFOHEADER bih;
+ ExtractBIH(mtIn, &bih);
+
+ return mtIn->majortype == MEDIATYPE_Video
+ && (mtIn->subtype == MEDIASUBTYPE_YV12
+ || mtIn->subtype == MEDIASUBTYPE_I420
+ || mtIn->subtype == MEDIASUBTYPE_IYUV
+ || mtIn->subtype == MEDIASUBTYPE_YUY2
+ || mtIn->subtype == MEDIASUBTYPE_ARGB32
+ || mtIn->subtype == MEDIASUBTYPE_RGB32
+ || mtIn->subtype == MEDIASUBTYPE_RGB24
+ || mtIn->subtype == MEDIASUBTYPE_RGB565)
+ && (mtIn->formattype == FORMAT_VideoInfo
+ || mtIn->formattype == FORMAT_VideoInfo2)
+ && bih.biHeight > 0
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CBaseVideoFilter::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut)
{
- if (FAILED(CheckInputType(mtIn)) || mtOut->majortype != MEDIATYPE_Video) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- if (mtIn->majortype == MEDIATYPE_Video
- && (mtIn->subtype == MEDIASUBTYPE_YV12
- || mtIn->subtype == MEDIASUBTYPE_I420
- || mtIn->subtype == MEDIASUBTYPE_IYUV)) {
- if (mtOut->subtype != MEDIASUBTYPE_YV12
- && mtOut->subtype != MEDIASUBTYPE_I420
- && mtOut->subtype != MEDIASUBTYPE_IYUV
- && mtOut->subtype != MEDIASUBTYPE_YUY2
- && mtOut->subtype != MEDIASUBTYPE_ARGB32
- && mtOut->subtype != MEDIASUBTYPE_RGB32
- && mtOut->subtype != MEDIASUBTYPE_RGB24
- && mtOut->subtype != MEDIASUBTYPE_RGB565) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- } else if (mtIn->majortype == MEDIATYPE_Video
- && (mtIn->subtype == MEDIASUBTYPE_YUY2)) {
- if (mtOut->subtype != MEDIASUBTYPE_YUY2
- && mtOut->subtype != MEDIASUBTYPE_ARGB32
- && mtOut->subtype != MEDIASUBTYPE_RGB32
- && mtOut->subtype != MEDIASUBTYPE_RGB24
- && mtOut->subtype != MEDIASUBTYPE_RGB565) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- } else if (mtIn->majortype == MEDIATYPE_Video
- && (mtIn->subtype == MEDIASUBTYPE_ARGB32
- || mtIn->subtype == MEDIASUBTYPE_RGB32
- || mtIn->subtype == MEDIASUBTYPE_RGB24
- || mtIn->subtype == MEDIASUBTYPE_RGB565)) {
- if (mtOut->subtype != MEDIASUBTYPE_ARGB32
- && mtOut->subtype != MEDIASUBTYPE_RGB32
- && mtOut->subtype != MEDIASUBTYPE_RGB24
- && mtOut->subtype != MEDIASUBTYPE_RGB565) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- }
-
- return S_OK;
+ if (FAILED(CheckInputType(mtIn)) || mtOut->majortype != MEDIATYPE_Video) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ if (mtIn->majortype == MEDIATYPE_Video
+ && (mtIn->subtype == MEDIASUBTYPE_YV12
+ || mtIn->subtype == MEDIASUBTYPE_I420
+ || mtIn->subtype == MEDIASUBTYPE_IYUV)) {
+ if (mtOut->subtype != MEDIASUBTYPE_YV12
+ && mtOut->subtype != MEDIASUBTYPE_I420
+ && mtOut->subtype != MEDIASUBTYPE_IYUV
+ && mtOut->subtype != MEDIASUBTYPE_YUY2
+ && mtOut->subtype != MEDIASUBTYPE_ARGB32
+ && mtOut->subtype != MEDIASUBTYPE_RGB32
+ && mtOut->subtype != MEDIASUBTYPE_RGB24
+ && mtOut->subtype != MEDIASUBTYPE_RGB565) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ } else if (mtIn->majortype == MEDIATYPE_Video
+ && (mtIn->subtype == MEDIASUBTYPE_YUY2)) {
+ if (mtOut->subtype != MEDIASUBTYPE_YUY2
+ && mtOut->subtype != MEDIASUBTYPE_ARGB32
+ && mtOut->subtype != MEDIASUBTYPE_RGB32
+ && mtOut->subtype != MEDIASUBTYPE_RGB24
+ && mtOut->subtype != MEDIASUBTYPE_RGB565) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ } else if (mtIn->majortype == MEDIATYPE_Video
+ && (mtIn->subtype == MEDIASUBTYPE_ARGB32
+ || mtIn->subtype == MEDIASUBTYPE_RGB32
+ || mtIn->subtype == MEDIASUBTYPE_RGB24
+ || mtIn->subtype == MEDIASUBTYPE_RGB565)) {
+ if (mtOut->subtype != MEDIASUBTYPE_ARGB32
+ && mtOut->subtype != MEDIASUBTYPE_RGB32
+ && mtOut->subtype != MEDIASUBTYPE_RGB24
+ && mtOut->subtype != MEDIASUBTYPE_RGB565) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ }
+
+ return S_OK;
}
HRESULT CBaseVideoFilter::CheckOutputType(const CMediaType& mtOut)
{
- int wout = 0, hout = 0, arxout = 0, aryout = 0;
- return ExtractDim(&mtOut, wout, hout, arxout, aryout)
- && m_h == abs((int)hout)
- && mtOut.subtype != MEDIASUBTYPE_ARGB32
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ int wout = 0, hout = 0, arxout = 0, aryout = 0;
+ return ExtractDim(&mtOut, wout, hout, arxout, aryout)
+ && m_h == abs((int)hout)
+ && mtOut.subtype != MEDIASUBTYPE_ARGB32
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CBaseVideoFilter::DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties)
{
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
-
- BITMAPINFOHEADER bih;
- ExtractBIH(&m_pOutput->CurrentMediaType(), &bih);
-
- long cBuffers = m_pOutput->CurrentMediaType().formattype == FORMAT_VideoInfo ? 1 : m_cBuffers;
- UNREFERENCED_PARAMETER(cBuffers);
-
- pProperties->cBuffers = m_cBuffers;
- pProperties->cbBuffer = bih.biSizeImage;
- pProperties->cbAlign = 1;
- pProperties->cbPrefix = 0;
-
- HRESULT hr;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
- return hr;
- }
-
- return pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
- ? E_FAIL
- : NOERROR;
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
+
+ BITMAPINFOHEADER bih;
+ ExtractBIH(&m_pOutput->CurrentMediaType(), &bih);
+
+ long cBuffers = m_pOutput->CurrentMediaType().formattype == FORMAT_VideoInfo ? 1 : m_cBuffers;
+ UNREFERENCED_PARAMETER(cBuffers);
+
+ pProperties->cBuffers = m_cBuffers;
+ pProperties->cbBuffer = bih.biSizeImage;
+ pProperties->cbAlign = 1;
+ pProperties->cbPrefix = 0;
+
+ HRESULT hr;
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
+
+ return pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
+ ? E_FAIL
+ : NOERROR;
}
VIDEO_OUTPUT_FORMATS DefaultFormats[] = {
- {&MEDIASUBTYPE_YV12, 3, 12, '21VY'},
- {&MEDIASUBTYPE_I420, 3, 12, '024I'},
- {&MEDIASUBTYPE_IYUV, 3, 12, 'VUYI'},
- {&MEDIASUBTYPE_YUY2, 1, 16, '2YUY'},
- {&MEDIASUBTYPE_ARGB32, 1, 32, BI_RGB},
- {&MEDIASUBTYPE_RGB32, 1, 32, BI_RGB},
- {&MEDIASUBTYPE_RGB24, 1, 24, BI_RGB},
- {&MEDIASUBTYPE_RGB565, 1, 16, BI_RGB},
- {&MEDIASUBTYPE_RGB555, 1, 16, BI_RGB},
- {&MEDIASUBTYPE_ARGB32, 1, 32, BI_BITFIELDS},
- {&MEDIASUBTYPE_RGB32, 1, 32, BI_BITFIELDS},
- {&MEDIASUBTYPE_RGB24, 1, 24, BI_BITFIELDS},
- {&MEDIASUBTYPE_RGB565, 1, 16, BI_BITFIELDS},
- {&MEDIASUBTYPE_RGB555, 1, 16, BI_BITFIELDS},
+ {&MEDIASUBTYPE_YV12, 3, 12, '21VY'},
+ {&MEDIASUBTYPE_I420, 3, 12, '024I'},
+ {&MEDIASUBTYPE_IYUV, 3, 12, 'VUYI'},
+ {&MEDIASUBTYPE_YUY2, 1, 16, '2YUY'},
+ {&MEDIASUBTYPE_ARGB32, 1, 32, BI_RGB},
+ {&MEDIASUBTYPE_RGB32, 1, 32, BI_RGB},
+ {&MEDIASUBTYPE_RGB24, 1, 24, BI_RGB},
+ {&MEDIASUBTYPE_RGB565, 1, 16, BI_RGB},
+ {&MEDIASUBTYPE_RGB555, 1, 16, BI_RGB},
+ {&MEDIASUBTYPE_ARGB32, 1, 32, BI_BITFIELDS},
+ {&MEDIASUBTYPE_RGB32, 1, 32, BI_BITFIELDS},
+ {&MEDIASUBTYPE_RGB24, 1, 24, BI_BITFIELDS},
+ {&MEDIASUBTYPE_RGB565, 1, 16, BI_BITFIELDS},
+ {&MEDIASUBTYPE_RGB555, 1, 16, BI_BITFIELDS},
};
-void CBaseVideoFilter::GetOutputFormats (int& nNumber, VIDEO_OUTPUT_FORMATS** ppFormats)
+void CBaseVideoFilter::GetOutputFormats(int& nNumber, VIDEO_OUTPUT_FORMATS** ppFormats)
{
- nNumber = _countof(DefaultFormats);
- *ppFormats = DefaultFormats;
+ nNumber = _countof(DefaultFormats);
+ *ppFormats = DefaultFormats;
}
HRESULT CBaseVideoFilter::GetMediaType(int iPosition, CMediaType* pmt)
{
- VIDEO_OUTPUT_FORMATS* fmts;
- int nFormatCount;
-
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
-
-
- // this will make sure we won't connect to the old renderer in dvd mode
- // that renderer can't switch the format dynamically
-
- bool fFoundDVDNavigator = false;
- CComPtr<IBaseFilter> pBF = this;
- CComPtr<IPin> pPin = m_pInput;
- for (; !fFoundDVDNavigator && (pBF = GetUpStreamFilter(pBF, pPin)); pPin = GetFirstPin(pBF)) {
- fFoundDVDNavigator = !!(GetCLSID(pBF) == CLSID_DVDNavigator);
- }
-
- if (fFoundDVDNavigator || m_pInput->CurrentMediaType().formattype == FORMAT_VideoInfo2) {
- iPosition = iPosition*2;
- }
-
- //
- GetOutputFormats (nFormatCount, &fmts);
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition >= 2*nFormatCount) {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- pmt->majortype = MEDIATYPE_Video;
- pmt->subtype = *fmts[iPosition/2].subtype;
-
- int w = m_win, h = m_hin, arx = m_arxin, ary = m_aryin;
- int RealWidth = -1;
- int RealHeight = -1;
- int vsfilter = 0;
- GetOutputSize(w, h, arx, ary, RealWidth, RealHeight, vsfilter);
-
- BITMAPINFOHEADER bihOut;
- memset(&bihOut, 0, sizeof(bihOut));
- bihOut.biSize = sizeof(bihOut);
- bihOut.biWidth = w;
- bihOut.biHeight = h;
- bihOut.biPlanes = fmts[iPosition/2].biPlanes;
- bihOut.biBitCount = fmts[iPosition/2].biBitCount;
- bihOut.biCompression = fmts[iPosition/2].biCompression;
- bihOut.biSizeImage = w*h*bihOut.biBitCount>>3;
-
- if (iPosition&1) {
- pmt->formattype = FORMAT_VideoInfo;
- VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
- memset(vih, 0, sizeof(VIDEOINFOHEADER));
- vih->bmiHeader = bihOut;
- vih->bmiHeader.biXPelsPerMeter = vih->bmiHeader.biWidth * ary;
- vih->bmiHeader.biYPelsPerMeter = vih->bmiHeader.biHeight * arx;
- } else {
- pmt->formattype = FORMAT_VideoInfo2;
- VIDEOINFOHEADER2* vih = (VIDEOINFOHEADER2*)pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER2));
- memset(vih, 0, sizeof(VIDEOINFOHEADER2));
- vih->bmiHeader = bihOut;
- vih->dwPictAspectRatioX = arx;
- vih->dwPictAspectRatioY = ary;
- if (IsVideoInterlaced()) {
- vih->dwInterlaceFlags = AMINTERLACE_IsInterlaced | AMINTERLACE_DisplayModeBobOrWeave;
- }
- }
-
- CMediaType& mt = m_pInput->CurrentMediaType();
-
- // these fields have the same field offset in all four structs
- ((VIDEOINFOHEADER*)pmt->Format())->AvgTimePerFrame = ((VIDEOINFOHEADER*)mt.Format())->AvgTimePerFrame;
- ((VIDEOINFOHEADER*)pmt->Format())->dwBitRate = ((VIDEOINFOHEADER*)mt.Format())->dwBitRate;
- ((VIDEOINFOHEADER*)pmt->Format())->dwBitErrorRate = ((VIDEOINFOHEADER*)mt.Format())->dwBitErrorRate;
-
- CorrectMediaType(pmt);
-
- if (!vsfilter) {
- // copy source and target rectangles from input pin
- CMediaType& pmtInput = m_pInput->CurrentMediaType();
- VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)pmt->Format();
- VIDEOINFOHEADER* vihInput = (VIDEOINFOHEADER*)pmtInput.Format();
-
- ASSERT(vih);
- if (vihInput && (vihInput->rcSource.right != 0) && (vihInput->rcSource.bottom != 0)) {
- vih->rcSource = vihInput->rcSource;
- vih->rcTarget = vihInput->rcTarget;
- } else {
- vih->rcSource.right = vih->rcTarget.right = m_win;
- vih->rcSource.bottom = vih->rcTarget.bottom = m_hin;
- }
-
- if (RealWidth > 0 && vih->rcSource.right > RealWidth) {
- vih->rcSource.right = RealWidth;
- }
- if (RealHeight > 0 && vih->rcSource.bottom > RealHeight) {
- vih->rcSource.bottom = RealHeight;
- }
- }
-
- return S_OK;
+ VIDEO_OUTPUT_FORMATS* fmts;
+ int nFormatCount;
+
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
+
+
+ // this will make sure we won't connect to the old renderer in dvd mode
+ // that renderer can't switch the format dynamically
+
+ bool fFoundDVDNavigator = false;
+ CComPtr<IBaseFilter> pBF = this;
+ CComPtr<IPin> pPin = m_pInput;
+ for (; !fFoundDVDNavigator && (pBF = GetUpStreamFilter(pBF, pPin)); pPin = GetFirstPin(pBF)) {
+ fFoundDVDNavigator = !!(GetCLSID(pBF) == CLSID_DVDNavigator);
+ }
+
+ if (fFoundDVDNavigator || m_pInput->CurrentMediaType().formattype == FORMAT_VideoInfo2) {
+ iPosition = iPosition * 2;
+ }
+
+ //
+ GetOutputFormats(nFormatCount, &fmts);
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition >= 2 * nFormatCount) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ pmt->majortype = MEDIATYPE_Video;
+ pmt->subtype = *fmts[iPosition / 2].subtype;
+
+ int w = m_win, h = m_hin, arx = m_arxin, ary = m_aryin;
+ int RealWidth = -1;
+ int RealHeight = -1;
+ int vsfilter = 0;
+ GetOutputSize(w, h, arx, ary, RealWidth, RealHeight, vsfilter);
+
+ BITMAPINFOHEADER bihOut;
+ memset(&bihOut, 0, sizeof(bihOut));
+ bihOut.biSize = sizeof(bihOut);
+ bihOut.biWidth = w;
+ bihOut.biHeight = h;
+ bihOut.biPlanes = fmts[iPosition / 2].biPlanes;
+ bihOut.biBitCount = fmts[iPosition / 2].biBitCount;
+ bihOut.biCompression = fmts[iPosition / 2].biCompression;
+ bihOut.biSizeImage = w * h * bihOut.biBitCount >> 3;
+
+ if (iPosition & 1) {
+ pmt->formattype = FORMAT_VideoInfo;
+ VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
+ memset(vih, 0, sizeof(VIDEOINFOHEADER));
+ vih->bmiHeader = bihOut;
+ vih->bmiHeader.biXPelsPerMeter = vih->bmiHeader.biWidth * ary;
+ vih->bmiHeader.biYPelsPerMeter = vih->bmiHeader.biHeight * arx;
+ } else {
+ pmt->formattype = FORMAT_VideoInfo2;
+ VIDEOINFOHEADER2* vih = (VIDEOINFOHEADER2*)pmt->AllocFormatBuffer(sizeof(VIDEOINFOHEADER2));
+ memset(vih, 0, sizeof(VIDEOINFOHEADER2));
+ vih->bmiHeader = bihOut;
+ vih->dwPictAspectRatioX = arx;
+ vih->dwPictAspectRatioY = ary;
+ if (IsVideoInterlaced()) {
+ vih->dwInterlaceFlags = AMINTERLACE_IsInterlaced | AMINTERLACE_DisplayModeBobOrWeave;
+ }
+ }
+
+ CMediaType& mt = m_pInput->CurrentMediaType();
+
+ // these fields have the same field offset in all four structs
+ ((VIDEOINFOHEADER*)pmt->Format())->AvgTimePerFrame = ((VIDEOINFOHEADER*)mt.Format())->AvgTimePerFrame;
+ ((VIDEOINFOHEADER*)pmt->Format())->dwBitRate = ((VIDEOINFOHEADER*)mt.Format())->dwBitRate;
+ ((VIDEOINFOHEADER*)pmt->Format())->dwBitErrorRate = ((VIDEOINFOHEADER*)mt.Format())->dwBitErrorRate;
+
+ CorrectMediaType(pmt);
+
+ if (!vsfilter) {
+ // copy source and target rectangles from input pin
+ CMediaType& pmtInput = m_pInput->CurrentMediaType();
+ VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)pmt->Format();
+ VIDEOINFOHEADER* vihInput = (VIDEOINFOHEADER*)pmtInput.Format();
+
+ ASSERT(vih);
+ if (vihInput && (vihInput->rcSource.right != 0) && (vihInput->rcSource.bottom != 0)) {
+ vih->rcSource = vihInput->rcSource;
+ vih->rcTarget = vihInput->rcTarget;
+ } else {
+ vih->rcSource.right = vih->rcTarget.right = m_win;
+ vih->rcSource.bottom = vih->rcTarget.bottom = m_hin;
+ }
+
+ if (RealWidth > 0 && vih->rcSource.right > RealWidth) {
+ vih->rcSource.right = RealWidth;
+ }
+ if (RealHeight > 0 && vih->rcSource.bottom > RealHeight) {
+ vih->rcSource.bottom = RealHeight;
+ }
+ }
+
+ return S_OK;
}
HRESULT CBaseVideoFilter::SetMediaType(PIN_DIRECTION dir, const CMediaType* pmt)
{
- if (dir == PINDIR_INPUT) {
- m_w = m_h = m_arx = m_ary = 0;
- ExtractDim(pmt, m_w, m_h, m_arx, m_ary);
- m_win = m_w;
- m_hin = m_h;
- m_arxin = m_arx;
- m_aryin = m_ary;
- int RealWidth = -1;
- int RealHeight = -1;
- int vsfilter = 0;
- GetOutputSize(m_w, m_h, m_arx, m_ary, RealWidth, RealHeight, vsfilter);
-
- DWORD a = m_arx, b = m_ary;
- while (a) {
- int tmp = a;
- a = b % tmp;
- b = tmp;
- }
- if (b) {
- m_arx /= b, m_ary /= b;
- }
- } else if (dir == PINDIR_OUTPUT) {
- int wout = 0, hout = 0, arxout = 0, aryout = 0;
- ExtractDim(pmt, wout, hout, arxout, aryout);
- if (m_w == wout && m_h == hout && m_arx == arxout && m_ary == aryout) {
- m_wout = wout;
- m_hout = hout;
- m_arxout = arxout;
- m_aryout = aryout;
- }
- }
-
- return __super::SetMediaType(dir, pmt);
+ if (dir == PINDIR_INPUT) {
+ m_w = m_h = m_arx = m_ary = 0;
+ ExtractDim(pmt, m_w, m_h, m_arx, m_ary);
+ m_win = m_w;
+ m_hin = m_h;
+ m_arxin = m_arx;
+ m_aryin = m_ary;
+ int RealWidth = -1;
+ int RealHeight = -1;
+ int vsfilter = 0;
+ GetOutputSize(m_w, m_h, m_arx, m_ary, RealWidth, RealHeight, vsfilter);
+
+ DWORD a = m_arx, b = m_ary;
+ while (a) {
+ int tmp = a;
+ a = b % tmp;
+ b = tmp;
+ }
+ if (b) {
+ m_arx /= b, m_ary /= b;
+ }
+ } else if (dir == PINDIR_OUTPUT) {
+ int wout = 0, hout = 0, arxout = 0, aryout = 0;
+ ExtractDim(pmt, wout, hout, arxout, aryout);
+ if (m_w == wout && m_h == hout && m_arx == arxout && m_ary == aryout) {
+ m_wout = wout;
+ m_hout = hout;
+ m_arxout = arxout;
+ m_aryout = aryout;
+ }
+ }
+
+ return __super::SetMediaType(dir, pmt);
}
//
@@ -642,32 +642,32 @@ HRESULT CBaseVideoFilter::SetMediaType(PIN_DIRECTION dir, const CMediaType* pmt)
//
CBaseVideoInputAllocator::CBaseVideoInputAllocator(HRESULT* phr)
- : CMemAllocator(NAME("CBaseVideoInputAllocator"), NULL, phr)
+ : CMemAllocator(NAME("CBaseVideoInputAllocator"), NULL, phr)
{
- if (phr) {
- *phr = S_OK;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
}
void CBaseVideoInputAllocator::SetMediaType(const CMediaType& mt)
{
- m_mt = mt;
+ m_mt = mt;
}
STDMETHODIMP CBaseVideoInputAllocator::GetBuffer(IMediaSample** ppBuffer, REFERENCE_TIME* pStartTime, REFERENCE_TIME* pEndTime, DWORD dwFlags)
{
- if (!m_bCommitted) {
- return VFW_E_NOT_COMMITTED;
- }
+ if (!m_bCommitted) {
+ return VFW_E_NOT_COMMITTED;
+ }
- HRESULT hr = __super::GetBuffer(ppBuffer, pStartTime, pEndTime, dwFlags);
+ HRESULT hr = __super::GetBuffer(ppBuffer, pStartTime, pEndTime, dwFlags);
- if (SUCCEEDED(hr) && m_mt.majortype != GUID_NULL) {
- (*ppBuffer)->SetMediaType(&m_mt);
- m_mt.majortype = GUID_NULL;
- }
+ if (SUCCEEDED(hr) && m_mt.majortype != GUID_NULL) {
+ (*ppBuffer)->SetMediaType(&m_mt);
+ m_mt.majortype = GUID_NULL;
+ }
- return hr;
+ return hr;
}
//
@@ -675,72 +675,72 @@ STDMETHODIMP CBaseVideoInputAllocator::GetBuffer(IMediaSample** ppBuffer, REFERE
//
CBaseVideoInputPin::CBaseVideoInputPin(TCHAR* pObjectName, CBaseVideoFilter* pFilter, HRESULT* phr, LPCWSTR pName)
- : CTransformInputPin(pObjectName, pFilter, phr, pName)
- , m_pAllocator(NULL)
+ : CTransformInputPin(pObjectName, pFilter, phr, pName)
+ , m_pAllocator(NULL)
{
}
CBaseVideoInputPin::~CBaseVideoInputPin()
{
- delete m_pAllocator;
+ delete m_pAllocator;
}
STDMETHODIMP CBaseVideoInputPin::GetAllocator(IMemAllocator** ppAllocator)
{
- CheckPointer(ppAllocator, E_POINTER);
+ CheckPointer(ppAllocator, E_POINTER);
- if (m_pAllocator == NULL) {
- HRESULT hr = S_OK;
- m_pAllocator = DNew CBaseVideoInputAllocator(&hr);
- m_pAllocator->AddRef();
- }
+ if (m_pAllocator == NULL) {
+ HRESULT hr = S_OK;
+ m_pAllocator = DNew CBaseVideoInputAllocator(&hr);
+ m_pAllocator->AddRef();
+ }
- (*ppAllocator = m_pAllocator)->AddRef();
+ (*ppAllocator = m_pAllocator)->AddRef();
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CBaseVideoInputPin::ReceiveConnection(IPin* pConnector, const AM_MEDIA_TYPE* pmt)
{
- CAutoLock cObjectLock(m_pLock);
+ CAutoLock cObjectLock(m_pLock);
- if (m_Connected) {
- CMediaType mt(*pmt);
+ if (m_Connected) {
+ CMediaType mt(*pmt);
- if (FAILED(CheckMediaType(&mt))) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
+ if (FAILED(CheckMediaType(&mt))) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
- ALLOCATOR_PROPERTIES props, actual;
+ ALLOCATOR_PROPERTIES props, actual;
- CComPtr<IMemAllocator> pMemAllocator;
- if (FAILED(GetAllocator(&pMemAllocator))
- || FAILED(pMemAllocator->Decommit())
- || FAILED(pMemAllocator->GetProperties(&props))) {
- return E_FAIL;
- }
+ CComPtr<IMemAllocator> pMemAllocator;
+ if (FAILED(GetAllocator(&pMemAllocator))
+ || FAILED(pMemAllocator->Decommit())
+ || FAILED(pMemAllocator->GetProperties(&props))) {
+ return E_FAIL;
+ }
- BITMAPINFOHEADER bih;
- if (ExtractBIH(pmt, &bih) && bih.biSizeImage) {
- props.cbBuffer = bih.biSizeImage;
- }
+ BITMAPINFOHEADER bih;
+ if (ExtractBIH(pmt, &bih) && bih.biSizeImage) {
+ props.cbBuffer = bih.biSizeImage;
+ }
- if (FAILED(pMemAllocator->SetProperties(&props, &actual))
- || FAILED(pMemAllocator->Commit())
- || props.cbBuffer != actual.cbBuffer) {
- return E_FAIL;
- }
+ if (FAILED(pMemAllocator->SetProperties(&props, &actual))
+ || FAILED(pMemAllocator->Commit())
+ || props.cbBuffer != actual.cbBuffer) {
+ return E_FAIL;
+ }
- if (m_pAllocator) {
- m_pAllocator->SetMediaType(mt);
- }
+ if (m_pAllocator) {
+ m_pAllocator->SetMediaType(mt);
+ }
- return SetMediaType(&mt) == S_OK
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
- }
+ return SetMediaType(&mt) == S_OK
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
+ }
- return __super::ReceiveConnection(pConnector, pmt);
+ return __super::ReceiveConnection(pConnector, pmt);
}
//
@@ -748,18 +748,18 @@ STDMETHODIMP CBaseVideoInputPin::ReceiveConnection(IPin* pConnector, const AM_ME
//
CBaseVideoOutputPin::CBaseVideoOutputPin(TCHAR* pObjectName, CBaseVideoFilter* pFilter, HRESULT* phr, LPCWSTR pName)
- : CTransformOutputPin(pObjectName, pFilter, phr, pName)
+ : CTransformOutputPin(pObjectName, pFilter, phr, pName)
{
}
HRESULT CBaseVideoOutputPin::CheckMediaType(const CMediaType* mtOut)
{
- if (IsConnected()) {
- HRESULT hr = (static_cast<CBaseVideoFilter*>(m_pFilter))->CheckOutputType(*mtOut);
- if (FAILED(hr)) {
- return hr;
- }
- }
-
- return __super::CheckMediaType(mtOut);
+ if (IsConnected()) {
+ HRESULT hr = (static_cast<CBaseVideoFilter*>(m_pFilter))->CheckOutputType(*mtOut);
+ if (FAILED(hr)) {
+ return hr;
+ }
+ }
+
+ return __super::CheckMediaType(mtOut);
}
diff --git a/src/filters/transform/BaseVideoFilter/BaseVideoFilter.h b/src/filters/transform/BaseVideoFilter/BaseVideoFilter.h
index 9613bbac7..079ee8e8a 100644
--- a/src/filters/transform/BaseVideoFilter/BaseVideoFilter.h
+++ b/src/filters/transform/BaseVideoFilter/BaseVideoFilter.h
@@ -25,81 +25,81 @@
typedef struct {
- const GUID* subtype;
- WORD biPlanes;
- WORD biBitCount;
- DWORD biCompression;
+ const GUID* subtype;
+ WORD biPlanes;
+ WORD biBitCount;
+ DWORD biCompression;
} VIDEO_OUTPUT_FORMATS;
class CBaseVideoFilter : public CTransformFilter
{
private:
- HRESULT Receive(IMediaSample* pIn);
+ HRESULT Receive(IMediaSample* pIn);
- // these are private for a reason, don't bother them
- int m_win, m_hin, m_arxin, m_aryin;
- int m_wout, m_hout, m_arxout, m_aryout;
+ // these are private for a reason, don't bother them
+ int m_win, m_hin, m_arxin, m_aryin;
+ int m_wout, m_hout, m_arxout, m_aryout;
- long m_cBuffers;
+ long m_cBuffers;
protected:
- CCritSec m_csReceive;
+ CCritSec m_csReceive;
- int m_w, m_h, m_arx, m_ary;
+ int m_w, m_h, m_arx, m_ary;
- HRESULT GetDeliveryBuffer(int w, int h, IMediaSample** ppOut);
- HRESULT CopyBuffer(BYTE* pOut, BYTE* pIn, int w, int h, int pitchIn, const GUID& subtype, bool fInterlaced = false);
- HRESULT CopyBuffer(BYTE* pOut, BYTE** ppIn, int w, int h, int pitchIn, const GUID& subtype, bool fInterlaced = false);
+ HRESULT GetDeliveryBuffer(int w, int h, IMediaSample** ppOut);
+ HRESULT CopyBuffer(BYTE* pOut, BYTE* pIn, int w, int h, int pitchIn, const GUID& subtype, bool fInterlaced = false);
+ HRESULT CopyBuffer(BYTE* pOut, BYTE** ppIn, int w, int h, int pitchIn, const GUID& subtype, bool fInterlaced = false);
- virtual void GetOutputSize(int& w, int& h, int& arx, int& ary, int &RealWidth, int &RealHeight, int& vsfilter) {}
- virtual HRESULT Transform(IMediaSample* pIn) = 0;
- virtual bool IsVideoInterlaced() {return false;}
- virtual void GetOutputFormats (int& nNumber, VIDEO_OUTPUT_FORMATS** ppFormats);
+ virtual void GetOutputSize(int& w, int& h, int& arx, int& ary, int& RealWidth, int& RealHeight, int& vsfilter) {}
+ virtual HRESULT Transform(IMediaSample* pIn) = 0;
+ virtual bool IsVideoInterlaced() {return false;}
+ virtual void GetOutputFormats(int& nNumber, VIDEO_OUTPUT_FORMATS** ppFormats);
public:
- CBaseVideoFilter(TCHAR* pName, LPUNKNOWN lpunk, HRESULT* phr, REFCLSID clsid, long cBuffers = 1);
- virtual ~CBaseVideoFilter();
+ CBaseVideoFilter(TCHAR* pName, LPUNKNOWN lpunk, HRESULT* phr, REFCLSID clsid, long cBuffers = 1);
+ virtual ~CBaseVideoFilter();
- HRESULT ReconnectOutput(int w, int h, bool bSendSample = true, int realWidth = -1, int realHeight = -1);
- int GetPinCount();
- CBasePin* GetPin(int n);
+ HRESULT ReconnectOutput(int w, int h, bool bSendSample = true, int realWidth = -1, int realHeight = -1);
+ int GetPinCount();
+ CBasePin* GetPin(int n);
- HRESULT CheckInputType(const CMediaType* mtIn);
- HRESULT CheckOutputType(const CMediaType& mtOut);
- HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
- HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
- HRESULT SetMediaType(PIN_DIRECTION dir, const CMediaType* pmt);
+ HRESULT CheckInputType(const CMediaType* mtIn);
+ HRESULT CheckOutputType(const CMediaType& mtOut);
+ HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
+ HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
+ HRESULT SetMediaType(PIN_DIRECTION dir, const CMediaType* pmt);
- void SetAspect(CSize aspect);
+ void SetAspect(CSize aspect);
};
class CBaseVideoInputAllocator : public CMemAllocator
{
- CMediaType m_mt;
+ CMediaType m_mt;
public:
- CBaseVideoInputAllocator(HRESULT* phr);
- void SetMediaType(const CMediaType& mt);
- STDMETHODIMP GetBuffer(IMediaSample** ppBuffer, REFERENCE_TIME* pStartTime, REFERENCE_TIME* pEndTime, DWORD dwFlags);
+ CBaseVideoInputAllocator(HRESULT* phr);
+ void SetMediaType(const CMediaType& mt);
+ STDMETHODIMP GetBuffer(IMediaSample** ppBuffer, REFERENCE_TIME* pStartTime, REFERENCE_TIME* pEndTime, DWORD dwFlags);
};
class CBaseVideoInputPin : public CTransformInputPin
{
- CBaseVideoInputAllocator* m_pAllocator;
+ CBaseVideoInputAllocator* m_pAllocator;
public:
- CBaseVideoInputPin(TCHAR* pObjectName, CBaseVideoFilter* pFilter, HRESULT* phr, LPCWSTR pName);
- ~CBaseVideoInputPin();
+ CBaseVideoInputPin(TCHAR* pObjectName, CBaseVideoFilter* pFilter, HRESULT* phr, LPCWSTR pName);
+ ~CBaseVideoInputPin();
- STDMETHODIMP GetAllocator(IMemAllocator** ppAllocator);
- STDMETHODIMP ReceiveConnection(IPin* pConnector, const AM_MEDIA_TYPE* pmt);
+ STDMETHODIMP GetAllocator(IMemAllocator** ppAllocator);
+ STDMETHODIMP ReceiveConnection(IPin* pConnector, const AM_MEDIA_TYPE* pmt);
};
class CBaseVideoOutputPin : public CTransformOutputPin
{
public:
- CBaseVideoOutputPin(TCHAR* pObjectName, CBaseVideoFilter* pFilter, HRESULT* phr, LPCWSTR pName);
+ CBaseVideoOutputPin(TCHAR* pObjectName, CBaseVideoFilter* pFilter, HRESULT* phr, LPCWSTR pName);
- HRESULT CheckMediaType(const CMediaType* mtOut);
+ HRESULT CheckMediaType(const CMediaType* mtOut);
};
diff --git a/src/filters/transform/BufferFilter/BufferFilter.cpp b/src/filters/transform/BufferFilter/BufferFilter.cpp
index f22aef795..77ff60f7a 100644
--- a/src/filters/transform/BufferFilter/BufferFilter.cpp
+++ b/src/filters/transform/BufferFilter/BufferFilter.cpp
@@ -28,36 +28,36 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_NULL, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_NULL, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_NULL, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_NULL, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CBufferFilter), BufferFilterName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CBufferFilter), BufferFilterName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CBufferFilter>, NULL, &sudFilter[0]}
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CBufferFilter>, NULL, &sudFilter[0]}
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -71,33 +71,33 @@ CFilterApp theApp;
//
CBufferFilter::CBufferFilter(LPUNKNOWN lpunk, HRESULT* phr)
- : CTransformFilter(NAME("CBufferFilter"), lpunk, __uuidof(this))
- , m_nSamplesToBuffer(2)
+ : CTransformFilter(NAME("CBufferFilter"), lpunk, __uuidof(this))
+ , m_nSamplesToBuffer(2)
{
- HRESULT hr = S_OK;
-
- do {
- m_pInput = DNew CTransformInputPin(NAME("Transform input pin"), this, &hr, L"In");
- if (!m_pInput) {
- hr = E_OUTOFMEMORY;
- }
- if (FAILED(hr)) {
- break;
- }
-
- m_pOutput = DNew CBufferFilterOutputPin(this, &hr);
- if (!m_pOutput) {
- hr = E_OUTOFMEMORY;
- }
- if (FAILED(hr)) {
- delete m_pInput, m_pInput = NULL;
- break;
- }
- } while (false);
-
- if (phr) {
- *phr = hr;
- }
+ HRESULT hr = S_OK;
+
+ do {
+ m_pInput = DNew CTransformInputPin(NAME("Transform input pin"), this, &hr, L"In");
+ if (!m_pInput) {
+ hr = E_OUTOFMEMORY;
+ }
+ if (FAILED(hr)) {
+ break;
+ }
+
+ m_pOutput = DNew CBufferFilterOutputPin(this, &hr);
+ if (!m_pOutput) {
+ hr = E_OUTOFMEMORY;
+ }
+ if (FAILED(hr)) {
+ delete m_pInput, m_pInput = NULL;
+ break;
+ }
+ } while (false);
+
+ if (phr) {
+ *phr = hr;
+ }
}
CBufferFilter::~CBufferFilter()
@@ -106,203 +106,203 @@ CBufferFilter::~CBufferFilter()
STDMETHODIMP CBufferFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- return
- QI(IBufferFilter)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IBufferFilter)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
// IBufferFilter
STDMETHODIMP CBufferFilter::SetBuffers(int nBuffers)
{
- if (!m_pOutput) {
- return E_FAIL;
- }
+ if (!m_pOutput) {
+ return E_FAIL;
+ }
- if (m_pOutput->IsConnected()) { // TODO: allow "on-the-fly" changes
- return VFW_E_ALREADY_CONNECTED;
- }
+ if (m_pOutput->IsConnected()) { // TODO: allow "on-the-fly" changes
+ return VFW_E_ALREADY_CONNECTED;
+ }
- m_nSamplesToBuffer = nBuffers;
+ m_nSamplesToBuffer = nBuffers;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP_(int) CBufferFilter::GetBuffers()
{
- return m_nSamplesToBuffer;
+ return m_nSamplesToBuffer;
}
STDMETHODIMP_(int) CBufferFilter::GetFreeBuffers()
{
- CBufferFilterOutputPin* pPin = static_cast<CBufferFilterOutputPin*>(m_pOutput);
- return (pPin && pPin->m_pOutputQueue ? (m_nSamplesToBuffer - pPin->m_pOutputQueue->GetQueueCount()) : 0);
+ CBufferFilterOutputPin* pPin = static_cast<CBufferFilterOutputPin*>(m_pOutput);
+ return (pPin && pPin->m_pOutputQueue ? (m_nSamplesToBuffer - pPin->m_pOutputQueue->GetQueueCount()) : 0);
}
STDMETHODIMP CBufferFilter::SetPriority(DWORD dwPriority)
{
- CBufferFilterOutputPin* pPin = static_cast<CBufferFilterOutputPin*>(m_pOutput);
- return (pPin && pPin->m_pOutputQueue ? (pPin->m_pOutputQueue->SetPriority(dwPriority) ? S_OK : E_FAIL) : E_UNEXPECTED);
+ CBufferFilterOutputPin* pPin = static_cast<CBufferFilterOutputPin*>(m_pOutput);
+ return (pPin && pPin->m_pOutputQueue ? (pPin->m_pOutputQueue->SetPriority(dwPriority) ? S_OK : E_FAIL) : E_UNEXPECTED);
}
//
HRESULT CBufferFilter::Receive(IMediaSample* pSample)
{
- /* Check for other streams and pass them on */
- AM_SAMPLE2_PROPERTIES* const pProps = m_pInput->SampleProps();
- if (pProps->dwStreamId != AM_STREAM_MEDIA) {
- return m_pOutput->Deliver(pSample);
- }
-
- HRESULT hr;
- ASSERT(pSample);
- IMediaSample* pOutSample;
-
- ASSERT(m_pOutput != NULL);
-
- // Set up the output sample
- hr = InitializeOutputSample(pSample, &pOutSample);
-
- if (FAILED(hr)) {
- return hr;
- }
-
- // Start timing the transform (if PERF is defined)
- MSR_START(m_idTransform);
-
- // have the derived class transform the data
-
- hr = Transform(pSample, pOutSample);
-
- // Stop the clock and log it (if PERF is defined)
- MSR_STOP(m_idTransform);
-
- if (FAILED(hr)) {
- DbgLog((LOG_TRACE,1,_T("Error from transform")));
- } else {
- // the Transform() function can return S_FALSE to indicate that the
- // sample should not be delivered; we only deliver the sample if it's
- // really S_OK (same as NOERROR, of course.)
- if (hr == NOERROR) {
- hr = m_pOutput->Deliver(pOutSample);
- m_bSampleSkipped = FALSE; // last thing no longer dropped
- } else {
- // S_FALSE returned from Transform is a PRIVATE agreement
- // We should return NOERROR from Receive() in this cause because returning S_FALSE
- // from Receive() means that this is the end of the stream and no more data should
- // be sent.
- if (S_FALSE == hr) {
-
- // Release the sample before calling notify to avoid
- // deadlocks if the sample holds a lock on the system
- // such as DirectDraw buffers do
- pOutSample->Release();
- m_bSampleSkipped = TRUE;
- if (!m_bQualityChanged) {
- NotifyEvent(EC_QUALITY_CHANGE,0,0);
- m_bQualityChanged = TRUE;
- }
- return NOERROR;
- }
- }
- }
-
- // release the output buffer. If the connected pin still needs it,
- // it will have addrefed it itself.
- pOutSample->Release();
-
- return hr;
+ /* Check for other streams and pass them on */
+ AM_SAMPLE2_PROPERTIES* const pProps = m_pInput->SampleProps();
+ if (pProps->dwStreamId != AM_STREAM_MEDIA) {
+ return m_pOutput->Deliver(pSample);
+ }
+
+ HRESULT hr;
+ ASSERT(pSample);
+ IMediaSample* pOutSample;
+
+ ASSERT(m_pOutput != NULL);
+
+ // Set up the output sample
+ hr = InitializeOutputSample(pSample, &pOutSample);
+
+ if (FAILED(hr)) {
+ return hr;
+ }
+
+ // Start timing the transform (if PERF is defined)
+ MSR_START(m_idTransform);
+
+ // have the derived class transform the data
+
+ hr = Transform(pSample, pOutSample);
+
+ // Stop the clock and log it (if PERF is defined)
+ MSR_STOP(m_idTransform);
+
+ if (FAILED(hr)) {
+ DbgLog((LOG_TRACE, 1, _T("Error from transform")));
+ } else {
+ // the Transform() function can return S_FALSE to indicate that the
+ // sample should not be delivered; we only deliver the sample if it's
+ // really S_OK (same as NOERROR, of course.)
+ if (hr == NOERROR) {
+ hr = m_pOutput->Deliver(pOutSample);
+ m_bSampleSkipped = FALSE; // last thing no longer dropped
+ } else {
+ // S_FALSE returned from Transform is a PRIVATE agreement
+ // We should return NOERROR from Receive() in this cause because returning S_FALSE
+ // from Receive() means that this is the end of the stream and no more data should
+ // be sent.
+ if (S_FALSE == hr) {
+
+ // Release the sample before calling notify to avoid
+ // deadlocks if the sample holds a lock on the system
+ // such as DirectDraw buffers do
+ pOutSample->Release();
+ m_bSampleSkipped = TRUE;
+ if (!m_bQualityChanged) {
+ NotifyEvent(EC_QUALITY_CHANGE, 0, 0);
+ m_bQualityChanged = TRUE;
+ }
+ return NOERROR;
+ }
+ }
+ }
+
+ // release the output buffer. If the connected pin still needs it,
+ // it will have addrefed it itself.
+ pOutSample->Release();
+
+ return hr;
}
HRESULT CBufferFilter::Transform(IMediaSample* pIn, IMediaSample* pOut)
{
- BYTE* pDataIn = NULL;
- BYTE* pDataOut = NULL;
+ BYTE* pDataIn = NULL;
+ BYTE* pDataOut = NULL;
- pIn->GetPointer(&pDataIn);
- pOut->GetPointer(&pDataOut);
+ pIn->GetPointer(&pDataIn);
+ pOut->GetPointer(&pDataOut);
- long len = pIn->GetActualDataLength();
- long size = pOut->GetSize();
+ long len = pIn->GetActualDataLength();
+ long size = pOut->GetSize();
- if (!pDataIn || !pDataOut || len > size || len <= 0) {
- return S_FALSE;
- }
+ if (!pDataIn || !pDataOut || len > size || len <= 0) {
+ return S_FALSE;
+ }
- memcpy(pDataOut, pDataIn, min(len, size));
+ memcpy(pDataOut, pDataIn, min(len, size));
- pOut->SetActualDataLength(min(len, size));
+ pOut->SetActualDataLength(min(len, size));
- return S_OK;
+ return S_OK;
}
HRESULT CBufferFilter::CheckInputType(const CMediaType* mtIn)
{
- return S_OK;
+ return S_OK;
}
HRESULT CBufferFilter::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut)
{
- return mtIn->MatchesPartial(mtOut) ? S_OK : VFW_E_TYPE_NOT_ACCEPTED;
+ return mtIn->MatchesPartial(mtOut) ? S_OK : VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CBufferFilter::DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties)
{
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
- CComPtr<IMemAllocator> pAllocatorIn;
- m_pInput->GetAllocator(&pAllocatorIn);
- if (!pAllocatorIn) {
- return E_UNEXPECTED;
- }
+ CComPtr<IMemAllocator> pAllocatorIn;
+ m_pInput->GetAllocator(&pAllocatorIn);
+ if (!pAllocatorIn) {
+ return E_UNEXPECTED;
+ }
- pAllocatorIn->GetProperties(pProperties);
+ pAllocatorIn->GetProperties(pProperties);
- pProperties->cBuffers = max(m_nSamplesToBuffer, pProperties->cBuffers);
+ pProperties->cBuffers = max(m_nSamplesToBuffer, pProperties->cBuffers);
- HRESULT hr;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ HRESULT hr;
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- return (pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
- ? E_FAIL
- : NOERROR);
+ return (pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
+ ? E_FAIL
+ : NOERROR);
}
HRESULT CBufferFilter::GetMediaType(int iPosition, CMediaType* pMediaType)
{
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
- // TODO: offer all input types from upstream and allow reconnection at least in stopped state
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > 0) {
- return VFW_S_NO_MORE_ITEMS;
- }
+ // TODO: offer all input types from upstream and allow reconnection at least in stopped state
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > 0) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
- CopyMediaType(pMediaType, &m_pInput->CurrentMediaType());
+ CopyMediaType(pMediaType, &m_pInput->CurrentMediaType());
- return S_OK;
+ return S_OK;
}
HRESULT CBufferFilter::StopStreaming()
{
- CBufferFilterOutputPin* pPin = static_cast<CBufferFilterOutputPin*>(m_pOutput);
- if (m_pInput && pPin && pPin->m_pOutputQueue) {
- while (!m_pInput->IsFlushing() && pPin->m_pOutputQueue->GetQueueCount() > 0) {
- Sleep(50);
- }
- }
-
- return __super::StopStreaming();
+ CBufferFilterOutputPin* pPin = static_cast<CBufferFilterOutputPin*>(m_pOutput);
+ if (m_pInput && pPin && pPin->m_pOutputQueue) {
+ while (!m_pInput->IsFlushing() && pPin->m_pOutputQueue->GetQueueCount() > 0) {
+ Sleep(50);
+ }
+ }
+
+ return __super::StopStreaming();
}
//
@@ -310,45 +310,45 @@ HRESULT CBufferFilter::StopStreaming()
//
CBufferFilterOutputPin::CBufferFilterOutputPin(CTransformFilter* pFilter, HRESULT* phr)
- : CTransformOutputPin(NAME("CBufferFilterOutputPin"), pFilter, phr, L"Out")
+ : CTransformOutputPin(NAME("CBufferFilterOutputPin"), pFilter, phr, L"Out")
{
}
HRESULT CBufferFilterOutputPin::Active()
{
- CAutoLock lock_it(m_pLock);
+ CAutoLock lock_it(m_pLock);
- if (m_Connected && !m_pOutputQueue) {
- HRESULT hr = NOERROR;
+ if (m_Connected && !m_pOutputQueue) {
+ HRESULT hr = NOERROR;
- m_pOutputQueue.Attach(DNew CBufferFilterOutputQueue(m_Connected, &hr));
- if (!m_pOutputQueue) {
- hr = E_OUTOFMEMORY;
- }
+ m_pOutputQueue.Attach(DNew CBufferFilterOutputQueue(m_Connected, &hr));
+ if (!m_pOutputQueue) {
+ hr = E_OUTOFMEMORY;
+ }
- if (FAILED(hr)) {
- m_pOutputQueue.Free();
- return hr;
- }
- }
+ if (FAILED(hr)) {
+ m_pOutputQueue.Free();
+ return hr;
+ }
+ }
- return __super::Active();
+ return __super::Active();
}
HRESULT CBufferFilterOutputPin::Inactive()
{
- CAutoLock lock_it(m_pLock);
- m_pOutputQueue.Free();
- return __super::Inactive();
+ CAutoLock lock_it(m_pLock);
+ m_pOutputQueue.Free();
+ return __super::Inactive();
}
HRESULT CBufferFilterOutputPin::Deliver(IMediaSample* pMediaSample)
{
- if (!m_pOutputQueue) {
- return NOERROR;
- }
- pMediaSample->AddRef();
- return m_pOutputQueue->Receive(pMediaSample);
+ if (!m_pOutputQueue) {
+ return NOERROR;
+ }
+ pMediaSample->AddRef();
+ return m_pOutputQueue->Receive(pMediaSample);
}
#define CallQueue(call) \
@@ -358,20 +358,20 @@ HRESULT CBufferFilterOutputPin::Deliver(IMediaSample* pMediaSample)
HRESULT CBufferFilterOutputPin::DeliverEndOfStream()
{
- CallQueue(EOS());
+ CallQueue(EOS());
}
HRESULT CBufferFilterOutputPin::DeliverBeginFlush()
{
- CallQueue(BeginFlush());
+ CallQueue(BeginFlush());
}
HRESULT CBufferFilterOutputPin::DeliverEndFlush()
{
- CallQueue(EndFlush());
+ CallQueue(EndFlush());
}
HRESULT CBufferFilterOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- CallQueue(NewSegment(tStart, tStop, dRate));
+ CallQueue(NewSegment(tStart, tStop, dRate));
}
diff --git a/src/filters/transform/BufferFilter/BufferFilter.h b/src/filters/transform/BufferFilter/BufferFilter.h
index 3d2acc511..45ae16ef2 100644
--- a/src/filters/transform/BufferFilter/BufferFilter.h
+++ b/src/filters/transform/BufferFilter/BufferFilter.h
@@ -30,73 +30,73 @@
interface __declspec(uuid("63EF0035-3FFE-4c41-9230-4346E028BE20"))
IBufferFilter :
public IUnknown {
- STDMETHOD(SetBuffers) (int nBuffers) = 0;
- STDMETHOD_(int, GetBuffers) () = 0;
- STDMETHOD_(int, GetFreeBuffers) () = 0;
- STDMETHOD(SetPriority) (DWORD dwPriority = THREAD_PRIORITY_NORMAL) = 0;
+ STDMETHOD(SetBuffers)(int nBuffers) = 0;
+ STDMETHOD_(int, GetBuffers)() = 0;
+ STDMETHOD_(int, GetFreeBuffers)() = 0;
+ STDMETHOD(SetPriority)(DWORD dwPriority = THREAD_PRIORITY_NORMAL) = 0;
};
class __declspec(uuid("DA2B3D77-2F29-4fd2-AC99-DEE4A8A13BF0"))
- CBufferFilter : public CTransformFilter, public IBufferFilter
+ CBufferFilter : public CTransformFilter, public IBufferFilter
{
- int m_nSamplesToBuffer;
+ int m_nSamplesToBuffer;
public:
- CBufferFilter(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CBufferFilter();
-
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- // IBufferFilter
- STDMETHODIMP SetBuffers(int nBuffers);
- STDMETHODIMP_(int) GetBuffers();
- STDMETHODIMP_(int) GetFreeBuffers();
- STDMETHODIMP SetPriority(DWORD dwPriority = THREAD_PRIORITY_NORMAL);
-
- HRESULT Receive(IMediaSample* pSample);
- HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
- HRESULT CheckInputType(const CMediaType* mtIn);
- HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
- HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
- HRESULT StopStreaming();
+ CBufferFilter(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CBufferFilter();
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ // IBufferFilter
+ STDMETHODIMP SetBuffers(int nBuffers);
+ STDMETHODIMP_(int) GetBuffers();
+ STDMETHODIMP_(int) GetFreeBuffers();
+ STDMETHODIMP SetPriority(DWORD dwPriority = THREAD_PRIORITY_NORMAL);
+
+ HRESULT Receive(IMediaSample* pSample);
+ HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
+ HRESULT CheckInputType(const CMediaType* mtIn);
+ HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
+ HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
+ HRESULT StopStreaming();
};
class CBufferFilterOutputPin : public CTransformOutputPin
{
- class CBufferFilterOutputQueue : public COutputQueue
- {
- public:
- CBufferFilterOutputQueue(IPin* pInputPin, HRESULT* phr,
- DWORD dwPriority = THREAD_PRIORITY_NORMAL,
- BOOL bAuto = FALSE, BOOL bQueue = TRUE,
- LONG lBatchSize = 1, BOOL bBatchExact = FALSE,
- LONG lListSize = DEFAULTCACHE,
- bool bFlushingOpt = false)
- : COutputQueue(pInputPin, phr, bAuto, bQueue, lBatchSize, bBatchExact, lListSize, dwPriority, bFlushingOpt) {
- }
-
- int GetQueueCount() {
- return m_List ? m_List->GetCount() : -1;
- }
-
- bool SetPriority(DWORD dwPriority) {
- return m_hThread ? !!::SetThreadPriority(m_hThread, dwPriority) : false;
- }
- };
+ class CBufferFilterOutputQueue : public COutputQueue
+ {
+ public:
+ CBufferFilterOutputQueue(IPin* pInputPin, HRESULT* phr,
+ DWORD dwPriority = THREAD_PRIORITY_NORMAL,
+ BOOL bAuto = FALSE, BOOL bQueue = TRUE,
+ LONG lBatchSize = 1, BOOL bBatchExact = FALSE,
+ LONG lListSize = DEFAULTCACHE,
+ bool bFlushingOpt = false)
+ : COutputQueue(pInputPin, phr, bAuto, bQueue, lBatchSize, bBatchExact, lListSize, dwPriority, bFlushingOpt) {
+ }
+
+ int GetQueueCount() {
+ return m_List ? m_List->GetCount() : -1;
+ }
+
+ bool SetPriority(DWORD dwPriority) {
+ return m_hThread ? !!::SetThreadPriority(m_hThread, dwPriority) : false;
+ }
+ };
public:
- CBufferFilterOutputPin(CTransformFilter* pFilter, HRESULT* phr);
+ CBufferFilterOutputPin(CTransformFilter* pFilter, HRESULT* phr);
- CAutoPtr<CBufferFilterOutputQueue> m_pOutputQueue;
+ CAutoPtr<CBufferFilterOutputQueue> m_pOutputQueue;
- HRESULT Active();
- HRESULT Inactive();
+ HRESULT Active();
+ HRESULT Inactive();
- HRESULT Deliver(IMediaSample* pMediaSample);
- HRESULT DeliverEndOfStream();
- HRESULT DeliverBeginFlush();
- HRESULT DeliverEndFlush();
- HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT Deliver(IMediaSample* pMediaSample);
+ HRESULT DeliverEndOfStream();
+ HRESULT DeliverBeginFlush();
+ HRESULT DeliverEndFlush();
+ HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
};
diff --git a/src/filters/transform/DeCSSFilter/DeCSSFilter.cpp b/src/filters/transform/DeCSSFilter/DeCSSFilter.cpp
index 544c5763e..8af610d9a 100644
--- a/src/filters/transform/DeCSSFilter/DeCSSFilter.cpp
+++ b/src/filters/transform/DeCSSFilter/DeCSSFilter.cpp
@@ -30,37 +30,37 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_NULL},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CDeCSSFilter), DeCSSFilterName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CDeCSSFilter), DeCSSFilterName, MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CDeCSSFilter>, NULL, &sudFilter[0]},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CDeCSSFilter>, NULL, &sudFilter[0]},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
@@ -76,54 +76,54 @@ CFilterApp theApp;
class CKsPSInputPin : public CDeCSSInputPin
{
public:
- CKsPSInputPin(TCHAR* pObjectName, CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName)
- : CDeCSSInputPin(pObjectName, pFilter, phr, pName) {
- }
-
- // IKsPropertySet
- STDMETHODIMP Set(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength) {
- if (CComQIPtr<IKsPropertySet> pKsPS = (static_cast<CDeCSSFilter*>(m_pFilter))->m_pOutput->GetConnected()) {
- return pKsPS->Set(PropSet, Id, InstanceData, InstanceLength, PropertyData, DataLength);
- }
- return E_NOTIMPL;
- }
- STDMETHODIMP Get(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength, ULONG* pBytesReturned) {
- if (CComQIPtr<IKsPropertySet> pKsPS = (static_cast<CDeCSSFilter*>(m_pFilter))->m_pOutput->GetConnected()) {
- return pKsPS->Get(PropSet, Id, InstanceData, InstanceLength, PropertyData, DataLength, pBytesReturned);
- }
- return E_NOTIMPL;
- }
- STDMETHODIMP QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport) {
- if (CComQIPtr<IKsPropertySet> pKsPS = (static_cast<CDeCSSFilter*>(m_pFilter))->m_pOutput->GetConnected()) {
- return pKsPS->QuerySupported(PropSet, Id, pTypeSupport);
- }
- return E_NOTIMPL;
- }
+ CKsPSInputPin(TCHAR* pObjectName, CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName)
+ : CDeCSSInputPin(pObjectName, pFilter, phr, pName) {
+ }
+
+ // IKsPropertySet
+ STDMETHODIMP Set(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength) {
+ if (CComQIPtr<IKsPropertySet> pKsPS = (static_cast<CDeCSSFilter*>(m_pFilter))->m_pOutput->GetConnected()) {
+ return pKsPS->Set(PropSet, Id, InstanceData, InstanceLength, PropertyData, DataLength);
+ }
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP Get(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength, ULONG* pBytesReturned) {
+ if (CComQIPtr<IKsPropertySet> pKsPS = (static_cast<CDeCSSFilter*>(m_pFilter))->m_pOutput->GetConnected()) {
+ return pKsPS->Get(PropSet, Id, InstanceData, InstanceLength, PropertyData, DataLength, pBytesReturned);
+ }
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport) {
+ if (CComQIPtr<IKsPropertySet> pKsPS = (static_cast<CDeCSSFilter*>(m_pFilter))->m_pOutput->GetConnected()) {
+ return pKsPS->QuerySupported(PropSet, Id, pTypeSupport);
+ }
+ return E_NOTIMPL;
+ }
};
CDeCSSFilter::CDeCSSFilter(LPUNKNOWN lpunk, HRESULT* phr)
- : CTransformFilter(NAME("CDeCSSFilter"), lpunk, __uuidof(this))
+ : CTransformFilter(NAME("CDeCSSFilter"), lpunk, __uuidof(this))
{
- if (phr) {
- *phr = S_OK;
- }
-
- m_pInput = DNew CKsPSInputPin(NAME("CKsPSInputPin"), this, phr, L"In");
- if (!m_pInput) {
- *phr = E_OUTOFMEMORY;
- }
- if (FAILED(*phr)) {
- return;
- }
-
- m_pOutput = DNew CTransformOutputPin(NAME("CTransformOutputPin"), this, phr, L"Out");
- if (!m_pOutput) {
- *phr = E_OUTOFMEMORY;
- }
- if (FAILED(*phr)) {
- delete m_pInput, m_pInput = NULL;
- return;
- }
+ if (phr) {
+ *phr = S_OK;
+ }
+
+ m_pInput = DNew CKsPSInputPin(NAME("CKsPSInputPin"), this, phr, L"In");
+ if (!m_pInput) {
+ *phr = E_OUTOFMEMORY;
+ }
+ if (FAILED(*phr)) {
+ return;
+ }
+
+ m_pOutput = DNew CTransformOutputPin(NAME("CTransformOutputPin"), this, phr, L"Out");
+ if (!m_pOutput) {
+ *phr = E_OUTOFMEMORY;
+ }
+ if (FAILED(*phr)) {
+ delete m_pInput, m_pInput = NULL;
+ return;
+ }
}
CDeCSSFilter::~CDeCSSFilter()
@@ -132,121 +132,121 @@ CDeCSSFilter::~CDeCSSFilter()
HRESULT CDeCSSFilter::Transform(IMediaSample* pIn, IMediaSample* pOut)
{
- AM_MEDIA_TYPE* pmt;
- if (SUCCEEDED(pIn->GetMediaType(&pmt)) && pmt) {
- CMediaType mt = *pmt;
- m_pInput->SetMediaType(&mt);
- mt.majortype = m_pOutput->CurrentMediaType().majortype;
- m_pOutput->SetMediaType(&mt);
- pOut->SetMediaType(&mt);
- DeleteMediaType(pmt);
- }
-
- BYTE* pDataIn = NULL;
- BYTE* pDataOut = NULL;
-
- pIn->GetPointer(&pDataIn);
- pOut->GetPointer(&pDataOut);
-
- long len = pIn->GetActualDataLength();
- long size = pOut->GetSize();
-
- if (len == 0 || pDataIn == NULL) { // format changes do not carry any data
- pOut->SetActualDataLength(0);
- return S_OK;
- }
-
- if (m_pOutput->CurrentMediaType().majortype == MEDIATYPE_MPEG2_PES) {
- if (*(DWORD*)pDataIn == 0xBA010000) {
- len -= 14;
- pDataIn += 14;
- if (int stuffing = (pDataIn[-1]&7)) {
- len -= stuffing;
- pDataIn += stuffing;
- }
- }
- if (len <= 0) {
- return S_FALSE;
- }
- if (*(DWORD*)pDataIn == 0xBB010000) {
- len -= 4;
- pDataIn += 4;
- int hdrlen = ((pDataIn[0]<<8)|pDataIn[1]) + 2;
- len -= hdrlen;
- pDataIn += hdrlen;
- }
- if (len <= 0) {
- return S_FALSE;
- }
- }
-
- if (!pDataIn || !pDataOut || len > size || len < 0) {
- return S_FALSE;
- }
-
- memcpy(pDataOut, pDataIn, min(len, size));
- pOut->SetActualDataLength(min(len, size));
-
- return S_OK;
+ AM_MEDIA_TYPE* pmt;
+ if (SUCCEEDED(pIn->GetMediaType(&pmt)) && pmt) {
+ CMediaType mt = *pmt;
+ m_pInput->SetMediaType(&mt);
+ mt.majortype = m_pOutput->CurrentMediaType().majortype;
+ m_pOutput->SetMediaType(&mt);
+ pOut->SetMediaType(&mt);
+ DeleteMediaType(pmt);
+ }
+
+ BYTE* pDataIn = NULL;
+ BYTE* pDataOut = NULL;
+
+ pIn->GetPointer(&pDataIn);
+ pOut->GetPointer(&pDataOut);
+
+ long len = pIn->GetActualDataLength();
+ long size = pOut->GetSize();
+
+ if (len == 0 || pDataIn == NULL) { // format changes do not carry any data
+ pOut->SetActualDataLength(0);
+ return S_OK;
+ }
+
+ if (m_pOutput->CurrentMediaType().majortype == MEDIATYPE_MPEG2_PES) {
+ if (*(DWORD*)pDataIn == 0xBA010000) {
+ len -= 14;
+ pDataIn += 14;
+ if (int stuffing = (pDataIn[-1] & 7)) {
+ len -= stuffing;
+ pDataIn += stuffing;
+ }
+ }
+ if (len <= 0) {
+ return S_FALSE;
+ }
+ if (*(DWORD*)pDataIn == 0xBB010000) {
+ len -= 4;
+ pDataIn += 4;
+ int hdrlen = ((pDataIn[0] << 8) | pDataIn[1]) + 2;
+ len -= hdrlen;
+ pDataIn += hdrlen;
+ }
+ if (len <= 0) {
+ return S_FALSE;
+ }
+ }
+
+ if (!pDataIn || !pDataOut || len > size || len < 0) {
+ return S_FALSE;
+ }
+
+ memcpy(pDataOut, pDataIn, min(len, size));
+ pOut->SetActualDataLength(min(len, size));
+
+ return S_OK;
}
HRESULT CDeCSSFilter::CheckInputType(const CMediaType* mtIn)
{
- return mtIn->majortype == MEDIATYPE_DVD_ENCRYPTED_PACK
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ return mtIn->majortype == MEDIATYPE_DVD_ENCRYPTED_PACK
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CDeCSSFilter::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut)
{
- return SUCCEEDED(CheckInputType(mtIn))
- && mtOut->majortype == MEDIATYPE_MPEG2_PACK || mtOut->majortype == MEDIATYPE_MPEG2_PES
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ return SUCCEEDED(CheckInputType(mtIn))
+ && mtOut->majortype == MEDIATYPE_MPEG2_PACK || mtOut->majortype == MEDIATYPE_MPEG2_PES
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CDeCSSFilter::DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties)
{
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
-
- pProperties->cbAlign = 1;
- pProperties->cBuffers = 1;
- pProperties->cbBuffer = 2048;
- pProperties->cbPrefix = 0;
-
- HRESULT hr;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
- return hr;
- }
-
- return (pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
- ? E_FAIL
- : NOERROR);
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
+
+ pProperties->cbAlign = 1;
+ pProperties->cBuffers = 1;
+ pProperties->cbBuffer = 2048;
+ pProperties->cbPrefix = 0;
+
+ HRESULT hr;
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
+
+ return (pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
+ ? E_FAIL
+ : NOERROR);
}
HRESULT CDeCSSFilter::GetMediaType(int iPosition, CMediaType* pmt)
{
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
-
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > 1) {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- CopyMediaType(pmt, &m_pInput->CurrentMediaType());
- if (iPosition == 0) {
- pmt->majortype = MEDIATYPE_MPEG2_PACK;
- }
- if (iPosition == 1) {
- pmt->majortype = MEDIATYPE_MPEG2_PES;
- }
-
- return S_OK;
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
+
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > 1) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ CopyMediaType(pmt, &m_pInput->CurrentMediaType());
+ if (iPosition == 0) {
+ pmt->majortype = MEDIATYPE_MPEG2_PACK;
+ }
+ if (iPosition == 1) {
+ pmt->majortype = MEDIATYPE_MPEG2_PES;
+ }
+
+ return S_OK;
}
diff --git a/src/filters/transform/DeCSSFilter/DeCSSFilter.h b/src/filters/transform/DeCSSFilter/DeCSSFilter.h
index 921c1375c..446eb2017 100644
--- a/src/filters/transform/DeCSSFilter/DeCSSFilter.h
+++ b/src/filters/transform/DeCSSFilter/DeCSSFilter.h
@@ -26,17 +26,17 @@
#define DeCSSFilterName L"MPC DeCSSFilter"
class __declspec(uuid("7B3BD419-FE03-4820-BE94-A22A4F844895"))
- CDeCSSFilter : public CTransformFilter
+ CDeCSSFilter : public CTransformFilter
{
- friend class CKsPSInputPin;
+ friend class CKsPSInputPin;
public:
- CDeCSSFilter(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CDeCSSFilter();
+ CDeCSSFilter(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CDeCSSFilter();
- HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
- HRESULT CheckInputType(const CMediaType* mtIn);
- HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
- HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT GetMediaType(int iPosition, CMediaType* pmt);
+ HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
+ HRESULT CheckInputType(const CMediaType* mtIn);
+ HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
+ HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT GetMediaType(int iPosition, CMediaType* pmt);
};
diff --git a/src/filters/transform/MPCVideoDec/CpuId.cpp b/src/filters/transform/MPCVideoDec/CpuId.cpp
index 7f58bd94b..93145142d 100644
--- a/src/filters/transform/MPCVideoDec/CpuId.cpp
+++ b/src/filters/transform/MPCVideoDec/CpuId.cpp
@@ -42,162 +42,159 @@
CCpuId::CCpuId(void)
{
- unsigned nHighestFeature;
- unsigned nHighestFeatureEx;
- int nBuff[4];
- char szMan[13];
- //char szFeatures[256];
-
- // Get CPU manufacturer and highest CPUID
- __cpuid(nBuff, 0);
- nHighestFeature = (unsigned)nBuff[0];
- *(int*)&szMan[0] = nBuff[1];
- *(int*)&szMan[4] = nBuff[3];
- *(int*)&szMan[8] = nBuff[2];
- szMan[12] = 0;
- if (strcmp(szMan, "AuthenticAMD") == 0)
- m_nType = PROCESSOR_AMD;
- else if (strcmp(szMan, "GenuineIntel") == 0)
- m_nType = PROCESSOR_INTEL;
- else
- m_nType = PROCESSOR_UNKNOWN;
-
- // Get highest extended feature
- __cpuid(nBuff, 0x80000000);
- nHighestFeatureEx = (unsigned)nBuff[0];
-
- // Get processor brand name
- /*
- if (nHighestFeatureEx >= 0x80000004)
- {
- char szCPUName[49];
- szCPUName[0] = 0;
- __cpuid((int*)&szCPUName[0], 0x80000002);
- __cpuid((int*)&szCPUName[16], 0x80000003);
- __cpuid((int*)&szCPUName[32], 0x80000004);
- szCPUName[48] = 0;
- for (int i = (int)strlen(szCPUName) - 1; i >= 0; --i)
- {
- if (szCPUName[i] == ' ')
- szCPUName[i] = '\0';
- else
- break;
- }
-
- ELog::Get().SystemFormat(L"PERF : CPU: %S (%S)\n", szCPUName, szMan);
- }
- else
- ELog::Get().SystemFormat(L"PERF : CPU: %S\n", szMan);
- */
-
- // Get CPU features
- m_nCPUFeatures = 0;
- //szFeatures[0] = 0;
- if (nHighestFeature >= 1)
- {
- __cpuid(nBuff, 1);
- if (nBuff[3] & CPUID_MMX) m_nCPUFeatures |= MPC_MM_MMX;
- if (nBuff[3] & CPUID_SSE) m_nCPUFeatures |= MPC_MM_SSE;
- if (nBuff[3] & CPUID_SSE2) m_nCPUFeatures |= MPC_MM_SSE2;
- if (nBuff[2] & CPUID_SSE3) m_nCPUFeatures |= MPC_MM_SSE3;
-
- // Intel specific:
- if (m_nType == PROCESSOR_INTEL)
- {
- if (nBuff[2] & CPUID_SSSE3) m_nCPUFeatures |= MPC_MM_SSSE3;
- //if (nBuff[2] & CPUID_EST) strcat(szFeatures, "EST ");
- }
-
- //if (nBuff[3] & CPUID_HTT)
- // strcat(szFeatures, "HTT ");
- }
-
- // AMD specific:
- if (m_nType == PROCESSOR_AMD)
- {
- // Get extended features
- __cpuid(nBuff, 0x80000000);
- if (nHighestFeatureEx >= 0x80000001)
- {
- __cpuid(nBuff, 0x80000001);
- if (nBuff[3] & CPUID_3DNOW) m_nCPUFeatures |= MPC_MM_3DNOW;
- //if (nBuff[3] & CPUID_3DNOWEXT) strcat(szFeatures, "Ex3DNow! ");
- if (nBuff[3] & CPUID_MMXEXT) m_nCPUFeatures |= MPC_MM_MMXEXT;
- }
-
- // Get level 1 cache size
- //if (nHighestFeatureEx >= 0x80000005)
- //{
- // __cpuid(nBuff, 0x80000005);
- // ELog::Get().SystemFormat(L"PERF : L1 cache size: %dK\n", ((unsigned)nBuff[2])>>24);
- //}
- }
-
- /*
- // Get cache size
- if (nHighestFeatureEx >= 0x80000006)
- {
- __cpuid(nBuff, 0x80000006);
- ELog::Get().SystemFormat(L"PERF : L2 cache size: %dK\n", ((unsigned)nBuff[2])>>16);
- }
-
- // Log features
- ELog::Get().SystemFormat(L"PERF : CPU Features: %S\n", szFeatures);
-
- // Get misc system info
- SYSTEM_INFO theInfo;
- GetSystemInfo(&theInfo);
-
- // Log number of CPUs and speeds
- ELog::Get().SystemFormat(L"PERF : Number of CPUs: %d\n", theInfo.dwNumberOfProcessors);
- for (DWORD i = 0; i < theInfo.dwNumberOfProcessors; ++i)
- {
- DWORD dwCPUSpeed = ReadCPUSpeedFromRegistry(i);
- ELog::Get().SystemFormat(L"PERF : * CPU %d speed: ~%dMHz\n", i, dwCPUSpeed);
- }
- */
-
- /*
- unsigned nHighestFeature;
- unsigned nHighestFeatureEx;
-
- m_CPUInfo[0] = -1;
- m_CPUInfoEx[0] = -1;
- m_CPUAMDInfo[0] = -1;
-
- __cpuid(m_CPUInfo, 0);
- nHighestFeature = (unsigned)m_CPUInfo[0];
-
- __cpuid(nBuff, 0x80000000);
- nHighestFeatureEx = (unsigned)nBuff[0];
-
- m_nDSPFlags = 0;
- if (m_CPUInfo[3] & CPUID_MMX) m_nDSPFlags |= MPC_MM_MMX;
- if (m_CPUInfo[3] & CPUID_SSE) m_nDSPFlags |= MPC_MM_SSE;
- if (m_CPUInfo[3] & CPUID_SSE2) m_nDSPFlags |= MPC_MM_SSE2;
- if (m_CPUInfo[2] & CPUID_SSE3) m_nDSPFlags |= MPC_MM_SSE3;
-
- switch (m_nType)
- {
- case PROCESSOR_AMD :
- __cpuid(m_CPUAMDInfo, 0x80000000);
- if (nHighestFeatureEx >= 0x80000001)
- {
- if (m_CPUAMDInfo[3] & CPUID_MMXEXT) m_nDSPFlags |= MPC_MM_MMXEXT;
- if (m_CPUAMDInfo[3] & CPUID_3DNOW) m_nDSPFlags |= MPC_MM_3DNOW;
- }
- break;
- case PROCESSOR_INTEL :
- if (m_CPUInfo[2] & CPUID_SSSE3) m_nDSPFlags |= MPC_MM_SSSE3;
- break;
- }
- */
+ unsigned nHighestFeature;
+ unsigned nHighestFeatureEx;
+ int nBuff[4];
+ char szMan[13];
+ //char szFeatures[256];
+
+ // Get CPU manufacturer and highest CPUID
+ __cpuid(nBuff, 0);
+ nHighestFeature = (unsigned)nBuff[0];
+ *(int*)&szMan[0] = nBuff[1];
+ *(int*)&szMan[4] = nBuff[3];
+ *(int*)&szMan[8] = nBuff[2];
+ szMan[12] = 0;
+ if (strcmp(szMan, "AuthenticAMD") == 0) {
+ m_nType = PROCESSOR_AMD;
+ } else if (strcmp(szMan, "GenuineIntel") == 0) {
+ m_nType = PROCESSOR_INTEL;
+ } else {
+ m_nType = PROCESSOR_UNKNOWN;
+ }
+
+ // Get highest extended feature
+ __cpuid(nBuff, 0x80000000);
+ nHighestFeatureEx = (unsigned)nBuff[0];
+
+ // Get processor brand name
+ /*
+ if (nHighestFeatureEx >= 0x80000004)
+ {
+ char szCPUName[49];
+ szCPUName[0] = 0;
+ __cpuid((int*)&szCPUName[0], 0x80000002);
+ __cpuid((int*)&szCPUName[16], 0x80000003);
+ __cpuid((int*)&szCPUName[32], 0x80000004);
+ szCPUName[48] = 0;
+ for (int i = (int)strlen(szCPUName) - 1; i >= 0; --i)
+ {
+ if (szCPUName[i] == ' ')
+ szCPUName[i] = '\0';
+ else
+ break;
+ }
+
+ ELog::Get().SystemFormat(L"PERF : CPU: %S (%S)\n", szCPUName, szMan);
+ }
+ else
+ ELog::Get().SystemFormat(L"PERF : CPU: %S\n", szMan);
+ */
+
+ // Get CPU features
+ m_nCPUFeatures = 0;
+ //szFeatures[0] = 0;
+ if (nHighestFeature >= 1) {
+ __cpuid(nBuff, 1);
+ if (nBuff[3] & CPUID_MMX) { m_nCPUFeatures |= MPC_MM_MMX; }
+ if (nBuff[3] & CPUID_SSE) { m_nCPUFeatures |= MPC_MM_SSE; }
+ if (nBuff[3] & CPUID_SSE2) { m_nCPUFeatures |= MPC_MM_SSE2; }
+ if (nBuff[2] & CPUID_SSE3) { m_nCPUFeatures |= MPC_MM_SSE3; }
+
+ // Intel specific:
+ if (m_nType == PROCESSOR_INTEL) {
+ if (nBuff[2] & CPUID_SSSE3) { m_nCPUFeatures |= MPC_MM_SSSE3; }
+ //if (nBuff[2] & CPUID_EST) strcat(szFeatures, "EST ");
+ }
+
+ //if (nBuff[3] & CPUID_HTT)
+ // strcat(szFeatures, "HTT ");
+ }
+
+ // AMD specific:
+ if (m_nType == PROCESSOR_AMD) {
+ // Get extended features
+ __cpuid(nBuff, 0x80000000);
+ if (nHighestFeatureEx >= 0x80000001) {
+ __cpuid(nBuff, 0x80000001);
+ if (nBuff[3] & CPUID_3DNOW) { m_nCPUFeatures |= MPC_MM_3DNOW; }
+ //if (nBuff[3] & CPUID_3DNOWEXT) strcat(szFeatures, "Ex3DNow! ");
+ if (nBuff[3] & CPUID_MMXEXT) { m_nCPUFeatures |= MPC_MM_MMXEXT; }
+ }
+
+ // Get level 1 cache size
+ //if (nHighestFeatureEx >= 0x80000005)
+ //{
+ // __cpuid(nBuff, 0x80000005);
+ // ELog::Get().SystemFormat(L"PERF : L1 cache size: %dK\n", ((unsigned)nBuff[2])>>24);
+ //}
+ }
+
+ /*
+ // Get cache size
+ if (nHighestFeatureEx >= 0x80000006)
+ {
+ __cpuid(nBuff, 0x80000006);
+ ELog::Get().SystemFormat(L"PERF : L2 cache size: %dK\n", ((unsigned)nBuff[2])>>16);
+ }
+
+ // Log features
+ ELog::Get().SystemFormat(L"PERF : CPU Features: %S\n", szFeatures);
+
+ // Get misc system info
+ SYSTEM_INFO theInfo;
+ GetSystemInfo(&theInfo);
+
+ // Log number of CPUs and speeds
+ ELog::Get().SystemFormat(L"PERF : Number of CPUs: %d\n", theInfo.dwNumberOfProcessors);
+ for (DWORD i = 0; i < theInfo.dwNumberOfProcessors; ++i)
+ {
+ DWORD dwCPUSpeed = ReadCPUSpeedFromRegistry(i);
+ ELog::Get().SystemFormat(L"PERF : * CPU %d speed: ~%dMHz\n", i, dwCPUSpeed);
+ }
+ */
+
+ /*
+ unsigned nHighestFeature;
+ unsigned nHighestFeatureEx;
+
+ m_CPUInfo[0] = -1;
+ m_CPUInfoEx[0] = -1;
+ m_CPUAMDInfo[0] = -1;
+
+ __cpuid(m_CPUInfo, 0);
+ nHighestFeature = (unsigned)m_CPUInfo[0];
+
+ __cpuid(nBuff, 0x80000000);
+ nHighestFeatureEx = (unsigned)nBuff[0];
+
+ m_nDSPFlags = 0;
+ if (m_CPUInfo[3] & CPUID_MMX) m_nDSPFlags |= MPC_MM_MMX;
+ if (m_CPUInfo[3] & CPUID_SSE) m_nDSPFlags |= MPC_MM_SSE;
+ if (m_CPUInfo[3] & CPUID_SSE2) m_nDSPFlags |= MPC_MM_SSE2;
+ if (m_CPUInfo[2] & CPUID_SSE3) m_nDSPFlags |= MPC_MM_SSE3;
+
+ switch (m_nType)
+ {
+ case PROCESSOR_AMD :
+ __cpuid(m_CPUAMDInfo, 0x80000000);
+ if (nHighestFeatureEx >= 0x80000001)
+ {
+ if (m_CPUAMDInfo[3] & CPUID_MMXEXT) m_nDSPFlags |= MPC_MM_MMXEXT;
+ if (m_CPUAMDInfo[3] & CPUID_3DNOW) m_nDSPFlags |= MPC_MM_3DNOW;
+ }
+ break;
+ case PROCESSOR_INTEL :
+ if (m_CPUInfo[2] & CPUID_SSSE3) m_nDSPFlags |= MPC_MM_SSSE3;
+ break;
+ }
+ */
}
int CCpuId::GetProcessorNumber()
{
- SYSTEM_INFO SystemInfo;
- GetSystemInfo(&SystemInfo);
+ SYSTEM_INFO SystemInfo;
+ GetSystemInfo(&SystemInfo);
- return SystemInfo.dwNumberOfProcessors;
+ return SystemInfo.dwNumberOfProcessors;
}
diff --git a/src/filters/transform/MPCVideoDec/CpuId.h b/src/filters/transform/MPCVideoDec/CpuId.h
index dfc916cce..1c3e8a0c0 100644
--- a/src/filters/transform/MPCVideoDec/CpuId.h
+++ b/src/filters/transform/MPCVideoDec/CpuId.h
@@ -26,31 +26,31 @@ class CCpuId
{
public:
- typedef enum {
- PROCESSOR_AMD,
- PROCESSOR_INTEL,
- PROCESSOR_UNKNOWN
- } PROCESSOR_TYPE;
+ typedef enum {
+ PROCESSOR_AMD,
+ PROCESSOR_INTEL,
+ PROCESSOR_UNKNOWN
+ } PROCESSOR_TYPE;
- // Enum codes identicals to FFMpeg cpu features define !
- typedef enum {
- MPC_MM_MMX = 0x0001, /* standard MMX */
- MPC_MM_3DNOW = 0x0004, /* AMD 3DNOW */
- MPC_MM_MMXEXT = 0x0002, /* SSE integer functions or AMD MMX ext */
- MPC_MM_SSE = 0x0008, /* SSE functions */
- MPC_MM_SSE2 = 0x0010, /* PIV SSE2 functions */
- MPC_MM_3DNOWEXT = 0x0020, /* AMD 3DNowExt */
- MPC_MM_SSE3 = 0x0040, /* AMD64 & PIV SSE3 functions*/
- MPC_MM_SSSE3 = 0x0080 /* PIV Core 2 SSSE3 functions*/
- } PROCESSOR_FEATURES;
+ // Enum codes identicals to FFMpeg cpu features define !
+ typedef enum {
+ MPC_MM_MMX = 0x0001, /* standard MMX */
+ MPC_MM_3DNOW = 0x0004, /* AMD 3DNOW */
+ MPC_MM_MMXEXT = 0x0002, /* SSE integer functions or AMD MMX ext */
+ MPC_MM_SSE = 0x0008, /* SSE functions */
+ MPC_MM_SSE2 = 0x0010, /* PIV SSE2 functions */
+ MPC_MM_3DNOWEXT = 0x0020, /* AMD 3DNowExt */
+ MPC_MM_SSE3 = 0x0040, /* AMD64 & PIV SSE3 functions*/
+ MPC_MM_SSSE3 = 0x0080 /* PIV Core 2 SSSE3 functions*/
+ } PROCESSOR_FEATURES;
- CCpuId();
+ CCpuId();
- int GetFeatures() const {return m_nCPUFeatures;};
- PROCESSOR_TYPE GetType() const {return m_nType;};
- int GetProcessorNumber();
+ int GetFeatures() const {return m_nCPUFeatures;};
+ PROCESSOR_TYPE GetType() const {return m_nType;};
+ int GetProcessorNumber();
private:
- int m_nCPUFeatures;
- PROCESSOR_TYPE m_nType;
+ int m_nCPUFeatures;
+ PROCESSOR_TYPE m_nType;
};
diff --git a/src/filters/transform/MPCVideoDec/DXVADecoder.cpp b/src/filters/transform/MPCVideoDec/DXVADecoder.cpp
index 9daac52d0..a16a991a9 100644
--- a/src/filters/transform/MPCVideoDec/DXVADecoder.cpp
+++ b/src/filters/transform/MPCVideoDec/DXVADecoder.cpp
@@ -40,702 +40,702 @@
nTry++; \
}
-CDXVADecoder::CDXVADecoder (CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber)
+CDXVADecoder::CDXVADecoder(CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber)
{
- m_nEngine = ENGINE_DXVA1;
- m_pAMVideoAccelerator = pAMVideoAccelerator;
- m_dwBufferIndex = 0;
- m_nMaxWaiting = 3;
+ m_nEngine = ENGINE_DXVA1;
+ m_pAMVideoAccelerator = pAMVideoAccelerator;
+ m_dwBufferIndex = 0;
+ m_nMaxWaiting = 3;
- Init (pFilter, nMode, nPicEntryNumber);
+ Init(pFilter, nMode, nPicEntryNumber);
}
-CDXVADecoder::CDXVADecoder (CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config)
+CDXVADecoder::CDXVADecoder(CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config)
{
- m_nEngine = ENGINE_DXVA2;
- m_pDirectXVideoDec = pDirectXVideoDec;
- memcpy (&m_DXVA2Config, pDXVA2Config, sizeof(DXVA2_ConfigPictureDecode));
+ m_nEngine = ENGINE_DXVA2;
+ m_pDirectXVideoDec = pDirectXVideoDec;
+ memcpy(&m_DXVA2Config, pDXVA2Config, sizeof(DXVA2_ConfigPictureDecode));
- Init (pFilter, nMode, nPicEntryNumber);
+ Init(pFilter, nMode, nPicEntryNumber);
};
CDXVADecoder::~CDXVADecoder()
{
- SAFE_DELETE_ARRAY (m_pPictureStore);
- SAFE_DELETE_ARRAY (m_ExecuteParams.pCompressedBuffers);
+ SAFE_DELETE_ARRAY(m_pPictureStore);
+ SAFE_DELETE_ARRAY(m_ExecuteParams.pCompressedBuffers);
}
void CDXVADecoder::Init(CMPCVideoDecFilter* pFilter, DXVAMode nMode, int nPicEntryNumber)
{
- m_pFilter = pFilter;
- m_nMode = nMode;
- m_nPicEntryNumber = nPicEntryNumber;
- m_pPictureStore = DNew PICTURE_STORE[nPicEntryNumber];
- m_dwNumBuffersInfo = 0;
- m_bNeedChangeAspect = true;
-
- memset (&m_DXVA1Config, 0, sizeof(m_DXVA1Config));
- memset (&m_DXVA1BufferDesc, 0, sizeof(m_DXVA1BufferDesc));
- m_DXVA1Config.guidConfigBitstreamEncryption = DXVA_NoEncrypt;
- m_DXVA1Config.guidConfigMBcontrolEncryption = DXVA_NoEncrypt;
- m_DXVA1Config.guidConfigResidDiffEncryption = DXVA_NoEncrypt;
- m_DXVA1Config.bConfigBitstreamRaw = 2;
-
- memset (&m_DXVA1BufferInfo, 0, sizeof(m_DXVA1BufferInfo));
- memset (&m_ExecuteParams, 0, sizeof(m_ExecuteParams));
- Flush();
+ m_pFilter = pFilter;
+ m_nMode = nMode;
+ m_nPicEntryNumber = nPicEntryNumber;
+ m_pPictureStore = DNew PICTURE_STORE[nPicEntryNumber];
+ m_dwNumBuffersInfo = 0;
+ m_bNeedChangeAspect = true;
+
+ memset(&m_DXVA1Config, 0, sizeof(m_DXVA1Config));
+ memset(&m_DXVA1BufferDesc, 0, sizeof(m_DXVA1BufferDesc));
+ m_DXVA1Config.guidConfigBitstreamEncryption = DXVA_NoEncrypt;
+ m_DXVA1Config.guidConfigMBcontrolEncryption = DXVA_NoEncrypt;
+ m_DXVA1Config.guidConfigResidDiffEncryption = DXVA_NoEncrypt;
+ m_DXVA1Config.bConfigBitstreamRaw = 2;
+
+ memset(&m_DXVA1BufferInfo, 0, sizeof(m_DXVA1BufferInfo));
+ memset(&m_ExecuteParams, 0, sizeof(m_ExecuteParams));
+ Flush();
}
// === Public functions
-void CDXVADecoder::AllocExecuteParams (int nSize)
+void CDXVADecoder::AllocExecuteParams(int nSize)
{
- m_ExecuteParams.pCompressedBuffers = DNew DXVA2_DecodeBufferDesc[nSize];
+ m_ExecuteParams.pCompressedBuffers = DNew DXVA2_DecodeBufferDesc[nSize];
- for (int i=0; i<nSize; i++) {
- memset (&m_ExecuteParams.pCompressedBuffers[i], 0, sizeof(DXVA2_DecodeBufferDesc));
- }
+ for (int i = 0; i < nSize; i++) {
+ memset(&m_ExecuteParams.pCompressedBuffers[i], 0, sizeof(DXVA2_DecodeBufferDesc));
+ }
}
-void CDXVADecoder::SetExtraData (BYTE* pDataIn, UINT nSize)
+void CDXVADecoder::SetExtraData(BYTE* pDataIn, UINT nSize)
{
- // Extradata is codec dependant
- UNREFERENCED_PARAMETER (pDataIn);
- UNREFERENCED_PARAMETER (nSize);
+ // Extradata is codec dependant
+ UNREFERENCED_PARAMETER(pDataIn);
+ UNREFERENCED_PARAMETER(nSize);
}
void CDXVADecoder::CopyBitstream(BYTE* pDXVABuffer, BYTE* pBuffer, UINT& nSize)
{
- memcpy (pDXVABuffer, (BYTE*)pBuffer, nSize);
+ memcpy(pDXVABuffer, (BYTE*)pBuffer, nSize);
}
void CDXVADecoder::Flush()
{
- TRACE ("CDXVADecoder::Flush\n");
- for (int i=0; i<m_nPicEntryNumber; i++) {
- m_pPictureStore[i].bRefPicture = false;
- m_pPictureStore[i].bInUse = false;
- m_pPictureStore[i].bDisplayed = false;
- m_pPictureStore[i].pSample = NULL;
- m_pPictureStore[i].nCodecSpecific = -1;
- m_pPictureStore[i].dwDisplayCount = 0;
- }
-
- m_nWaitingPics = 0;
- m_bFlushed = true;
- m_nFieldSurface = -1;
- m_dwDisplayCount= 1;
- m_pFieldSample = NULL;
+ TRACE("CDXVADecoder::Flush\n");
+ for (int i = 0; i < m_nPicEntryNumber; i++) {
+ m_pPictureStore[i].bRefPicture = false;
+ m_pPictureStore[i].bInUse = false;
+ m_pPictureStore[i].bDisplayed = false;
+ m_pPictureStore[i].pSample = NULL;
+ m_pPictureStore[i].nCodecSpecific = -1;
+ m_pPictureStore[i].dwDisplayCount = 0;
+ }
+
+ m_nWaitingPics = 0;
+ m_bFlushed = true;
+ m_nFieldSurface = -1;
+ m_dwDisplayCount = 1;
+ m_pFieldSample = NULL;
}
HRESULT CDXVADecoder::ConfigureDXVA1()
{
- HRESULT hr = S_FALSE;
- DXVA_ConfigPictureDecode ConfigRequested;
-
- if (m_pAMVideoAccelerator) {
- memset (&ConfigRequested, 0, sizeof(ConfigRequested));
- ConfigRequested.guidConfigBitstreamEncryption = DXVA_NoEncrypt;
- ConfigRequested.guidConfigMBcontrolEncryption = DXVA_NoEncrypt;
- ConfigRequested.guidConfigResidDiffEncryption = DXVA_NoEncrypt;
- ConfigRequested.bConfigBitstreamRaw = 2;
-
- writeDXVA_QueryOrReplyFunc (&ConfigRequested.dwFunction, DXVA_QUERYORREPLYFUNCFLAG_DECODER_PROBE_QUERY, DXVA_PICTURE_DECODING_FUNCTION);
- hr = m_pAMVideoAccelerator->Execute (ConfigRequested.dwFunction, &ConfigRequested, sizeof(DXVA_ConfigPictureDecode), &m_DXVA1Config, sizeof(DXVA_ConfigPictureDecode), 0, NULL);
-
- // Copy to DXVA2 structure (simplify code based on accelerator config)
- m_DXVA2Config.guidConfigBitstreamEncryption = m_DXVA1Config.guidConfigBitstreamEncryption;
- m_DXVA2Config.guidConfigMBcontrolEncryption = m_DXVA1Config.guidConfigMBcontrolEncryption;
- m_DXVA2Config.guidConfigResidDiffEncryption = m_DXVA1Config.guidConfigResidDiffEncryption;
- m_DXVA2Config.ConfigBitstreamRaw = m_DXVA1Config.bConfigBitstreamRaw;
- m_DXVA2Config.ConfigMBcontrolRasterOrder = m_DXVA1Config.bConfigMBcontrolRasterOrder;
- m_DXVA2Config.ConfigResidDiffHost = m_DXVA1Config.bConfigResidDiffHost;
- m_DXVA2Config.ConfigSpatialResid8 = m_DXVA1Config.bConfigSpatialResid8;
- m_DXVA2Config.ConfigResid8Subtraction = m_DXVA1Config.bConfigResid8Subtraction;
- m_DXVA2Config.ConfigSpatialHost8or9Clipping = m_DXVA1Config.bConfigSpatialHost8or9Clipping;
- m_DXVA2Config.ConfigSpatialResidInterleaved = m_DXVA1Config.bConfigSpatialResidInterleaved;
- m_DXVA2Config.ConfigIntraResidUnsigned = m_DXVA1Config.bConfigIntraResidUnsigned;
- m_DXVA2Config.ConfigResidDiffAccelerator = m_DXVA1Config.bConfigResidDiffAccelerator;
- m_DXVA2Config.ConfigHostInverseScan = m_DXVA1Config.bConfigHostInverseScan;
- m_DXVA2Config.ConfigSpecificIDCT = m_DXVA1Config.bConfigSpecificIDCT;
- m_DXVA2Config.Config4GroupedCoefs = m_DXVA1Config.bConfig4GroupedCoefs;
-
- if (SUCCEEDED (hr)) {
- writeDXVA_QueryOrReplyFunc (&m_DXVA1Config.dwFunction, DXVA_QUERYORREPLYFUNCFLAG_DECODER_LOCK_QUERY, DXVA_PICTURE_DECODING_FUNCTION);
- hr = m_pAMVideoAccelerator->Execute (m_DXVA1Config.dwFunction, &m_DXVA1Config, sizeof(DXVA_ConfigPictureDecode), &ConfigRequested, sizeof(DXVA_ConfigPictureDecode), 0, NULL);
-
- // TODO : check config!
- // ASSERT (ConfigRequested.bConfigBitstreamRaw == 2);
-
- AMVAUncompDataInfo DataInfo;
- DWORD dwNum = COMP_BUFFER_COUNT;
- DataInfo.dwUncompWidth = m_pFilter->PictWidthRounded();
- DataInfo.dwUncompHeight = m_pFilter->PictHeightRounded();
- memcpy (&DataInfo.ddUncompPixelFormat, m_pFilter->GetPixelFormat(), sizeof (DDPIXELFORMAT));
- hr = m_pAMVideoAccelerator->GetCompBufferInfo (m_pFilter->GetDXVADecoderGuid(), &DataInfo, &dwNum, m_ComBufferInfo);
- }
- }
- return hr;
+ HRESULT hr = S_FALSE;
+ DXVA_ConfigPictureDecode ConfigRequested;
+
+ if (m_pAMVideoAccelerator) {
+ memset(&ConfigRequested, 0, sizeof(ConfigRequested));
+ ConfigRequested.guidConfigBitstreamEncryption = DXVA_NoEncrypt;
+ ConfigRequested.guidConfigMBcontrolEncryption = DXVA_NoEncrypt;
+ ConfigRequested.guidConfigResidDiffEncryption = DXVA_NoEncrypt;
+ ConfigRequested.bConfigBitstreamRaw = 2;
+
+ writeDXVA_QueryOrReplyFunc(&ConfigRequested.dwFunction, DXVA_QUERYORREPLYFUNCFLAG_DECODER_PROBE_QUERY, DXVA_PICTURE_DECODING_FUNCTION);
+ hr = m_pAMVideoAccelerator->Execute(ConfigRequested.dwFunction, &ConfigRequested, sizeof(DXVA_ConfigPictureDecode), &m_DXVA1Config, sizeof(DXVA_ConfigPictureDecode), 0, NULL);
+
+ // Copy to DXVA2 structure (simplify code based on accelerator config)
+ m_DXVA2Config.guidConfigBitstreamEncryption = m_DXVA1Config.guidConfigBitstreamEncryption;
+ m_DXVA2Config.guidConfigMBcontrolEncryption = m_DXVA1Config.guidConfigMBcontrolEncryption;
+ m_DXVA2Config.guidConfigResidDiffEncryption = m_DXVA1Config.guidConfigResidDiffEncryption;
+ m_DXVA2Config.ConfigBitstreamRaw = m_DXVA1Config.bConfigBitstreamRaw;
+ m_DXVA2Config.ConfigMBcontrolRasterOrder = m_DXVA1Config.bConfigMBcontrolRasterOrder;
+ m_DXVA2Config.ConfigResidDiffHost = m_DXVA1Config.bConfigResidDiffHost;
+ m_DXVA2Config.ConfigSpatialResid8 = m_DXVA1Config.bConfigSpatialResid8;
+ m_DXVA2Config.ConfigResid8Subtraction = m_DXVA1Config.bConfigResid8Subtraction;
+ m_DXVA2Config.ConfigSpatialHost8or9Clipping = m_DXVA1Config.bConfigSpatialHost8or9Clipping;
+ m_DXVA2Config.ConfigSpatialResidInterleaved = m_DXVA1Config.bConfigSpatialResidInterleaved;
+ m_DXVA2Config.ConfigIntraResidUnsigned = m_DXVA1Config.bConfigIntraResidUnsigned;
+ m_DXVA2Config.ConfigResidDiffAccelerator = m_DXVA1Config.bConfigResidDiffAccelerator;
+ m_DXVA2Config.ConfigHostInverseScan = m_DXVA1Config.bConfigHostInverseScan;
+ m_DXVA2Config.ConfigSpecificIDCT = m_DXVA1Config.bConfigSpecificIDCT;
+ m_DXVA2Config.Config4GroupedCoefs = m_DXVA1Config.bConfig4GroupedCoefs;
+
+ if (SUCCEEDED(hr)) {
+ writeDXVA_QueryOrReplyFunc(&m_DXVA1Config.dwFunction, DXVA_QUERYORREPLYFUNCFLAG_DECODER_LOCK_QUERY, DXVA_PICTURE_DECODING_FUNCTION);
+ hr = m_pAMVideoAccelerator->Execute(m_DXVA1Config.dwFunction, &m_DXVA1Config, sizeof(DXVA_ConfigPictureDecode), &ConfigRequested, sizeof(DXVA_ConfigPictureDecode), 0, NULL);
+
+ // TODO : check config!
+ // ASSERT (ConfigRequested.bConfigBitstreamRaw == 2);
+
+ AMVAUncompDataInfo DataInfo;
+ DWORD dwNum = COMP_BUFFER_COUNT;
+ DataInfo.dwUncompWidth = m_pFilter->PictWidthRounded();
+ DataInfo.dwUncompHeight = m_pFilter->PictHeightRounded();
+ memcpy(&DataInfo.ddUncompPixelFormat, m_pFilter->GetPixelFormat(), sizeof(DDPIXELFORMAT));
+ hr = m_pAMVideoAccelerator->GetCompBufferInfo(m_pFilter->GetDXVADecoderGuid(), &DataInfo, &dwNum, m_ComBufferInfo);
+ }
+ }
+ return hr;
}
-CDXVADecoder* CDXVADecoder::CreateDecoder (CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, const GUID* guidDecoder, int nPicEntryNumber)
+CDXVADecoder* CDXVADecoder::CreateDecoder(CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, const GUID* guidDecoder, int nPicEntryNumber)
{
- CDXVADecoder* pDecoder = NULL;
-
- if ((*guidDecoder == DXVA2_ModeH264_E) || (*guidDecoder == DXVA2_ModeH264_F) || (*guidDecoder == DXVA_Intel_H264_ClearVideo)) {
- pDecoder = DNew CDXVADecoderH264 (pFilter, pAMVideoAccelerator, H264_VLD, nPicEntryNumber);
- } else if (*guidDecoder == DXVA2_ModeVC1_D) {
- pDecoder = DNew CDXVADecoderVC1 (pFilter, pAMVideoAccelerator, VC1_VLD, nPicEntryNumber);
- } else if (*guidDecoder == DXVA2_ModeMPEG2_VLD) {
- pDecoder = DNew CDXVADecoderMpeg2 (pFilter, pAMVideoAccelerator, MPEG2_VLD, nPicEntryNumber);
- } else {
- ASSERT (FALSE); // Unknown decoder !!
- }
-
- return pDecoder;
+ CDXVADecoder* pDecoder = NULL;
+
+ if ((*guidDecoder == DXVA2_ModeH264_E) || (*guidDecoder == DXVA2_ModeH264_F) || (*guidDecoder == DXVA_Intel_H264_ClearVideo)) {
+ pDecoder = DNew CDXVADecoderH264(pFilter, pAMVideoAccelerator, H264_VLD, nPicEntryNumber);
+ } else if (*guidDecoder == DXVA2_ModeVC1_D) {
+ pDecoder = DNew CDXVADecoderVC1(pFilter, pAMVideoAccelerator, VC1_VLD, nPicEntryNumber);
+ } else if (*guidDecoder == DXVA2_ModeMPEG2_VLD) {
+ pDecoder = DNew CDXVADecoderMpeg2(pFilter, pAMVideoAccelerator, MPEG2_VLD, nPicEntryNumber);
+ } else {
+ ASSERT(FALSE); // Unknown decoder !!
+ }
+
+ return pDecoder;
}
-CDXVADecoder* CDXVADecoder::CreateDecoder (CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, const GUID* guidDecoder, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config)
+CDXVADecoder* CDXVADecoder::CreateDecoder(CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, const GUID* guidDecoder, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config)
{
- CDXVADecoder* pDecoder = NULL;
-
- if ((*guidDecoder == DXVA2_ModeH264_E) || (*guidDecoder == DXVA2_ModeH264_F) || (*guidDecoder == DXVA_Intel_H264_ClearVideo)) {
- pDecoder = DNew CDXVADecoderH264 (pFilter, pDirectXVideoDec, H264_VLD, nPicEntryNumber, pDXVA2Config);
- } else if (*guidDecoder == DXVA2_ModeVC1_D) {
- pDecoder = DNew CDXVADecoderVC1 (pFilter, pDirectXVideoDec, VC1_VLD, nPicEntryNumber, pDXVA2Config);
- } else if (*guidDecoder == DXVA2_ModeMPEG2_VLD) {
- pDecoder = DNew CDXVADecoderMpeg2 (pFilter, pDirectXVideoDec, MPEG2_VLD, nPicEntryNumber, pDXVA2Config);
- } else {
- ASSERT (FALSE); // Unknown decoder !!
- }
-
- return pDecoder;
+ CDXVADecoder* pDecoder = NULL;
+
+ if ((*guidDecoder == DXVA2_ModeH264_E) || (*guidDecoder == DXVA2_ModeH264_F) || (*guidDecoder == DXVA_Intel_H264_ClearVideo)) {
+ pDecoder = DNew CDXVADecoderH264(pFilter, pDirectXVideoDec, H264_VLD, nPicEntryNumber, pDXVA2Config);
+ } else if (*guidDecoder == DXVA2_ModeVC1_D) {
+ pDecoder = DNew CDXVADecoderVC1(pFilter, pDirectXVideoDec, VC1_VLD, nPicEntryNumber, pDXVA2Config);
+ } else if (*guidDecoder == DXVA2_ModeMPEG2_VLD) {
+ pDecoder = DNew CDXVADecoderMpeg2(pFilter, pDirectXVideoDec, MPEG2_VLD, nPicEntryNumber, pDXVA2Config);
+ } else {
+ ASSERT(FALSE); // Unknown decoder !!
+ }
+
+ return pDecoder;
}
// === DXVA functions
-HRESULT CDXVADecoder::AddExecuteBuffer (DWORD CompressedBufferType, UINT nSize, void* pBuffer, UINT* pRealSize)
+HRESULT CDXVADecoder::AddExecuteBuffer(DWORD CompressedBufferType, UINT nSize, void* pBuffer, UINT* pRealSize)
{
- HRESULT hr = E_INVALIDARG;
- DWORD dwNumMBs = 0;
- BYTE* pDXVABuffer;
-
- //if (CompressedBufferType != DXVA2_PictureParametersBufferType && CompressedBufferType != DXVA2_InverseQuantizationMatrixBufferType)
- // dwNumMBs = FFGetMBNumber (m_pFilter->GetAVCtx());
-
- switch (m_nEngine) {
- case ENGINE_DXVA1 :
- DWORD dwTypeIndex;
- LONG lStride;
- dwTypeIndex = GetDXVA1CompressedType (CompressedBufferType);
-
- // TRACE ("Fill : %d - %d\n", dwTypeIndex, m_dwBufferIndex);
- hr = m_pAMVideoAccelerator->GetBuffer(dwTypeIndex, m_dwBufferIndex, FALSE, (void**)&pDXVABuffer, &lStride);
- ASSERT (SUCCEEDED (hr));
-
- if (SUCCEEDED (hr)) {
- if (CompressedBufferType == DXVA2_BitStreamDateBufferType) {
- CopyBitstream (pDXVABuffer, (BYTE*)pBuffer, nSize);
- } else {
- memcpy (pDXVABuffer, (BYTE*)pBuffer, nSize);
- }
- m_DXVA1BufferInfo[m_dwNumBuffersInfo].dwTypeIndex = dwTypeIndex;
- m_DXVA1BufferInfo[m_dwNumBuffersInfo].dwBufferIndex = m_dwBufferIndex;
- m_DXVA1BufferInfo[m_dwNumBuffersInfo].dwDataSize = nSize;
-
- m_DXVA1BufferDesc[m_dwNumBuffersInfo].dwTypeIndex = dwTypeIndex;
- m_DXVA1BufferDesc[m_dwNumBuffersInfo].dwBufferIndex = m_dwBufferIndex;
- m_DXVA1BufferDesc[m_dwNumBuffersInfo].dwDataSize = nSize;
- m_DXVA1BufferDesc[m_dwNumBuffersInfo].dwNumMBsInBuffer = dwNumMBs;
-
- m_dwNumBuffersInfo++;
- }
- break;
-
- case ENGINE_DXVA2 :
- UINT nDXVASize;
- hr = m_pDirectXVideoDec->GetBuffer (CompressedBufferType, (void**)&pDXVABuffer, &nDXVASize);
- ASSERT (nSize <= nDXVASize);
-
- if (SUCCEEDED (hr) && (nSize <= nDXVASize)) {
- if (CompressedBufferType == DXVA2_BitStreamDateBufferType) {
- CopyBitstream (pDXVABuffer, (BYTE*)pBuffer, nSize);
- } else {
- memcpy (pDXVABuffer, (BYTE*)pBuffer, nSize);
- }
-
- m_ExecuteParams.pCompressedBuffers[m_ExecuteParams.NumCompBuffers].CompressedBufferType = CompressedBufferType;
- m_ExecuteParams.pCompressedBuffers[m_ExecuteParams.NumCompBuffers].DataSize = nSize;
- m_ExecuteParams.pCompressedBuffers[m_ExecuteParams.NumCompBuffers].NumMBsInBuffer = dwNumMBs;
- m_ExecuteParams.NumCompBuffers++;
-
- }
- break;
- default :
- ASSERT (FALSE);
- break;
- }
- if (pRealSize) {
- *pRealSize = nSize;
- }
-
- return hr;
+ HRESULT hr = E_INVALIDARG;
+ DWORD dwNumMBs = 0;
+ BYTE* pDXVABuffer;
+
+ //if (CompressedBufferType != DXVA2_PictureParametersBufferType && CompressedBufferType != DXVA2_InverseQuantizationMatrixBufferType)
+ // dwNumMBs = FFGetMBNumber (m_pFilter->GetAVCtx());
+
+ switch (m_nEngine) {
+ case ENGINE_DXVA1 :
+ DWORD dwTypeIndex;
+ LONG lStride;
+ dwTypeIndex = GetDXVA1CompressedType(CompressedBufferType);
+
+ // TRACE ("Fill : %d - %d\n", dwTypeIndex, m_dwBufferIndex);
+ hr = m_pAMVideoAccelerator->GetBuffer(dwTypeIndex, m_dwBufferIndex, FALSE, (void**)&pDXVABuffer, &lStride);
+ ASSERT(SUCCEEDED(hr));
+
+ if (SUCCEEDED(hr)) {
+ if (CompressedBufferType == DXVA2_BitStreamDateBufferType) {
+ CopyBitstream(pDXVABuffer, (BYTE*)pBuffer, nSize);
+ } else {
+ memcpy(pDXVABuffer, (BYTE*)pBuffer, nSize);
+ }
+ m_DXVA1BufferInfo[m_dwNumBuffersInfo].dwTypeIndex = dwTypeIndex;
+ m_DXVA1BufferInfo[m_dwNumBuffersInfo].dwBufferIndex = m_dwBufferIndex;
+ m_DXVA1BufferInfo[m_dwNumBuffersInfo].dwDataSize = nSize;
+
+ m_DXVA1BufferDesc[m_dwNumBuffersInfo].dwTypeIndex = dwTypeIndex;
+ m_DXVA1BufferDesc[m_dwNumBuffersInfo].dwBufferIndex = m_dwBufferIndex;
+ m_DXVA1BufferDesc[m_dwNumBuffersInfo].dwDataSize = nSize;
+ m_DXVA1BufferDesc[m_dwNumBuffersInfo].dwNumMBsInBuffer = dwNumMBs;
+
+ m_dwNumBuffersInfo++;
+ }
+ break;
+
+ case ENGINE_DXVA2 :
+ UINT nDXVASize;
+ hr = m_pDirectXVideoDec->GetBuffer(CompressedBufferType, (void**)&pDXVABuffer, &nDXVASize);
+ ASSERT(nSize <= nDXVASize);
+
+ if (SUCCEEDED(hr) && (nSize <= nDXVASize)) {
+ if (CompressedBufferType == DXVA2_BitStreamDateBufferType) {
+ CopyBitstream(pDXVABuffer, (BYTE*)pBuffer, nSize);
+ } else {
+ memcpy(pDXVABuffer, (BYTE*)pBuffer, nSize);
+ }
+
+ m_ExecuteParams.pCompressedBuffers[m_ExecuteParams.NumCompBuffers].CompressedBufferType = CompressedBufferType;
+ m_ExecuteParams.pCompressedBuffers[m_ExecuteParams.NumCompBuffers].DataSize = nSize;
+ m_ExecuteParams.pCompressedBuffers[m_ExecuteParams.NumCompBuffers].NumMBsInBuffer = dwNumMBs;
+ m_ExecuteParams.NumCompBuffers++;
+
+ }
+ break;
+ default :
+ ASSERT(FALSE);
+ break;
+ }
+ if (pRealSize) {
+ *pRealSize = nSize;
+ }
+
+ return hr;
}
HRESULT CDXVADecoder::GetDeliveryBuffer(REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, IMediaSample** ppSampleToDeliver)
{
- HRESULT hr;
- CComPtr<IMediaSample> pNewSample;
-
- // Change aspect ratio for DXVA2
- if (m_nEngine == ENGINE_DXVA2) {
- if (m_bNeedChangeAspect) {
- m_pFilter->UpdateAspectRatio();
- m_pFilter->ReconnectOutput(m_pFilter->PictWidthRounded(), m_pFilter->PictHeightRounded(), true, m_pFilter->PictWidth(), m_pFilter->PictHeight());
- }
- }
- hr = m_pFilter->GetOutputPin()->GetDeliveryBuffer(&pNewSample, 0, 0, 0);
-
- if (SUCCEEDED (hr)) {
- pNewSample->SetTime(&rtStart, &rtStop);
- pNewSample->SetMediaTime(NULL, NULL);
- *ppSampleToDeliver = pNewSample.Detach();
- }
- return hr;
+ HRESULT hr;
+ CComPtr<IMediaSample> pNewSample;
+
+ // Change aspect ratio for DXVA2
+ if (m_nEngine == ENGINE_DXVA2) {
+ if (m_bNeedChangeAspect) {
+ m_pFilter->UpdateAspectRatio();
+ m_pFilter->ReconnectOutput(m_pFilter->PictWidthRounded(), m_pFilter->PictHeightRounded(), true, m_pFilter->PictWidth(), m_pFilter->PictHeight());
+ }
+ }
+ hr = m_pFilter->GetOutputPin()->GetDeliveryBuffer(&pNewSample, 0, 0, 0);
+
+ if (SUCCEEDED(hr)) {
+ pNewSample->SetTime(&rtStart, &rtStop);
+ pNewSample->SetMediaTime(NULL, NULL);
+ *ppSampleToDeliver = pNewSample.Detach();
+ }
+ return hr;
}
HRESULT CDXVADecoder::Execute()
{
- HRESULT hr = E_INVALIDARG;
-
- switch (m_nEngine) {
- case ENGINE_DXVA1 :
- DWORD dwFunction;
- HRESULT hr2;
-
- // writeDXVA_QueryOrReplyFunc (&dwFunction, DXVA_QUERYORREPLYFUNCFLAG_DECODER_LOCK_QUERY, DXVA_PICTURE_DECODING_FUNCTION);
- // hr = m_pAMVideoAccelerator->Execute (dwFunction, &m_DXVA1Config, sizeof(DXVA_ConfigPictureDecode), NULL, 0, m_dwNumBuffersInfo, m_DXVA1BufferInfo);
-
- DWORD dwResult;
- dwFunction = 0x01000000;
- hr = m_pAMVideoAccelerator->Execute (dwFunction, m_DXVA1BufferDesc, sizeof(DXVA_BufferDescription)*m_dwNumBuffersInfo,&dwResult, sizeof(dwResult), m_dwNumBuffersInfo, m_DXVA1BufferInfo);
- ASSERT (SUCCEEDED (hr));
-
- for (DWORD i=0; i<m_dwNumBuffersInfo; i++) {
- hr2 = m_pAMVideoAccelerator->ReleaseBuffer (m_DXVA1BufferInfo[i].dwTypeIndex, m_DXVA1BufferInfo[i].dwBufferIndex);
- ASSERT (SUCCEEDED (hr2));
- }
-
- m_dwNumBuffersInfo = 0;
- break;
- case ENGINE_DXVA2 :
-
- for (DWORD i=0; i<m_ExecuteParams.NumCompBuffers; i++) {
- hr2 = m_pDirectXVideoDec->ReleaseBuffer (m_ExecuteParams.pCompressedBuffers[i].CompressedBufferType);
- ASSERT (SUCCEEDED (hr2));
- }
-
- hr = m_pDirectXVideoDec->Execute(&m_ExecuteParams);
- m_ExecuteParams.NumCompBuffers = 0;
- break;
- default :
- ASSERT (FALSE);
- break;
- }
-
- return hr;
+ HRESULT hr = E_INVALIDARG;
+
+ switch (m_nEngine) {
+ case ENGINE_DXVA1 :
+ DWORD dwFunction;
+ HRESULT hr2;
+
+ // writeDXVA_QueryOrReplyFunc (&dwFunction, DXVA_QUERYORREPLYFUNCFLAG_DECODER_LOCK_QUERY, DXVA_PICTURE_DECODING_FUNCTION);
+ // hr = m_pAMVideoAccelerator->Execute (dwFunction, &m_DXVA1Config, sizeof(DXVA_ConfigPictureDecode), NULL, 0, m_dwNumBuffersInfo, m_DXVA1BufferInfo);
+
+ DWORD dwResult;
+ dwFunction = 0x01000000;
+ hr = m_pAMVideoAccelerator->Execute(dwFunction, m_DXVA1BufferDesc, sizeof(DXVA_BufferDescription) * m_dwNumBuffersInfo, &dwResult, sizeof(dwResult), m_dwNumBuffersInfo, m_DXVA1BufferInfo);
+ ASSERT(SUCCEEDED(hr));
+
+ for (DWORD i = 0; i < m_dwNumBuffersInfo; i++) {
+ hr2 = m_pAMVideoAccelerator->ReleaseBuffer(m_DXVA1BufferInfo[i].dwTypeIndex, m_DXVA1BufferInfo[i].dwBufferIndex);
+ ASSERT(SUCCEEDED(hr2));
+ }
+
+ m_dwNumBuffersInfo = 0;
+ break;
+ case ENGINE_DXVA2 :
+
+ for (DWORD i = 0; i < m_ExecuteParams.NumCompBuffers; i++) {
+ hr2 = m_pDirectXVideoDec->ReleaseBuffer(m_ExecuteParams.pCompressedBuffers[i].CompressedBufferType);
+ ASSERT(SUCCEEDED(hr2));
+ }
+
+ hr = m_pDirectXVideoDec->Execute(&m_ExecuteParams);
+ m_ExecuteParams.NumCompBuffers = 0;
+ break;
+ default :
+ ASSERT(FALSE);
+ break;
+ }
+
+ return hr;
}
HRESULT CDXVADecoder::QueryStatus(PVOID LPDXVAStatus, UINT nSize)
{
- HRESULT hr = E_INVALIDARG;
- DXVA2_DecodeExecuteParams ExecuteParams;
- DXVA2_DecodeExtensionData ExtensionData;
- DWORD dwFunction = 0x07000000;
-
- switch (m_nEngine) {
- case ENGINE_DXVA1 :
- hr = m_pAMVideoAccelerator->Execute (dwFunction, NULL, 0, LPDXVAStatus, nSize, 0, NULL);
- break;
-
- case ENGINE_DXVA2 :
- memset (&ExecuteParams, 0, sizeof(ExecuteParams));
- memset (&ExtensionData, 0, sizeof(ExtensionData));
- ExecuteParams.pExtensionData = &ExtensionData;
- ExtensionData.pPrivateOutputData = LPDXVAStatus;
- ExtensionData.PrivateOutputDataSize = nSize;
- ExtensionData.Function = 7;
- hr = m_pDirectXVideoDec->Execute(&ExecuteParams);
- break;
- default :
- ASSERT (FALSE);
- break;
- }
-
- return hr;
+ HRESULT hr = E_INVALIDARG;
+ DXVA2_DecodeExecuteParams ExecuteParams;
+ DXVA2_DecodeExtensionData ExtensionData;
+ DWORD dwFunction = 0x07000000;
+
+ switch (m_nEngine) {
+ case ENGINE_DXVA1 :
+ hr = m_pAMVideoAccelerator->Execute(dwFunction, NULL, 0, LPDXVAStatus, nSize, 0, NULL);
+ break;
+
+ case ENGINE_DXVA2 :
+ memset(&ExecuteParams, 0, sizeof(ExecuteParams));
+ memset(&ExtensionData, 0, sizeof(ExtensionData));
+ ExecuteParams.pExtensionData = &ExtensionData;
+ ExtensionData.pPrivateOutputData = LPDXVAStatus;
+ ExtensionData.PrivateOutputDataSize = nSize;
+ ExtensionData.Function = 7;
+ hr = m_pDirectXVideoDec->Execute(&ExecuteParams);
+ break;
+ default :
+ ASSERT(FALSE);
+ break;
+ }
+
+ return hr;
}
-DWORD CDXVADecoder::GetDXVA1CompressedType (DWORD dwDXVA2CompressedType)
+DWORD CDXVADecoder::GetDXVA1CompressedType(DWORD dwDXVA2CompressedType)
{
- if (dwDXVA2CompressedType <= DXVA2_BitStreamDateBufferType) {
- return dwDXVA2CompressedType + 1;
- } else {
- switch (dwDXVA2CompressedType) {
- case DXVA2_MotionVectorBuffer :
- return DXVA_MOTION_VECTOR_BUFFER;
- break;
- case DXVA2_FilmGrainBuffer :
- return DXVA_FILM_GRAIN_BUFFER;
- break;
- default :
- ASSERT (FALSE);
- return DXVA_COMPBUFFER_TYPE_THAT_IS_NOT_USED;
- }
- }
+ if (dwDXVA2CompressedType <= DXVA2_BitStreamDateBufferType) {
+ return dwDXVA2CompressedType + 1;
+ } else {
+ switch (dwDXVA2CompressedType) {
+ case DXVA2_MotionVectorBuffer :
+ return DXVA_MOTION_VECTOR_BUFFER;
+ break;
+ case DXVA2_FilmGrainBuffer :
+ return DXVA_FILM_GRAIN_BUFFER;
+ break;
+ default :
+ ASSERT(FALSE);
+ return DXVA_COMPBUFFER_TYPE_THAT_IS_NOT_USED;
+ }
+ }
}
HRESULT CDXVADecoder::FindFreeDXVA1Buffer(DWORD dwTypeIndex, DWORD& dwBufferIndex)
{
- HRESULT hr = E_INVALIDARG;
- int nTry = 0;
+ HRESULT hr = E_INVALIDARG;
+ int nTry = 0;
- dwBufferIndex = 0; //(dwBufferIndex + 1) % m_ComBufferInfo[DXVA_PICTURE_DECODE_BUFFER].dwNumCompBuffers;
- DO_DXVA_PENDING_LOOP (m_pAMVideoAccelerator->QueryRenderStatus ((DWORD)-1, dwBufferIndex, 0));
+ dwBufferIndex = 0; //(dwBufferIndex + 1) % m_ComBufferInfo[DXVA_PICTURE_DECODE_BUFFER].dwNumCompBuffers;
+ DO_DXVA_PENDING_LOOP(m_pAMVideoAccelerator->QueryRenderStatus((DWORD) - 1, dwBufferIndex, 0));
- return hr;
+ return hr;
}
HRESULT CDXVADecoder::BeginFrame(int nSurfaceIndex, IMediaSample* pSampleToDeliver)
{
- HRESULT hr = E_INVALIDARG;
- int nTry = 0;
-
- for (int i=0; i<20; i++) {
- switch (m_nEngine) {
- case ENGINE_DXVA1 :
- AMVABeginFrameInfo BeginFrameInfo;
-
- BeginFrameInfo.dwDestSurfaceIndex = nSurfaceIndex;
- BeginFrameInfo.dwSizeInputData = sizeof(nSurfaceIndex);
- BeginFrameInfo.pInputData = &nSurfaceIndex;
- BeginFrameInfo.dwSizeOutputData = 0;
- BeginFrameInfo.pOutputData = NULL;
-
- DO_DXVA_PENDING_LOOP (m_pAMVideoAccelerator->BeginFrame(&BeginFrameInfo));
-
- ASSERT (SUCCEEDED (hr));
- if (SUCCEEDED (hr)) {
- hr = FindFreeDXVA1Buffer ((DWORD)-1, m_dwBufferIndex);
- }
- break;
-
- case ENGINE_DXVA2 : {
- CComQIPtr<IMFGetService> pSampleService;
- CComPtr<IDirect3DSurface9> pDecoderRenderTarget;
- pSampleService = pSampleToDeliver;
- if (pSampleService) {
- hr = pSampleService->GetService (MR_BUFFER_SERVICE, __uuidof(IDirect3DSurface9), (void**) &pDecoderRenderTarget);
- if (SUCCEEDED (hr)) {
- DO_DXVA_PENDING_LOOP (m_pDirectXVideoDec->BeginFrame(pDecoderRenderTarget, NULL));
- }
- }
- }
- break;
- default :
- ASSERT (FALSE);
- break;
- }
-
- // For slow accelerator wait a little...
- if (SUCCEEDED (hr)) {
- break;
- }
- Sleep(1);
- }
-
- return hr;
+ HRESULT hr = E_INVALIDARG;
+ int nTry = 0;
+
+ for (int i = 0; i < 20; i++) {
+ switch (m_nEngine) {
+ case ENGINE_DXVA1 :
+ AMVABeginFrameInfo BeginFrameInfo;
+
+ BeginFrameInfo.dwDestSurfaceIndex = nSurfaceIndex;
+ BeginFrameInfo.dwSizeInputData = sizeof(nSurfaceIndex);
+ BeginFrameInfo.pInputData = &nSurfaceIndex;
+ BeginFrameInfo.dwSizeOutputData = 0;
+ BeginFrameInfo.pOutputData = NULL;
+
+ DO_DXVA_PENDING_LOOP(m_pAMVideoAccelerator->BeginFrame(&BeginFrameInfo));
+
+ ASSERT(SUCCEEDED(hr));
+ if (SUCCEEDED(hr)) {
+ hr = FindFreeDXVA1Buffer((DWORD) - 1, m_dwBufferIndex);
+ }
+ break;
+
+ case ENGINE_DXVA2 : {
+ CComQIPtr<IMFGetService> pSampleService;
+ CComPtr<IDirect3DSurface9> pDecoderRenderTarget;
+ pSampleService = pSampleToDeliver;
+ if (pSampleService) {
+ hr = pSampleService->GetService(MR_BUFFER_SERVICE, __uuidof(IDirect3DSurface9), (void**) &pDecoderRenderTarget);
+ if (SUCCEEDED(hr)) {
+ DO_DXVA_PENDING_LOOP(m_pDirectXVideoDec->BeginFrame(pDecoderRenderTarget, NULL));
+ }
+ }
+ }
+ break;
+ default :
+ ASSERT(FALSE);
+ break;
+ }
+
+ // For slow accelerator wait a little...
+ if (SUCCEEDED(hr)) {
+ break;
+ }
+ Sleep(1);
+ }
+
+ return hr;
}
HRESULT CDXVADecoder::EndFrame(int nSurfaceIndex)
{
- HRESULT hr = E_INVALIDARG;
- DWORD dwDummy = nSurfaceIndex;
-
- switch (m_nEngine) {
- case ENGINE_DXVA1 :
- AMVAEndFrameInfo EndFrameInfo;
-
- EndFrameInfo.dwSizeMiscData = sizeof (dwDummy); // TODO : usefull ??
- EndFrameInfo.pMiscData = &dwDummy;
- hr = m_pAMVideoAccelerator->EndFrame(&EndFrameInfo);
- ASSERT (SUCCEEDED (hr));
- break;
-
- case ENGINE_DXVA2 :
- hr = m_pDirectXVideoDec->EndFrame(NULL);
- break;
- default :
- ASSERT (FALSE);
- break;
- }
-
- return hr;
+ HRESULT hr = E_INVALIDARG;
+ DWORD dwDummy = nSurfaceIndex;
+
+ switch (m_nEngine) {
+ case ENGINE_DXVA1 :
+ AMVAEndFrameInfo EndFrameInfo;
+
+ EndFrameInfo.dwSizeMiscData = sizeof(dwDummy); // TODO : usefull ??
+ EndFrameInfo.pMiscData = &dwDummy;
+ hr = m_pAMVideoAccelerator->EndFrame(&EndFrameInfo);
+ ASSERT(SUCCEEDED(hr));
+ break;
+
+ case ENGINE_DXVA2 :
+ hr = m_pDirectXVideoDec->EndFrame(NULL);
+ break;
+ default :
+ ASSERT(FALSE);
+ break;
+ }
+
+ return hr;
}
// === Picture store functions
-bool CDXVADecoder::AddToStore (int nSurfaceIndex, IMediaSample* pSample, bool bRefPicture,
- REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, bool bIsField,
- FF_FIELD_TYPE nFieldType, FF_SLICE_TYPE nSliceType, int nCodecSpecific)
+bool CDXVADecoder::AddToStore(int nSurfaceIndex, IMediaSample* pSample, bool bRefPicture,
+ REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, bool bIsField,
+ FF_FIELD_TYPE nFieldType, FF_SLICE_TYPE nSliceType, int nCodecSpecific)
{
- if (bIsField && (m_nFieldSurface == -1)) {
- m_nFieldSurface = nSurfaceIndex;
- m_pFieldSample = pSample;
- m_pPictureStore[nSurfaceIndex].n1FieldType = nFieldType;
- m_pPictureStore[nSurfaceIndex].rtStart = rtStart;
- m_pPictureStore[nSurfaceIndex].rtStop = rtStop;
- m_pPictureStore[nSurfaceIndex].nCodecSpecific = nCodecSpecific;
- return false;
- } else {
- //TRACE ("Add Stor: [%10I64d - %10I64d], Ind = %d, Codec=%d\n", rtStart, rtStop, nSurfaceIndex, nCodecSpecific);
- /*
- ASSERT (m_pPictureStore[nSurfaceIndex].pSample == NULL);
- ASSERT (!m_pPictureStore[nSurfaceIndex].bInUse);
- ASSERT ((nSurfaceIndex < m_nPicEntryNumber) && (m_pPictureStore[nSurfaceIndex].pSample == NULL));
- */
-
- m_pPictureStore[nSurfaceIndex].bRefPicture = bRefPicture;
- m_pPictureStore[nSurfaceIndex].bInUse = true;
- m_pPictureStore[nSurfaceIndex].bDisplayed = false;
- m_pPictureStore[nSurfaceIndex].pSample = pSample;
- m_pPictureStore[nSurfaceIndex].nSliceType = nSliceType;
-
- if (!bIsField) {
- m_pPictureStore[nSurfaceIndex].rtStart = rtStart;
- m_pPictureStore[nSurfaceIndex].rtStop = rtStop;
- m_pPictureStore[nSurfaceIndex].n1FieldType = nFieldType;
- m_pPictureStore[nSurfaceIndex].nCodecSpecific = nCodecSpecific;
- }
-
- m_nFieldSurface = -1;
- m_nWaitingPics++;
- return true;
- }
+ if (bIsField && (m_nFieldSurface == -1)) {
+ m_nFieldSurface = nSurfaceIndex;
+ m_pFieldSample = pSample;
+ m_pPictureStore[nSurfaceIndex].n1FieldType = nFieldType;
+ m_pPictureStore[nSurfaceIndex].rtStart = rtStart;
+ m_pPictureStore[nSurfaceIndex].rtStop = rtStop;
+ m_pPictureStore[nSurfaceIndex].nCodecSpecific = nCodecSpecific;
+ return false;
+ } else {
+ //TRACE ("Add Stor: [%10I64d - %10I64d], Ind = %d, Codec=%d\n", rtStart, rtStop, nSurfaceIndex, nCodecSpecific);
+ /*
+ ASSERT (m_pPictureStore[nSurfaceIndex].pSample == NULL);
+ ASSERT (!m_pPictureStore[nSurfaceIndex].bInUse);
+ ASSERT ((nSurfaceIndex < m_nPicEntryNumber) && (m_pPictureStore[nSurfaceIndex].pSample == NULL));
+ */
+
+ m_pPictureStore[nSurfaceIndex].bRefPicture = bRefPicture;
+ m_pPictureStore[nSurfaceIndex].bInUse = true;
+ m_pPictureStore[nSurfaceIndex].bDisplayed = false;
+ m_pPictureStore[nSurfaceIndex].pSample = pSample;
+ m_pPictureStore[nSurfaceIndex].nSliceType = nSliceType;
+
+ if (!bIsField) {
+ m_pPictureStore[nSurfaceIndex].rtStart = rtStart;
+ m_pPictureStore[nSurfaceIndex].rtStop = rtStop;
+ m_pPictureStore[nSurfaceIndex].n1FieldType = nFieldType;
+ m_pPictureStore[nSurfaceIndex].nCodecSpecific = nCodecSpecific;
+ }
+
+ m_nFieldSurface = -1;
+ m_nWaitingPics++;
+ return true;
+ }
}
-void CDXVADecoder::UpdateStore (int nSurfaceIndex, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop)
+void CDXVADecoder::UpdateStore(int nSurfaceIndex, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop)
{
- ASSERT ((nSurfaceIndex < m_nPicEntryNumber) && m_pPictureStore[nSurfaceIndex].bInUse && !m_pPictureStore[nSurfaceIndex].bDisplayed);
+ ASSERT((nSurfaceIndex < m_nPicEntryNumber) && m_pPictureStore[nSurfaceIndex].bInUse && !m_pPictureStore[nSurfaceIndex].bDisplayed);
- m_pPictureStore[nSurfaceIndex].rtStart = rtStart;
- m_pPictureStore[nSurfaceIndex].rtStop = rtStop;
+ m_pPictureStore[nSurfaceIndex].rtStart = rtStart;
+ m_pPictureStore[nSurfaceIndex].rtStop = rtStop;
}
-void CDXVADecoder::RemoveRefFrame (int nSurfaceIndex)
+void CDXVADecoder::RemoveRefFrame(int nSurfaceIndex)
{
- //ASSERT ((nSurfaceIndex < m_nPicEntryNumber) && m_pPictureStore[nSurfaceIndex].bInUse);
+ //ASSERT ((nSurfaceIndex < m_nPicEntryNumber) && m_pPictureStore[nSurfaceIndex].bInUse);
- m_pPictureStore[nSurfaceIndex].bRefPicture = false;
- if (m_pPictureStore[nSurfaceIndex].bDisplayed) {
- FreePictureSlot (nSurfaceIndex);
- }
+ m_pPictureStore[nSurfaceIndex].bRefPicture = false;
+ if (m_pPictureStore[nSurfaceIndex].bDisplayed) {
+ FreePictureSlot(nSurfaceIndex);
+ }
}
int CDXVADecoder::FindOldestFrame()
{
- REFERENCE_TIME rtMin = _I64_MAX;
- int nPos = -1;
-
- // TODO : find better solution...
- if (m_nWaitingPics > m_nMaxWaiting) {
- for (int i=0; i<m_nPicEntryNumber; i++) {
- if (!m_pPictureStore[i].bDisplayed && m_pPictureStore[i].bInUse && (m_pPictureStore[i].rtStart < rtMin)) {
- rtMin = m_pPictureStore[i].rtStart;
- nPos = i;
- }
- }
- }
- return nPos;
+ REFERENCE_TIME rtMin = _I64_MAX;
+ int nPos = -1;
+
+ // TODO : find better solution...
+ if (m_nWaitingPics > m_nMaxWaiting) {
+ for (int i = 0; i < m_nPicEntryNumber; i++) {
+ if (!m_pPictureStore[i].bDisplayed && m_pPictureStore[i].bInUse && (m_pPictureStore[i].rtStart < rtMin)) {
+ rtMin = m_pPictureStore[i].rtStart;
+ nPos = i;
+ }
+ }
+ }
+ return nPos;
}
void CDXVADecoder::SetTypeSpecificFlags(PICTURE_STORE* pPicture, IMediaSample* pMS)
{
- if (CComQIPtr<IMediaSample2> pMS2 = pMS) {
- AM_SAMPLE2_PROPERTIES props;
- if (SUCCEEDED(pMS2->GetProperties(sizeof(props), (BYTE*)&props))) {
- props.dwTypeSpecificFlags &= ~0x7f;
-
- m_pFilter->SetFrameType(pPicture->n1FieldType);
-
- if (pPicture->n1FieldType == PICT_FRAME) {
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_WEAVE;
- } else if (pPicture->n1FieldType == PICT_TOP_FIELD) {
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_FIELD1FIRST;
- }
-
- switch (pPicture->nSliceType) {
- case I_TYPE :
- case SI_TYPE :
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_I_SAMPLE;
- break;
- case P_TYPE :
- case SP_TYPE :
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_P_SAMPLE;
- break;
- default :
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_B_SAMPLE;
- break;
- }
-
- pMS2->SetProperties(sizeof(props), (BYTE*)&props);
- }
- }
- pMS->SetTime(&pPicture->rtStart, &pPicture->rtStop);
+ if (CComQIPtr<IMediaSample2> pMS2 = pMS) {
+ AM_SAMPLE2_PROPERTIES props;
+ if (SUCCEEDED(pMS2->GetProperties(sizeof(props), (BYTE*)&props))) {
+ props.dwTypeSpecificFlags &= ~0x7f;
+
+ m_pFilter->SetFrameType(pPicture->n1FieldType);
+
+ if (pPicture->n1FieldType == PICT_FRAME) {
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_WEAVE;
+ } else if (pPicture->n1FieldType == PICT_TOP_FIELD) {
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_FIELD1FIRST;
+ }
+
+ switch (pPicture->nSliceType) {
+ case I_TYPE :
+ case SI_TYPE :
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_I_SAMPLE;
+ break;
+ case P_TYPE :
+ case SP_TYPE :
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_P_SAMPLE;
+ break;
+ default :
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_B_SAMPLE;
+ break;
+ }
+
+ pMS2->SetProperties(sizeof(props), (BYTE*)&props);
+ }
+ }
+ pMS->SetTime(&pPicture->rtStart, &pPicture->rtStop);
}
HRESULT CDXVADecoder::DisplayNextFrame()
{
- HRESULT hr = S_FALSE;
- CComPtr<IMediaSample> pSampleToDeliver;
- int nPicIndex = FindOldestFrame();
-
- if (nPicIndex != -1) {
- if (m_pPictureStore[nPicIndex].rtStart >= 0) {
- switch (m_nEngine) {
- case ENGINE_DXVA1 :
- // For DXVA1, query a media sample at the last time (only one in the allocator)
- hr = GetDeliveryBuffer (m_pPictureStore[nPicIndex].rtStart, m_pPictureStore[nPicIndex].rtStop, &pSampleToDeliver);
- SetTypeSpecificFlags(&m_pPictureStore[nPicIndex], pSampleToDeliver);
- if (SUCCEEDED (hr)) {
- hr = m_pAMVideoAccelerator->DisplayFrame(nPicIndex, pSampleToDeliver);
- }
- break;
- case ENGINE_DXVA2 :
- // For DXVA2 media sample is in the picture store
- m_pPictureStore[nPicIndex].pSample->SetTime (&m_pPictureStore[nPicIndex].rtStart, &m_pPictureStore[nPicIndex].rtStop);
- SetTypeSpecificFlags(&m_pPictureStore[nPicIndex], m_pPictureStore[nPicIndex].pSample);
- hr = m_pFilter->GetOutputPin()->Deliver(m_pPictureStore[nPicIndex].pSample);
- break;
- }
+ HRESULT hr = S_FALSE;
+ CComPtr<IMediaSample> pSampleToDeliver;
+ int nPicIndex = FindOldestFrame();
+
+ if (nPicIndex != -1) {
+ if (m_pPictureStore[nPicIndex].rtStart >= 0) {
+ switch (m_nEngine) {
+ case ENGINE_DXVA1 :
+ // For DXVA1, query a media sample at the last time (only one in the allocator)
+ hr = GetDeliveryBuffer(m_pPictureStore[nPicIndex].rtStart, m_pPictureStore[nPicIndex].rtStop, &pSampleToDeliver);
+ SetTypeSpecificFlags(&m_pPictureStore[nPicIndex], pSampleToDeliver);
+ if (SUCCEEDED(hr)) {
+ hr = m_pAMVideoAccelerator->DisplayFrame(nPicIndex, pSampleToDeliver);
+ }
+ break;
+ case ENGINE_DXVA2 :
+ // For DXVA2 media sample is in the picture store
+ m_pPictureStore[nPicIndex].pSample->SetTime(&m_pPictureStore[nPicIndex].rtStart, &m_pPictureStore[nPicIndex].rtStop);
+ SetTypeSpecificFlags(&m_pPictureStore[nPicIndex], m_pPictureStore[nPicIndex].pSample);
+ hr = m_pFilter->GetOutputPin()->Deliver(m_pPictureStore[nPicIndex].pSample);
+ break;
+ }
#if defined(_DEBUG) && 0
- static REFERENCE_TIME rtLast = 0;
- TRACE ("Deliver : %10I64d - %10I64d (Dur = %10I64d) {Delta = %10I64d} Ind = %02d Codec=%d Ref=%d\n",
- m_pPictureStore[nPicIndex].rtStart,
- m_pPictureStore[nPicIndex].rtStop,
- m_pPictureStore[nPicIndex].rtStop - m_pPictureStore[nPicIndex].rtStart,
- m_pPictureStore[nPicIndex].rtStart - rtLast, nPicIndex,
- m_pPictureStore[nPicIndex].nCodecSpecific,
- m_pPictureStore[nPicIndex].bRefPicture);
- rtLast = m_pPictureStore[nPicIndex].rtStart;
+ static REFERENCE_TIME rtLast = 0;
+ TRACE("Deliver : %10I64d - %10I64d (Dur = %10I64d) {Delta = %10I64d} Ind = %02d Codec=%d Ref=%d\n",
+ m_pPictureStore[nPicIndex].rtStart,
+ m_pPictureStore[nPicIndex].rtStop,
+ m_pPictureStore[nPicIndex].rtStop - m_pPictureStore[nPicIndex].rtStart,
+ m_pPictureStore[nPicIndex].rtStart - rtLast, nPicIndex,
+ m_pPictureStore[nPicIndex].nCodecSpecific,
+ m_pPictureStore[nPicIndex].bRefPicture);
+ rtLast = m_pPictureStore[nPicIndex].rtStart;
#endif
- }
- m_bNeedChangeAspect = false;
+ }
+ m_bNeedChangeAspect = false;
- m_pPictureStore[nPicIndex].bDisplayed = true;
- if (!m_pPictureStore[nPicIndex].bRefPicture) {
- FreePictureSlot (nPicIndex);
- }
- }
+ m_pPictureStore[nPicIndex].bDisplayed = true;
+ if (!m_pPictureStore[nPicIndex].bRefPicture) {
+ FreePictureSlot(nPicIndex);
+ }
+ }
- return hr;
+ return hr;
}
HRESULT CDXVADecoder::GetFreeSurfaceIndex(int& nSurfaceIndex, IMediaSample** ppSampleToDeliver, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop)
{
- HRESULT hr = E_UNEXPECTED;
- int nPos = -1;
- DWORD dwMinDisplay = MAXDWORD;
-
- if (m_nFieldSurface != -1) {
- nSurfaceIndex = m_nFieldSurface;
- *ppSampleToDeliver = m_pFieldSample.Detach();
- return S_FALSE;
- }
-
- switch (m_nEngine) {
- case ENGINE_DXVA1 :
- for (int i=0; i<m_nPicEntryNumber; i++) {
- if (!m_pPictureStore[i].bInUse && m_pPictureStore[i].dwDisplayCount < dwMinDisplay) {
- dwMinDisplay = m_pPictureStore[i].dwDisplayCount;
- nPos = i;
- }
- }
-
- if (nPos != -1) {
- nSurfaceIndex = nPos;
- return S_OK;
- }
-
- // Ho ho...
- ASSERT (FALSE);
- Flush();
- break;
- case ENGINE_DXVA2 :
- CComPtr<IMediaSample> pNewSample;
- CComQIPtr<IMPCDXVA2Sample> pMPCDXVA2Sample;
- // TODO : test IDirect3DDeviceManager9::TestDevice !!!
- if (SUCCEEDED (hr = GetDeliveryBuffer(rtStart, rtStop, &pNewSample))) {
- pMPCDXVA2Sample = pNewSample;
- nSurfaceIndex = pMPCDXVA2Sample ? pMPCDXVA2Sample->GetDXSurfaceId() : 0;
- *ppSampleToDeliver = pNewSample.Detach();
- }
- break;
- }
-
- return hr;
+ HRESULT hr = E_UNEXPECTED;
+ int nPos = -1;
+ DWORD dwMinDisplay = MAXDWORD;
+
+ if (m_nFieldSurface != -1) {
+ nSurfaceIndex = m_nFieldSurface;
+ *ppSampleToDeliver = m_pFieldSample.Detach();
+ return S_FALSE;
+ }
+
+ switch (m_nEngine) {
+ case ENGINE_DXVA1 :
+ for (int i = 0; i < m_nPicEntryNumber; i++) {
+ if (!m_pPictureStore[i].bInUse && m_pPictureStore[i].dwDisplayCount < dwMinDisplay) {
+ dwMinDisplay = m_pPictureStore[i].dwDisplayCount;
+ nPos = i;
+ }
+ }
+
+ if (nPos != -1) {
+ nSurfaceIndex = nPos;
+ return S_OK;
+ }
+
+ // Ho ho...
+ ASSERT(FALSE);
+ Flush();
+ break;
+ case ENGINE_DXVA2 :
+ CComPtr<IMediaSample> pNewSample;
+ CComQIPtr<IMPCDXVA2Sample> pMPCDXVA2Sample;
+ // TODO : test IDirect3DDeviceManager9::TestDevice !!!
+ if (SUCCEEDED(hr = GetDeliveryBuffer(rtStart, rtStop, &pNewSample))) {
+ pMPCDXVA2Sample = pNewSample;
+ nSurfaceIndex = pMPCDXVA2Sample ? pMPCDXVA2Sample->GetDXSurfaceId() : 0;
+ *ppSampleToDeliver = pNewSample.Detach();
+ }
+ break;
+ }
+
+ return hr;
}
-void CDXVADecoder::FreePictureSlot (int nSurfaceIndex)
+void CDXVADecoder::FreePictureSlot(int nSurfaceIndex)
{
- m_pPictureStore[nSurfaceIndex].dwDisplayCount = m_dwDisplayCount++;
- m_pPictureStore[nSurfaceIndex].bInUse = false;
- m_pPictureStore[nSurfaceIndex].bDisplayed = false;
- m_pPictureStore[nSurfaceIndex].pSample = NULL;
- m_pPictureStore[nSurfaceIndex].nCodecSpecific = -1;
- m_nWaitingPics--;
+ m_pPictureStore[nSurfaceIndex].dwDisplayCount = m_dwDisplayCount++;
+ m_pPictureStore[nSurfaceIndex].bInUse = false;
+ m_pPictureStore[nSurfaceIndex].bDisplayed = false;
+ m_pPictureStore[nSurfaceIndex].pSample = NULL;
+ m_pPictureStore[nSurfaceIndex].nCodecSpecific = -1;
+ m_nWaitingPics--;
}
BYTE CDXVADecoder::GetConfigResidDiffAccelerator()
{
- switch (m_nEngine) {
- case ENGINE_DXVA1 :
- return m_DXVA1Config.bConfigResidDiffAccelerator;
- case ENGINE_DXVA2 :
- return m_DXVA2Config.ConfigResidDiffAccelerator;
- }
- return 0;
+ switch (m_nEngine) {
+ case ENGINE_DXVA1 :
+ return m_DXVA1Config.bConfigResidDiffAccelerator;
+ case ENGINE_DXVA2 :
+ return m_DXVA2Config.ConfigResidDiffAccelerator;
+ }
+ return 0;
}
BYTE CDXVADecoder::GetConfigIntraResidUnsigned()
{
- switch (m_nEngine) {
- case ENGINE_DXVA1 :
- return m_DXVA1Config.bConfigIntraResidUnsigned;
- case ENGINE_DXVA2 :
- return m_DXVA2Config.ConfigIntraResidUnsigned;
- }
- return 0;
+ switch (m_nEngine) {
+ case ENGINE_DXVA1 :
+ return m_DXVA1Config.bConfigIntraResidUnsigned;
+ case ENGINE_DXVA2 :
+ return m_DXVA2Config.ConfigIntraResidUnsigned;
+ }
+ return 0;
}
void CDXVADecoder::EndOfStream()
{
- CComPtr<IMediaSample> pSampleToDeliver;
-
- for (int nPicIndex=0; nPicIndex<m_nPicEntryNumber; nPicIndex++) {
- if (m_pPictureStore[nPicIndex].bInUse && !m_pPictureStore[nPicIndex].bDisplayed) {
- switch (m_nEngine) {
- // TODO - need check under WinXP on DXVA1
- /*
- case ENGINE_DXVA1 :
- if (SUCCEEDED (GetDeliveryBuffer (m_pPictureStore[nPicIndex].rtStart, m_pPictureStore[nPicIndex].rtStop, &pSampleToDeliver)) && pSampleToDeliver) {
- m_pAMVideoAccelerator->DisplayFrame(nPicIndex, pSampleToDeliver);
- }
- break;
- */
- case ENGINE_DXVA2 :
- SetTypeSpecificFlags(&m_pPictureStore[nPicIndex], m_pPictureStore[nPicIndex].pSample);
- m_pFilter->GetOutputPin()->Deliver(m_pPictureStore[nPicIndex].pSample);
- break;
- }
- }
- }
+ CComPtr<IMediaSample> pSampleToDeliver;
+
+ for (int nPicIndex = 0; nPicIndex < m_nPicEntryNumber; nPicIndex++) {
+ if (m_pPictureStore[nPicIndex].bInUse && !m_pPictureStore[nPicIndex].bDisplayed) {
+ switch (m_nEngine) {
+ // TODO - need check under WinXP on DXVA1
+ /*
+ case ENGINE_DXVA1 :
+ if (SUCCEEDED (GetDeliveryBuffer (m_pPictureStore[nPicIndex].rtStart, m_pPictureStore[nPicIndex].rtStop, &pSampleToDeliver)) && pSampleToDeliver) {
+ m_pAMVideoAccelerator->DisplayFrame(nPicIndex, pSampleToDeliver);
+ }
+ break;
+ */
+ case ENGINE_DXVA2 :
+ SetTypeSpecificFlags(&m_pPictureStore[nPicIndex], m_pPictureStore[nPicIndex].pSample);
+ m_pFilter->GetOutputPin()->Deliver(m_pPictureStore[nPicIndex].pSample);
+ break;
+ }
+ }
+ }
} \ No newline at end of file
diff --git a/src/filters/transform/MPCVideoDec/DXVADecoder.h b/src/filters/transform/MPCVideoDec/DXVADecoder.h
index 53ba320f6..07923ca03 100644
--- a/src/filters/transform/MPCVideoDec/DXVADecoder.h
+++ b/src/filters/transform/MPCVideoDec/DXVADecoder.h
@@ -27,136 +27,136 @@
#include "../../../DSUtil/DSUtil.h"
typedef enum {
- ENGINE_DXVA1,
- ENGINE_DXVA2
+ ENGINE_DXVA1,
+ ENGINE_DXVA2
} DXVA_ENGINE;
typedef enum {
- H264_VLD,
- VC1_VLD,
- MPEG2_VLD
+ H264_VLD,
+ VC1_VLD,
+ MPEG2_VLD
} DXVAMode;
typedef enum {
- I_TYPE = 1, ///< Intra
- P_TYPE = 2, ///< Predicted
- B_TYPE = 3, ///< Bi-dir predicted
- S_TYPE = 4, ///< S(GMC)-VOP MPEG4
- SI_TYPE = 5, ///< Switching Intra
- SP_TYPE = 6, ///< Switching Predicted
- BI_TYPE = 7
+ I_TYPE = 1, ///< Intra
+ P_TYPE = 2, ///< Predicted
+ B_TYPE = 3, ///< Bi-dir predicted
+ S_TYPE = 4, ///< S(GMC)-VOP MPEG4
+ SI_TYPE = 5, ///< Switching Intra
+ SP_TYPE = 6, ///< Switching Predicted
+ BI_TYPE = 7
} FF_SLICE_TYPE;
typedef struct {
- bool bRefPicture; // True if reference picture
- bool bInUse; // Slot in use
- bool bDisplayed; // True if picture have been presented
- CComPtr<IMediaSample> pSample; // Only for DXVA2 !
- REFERENCE_TIME rtStart;
- REFERENCE_TIME rtStop;
- FF_FIELD_TYPE n1FieldType; // Top or bottom for the 1st field
- FF_SLICE_TYPE nSliceType;
- int nCodecSpecific;
- DWORD dwDisplayCount;
+ bool bRefPicture; // True if reference picture
+ bool bInUse; // Slot in use
+ bool bDisplayed; // True if picture have been presented
+ CComPtr<IMediaSample> pSample; // Only for DXVA2 !
+ REFERENCE_TIME rtStart;
+ REFERENCE_TIME rtStop;
+ FF_FIELD_TYPE n1FieldType; // Top or bottom for the 1st field
+ FF_SLICE_TYPE nSliceType;
+ int nCodecSpecific;
+ DWORD dwDisplayCount;
} PICTURE_STORE;
-#define MAX_COM_BUFFER 6 // Max uncompressed buffer for an Execute command (DXVA1)
-#define COMP_BUFFER_COUNT 18
-#define NO_REF_FRAME 0xFFFF
+#define MAX_COM_BUFFER 6 // Max uncompressed buffer for an Execute command (DXVA1)
+#define COMP_BUFFER_COUNT 18
+#define NO_REF_FRAME 0xFFFF
class CMPCVideoDecFilter;
class CDXVADecoder
{
public :
- // === Public functions
- virtual ~CDXVADecoder();
- DXVAMode GetMode() const {
- return m_nMode;
- };
- DXVA_ENGINE GetEngine() const {
- return m_nEngine;
- };
- void AllocExecuteParams (int nSize);
- void SetDirectXVideoDec (IDirectXVideoDecoder* pDirectXVideoDec) {
- m_pDirectXVideoDec = pDirectXVideoDec;
- };
-
- virtual HRESULT DecodeFrame (BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop) = NULL;
- virtual void SetExtraData (BYTE* pDataIn, UINT nSize);
- virtual void CopyBitstream(BYTE* pDXVABuffer, BYTE* pBuffer, UINT& nSize);
- virtual void Flush();
- HRESULT ConfigureDXVA1();
-
- static CDXVADecoder* CreateDecoder (CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, const GUID* guidDecoder, int nPicEntryNumber);
- static CDXVADecoder* CreateDecoder (CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, const GUID* guidDecoder, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config);
-
- void EndOfStream();
+ // === Public functions
+ virtual ~CDXVADecoder();
+ DXVAMode GetMode() const {
+ return m_nMode;
+ };
+ DXVA_ENGINE GetEngine() const {
+ return m_nEngine;
+ };
+ void AllocExecuteParams(int nSize);
+ void SetDirectXVideoDec(IDirectXVideoDecoder* pDirectXVideoDec) {
+ m_pDirectXVideoDec = pDirectXVideoDec;
+ };
+
+ virtual HRESULT DecodeFrame(BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop) = NULL;
+ virtual void SetExtraData(BYTE* pDataIn, UINT nSize);
+ virtual void CopyBitstream(BYTE* pDXVABuffer, BYTE* pBuffer, UINT& nSize);
+ virtual void Flush();
+ HRESULT ConfigureDXVA1();
+
+ static CDXVADecoder* CreateDecoder(CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, const GUID* guidDecoder, int nPicEntryNumber);
+ static CDXVADecoder* CreateDecoder(CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, const GUID* guidDecoder, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config);
+
+ void EndOfStream();
protected :
- CDXVADecoder (CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber);
- CDXVADecoder (CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config);
-
- CMPCVideoDecFilter* m_pFilter;
- bool m_bFlushed;
- int m_nMaxWaiting;
-
- PICTURE_STORE* m_pPictureStore; // Store reference picture, and delayed B-frames
- int m_nPicEntryNumber; // Total number of picture in store
- int m_nWaitingPics; // Number of picture not yet displayed
-
- bool m_bNeedChangeAspect;
-
- // === DXVA functions
- HRESULT AddExecuteBuffer (DWORD CompressedBufferType, UINT nSize, void* pBuffer, UINT* pRealSize = NULL);
- HRESULT GetDeliveryBuffer(REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, IMediaSample** ppSampleToDeliver);
- HRESULT Execute();
- DWORD GetDXVA1CompressedType (DWORD dwDXVA2CompressedType);
- HRESULT FindFreeDXVA1Buffer(DWORD dwTypeIndex, DWORD& dwBufferIndex);
- HRESULT BeginFrame(int nSurfaceIndex, IMediaSample* pSampleToDeliver);
- HRESULT EndFrame(int nSurfaceIndex);
- HRESULT QueryStatus(PVOID LPDXVAStatus, UINT nSize);
- BYTE GetConfigIntraResidUnsigned();
- BYTE GetConfigResidDiffAccelerator();
- DXVA_ConfigPictureDecode* GetDXVA1Config() {
- return &m_DXVA1Config;
- };
- DXVA2_ConfigPictureDecode* GetDXVA2Config() {
- return &m_DXVA2Config;
- };
-
- // === Picture store functions
- bool AddToStore (int nSurfaceIndex, IMediaSample* pSample, bool bRefPicture, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, bool bIsField, FF_FIELD_TYPE nFieldType, FF_SLICE_TYPE nSliceType, int nCodecSpecific);
- void UpdateStore (int nSurfaceIndex, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop);
- void RemoveRefFrame (int nSurfaceIndex);
- HRESULT DisplayNextFrame();
- HRESULT GetFreeSurfaceIndex(int& nSurfaceIndex, IMediaSample** ppSampleToDeliver, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop);
- virtual int FindOldestFrame();
+ CDXVADecoder(CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber);
+ CDXVADecoder(CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config);
+
+ CMPCVideoDecFilter* m_pFilter;
+ bool m_bFlushed;
+ int m_nMaxWaiting;
+
+ PICTURE_STORE* m_pPictureStore; // Store reference picture, and delayed B-frames
+ int m_nPicEntryNumber; // Total number of picture in store
+ int m_nWaitingPics; // Number of picture not yet displayed
+
+ bool m_bNeedChangeAspect;
+
+ // === DXVA functions
+ HRESULT AddExecuteBuffer(DWORD CompressedBufferType, UINT nSize, void* pBuffer, UINT* pRealSize = NULL);
+ HRESULT GetDeliveryBuffer(REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, IMediaSample** ppSampleToDeliver);
+ HRESULT Execute();
+ DWORD GetDXVA1CompressedType(DWORD dwDXVA2CompressedType);
+ HRESULT FindFreeDXVA1Buffer(DWORD dwTypeIndex, DWORD& dwBufferIndex);
+ HRESULT BeginFrame(int nSurfaceIndex, IMediaSample* pSampleToDeliver);
+ HRESULT EndFrame(int nSurfaceIndex);
+ HRESULT QueryStatus(PVOID LPDXVAStatus, UINT nSize);
+ BYTE GetConfigIntraResidUnsigned();
+ BYTE GetConfigResidDiffAccelerator();
+ DXVA_ConfigPictureDecode* GetDXVA1Config() {
+ return &m_DXVA1Config;
+ };
+ DXVA2_ConfigPictureDecode* GetDXVA2Config() {
+ return &m_DXVA2Config;
+ };
+
+ // === Picture store functions
+ bool AddToStore(int nSurfaceIndex, IMediaSample* pSample, bool bRefPicture, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, bool bIsField, FF_FIELD_TYPE nFieldType, FF_SLICE_TYPE nSliceType, int nCodecSpecific);
+ void UpdateStore(int nSurfaceIndex, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop);
+ void RemoveRefFrame(int nSurfaceIndex);
+ HRESULT DisplayNextFrame();
+ HRESULT GetFreeSurfaceIndex(int& nSurfaceIndex, IMediaSample** ppSampleToDeliver, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop);
+ virtual int FindOldestFrame();
private :
- DXVAMode m_nMode;
- DXVA_ENGINE m_nEngine;
-
- CComPtr<IMediaSample> m_pFieldSample;
- int m_nFieldSurface;
-
- // === DXVA1 variables
- CComQIPtr<IAMVideoAccelerator> m_pAMVideoAccelerator;
- AMVABUFFERINFO m_DXVA1BufferInfo[MAX_COM_BUFFER];
- DXVA_BufferDescription m_DXVA1BufferDesc[MAX_COM_BUFFER];
- DWORD m_dwNumBuffersInfo;
- DXVA_ConfigPictureDecode m_DXVA1Config;
- AMVACompBufferInfo m_ComBufferInfo[COMP_BUFFER_COUNT];
- DWORD m_dwBufferIndex;
- DWORD m_dwDisplayCount;
-
- // === DXVA2 variables
- CComPtr<IDirectXVideoDecoder> m_pDirectXVideoDec;
- DXVA2_ConfigPictureDecode m_DXVA2Config;
- DXVA2_DecodeExecuteParams m_ExecuteParams;
-
- void Init(CMPCVideoDecFilter* pFilter, DXVAMode nMode, int nPicEntryNumber);
- void FreePictureSlot (int nSurfaceIndex);
- void SetTypeSpecificFlags(PICTURE_STORE* pPicture, IMediaSample* pMS);
+ DXVAMode m_nMode;
+ DXVA_ENGINE m_nEngine;
+
+ CComPtr<IMediaSample> m_pFieldSample;
+ int m_nFieldSurface;
+
+ // === DXVA1 variables
+ CComQIPtr<IAMVideoAccelerator> m_pAMVideoAccelerator;
+ AMVABUFFERINFO m_DXVA1BufferInfo[MAX_COM_BUFFER];
+ DXVA_BufferDescription m_DXVA1BufferDesc[MAX_COM_BUFFER];
+ DWORD m_dwNumBuffersInfo;
+ DXVA_ConfigPictureDecode m_DXVA1Config;
+ AMVACompBufferInfo m_ComBufferInfo[COMP_BUFFER_COUNT];
+ DWORD m_dwBufferIndex;
+ DWORD m_dwDisplayCount;
+
+ // === DXVA2 variables
+ CComPtr<IDirectXVideoDecoder> m_pDirectXVideoDec;
+ DXVA2_ConfigPictureDecode m_DXVA2Config;
+ DXVA2_DecodeExecuteParams m_ExecuteParams;
+
+ void Init(CMPCVideoDecFilter* pFilter, DXVAMode nMode, int nPicEntryNumber);
+ void FreePictureSlot(int nSurfaceIndex);
+ void SetTypeSpecificFlags(PICTURE_STORE* pPicture, IMediaSample* pMS);
};
diff --git a/src/filters/transform/MPCVideoDec/DXVADecoderH264.cpp b/src/filters/transform/MPCVideoDec/DXVADecoderH264.cpp
index 4e7fb9e17..e6d2a5e0c 100644
--- a/src/filters/transform/MPCVideoDec/DXVADecoderH264.cpp
+++ b/src/filters/transform/MPCVideoDec/DXVADecoderH264.cpp
@@ -35,18 +35,18 @@
#define TRACE_H264(...)
#endif
-CDXVADecoderH264::CDXVADecoderH264 (CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber)
- : CDXVADecoder (pFilter, pAMVideoAccelerator, nMode, nPicEntryNumber)
+CDXVADecoderH264::CDXVADecoderH264(CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber)
+ : CDXVADecoder(pFilter, pAMVideoAccelerator, nMode, nPicEntryNumber)
{
- m_bUseLongSlice = (GetDXVA1Config()->bConfigBitstreamRaw != 2);
- Init();
+ m_bUseLongSlice = (GetDXVA1Config()->bConfigBitstreamRaw != 2);
+ Init();
}
-CDXVADecoderH264::CDXVADecoderH264 (CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config)
- : CDXVADecoder (pFilter, pDirectXVideoDec, nMode, nPicEntryNumber, pDXVA2Config)
+CDXVADecoderH264::CDXVADecoderH264(CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config)
+ : CDXVADecoder(pFilter, pDirectXVideoDec, nMode, nPicEntryNumber, pDXVA2Config)
{
- m_bUseLongSlice = (m_pFilter->GetDXVA2Config()->ConfigBitstreamRaw != 2);
- Init();
+ m_bUseLongSlice = (m_pFilter->GetDXVA2Config()->ConfigBitstreamRaw != 2);
+ Init();
}
CDXVADecoderH264::~CDXVADecoderH264()
@@ -55,337 +55,338 @@ CDXVADecoderH264::~CDXVADecoderH264()
void CDXVADecoderH264::Init()
{
- memset (&m_DXVAPicParams, 0, sizeof (m_DXVAPicParams));
- memset (&m_DXVAPicParams, 0, sizeof (DXVA_PicParams_H264));
- memset (&m_pSliceLong, 0, sizeof (DXVA_Slice_H264_Long) *MAX_SLICES);
- memset (&m_pSliceShort, 0, sizeof (DXVA_Slice_H264_Short)*MAX_SLICES);
-
- m_DXVAPicParams.MbsConsecutiveFlag = 1;
- if (m_pFilter->GetPCIVendor() == PCIV_Intel) {
- m_DXVAPicParams.Reserved16Bits = 0x534c;
- } else {
- m_DXVAPicParams.Reserved16Bits = 0;
- }
- m_DXVAPicParams.ContinuationFlag = 1;
- m_DXVAPicParams.Reserved8BitsA = 0;
- m_DXVAPicParams.Reserved8BitsB = 0;
- m_DXVAPicParams.MinLumaBipredSize8x8Flag = 1; // Improve accelerator performances
- m_DXVAPicParams.StatusReportFeedbackNumber = 0; // Use to report status
-
- for (int i =0; i<16; i++) {
- m_DXVAPicParams.RefFrameList[i].AssociatedFlag = 1;
- m_DXVAPicParams.RefFrameList[i].bPicEntry = 255;
- m_DXVAPicParams.RefFrameList[i].Index7Bits = 127;
- }
-
-
- m_nNALLength = 4;
- m_nMaxSlices = 0;
-
- switch (GetMode()) {
- case H264_VLD :
- AllocExecuteParams (3);
- break;
- default :
- ASSERT(FALSE);
- }
+ memset(&m_DXVAPicParams, 0, sizeof(m_DXVAPicParams));
+ memset(&m_DXVAPicParams, 0, sizeof(DXVA_PicParams_H264));
+ memset(&m_pSliceLong, 0, sizeof(DXVA_Slice_H264_Long) *MAX_SLICES);
+ memset(&m_pSliceShort, 0, sizeof(DXVA_Slice_H264_Short)*MAX_SLICES);
+
+ m_DXVAPicParams.MbsConsecutiveFlag = 1;
+ if (m_pFilter->GetPCIVendor() == PCIV_Intel) {
+ m_DXVAPicParams.Reserved16Bits = 0x534c;
+ } else {
+ m_DXVAPicParams.Reserved16Bits = 0;
+ }
+ m_DXVAPicParams.ContinuationFlag = 1;
+ m_DXVAPicParams.Reserved8BitsA = 0;
+ m_DXVAPicParams.Reserved8BitsB = 0;
+ m_DXVAPicParams.MinLumaBipredSize8x8Flag = 1; // Improve accelerator performances
+ m_DXVAPicParams.StatusReportFeedbackNumber = 0; // Use to report status
+
+ for (int i = 0; i < 16; i++) {
+ m_DXVAPicParams.RefFrameList[i].AssociatedFlag = 1;
+ m_DXVAPicParams.RefFrameList[i].bPicEntry = 255;
+ m_DXVAPicParams.RefFrameList[i].Index7Bits = 127;
+ }
+
+
+ m_nNALLength = 4;
+ m_nMaxSlices = 0;
+
+ switch (GetMode()) {
+ case H264_VLD :
+ AllocExecuteParams(3);
+ break;
+ default :
+ ASSERT(FALSE);
+ }
}
void CDXVADecoderH264::CopyBitstream(BYTE* pDXVABuffer, BYTE* pBuffer, UINT& nSize)
{
- CH264Nalu Nalu;
- int nDummy;
- int nSlices = 0;
- UINT m_nSize = nSize;
- int slice_step = 1;
- int nDxvaNalLength;
-
- while (!nSlices && slice_step <= 2) {
- Nalu.SetBuffer (pBuffer, m_nSize, slice_step == 1 ? m_nNALLength : 0);
- nSize = 0;
- while (Nalu.ReadNext()) {
- switch (Nalu.GetType()) {
- case NALU_TYPE_SLICE:
- case NALU_TYPE_IDR:
- // Skip the NALU if the data length is below 0
- if (Nalu.GetDataLength() < 0) {
- break;
- }
-
- // For AVC1, put startcode 0x000001
- pDXVABuffer[0]=pDXVABuffer[1]=0; pDXVABuffer[2]=1;
- if (Nalu.GetDataLength() < 0)
- break;
-
- // Copy NALU
- __try {
- memcpy (pDXVABuffer+3, Nalu.GetDataBuffer(), Nalu.GetDataLength());
- } __except (EXCEPTION_EXECUTE_HANDLER) { break; }
-
- // Update slice control buffer
- nDxvaNalLength = Nalu.GetDataLength()+3;
- m_pSliceShort[nSlices].BSNALunitDataLocation = nSize;
- m_pSliceShort[nSlices].SliceBytesInBuffer = nDxvaNalLength;
-
- nSize += nDxvaNalLength;
- pDXVABuffer += nDxvaNalLength;
- nSlices++;
- break;
- }
- }
- slice_step++;
- }
-
- // Complete with zero padding (buffer size should be a multiple of 128)
- nDummy = 128 - (nSize %128);
-
- memset (pDXVABuffer, 0, nDummy);
- m_pSliceShort[nSlices-1].SliceBytesInBuffer += nDummy;
- nSize += nDummy;
+ CH264Nalu Nalu;
+ int nDummy;
+ int nSlices = 0;
+ UINT m_nSize = nSize;
+ int slice_step = 1;
+ int nDxvaNalLength;
+
+ while (!nSlices && slice_step <= 2) {
+ Nalu.SetBuffer(pBuffer, m_nSize, slice_step == 1 ? m_nNALLength : 0);
+ nSize = 0;
+ while (Nalu.ReadNext()) {
+ switch (Nalu.GetType()) {
+ case NALU_TYPE_SLICE:
+ case NALU_TYPE_IDR:
+ // Skip the NALU if the data length is below 0
+ if (Nalu.GetDataLength() < 0) {
+ break;
+ }
+
+ // For AVC1, put startcode 0x000001
+ pDXVABuffer[0] = pDXVABuffer[1] = 0; pDXVABuffer[2] = 1;
+ if (Nalu.GetDataLength() < 0) {
+ break;
+ }
+
+ // Copy NALU
+ __try {
+ memcpy(pDXVABuffer + 3, Nalu.GetDataBuffer(), Nalu.GetDataLength());
+ } __except (EXCEPTION_EXECUTE_HANDLER) { break; }
+
+ // Update slice control buffer
+ nDxvaNalLength = Nalu.GetDataLength() + 3;
+ m_pSliceShort[nSlices].BSNALunitDataLocation = nSize;
+ m_pSliceShort[nSlices].SliceBytesInBuffer = nDxvaNalLength;
+
+ nSize += nDxvaNalLength;
+ pDXVABuffer += nDxvaNalLength;
+ nSlices++;
+ break;
+ }
+ }
+ slice_step++;
+ }
+
+ // Complete with zero padding (buffer size should be a multiple of 128)
+ nDummy = 128 - (nSize % 128);
+
+ memset(pDXVABuffer, 0, nDummy);
+ m_pSliceShort[nSlices - 1].SliceBytesInBuffer += nDummy;
+ nSize += nDummy;
}
void CDXVADecoderH264::Flush()
{
- ClearRefFramesList();
- m_DXVAPicParams.UsedForReferenceFlags = 0;
- m_nOutPOC = INT_MIN;
- m_nPrevOutPOC = INT_MIN;
+ ClearRefFramesList();
+ m_DXVAPicParams.UsedForReferenceFlags = 0;
+ m_nOutPOC = INT_MIN;
+ m_nPrevOutPOC = INT_MIN;
- m_nfield_pic_flag = 1;
- m_nRefPicFlag = 1;
- m_nBrokenFramesFlag = 0;
- m_nBrokenFramesFlag_POC = 0;
+ m_nfield_pic_flag = 1;
+ m_nRefPicFlag = 1;
+ m_nBrokenFramesFlag = 0;
+ m_nBrokenFramesFlag_POC = 0;
- __super::Flush();
+ __super::Flush();
}
-HRESULT CDXVADecoderH264::DecodeFrame (BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop)
+HRESULT CDXVADecoderH264::DecodeFrame(BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop)
{
- HRESULT hr = S_FALSE;
- UINT nSlices = 0;
- int nSurfaceIndex = -1;
- int nFieldType = -1;
- int nSliceType = -1;
- int nFramePOC = INT_MIN;
- int nOutPOC = INT_MIN;
- REFERENCE_TIME rtOutStart = _I64_MIN;
- CH264Nalu Nalu;
- UINT nNalOffset = 0;
- CComPtr<IMediaSample> pSampleToDeliver;
- CComQIPtr<IMPCDXVA2Sample> pDXVA2Sample;
- int slice_step = 1;
-
- if (FFH264DecodeBuffer (m_pFilter->GetAVCtx(), pDataIn, nSize, &nFramePOC, &nOutPOC, &rtOutStart) == -1) {
- return S_FALSE;
- }
-
- while (!nSlices && slice_step <= 2) {
- Nalu.SetBuffer (pDataIn, nSize, slice_step == 1 ? m_nNALLength : 0);
- while (Nalu.ReadNext()) {
- switch (Nalu.GetType()) {
- case NALU_TYPE_SLICE:
- case NALU_TYPE_IDR:
- if (m_bUseLongSlice) {
- m_pSliceLong[nSlices].BSNALunitDataLocation = nNalOffset;
- m_pSliceLong[nSlices].SliceBytesInBuffer = Nalu.GetDataLength()+3; //.GetRoundedDataLength();
- m_pSliceLong[nSlices].slice_id = nSlices;
- FF264UpdateRefFrameSliceLong(&m_DXVAPicParams, &m_pSliceLong[nSlices], m_pFilter->GetAVCtx());
-
- if (nSlices>0) {
- m_pSliceLong[nSlices-1].NumMbsForSlice = m_pSliceLong[nSlices].NumMbsForSlice = m_pSliceLong[nSlices].first_mb_in_slice - m_pSliceLong[nSlices-1].first_mb_in_slice;
- }
- }
- nSlices++;
- nNalOffset += (UINT)(Nalu.GetDataLength() + 3);
- if (nSlices > MAX_SLICES) {
- break;
- }
- break;
- }
- }
- slice_step++;
- }
-
- if (!nSlices) {
- return S_FALSE;
- }
-
- m_nMaxWaiting = min (max (m_DXVAPicParams.num_ref_frames, 3), 8);
-
- // If parsing fail (probably no PPS/SPS), continue anyway it may arrived later (happen on truncated streams)
- if (FAILED (FFH264BuildPicParams (&m_DXVAPicParams, &m_DXVAScalingMatrix, &nFieldType, &nSliceType, m_pFilter->GetAVCtx(), m_pFilter->GetPCIVendor()))) {
- return S_FALSE;
- }
-
- TRACE_H264 ("CDXVADecoderH264::DecodeFrame() : nFramePOC = %11d, nOutPOC = %11d[%11d], [%d - %d], rtOutStart = [%20I64d]\n", nFramePOC, nOutPOC, m_nOutPOC, m_DXVAPicParams.field_pic_flag, m_DXVAPicParams.RefPicFlag, rtOutStart);
-
- // Wait I frame after a flush
- if (m_bFlushed && !m_DXVAPicParams.IntraPicFlag) {
- TRACE_H264 ("CDXVADecoderH264::DecodeFrame() : Flush - wait I frame\n");
- m_nBrokenFramesFlag = 0;
- m_nBrokenFramesFlag_POC = 0;
- m_nfield_pic_flag = m_DXVAPicParams.field_pic_flag;
- m_nRefPicFlag = m_DXVAPicParams.RefPicFlag;
- m_nPrevOutPOC = INT_MIN;
- return S_FALSE;
- }
-
- // Some magic code for detecting the incorrect decoding of interlaced frames ...
- // TODO : necessary to make it better, and preferably on the side of ffmpeg ...
- if (m_nfield_pic_flag && m_nfield_pic_flag == m_DXVAPicParams.field_pic_flag && m_nRefPicFlag == m_DXVAPicParams.RefPicFlag) {
- if (m_nPrevOutPOC == m_nOutPOC && m_nOutPOC == INT_MIN) {
- m_nBrokenFramesFlag_POC++;
- }
- m_nBrokenFramesFlag++;
- } else {
- m_nBrokenFramesFlag = 0;
- m_nBrokenFramesFlag_POC = 0;
- }
- m_nfield_pic_flag = m_DXVAPicParams.field_pic_flag;
- m_nRefPicFlag = m_DXVAPicParams.RefPicFlag;
- m_nPrevOutPOC = m_nOutPOC;
-
- if (m_nBrokenFramesFlag > 4) {
- m_nBrokenFramesFlag = 0;
- if (m_nBrokenFramesFlag_POC > 1) {
- TRACE_H264 ("CDXVADecoderH264::DecodeFrame() : Detected broken frames ... flush data\n");
- m_nBrokenFramesFlag_POC = 0;
- Flush();
- return S_FALSE;
- }
- }
- //
-
- CHECK_HR (GetFreeSurfaceIndex (nSurfaceIndex, &pSampleToDeliver, rtStart, rtStop));
- FFH264SetCurrentPicture (nSurfaceIndex, &m_DXVAPicParams, m_pFilter->GetAVCtx());
-
- CHECK_HR (BeginFrame(nSurfaceIndex, pSampleToDeliver));
-
- m_DXVAPicParams.StatusReportFeedbackNumber++;
-
- // Send picture parameters
- CHECK_HR (AddExecuteBuffer (DXVA2_PictureParametersBufferType, sizeof(m_DXVAPicParams), &m_DXVAPicParams));
- CHECK_HR (Execute());
-
- // Add bitstream, slice control and quantization matrix
- CHECK_HR (AddExecuteBuffer (DXVA2_BitStreamDateBufferType, nSize, pDataIn, &nSize));
-
- if (m_bUseLongSlice) {
- CHECK_HR(AddExecuteBuffer(DXVA2_SliceControlBufferType, sizeof(DXVA_Slice_H264_Long)*nSlices, m_pSliceLong));
- } else {
- CHECK_HR (AddExecuteBuffer (DXVA2_SliceControlBufferType, sizeof (DXVA_Slice_H264_Short)*nSlices, m_pSliceShort));
- }
-
- CHECK_HR (AddExecuteBuffer (DXVA2_InverseQuantizationMatrixBufferType, sizeof (DXVA_Qmatrix_H264), (void*)&m_DXVAScalingMatrix));
-
- // Decode bitstream
- CHECK_HR (Execute());
-
- CHECK_HR (EndFrame(nSurfaceIndex));
+ HRESULT hr = S_FALSE;
+ UINT nSlices = 0;
+ int nSurfaceIndex = -1;
+ int nFieldType = -1;
+ int nSliceType = -1;
+ int nFramePOC = INT_MIN;
+ int nOutPOC = INT_MIN;
+ REFERENCE_TIME rtOutStart = _I64_MIN;
+ CH264Nalu Nalu;
+ UINT nNalOffset = 0;
+ CComPtr<IMediaSample> pSampleToDeliver;
+ CComQIPtr<IMPCDXVA2Sample> pDXVA2Sample;
+ int slice_step = 1;
+
+ if (FFH264DecodeBuffer(m_pFilter->GetAVCtx(), pDataIn, nSize, &nFramePOC, &nOutPOC, &rtOutStart) == -1) {
+ return S_FALSE;
+ }
+
+ while (!nSlices && slice_step <= 2) {
+ Nalu.SetBuffer(pDataIn, nSize, slice_step == 1 ? m_nNALLength : 0);
+ while (Nalu.ReadNext()) {
+ switch (Nalu.GetType()) {
+ case NALU_TYPE_SLICE:
+ case NALU_TYPE_IDR:
+ if (m_bUseLongSlice) {
+ m_pSliceLong[nSlices].BSNALunitDataLocation = nNalOffset;
+ m_pSliceLong[nSlices].SliceBytesInBuffer = Nalu.GetDataLength() + 3; //.GetRoundedDataLength();
+ m_pSliceLong[nSlices].slice_id = nSlices;
+ FF264UpdateRefFrameSliceLong(&m_DXVAPicParams, &m_pSliceLong[nSlices], m_pFilter->GetAVCtx());
+
+ if (nSlices > 0) {
+ m_pSliceLong[nSlices - 1].NumMbsForSlice = m_pSliceLong[nSlices].NumMbsForSlice = m_pSliceLong[nSlices].first_mb_in_slice - m_pSliceLong[nSlices - 1].first_mb_in_slice;
+ }
+ }
+ nSlices++;
+ nNalOffset += (UINT)(Nalu.GetDataLength() + 3);
+ if (nSlices > MAX_SLICES) {
+ break;
+ }
+ break;
+ }
+ }
+ slice_step++;
+ }
+
+ if (!nSlices) {
+ return S_FALSE;
+ }
+
+ m_nMaxWaiting = min(max(m_DXVAPicParams.num_ref_frames, 3), 8);
+
+ // If parsing fail (probably no PPS/SPS), continue anyway it may arrived later (happen on truncated streams)
+ if (FAILED(FFH264BuildPicParams(&m_DXVAPicParams, &m_DXVAScalingMatrix, &nFieldType, &nSliceType, m_pFilter->GetAVCtx(), m_pFilter->GetPCIVendor()))) {
+ return S_FALSE;
+ }
+
+ TRACE_H264("CDXVADecoderH264::DecodeFrame() : nFramePOC = %11d, nOutPOC = %11d[%11d], [%d - %d], rtOutStart = [%20I64d]\n", nFramePOC, nOutPOC, m_nOutPOC, m_DXVAPicParams.field_pic_flag, m_DXVAPicParams.RefPicFlag, rtOutStart);
+
+ // Wait I frame after a flush
+ if (m_bFlushed && !m_DXVAPicParams.IntraPicFlag) {
+ TRACE_H264("CDXVADecoderH264::DecodeFrame() : Flush - wait I frame\n");
+ m_nBrokenFramesFlag = 0;
+ m_nBrokenFramesFlag_POC = 0;
+ m_nfield_pic_flag = m_DXVAPicParams.field_pic_flag;
+ m_nRefPicFlag = m_DXVAPicParams.RefPicFlag;
+ m_nPrevOutPOC = INT_MIN;
+ return S_FALSE;
+ }
+
+ // Some magic code for detecting the incorrect decoding of interlaced frames ...
+ // TODO : necessary to make it better, and preferably on the side of ffmpeg ...
+ if (m_nfield_pic_flag && m_nfield_pic_flag == m_DXVAPicParams.field_pic_flag && m_nRefPicFlag == m_DXVAPicParams.RefPicFlag) {
+ if (m_nPrevOutPOC == m_nOutPOC && m_nOutPOC == INT_MIN) {
+ m_nBrokenFramesFlag_POC++;
+ }
+ m_nBrokenFramesFlag++;
+ } else {
+ m_nBrokenFramesFlag = 0;
+ m_nBrokenFramesFlag_POC = 0;
+ }
+ m_nfield_pic_flag = m_DXVAPicParams.field_pic_flag;
+ m_nRefPicFlag = m_DXVAPicParams.RefPicFlag;
+ m_nPrevOutPOC = m_nOutPOC;
+
+ if (m_nBrokenFramesFlag > 4) {
+ m_nBrokenFramesFlag = 0;
+ if (m_nBrokenFramesFlag_POC > 1) {
+ TRACE_H264("CDXVADecoderH264::DecodeFrame() : Detected broken frames ... flush data\n");
+ m_nBrokenFramesFlag_POC = 0;
+ Flush();
+ return S_FALSE;
+ }
+ }
+ //
+
+ CHECK_HR(GetFreeSurfaceIndex(nSurfaceIndex, &pSampleToDeliver, rtStart, rtStop));
+ FFH264SetCurrentPicture(nSurfaceIndex, &m_DXVAPicParams, m_pFilter->GetAVCtx());
+
+ CHECK_HR(BeginFrame(nSurfaceIndex, pSampleToDeliver));
+
+ m_DXVAPicParams.StatusReportFeedbackNumber++;
+
+ // Send picture parameters
+ CHECK_HR(AddExecuteBuffer(DXVA2_PictureParametersBufferType, sizeof(m_DXVAPicParams), &m_DXVAPicParams));
+ CHECK_HR(Execute());
+
+ // Add bitstream, slice control and quantization matrix
+ CHECK_HR(AddExecuteBuffer(DXVA2_BitStreamDateBufferType, nSize, pDataIn, &nSize));
+
+ if (m_bUseLongSlice) {
+ CHECK_HR(AddExecuteBuffer(DXVA2_SliceControlBufferType, sizeof(DXVA_Slice_H264_Long)*nSlices, m_pSliceLong));
+ } else {
+ CHECK_HR(AddExecuteBuffer(DXVA2_SliceControlBufferType, sizeof(DXVA_Slice_H264_Short)*nSlices, m_pSliceShort));
+ }
+
+ CHECK_HR(AddExecuteBuffer(DXVA2_InverseQuantizationMatrixBufferType, sizeof(DXVA_Qmatrix_H264), (void*)&m_DXVAScalingMatrix));
+
+ // Decode bitstream
+ CHECK_HR(Execute());
+
+ CHECK_HR(EndFrame(nSurfaceIndex));
#if defined(_DEBUG) && 0
- DisplayStatus();
+ DisplayStatus();
#endif
- bool bAdded = AddToStore (nSurfaceIndex, pSampleToDeliver, m_DXVAPicParams.RefPicFlag, rtStart, rtStop,
- m_DXVAPicParams.field_pic_flag, (FF_FIELD_TYPE)nFieldType,
- (FF_SLICE_TYPE)nSliceType, nFramePOC);
+ bool bAdded = AddToStore(nSurfaceIndex, pSampleToDeliver, m_DXVAPicParams.RefPicFlag, rtStart, rtStop,
+ m_DXVAPicParams.field_pic_flag, (FF_FIELD_TYPE)nFieldType,
+ (FF_SLICE_TYPE)nSliceType, nFramePOC);
- FFH264UpdateRefFramesList (&m_DXVAPicParams, m_pFilter->GetAVCtx());
- ClearUnusedRefFrames();
+ FFH264UpdateRefFramesList(&m_DXVAPicParams, m_pFilter->GetAVCtx());
+ ClearUnusedRefFrames();
- if (bAdded) {
- hr = DisplayNextFrame();
- }
+ if (bAdded) {
+ hr = DisplayNextFrame();
+ }
- if (nOutPOC != INT_MIN) {
- m_nOutPOC = nOutPOC;
- m_rtOutStart = rtOutStart;
- }
+ if (nOutPOC != INT_MIN) {
+ m_nOutPOC = nOutPOC;
+ m_rtOutStart = rtOutStart;
+ }
- m_bFlushed = false;
- return hr;
+ m_bFlushed = false;
+ return hr;
}
void CDXVADecoderH264::RemoveUndisplayedFrame(int nPOC)
{
- // Find frame with given POC, and free the slot
- for (int i=0; i<m_nPicEntryNumber; i++) {
- if (m_pPictureStore[i].bInUse && m_pPictureStore[i].nCodecSpecific == nPOC) {
- m_pPictureStore[i].bDisplayed = true;
- RemoveRefFrame (i);
- return;
- }
- }
+ // Find frame with given POC, and free the slot
+ for (int i = 0; i < m_nPicEntryNumber; i++) {
+ if (m_pPictureStore[i].bInUse && m_pPictureStore[i].nCodecSpecific == nPOC) {
+ m_pPictureStore[i].bDisplayed = true;
+ RemoveRefFrame(i);
+ return;
+ }
+ }
}
void CDXVADecoderH264::ClearUnusedRefFrames()
{
- // Remove old reference frames (not anymore a short or long ref frame)
- for (int i=0; i<m_nPicEntryNumber; i++) {
- if (m_pPictureStore[i].bRefPicture && m_pPictureStore[i].bDisplayed) {
- if (!FFH264IsRefFrameInUse (i, m_pFilter->GetAVCtx())) {
- RemoveRefFrame (i);
- }
- }
- }
+ // Remove old reference frames (not anymore a short or long ref frame)
+ for (int i = 0; i < m_nPicEntryNumber; i++) {
+ if (m_pPictureStore[i].bRefPicture && m_pPictureStore[i].bDisplayed) {
+ if (!FFH264IsRefFrameInUse(i, m_pFilter->GetAVCtx())) {
+ RemoveRefFrame(i);
+ }
+ }
+ }
}
-void CDXVADecoderH264::SetExtraData (BYTE* pDataIn, UINT nSize)
+void CDXVADecoderH264::SetExtraData(BYTE* pDataIn, UINT nSize)
{
- AVCodecContext* pAVCtx = m_pFilter->GetAVCtx();
- m_nNALLength = pAVCtx->nal_length_size;
+ AVCodecContext* pAVCtx = m_pFilter->GetAVCtx();
+ m_nNALLength = pAVCtx->nal_length_size;
- FFH264DecodeBuffer (pAVCtx, pDataIn, nSize, NULL, NULL, NULL);
- FFH264SetDxvaSliceLong (pAVCtx, m_pSliceLong);
+ FFH264DecodeBuffer(pAVCtx, pDataIn, nSize, NULL, NULL, NULL);
+ FFH264SetDxvaSliceLong(pAVCtx, m_pSliceLong);
}
void CDXVADecoderH264::ClearRefFramesList()
{
- for (int i=0; i<m_nPicEntryNumber; i++) {
- if (m_pPictureStore[i].bInUse) {
- m_pPictureStore[i].bDisplayed = true;
- RemoveRefFrame (i);
- }
- }
+ for (int i = 0; i < m_nPicEntryNumber; i++) {
+ if (m_pPictureStore[i].bInUse) {
+ m_pPictureStore[i].bDisplayed = true;
+ RemoveRefFrame(i);
+ }
+ }
}
HRESULT CDXVADecoderH264::DisplayStatus()
{
- HRESULT hr = E_INVALIDARG;
- DXVA_Status_H264 Status;
+ HRESULT hr = E_INVALIDARG;
+ DXVA_Status_H264 Status;
- memset (&Status, 0, sizeof(Status));
- CHECK_HR (hr = CDXVADecoder::QueryStatus(&Status, sizeof(Status)));
+ memset(&Status, 0, sizeof(Status));
+ CHECK_HR(hr = CDXVADecoder::QueryStatus(&Status, sizeof(Status)));
- TRACE_H264 ("CDXVADecoderH264::DisplayStatus() : Status for the frame %u : bBufType = %u, bStatus = %u, wNumMbsAffected = %u\n",
- Status.StatusReportFeedbackNumber,
- Status.bBufType,
- Status.bStatus,
- Status.wNumMbsAffected);
+ TRACE_H264("CDXVADecoderH264::DisplayStatus() : Status for the frame %u : bBufType = %u, bStatus = %u, wNumMbsAffected = %u\n",
+ Status.StatusReportFeedbackNumber,
+ Status.bBufType,
+ Status.bStatus,
+ Status.wNumMbsAffected);
- return hr;
+ return hr;
}
int CDXVADecoderH264::FindOldestFrame()
{
- int nPos = -1;
- REFERENCE_TIME rtPos = _I64_MAX;
-
- for (int i=0; i<m_nPicEntryNumber; i++) {
- if (m_pPictureStore[i].bInUse && !m_pPictureStore[i].bDisplayed) {
- if ((m_pPictureStore[i].nCodecSpecific == m_nOutPOC) && (m_pPictureStore[i].rtStart < rtPos) && (m_pPictureStore[i].rtStart >= m_rtOutStart)) {
- nPos = i;
- rtPos = m_pPictureStore[i].rtStart;
- }
- }
- }
-
- if (nPos != -1) {
- m_pPictureStore[nPos].rtStart = m_rtOutStart;
- m_pFilter->UpdateFrameTime(m_pPictureStore[nPos].rtStart, m_pPictureStore[nPos].rtStop);
- m_pFilter->ReorderBFrames (m_pPictureStore[nPos].rtStart, m_pPictureStore[nPos].rtStop);
- }
-
- return nPos;
+ int nPos = -1;
+ REFERENCE_TIME rtPos = _I64_MAX;
+
+ for (int i = 0; i < m_nPicEntryNumber; i++) {
+ if (m_pPictureStore[i].bInUse && !m_pPictureStore[i].bDisplayed) {
+ if ((m_pPictureStore[i].nCodecSpecific == m_nOutPOC) && (m_pPictureStore[i].rtStart < rtPos) && (m_pPictureStore[i].rtStart >= m_rtOutStart)) {
+ nPos = i;
+ rtPos = m_pPictureStore[i].rtStart;
+ }
+ }
+ }
+
+ if (nPos != -1) {
+ m_pPictureStore[nPos].rtStart = m_rtOutStart;
+ m_pFilter->UpdateFrameTime(m_pPictureStore[nPos].rtStart, m_pPictureStore[nPos].rtStop);
+ m_pFilter->ReorderBFrames(m_pPictureStore[nPos].rtStart, m_pPictureStore[nPos].rtStop);
+ }
+
+ return nPos;
}
diff --git a/src/filters/transform/MPCVideoDec/DXVADecoderH264.h b/src/filters/transform/MPCVideoDec/DXVADecoderH264.h
index 1f5bd1091..7d00093f0 100644
--- a/src/filters/transform/MPCVideoDec/DXVADecoderH264.h
+++ b/src/filters/transform/MPCVideoDec/DXVADecoderH264.h
@@ -26,45 +26,45 @@
#include <dxva.h>
#include "DXVADecoder.h"
-#define MAX_SLICES 16 // Also defined in libavcodec/h264.h
+#define MAX_SLICES 16 // Also defined in libavcodec/h264.h
class CDXVADecoderH264 : public CDXVADecoder
{
public:
- CDXVADecoderH264 (CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber);
- CDXVADecoderH264 (CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config);
- virtual ~CDXVADecoderH264();
+ CDXVADecoderH264(CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber);
+ CDXVADecoderH264(CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config);
+ virtual ~CDXVADecoderH264();
- virtual HRESULT DecodeFrame (BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop);
- virtual void SetExtraData (BYTE* pDataIn, UINT nSize);
- virtual void CopyBitstream (BYTE* pDXVABuffer, BYTE* pBuffer, UINT& nSize);
- virtual void Flush();
+ virtual HRESULT DecodeFrame(BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop);
+ virtual void SetExtraData(BYTE* pDataIn, UINT nSize);
+ virtual void CopyBitstream(BYTE* pDXVABuffer, BYTE* pBuffer, UINT& nSize);
+ virtual void Flush();
protected :
- virtual int FindOldestFrame();
+ virtual int FindOldestFrame();
private:
- DXVA_PicParams_H264 m_DXVAPicParams;
- DXVA_Qmatrix_H264 m_DXVAScalingMatrix;
- DXVA_Slice_H264_Short m_pSliceShort[MAX_SLICES];
- DXVA_Slice_H264_Long m_pSliceLong[MAX_SLICES];
- UINT m_nMaxSlices;
- int m_nNALLength;
- bool m_bUseLongSlice;
- int m_nOutPOC, m_nPrevOutPOC;
- REFERENCE_TIME m_rtOutStart;
+ DXVA_PicParams_H264 m_DXVAPicParams;
+ DXVA_Qmatrix_H264 m_DXVAScalingMatrix;
+ DXVA_Slice_H264_Short m_pSliceShort[MAX_SLICES];
+ DXVA_Slice_H264_Long m_pSliceLong[MAX_SLICES];
+ UINT m_nMaxSlices;
+ int m_nNALLength;
+ bool m_bUseLongSlice;
+ int m_nOutPOC, m_nPrevOutPOC;
+ REFERENCE_TIME m_rtOutStart;
- USHORT m_nfield_pic_flag;
- USHORT m_nRefPicFlag;
- UINT m_nBrokenFramesFlag, m_nBrokenFramesFlag_POC;
+ USHORT m_nfield_pic_flag;
+ USHORT m_nRefPicFlag;
+ UINT m_nBrokenFramesFlag, m_nBrokenFramesFlag_POC;
- // Private functions
- void Init();
- HRESULT DisplayStatus();
+ // Private functions
+ void Init();
+ HRESULT DisplayStatus();
- // DXVA functions
- void RemoveUndisplayedFrame(int nPOC);
- void ClearRefFramesList();
- void ClearUnusedRefFrames();
+ // DXVA functions
+ void RemoveUndisplayedFrame(int nPOC);
+ void ClearRefFramesList();
+ void ClearUnusedRefFrames();
};
diff --git a/src/filters/transform/MPCVideoDec/DXVADecoderMpeg2.cpp b/src/filters/transform/MPCVideoDec/DXVADecoderMpeg2.cpp
index 7f21aa75e..0bc11ae2d 100644
--- a/src/filters/transform/MPCVideoDec/DXVADecoderMpeg2.cpp
+++ b/src/filters/transform/MPCVideoDec/DXVADecoderMpeg2.cpp
@@ -32,252 +32,252 @@
#define TRACE_MPEG2(...)
#endif
-CDXVADecoderMpeg2::CDXVADecoderMpeg2 (CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber)
- : CDXVADecoder (pFilter, pAMVideoAccelerator, nMode, nPicEntryNumber)
+CDXVADecoderMpeg2::CDXVADecoderMpeg2(CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber)
+ : CDXVADecoder(pFilter, pAMVideoAccelerator, nMode, nPicEntryNumber)
{
- Init();
+ Init();
}
-CDXVADecoderMpeg2::CDXVADecoderMpeg2 (CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config)
- : CDXVADecoder (pFilter, pDirectXVideoDec, nMode, nPicEntryNumber, pDXVA2Config)
+CDXVADecoderMpeg2::CDXVADecoderMpeg2(CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config)
+ : CDXVADecoder(pFilter, pDirectXVideoDec, nMode, nPicEntryNumber, pDXVA2Config)
{
- Init();
+ Init();
}
CDXVADecoderMpeg2::~CDXVADecoderMpeg2(void)
{
- Flush();
+ Flush();
}
void CDXVADecoderMpeg2::Init()
{
- memset (&m_PictureParams, 0, sizeof(m_PictureParams));
- memset (&m_SliceInfo, 0, sizeof(m_SliceInfo));
- memset (&m_QMatrixData, 0, sizeof(m_QMatrixData));
-
- m_nMaxWaiting = 5;
- m_wRefPictureIndex[0] = NO_REF_FRAME;
- m_wRefPictureIndex[1] = NO_REF_FRAME;
- m_nSliceCount = 0;
-
- switch (GetMode()) {
- case MPEG2_VLD :
- AllocExecuteParams (4);
- break;
- default :
- ASSERT(FALSE);
- }
+ memset(&m_PictureParams, 0, sizeof(m_PictureParams));
+ memset(&m_SliceInfo, 0, sizeof(m_SliceInfo));
+ memset(&m_QMatrixData, 0, sizeof(m_QMatrixData));
+
+ m_nMaxWaiting = 5;
+ m_wRefPictureIndex[0] = NO_REF_FRAME;
+ m_wRefPictureIndex[1] = NO_REF_FRAME;
+ m_nSliceCount = 0;
+
+ switch (GetMode()) {
+ case MPEG2_VLD :
+ AllocExecuteParams(4);
+ break;
+ default :
+ ASSERT(FALSE);
+ }
}
// === Public functions
-HRESULT CDXVADecoderMpeg2::DecodeFrame (BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop)
+HRESULT CDXVADecoderMpeg2::DecodeFrame(BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop)
{
- HRESULT hr;
- int nFieldType;
- int nSliceType;
-
- FFMpeg2DecodeFrame (&m_PictureParams, &m_QMatrixData, m_SliceInfo, &m_nSliceCount, m_pFilter->GetAVCtx(),
- m_pFilter->GetFrame(), &m_nNextCodecIndex, &nFieldType, &nSliceType, pDataIn, nSize);
-
- if (m_PictureParams.bSecondField && !m_bSecondField) {
- m_bSecondField = true;
- }
-
- // Wait I frame after a flush
- if (m_bFlushed && (!m_PictureParams.bPicIntra || (m_bSecondField && m_PictureParams.bSecondField))) {
- TRACE_MPEG2 ("CDXVADecoderMpeg2::DecodeFrame() : Flush - wait I frame\n");
- return S_FALSE;
- }
-
- if (m_bSecondField) {
- if (!m_PictureParams.bSecondField) {
- m_rtStart = rtStart;
- m_rtStop = rtStop;
- m_pSampleToDeliver = NULL;
- hr = GetFreeSurfaceIndex (m_nSurfaceIndex, &m_pSampleToDeliver, rtStart, rtStop);
- if (FAILED (hr)) {
- ASSERT (hr == VFW_E_NOT_COMMITTED); // Normal when stop playing
- return hr;
- }
- }
- } else {
- m_rtStart = rtStart;
- m_rtStop = rtStop;
- m_pSampleToDeliver = NULL;
- hr = GetFreeSurfaceIndex (m_nSurfaceIndex, &m_pSampleToDeliver, rtStart, rtStop);
- if (FAILED (hr)) {
- ASSERT (hr == VFW_E_NOT_COMMITTED); // Normal when stop playing
- return hr;
- }
- }
-
- if (m_pSampleToDeliver == NULL) {
- return S_FALSE;
- }
-
- CHECK_HR (BeginFrame(m_nSurfaceIndex, m_pSampleToDeliver));
-
- if (m_bSecondField) {
- if (!m_PictureParams.bSecondField) {
- UpdatePictureParams(m_nSurfaceIndex);
- }
- } else {
- UpdatePictureParams(m_nSurfaceIndex);
- }
-
- TRACE_MPEG2 ("CDXVADecoderMpeg2::DecodeFrame() : Surf = %d, PictureType = %d, SecondField = %d, m_nNextCodecIndex = %d, rtStart = [%I64d]\n", m_nSurfaceIndex, nSliceType, m_PictureParams.bSecondField, m_nNextCodecIndex, rtStart);
-
- CHECK_HR (AddExecuteBuffer (DXVA2_PictureParametersBufferType, sizeof(m_PictureParams), &m_PictureParams));
-
- CHECK_HR (AddExecuteBuffer (DXVA2_InverseQuantizationMatrixBufferType, sizeof(m_QMatrixData), &m_QMatrixData));
-
- // Send bitstream to accelerator
- CHECK_HR (AddExecuteBuffer (DXVA2_SliceControlBufferType, sizeof (DXVA_SliceInfo)*m_nSliceCount, &m_SliceInfo));
- CHECK_HR (AddExecuteBuffer (DXVA2_BitStreamDateBufferType, nSize, pDataIn, &nSize));
-
- // Decode frame
- CHECK_HR (Execute());
- CHECK_HR (EndFrame(m_nSurfaceIndex));
-
- if (m_bSecondField) {
- if (m_PictureParams.bSecondField) {
- AddToStore (m_nSurfaceIndex, m_pSampleToDeliver, (m_PictureParams.bPicBackwardPrediction != 1), m_rtStart, m_rtStop,
- false, (FF_FIELD_TYPE)nFieldType, (FF_SLICE_TYPE)nSliceType, FFGetCodedPicture(m_pFilter->GetAVCtx()));
- hr = DisplayNextFrame();
- }
- } else {
- AddToStore (m_nSurfaceIndex, m_pSampleToDeliver, (m_PictureParams.bPicBackwardPrediction != 1), m_rtStart, m_rtStop,
- false, (FF_FIELD_TYPE)nFieldType, (FF_SLICE_TYPE)nSliceType, FFGetCodedPicture(m_pFilter->GetAVCtx()));
- hr = DisplayNextFrame();
- }
-
- m_bFlushed = false;
-
- return hr;
+ HRESULT hr;
+ int nFieldType;
+ int nSliceType;
+
+ FFMpeg2DecodeFrame(&m_PictureParams, &m_QMatrixData, m_SliceInfo, &m_nSliceCount, m_pFilter->GetAVCtx(),
+ m_pFilter->GetFrame(), &m_nNextCodecIndex, &nFieldType, &nSliceType, pDataIn, nSize);
+
+ if (m_PictureParams.bSecondField && !m_bSecondField) {
+ m_bSecondField = true;
+ }
+
+ // Wait I frame after a flush
+ if (m_bFlushed && (!m_PictureParams.bPicIntra || (m_bSecondField && m_PictureParams.bSecondField))) {
+ TRACE_MPEG2("CDXVADecoderMpeg2::DecodeFrame() : Flush - wait I frame\n");
+ return S_FALSE;
+ }
+
+ if (m_bSecondField) {
+ if (!m_PictureParams.bSecondField) {
+ m_rtStart = rtStart;
+ m_rtStop = rtStop;
+ m_pSampleToDeliver = NULL;
+ hr = GetFreeSurfaceIndex(m_nSurfaceIndex, &m_pSampleToDeliver, rtStart, rtStop);
+ if (FAILED(hr)) {
+ ASSERT(hr == VFW_E_NOT_COMMITTED); // Normal when stop playing
+ return hr;
+ }
+ }
+ } else {
+ m_rtStart = rtStart;
+ m_rtStop = rtStop;
+ m_pSampleToDeliver = NULL;
+ hr = GetFreeSurfaceIndex(m_nSurfaceIndex, &m_pSampleToDeliver, rtStart, rtStop);
+ if (FAILED(hr)) {
+ ASSERT(hr == VFW_E_NOT_COMMITTED); // Normal when stop playing
+ return hr;
+ }
+ }
+
+ if (m_pSampleToDeliver == NULL) {
+ return S_FALSE;
+ }
+
+ CHECK_HR(BeginFrame(m_nSurfaceIndex, m_pSampleToDeliver));
+
+ if (m_bSecondField) {
+ if (!m_PictureParams.bSecondField) {
+ UpdatePictureParams(m_nSurfaceIndex);
+ }
+ } else {
+ UpdatePictureParams(m_nSurfaceIndex);
+ }
+
+ TRACE_MPEG2("CDXVADecoderMpeg2::DecodeFrame() : Surf = %d, PictureType = %d, SecondField = %d, m_nNextCodecIndex = %d, rtStart = [%I64d]\n", m_nSurfaceIndex, nSliceType, m_PictureParams.bSecondField, m_nNextCodecIndex, rtStart);
+
+ CHECK_HR(AddExecuteBuffer(DXVA2_PictureParametersBufferType, sizeof(m_PictureParams), &m_PictureParams));
+
+ CHECK_HR(AddExecuteBuffer(DXVA2_InverseQuantizationMatrixBufferType, sizeof(m_QMatrixData), &m_QMatrixData));
+
+ // Send bitstream to accelerator
+ CHECK_HR(AddExecuteBuffer(DXVA2_SliceControlBufferType, sizeof(DXVA_SliceInfo)*m_nSliceCount, &m_SliceInfo));
+ CHECK_HR(AddExecuteBuffer(DXVA2_BitStreamDateBufferType, nSize, pDataIn, &nSize));
+
+ // Decode frame
+ CHECK_HR(Execute());
+ CHECK_HR(EndFrame(m_nSurfaceIndex));
+
+ if (m_bSecondField) {
+ if (m_PictureParams.bSecondField) {
+ AddToStore(m_nSurfaceIndex, m_pSampleToDeliver, (m_PictureParams.bPicBackwardPrediction != 1), m_rtStart, m_rtStop,
+ false, (FF_FIELD_TYPE)nFieldType, (FF_SLICE_TYPE)nSliceType, FFGetCodedPicture(m_pFilter->GetAVCtx()));
+ hr = DisplayNextFrame();
+ }
+ } else {
+ AddToStore(m_nSurfaceIndex, m_pSampleToDeliver, (m_PictureParams.bPicBackwardPrediction != 1), m_rtStart, m_rtStop,
+ false, (FF_FIELD_TYPE)nFieldType, (FF_SLICE_TYPE)nSliceType, FFGetCodedPicture(m_pFilter->GetAVCtx()));
+ hr = DisplayNextFrame();
+ }
+
+ m_bFlushed = false;
+
+ return hr;
}
void CDXVADecoderMpeg2::UpdatePictureParams(int nSurfaceIndex)
{
- DXVA2_ConfigPictureDecode* cpd = GetDXVA2Config(); // Ok for DXVA1 too (parameters have been copied)
-
- m_PictureParams.wDecodedPictureIndex = nSurfaceIndex;
-
- // Manage reference picture list
- if (!m_PictureParams.bPicBackwardPrediction) {
- if (m_wRefPictureIndex[0] != NO_REF_FRAME) {
- RemoveRefFrame (m_wRefPictureIndex[0]);
- }
- m_wRefPictureIndex[0] = m_wRefPictureIndex[1];
- m_wRefPictureIndex[1] = nSurfaceIndex;
- }
- m_PictureParams.wForwardRefPictureIndex = (m_PictureParams.bPicIntra == 0) ? m_wRefPictureIndex[0] : NO_REF_FRAME;
- m_PictureParams.wBackwardRefPictureIndex = (m_PictureParams.bPicBackwardPrediction == 1) ? m_wRefPictureIndex[1] : NO_REF_FRAME;
-
- // Shall be 0 if bConfigResidDiffHost is 0 or if BPP > 8
- if (cpd->ConfigResidDiffHost == 0 || m_PictureParams.bBPPminus1 > 7) {
- m_PictureParams.bPicSpatialResid8 = 0;
- } else {
- if (m_PictureParams.bBPPminus1 == 7 && m_PictureParams.bPicIntra && cpd->ConfigResidDiffHost)
- // Shall be 1 if BPP is 8 and bPicIntra is 1 and bConfigResidDiffHost is 1
- {
- m_PictureParams.bPicSpatialResid8 = 1;
- } else
- // Shall be 1 if bConfigSpatialResid8 is 1
- {
- m_PictureParams.bPicSpatialResid8 = cpd->ConfigSpatialResid8;
- }
- }
-
- // Shall be 0 if bConfigResidDiffHost is 0 or if bConfigSpatialResid8 is 0 or if BPP > 8
- if (cpd->ConfigResidDiffHost == 0 || cpd->ConfigSpatialResid8 == 0 || m_PictureParams.bBPPminus1 > 7) {
- m_PictureParams.bPicOverflowBlocks = 0;
- }
-
- // Shall be 1 if bConfigHostInverseScan is 1 or if bConfigResidDiffAccelerator is 0.
-
- if (cpd->ConfigHostInverseScan == 1 || cpd->ConfigResidDiffAccelerator == 0) {
- m_PictureParams.bPicScanFixed = 1;
-
- if (cpd->ConfigHostInverseScan != 0) {
- m_PictureParams.bPicScanMethod = 3; // 11 = Arbitrary scan with absolute coefficient address.
- } else if (FFGetAlternateScan(m_pFilter->GetAVCtx())) {
- m_PictureParams.bPicScanMethod = 1; // 00 = Zig-zag scan (MPEG-2 Figure 7-2)
- } else {
- m_PictureParams.bPicScanMethod = 0; // 01 = Alternate-vertical (MPEG-2 Figure 7-3),
- }
- }
+ DXVA2_ConfigPictureDecode* cpd = GetDXVA2Config(); // Ok for DXVA1 too (parameters have been copied)
+
+ m_PictureParams.wDecodedPictureIndex = nSurfaceIndex;
+
+ // Manage reference picture list
+ if (!m_PictureParams.bPicBackwardPrediction) {
+ if (m_wRefPictureIndex[0] != NO_REF_FRAME) {
+ RemoveRefFrame(m_wRefPictureIndex[0]);
+ }
+ m_wRefPictureIndex[0] = m_wRefPictureIndex[1];
+ m_wRefPictureIndex[1] = nSurfaceIndex;
+ }
+ m_PictureParams.wForwardRefPictureIndex = (m_PictureParams.bPicIntra == 0) ? m_wRefPictureIndex[0] : NO_REF_FRAME;
+ m_PictureParams.wBackwardRefPictureIndex = (m_PictureParams.bPicBackwardPrediction == 1) ? m_wRefPictureIndex[1] : NO_REF_FRAME;
+
+ // Shall be 0 if bConfigResidDiffHost is 0 or if BPP > 8
+ if (cpd->ConfigResidDiffHost == 0 || m_PictureParams.bBPPminus1 > 7) {
+ m_PictureParams.bPicSpatialResid8 = 0;
+ } else {
+ if (m_PictureParams.bBPPminus1 == 7 && m_PictureParams.bPicIntra && cpd->ConfigResidDiffHost)
+ // Shall be 1 if BPP is 8 and bPicIntra is 1 and bConfigResidDiffHost is 1
+ {
+ m_PictureParams.bPicSpatialResid8 = 1;
+ } else
+ // Shall be 1 if bConfigSpatialResid8 is 1
+ {
+ m_PictureParams.bPicSpatialResid8 = cpd->ConfigSpatialResid8;
+ }
+ }
+
+ // Shall be 0 if bConfigResidDiffHost is 0 or if bConfigSpatialResid8 is 0 or if BPP > 8
+ if (cpd->ConfigResidDiffHost == 0 || cpd->ConfigSpatialResid8 == 0 || m_PictureParams.bBPPminus1 > 7) {
+ m_PictureParams.bPicOverflowBlocks = 0;
+ }
+
+ // Shall be 1 if bConfigHostInverseScan is 1 or if bConfigResidDiffAccelerator is 0.
+
+ if (cpd->ConfigHostInverseScan == 1 || cpd->ConfigResidDiffAccelerator == 0) {
+ m_PictureParams.bPicScanFixed = 1;
+
+ if (cpd->ConfigHostInverseScan != 0) {
+ m_PictureParams.bPicScanMethod = 3; // 11 = Arbitrary scan with absolute coefficient address.
+ } else if (FFGetAlternateScan(m_pFilter->GetAVCtx())) {
+ m_PictureParams.bPicScanMethod = 1; // 00 = Zig-zag scan (MPEG-2 Figure 7-2)
+ } else {
+ m_PictureParams.bPicScanMethod = 0; // 01 = Alternate-vertical (MPEG-2 Figure 7-3),
+ }
+ }
}
void CDXVADecoderMpeg2::CopyBitstream(BYTE* pDXVABuffer, BYTE* pBuffer, UINT& nSize)
{
- while (*((DWORD*)pBuffer) != 0x01010000) {
- pBuffer++;
- nSize--;
+ while (*((DWORD*)pBuffer) != 0x01010000) {
+ pBuffer++;
+ nSize--;
- if (nSize <= 0) {
- return;
- }
- }
+ if (nSize <= 0) {
+ return;
+ }
+ }
- memcpy (pDXVABuffer, pBuffer, nSize);
+ memcpy(pDXVABuffer, pBuffer, nSize);
}
void CDXVADecoderMpeg2::Flush()
{
- m_nNextCodecIndex = INT_MIN;
+ m_nNextCodecIndex = INT_MIN;
- if (m_wRefPictureIndex[0] != NO_REF_FRAME) {
- RemoveRefFrame (m_wRefPictureIndex[0]);
- }
- if (m_wRefPictureIndex[1] != NO_REF_FRAME) {
- RemoveRefFrame (m_wRefPictureIndex[1]);
- }
+ if (m_wRefPictureIndex[0] != NO_REF_FRAME) {
+ RemoveRefFrame(m_wRefPictureIndex[0]);
+ }
+ if (m_wRefPictureIndex[1] != NO_REF_FRAME) {
+ RemoveRefFrame(m_wRefPictureIndex[1]);
+ }
- m_wRefPictureIndex[0] = NO_REF_FRAME;
- m_wRefPictureIndex[1] = NO_REF_FRAME;
+ m_wRefPictureIndex[0] = NO_REF_FRAME;
+ m_wRefPictureIndex[1] = NO_REF_FRAME;
- m_nSurfaceIndex = 0;
- m_pSampleToDeliver = NULL;
- m_bSecondField = false;
+ m_nSurfaceIndex = 0;
+ m_pSampleToDeliver = NULL;
+ m_bSecondField = false;
- m_rtStart = _I64_MIN;
- m_rtStop = _I64_MIN;
+ m_rtStart = _I64_MIN;
+ m_rtStop = _I64_MIN;
- m_rtLastStart = 0;
+ m_rtLastStart = 0;
- __super::Flush();
+ __super::Flush();
}
int CDXVADecoderMpeg2::FindOldestFrame()
{
- int nPos = -1;
-
- for (int i=0; i<m_nPicEntryNumber; i++) {
- if (!m_pPictureStore[i].bDisplayed &&
- m_pPictureStore[i].bInUse &&
- (m_pPictureStore[i].nCodecSpecific == m_nNextCodecIndex)) {
- m_nNextCodecIndex = INT_MIN;
- nPos = i;
- }
- }
-
- if (nPos != -1) {
- UpdateFrameTime(m_pPictureStore[nPos].rtStart, m_pPictureStore[nPos].rtStop);
- }
-
- return nPos;
+ int nPos = -1;
+
+ for (int i = 0; i < m_nPicEntryNumber; i++) {
+ if (!m_pPictureStore[i].bDisplayed &&
+ m_pPictureStore[i].bInUse &&
+ (m_pPictureStore[i].nCodecSpecific == m_nNextCodecIndex)) {
+ m_nNextCodecIndex = INT_MIN;
+ nPos = i;
+ }
+ }
+
+ if (nPos != -1) {
+ UpdateFrameTime(m_pPictureStore[nPos].rtStart, m_pPictureStore[nPos].rtStop);
+ }
+
+ return nPos;
}
-void CDXVADecoderMpeg2::UpdateFrameTime (REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop)
+void CDXVADecoderMpeg2::UpdateFrameTime(REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop)
{
- TRACE(_T("\n\nrtStart = [%10I64d - %10I64d] // "), rtStart, rtStop);
+ TRACE(_T("\n\nrtStart = [%10I64d - %10I64d] // "), rtStart, rtStop);
- if (m_rtLastStart && (rtStart == _I64_MIN || (rtStart < m_rtLastStart))) {
- rtStart = m_rtLastStart;
- }
+ if (m_rtLastStart && (rtStart == _I64_MIN || (rtStart < m_rtLastStart))) {
+ rtStart = m_rtLastStart;
+ }
- rtStop = rtStart + m_pFilter->GetAvrTimePerFrame() / m_pFilter->GetRate();
- m_rtLastStart = rtStop;
+ rtStop = rtStart + m_pFilter->GetAvrTimePerFrame() / m_pFilter->GetRate();
+ m_rtLastStart = rtStop;
- TRACE(_T("rtStart = [%10I64d - %10I64d]\n"), rtStart, rtStop);
+ TRACE(_T("rtStart = [%10I64d - %10I64d]\n"), rtStart, rtStop);
}
diff --git a/src/filters/transform/MPCVideoDec/DXVADecoderMpeg2.h b/src/filters/transform/MPCVideoDec/DXVADecoderMpeg2.h
index fa766a661..f50575fb1 100644
--- a/src/filters/transform/MPCVideoDec/DXVADecoderMpeg2.h
+++ b/src/filters/transform/MPCVideoDec/DXVADecoderMpeg2.h
@@ -26,41 +26,41 @@
#include <dxva.h>
#include "DXVADecoder.h"
-#define MAX_SLICE 1024 // Max slice number for Mpeg2 streams
+#define MAX_SLICE 1024 // Max slice number for Mpeg2 streams
-class CDXVADecoderMpeg2 : public CDXVADecoder
+class CDXVADecoderMpeg2 : public CDXVADecoder
{
public:
- CDXVADecoderMpeg2 (CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber);
- CDXVADecoderMpeg2 (CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config);
- virtual ~CDXVADecoderMpeg2(void);
+ CDXVADecoderMpeg2(CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber);
+ CDXVADecoderMpeg2(CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config);
+ virtual ~CDXVADecoderMpeg2(void);
- // === Public functions
- virtual HRESULT DecodeFrame (BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop);
- virtual void CopyBitstream (BYTE* pDXVABuffer, BYTE* pBuffer, UINT& nSize);
- virtual void Flush();
+ // === Public functions
+ virtual HRESULT DecodeFrame(BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop);
+ virtual void CopyBitstream(BYTE* pDXVABuffer, BYTE* pBuffer, UINT& nSize);
+ virtual void Flush();
protected :
- virtual int FindOldestFrame();
+ virtual int FindOldestFrame();
private:
- DXVA_PictureParameters m_PictureParams;
- DXVA_QmatrixData m_QMatrixData;
- WORD m_wRefPictureIndex[2];
- DXVA_SliceInfo m_SliceInfo[MAX_SLICE];
- int m_nSliceCount;
+ DXVA_PictureParameters m_PictureParams;
+ DXVA_QmatrixData m_QMatrixData;
+ WORD m_wRefPictureIndex[2];
+ DXVA_SliceInfo m_SliceInfo[MAX_SLICE];
+ int m_nSliceCount;
- int m_nNextCodecIndex;
+ int m_nNextCodecIndex;
- int m_nSurfaceIndex;
- CComPtr<IMediaSample> m_pSampleToDeliver;
- bool m_bSecondField;
- REFERENCE_TIME m_rtStart, m_rtStop;
+ int m_nSurfaceIndex;
+ CComPtr<IMediaSample> m_pSampleToDeliver;
+ bool m_bSecondField;
+ REFERENCE_TIME m_rtStart, m_rtStop;
- REFERENCE_TIME m_rtLastStart;
+ REFERENCE_TIME m_rtLastStart;
- // Private functions
- void Init();
- void UpdatePictureParams(int nSurfaceIndex);
- void UpdateFrameTime (REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop);
+ // Private functions
+ void Init();
+ void UpdatePictureParams(int nSurfaceIndex);
+ void UpdateFrameTime(REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop);
};
diff --git a/src/filters/transform/MPCVideoDec/DXVADecoderVC1.cpp b/src/filters/transform/MPCVideoDec/DXVADecoderVC1.cpp
index 0f05301e6..6996bccff 100644
--- a/src/filters/transform/MPCVideoDec/DXVADecoderVC1.cpp
+++ b/src/filters/transform/MPCVideoDec/DXVADecoderVC1.cpp
@@ -35,300 +35,300 @@
inline void SwapRT(REFERENCE_TIME& rtFirst, REFERENCE_TIME& rtSecond)
{
- REFERENCE_TIME rtTemp = rtFirst;
- rtFirst = rtSecond;
- rtSecond = rtTemp;
+ REFERENCE_TIME rtTemp = rtFirst;
+ rtFirst = rtSecond;
+ rtSecond = rtTemp;
}
-CDXVADecoderVC1::CDXVADecoderVC1 (CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber)
- : CDXVADecoder (pFilter, pAMVideoAccelerator, nMode, nPicEntryNumber)
+CDXVADecoderVC1::CDXVADecoderVC1(CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber)
+ : CDXVADecoder(pFilter, pAMVideoAccelerator, nMode, nPicEntryNumber)
{
- Init();
+ Init();
}
-CDXVADecoderVC1::CDXVADecoderVC1 (CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config)
- : CDXVADecoder (pFilter, pDirectXVideoDec, nMode, nPicEntryNumber, pDXVA2Config)
+CDXVADecoderVC1::CDXVADecoderVC1(CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config)
+ : CDXVADecoder(pFilter, pDirectXVideoDec, nMode, nPicEntryNumber, pDXVA2Config)
{
- Init();
+ Init();
}
CDXVADecoderVC1::~CDXVADecoderVC1(void)
{
- Flush();
+ Flush();
}
void CDXVADecoderVC1::Init()
{
- memset (&m_PictureParams, 0, sizeof(m_PictureParams));
- memset (&m_SliceInfo, 0, sizeof(m_SliceInfo));
-
- m_nMaxWaiting = 5;
- m_wRefPictureIndex[0] = NO_REF_FRAME;
- m_wRefPictureIndex[1] = NO_REF_FRAME;
-
- switch (GetMode()) {
- case VC1_VLD :
- AllocExecuteParams (3);
- break;
- default :
- ASSERT(FALSE);
- }
-
- m_bFrame_repeat_pict = FALSE;
+ memset(&m_PictureParams, 0, sizeof(m_PictureParams));
+ memset(&m_SliceInfo, 0, sizeof(m_SliceInfo));
+
+ m_nMaxWaiting = 5;
+ m_wRefPictureIndex[0] = NO_REF_FRAME;
+ m_wRefPictureIndex[1] = NO_REF_FRAME;
+
+ switch (GetMode()) {
+ case VC1_VLD :
+ AllocExecuteParams(3);
+ break;
+ default :
+ ASSERT(FALSE);
+ }
+
+ m_bFrame_repeat_pict = FALSE;
}
// === Public functions
-HRESULT CDXVADecoderVC1::DecodeFrame (BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop)
+HRESULT CDXVADecoderVC1::DecodeFrame(BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop)
{
- HRESULT hr;
- int nSurfaceIndex;
- CComPtr<IMediaSample> pSampleToDeliver;
- int nFieldType, nSliceType;
- UINT nFrameSize, nSize_Result;
+ HRESULT hr;
+ int nSurfaceIndex;
+ CComPtr<IMediaSample> pSampleToDeliver;
+ int nFieldType, nSliceType;
+ UINT nFrameSize, nSize_Result;
- FFVC1UpdatePictureParam (&m_PictureParams, m_pFilter->GetAVCtx(), &nFieldType, &nSliceType, pDataIn, nSize, &nFrameSize, FALSE, &m_bFrame_repeat_pict);
+ FFVC1UpdatePictureParam(&m_PictureParams, m_pFilter->GetAVCtx(), &nFieldType, &nSliceType, pDataIn, nSize, &nFrameSize, FALSE, &m_bFrame_repeat_pict);
- if (FFIsSkipped (m_pFilter->GetAVCtx())) {
- return S_OK;
- }
+ if (FFIsSkipped(m_pFilter->GetAVCtx())) {
+ return S_OK;
+ }
- // Wait I frame after a flush
- if (m_bFlushed && ! m_PictureParams.bPicIntra) {
- return S_FALSE;
- }
+ // Wait I frame after a flush
+ if (m_bFlushed && ! m_PictureParams.bPicIntra) {
+ return S_FALSE;
+ }
- hr = GetFreeSurfaceIndex (nSurfaceIndex, &pSampleToDeliver, rtStart, rtStop);
- if (FAILED (hr)) {
- ASSERT (hr == VFW_E_NOT_COMMITTED); // Normal when stop playing
- return hr;
- }
+ hr = GetFreeSurfaceIndex(nSurfaceIndex, &pSampleToDeliver, rtStart, rtStop);
+ if (FAILED(hr)) {
+ ASSERT(hr == VFW_E_NOT_COMMITTED); // Normal when stop playing
+ return hr;
+ }
- CHECK_HR (BeginFrame(nSurfaceIndex, pSampleToDeliver));
+ CHECK_HR(BeginFrame(nSurfaceIndex, pSampleToDeliver));
- TRACE_VC1 ("CDXVADecoderVC1::DecodeFrame() : PictureType = %d, rtStart = %I64d, Surf = %d\n", nSliceType, rtStart, nSurfaceIndex);
+ TRACE_VC1("CDXVADecoderVC1::DecodeFrame() : PictureType = %d, rtStart = %I64d, Surf = %d\n", nSliceType, rtStart, nSurfaceIndex);
- m_PictureParams.wDecodedPictureIndex = nSurfaceIndex;
- m_PictureParams.wDeblockedPictureIndex = m_PictureParams.wDecodedPictureIndex;
+ m_PictureParams.wDecodedPictureIndex = nSurfaceIndex;
+ m_PictureParams.wDeblockedPictureIndex = m_PictureParams.wDecodedPictureIndex;
- // Manage reference picture list
- if (!m_PictureParams.bPicBackwardPrediction) {
- if (m_wRefPictureIndex[0] != NO_REF_FRAME) {
- RemoveRefFrame (m_wRefPictureIndex[0]);
- }
- m_wRefPictureIndex[0] = m_wRefPictureIndex[1];
- m_wRefPictureIndex[1] = nSurfaceIndex;
- }
- m_PictureParams.wForwardRefPictureIndex = (m_PictureParams.bPicIntra == 0) ? m_wRefPictureIndex[0] : NO_REF_FRAME;
- m_PictureParams.wBackwardRefPictureIndex = (m_PictureParams.bPicBackwardPrediction == 1) ? m_wRefPictureIndex[1] : NO_REF_FRAME;
+ // Manage reference picture list
+ if (!m_PictureParams.bPicBackwardPrediction) {
+ if (m_wRefPictureIndex[0] != NO_REF_FRAME) {
+ RemoveRefFrame(m_wRefPictureIndex[0]);
+ }
+ m_wRefPictureIndex[0] = m_wRefPictureIndex[1];
+ m_wRefPictureIndex[1] = nSurfaceIndex;
+ }
+ m_PictureParams.wForwardRefPictureIndex = (m_PictureParams.bPicIntra == 0) ? m_wRefPictureIndex[0] : NO_REF_FRAME;
+ m_PictureParams.wBackwardRefPictureIndex = (m_PictureParams.bPicBackwardPrediction == 1) ? m_wRefPictureIndex[1] : NO_REF_FRAME;
- m_PictureParams.bPic4MVallowed = (m_PictureParams.wBackwardRefPictureIndex == NO_REF_FRAME && m_PictureParams.bPicStructure == 3) ? 1 : 0;
- m_PictureParams.bPicDeblockConfined |= (m_PictureParams.wBackwardRefPictureIndex == NO_REF_FRAME) ? 0x04 : 0;
+ m_PictureParams.bPic4MVallowed = (m_PictureParams.wBackwardRefPictureIndex == NO_REF_FRAME && m_PictureParams.bPicStructure == 3) ? 1 : 0;
+ m_PictureParams.bPicDeblockConfined |= (m_PictureParams.wBackwardRefPictureIndex == NO_REF_FRAME) ? 0x04 : 0;
- m_PictureParams.bPicScanMethod++; // Use for status reporting sections 3.8.1 and 3.8.2
+ m_PictureParams.bPicScanMethod++; // Use for status reporting sections 3.8.1 and 3.8.2
- TRACE_VC1 ("CDXVADecoderVC1::DecodeFrame() : Decode frame %i\n", m_PictureParams.bPicScanMethod);
+ TRACE_VC1("CDXVADecoderVC1::DecodeFrame() : Decode frame %i\n", m_PictureParams.bPicScanMethod);
- // Send picture params to accelerator
- CHECK_HR (AddExecuteBuffer (DXVA2_PictureParametersBufferType, sizeof(m_PictureParams), &m_PictureParams));
+ // Send picture params to accelerator
+ CHECK_HR(AddExecuteBuffer(DXVA2_PictureParametersBufferType, sizeof(m_PictureParams), &m_PictureParams));
- // Send bitstream to accelerator
- CHECK_HR (AddExecuteBuffer (DXVA2_BitStreamDateBufferType, nFrameSize ? nFrameSize : nSize, pDataIn, &nSize_Result));
+ // Send bitstream to accelerator
+ CHECK_HR(AddExecuteBuffer(DXVA2_BitStreamDateBufferType, nFrameSize ? nFrameSize : nSize, pDataIn, &nSize_Result));
- m_SliceInfo.wQuantizerScaleCode = 1; // TODO : 1->31 ???
- m_SliceInfo.dwSliceBitsInBuffer = nSize_Result * 8;
- CHECK_HR (AddExecuteBuffer (DXVA2_SliceControlBufferType, sizeof (m_SliceInfo), &m_SliceInfo));
+ m_SliceInfo.wQuantizerScaleCode = 1; // TODO : 1->31 ???
+ m_SliceInfo.dwSliceBitsInBuffer = nSize_Result * 8;
+ CHECK_HR(AddExecuteBuffer(DXVA2_SliceControlBufferType, sizeof(m_SliceInfo), &m_SliceInfo));
- // Decode frame
- CHECK_HR (Execute());
- CHECK_HR (EndFrame(nSurfaceIndex));
+ // Decode frame
+ CHECK_HR(Execute());
+ CHECK_HR(EndFrame(nSurfaceIndex));
- // ***************
- if (nFrameSize) { // Decoding Second Field
- FFVC1UpdatePictureParam (&m_PictureParams, m_pFilter->GetAVCtx(), NULL, NULL, pDataIn, nSize, NULL, TRUE, &m_bFrame_repeat_pict);
+ // ***************
+ if (nFrameSize) { // Decoding Second Field
+ FFVC1UpdatePictureParam(&m_PictureParams, m_pFilter->GetAVCtx(), NULL, NULL, pDataIn, nSize, NULL, TRUE, &m_bFrame_repeat_pict);
- CHECK_HR (BeginFrame(nSurfaceIndex, pSampleToDeliver));
+ CHECK_HR(BeginFrame(nSurfaceIndex, pSampleToDeliver));
- TRACE_VC1 ("CDXVADecoderVC1::DecodeFrame() : PictureType = %d\n", nSliceType);
+ TRACE_VC1("CDXVADecoderVC1::DecodeFrame() : PictureType = %d\n", nSliceType);
- CHECK_HR (AddExecuteBuffer (DXVA2_PictureParametersBufferType, sizeof(m_PictureParams), &m_PictureParams));
+ CHECK_HR(AddExecuteBuffer(DXVA2_PictureParametersBufferType, sizeof(m_PictureParams), &m_PictureParams));
- // Send bitstream to accelerator
- CHECK_HR (AddExecuteBuffer (DXVA2_BitStreamDateBufferType, nSize - nFrameSize, pDataIn + nFrameSize, &nSize_Result));
+ // Send bitstream to accelerator
+ CHECK_HR(AddExecuteBuffer(DXVA2_BitStreamDateBufferType, nSize - nFrameSize, pDataIn + nFrameSize, &nSize_Result));
- m_SliceInfo.wQuantizerScaleCode = 1; // TODO : 1->31 ???
- m_SliceInfo.dwSliceBitsInBuffer = nSize_Result * 8;
- CHECK_HR (AddExecuteBuffer (DXVA2_SliceControlBufferType, sizeof (m_SliceInfo), &m_SliceInfo));
+ m_SliceInfo.wQuantizerScaleCode = 1; // TODO : 1->31 ???
+ m_SliceInfo.dwSliceBitsInBuffer = nSize_Result * 8;
+ CHECK_HR(AddExecuteBuffer(DXVA2_SliceControlBufferType, sizeof(m_SliceInfo), &m_SliceInfo));
- // Decode frame
- CHECK_HR (Execute());
- CHECK_HR (EndFrame(nSurfaceIndex));
- }
- // ***************
+ // Decode frame
+ CHECK_HR(Execute());
+ CHECK_HR(EndFrame(nSurfaceIndex));
+ }
+ // ***************
#ifdef _DEBUG
- DisplayStatus();
+ DisplayStatus();
#endif
- // Update timestamp & Re-order B frames
- if (m_bFrame_repeat_pict || m_pFilter->IsReorderBFrame()) {
- if (m_bFrame_repeat_pict) {
- m_pFilter->UpdateFrameTime(rtStart, rtStop, !!m_bFrame_repeat_pict);
- }
- if (m_pFilter->IsReorderBFrame() || m_pFilter->IsEvo()) {
- if (m_PictureParams.bPicBackwardPrediction == 1) {
- SwapRT (rtStart, m_rtStartDelayed);
- SwapRT (rtStop, m_rtStopDelayed);
- } else {
- // Save I or P reference time (swap later)
- if (!m_bFlushed) {
- if (m_nDelayedSurfaceIndex != -1) {
- UpdateStore (m_nDelayedSurfaceIndex, m_rtStartDelayed, m_rtStopDelayed);
- }
- m_rtStartDelayed = m_rtStopDelayed = _I64_MAX;
- SwapRT (rtStart, m_rtStartDelayed);
- SwapRT (rtStop, m_rtStopDelayed);
- m_nDelayedSurfaceIndex = nSurfaceIndex;
- }
- }
- }
- }
-
- AddToStore (nSurfaceIndex, pSampleToDeliver, (m_PictureParams.bPicBackwardPrediction != 1), rtStart, rtStop,
- false,(FF_FIELD_TYPE)nFieldType, (FF_SLICE_TYPE)nSliceType, 0);
- m_bFlushed = false;
-
- return DisplayNextFrame();
+ // Update timestamp & Re-order B frames
+ if (m_bFrame_repeat_pict || m_pFilter->IsReorderBFrame()) {
+ if (m_bFrame_repeat_pict) {
+ m_pFilter->UpdateFrameTime(rtStart, rtStop, !!m_bFrame_repeat_pict);
+ }
+ if (m_pFilter->IsReorderBFrame() || m_pFilter->IsEvo()) {
+ if (m_PictureParams.bPicBackwardPrediction == 1) {
+ SwapRT(rtStart, m_rtStartDelayed);
+ SwapRT(rtStop, m_rtStopDelayed);
+ } else {
+ // Save I or P reference time (swap later)
+ if (!m_bFlushed) {
+ if (m_nDelayedSurfaceIndex != -1) {
+ UpdateStore(m_nDelayedSurfaceIndex, m_rtStartDelayed, m_rtStopDelayed);
+ }
+ m_rtStartDelayed = m_rtStopDelayed = _I64_MAX;
+ SwapRT(rtStart, m_rtStartDelayed);
+ SwapRT(rtStop, m_rtStopDelayed);
+ m_nDelayedSurfaceIndex = nSurfaceIndex;
+ }
+ }
+ }
+ }
+
+ AddToStore(nSurfaceIndex, pSampleToDeliver, (m_PictureParams.bPicBackwardPrediction != 1), rtStart, rtStop,
+ false, (FF_FIELD_TYPE)nFieldType, (FF_SLICE_TYPE)nSliceType, 0);
+ m_bFlushed = false;
+
+ return DisplayNextFrame();
}
-void CDXVADecoderVC1::SetExtraData (BYTE* pDataIn, UINT nSize)
+void CDXVADecoderVC1::SetExtraData(BYTE* pDataIn, UINT nSize)
{
- m_PictureParams.bMacroblockWidthMinus1 = 15;
- m_PictureParams.bMacroblockHeightMinus1 = 15;
- m_PictureParams.bBlockWidthMinus1 = 7;
- m_PictureParams.bBlockHeightMinus1 = 7;
- m_PictureParams.bBPPminus1 = 7;
+ m_PictureParams.bMacroblockWidthMinus1 = 15;
+ m_PictureParams.bMacroblockHeightMinus1 = 15;
+ m_PictureParams.bBlockWidthMinus1 = 7;
+ m_PictureParams.bBlockHeightMinus1 = 7;
+ m_PictureParams.bBPPminus1 = 7;
- m_PictureParams.bChromaFormat = VC1_CHROMA_420;
+ m_PictureParams.bChromaFormat = VC1_CHROMA_420;
- m_PictureParams.bPicScanFixed = 0; // Use for status reporting sections 3.8.1 and 3.8.2
- m_PictureParams.bPicReadbackRequests = 0;
+ m_PictureParams.bPicScanFixed = 0; // Use for status reporting sections 3.8.1 and 3.8.2
+ m_PictureParams.bPicReadbackRequests = 0;
- m_PictureParams.bPicBinPB = 0; // TODO
- m_PictureParams.bMV_RPS = 0; // TODO
+ m_PictureParams.bPicBinPB = 0; // TODO
+ m_PictureParams.bMV_RPS = 0; // TODO
- m_PictureParams.bReservedBits = 0;
+ m_PictureParams.bReservedBits = 0;
- // iWMV9 - i9IRU - iOHIT - iINSO - iWMVA - 0 - 0 - 0 | Section 3.2.5
- m_PictureParams.bBidirectionalAveragingMode = (1 << 7) |
- (GetConfigIntraResidUnsigned() << 6) | // i9IRU
- (GetConfigResidDiffAccelerator() << 5); // iOHIT
+ // iWMV9 - i9IRU - iOHIT - iINSO - iWMVA - 0 - 0 - 0 | Section 3.2.5
+ m_PictureParams.bBidirectionalAveragingMode = (1 << 7) |
+ (GetConfigIntraResidUnsigned() << 6) | // i9IRU
+ (GetConfigResidDiffAccelerator() << 5); // iOHIT
}
BYTE* CDXVADecoderVC1::FindNextStartCode(BYTE* pBuffer, UINT nSize, UINT& nPacketSize)
{
- BYTE* pStart = pBuffer;
- BYTE bCode = 0;
- for (UINT i=0; i<nSize-4; i++) {
- if ( ((*((DWORD*)(pBuffer+i)) & 0x00FFFFFF) == 0x00010000) || (i >= nSize-5) ) {
- if (bCode == 0) {
- bCode = pBuffer[i+3];
- if ((nSize == 5) && (bCode == 0x0D)) {
- nPacketSize = nSize;
- return pBuffer;
- }
- } else {
- if (bCode == 0x0D) {
- // Start code found!
- nPacketSize = i - (pStart - pBuffer) + (i >= nSize-5 ? 5 : 1);
- return pStart;
- } else {
- // Other stuff, ignore it
- pStart = pBuffer + i;
- bCode = pBuffer[i+3];
- }
- }
- }
- }
-
- ASSERT (FALSE); // Should never happen!
-
- return NULL;
+ BYTE* pStart = pBuffer;
+ BYTE bCode = 0;
+ for (UINT i = 0; i < nSize - 4; i++) {
+ if (((*((DWORD*)(pBuffer + i)) & 0x00FFFFFF) == 0x00010000) || (i >= nSize - 5)) {
+ if (bCode == 0) {
+ bCode = pBuffer[i + 3];
+ if ((nSize == 5) && (bCode == 0x0D)) {
+ nPacketSize = nSize;
+ return pBuffer;
+ }
+ } else {
+ if (bCode == 0x0D) {
+ // Start code found!
+ nPacketSize = i - (pStart - pBuffer) + (i >= nSize - 5 ? 5 : 1);
+ return pStart;
+ } else {
+ // Other stuff, ignore it
+ pStart = pBuffer + i;
+ bCode = pBuffer[i + 3];
+ }
+ }
+ }
+ }
+
+ ASSERT(FALSE); // Should never happen!
+
+ return NULL;
}
void CDXVADecoderVC1::CopyBitstream(BYTE* pDXVABuffer, BYTE* pBuffer, UINT& nSize)
{
- int nDummy;
-
- if (m_PictureParams.bSecondField) {
- memcpy (pDXVABuffer, (BYTE*)pBuffer, nSize);
- } else {
- if ( (*((DWORD*)pBuffer) & 0x00FFFFFF) != 0x00010000) {
- if (m_pFilter->GetCodec() == CODEC_ID_WMV3) {
- memcpy (pDXVABuffer, (BYTE*)pBuffer, nSize);
- } else {
- pDXVABuffer[0]=pDXVABuffer[1]=0;
- pDXVABuffer[2]=1;
- pDXVABuffer[3]=0x0D;
- pDXVABuffer +=4;
- memcpy (pDXVABuffer, (BYTE*)pBuffer, nSize);
- nSize +=4;
- }
- } else {
- BYTE* pStart;
- UINT nPacketSize;
-
- pStart = FindNextStartCode (pBuffer, nSize, nPacketSize);
- if (pStart) {
- // Startcode already present
- memcpy (pDXVABuffer, (BYTE*)pStart, nPacketSize);
- nSize = nPacketSize;
- }
- }
- }
-
- // Copy bitstream buffer, with zero padding (buffer is rounded to multiple of 128)
- nDummy = 128 - (nSize %128);
-
- pDXVABuffer += nSize;
- memset (pDXVABuffer, 0, nDummy);
- nSize += nDummy;
+ int nDummy;
+
+ if (m_PictureParams.bSecondField) {
+ memcpy(pDXVABuffer, (BYTE*)pBuffer, nSize);
+ } else {
+ if ((*((DWORD*)pBuffer) & 0x00FFFFFF) != 0x00010000) {
+ if (m_pFilter->GetCodec() == CODEC_ID_WMV3) {
+ memcpy(pDXVABuffer, (BYTE*)pBuffer, nSize);
+ } else {
+ pDXVABuffer[0] = pDXVABuffer[1] = 0;
+ pDXVABuffer[2] = 1;
+ pDXVABuffer[3] = 0x0D;
+ pDXVABuffer += 4;
+ memcpy(pDXVABuffer, (BYTE*)pBuffer, nSize);
+ nSize += 4;
+ }
+ } else {
+ BYTE* pStart;
+ UINT nPacketSize;
+
+ pStart = FindNextStartCode(pBuffer, nSize, nPacketSize);
+ if (pStart) {
+ // Startcode already present
+ memcpy(pDXVABuffer, (BYTE*)pStart, nPacketSize);
+ nSize = nPacketSize;
+ }
+ }
+ }
+
+ // Copy bitstream buffer, with zero padding (buffer is rounded to multiple of 128)
+ nDummy = 128 - (nSize % 128);
+
+ pDXVABuffer += nSize;
+ memset(pDXVABuffer, 0, nDummy);
+ nSize += nDummy;
}
void CDXVADecoderVC1::Flush()
{
- m_nDelayedSurfaceIndex = -1;
- m_rtStartDelayed = _I64_MAX;
- m_rtStopDelayed = _I64_MAX;
+ m_nDelayedSurfaceIndex = -1;
+ m_rtStartDelayed = _I64_MAX;
+ m_rtStopDelayed = _I64_MAX;
- if (m_wRefPictureIndex[0] != NO_REF_FRAME) {
- RemoveRefFrame (m_wRefPictureIndex[0]);
- }
- if (m_wRefPictureIndex[1] != NO_REF_FRAME) {
- RemoveRefFrame (m_wRefPictureIndex[1]);
- }
+ if (m_wRefPictureIndex[0] != NO_REF_FRAME) {
+ RemoveRefFrame(m_wRefPictureIndex[0]);
+ }
+ if (m_wRefPictureIndex[1] != NO_REF_FRAME) {
+ RemoveRefFrame(m_wRefPictureIndex[1]);
+ }
- m_wRefPictureIndex[0] = NO_REF_FRAME;
- m_wRefPictureIndex[1] = NO_REF_FRAME;
+ m_wRefPictureIndex[0] = NO_REF_FRAME;
+ m_wRefPictureIndex[1] = NO_REF_FRAME;
- __super::Flush();
+ __super::Flush();
}
HRESULT CDXVADecoderVC1::DisplayStatus()
{
- HRESULT hr = E_INVALIDARG;
- DXVA_Status_VC1 Status;
+ HRESULT hr = E_INVALIDARG;
+ DXVA_Status_VC1 Status;
- memset (&Status, 0, sizeof(Status));
+ memset(&Status, 0, sizeof(Status));
- if (SUCCEEDED (hr = CDXVADecoder::QueryStatus(&Status, sizeof(Status)))) {
- Status.StatusReportFeedbackNumber = 0x00FF & Status.StatusReportFeedbackNumber;
+ if (SUCCEEDED(hr = CDXVADecoder::QueryStatus(&Status, sizeof(Status)))) {
+ Status.StatusReportFeedbackNumber = 0x00FF & Status.StatusReportFeedbackNumber;
- TRACE_VC1 ("CDXVADecoderVC1::DisplayStatus() : Status for the frame %u : bBufType = %u, bStatus = %u, wNumMbsAffected = %u\n",
- Status.StatusReportFeedbackNumber,
- Status.bBufType,
- Status.bStatus,
- Status.wNumMbsAffected);
- }
+ TRACE_VC1("CDXVADecoderVC1::DisplayStatus() : Status for the frame %u : bBufType = %u, bStatus = %u, wNumMbsAffected = %u\n",
+ Status.StatusReportFeedbackNumber,
+ Status.bBufType,
+ Status.bStatus,
+ Status.wNumMbsAffected);
+ }
- return hr;
+ return hr;
}
diff --git a/src/filters/transform/MPCVideoDec/DXVADecoderVC1.h b/src/filters/transform/MPCVideoDec/DXVADecoderVC1.h
index 21df8fbc8..fb2e8710b 100644
--- a/src/filters/transform/MPCVideoDec/DXVADecoderVC1.h
+++ b/src/filters/transform/MPCVideoDec/DXVADecoderVC1.h
@@ -29,80 +29,80 @@
class CDXVADecoderVC1 : public CDXVADecoder
{
public:
- CDXVADecoderVC1 (CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber);
- CDXVADecoderVC1 (CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config);
- virtual ~CDXVADecoderVC1(void);
-
- // === Public functions
- virtual HRESULT DecodeFrame (BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop);
- virtual void SetExtraData (BYTE* pDataIn, UINT nSize);
- virtual void CopyBitstream (BYTE* pDXVABuffer, BYTE* pBuffer, UINT& nSize);
- virtual void Flush();
-
- typedef enum {
- VC1_PS_TOP_FIELD = 1,
- VC1_PS_BOTTOM_FIELD = 2,
- VC1_PS_PROGRESSIVE = 3
- } VC1_INTERLACING;
-
- typedef enum {
- VC1_CHROMA_420 = 1,
- VC1_CHROMA_422 = 2,
- VC1_CHROMA_444 = 3
- } VC1_CHROMA_FORMAT;
-
- typedef enum {
- VC1_CR_BICUBIC_QUARTER_CHROMA = 4,
- VC1_CR_BICUBIC_HALF_CHROMA = 5,
- VC1_CR_BILINEAR_QUARTER_CHROMA = 12,
- VC1_CR_BILINEAR_HALF_CHROMA = 13,
- } VC1_CHROMA_RESIZE;
-
- typedef enum {
- VC1_SCAN_ZIGZAG = 0,
- VC1_SCAN_ALTERNATE_VERTICAL = 1,
- VC1_SCAN_ALTERNATE_HORIZONTAL = 2,
- VC1_SCAN_ARBITRARY = 3 // Use when bConfigHostInverseScan = 1
- } VC1_PIC_SCAN_METHOD;
-
- typedef enum { // Values for bPicDeblockConfined when bConfigBitstreamRaw = 1
- VC1_EXTENDED_DMV = 0x0001,
- VC1_PSF = 0x0002,
- VC1_REFPICFLAG = 0x0004,
- VC1_FINTERPFLAG = 0x0008,
- VC1_TFCNTRFLAG = 0x0010,
- VC1_INTERLACE = 0x0020,
- VC1_PULLDOWN = 0x0040,
- VC1_POSTPROCFLAG = 0x0080
- } VC1_DEBLOCK_CONFINED;
-
- typedef enum { // Values for bPicSpatialResid8
- VC1_VSTRANSFORM = 0x0001,
- VC1_DQUANT = 0x0002,
- VC1_EXTENDED_MV = 0x0004,
- VC1_FASTUVMC = 0x0008,
- VC1_LOOPFILTER = 0x0010,
- VC1_REDIST_FLAG = 0x0020,
- VC1_PANSCAN_FLAG = 0x0040,
- } VC1_PIC_SPATIAL_RESID8;
+ CDXVADecoderVC1(CMPCVideoDecFilter* pFilter, IAMVideoAccelerator* pAMVideoAccelerator, DXVAMode nMode, int nPicEntryNumber);
+ CDXVADecoderVC1(CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config);
+ virtual ~CDXVADecoderVC1(void);
+
+ // === Public functions
+ virtual HRESULT DecodeFrame(BYTE* pDataIn, UINT nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop);
+ virtual void SetExtraData(BYTE* pDataIn, UINT nSize);
+ virtual void CopyBitstream(BYTE* pDXVABuffer, BYTE* pBuffer, UINT& nSize);
+ virtual void Flush();
+
+ typedef enum {
+ VC1_PS_TOP_FIELD = 1,
+ VC1_PS_BOTTOM_FIELD = 2,
+ VC1_PS_PROGRESSIVE = 3
+ } VC1_INTERLACING;
+
+ typedef enum {
+ VC1_CHROMA_420 = 1,
+ VC1_CHROMA_422 = 2,
+ VC1_CHROMA_444 = 3
+ } VC1_CHROMA_FORMAT;
+
+ typedef enum {
+ VC1_CR_BICUBIC_QUARTER_CHROMA = 4,
+ VC1_CR_BICUBIC_HALF_CHROMA = 5,
+ VC1_CR_BILINEAR_QUARTER_CHROMA = 12,
+ VC1_CR_BILINEAR_HALF_CHROMA = 13,
+ } VC1_CHROMA_RESIZE;
+
+ typedef enum {
+ VC1_SCAN_ZIGZAG = 0,
+ VC1_SCAN_ALTERNATE_VERTICAL = 1,
+ VC1_SCAN_ALTERNATE_HORIZONTAL = 2,
+ VC1_SCAN_ARBITRARY = 3 // Use when bConfigHostInverseScan = 1
+ } VC1_PIC_SCAN_METHOD;
+
+ typedef enum { // Values for bPicDeblockConfined when bConfigBitstreamRaw = 1
+ VC1_EXTENDED_DMV = 0x0001,
+ VC1_PSF = 0x0002,
+ VC1_REFPICFLAG = 0x0004,
+ VC1_FINTERPFLAG = 0x0008,
+ VC1_TFCNTRFLAG = 0x0010,
+ VC1_INTERLACE = 0x0020,
+ VC1_PULLDOWN = 0x0040,
+ VC1_POSTPROCFLAG = 0x0080
+ } VC1_DEBLOCK_CONFINED;
+
+ typedef enum { // Values for bPicSpatialResid8
+ VC1_VSTRANSFORM = 0x0001,
+ VC1_DQUANT = 0x0002,
+ VC1_EXTENDED_MV = 0x0004,
+ VC1_FASTUVMC = 0x0008,
+ VC1_LOOPFILTER = 0x0010,
+ VC1_REDIST_FLAG = 0x0020,
+ VC1_PANSCAN_FLAG = 0x0040,
+ } VC1_PIC_SPATIAL_RESID8;
protected :
private:
- DXVA_PictureParameters m_PictureParams;
- DXVA_SliceInfo m_SliceInfo;
- WORD m_wRefPictureIndex[2];
+ DXVA_PictureParameters m_PictureParams;
+ DXVA_SliceInfo m_SliceInfo;
+ WORD m_wRefPictureIndex[2];
- int m_nDelayedSurfaceIndex;
- REFERENCE_TIME m_rtStartDelayed;
- REFERENCE_TIME m_rtStopDelayed;
+ int m_nDelayedSurfaceIndex;
+ REFERENCE_TIME m_rtStartDelayed;
+ REFERENCE_TIME m_rtStopDelayed;
- BOOL m_bFrame_repeat_pict;
+ BOOL m_bFrame_repeat_pict;
- // Private functions
- void Init();
- HRESULT DisplayStatus();
- BYTE* FindNextStartCode(BYTE* pBuffer, UINT nSize, UINT& nPacketSize);
+ // Private functions
+ void Init();
+ HRESULT DisplayStatus();
+ BYTE* FindNextStartCode(BYTE* pBuffer, UINT nSize, UINT& nPacketSize);
};
diff --git a/src/filters/transform/MPCVideoDec/FfmpegContext.cpp b/src/filters/transform/MPCVideoDec/FfmpegContext.cpp
index 2bf679e0f..4660e79e2 100644
--- a/src/filters/transform/MPCVideoDec/FfmpegContext.cpp
+++ b/src/filters/transform/MPCVideoDec/FfmpegContext.cpp
@@ -34,779 +34,782 @@
#include "../../../DSUtil/SysVersion.h"
extern "C" {
- #include <ffmpeg/libavcodec/dsputil.h>
- #include <ffmpeg/libavcodec/avcodec.h>
-// This is kind of an hack but it avoids using a C++ keyword as a struct member name
+#include <ffmpeg/libavcodec/dsputil.h>
+#include <ffmpeg/libavcodec/avcodec.h>
+ // This is kind of an hack but it avoids using a C++ keyword as a struct member name
#define class classFFMPEG
- #include <ffmpeg/libavcodec/mpegvideo.h>
+#include <ffmpeg/libavcodec/mpegvideo.h>
#undef class
- #include <ffmpeg/libavcodec/golomb.h>
+#include <ffmpeg/libavcodec/golomb.h>
- #include <ffmpeg/libavcodec/h264.h>
- #include <ffmpeg/libavcodec/h264data.h>
- #include <ffmpeg/libavcodec/vc1.h>
- #include <ffmpeg/libavcodec/mpeg12.h>
+#include <ffmpeg/libavcodec/h264.h>
+#include <ffmpeg/libavcodec/h264data.h>
+#include <ffmpeg/libavcodec/vc1.h>
+#include <ffmpeg/libavcodec/mpeg12.h>
- int av_h264_decode_frame(struct AVCodecContext* avctx, int* nOutPOC, int64_t* rtStartTime, uint8_t *buf, int buf_size);
- int av_vc1_decode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_size, int *nFrameSize);
- void av_init_packet(AVPacket *pkt);
+ int av_h264_decode_frame(struct AVCodecContext* avctx, int* nOutPOC, int64_t* rtStartTime, uint8_t* buf, int buf_size);
+ int av_vc1_decode_frame(AVCodecContext* avctx, uint8_t* buf, int buf_size, int* nFrameSize);
+ void av_init_packet(AVPacket* pkt);
- #ifdef _WIN64
- // Hack to use MinGW64 from 2.x branch
- void __mingw_raise_matherr(int typ, const char *name, double a1, double a2, double rslt) {}
- #endif
+#ifdef _WIN64
+ // Hack to use MinGW64 from 2.x branch
+ void __mingw_raise_matherr(int typ, const char* name, double a1, double a2, double rslt) {}
+#endif
}
#if defined(REGISTER_FILTER) && _WIN64
-void *__imp_toupper = toupper;
-void *__imp_time64 = _time64;
+void* __imp_toupper = toupper;
+void* __imp_time64 = _time64;
#endif
const byte ZZ_SCAN[16] = {
- 0, 1, 4, 8,
- 5, 2, 3, 6,
- 9, 12, 13, 10,
- 7, 11, 14, 15
+ 0, 1, 4, 8,
+ 5, 2, 3, 6,
+ 9, 12, 13, 10,
+ 7, 11, 14, 15
};
const byte ZZ_SCAN8[64] = {
- 0, 1, 8, 16, 9, 2, 3, 10,
- 17, 24, 32, 25, 18, 11, 4, 5,
- 12, 19, 26, 33, 40, 48, 41, 34,
- 27, 20, 13, 6, 7, 14, 21, 28,
- 35, 42, 49, 56, 57, 50, 43, 36,
- 29, 22, 15, 23, 30, 37, 44, 51,
- 58, 59, 52, 45, 38, 31, 39, 46,
- 53, 60, 61, 54, 47, 55, 62, 63
+ 0, 1, 8, 16, 9, 2, 3, 10,
+ 17, 24, 32, 25, 18, 11, 4, 5,
+ 12, 19, 26, 33, 40, 48, 41, 34,
+ 27, 20, 13, 6, 7, 14, 21, 28,
+ 35, 42, 49, 56, 57, 50, 43, 36,
+ 29, 22, 15, 23, 30, 37, 44, 51,
+ 58, 59, 52, 45, 38, 31, 39, 46,
+ 53, 60, 61, 54, 47, 55, 62, 63
};
inline MpegEncContext* GetMpegEncContext(struct AVCodecContext* pAVCtx)
{
- Mpeg1Context* s1;
- MpegEncContext* s = NULL;
-
- switch (pAVCtx->codec_id) {
- case CODEC_ID_VC1 :
- case CODEC_ID_H264 :
- s = (MpegEncContext*)pAVCtx->priv_data;
- break;
- case CODEC_ID_MPEG2VIDEO:
- s1 = (Mpeg1Context*)pAVCtx->priv_data;
- s = (MpegEncContext*)&s1->mpeg_enc_ctx;
- break;
- }
- return s;
+ Mpeg1Context* s1;
+ MpegEncContext* s = NULL;
+
+ switch (pAVCtx->codec_id) {
+ case CODEC_ID_VC1 :
+ case CODEC_ID_H264 :
+ s = (MpegEncContext*)pAVCtx->priv_data;
+ break;
+ case CODEC_ID_MPEG2VIDEO:
+ s1 = (Mpeg1Context*)pAVCtx->priv_data;
+ s = (MpegEncContext*)&s1->mpeg_enc_ctx;
+ break;
+ }
+ return s;
}
-int FFH264DecodeBuffer (struct AVCodecContext* pAVCtx, BYTE* pBuffer, UINT nSize, int* pFramePOC, int* pOutPOC, REFERENCE_TIME* pOutrtStart)
+int FFH264DecodeBuffer(struct AVCodecContext* pAVCtx, BYTE* pBuffer, UINT nSize, int* pFramePOC, int* pOutPOC, REFERENCE_TIME* pOutrtStart)
{
- int result = -1;
- if (pBuffer != NULL) {
- H264Context* h = (H264Context*) pAVCtx->priv_data;
- result = av_h264_decode_frame (pAVCtx, pOutPOC, pOutrtStart, pBuffer, nSize);
-
- if (result != -1 && h->s.current_picture_ptr != NULL && pFramePOC) {
- *pFramePOC = h->s.current_picture_ptr->poc;
- }
- }
- return result;
+ int result = -1;
+ if (pBuffer != NULL) {
+ H264Context* h = (H264Context*) pAVCtx->priv_data;
+ result = av_h264_decode_frame(pAVCtx, pOutPOC, pOutrtStart, pBuffer, nSize);
+
+ if (result != -1 && h->s.current_picture_ptr != NULL && pFramePOC) {
+ *pFramePOC = h->s.current_picture_ptr->poc;
+ }
+ }
+ return result;
}
// returns TRUE if version is equal to or higher than A.B.C.D, returns FALSE otherwise
BOOL DriverVersionCheck(LARGE_INTEGER VideoDriverVersion, int A, int B, int C, int D)
{
- if (HIWORD(VideoDriverVersion.HighPart) > A) {
- return TRUE;
- } else if (HIWORD(VideoDriverVersion.HighPart) == A) {
- if (LOWORD(VideoDriverVersion.HighPart) > B) {
- return TRUE;
- } else if (LOWORD(VideoDriverVersion.HighPart) == B) {
- if (HIWORD(VideoDriverVersion.LowPart) > C) {
- return TRUE;
- } else if (HIWORD(VideoDriverVersion.LowPart) == C) {
- if (LOWORD(VideoDriverVersion.LowPart) >= D) {
- return TRUE;
- }
- }
- }
- }
- return FALSE;
+ if (HIWORD(VideoDriverVersion.HighPart) > A) {
+ return TRUE;
+ } else if (HIWORD(VideoDriverVersion.HighPart) == A) {
+ if (LOWORD(VideoDriverVersion.HighPart) > B) {
+ return TRUE;
+ } else if (LOWORD(VideoDriverVersion.HighPart) == B) {
+ if (HIWORD(VideoDriverVersion.LowPart) > C) {
+ return TRUE;
+ } else if (HIWORD(VideoDriverVersion.LowPart) == C) {
+ if (LOWORD(VideoDriverVersion.LowPart) >= D) {
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
}
int FFH264CheckCompatibility(int nWidth, int nHeight, struct AVCodecContext* pAVCtx, BYTE* pBuffer, UINT nSize, DWORD nPCIVendor, DWORD nPCIDevice, LARGE_INTEGER VideoDriverVersion)
{
- H264Context* pContext = (H264Context*) pAVCtx->priv_data;
- SPS* cur_sps;
- PPS* cur_pps;
-
- int video_is_level51 = 0;
- int no_level51_support = 1;
- int too_much_ref_frames = 0;
- int profile_higher_than_high = 0;
- int max_ref_frames_dpb41 = min(11, 8388608/(nWidth * nHeight) );
-
- if (pBuffer != NULL) {
- av_h264_decode_frame (pAVCtx, NULL, NULL, pBuffer, nSize);
- }
-
- cur_sps = pContext->sps_buffers[0];
- cur_pps = pContext->pps_buffers[0];
-
- if (cur_sps != NULL) {
- int max_ref_frames = 0;
-
- if (cur_sps->bit_depth_luma > 8 || cur_sps->chroma_format_idc > 1) {
- return DXVA_HIGH_BIT;
- }
-
- video_is_level51 = cur_sps->level_idc >= 51 ? 1 : 0;
- profile_higher_than_high = (cur_sps->profile_idc > 100);
- max_ref_frames = max_ref_frames_dpb41; // default value is calculate
-
- if (nPCIVendor == PCIV_nVidia) {
- // nVidia cards support level 5.1 since drivers v6.14.11.7800 for XP and drivers v7.15.11.7800 for Vista/7
- if (SysVersion::IsVistaOrLater()) {
- if (DriverVersionCheck(VideoDriverVersion, 7, 15, 11, 7800)) {
- no_level51_support = 0;
-
- // max ref frames is 16 for HD and 11 otherwise
- if (nWidth >= 1280) {
- max_ref_frames = 16;
- } else {
- max_ref_frames = 11;
- }
- }
- } else {
- if (DriverVersionCheck(VideoDriverVersion, 6, 14, 11, 7800)) {
- no_level51_support = 0;
-
- // max ref frames is 14
- max_ref_frames = 14;
- }
- }
- } else if (nPCIVendor == PCIV_S3_Graphics) {
- no_level51_support = 0;
- } else if (nPCIVendor == PCIV_ATI) {
- // HD4xxx, HD5xxx, and HD6xxx AMD/ATI cards support level 5.1 since drivers v8.14.1.6105 (Catalyst 10.4)
- if (nPCIDevice > 0x6700) {
- if (DriverVersionCheck(VideoDriverVersion, 8, 14, 1, 6105)) {
- no_level51_support = 0;
- max_ref_frames = 16;
- }
- }
- }
-
- // Check maximum allowed number reference frames
- if (cur_sps->ref_frame_count > max_ref_frames) {
- too_much_ref_frames = 1;
- }
- }
-
- return (video_is_level51 * no_level51_support * DXVA_UNSUPPORTED_LEVEL) + (too_much_ref_frames * DXVA_TOO_MANY_REF_FRAMES) + (profile_higher_than_high * DXVA_PROFILE_HIGHER_THAN_HIGH);
+ H264Context* pContext = (H264Context*) pAVCtx->priv_data;
+ SPS* cur_sps;
+ PPS* cur_pps;
+
+ int video_is_level51 = 0;
+ int no_level51_support = 1;
+ int too_much_ref_frames = 0;
+ int profile_higher_than_high = 0;
+ int max_ref_frames_dpb41 = min(11, 8388608 / (nWidth * nHeight));
+
+ if (pBuffer != NULL) {
+ av_h264_decode_frame(pAVCtx, NULL, NULL, pBuffer, nSize);
+ }
+
+ cur_sps = pContext->sps_buffers[0];
+ cur_pps = pContext->pps_buffers[0];
+
+ if (cur_sps != NULL) {
+ int max_ref_frames = 0;
+
+ if (cur_sps->bit_depth_luma > 8 || cur_sps->chroma_format_idc > 1) {
+ return DXVA_HIGH_BIT;
+ }
+
+ video_is_level51 = cur_sps->level_idc >= 51 ? 1 : 0;
+ profile_higher_than_high = (cur_sps->profile_idc > 100);
+ max_ref_frames = max_ref_frames_dpb41; // default value is calculate
+
+ if (nPCIVendor == PCIV_nVidia) {
+ // nVidia cards support level 5.1 since drivers v6.14.11.7800 for XP and drivers v7.15.11.7800 for Vista/7
+ if (SysVersion::IsVistaOrLater()) {
+ if (DriverVersionCheck(VideoDriverVersion, 7, 15, 11, 7800)) {
+ no_level51_support = 0;
+
+ // max ref frames is 16 for HD and 11 otherwise
+ if (nWidth >= 1280) {
+ max_ref_frames = 16;
+ } else {
+ max_ref_frames = 11;
+ }
+ }
+ } else {
+ if (DriverVersionCheck(VideoDriverVersion, 6, 14, 11, 7800)) {
+ no_level51_support = 0;
+
+ // max ref frames is 14
+ max_ref_frames = 14;
+ }
+ }
+ } else if (nPCIVendor == PCIV_S3_Graphics) {
+ no_level51_support = 0;
+ } else if (nPCIVendor == PCIV_ATI) {
+ // HD4xxx, HD5xxx, and HD6xxx AMD/ATI cards support level 5.1 since drivers v8.14.1.6105 (Catalyst 10.4)
+ if (nPCIDevice > 0x6700) {
+ if (DriverVersionCheck(VideoDriverVersion, 8, 14, 1, 6105)) {
+ no_level51_support = 0;
+ max_ref_frames = 16;
+ }
+ }
+ }
+
+ // Check maximum allowed number reference frames
+ if (cur_sps->ref_frame_count > max_ref_frames) {
+ too_much_ref_frames = 1;
+ }
+ }
+
+ return (video_is_level51 * no_level51_support * DXVA_UNSUPPORTED_LEVEL) + (too_much_ref_frames * DXVA_TOO_MANY_REF_FRAMES) + (profile_higher_than_high * DXVA_PROFILE_HIGHER_THAN_HIGH);
}
void CopyScalingMatrix(DXVA_Qmatrix_H264* pDest, PPS* pps, DWORD nPCIVendor)
{
- int i, j;
- memset(pDest, 0, sizeof(DXVA_Qmatrix_H264));
- if (nPCIVendor == PCIV_ATI) {
- for (i = 0; i < 6; i++)
- for (j = 0; j < 16; j++)
- pDest->bScalingLists4x4[i][j] = pps->scaling_matrix4[i][j];
-
- for (i = 0; i < 64; i++) {
- pDest->bScalingLists8x8[0][i] = pps->scaling_matrix8[0][i];
- pDest->bScalingLists8x8[1][i] = pps->scaling_matrix8[3][i];
- }
- } else {
- for (i = 0; i < 6; i++)
- for (j = 0; j < 16; j++)
- pDest->bScalingLists4x4[i][j] = pps->scaling_matrix4[i][ZZ_SCAN[j]];
-
- for (i = 0; i < 64; i++) {
- pDest->bScalingLists8x8[0][i] = pps->scaling_matrix8[0][ZZ_SCAN8[i]];
- pDest->bScalingLists8x8[1][i] = pps->scaling_matrix8[3][ZZ_SCAN8[i]];
- }
- }
+ int i, j;
+ memset(pDest, 0, sizeof(DXVA_Qmatrix_H264));
+ if (nPCIVendor == PCIV_ATI) {
+ for (i = 0; i < 6; i++)
+ for (j = 0; j < 16; j++) {
+ pDest->bScalingLists4x4[i][j] = pps->scaling_matrix4[i][j];
+ }
+
+ for (i = 0; i < 64; i++) {
+ pDest->bScalingLists8x8[0][i] = pps->scaling_matrix8[0][i];
+ pDest->bScalingLists8x8[1][i] = pps->scaling_matrix8[3][i];
+ }
+ } else {
+ for (i = 0; i < 6; i++)
+ for (j = 0; j < 16; j++) {
+ pDest->bScalingLists4x4[i][j] = pps->scaling_matrix4[i][ZZ_SCAN[j]];
+ }
+
+ for (i = 0; i < 64; i++) {
+ pDest->bScalingLists8x8[0][i] = pps->scaling_matrix8[0][ZZ_SCAN8[i]];
+ pDest->bScalingLists8x8[1][i] = pps->scaling_matrix8[3][ZZ_SCAN8[i]];
+ }
+ }
}
USHORT FFH264FindRefFrameIndex(USHORT num_frame, DXVA_PicParams_H264* pDXVAPicParams)
{
- int i;
- for (i=0; i<pDXVAPicParams->num_ref_frames; i++) {
- if (pDXVAPicParams->FrameNumList[i] == num_frame) {
- return pDXVAPicParams->RefFrameList[i].Index7Bits;
- }
- }
+ int i;
+ for (i = 0; i < pDXVAPicParams->num_ref_frames; i++) {
+ if (pDXVAPicParams->FrameNumList[i] == num_frame) {
+ return pDXVAPicParams->RefFrameList[i].Index7Bits;
+ }
+ }
#ifdef _DEBUG
- // DebugBreak(); // Ref frame not found !
+ // DebugBreak(); // Ref frame not found !
#endif
- return 127;
+ return 127;
}
-HRESULT FFH264BuildPicParams (DXVA_PicParams_H264* pDXVAPicParams, DXVA_Qmatrix_H264* pDXVAScalingMatrix, int* nFieldType, int* nSliceType, struct AVCodecContext* pAVCtx, DWORD nPCIVendor)
+HRESULT FFH264BuildPicParams(DXVA_PicParams_H264* pDXVAPicParams, DXVA_Qmatrix_H264* pDXVAScalingMatrix, int* nFieldType, int* nSliceType, struct AVCodecContext* pAVCtx, DWORD nPCIVendor)
{
- H264Context* h = (H264Context*) pAVCtx->priv_data;
- SPS* cur_sps;
- PPS* cur_pps;
- MpegEncContext* const s = &h->s;
- int field_pic_flag;
- HRESULT hr = E_FAIL;
- const Picture *current_picture = s->current_picture_ptr;
-
- field_pic_flag = (h->s.picture_structure != PICT_FRAME);
-
- cur_sps = &h->sps;
- cur_pps = &h->pps;
-
- if (cur_sps && cur_pps) {
- *nFieldType = h->s.picture_structure;
- if (h->sps.pic_struct_present_flag) {
- switch (h->sei_pic_struct) {
- case SEI_PIC_STRUCT_TOP_FIELD:
- case SEI_PIC_STRUCT_TOP_BOTTOM:
- case SEI_PIC_STRUCT_TOP_BOTTOM_TOP:
- *nFieldType = PICT_TOP_FIELD;
- break;
- case SEI_PIC_STRUCT_BOTTOM_FIELD:
- case SEI_PIC_STRUCT_BOTTOM_TOP:
- case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM:
- *nFieldType = PICT_BOTTOM_FIELD;
- break;
- case SEI_PIC_STRUCT_FRAME_DOUBLING:
- case SEI_PIC_STRUCT_FRAME_TRIPLING:
- case SEI_PIC_STRUCT_FRAME:
- *nFieldType = PICT_FRAME;
- break;
- }
- }
-
- *nSliceType = h->slice_type;
-
- if (cur_sps->mb_width==0 || cur_sps->mb_height==0) {
- return VFW_E_INVALID_FILE_FORMAT;
- }
-
- pDXVAPicParams->wFrameWidthInMbsMinus1 = cur_sps->mb_width - 1; // pic_width_in_mbs_minus1;
- pDXVAPicParams->wFrameHeightInMbsMinus1 = cur_sps->mb_height * (2 - cur_sps->frame_mbs_only_flag) - 1; // pic_height_in_map_units_minus1;
- pDXVAPicParams->num_ref_frames = cur_sps->ref_frame_count; // num_ref_frames;
- pDXVAPicParams->field_pic_flag = field_pic_flag;
- pDXVAPicParams->MbaffFrameFlag = (h->sps.mb_aff && (field_pic_flag==0));
- pDXVAPicParams->residual_colour_transform_flag = cur_sps->residual_color_transform_flag;
- pDXVAPicParams->sp_for_switch_flag = h->sp_for_switch_flag;
- pDXVAPicParams->chroma_format_idc = cur_sps->chroma_format_idc;
- pDXVAPicParams->RefPicFlag = h->ref_pic_flag;
- pDXVAPicParams->constrained_intra_pred_flag = cur_pps->constrained_intra_pred;
- pDXVAPicParams->weighted_pred_flag = cur_pps->weighted_pred;
- pDXVAPicParams->weighted_bipred_idc = cur_pps->weighted_bipred_idc;
- pDXVAPicParams->frame_mbs_only_flag = cur_sps->frame_mbs_only_flag;
- pDXVAPicParams->transform_8x8_mode_flag = cur_pps->transform_8x8_mode;
- pDXVAPicParams->MinLumaBipredSize8x8Flag = h->sps.level_idc >= 31;
- pDXVAPicParams->IntraPicFlag = (h->slice_type == AV_PICTURE_TYPE_I || h->slice_type == AV_PICTURE_TYPE_SI);
-
- pDXVAPicParams->bit_depth_luma_minus8 = cur_sps->bit_depth_luma - 8; // bit_depth_luma_minus8
- pDXVAPicParams->bit_depth_chroma_minus8 = cur_sps->bit_depth_chroma - 8; // bit_depth_chroma_minus8
-
- // pDXVAPicParams->StatusReportFeedbackNumber = SET IN DecodeFrame;
- // pDXVAPicParams->CurrFieldOrderCnt = SET IN UpdateRefFramesList;
- // pDXVAPicParams->FieldOrderCntList = SET IN UpdateRefFramesList;
- // pDXVAPicParams->FrameNumList = SET IN UpdateRefFramesList;
- // pDXVAPicParams->UsedForReferenceFlags = SET IN UpdateRefFramesList;
- // pDXVAPicParams->NonExistingFrameFlags
-
- pDXVAPicParams->frame_num = h->frame_num;
-
- pDXVAPicParams->log2_max_frame_num_minus4 = cur_sps->log2_max_frame_num - 4; // log2_max_frame_num_minus4;
- pDXVAPicParams->pic_order_cnt_type = cur_sps->poc_type; // pic_order_cnt_type;
- if (cur_sps->poc_type == 0)
- pDXVAPicParams->log2_max_pic_order_cnt_lsb_minus4 = cur_sps->log2_max_poc_lsb - 4; // log2_max_pic_order_cnt_lsb_minus4;
- else if (cur_sps->poc_type == 1)
- pDXVAPicParams->delta_pic_order_always_zero_flag = cur_sps->delta_pic_order_always_zero_flag;
- pDXVAPicParams->direct_8x8_inference_flag = cur_sps->direct_8x8_inference_flag;
- pDXVAPicParams->entropy_coding_mode_flag = cur_pps->cabac; // entropy_coding_mode_flag;
- pDXVAPicParams->pic_order_present_flag = cur_pps->pic_order_present; // pic_order_present_flag;
- pDXVAPicParams->num_slice_groups_minus1 = cur_pps->slice_group_count - 1; // num_slice_groups_minus1;
- pDXVAPicParams->slice_group_map_type = cur_pps->mb_slice_group_map_type; // slice_group_map_type;
- pDXVAPicParams->deblocking_filter_control_present_flag = cur_pps->deblocking_filter_parameters_present; // deblocking_filter_control_present_flag;
- pDXVAPicParams->redundant_pic_cnt_present_flag = cur_pps->redundant_pic_cnt_present; // redundant_pic_cnt_present_flag;
-
- pDXVAPicParams->chroma_qp_index_offset = cur_pps->chroma_qp_index_offset[0];
- pDXVAPicParams->second_chroma_qp_index_offset = cur_pps->chroma_qp_index_offset[1];
- pDXVAPicParams->num_ref_idx_l0_active_minus1 = cur_pps->ref_count[0]-1; // num_ref_idx_l0_active_minus1;
- pDXVAPicParams->num_ref_idx_l1_active_minus1 = cur_pps->ref_count[1]-1; // num_ref_idx_l1_active_minus1;
- pDXVAPicParams->pic_init_qp_minus26 = cur_pps->init_qp - 26;
- pDXVAPicParams->pic_init_qs_minus26 = cur_pps->init_qs - 26;
-
- pDXVAPicParams->CurrPic.AssociatedFlag = field_pic_flag && (h->s.picture_structure == PICT_BOTTOM_FIELD);
- pDXVAPicParams->CurrFieldOrderCnt[0] = 0;
- if ((h->s.picture_structure & PICT_TOP_FIELD) && current_picture->field_poc[0] != INT_MAX) {
- pDXVAPicParams->CurrFieldOrderCnt[0] = current_picture->field_poc[0];
- }
- pDXVAPicParams->CurrFieldOrderCnt[1] = 0;
- if ((h->s.picture_structure & PICT_BOTTOM_FIELD) && current_picture->field_poc[1] != INT_MAX) {
- pDXVAPicParams->CurrFieldOrderCnt[1] = current_picture->field_poc[1];
- }
-
- CopyScalingMatrix (pDXVAScalingMatrix, cur_pps, nPCIVendor);
- hr = S_OK;
- }
-
- return hr;
+ H264Context* h = (H264Context*) pAVCtx->priv_data;
+ SPS* cur_sps;
+ PPS* cur_pps;
+ MpegEncContext* const s = &h->s;
+ int field_pic_flag;
+ HRESULT hr = E_FAIL;
+ const Picture* current_picture = s->current_picture_ptr;
+
+ field_pic_flag = (h->s.picture_structure != PICT_FRAME);
+
+ cur_sps = &h->sps;
+ cur_pps = &h->pps;
+
+ if (cur_sps && cur_pps) {
+ *nFieldType = h->s.picture_structure;
+ if (h->sps.pic_struct_present_flag) {
+ switch (h->sei_pic_struct) {
+ case SEI_PIC_STRUCT_TOP_FIELD:
+ case SEI_PIC_STRUCT_TOP_BOTTOM:
+ case SEI_PIC_STRUCT_TOP_BOTTOM_TOP:
+ *nFieldType = PICT_TOP_FIELD;
+ break;
+ case SEI_PIC_STRUCT_BOTTOM_FIELD:
+ case SEI_PIC_STRUCT_BOTTOM_TOP:
+ case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM:
+ *nFieldType = PICT_BOTTOM_FIELD;
+ break;
+ case SEI_PIC_STRUCT_FRAME_DOUBLING:
+ case SEI_PIC_STRUCT_FRAME_TRIPLING:
+ case SEI_PIC_STRUCT_FRAME:
+ *nFieldType = PICT_FRAME;
+ break;
+ }
+ }
+
+ *nSliceType = h->slice_type;
+
+ if (cur_sps->mb_width == 0 || cur_sps->mb_height == 0) {
+ return VFW_E_INVALID_FILE_FORMAT;
+ }
+
+ pDXVAPicParams->wFrameWidthInMbsMinus1 = cur_sps->mb_width - 1; // pic_width_in_mbs_minus1;
+ pDXVAPicParams->wFrameHeightInMbsMinus1 = cur_sps->mb_height * (2 - cur_sps->frame_mbs_only_flag) - 1; // pic_height_in_map_units_minus1;
+ pDXVAPicParams->num_ref_frames = cur_sps->ref_frame_count; // num_ref_frames;
+ pDXVAPicParams->field_pic_flag = field_pic_flag;
+ pDXVAPicParams->MbaffFrameFlag = (h->sps.mb_aff && (field_pic_flag == 0));
+ pDXVAPicParams->residual_colour_transform_flag = cur_sps->residual_color_transform_flag;
+ pDXVAPicParams->sp_for_switch_flag = h->sp_for_switch_flag;
+ pDXVAPicParams->chroma_format_idc = cur_sps->chroma_format_idc;
+ pDXVAPicParams->RefPicFlag = h->ref_pic_flag;
+ pDXVAPicParams->constrained_intra_pred_flag = cur_pps->constrained_intra_pred;
+ pDXVAPicParams->weighted_pred_flag = cur_pps->weighted_pred;
+ pDXVAPicParams->weighted_bipred_idc = cur_pps->weighted_bipred_idc;
+ pDXVAPicParams->frame_mbs_only_flag = cur_sps->frame_mbs_only_flag;
+ pDXVAPicParams->transform_8x8_mode_flag = cur_pps->transform_8x8_mode;
+ pDXVAPicParams->MinLumaBipredSize8x8Flag = h->sps.level_idc >= 31;
+ pDXVAPicParams->IntraPicFlag = (h->slice_type == AV_PICTURE_TYPE_I || h->slice_type == AV_PICTURE_TYPE_SI);
+
+ pDXVAPicParams->bit_depth_luma_minus8 = cur_sps->bit_depth_luma - 8; // bit_depth_luma_minus8
+ pDXVAPicParams->bit_depth_chroma_minus8 = cur_sps->bit_depth_chroma - 8; // bit_depth_chroma_minus8
+
+ // pDXVAPicParams->StatusReportFeedbackNumber = SET IN DecodeFrame;
+ // pDXVAPicParams->CurrFieldOrderCnt = SET IN UpdateRefFramesList;
+ // pDXVAPicParams->FieldOrderCntList = SET IN UpdateRefFramesList;
+ // pDXVAPicParams->FrameNumList = SET IN UpdateRefFramesList;
+ // pDXVAPicParams->UsedForReferenceFlags = SET IN UpdateRefFramesList;
+ // pDXVAPicParams->NonExistingFrameFlags
+
+ pDXVAPicParams->frame_num = h->frame_num;
+
+ pDXVAPicParams->log2_max_frame_num_minus4 = cur_sps->log2_max_frame_num - 4; // log2_max_frame_num_minus4;
+ pDXVAPicParams->pic_order_cnt_type = cur_sps->poc_type; // pic_order_cnt_type;
+ if (cur_sps->poc_type == 0) {
+ pDXVAPicParams->log2_max_pic_order_cnt_lsb_minus4 = cur_sps->log2_max_poc_lsb - 4; // log2_max_pic_order_cnt_lsb_minus4;
+ } else if (cur_sps->poc_type == 1) {
+ pDXVAPicParams->delta_pic_order_always_zero_flag = cur_sps->delta_pic_order_always_zero_flag;
+ }
+ pDXVAPicParams->direct_8x8_inference_flag = cur_sps->direct_8x8_inference_flag;
+ pDXVAPicParams->entropy_coding_mode_flag = cur_pps->cabac; // entropy_coding_mode_flag;
+ pDXVAPicParams->pic_order_present_flag = cur_pps->pic_order_present; // pic_order_present_flag;
+ pDXVAPicParams->num_slice_groups_minus1 = cur_pps->slice_group_count - 1; // num_slice_groups_minus1;
+ pDXVAPicParams->slice_group_map_type = cur_pps->mb_slice_group_map_type; // slice_group_map_type;
+ pDXVAPicParams->deblocking_filter_control_present_flag = cur_pps->deblocking_filter_parameters_present; // deblocking_filter_control_present_flag;
+ pDXVAPicParams->redundant_pic_cnt_present_flag = cur_pps->redundant_pic_cnt_present; // redundant_pic_cnt_present_flag;
+
+ pDXVAPicParams->chroma_qp_index_offset = cur_pps->chroma_qp_index_offset[0];
+ pDXVAPicParams->second_chroma_qp_index_offset = cur_pps->chroma_qp_index_offset[1];
+ pDXVAPicParams->num_ref_idx_l0_active_minus1 = cur_pps->ref_count[0] - 1; // num_ref_idx_l0_active_minus1;
+ pDXVAPicParams->num_ref_idx_l1_active_minus1 = cur_pps->ref_count[1] - 1; // num_ref_idx_l1_active_minus1;
+ pDXVAPicParams->pic_init_qp_minus26 = cur_pps->init_qp - 26;
+ pDXVAPicParams->pic_init_qs_minus26 = cur_pps->init_qs - 26;
+
+ pDXVAPicParams->CurrPic.AssociatedFlag = field_pic_flag && (h->s.picture_structure == PICT_BOTTOM_FIELD);
+ pDXVAPicParams->CurrFieldOrderCnt[0] = 0;
+ if ((h->s.picture_structure & PICT_TOP_FIELD) && current_picture->field_poc[0] != INT_MAX) {
+ pDXVAPicParams->CurrFieldOrderCnt[0] = current_picture->field_poc[0];
+ }
+ pDXVAPicParams->CurrFieldOrderCnt[1] = 0;
+ if ((h->s.picture_structure & PICT_BOTTOM_FIELD) && current_picture->field_poc[1] != INT_MAX) {
+ pDXVAPicParams->CurrFieldOrderCnt[1] = current_picture->field_poc[1];
+ }
+
+ CopyScalingMatrix(pDXVAScalingMatrix, cur_pps, nPCIVendor);
+ hr = S_OK;
+ }
+
+ return hr;
}
-void FFH264SetCurrentPicture (int nIndex, DXVA_PicParams_H264* pDXVAPicParams, struct AVCodecContext* pAVCtx)
+void FFH264SetCurrentPicture(int nIndex, DXVA_PicParams_H264* pDXVAPicParams, struct AVCodecContext* pAVCtx)
{
- H264Context* h = (H264Context*) pAVCtx->priv_data;
+ H264Context* h = (H264Context*) pAVCtx->priv_data;
- pDXVAPicParams->CurrPic.Index7Bits = nIndex;
- if (h->s.current_picture_ptr) {
- h->s.current_picture_ptr->f.opaque = (void*)nIndex;
- }
+ pDXVAPicParams->CurrPic.Index7Bits = nIndex;
+ if (h->s.current_picture_ptr) {
+ h->s.current_picture_ptr->f.opaque = (void*)nIndex;
+ }
}
-void FFH264UpdateRefFramesList (DXVA_PicParams_H264* pDXVAPicParams, struct AVCodecContext* pAVCtx)
+void FFH264UpdateRefFramesList(DXVA_PicParams_H264* pDXVAPicParams, struct AVCodecContext* pAVCtx)
{
- H264Context* h = (H264Context*) pAVCtx->priv_data;
- UINT nUsedForReferenceFlags = 0;
- int i, j;
- Picture* pic;
- UCHAR AssociatedFlag;
-
- for (i=0, j=0; i<16; i++) {
- if (i < h->short_ref_count) {
- // Short list reference frames
- pic = h->short_ref[h->short_ref_count - i - 1];
- AssociatedFlag = pic->long_ref != 0;
- } else {
- // Long list reference frames
- pic = NULL;
- while (!pic && j < h->short_ref_count + 16) {
- pic = h->long_ref[j++ - h->short_ref_count];
- }
- AssociatedFlag = 1;
- }
-
- if (pic != NULL) {
- pDXVAPicParams->FrameNumList[i] = pic->long_ref ? pic->pic_id : pic->frame_num;
- pDXVAPicParams->FieldOrderCntList[i][0] = 0;
- pDXVAPicParams->FieldOrderCntList[i][1] = 0;
-
- if (pic->field_poc[0] != INT_MAX) {
- pDXVAPicParams->FieldOrderCntList[i][0] = pic->field_poc [0];
- nUsedForReferenceFlags |= 1<<(i*2);
- }
-
- if (pic->field_poc[1] != INT_MAX) {
- pDXVAPicParams->FieldOrderCntList[i][1] = pic->field_poc [1];
- nUsedForReferenceFlags |= 2<<(i*2);
- }
-
- pDXVAPicParams->RefFrameList[i].AssociatedFlag = AssociatedFlag;
- pDXVAPicParams->RefFrameList[i].Index7Bits = (UCHAR)pic->f.opaque;
- } else {
- pDXVAPicParams->FrameNumList[i] = 0;
- pDXVAPicParams->FieldOrderCntList[i][0] = 0;
- pDXVAPicParams->FieldOrderCntList[i][1] = 0;
- pDXVAPicParams->RefFrameList[i].AssociatedFlag = 1;
- pDXVAPicParams->RefFrameList[i].Index7Bits = 127;
- }
- }
-
- pDXVAPicParams->UsedForReferenceFlags = nUsedForReferenceFlags;
+ H264Context* h = (H264Context*) pAVCtx->priv_data;
+ UINT nUsedForReferenceFlags = 0;
+ int i, j;
+ Picture* pic;
+ UCHAR AssociatedFlag;
+
+ for (i = 0, j = 0; i < 16; i++) {
+ if (i < h->short_ref_count) {
+ // Short list reference frames
+ pic = h->short_ref[h->short_ref_count - i - 1];
+ AssociatedFlag = pic->long_ref != 0;
+ } else {
+ // Long list reference frames
+ pic = NULL;
+ while (!pic && j < h->short_ref_count + 16) {
+ pic = h->long_ref[j++ - h->short_ref_count];
+ }
+ AssociatedFlag = 1;
+ }
+
+ if (pic != NULL) {
+ pDXVAPicParams->FrameNumList[i] = pic->long_ref ? pic->pic_id : pic->frame_num;
+ pDXVAPicParams->FieldOrderCntList[i][0] = 0;
+ pDXVAPicParams->FieldOrderCntList[i][1] = 0;
+
+ if (pic->field_poc[0] != INT_MAX) {
+ pDXVAPicParams->FieldOrderCntList[i][0] = pic->field_poc [0];
+ nUsedForReferenceFlags |= 1 << (i * 2);
+ }
+
+ if (pic->field_poc[1] != INT_MAX) {
+ pDXVAPicParams->FieldOrderCntList[i][1] = pic->field_poc [1];
+ nUsedForReferenceFlags |= 2 << (i * 2);
+ }
+
+ pDXVAPicParams->RefFrameList[i].AssociatedFlag = AssociatedFlag;
+ pDXVAPicParams->RefFrameList[i].Index7Bits = (UCHAR)pic->f.opaque;
+ } else {
+ pDXVAPicParams->FrameNumList[i] = 0;
+ pDXVAPicParams->FieldOrderCntList[i][0] = 0;
+ pDXVAPicParams->FieldOrderCntList[i][1] = 0;
+ pDXVAPicParams->RefFrameList[i].AssociatedFlag = 1;
+ pDXVAPicParams->RefFrameList[i].Index7Bits = 127;
+ }
+ }
+
+ pDXVAPicParams->UsedForReferenceFlags = nUsedForReferenceFlags;
}
-BOOL FFH264IsRefFrameInUse (int nFrameNum, struct AVCodecContext* pAVCtx)
+BOOL FFH264IsRefFrameInUse(int nFrameNum, struct AVCodecContext* pAVCtx)
{
- H264Context* h = (H264Context*) pAVCtx->priv_data;
- int i;
-
- for (i=0; i<h->short_ref_count; i++) {
- if ((int)h->short_ref[i]->f.opaque == nFrameNum) {
- return TRUE;
- }
- }
-
- for (i=0; i<h->long_ref_count; i++) {
- if ((int)h->long_ref[i]->f.opaque == nFrameNum) {
- return TRUE;
- }
- }
-
- return FALSE;
+ H264Context* h = (H264Context*) pAVCtx->priv_data;
+ int i;
+
+ for (i = 0; i < h->short_ref_count; i++) {
+ if ((int)h->short_ref[i]->f.opaque == nFrameNum) {
+ return TRUE;
+ }
+ }
+
+ for (i = 0; i < h->long_ref_count; i++) {
+ if ((int)h->long_ref[i]->f.opaque == nFrameNum) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
}
void FF264UpdateRefFrameSliceLong(DXVA_PicParams_H264* pDXVAPicParams, DXVA_Slice_H264_Long* pSlice, struct AVCodecContext* pAVCtx)
{
- H264Context* h = (H264Context*) pAVCtx->priv_data;
- MpegEncContext* const s = &h->s;
- HRESULT hr = E_FAIL;
- unsigned i, list;
-
- for (list = 0; list < 2; list++) {
- for (i = 0; i < 32; i++) {
- pSlice->RefPicList[list][i].AssociatedFlag = 1;
- pSlice->RefPicList[list][i].Index7Bits = 127;
- pSlice->RefPicList[list][i].bPicEntry = 255;
- }
- }
-
- for (list = 0; list < 2; list++) {
- for (i = 0; i < 32; i++) {
- if (list < h->list_count && i < h->ref_count[list]) {
- const Picture *r = &h->ref_list[list][i];
- pSlice->RefPicList[list][i].Index7Bits = FFH264FindRefFrameIndex (h->ref_list[list][i].frame_num, pDXVAPicParams);
- pSlice->RefPicList[list][i].AssociatedFlag = r->f.reference == PICT_BOTTOM_FIELD;
- }
- }
- }
+ H264Context* h = (H264Context*) pAVCtx->priv_data;
+ MpegEncContext* const s = &h->s;
+ HRESULT hr = E_FAIL;
+ unsigned i, list;
+
+ for (list = 0; list < 2; list++) {
+ for (i = 0; i < 32; i++) {
+ pSlice->RefPicList[list][i].AssociatedFlag = 1;
+ pSlice->RefPicList[list][i].Index7Bits = 127;
+ pSlice->RefPicList[list][i].bPicEntry = 255;
+ }
+ }
+
+ for (list = 0; list < 2; list++) {
+ for (i = 0; i < 32; i++) {
+ if (list < h->list_count && i < h->ref_count[list]) {
+ const Picture* r = &h->ref_list[list][i];
+ pSlice->RefPicList[list][i].Index7Bits = FFH264FindRefFrameIndex(h->ref_list[list][i].frame_num, pDXVAPicParams);
+ pSlice->RefPicList[list][i].AssociatedFlag = r->f.reference == PICT_BOTTOM_FIELD;
+ }
+ }
+ }
}
-void FFH264SetDxvaSliceLong (struct AVCodecContext* pAVCtx, void* pSliceLong)
+void FFH264SetDxvaSliceLong(struct AVCodecContext* pAVCtx, void* pSliceLong)
{
- H264Context* h = (H264Context*) pAVCtx->priv_data;
- h->dxva_slice_long = pSliceLong;
+ H264Context* h = (H264Context*) pAVCtx->priv_data;
+ h->dxva_slice_long = pSliceLong;
}
-HRESULT FFVC1UpdatePictureParam (DXVA_PictureParameters* pPicParams, struct AVCodecContext* pAVCtx, int* nFieldType, int* nSliceType, BYTE* pBuffer, UINT nSize, UINT* nFrameSize, BOOL b_SecondField, BOOL* b_repeat_pict)
+HRESULT FFVC1UpdatePictureParam(DXVA_PictureParameters* pPicParams, struct AVCodecContext* pAVCtx, int* nFieldType, int* nSliceType, BYTE* pBuffer, UINT nSize, UINT* nFrameSize, BOOL b_SecondField, BOOL* b_repeat_pict)
{
- VC1Context* vc1 = (VC1Context*) pAVCtx->priv_data;
- int out_nFrameSize = 0;
-
- if (pBuffer && !b_SecondField) {
- av_vc1_decode_frame (pAVCtx, pBuffer, nSize, &out_nFrameSize);
- }
-
- // WARNING : vc1->interlace is not reliable (always set for progressive video on HD-DVD material)
- if (vc1->fcm == 0) {
- if (nFieldType) {
- *nFieldType = PICT_FRAME;
- }
- } else { // fcm : 2 or 3 frame or field interlaced
- if (nFieldType) {
- *nFieldType = (vc1->tff ? PICT_TOP_FIELD : PICT_BOTTOM_FIELD);
- }
- }
-
- if (b_SecondField) {
- vc1->second_field = 1;
- vc1->s.picture_structure = PICT_TOP_FIELD + vc1->tff;
- vc1->s.pict_type = (vc1->fptype & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
- if (vc1->fptype & 4)
- vc1->s.pict_type = (vc1->fptype & 1) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
- }
-
- if (nFrameSize) {
- *nFrameSize = out_nFrameSize;
- }
-
- if (vc1->profile == PROFILE_ADVANCED) {
- /* It is the cropped width/height -1 of the frame */
- pPicParams->wPicWidthInMBminus1 = pAVCtx->width - 1;
- pPicParams->wPicHeightInMBminus1= pAVCtx->height - 1;
- } else {
- /* It is the coded width/height in macroblock -1 of the frame */
- pPicParams->wPicWidthInMBminus1 = vc1->s.mb_width - 1;
- pPicParams->wPicHeightInMBminus1= vc1->s.mb_height - 1;
- }
-
- pPicParams->bSecondField = (vc1->interlace && vc1->fcm == ILACE_FIELD && vc1->second_field);
- pPicParams->bPicIntra = vc1->s.pict_type == AV_PICTURE_TYPE_I;
- pPicParams->bPicBackwardPrediction = vc1->s.pict_type == AV_PICTURE_TYPE_B;
-
-
- // Init Init Init Todo
- // iWMV9 - i9IRU - iOHIT - iINSO - iWMVA - 0 - 0 - 0 | Section 3.2.5
- pPicParams->bBidirectionalAveragingMode = (pPicParams->bBidirectionalAveragingMode & 0xE0) | // init in SetExtraData
- ((vc1->lumshift!=0 || vc1->lumscale!=32) ? 0x10 : 0)| // iINSO
- ((vc1->profile == PROFILE_ADVANCED) <<3 ); // iWMVA
-
- // Section 3.2.20.3
- pPicParams->bPicSpatialResid8 = (vc1->panscanflag << 7) | (vc1->refdist_flag << 6) |
- (vc1->s.loop_filter << 5) | (vc1->fastuvmc << 4) |
- (vc1->extended_mv << 3) | (vc1->dquant << 1) |
- (vc1->vstransform);
-
- // Section 3.2.20.4
- pPicParams->bPicOverflowBlocks = (vc1->quantizer_mode << 6) | (vc1->multires << 5) |
- (vc1->s.resync_marker << 4) | (vc1->rangered << 3) |
- (vc1->s.max_b_frames);
-
- // Section 3.2.20.2
- pPicParams->bPicDeblockConfined = (vc1->postprocflag << 7) | (vc1->broadcast << 6) |
- (vc1->interlace << 5) | (vc1->tfcntrflag << 4) |
- (vc1->finterpflag << 3) | // (refpic << 2) set in DecodeFrame !
- (vc1->psf << 1) | vc1->extended_dmv;
-
-
- pPicParams->bPicStructure = 0;
- if (vc1->s.picture_structure & PICT_TOP_FIELD) {
- pPicParams->bPicStructure |= 0x01;
- }
- if (vc1->s.picture_structure & PICT_BOTTOM_FIELD) {
- pPicParams->bPicStructure |= 0x02;
- }
-
- pPicParams->bMVprecisionAndChromaRelation = ((vc1->mv_mode == MV_PMODE_1MV_HPEL_BILIN) << 3) |
- (1 << 2) |
- (0 << 1) |
- (!vc1->s.quarter_sample );
-
- // Cf page 17 : 2 for interlaced, 0 for progressive
- pPicParams->bPicExtrapolation = (!vc1->interlace || vc1->fcm == PROGRESSIVE) ? 1 : 2;
-
- if (vc1->s.picture_structure == PICT_FRAME) {
- pPicParams->wBitstreamFcodes = vc1->lumscale;
- pPicParams->wBitstreamPCEelements = vc1->lumshift;
- } else {
- /* Syntax: (top_field_param << 8) | bottom_field_param */
- pPicParams->wBitstreamFcodes = (vc1->lumscale << 8) | vc1->lumscale;
- pPicParams->wBitstreamPCEelements = (vc1->lumshift << 8) | vc1->lumshift;
- }
-
- if (vc1->profile == PROFILE_ADVANCED) {
- pPicParams->bPicOBMC = (vc1->range_mapy_flag << 7) |
- (vc1->range_mapy << 4) |
- (vc1->range_mapuv_flag << 3) |
- (vc1->range_mapuv );
- }
-
- // Section 3.2.16
- if (nSliceType) {
- *nSliceType = vc1->s.pict_type;
- }
-
- // Cf section 7.1.1.25 in VC1 specification, section 3.2.14.3 in DXVA spec
- pPicParams->bRcontrol = vc1->rnd;
-
- pPicParams->bPicDeblocked = ((vc1->profile == PROFILE_ADVANCED && vc1->overlap == 1 &&
- pPicParams->bPicBackwardPrediction == 0) << 6) |
- ((vc1->profile != PROFILE_ADVANCED && vc1->rangeredfrm) << 5) |
- (vc1->s.loop_filter << 1);
-
- if (vc1->profile == PROFILE_ADVANCED && (vc1->rff || vc1->rptfrm)) {
- *b_repeat_pict = TRUE;
- }
-
- return S_OK;
+ VC1Context* vc1 = (VC1Context*) pAVCtx->priv_data;
+ int out_nFrameSize = 0;
+
+ if (pBuffer && !b_SecondField) {
+ av_vc1_decode_frame(pAVCtx, pBuffer, nSize, &out_nFrameSize);
+ }
+
+ // WARNING : vc1->interlace is not reliable (always set for progressive video on HD-DVD material)
+ if (vc1->fcm == 0) {
+ if (nFieldType) {
+ *nFieldType = PICT_FRAME;
+ }
+ } else { // fcm : 2 or 3 frame or field interlaced
+ if (nFieldType) {
+ *nFieldType = (vc1->tff ? PICT_TOP_FIELD : PICT_BOTTOM_FIELD);
+ }
+ }
+
+ if (b_SecondField) {
+ vc1->second_field = 1;
+ vc1->s.picture_structure = PICT_TOP_FIELD + vc1->tff;
+ vc1->s.pict_type = (vc1->fptype & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
+ if (vc1->fptype & 4) {
+ vc1->s.pict_type = (vc1->fptype & 1) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
+ }
+ }
+
+ if (nFrameSize) {
+ *nFrameSize = out_nFrameSize;
+ }
+
+ if (vc1->profile == PROFILE_ADVANCED) {
+ /* It is the cropped width/height -1 of the frame */
+ pPicParams->wPicWidthInMBminus1 = pAVCtx->width - 1;
+ pPicParams->wPicHeightInMBminus1 = pAVCtx->height - 1;
+ } else {
+ /* It is the coded width/height in macroblock -1 of the frame */
+ pPicParams->wPicWidthInMBminus1 = vc1->s.mb_width - 1;
+ pPicParams->wPicHeightInMBminus1 = vc1->s.mb_height - 1;
+ }
+
+ pPicParams->bSecondField = (vc1->interlace && vc1->fcm == ILACE_FIELD && vc1->second_field);
+ pPicParams->bPicIntra = vc1->s.pict_type == AV_PICTURE_TYPE_I;
+ pPicParams->bPicBackwardPrediction = vc1->s.pict_type == AV_PICTURE_TYPE_B;
+
+
+ // Init Init Init Todo
+ // iWMV9 - i9IRU - iOHIT - iINSO - iWMVA - 0 - 0 - 0 | Section 3.2.5
+ pPicParams->bBidirectionalAveragingMode = (pPicParams->bBidirectionalAveragingMode & 0xE0) | // init in SetExtraData
+ ((vc1->lumshift != 0 || vc1->lumscale != 32) ? 0x10 : 0) | // iINSO
+ ((vc1->profile == PROFILE_ADVANCED) << 3); // iWMVA
+
+ // Section 3.2.20.3
+ pPicParams->bPicSpatialResid8 = (vc1->panscanflag << 7) | (vc1->refdist_flag << 6) |
+ (vc1->s.loop_filter << 5) | (vc1->fastuvmc << 4) |
+ (vc1->extended_mv << 3) | (vc1->dquant << 1) |
+ (vc1->vstransform);
+
+ // Section 3.2.20.4
+ pPicParams->bPicOverflowBlocks = (vc1->quantizer_mode << 6) | (vc1->multires << 5) |
+ (vc1->s.resync_marker << 4) | (vc1->rangered << 3) |
+ (vc1->s.max_b_frames);
+
+ // Section 3.2.20.2
+ pPicParams->bPicDeblockConfined = (vc1->postprocflag << 7) | (vc1->broadcast << 6) |
+ (vc1->interlace << 5) | (vc1->tfcntrflag << 4) |
+ (vc1->finterpflag << 3) | // (refpic << 2) set in DecodeFrame !
+ (vc1->psf << 1) | vc1->extended_dmv;
+
+
+ pPicParams->bPicStructure = 0;
+ if (vc1->s.picture_structure & PICT_TOP_FIELD) {
+ pPicParams->bPicStructure |= 0x01;
+ }
+ if (vc1->s.picture_structure & PICT_BOTTOM_FIELD) {
+ pPicParams->bPicStructure |= 0x02;
+ }
+
+ pPicParams->bMVprecisionAndChromaRelation = ((vc1->mv_mode == MV_PMODE_1MV_HPEL_BILIN) << 3) |
+ (1 << 2) |
+ (0 << 1) |
+ (!vc1->s.quarter_sample);
+
+ // Cf page 17 : 2 for interlaced, 0 for progressive
+ pPicParams->bPicExtrapolation = (!vc1->interlace || vc1->fcm == PROGRESSIVE) ? 1 : 2;
+
+ if (vc1->s.picture_structure == PICT_FRAME) {
+ pPicParams->wBitstreamFcodes = vc1->lumscale;
+ pPicParams->wBitstreamPCEelements = vc1->lumshift;
+ } else {
+ /* Syntax: (top_field_param << 8) | bottom_field_param */
+ pPicParams->wBitstreamFcodes = (vc1->lumscale << 8) | vc1->lumscale;
+ pPicParams->wBitstreamPCEelements = (vc1->lumshift << 8) | vc1->lumshift;
+ }
+
+ if (vc1->profile == PROFILE_ADVANCED) {
+ pPicParams->bPicOBMC = (vc1->range_mapy_flag << 7) |
+ (vc1->range_mapy << 4) |
+ (vc1->range_mapuv_flag << 3) |
+ (vc1->range_mapuv);
+ }
+
+ // Section 3.2.16
+ if (nSliceType) {
+ *nSliceType = vc1->s.pict_type;
+ }
+
+ // Cf section 7.1.1.25 in VC1 specification, section 3.2.14.3 in DXVA spec
+ pPicParams->bRcontrol = vc1->rnd;
+
+ pPicParams->bPicDeblocked = ((vc1->profile == PROFILE_ADVANCED && vc1->overlap == 1 &&
+ pPicParams->bPicBackwardPrediction == 0) << 6) |
+ ((vc1->profile != PROFILE_ADVANCED && vc1->rangeredfrm) << 5) |
+ (vc1->s.loop_filter << 1);
+
+ if (vc1->profile == PROFILE_ADVANCED && (vc1->rff || vc1->rptfrm)) {
+ *b_repeat_pict = TRUE;
+ }
+
+ return S_OK;
}
-int MPEG2CheckCompatibility(struct AVCodecContext* pAVCtx, struct AVFrame* pFrame)
+int MPEG2CheckCompatibility(struct AVCodecContext* pAVCtx, struct AVFrame* pFrame)
{
- int got_picture = 0;
- Mpeg1Context* s1 = (Mpeg1Context*)pAVCtx->priv_data;
- MpegEncContext* s = (MpegEncContext*)&s1->mpeg_enc_ctx;
- AVPacket avpkt;
+ int got_picture = 0;
+ Mpeg1Context* s1 = (Mpeg1Context*)pAVCtx->priv_data;
+ MpegEncContext* s = (MpegEncContext*)&s1->mpeg_enc_ctx;
+ AVPacket avpkt;
- av_init_packet(&avpkt);
- avpkt.data = (BYTE*)pAVCtx->extradata;
- avpkt.size = pAVCtx->extradata_size;
- avpkt.flags = AV_PKT_FLAG_KEY;
+ av_init_packet(&avpkt);
+ avpkt.data = (BYTE*)pAVCtx->extradata;
+ avpkt.size = pAVCtx->extradata_size;
+ avpkt.flags = AV_PKT_FLAG_KEY;
- avcodec_decode_video2(pAVCtx, pFrame, &got_picture, &avpkt);
+ avcodec_decode_video2(pAVCtx, pFrame, &got_picture, &avpkt);
- return (s->chroma_format<2);
+ return (s->chroma_format < 2);
}
-HRESULT FFMpeg2DecodeFrame (DXVA_PictureParameters* pPicParams, DXVA_QmatrixData* pQMatrixData, DXVA_SliceInfo* pSliceInfo, int* nSliceCount,
- struct AVCodecContext* pAVCtx, struct AVFrame* pFrame, int* nNextCodecIndex, int* nFieldType, int* nSliceType, BYTE* pBuffer, UINT nSize)
+HRESULT FFMpeg2DecodeFrame(DXVA_PictureParameters* pPicParams, DXVA_QmatrixData* pQMatrixData, DXVA_SliceInfo* pSliceInfo, int* nSliceCount,
+ struct AVCodecContext* pAVCtx, struct AVFrame* pFrame, int* nNextCodecIndex, int* nFieldType, int* nSliceType, BYTE* pBuffer, UINT nSize)
{
- int i;
- int got_picture = 0;
- Mpeg1Context* s1 = (Mpeg1Context*)pAVCtx->priv_data;
- MpegEncContext* s = (MpegEncContext*)&s1->mpeg_enc_ctx;
- int is_field = 0;
- unsigned mb_count = 0;
-
- AVPacket avpkt;
-
- if (pBuffer) {
- s1->pSliceInfo = pSliceInfo;
-
- av_init_packet(&avpkt);
- avpkt.data = pBuffer;
- avpkt.size = nSize;
- avpkt.flags = AV_PKT_FLAG_KEY;
- avcodec_decode_video2(pAVCtx, pFrame, &got_picture, &avpkt);
-
- *nSliceCount = s1->slice_count;
- *nFieldType = s->progressive_frame ? PICT_FRAME : s->current_picture.f.top_field_first ? PICT_TOP_FIELD : PICT_BOTTOM_FIELD;
- *nSliceType = s->pict_type;
- }
-
- // pPicParams->wDecodedPictureIndex; set in DecodeFrame
- // pPicParams->wDeblockedPictureIndex; 0 for Mpeg2
- // pPicParams->wForwardRefPictureIndex; set in DecodeFrame
- // pPicParams->wBackwardRefPictureIndex; set in DecodeFrame
-
- is_field = s->picture_structure != PICT_FRAME;
-
- pPicParams->wPicWidthInMBminus1 = s->mb_width-1;
- pPicParams->wPicHeightInMBminus1 = (s->mb_height >> is_field) - 1;
-
- pPicParams->bMacroblockWidthMinus1 = 15; // This is equal to "15" for MPEG-1, MPEG-2, H.263, and MPEG-4
- pPicParams->bMacroblockHeightMinus1 = 15; // This is equal to "15" for MPEG-1, MPEG-2, H.261, H.263, and MPEG-4
-
- pPicParams->bBlockWidthMinus1 = 7; // This is equal to "7" for MPEG-1, MPEG-2, H.261, H.263, and MPEG-4
- pPicParams->bBlockHeightMinus1 = 7; // This is equal to "7" for MPEG-1, MPEG-2, H.261, H.263, and MPEG-4
-
- pPicParams->bBPPminus1 = 7; // It is equal to "7" for MPEG-1, MPEG-2, H.261, and H.263
-
- pPicParams->bPicStructure = s->picture_structure;
- pPicParams->bSecondField = is_field && !s->first_field;
- pPicParams->bPicIntra = (s->current_picture.f.pict_type == AV_PICTURE_TYPE_I);
- pPicParams->bPicBackwardPrediction = (s->current_picture.f.pict_type == AV_PICTURE_TYPE_B);
-
- pPicParams->bBidirectionalAveragingMode = 0; // The value "0" indicates MPEG-1 and MPEG-2 rounded averaging (//2),
- //pPicParams->bMVprecisionAndChromaRelation = 0; // Indicates that luminance motion vectors have half-sample precision and that chrominance motion vectors are derived from luminance motion vectors according to the rules in MPEG-2
- pPicParams->bChromaFormat = 0x01; // For MPEG-1, MPEG-2 "Main Profile," H.261 and H.263 bitstreams, this value shall always be set to "01", indicating "4:2:0" format
-
- // pPicParams->bPicScanFixed = 1; // set in UpdatePicParams
- // pPicParams->bPicScanMethod = 1; // set in UpdatePicParams
- // pPicParams->bPicReadbackRequests; // ??
-
- // pPicParams->bRcontrol = 0; // It shall be set to "0" for all MPEG-1, and MPEG-2 bitstreams in order to conform with the rounding operator defined by those standards
- // pPicParams->bPicSpatialResid8; // set in UpdatePicParams
- // pPicParams->bPicOverflowBlocks; // set in UpdatePicParams
- // pPicParams->bPicExtrapolation; = 0; // by H.263 Annex D and MPEG-4
-
- // pPicParams->bPicDeblocked; = 0; // MPEG2_A Restricted Profile
- // pPicParams->bPicDeblockConfined; // ??
- // pPicParams->bPic4MVallowed; // See H.263 Annexes F and J
- // pPicParams->bPicOBMC; // H.263 Annex F
- // pPicParams->bPicBinPB; // Annexes G and M of H.263
- // pPicParams->bMV_RPS; // ???
- // pPicParams->bReservedBits; // ??
-
- pPicParams->wBitstreamFcodes = (s->mpeg_f_code[0][0]<<12) | (s->mpeg_f_code[0][1]<<8) |
- (s->mpeg_f_code[1][0]<<4) | (s->mpeg_f_code[1][1]);
-
- pPicParams->wBitstreamPCEelements = (s->intra_dc_precision<<14) | (s->picture_structure<<12) |
- (s->top_field_first<<11) | (s->frame_pred_frame_dct<<10)|
- (s->concealment_motion_vectors<<9) | (s->q_scale_type<<8)|
- (s->intra_vlc_format<<7) | (s->alternate_scan<<6)|
- (s->repeat_first_field<<5) | (s->chroma_420_type<<4)|
- (s->progressive_frame<<3);
-
- pPicParams->bBitstreamConcealmentNeed = 0;
- pPicParams->bBitstreamConcealmentMethod = 0;
-
- pQMatrixData->bNewQmatrix[0] = 1;
- pQMatrixData->bNewQmatrix[1] = 1;
- pQMatrixData->bNewQmatrix[2] = 1;
- pQMatrixData->bNewQmatrix[3] = 1;
- for (i = 0; i < 64; i++) {
- int n = s->dsp.idct_permutation[ZZ_SCAN8[i]];
- pQMatrixData->Qmatrix[0][i] = s->intra_matrix[n];
- pQMatrixData->Qmatrix[1][i] = s->inter_matrix[n];
- pQMatrixData->Qmatrix[2][i] = s->chroma_intra_matrix[n];
- pQMatrixData->Qmatrix[3][i] = s->chroma_inter_matrix[n];
- }
-
- mb_count = s->mb_width * (s->mb_height >> is_field);
- for (i = 0; i < s1->slice_count; i++) {
- DXVA_SliceInfo *slice = &s1->pSliceInfo[i];
-
- if (i < s1->slice_count - 1) {
- slice->wNumberMBsInSlice = slice[1].wNumberMBsInSlice - slice[0].wNumberMBsInSlice;
- } else {
- slice->wNumberMBsInSlice = mb_count - slice[0].wNumberMBsInSlice;
- }
- }
-
- if (got_picture) {
- *nNextCodecIndex = pFrame->coded_picture_number;
- }
-
- return S_OK;
+ int i;
+ int got_picture = 0;
+ Mpeg1Context* s1 = (Mpeg1Context*)pAVCtx->priv_data;
+ MpegEncContext* s = (MpegEncContext*)&s1->mpeg_enc_ctx;
+ int is_field = 0;
+ unsigned mb_count = 0;
+
+ AVPacket avpkt;
+
+ if (pBuffer) {
+ s1->pSliceInfo = pSliceInfo;
+
+ av_init_packet(&avpkt);
+ avpkt.data = pBuffer;
+ avpkt.size = nSize;
+ avpkt.flags = AV_PKT_FLAG_KEY;
+ avcodec_decode_video2(pAVCtx, pFrame, &got_picture, &avpkt);
+
+ *nSliceCount = s1->slice_count;
+ *nFieldType = s->progressive_frame ? PICT_FRAME : s->current_picture.f.top_field_first ? PICT_TOP_FIELD : PICT_BOTTOM_FIELD;
+ *nSliceType = s->pict_type;
+ }
+
+ // pPicParams->wDecodedPictureIndex; set in DecodeFrame
+ // pPicParams->wDeblockedPictureIndex; 0 for Mpeg2
+ // pPicParams->wForwardRefPictureIndex; set in DecodeFrame
+ // pPicParams->wBackwardRefPictureIndex; set in DecodeFrame
+
+ is_field = s->picture_structure != PICT_FRAME;
+
+ pPicParams->wPicWidthInMBminus1 = s->mb_width - 1;
+ pPicParams->wPicHeightInMBminus1 = (s->mb_height >> is_field) - 1;
+
+ pPicParams->bMacroblockWidthMinus1 = 15; // This is equal to "15" for MPEG-1, MPEG-2, H.263, and MPEG-4
+ pPicParams->bMacroblockHeightMinus1 = 15; // This is equal to "15" for MPEG-1, MPEG-2, H.261, H.263, and MPEG-4
+
+ pPicParams->bBlockWidthMinus1 = 7; // This is equal to "7" for MPEG-1, MPEG-2, H.261, H.263, and MPEG-4
+ pPicParams->bBlockHeightMinus1 = 7; // This is equal to "7" for MPEG-1, MPEG-2, H.261, H.263, and MPEG-4
+
+ pPicParams->bBPPminus1 = 7; // It is equal to "7" for MPEG-1, MPEG-2, H.261, and H.263
+
+ pPicParams->bPicStructure = s->picture_structure;
+ pPicParams->bSecondField = is_field && !s->first_field;
+ pPicParams->bPicIntra = (s->current_picture.f.pict_type == AV_PICTURE_TYPE_I);
+ pPicParams->bPicBackwardPrediction = (s->current_picture.f.pict_type == AV_PICTURE_TYPE_B);
+
+ pPicParams->bBidirectionalAveragingMode = 0; // The value "0" indicates MPEG-1 and MPEG-2 rounded averaging (//2),
+ //pPicParams->bMVprecisionAndChromaRelation = 0; // Indicates that luminance motion vectors have half-sample precision and that chrominance motion vectors are derived from luminance motion vectors according to the rules in MPEG-2
+ pPicParams->bChromaFormat = 0x01; // For MPEG-1, MPEG-2 "Main Profile," H.261 and H.263 bitstreams, this value shall always be set to "01", indicating "4:2:0" format
+
+ // pPicParams->bPicScanFixed = 1; // set in UpdatePicParams
+ // pPicParams->bPicScanMethod = 1; // set in UpdatePicParams
+ // pPicParams->bPicReadbackRequests; // ??
+
+ // pPicParams->bRcontrol = 0; // It shall be set to "0" for all MPEG-1, and MPEG-2 bitstreams in order to conform with the rounding operator defined by those standards
+ // pPicParams->bPicSpatialResid8; // set in UpdatePicParams
+ // pPicParams->bPicOverflowBlocks; // set in UpdatePicParams
+ // pPicParams->bPicExtrapolation; = 0; // by H.263 Annex D and MPEG-4
+
+ // pPicParams->bPicDeblocked; = 0; // MPEG2_A Restricted Profile
+ // pPicParams->bPicDeblockConfined; // ??
+ // pPicParams->bPic4MVallowed; // See H.263 Annexes F and J
+ // pPicParams->bPicOBMC; // H.263 Annex F
+ // pPicParams->bPicBinPB; // Annexes G and M of H.263
+ // pPicParams->bMV_RPS; // ???
+ // pPicParams->bReservedBits; // ??
+
+ pPicParams->wBitstreamFcodes = (s->mpeg_f_code[0][0] << 12) | (s->mpeg_f_code[0][1] << 8) |
+ (s->mpeg_f_code[1][0] << 4) | (s->mpeg_f_code[1][1]);
+
+ pPicParams->wBitstreamPCEelements = (s->intra_dc_precision << 14) | (s->picture_structure << 12) |
+ (s->top_field_first << 11) | (s->frame_pred_frame_dct << 10) |
+ (s->concealment_motion_vectors << 9) | (s->q_scale_type << 8) |
+ (s->intra_vlc_format << 7) | (s->alternate_scan << 6) |
+ (s->repeat_first_field << 5) | (s->chroma_420_type << 4) |
+ (s->progressive_frame << 3);
+
+ pPicParams->bBitstreamConcealmentNeed = 0;
+ pPicParams->bBitstreamConcealmentMethod = 0;
+
+ pQMatrixData->bNewQmatrix[0] = 1;
+ pQMatrixData->bNewQmatrix[1] = 1;
+ pQMatrixData->bNewQmatrix[2] = 1;
+ pQMatrixData->bNewQmatrix[3] = 1;
+ for (i = 0; i < 64; i++) {
+ int n = s->dsp.idct_permutation[ZZ_SCAN8[i]];
+ pQMatrixData->Qmatrix[0][i] = s->intra_matrix[n];
+ pQMatrixData->Qmatrix[1][i] = s->inter_matrix[n];
+ pQMatrixData->Qmatrix[2][i] = s->chroma_intra_matrix[n];
+ pQMatrixData->Qmatrix[3][i] = s->chroma_inter_matrix[n];
+ }
+
+ mb_count = s->mb_width * (s->mb_height >> is_field);
+ for (i = 0; i < s1->slice_count; i++) {
+ DXVA_SliceInfo* slice = &s1->pSliceInfo[i];
+
+ if (i < s1->slice_count - 1) {
+ slice->wNumberMBsInSlice = slice[1].wNumberMBsInSlice - slice[0].wNumberMBsInSlice;
+ } else {
+ slice->wNumberMBsInSlice = mb_count - slice[0].wNumberMBsInSlice;
+ }
+ }
+
+ if (got_picture) {
+ *nNextCodecIndex = pFrame->coded_picture_number;
+ }
+
+ return S_OK;
}
unsigned long FFGetMBNumber(struct AVCodecContext* pAVCtx)
{
- MpegEncContext* s = GetMpegEncContext(pAVCtx);
+ MpegEncContext* s = GetMpegEncContext(pAVCtx);
- return (s != NULL) ? s->mb_num : 0;
+ return (s != NULL) ? s->mb_num : 0;
}
int FFIsSkipped(struct AVCodecContext* pAVCtx)
{
- VC1Context* vc1 = (VC1Context*) pAVCtx->priv_data;
- return vc1->p_frame_skipped;
+ VC1Context* vc1 = (VC1Context*) pAVCtx->priv_data;
+ return vc1->p_frame_skipped;
}
int FFGetThreadType(enum CodecID nCodecId, int nThreadCount)
{
- if (!nThreadCount) {
- return 0;
- }
- switch (nCodecId)
- {
- case CODEC_ID_H264 :
- return FF_THREAD_FRAME|FF_THREAD_SLICE;
- break;
- case CODEC_ID_MPEG1VIDEO :
- case CODEC_ID_DVVIDEO :
- case CODEC_ID_FFV1 :
- return FF_THREAD_SLICE;
- break;
- case CODEC_ID_VP3 :
- case CODEC_ID_VP8 :
- case CODEC_ID_THEORA :
- case CODEC_ID_RV30 :
- case CODEC_ID_RV40 :
- return FF_THREAD_FRAME;
- break;
- default :
- return 0;
- }
+ if (!nThreadCount) {
+ return 0;
+ }
+ switch (nCodecId) {
+ case CODEC_ID_H264 :
+ return FF_THREAD_FRAME | FF_THREAD_SLICE;
+ break;
+ case CODEC_ID_MPEG1VIDEO :
+ case CODEC_ID_DVVIDEO :
+ case CODEC_ID_FFV1 :
+ return FF_THREAD_SLICE;
+ break;
+ case CODEC_ID_VP3 :
+ case CODEC_ID_VP8 :
+ case CODEC_ID_THEORA :
+ case CODEC_ID_RV30 :
+ case CODEC_ID_RV40 :
+ return FF_THREAD_FRAME;
+ break;
+ default :
+ return 0;
+ }
}
void FFSetThreadNumber(struct AVCodecContext* pAVCtx, enum CodecID nCodecId, int nThreadCount)
{
- pAVCtx->thread_count = nThreadCount;
- pAVCtx->thread_type = FFGetThreadType (nCodecId, nThreadCount);
+ pAVCtx->thread_count = nThreadCount;
+ pAVCtx->thread_type = FFGetThreadType(nCodecId, nThreadCount);
}
BOOL FFSoftwareCheckCompatibility(struct AVCodecContext* pAVCtx)
{
- if (pAVCtx->codec_id == CODEC_ID_VC1) {
- VC1Context* vc1 = (VC1Context*) pAVCtx->priv_data;
- return !vc1->interlace;
- } else {
- return TRUE;
- }
+ if (pAVCtx->codec_id == CODEC_ID_VC1) {
+ VC1Context* vc1 = (VC1Context*) pAVCtx->priv_data;
+ return !vc1->interlace;
+ } else {
+ return TRUE;
+ }
}
int FFGetCodedPicture(struct AVCodecContext* pAVCtx)
{
- MpegEncContext* s = GetMpegEncContext(pAVCtx);
+ MpegEncContext* s = GetMpegEncContext(pAVCtx);
- return (s != NULL) ? s->current_picture.f.coded_picture_number : 0;
+ return (s != NULL) ? s->current_picture.f.coded_picture_number : 0;
}
BOOL FFGetAlternateScan(struct AVCodecContext* pAVCtx)
{
- MpegEncContext* s = GetMpegEncContext(pAVCtx);
+ MpegEncContext* s = GetMpegEncContext(pAVCtx);
- return (s != NULL) ? s->alternate_scan : 0;
+ return (s != NULL) ? s->alternate_scan : 0;
}
BOOL DXVACheckFramesize(int width, int height, DWORD nPCIVendor/*, DWORD nPCIDevice*/)
{
- width = (width + 15)&0xFFFFFFF0; // (width + 15) / 16 * 16;
- height = (height + 15)&0xFFFFFFF0; // (height + 15) / 16 * 16;
-
- if ((nPCIVendor == PCIV_nVidia) && (width <= 2032 && height <= 2032 && width*height <= 8190*16*16)) {
- // tested H.264, VC-1 and MPEG-2 on VP4 (feature set C) (G210M, GT220)
- return TRUE;
- } else if ((nPCIVendor == PCIV_ATI) && (width <= 2048 && height <= 2304 && width*height <= 2048*2048)) {
- // tested H.264 on UVD 2.2 (HD5670, HD5770, HD5850)
- // it may also work if width = 2064, but unstable
- return TRUE;
- } else if (width <= 1920 && height <= 1088) {
- return TRUE;
- }
-
- return FALSE;
+ width = (width + 15) & 0xFFFFFFF0; // (width + 15) / 16 * 16;
+ height = (height + 15) & 0xFFFFFFF0; // (height + 15) / 16 * 16;
+
+ if ((nPCIVendor == PCIV_nVidia) && (width <= 2032 && height <= 2032 && width * height <= 8190 * 16 * 16)) {
+ // tested H.264, VC-1 and MPEG-2 on VP4 (feature set C) (G210M, GT220)
+ return TRUE;
+ } else if ((nPCIVendor == PCIV_ATI) && (width <= 2048 && height <= 2304 && width * height <= 2048 * 2048)) {
+ // tested H.264 on UVD 2.2 (HD5670, HD5770, HD5850)
+ // it may also work if width = 2064, but unstable
+ return TRUE;
+ } else if (width <= 1920 && height <= 1088) {
+ return TRUE;
+ }
+
+ return FALSE;
}
diff --git a/src/filters/transform/MPCVideoDec/FfmpegContext.h b/src/filters/transform/MPCVideoDec/FfmpegContext.h
index a2ffd414e..4e4983b52 100644
--- a/src/filters/transform/MPCVideoDec/FfmpegContext.h
+++ b/src/filters/transform/MPCVideoDec/FfmpegContext.h
@@ -28,50 +28,50 @@ struct AVCodecContext;
struct AVFrame;
enum PCI_Vendors {
- PCIV_ATI = 0x1002,
- PCIV_nVidia = 0x10DE,
- PCIV_Intel = 0x8086,
- PCIV_S3_Graphics = 0x5333
+ PCIV_ATI = 0x1002,
+ PCIV_nVidia = 0x10DE,
+ PCIV_Intel = 0x8086,
+ PCIV_S3_Graphics = 0x5333
};
// Bitmasks for DXVA compatibility check
-#define DXVA_UNSUPPORTED_LEVEL 1
-#define DXVA_TOO_MANY_REF_FRAMES 2
-#define DXVA_INCOMPATIBLE_SAR 4
-#define DXVA_PROFILE_HIGHER_THAN_HIGH 8
-#define DXVA_HIGH_BIT 16
+#define DXVA_UNSUPPORTED_LEVEL 1
+#define DXVA_TOO_MANY_REF_FRAMES 2
+#define DXVA_INCOMPATIBLE_SAR 4
+#define DXVA_PROFILE_HIGHER_THAN_HIGH 8
+#define DXVA_HIGH_BIT 16
// === H264 functions
-int FFH264DecodeBuffer(struct AVCodecContext* pAVCtx, BYTE* pBuffer, UINT nSize, int* pFramePOC,
- int* pOutPOC, REFERENCE_TIME* pOutrtStart);
+int FFH264DecodeBuffer(struct AVCodecContext* pAVCtx, BYTE* pBuffer, UINT nSize, int* pFramePOC,
+ int* pOutPOC, REFERENCE_TIME* pOutrtStart);
HRESULT FFH264BuildPicParams(DXVA_PicParams_H264* pDXVAPicParams, DXVA_Qmatrix_H264* pDXVAScalingMatrix,
- int* nFieldType, int* nSliceType, struct AVCodecContext* pAVCtx, DWORD nPCIVendor);
-int FFH264CheckCompatibility(int nWidth, int nHeight, struct AVCodecContext* pAVCtx, BYTE* pBuffer,
- UINT nSize, DWORD nPCIVendor, DWORD nPCIDevice, LARGE_INTEGER VideoDriverVersion);
-void FFH264SetCurrentPicture(int nIndex, DXVA_PicParams_H264* pDXVAPicParams, struct AVCodecContext* pAVCtx);
-void FFH264UpdateRefFramesList(DXVA_PicParams_H264* pDXVAPicParams, struct AVCodecContext* pAVCtx);
-BOOL FFH264IsRefFrameInUse(int nFrameNum, struct AVCodecContext* pAVCtx);
-void FF264UpdateRefFrameSliceLong(DXVA_PicParams_H264* pDXVAPicParams, DXVA_Slice_H264_Long* pSlice,
- struct AVCodecContext* pAVCtx);
-void FFH264SetDxvaSliceLong(struct AVCodecContext* pAVCtx, void* pSliceLong);
+ int* nFieldType, int* nSliceType, struct AVCodecContext* pAVCtx, DWORD nPCIVendor);
+int FFH264CheckCompatibility(int nWidth, int nHeight, struct AVCodecContext* pAVCtx, BYTE* pBuffer,
+ UINT nSize, DWORD nPCIVendor, DWORD nPCIDevice, LARGE_INTEGER VideoDriverVersion);
+void FFH264SetCurrentPicture(int nIndex, DXVA_PicParams_H264* pDXVAPicParams, struct AVCodecContext* pAVCtx);
+void FFH264UpdateRefFramesList(DXVA_PicParams_H264* pDXVAPicParams, struct AVCodecContext* pAVCtx);
+BOOL FFH264IsRefFrameInUse(int nFrameNum, struct AVCodecContext* pAVCtx);
+void FF264UpdateRefFrameSliceLong(DXVA_PicParams_H264* pDXVAPicParams, DXVA_Slice_H264_Long* pSlice,
+ struct AVCodecContext* pAVCtx);
+void FFH264SetDxvaSliceLong(struct AVCodecContext* pAVCtx, void* pSliceLong);
// === VC1 functions
HRESULT FFVC1UpdatePictureParam(DXVA_PictureParameters* pPicParams, struct AVCodecContext* pAVCtx,
- int* nFieldType, int* nSliceType, BYTE* pBuffer, UINT nSize,
- UINT* nFrameSize, BOOL b_SecondField, BOOL* b_repeat_pict);
-int FFIsSkipped(struct AVCodecContext* pAVCtx);
+ int* nFieldType, int* nSliceType, BYTE* pBuffer, UINT nSize,
+ UINT* nFrameSize, BOOL b_SecondField, BOOL* b_repeat_pict);
+int FFIsSkipped(struct AVCodecContext* pAVCtx);
// === Mpeg2 functions
-int MPEG2CheckCompatibility(struct AVCodecContext* pAVCtx, struct AVFrame* pFrame);
+int MPEG2CheckCompatibility(struct AVCodecContext* pAVCtx, struct AVFrame* pFrame);
HRESULT FFMpeg2DecodeFrame(DXVA_PictureParameters* pPicParams, DXVA_QmatrixData* m_QMatrixData,
- DXVA_SliceInfo* pSliceInfo, int* nSliceCount, struct AVCodecContext* pAVCtx,
- struct AVFrame* pFrame, int* nNextCodecIndex, int* nFieldType, int* nSliceType,
- BYTE* pBuffer, UINT nSize);
+ DXVA_SliceInfo* pSliceInfo, int* nSliceCount, struct AVCodecContext* pAVCtx,
+ struct AVFrame* pFrame, int* nNextCodecIndex, int* nFieldType, int* nSliceType,
+ BYTE* pBuffer, UINT nSize);
// === Common functions
-unsigned long FFGetMBNumber(struct AVCodecContext* pAVCtx);
-void FFSetThreadNumber(struct AVCodecContext* pAVCtx, enum CodecID nCodecId, int nThreadCount);
-BOOL FFSoftwareCheckCompatibility(struct AVCodecContext* pAVCtx);
-int FFGetCodedPicture(struct AVCodecContext* pAVCtx);
-BOOL FFGetAlternateScan(struct AVCodecContext* pAVCtx);
-BOOL DXVACheckFramesize(int width, int height, DWORD nPCIVendor/*, DWORD nPCIDevice*/);
+unsigned long FFGetMBNumber(struct AVCodecContext* pAVCtx);
+void FFSetThreadNumber(struct AVCodecContext* pAVCtx, enum CodecID nCodecId, int nThreadCount);
+BOOL FFSoftwareCheckCompatibility(struct AVCodecContext* pAVCtx);
+int FFGetCodedPicture(struct AVCodecContext* pAVCtx);
+BOOL FFGetAlternateScan(struct AVCodecContext* pAVCtx);
+BOOL DXVACheckFramesize(int width, int height, DWORD nPCIVendor/*, DWORD nPCIDevice*/);
diff --git a/src/filters/transform/MPCVideoDec/IMPCVideoDecFilter.h b/src/filters/transform/MPCVideoDec/IMPCVideoDecFilter.h
index 17466b81d..f262d9bf6 100644
--- a/src/filters/transform/MPCVideoDec/IMPCVideoDecFilter.h
+++ b/src/filters/transform/MPCVideoDec/IMPCVideoDecFilter.h
@@ -25,64 +25,64 @@
// Internal codec list (use to enable/disable codec in standalone mode)
typedef enum {
- MPCVD_H264 = 1 << 0,
- MPCVD_VC1 = 1 << 1,
- MPCVD_XVID = 1 << 2,
- MPCVD_DIVX = 1 << 3,
- MPCVD_WMV = 1 << 4,
- MPCVD_MSMPEG4 = 1 << 5,
- MPCVD_H263 = 1 << 6,
- MPCVD_SVQ3 = 1 << 7,
- MPCVD_THEORA = 1 << 8,
- MPCVD_AMVV = 1 << 9,
- MPCVD_FLASH = 1 << 10,
- MPCVD_H264_DXVA = 1 << 11,
- MPCVD_VC1_DXVA = 1 << 12,
- MPCVD_VP356 = 1 << 13,
- MPCVD_VP8 = 1 << 14,
- MPCVD_MJPEG = 1 << 15,
- MPCVD_INDEO = 1 << 16,
- MPCVD_RV = 1 << 17,
- MPCVD_WMV3_DXVA = 1 << 19,
- MPCVD_MPEG2_DXVA = 1 << 20,
+ MPCVD_H264 = 1 << 0,
+ MPCVD_VC1 = 1 << 1,
+ MPCVD_XVID = 1 << 2,
+ MPCVD_DIVX = 1 << 3,
+ MPCVD_WMV = 1 << 4,
+ MPCVD_MSMPEG4 = 1 << 5,
+ MPCVD_H263 = 1 << 6,
+ MPCVD_SVQ3 = 1 << 7,
+ MPCVD_THEORA = 1 << 8,
+ MPCVD_AMVV = 1 << 9,
+ MPCVD_FLASH = 1 << 10,
+ MPCVD_H264_DXVA = 1 << 11,
+ MPCVD_VC1_DXVA = 1 << 12,
+ MPCVD_VP356 = 1 << 13,
+ MPCVD_VP8 = 1 << 14,
+ MPCVD_MJPEG = 1 << 15,
+ MPCVD_INDEO = 1 << 16,
+ MPCVD_RV = 1 << 17,
+ MPCVD_WMV3_DXVA = 1 << 19,
+ MPCVD_MPEG2_DXVA = 1 << 20,
} MPC_VIDEO_CODEC;
interface __declspec(uuid("CDC3B5B3-A8B0-4c70-A805-9FC80CDEF262"))
IMPCVideoDecFilter :
public IUnknown {
- STDMETHOD(Apply()) = 0;
+ STDMETHOD(Apply()) = 0;
- STDMETHOD(SetThreadNumber(int nValue)) = 0;
- STDMETHOD_(int, GetThreadNumber()) = 0;
+ STDMETHOD(SetThreadNumber(int nValue)) = 0;
+ STDMETHOD_(int, GetThreadNumber()) = 0;
- STDMETHOD(SetDiscardMode(int nValue)) = 0;
- STDMETHOD_(int, GetDiscardMode()) = 0;
+ STDMETHOD(SetDiscardMode(int nValue)) = 0;
+ STDMETHOD_(int, GetDiscardMode()) = 0;
- STDMETHOD(SetErrorRecognition(int nValue)) = 0;
- STDMETHOD_(int, GetErrorRecognition()) = 0;
+ STDMETHOD(SetErrorRecognition(int nValue)) = 0;
+ STDMETHOD_(int, GetErrorRecognition()) = 0;
- STDMETHOD(SetIDCTAlgo(int nValue)) = 0;
- STDMETHOD_(int, GetIDCTAlgo()) = 0;
+ STDMETHOD(SetIDCTAlgo(int nValue)) = 0;
+ STDMETHOD_(int, GetIDCTAlgo()) = 0;
- STDMETHOD_(GUID*, GetDXVADecoderGuid()) = 0;
+ STDMETHOD_(GUID*, GetDXVADecoderGuid()) = 0;
- STDMETHOD(SetActiveCodecs(MPC_VIDEO_CODEC nValue)) = 0;
- STDMETHOD_(MPC_VIDEO_CODEC, GetActiveCodecs()) = 0;
+ STDMETHOD(SetActiveCodecs(MPC_VIDEO_CODEC nValue)) = 0;
+ STDMETHOD_(MPC_VIDEO_CODEC, GetActiveCodecs()) = 0;
- STDMETHOD_(LPCTSTR, GetVideoCardDescription()) = 0;
+ STDMETHOD_(LPCTSTR, GetVideoCardDescription()) = 0;
- STDMETHOD(SetARMode(int nValue)) = 0;
- STDMETHOD_(int, GetARMode()) = 0;
+ STDMETHOD(SetARMode(int nValue)) = 0;
+ STDMETHOD_(int, GetARMode()) = 0;
- STDMETHOD(SetDXVACheckCompatibility(int nValue)) = 0;
- STDMETHOD_(int, GetDXVACheckCompatibility()) = 0;
+ STDMETHOD(SetDXVACheckCompatibility(int nValue)) = 0;
+ STDMETHOD_(int, GetDXVACheckCompatibility()) = 0;
- STDMETHOD(SetDXVA_SD(int nValue)) = 0;
- STDMETHOD_(int, GetDXVA_SD()) = 0;
+ STDMETHOD(SetDXVA_SD(int nValue)) = 0;
+ STDMETHOD_(int, GetDXVA_SD()) = 0;
};
interface __declspec(uuid("F0ABC515-19ED-4D65-9D5F-59E36AE7F2AF"))
IMPCVideoDecFilter2 :
public IUnknown {
- STDMETHOD_(int, GetFrameType()) = 0;
+ STDMETHOD_(int, GetFrameType()) = 0;
};
diff --git a/src/filters/transform/MPCVideoDec/MPCFfmpegDec.cpp b/src/filters/transform/MPCVideoDec/MPCFfmpegDec.cpp
index f2c3be1a3..acdc587a3 100644
--- a/src/filters/transform/MPCVideoDec/MPCFfmpegDec.cpp
+++ b/src/filters/transform/MPCVideoDec/MPCFfmpegDec.cpp
@@ -28,30 +28,30 @@
// Workaround: graphedit crashes when a filter exposes more than 115 input MediaTypes!
const AMOVIESETUP_PIN sudpPinsVideoDec[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, CMPCVideoDecFilter::sudPinTypesInCount > 115 ? 115 : CMPCVideoDecFilter::sudPinTypesInCount, CMPCVideoDecFilter::sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, CMPCVideoDecFilter::sudPinTypesOutCount, CMPCVideoDecFilter::sudPinTypesOut}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, CMPCVideoDecFilter::sudPinTypesInCount > 115 ? 115 : CMPCVideoDecFilter::sudPinTypesInCount, CMPCVideoDecFilter::sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, CMPCVideoDecFilter::sudPinTypesOutCount, CMPCVideoDecFilter::sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilters[] = {
- {&__uuidof(CMPCVideoDecFilter), MPCVideoDecName, /*MERIT_DO_NOT_USE*/0x40000001, _countof(sudpPinsVideoDec), sudpPinsVideoDec, CLSID_LegacyAmFilterCategory}
+ {&__uuidof(CMPCVideoDecFilter), MPCVideoDecName, /*MERIT_DO_NOT_USE*/0x40000001, _countof(sudpPinsVideoDec), sudpPinsVideoDec, CLSID_LegacyAmFilterCategory}
};
CFactoryTemplate g_Templates[] = {
- {sudFilters[0].strName, &__uuidof(CMPCVideoDecFilter), CreateInstance<CMPCVideoDecFilter>, NULL, &sudFilters[0]},
- {L"CMPCVideoDecPropertyPage", &__uuidof(CMPCVideoDecSettingsWnd), CreateInstance<CInternalPropertyPageTempl<CMPCVideoDecSettingsWnd> >},
- {L"CMPCVideoDecPropertyPage2", &__uuidof(CMPCVideoDecCodecWnd), CreateInstance<CInternalPropertyPageTempl<CMPCVideoDecCodecWnd> >},
+ {sudFilters[0].strName, &__uuidof(CMPCVideoDecFilter), CreateInstance<CMPCVideoDecFilter>, NULL, &sudFilters[0]},
+ {L"CMPCVideoDecPropertyPage", &__uuidof(CMPCVideoDecSettingsWnd), CreateInstance<CInternalPropertyPageTempl<CMPCVideoDecSettingsWnd> >},
+ {L"CMPCVideoDecPropertyPage2", &__uuidof(CMPCVideoDecCodecWnd), CreateInstance<CInternalPropertyPageTempl<CMPCVideoDecCodecWnd> >},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
#include "../../FilterApp.h"
diff --git a/src/filters/transform/MPCVideoDec/MPCVideoDecFilter.cpp b/src/filters/transform/MPCVideoDec/MPCVideoDecFilter.cpp
index 41d84a5dc..421a7abc0 100644
--- a/src/filters/transform/MPCVideoDec/MPCVideoDecFilter.cpp
+++ b/src/filters/transform/MPCVideoDec/MPCVideoDecFilter.cpp
@@ -52,2586 +52,2589 @@ extern "C"
#include "DXVADecoderH264.h"
#include "../../../mpc-hc/FilterEnum.h"
-#define MAX_SUPPORTED_MODE 5
-#define ROUND_FRAMERATE(var,FrameRate) if (labs ((long)(var - FrameRate)) < FrameRate*1/100) var = FrameRate;
+#define MAX_SUPPORTED_MODE 5
+#define ROUND_FRAMERATE(var,FrameRate) if (labs ((long)(var - FrameRate)) < FrameRate*1/100) var = FrameRate;
#define AVRTIMEPERFRAME_VC1_EVO 417083
typedef struct {
- const int PicEntryNumber;
- const UINT PreferedConfigBitstream;
- const GUID* Decoder[MAX_SUPPORTED_MODE];
- const WORD RestrictedMode[MAX_SUPPORTED_MODE];
+ const int PicEntryNumber;
+ const UINT PreferedConfigBitstream;
+ const GUID* Decoder[MAX_SUPPORTED_MODE];
+ const WORD RestrictedMode[MAX_SUPPORTED_MODE];
} DXVA_PARAMS;
typedef struct {
- const CLSID* clsMinorType;
- const enum CodecID nFFCodec;
- const DXVA_PARAMS* DXVAModes;
-
- int DXVAModeCount() {
- if (!DXVAModes) {
- return 0;
- }
- for (int i=0; i<MAX_SUPPORTED_MODE; i++) {
- if (DXVAModes->Decoder[i] == &GUID_NULL) {
- return i;
- }
- }
- return MAX_SUPPORTED_MODE;
- }
+ const CLSID* clsMinorType;
+ const enum CodecID nFFCodec;
+ const DXVA_PARAMS* DXVAModes;
+
+ int DXVAModeCount() {
+ if (!DXVAModes) {
+ return 0;
+ }
+ for (int i = 0; i < MAX_SUPPORTED_MODE; i++) {
+ if (DXVAModes->Decoder[i] == &GUID_NULL) {
+ return i;
+ }
+ }
+ return MAX_SUPPORTED_MODE;
+ }
} FFMPEG_CODECS;
// DXVA modes supported for Mpeg2
-DXVA_PARAMS DXVA_Mpeg2 = {
- 9, // PicEntryNumber
- 1, // PreferedConfigBitstream
- { &DXVA2_ModeMPEG2_VLD, &GUID_NULL },
- { DXVA_RESTRICTED_MODE_UNRESTRICTED, 0 } // Restricted mode for DXVA1?
+DXVA_PARAMS DXVA_Mpeg2 = {
+ 9, // PicEntryNumber
+ 1, // PreferedConfigBitstream
+ { &DXVA2_ModeMPEG2_VLD, &GUID_NULL },
+ { DXVA_RESTRICTED_MODE_UNRESTRICTED, 0 } // Restricted mode for DXVA1?
};
// DXVA modes supported for H264
-DXVA_PARAMS DXVA_H264 = {
- 16, // PicEntryNumber
- 2, // PreferedConfigBitstream
- { &DXVA2_ModeH264_E, &DXVA2_ModeH264_F, &DXVA_Intel_H264_ClearVideo, &GUID_NULL },
- { DXVA_RESTRICTED_MODE_H264_E, 0}
+DXVA_PARAMS DXVA_H264 = {
+ 16, // PicEntryNumber
+ 2, // PreferedConfigBitstream
+ { &DXVA2_ModeH264_E, &DXVA2_ModeH264_F, &DXVA_Intel_H264_ClearVideo, &GUID_NULL },
+ { DXVA_RESTRICTED_MODE_H264_E, 0}
};
-DXVA_PARAMS DXVA_H264_VISTA = {
- 22, // PicEntryNumber
- 2, // PreferedConfigBitstream
- { &DXVA2_ModeH264_E, &DXVA2_ModeH264_F, &DXVA_Intel_H264_ClearVideo, &GUID_NULL },
- { DXVA_RESTRICTED_MODE_H264_E, 0}
+DXVA_PARAMS DXVA_H264_VISTA = {
+ 22, // PicEntryNumber
+ 2, // PreferedConfigBitstream
+ { &DXVA2_ModeH264_E, &DXVA2_ModeH264_F, &DXVA_Intel_H264_ClearVideo, &GUID_NULL },
+ { DXVA_RESTRICTED_MODE_H264_E, 0}
};
// DXVA modes supported for VC1
-DXVA_PARAMS DXVA_VC1 = {
- 14, // PicEntryNumber
- 1, // PreferedConfigBitstream
- { &DXVA2_ModeVC1_D, &GUID_NULL },
- { DXVA_RESTRICTED_MODE_VC1_D, 0}
+DXVA_PARAMS DXVA_VC1 = {
+ 14, // PicEntryNumber
+ 1, // PreferedConfigBitstream
+ { &DXVA2_ModeVC1_D, &GUID_NULL },
+ { DXVA_RESTRICTED_MODE_VC1_D, 0}
};
-FFMPEG_CODECS ffCodecs[] = {
+FFMPEG_CODECS ffCodecs[] = {
#if HAS_FFMPEG_VIDEO_DECODERS
- // Flash video
- { &MEDIASUBTYPE_FLV1, CODEC_ID_FLV1, NULL },
- { &MEDIASUBTYPE_flv1, CODEC_ID_FLV1, NULL },
- { &MEDIASUBTYPE_FLV4, CODEC_ID_VP6F, NULL },
- { &MEDIASUBTYPE_flv4, CODEC_ID_VP6F, NULL },
- { &MEDIASUBTYPE_VP6F, CODEC_ID_VP6F, NULL },
- { &MEDIASUBTYPE_vp6f, CODEC_ID_VP6F, NULL },
-
- // VP3
- { &MEDIASUBTYPE_VP30, CODEC_ID_VP3, NULL },
- { &MEDIASUBTYPE_VP31, CODEC_ID_VP3, NULL },
-
- // VP5
- { &MEDIASUBTYPE_VP50, CODEC_ID_VP5, NULL },
- { &MEDIASUBTYPE_vp50, CODEC_ID_VP5, NULL },
-
- // VP6
- { &MEDIASUBTYPE_VP60, CODEC_ID_VP6, NULL },
- { &MEDIASUBTYPE_vp60, CODEC_ID_VP6, NULL },
- { &MEDIASUBTYPE_VP61, CODEC_ID_VP6, NULL },
- { &MEDIASUBTYPE_vp61, CODEC_ID_VP6, NULL },
- { &MEDIASUBTYPE_VP62, CODEC_ID_VP6, NULL },
- { &MEDIASUBTYPE_vp62, CODEC_ID_VP6, NULL },
- { &MEDIASUBTYPE_VP6A, CODEC_ID_VP6A, NULL },
- { &MEDIASUBTYPE_vp6a, CODEC_ID_VP6A, NULL },
-
- // VP8
- { &MEDIASUBTYPE_VP80, CODEC_ID_VP8, NULL },
-
- // Xvid
- { &MEDIASUBTYPE_XVID, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_xvid, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_XVIX, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_xvix, CODEC_ID_MPEG4, NULL },
-
- // DivX
- { &MEDIASUBTYPE_DX50, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_dx50, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_DIVX, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_divx, CODEC_ID_MPEG4, NULL },
-
- // WMV1/2/3
- { &MEDIASUBTYPE_WMV1, CODEC_ID_WMV1, NULL },
- { &MEDIASUBTYPE_wmv1, CODEC_ID_WMV1, NULL },
- { &MEDIASUBTYPE_WMV2, CODEC_ID_WMV2, NULL },
- { &MEDIASUBTYPE_wmv2, CODEC_ID_WMV2, NULL },
- { &MEDIASUBTYPE_WMV3, CODEC_ID_WMV3, &DXVA_VC1 },
- { &MEDIASUBTYPE_wmv3, CODEC_ID_WMV3, &DXVA_VC1 },
-
- // MPEG-2
- { &MEDIASUBTYPE_MPEG2_VIDEO, CODEC_ID_MPEG2VIDEO, &DXVA_Mpeg2 },
- { &MEDIASUBTYPE_MPG2, CODEC_ID_MPEG2VIDEO, &DXVA_Mpeg2 },
-
- // MSMPEG-4
- { &MEDIASUBTYPE_DIV3, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_div3, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_DVX3, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_dvx3, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_MP43, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_mp43, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_COL1, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_col1, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_DIV4, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_div4, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_DIV5, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_div5, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_DIV6, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_div6, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_AP41, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_ap41, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_MPG3, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_mpg3, CODEC_ID_MSMPEG4V3, NULL },
- { &MEDIASUBTYPE_DIV2, CODEC_ID_MSMPEG4V2, NULL },
- { &MEDIASUBTYPE_div2, CODEC_ID_MSMPEG4V2, NULL },
- { &MEDIASUBTYPE_MP42, CODEC_ID_MSMPEG4V2, NULL },
- { &MEDIASUBTYPE_mp42, CODEC_ID_MSMPEG4V2, NULL },
- { &MEDIASUBTYPE_MPG4, CODEC_ID_MSMPEG4V1, NULL },
- { &MEDIASUBTYPE_mpg4, CODEC_ID_MSMPEG4V1, NULL },
- { &MEDIASUBTYPE_DIV1, CODEC_ID_MSMPEG4V1, NULL },
- { &MEDIASUBTYPE_div1, CODEC_ID_MSMPEG4V1, NULL },
- { &MEDIASUBTYPE_MP41, CODEC_ID_MSMPEG4V1, NULL },
- { &MEDIASUBTYPE_mp41, CODEC_ID_MSMPEG4V1, NULL },
-
- // AMV Video
- { &MEDIASUBTYPE_AMVV, CODEC_ID_AMV, NULL },
-
- // MJPEG
- { &MEDIASUBTYPE_MJPG, CODEC_ID_MJPEG, NULL },
- { &MEDIASUBTYPE_QTJpeg, CODEC_ID_MJPEG, NULL },
- { &MEDIASUBTYPE_MJPA, CODEC_ID_MJPEG, NULL },
- { &MEDIASUBTYPE_MJPB, CODEC_ID_MJPEGB, NULL },
-
- // TSCC
- { &MEDIASUBTYPE_TSCC, CODEC_ID_TSCC, NULL },
-
- // Indeo 3/4/5
- { &MEDIASUBTYPE_IV31, CODEC_ID_INDEO3, NULL },
- { &MEDIASUBTYPE_IV32, CODEC_ID_INDEO3, NULL },
- { &MEDIASUBTYPE_IV41, CODEC_ID_INDEO4, NULL },
- { &MEDIASUBTYPE_IV50, CODEC_ID_INDEO5, NULL },
+ // Flash video
+ { &MEDIASUBTYPE_FLV1, CODEC_ID_FLV1, NULL },
+ { &MEDIASUBTYPE_flv1, CODEC_ID_FLV1, NULL },
+ { &MEDIASUBTYPE_FLV4, CODEC_ID_VP6F, NULL },
+ { &MEDIASUBTYPE_flv4, CODEC_ID_VP6F, NULL },
+ { &MEDIASUBTYPE_VP6F, CODEC_ID_VP6F, NULL },
+ { &MEDIASUBTYPE_vp6f, CODEC_ID_VP6F, NULL },
+
+ // VP3
+ { &MEDIASUBTYPE_VP30, CODEC_ID_VP3, NULL },
+ { &MEDIASUBTYPE_VP31, CODEC_ID_VP3, NULL },
+
+ // VP5
+ { &MEDIASUBTYPE_VP50, CODEC_ID_VP5, NULL },
+ { &MEDIASUBTYPE_vp50, CODEC_ID_VP5, NULL },
+
+ // VP6
+ { &MEDIASUBTYPE_VP60, CODEC_ID_VP6, NULL },
+ { &MEDIASUBTYPE_vp60, CODEC_ID_VP6, NULL },
+ { &MEDIASUBTYPE_VP61, CODEC_ID_VP6, NULL },
+ { &MEDIASUBTYPE_vp61, CODEC_ID_VP6, NULL },
+ { &MEDIASUBTYPE_VP62, CODEC_ID_VP6, NULL },
+ { &MEDIASUBTYPE_vp62, CODEC_ID_VP6, NULL },
+ { &MEDIASUBTYPE_VP6A, CODEC_ID_VP6A, NULL },
+ { &MEDIASUBTYPE_vp6a, CODEC_ID_VP6A, NULL },
+
+ // VP8
+ { &MEDIASUBTYPE_VP80, CODEC_ID_VP8, NULL },
+
+ // Xvid
+ { &MEDIASUBTYPE_XVID, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_xvid, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_XVIX, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_xvix, CODEC_ID_MPEG4, NULL },
+
+ // DivX
+ { &MEDIASUBTYPE_DX50, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_dx50, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_DIVX, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_divx, CODEC_ID_MPEG4, NULL },
+
+ // WMV1/2/3
+ { &MEDIASUBTYPE_WMV1, CODEC_ID_WMV1, NULL },
+ { &MEDIASUBTYPE_wmv1, CODEC_ID_WMV1, NULL },
+ { &MEDIASUBTYPE_WMV2, CODEC_ID_WMV2, NULL },
+ { &MEDIASUBTYPE_wmv2, CODEC_ID_WMV2, NULL },
+ { &MEDIASUBTYPE_WMV3, CODEC_ID_WMV3, &DXVA_VC1 },
+ { &MEDIASUBTYPE_wmv3, CODEC_ID_WMV3, &DXVA_VC1 },
+
+ // MPEG-2
+ { &MEDIASUBTYPE_MPEG2_VIDEO, CODEC_ID_MPEG2VIDEO, &DXVA_Mpeg2 },
+ { &MEDIASUBTYPE_MPG2, CODEC_ID_MPEG2VIDEO, &DXVA_Mpeg2 },
+
+ // MSMPEG-4
+ { &MEDIASUBTYPE_DIV3, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_div3, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_DVX3, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_dvx3, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_MP43, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_mp43, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_COL1, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_col1, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_DIV4, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_div4, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_DIV5, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_div5, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_DIV6, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_div6, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_AP41, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_ap41, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_MPG3, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_mpg3, CODEC_ID_MSMPEG4V3, NULL },
+ { &MEDIASUBTYPE_DIV2, CODEC_ID_MSMPEG4V2, NULL },
+ { &MEDIASUBTYPE_div2, CODEC_ID_MSMPEG4V2, NULL },
+ { &MEDIASUBTYPE_MP42, CODEC_ID_MSMPEG4V2, NULL },
+ { &MEDIASUBTYPE_mp42, CODEC_ID_MSMPEG4V2, NULL },
+ { &MEDIASUBTYPE_MPG4, CODEC_ID_MSMPEG4V1, NULL },
+ { &MEDIASUBTYPE_mpg4, CODEC_ID_MSMPEG4V1, NULL },
+ { &MEDIASUBTYPE_DIV1, CODEC_ID_MSMPEG4V1, NULL },
+ { &MEDIASUBTYPE_div1, CODEC_ID_MSMPEG4V1, NULL },
+ { &MEDIASUBTYPE_MP41, CODEC_ID_MSMPEG4V1, NULL },
+ { &MEDIASUBTYPE_mp41, CODEC_ID_MSMPEG4V1, NULL },
+
+ // AMV Video
+ { &MEDIASUBTYPE_AMVV, CODEC_ID_AMV, NULL },
+
+ // MJPEG
+ { &MEDIASUBTYPE_MJPG, CODEC_ID_MJPEG, NULL },
+ { &MEDIASUBTYPE_QTJpeg, CODEC_ID_MJPEG, NULL },
+ { &MEDIASUBTYPE_MJPA, CODEC_ID_MJPEG, NULL },
+ { &MEDIASUBTYPE_MJPB, CODEC_ID_MJPEGB, NULL },
+
+ // TSCC
+ { &MEDIASUBTYPE_TSCC, CODEC_ID_TSCC, NULL },
+
+ // Indeo 3/4/5
+ { &MEDIASUBTYPE_IV31, CODEC_ID_INDEO3, NULL },
+ { &MEDIASUBTYPE_IV32, CODEC_ID_INDEO3, NULL },
+ { &MEDIASUBTYPE_IV41, CODEC_ID_INDEO4, NULL },
+ { &MEDIASUBTYPE_IV50, CODEC_ID_INDEO5, NULL },
#endif /* HAS_FFMPEG_VIDEO_DECODERS */
- // H264/AVC
- { &MEDIASUBTYPE_H264, CODEC_ID_H264, &DXVA_H264 },
- { &MEDIASUBTYPE_h264, CODEC_ID_H264, &DXVA_H264 },
- { &MEDIASUBTYPE_X264, CODEC_ID_H264, &DXVA_H264 },
- { &MEDIASUBTYPE_x264, CODEC_ID_H264, &DXVA_H264 },
- { &MEDIASUBTYPE_VSSH, CODEC_ID_H264, &DXVA_H264 },
- { &MEDIASUBTYPE_vssh, CODEC_ID_H264, &DXVA_H264 },
- { &MEDIASUBTYPE_DAVC, CODEC_ID_H264, &DXVA_H264 },
- { &MEDIASUBTYPE_davc, CODEC_ID_H264, &DXVA_H264 },
- { &MEDIASUBTYPE_PAVC, CODEC_ID_H264, &DXVA_H264 },
- { &MEDIASUBTYPE_pavc, CODEC_ID_H264, &DXVA_H264 },
- { &MEDIASUBTYPE_AVC1, CODEC_ID_H264, &DXVA_H264 },
- { &MEDIASUBTYPE_avc1, CODEC_ID_H264, &DXVA_H264 },
- { &MEDIASUBTYPE_H264_bis, CODEC_ID_H264, &DXVA_H264 },
+ // H264/AVC
+ { &MEDIASUBTYPE_H264, CODEC_ID_H264, &DXVA_H264 },
+ { &MEDIASUBTYPE_h264, CODEC_ID_H264, &DXVA_H264 },
+ { &MEDIASUBTYPE_X264, CODEC_ID_H264, &DXVA_H264 },
+ { &MEDIASUBTYPE_x264, CODEC_ID_H264, &DXVA_H264 },
+ { &MEDIASUBTYPE_VSSH, CODEC_ID_H264, &DXVA_H264 },
+ { &MEDIASUBTYPE_vssh, CODEC_ID_H264, &DXVA_H264 },
+ { &MEDIASUBTYPE_DAVC, CODEC_ID_H264, &DXVA_H264 },
+ { &MEDIASUBTYPE_davc, CODEC_ID_H264, &DXVA_H264 },
+ { &MEDIASUBTYPE_PAVC, CODEC_ID_H264, &DXVA_H264 },
+ { &MEDIASUBTYPE_pavc, CODEC_ID_H264, &DXVA_H264 },
+ { &MEDIASUBTYPE_AVC1, CODEC_ID_H264, &DXVA_H264 },
+ { &MEDIASUBTYPE_avc1, CODEC_ID_H264, &DXVA_H264 },
+ { &MEDIASUBTYPE_H264_bis, CODEC_ID_H264, &DXVA_H264 },
#if HAS_FFMPEG_VIDEO_DECODERS
- // SVQ3
- { &MEDIASUBTYPE_SVQ3, CODEC_ID_SVQ3, NULL },
+ // SVQ3
+ { &MEDIASUBTYPE_SVQ3, CODEC_ID_SVQ3, NULL },
- // SVQ1
- { &MEDIASUBTYPE_SVQ1, CODEC_ID_SVQ1, NULL },
+ // SVQ1
+ { &MEDIASUBTYPE_SVQ1, CODEC_ID_SVQ1, NULL },
- // H263
- { &MEDIASUBTYPE_H263, CODEC_ID_H263, NULL },
- { &MEDIASUBTYPE_h263, CODEC_ID_H263, NULL },
+ // H263
+ { &MEDIASUBTYPE_H263, CODEC_ID_H263, NULL },
+ { &MEDIASUBTYPE_h263, CODEC_ID_H263, NULL },
- { &MEDIASUBTYPE_S263, CODEC_ID_H263, NULL },
- { &MEDIASUBTYPE_s263, CODEC_ID_H263, NULL },
+ { &MEDIASUBTYPE_S263, CODEC_ID_H263, NULL },
+ { &MEDIASUBTYPE_s263, CODEC_ID_H263, NULL },
- // Real Video
- { &MEDIASUBTYPE_RV10, CODEC_ID_RV10, NULL },
- { &MEDIASUBTYPE_RV20, CODEC_ID_RV20, NULL },
- { &MEDIASUBTYPE_RV30, CODEC_ID_RV30, NULL },
- { &MEDIASUBTYPE_RV40, CODEC_ID_RV40, NULL },
+ // Real Video
+ { &MEDIASUBTYPE_RV10, CODEC_ID_RV10, NULL },
+ { &MEDIASUBTYPE_RV20, CODEC_ID_RV20, NULL },
+ { &MEDIASUBTYPE_RV30, CODEC_ID_RV30, NULL },
+ { &MEDIASUBTYPE_RV40, CODEC_ID_RV40, NULL },
- // Theora
- { &MEDIASUBTYPE_THEORA, CODEC_ID_THEORA, NULL },
- { &MEDIASUBTYPE_theora, CODEC_ID_THEORA, NULL },
+ // Theora
+ { &MEDIASUBTYPE_THEORA, CODEC_ID_THEORA, NULL },
+ { &MEDIASUBTYPE_theora, CODEC_ID_THEORA, NULL },
#endif /* HAS_FFMPEG_VIDEO_DECODERS */
- // WVC1
- { &MEDIASUBTYPE_WVC1, CODEC_ID_VC1, &DXVA_VC1 },
- { &MEDIASUBTYPE_wvc1, CODEC_ID_VC1, &DXVA_VC1 },
+ // WVC1
+ { &MEDIASUBTYPE_WVC1, CODEC_ID_VC1, &DXVA_VC1 },
+ { &MEDIASUBTYPE_wvc1, CODEC_ID_VC1, &DXVA_VC1 },
#if HAS_FFMPEG_VIDEO_DECODERS
- // Other MPEG-4
- { &MEDIASUBTYPE_MP4V, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_mp4v, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_M4S2, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_m4s2, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_MP4S, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_mp4s, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_3IV1, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_3iv1, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_3IV2, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_3iv2, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_3IVX, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_3ivx, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_BLZ0, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_blz0, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_DM4V, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_dm4v, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_FFDS, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_ffds, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_FVFW, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_fvfw, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_DXGM, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_dxgm, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_FMP4, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_fmp4, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_HDX4, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_hdx4, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_LMP4, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_lmp4, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_NDIG, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_ndig, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_RMP4, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_rmp4, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_SMP4, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_smp4, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_SEDG, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_sedg, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_UMP4, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_ump4, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_WV1F, CODEC_ID_MPEG4, NULL },
- { &MEDIASUBTYPE_wv1f, CODEC_ID_MPEG4, NULL }
+ // Other MPEG-4
+ { &MEDIASUBTYPE_MP4V, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_mp4v, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_M4S2, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_m4s2, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_MP4S, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_mp4s, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_3IV1, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_3iv1, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_3IV2, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_3iv2, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_3IVX, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_3ivx, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_BLZ0, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_blz0, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_DM4V, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_dm4v, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_FFDS, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_ffds, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_FVFW, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_fvfw, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_DXGM, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_dxgm, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_FMP4, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_fmp4, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_HDX4, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_hdx4, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_LMP4, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_lmp4, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_NDIG, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_ndig, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_RMP4, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_rmp4, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_SMP4, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_smp4, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_SEDG, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_sedg, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_UMP4, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_ump4, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_WV1F, CODEC_ID_MPEG4, NULL },
+ { &MEDIASUBTYPE_wv1f, CODEC_ID_MPEG4, NULL }
#endif /* HAS_FFMPEG_VIDEO_DECODERS */
};
/* Important: the order should be exactly the same as in ffCodecs[] */
const AMOVIESETUP_MEDIATYPE CMPCVideoDecFilter::sudPinTypesIn[] = {
#if HAS_FFMPEG_VIDEO_DECODERS
- // Flash video
- { &MEDIATYPE_Video, &MEDIASUBTYPE_FLV1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_flv1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_FLV4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_flv4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_VP6F },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_vp6f },
-
- // VP3
- { &MEDIATYPE_Video, &MEDIASUBTYPE_VP30 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_VP31 },
-
- // VP5
- { &MEDIATYPE_Video, &MEDIASUBTYPE_VP50 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_vp50 },
-
- // VP6
- { &MEDIATYPE_Video, &MEDIASUBTYPE_VP60 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_vp60 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_VP61 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_vp61 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_VP62 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_vp62 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_VP6A },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_vp6a },
-
- // VP8
- { &MEDIATYPE_Video, &MEDIASUBTYPE_VP80 },
-
- // Xvid
- { &MEDIATYPE_Video, &MEDIASUBTYPE_XVID },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_xvid },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_XVIX },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_xvix },
-
- // DivX
- { &MEDIATYPE_Video, &MEDIASUBTYPE_DX50 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_dx50 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_DIVX },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_divx },
-
- // WMV1/2/3
- { &MEDIATYPE_Video, &MEDIASUBTYPE_WMV1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_wmv1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_WMV2 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_wmv2 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_WMV3 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_wmv3 },
-
- // MPEG-2
- { &MEDIATYPE_Video, &MEDIASUBTYPE_MPEG2_VIDEO },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_MPG2 },
-
- // MSMPEG-4
- { &MEDIATYPE_Video, &MEDIASUBTYPE_DIV3 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_div3 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_DVX3 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_dvx3 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_MP43 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_mp43 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_COL1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_col1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_DIV4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_div4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_DIV5 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_div5 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_DIV6 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_div6 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_AP41 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_ap41 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_MPG3 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_mpg3 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_DIV2 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_div2 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_MP42 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_mp42 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_MPG4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_mpg4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_DIV1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_div1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_MP41 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_mp41 },
-
- // AMV Video
- { &MEDIATYPE_Video, &MEDIASUBTYPE_AMVV },
-
- // MJPEG
- { &MEDIATYPE_Video, &MEDIASUBTYPE_MJPG },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_QTJpeg },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_MJPA },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_MJPB },
-
- // TSCC
- { &MEDIATYPE_Video, &MEDIASUBTYPE_TSCC },
-
- // Indeo 3/4/5
- { &MEDIATYPE_Video, &MEDIASUBTYPE_IV31 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_IV32 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_IV41 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_IV50 },
+ // Flash video
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_FLV1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_flv1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_FLV4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_flv4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_VP6F },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_vp6f },
+
+ // VP3
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_VP30 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_VP31 },
+
+ // VP5
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_VP50 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_vp50 },
+
+ // VP6
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_VP60 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_vp60 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_VP61 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_vp61 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_VP62 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_vp62 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_VP6A },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_vp6a },
+
+ // VP8
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_VP80 },
+
+ // Xvid
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_XVID },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_xvid },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_XVIX },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_xvix },
+
+ // DivX
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_DX50 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_dx50 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_DIVX },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_divx },
+
+ // WMV1/2/3
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_WMV1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_wmv1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_WMV2 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_wmv2 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_WMV3 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_wmv3 },
+
+ // MPEG-2
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_MPEG2_VIDEO },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_MPG2 },
+
+ // MSMPEG-4
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_DIV3 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_div3 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_DVX3 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_dvx3 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_MP43 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_mp43 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_COL1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_col1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_DIV4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_div4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_DIV5 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_div5 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_DIV6 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_div6 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_AP41 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_ap41 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_MPG3 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_mpg3 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_DIV2 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_div2 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_MP42 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_mp42 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_MPG4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_mpg4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_DIV1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_div1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_MP41 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_mp41 },
+
+ // AMV Video
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_AMVV },
+
+ // MJPEG
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_MJPG },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_QTJpeg },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_MJPA },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_MJPB },
+
+ // TSCC
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_TSCC },
+
+ // Indeo 3/4/5
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_IV31 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_IV32 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_IV41 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_IV50 },
#endif /* HAS_FFMPEG_VIDEO_DECODERS */
- // H264/AVC
- { &MEDIATYPE_Video, &MEDIASUBTYPE_H264 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_h264 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_X264 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_x264 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_VSSH },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_vssh },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_DAVC },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_davc },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_PAVC },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_pavc },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_AVC1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_avc1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_H264_bis },
+ // H264/AVC
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_H264 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_h264 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_X264 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_x264 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_VSSH },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_vssh },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_DAVC },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_davc },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_PAVC },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_pavc },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_AVC1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_avc1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_H264_bis },
#if HAS_FFMPEG_VIDEO_DECODERS
- // SVQ3
- { &MEDIATYPE_Video, &MEDIASUBTYPE_SVQ3 },
+ // SVQ3
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_SVQ3 },
- // SVQ1
- { &MEDIATYPE_Video, &MEDIASUBTYPE_SVQ1 },
+ // SVQ1
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_SVQ1 },
- // H263
- { &MEDIATYPE_Video, &MEDIASUBTYPE_H263 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_h263 },
+ // H263
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_H263 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_h263 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_S263 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_s263 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_S263 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_s263 },
- // Real video
- { &MEDIATYPE_Video, &MEDIASUBTYPE_RV10 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_RV20 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_RV30 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_RV40 },
+ // Real video
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_RV10 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_RV20 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_RV30 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_RV40 },
- // Theora
- { &MEDIATYPE_Video, &MEDIASUBTYPE_THEORA },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_theora },
+ // Theora
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_THEORA },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_theora },
#endif /* HAS_FFMPEG_VIDEO_DECODERS */
- // VC1
- { &MEDIATYPE_Video, &MEDIASUBTYPE_WVC1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_wvc1 },
+ // VC1
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_WVC1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_wvc1 },
#if HAS_FFMPEG_VIDEO_DECODERS
- // IMPORTANT : some of the last MediaTypes present in next group may be not available in
- // the standalone filter (workaround to prevent GraphEdit crash).
- // Other MPEG-4
- { &MEDIATYPE_Video, &MEDIASUBTYPE_MP4V },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_mp4v },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_M4S2 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_m4s2 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_MP4S },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_mp4s },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_3IV1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_3iv1 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_3IV2 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_3iv2 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_3IVX },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_3ivx },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_BLZ0 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_blz0 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_DM4V },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_dm4v },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_FFDS },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_ffds },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_FVFW },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_fvfw },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_DXGM },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_dxgm },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_FMP4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_fmp4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_HDX4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_hdx4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_LMP4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_lmp4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_NDIG },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_ndig },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_RMP4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_rmp4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_SMP4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_smp4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_SEDG },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_sedg },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_UMP4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_ump4 },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_WV1F },
- { &MEDIATYPE_Video, &MEDIASUBTYPE_wv1f }
+ // IMPORTANT : some of the last MediaTypes present in next group may be not available in
+ // the standalone filter (workaround to prevent GraphEdit crash).
+ // Other MPEG-4
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_MP4V },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_mp4v },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_M4S2 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_m4s2 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_MP4S },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_mp4s },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_3IV1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_3iv1 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_3IV2 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_3iv2 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_3IVX },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_3ivx },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_BLZ0 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_blz0 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_DM4V },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_dm4v },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_FFDS },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_ffds },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_FVFW },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_fvfw },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_DXGM },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_dxgm },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_FMP4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_fmp4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_HDX4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_hdx4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_LMP4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_lmp4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_NDIG },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_ndig },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_RMP4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_rmp4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_SMP4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_smp4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_SEDG },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_sedg },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_UMP4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_ump4 },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_WV1F },
+ { &MEDIATYPE_Video, &MEDIASUBTYPE_wv1f }
#endif /* HAS_FFMPEG_VIDEO_DECODERS */
};
const int CMPCVideoDecFilter::sudPinTypesInCount = _countof(CMPCVideoDecFilter::sudPinTypesIn);
-bool* CMPCVideoDecFilter::FFmpegFilters = NULL;
-bool* CMPCVideoDecFilter::DXVAFilters = NULL;
+bool* CMPCVideoDecFilter::FFmpegFilters = NULL;
+bool* CMPCVideoDecFilter::DXVAFilters = NULL;
const AMOVIESETUP_MEDIATYPE CMPCVideoDecFilter::sudPinTypesOut[] = {
- {&MEDIATYPE_Video, &MEDIASUBTYPE_NV12},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_NV24}
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_NV12},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_NV24}
};
const int CMPCVideoDecFilter::sudPinTypesOutCount = _countof(CMPCVideoDecFilter::sudPinTypesOut);
-BOOL CALLBACK EnumFindProcessWnd (HWND hwnd, LPARAM lParam)
+BOOL CALLBACK EnumFindProcessWnd(HWND hwnd, LPARAM lParam)
{
- DWORD procid = 0;
- TCHAR WindowClass [40];
- GetWindowThreadProcessId (hwnd, &procid);
- GetClassName (hwnd, WindowClass, _countof(WindowClass));
+ DWORD procid = 0;
+ TCHAR WindowClass [40];
+ GetWindowThreadProcessId(hwnd, &procid);
+ GetClassName(hwnd, WindowClass, _countof(WindowClass));
- if (procid == GetCurrentProcessId() && _tcscmp (WindowClass, _T("MediaPlayerClassicW")) == 0) {
- HWND* pWnd = (HWND*)lParam;
- *pWnd = hwnd;
- return FALSE;
- }
- return TRUE;
+ if (procid == GetCurrentProcessId() && _tcscmp(WindowClass, _T("MediaPlayerClassicW")) == 0) {
+ HWND* pWnd = (HWND*)lParam;
+ *pWnd = hwnd;
+ return FALSE;
+ }
+ return TRUE;
}
CMPCVideoDecFilter::CMPCVideoDecFilter(LPUNKNOWN lpunk, HRESULT* phr)
- : CBaseVideoFilter(MPCVideoDecName, lpunk, phr, __uuidof(this))
-{
- HWND hWnd = NULL;
-
- if (SysVersion::IsVistaOrLater()) {
- for (int i=0; i<_countof(ffCodecs); i++) {
- if (ffCodecs[i].nFFCodec == CODEC_ID_H264) {
- ffCodecs[i].DXVAModes = &DXVA_H264_VISTA;
- }
- }
- }
-
- if (phr) {
- *phr = S_OK;
- }
-
- if (m_pOutput) {
- delete m_pOutput;
- }
- m_pOutput = DNew CVideoDecOutputPin(NAME("CVideoDecOutputPin"), this, phr, L"Output");
- if (!m_pOutput) {
- *phr = E_OUTOFMEMORY;
- }
-
- m_pCpuId = DNew CCpuId();
- m_pAVCodec = NULL;
- m_pAVCtx = NULL;
- m_pFrame = NULL;
- m_nCodecNb = -1;
- m_nCodecId = CODEC_ID_NONE;
- m_bReorderBFrame = true;
- m_DXVADecoderGUID = GUID_NULL;
- m_nActiveCodecs = MPCVD_H264|MPCVD_VC1|MPCVD_XVID|MPCVD_DIVX|MPCVD_MSMPEG4|MPCVD_FLASH|MPCVD_WMV|MPCVD_H263|MPCVD_SVQ3|MPCVD_AMVV|MPCVD_THEORA|MPCVD_H264_DXVA|MPCVD_VC1_DXVA|MPCVD_VP356|MPCVD_VP8|MPCVD_MJPEG|MPCVD_INDEO|MPCVD_RV|MPCVD_WMV3_DXVA|MPCVD_MPEG2_DXVA;
-
- m_rtAvrTimePerFrame = 0;
- m_rtLastStart = 0;
- m_nCountEstimated = 0;
- m_rtPrevStop = 0;
-
- m_nWorkaroundBug = FF_BUG_AUTODETECT;
- m_nErrorConcealment = FF_EC_DEBLOCK | FF_EC_GUESS_MVS;
-
- m_nThreadNumber = 0;
- m_nDiscardMode = AVDISCARD_DEFAULT;
- m_nErrorRecognition = AV_EF_CAREFUL;
- m_nIDCTAlgo = FF_IDCT_AUTO;
- m_bDXVACompatible = true;
- m_pFFBuffer = NULL;
- m_nFFBufferSize = 0;
- m_pAlignedFFBuffer = NULL;
- m_nAlignedFFBufferSize = 0;
- ResetBuffer();
-
- m_nWidth = 0;
- m_nHeight = 0;
- m_pSwsContext = NULL;
-
- m_bUseDXVA = true;
- m_bUseFFmpeg = true;
-
- m_nDXVAMode = MODE_SOFTWARE;
- m_pDXVADecoder = NULL;
- m_pVideoOutputFormat = NULL;
- m_nVideoOutputCount = 0;
- m_hDevice = INVALID_HANDLE_VALUE;
-
- m_nARMode = 1;
- m_nDXVACheckCompatibility = 1; // skip level check by default
- m_nDXVA_SD = 0;
- m_sar.SetSize(1,1);
-
- m_bTheoraMTSupport = true;
- m_bWaitingForKeyFrame = TRUE;
- m_nPosB = 1;
- m_bFrame_repeat_pict = false;
- m_bIsEVO = false;
+ : CBaseVideoFilter(MPCVideoDecName, lpunk, phr, __uuidof(this))
+{
+ HWND hWnd = NULL;
+
+ if (SysVersion::IsVistaOrLater()) {
+ for (int i = 0; i < _countof(ffCodecs); i++) {
+ if (ffCodecs[i].nFFCodec == CODEC_ID_H264) {
+ ffCodecs[i].DXVAModes = &DXVA_H264_VISTA;
+ }
+ }
+ }
+
+ if (phr) {
+ *phr = S_OK;
+ }
+
+ if (m_pOutput) {
+ delete m_pOutput;
+ }
+ m_pOutput = DNew CVideoDecOutputPin(NAME("CVideoDecOutputPin"), this, phr, L"Output");
+ if (!m_pOutput) {
+ *phr = E_OUTOFMEMORY;
+ }
+
+ m_pCpuId = DNew CCpuId();
+ m_pAVCodec = NULL;
+ m_pAVCtx = NULL;
+ m_pFrame = NULL;
+ m_nCodecNb = -1;
+ m_nCodecId = CODEC_ID_NONE;
+ m_bReorderBFrame = true;
+ m_DXVADecoderGUID = GUID_NULL;
+ m_nActiveCodecs = MPCVD_H264 | MPCVD_VC1 | MPCVD_XVID | MPCVD_DIVX | MPCVD_MSMPEG4 | MPCVD_FLASH | MPCVD_WMV | MPCVD_H263 | MPCVD_SVQ3 | MPCVD_AMVV | MPCVD_THEORA | MPCVD_H264_DXVA | MPCVD_VC1_DXVA | MPCVD_VP356 | MPCVD_VP8 | MPCVD_MJPEG | MPCVD_INDEO | MPCVD_RV | MPCVD_WMV3_DXVA | MPCVD_MPEG2_DXVA;
+
+ m_rtAvrTimePerFrame = 0;
+ m_rtLastStart = 0;
+ m_nCountEstimated = 0;
+ m_rtPrevStop = 0;
+
+ m_nWorkaroundBug = FF_BUG_AUTODETECT;
+ m_nErrorConcealment = FF_EC_DEBLOCK | FF_EC_GUESS_MVS;
+
+ m_nThreadNumber = 0;
+ m_nDiscardMode = AVDISCARD_DEFAULT;
+ m_nErrorRecognition = AV_EF_CAREFUL;
+ m_nIDCTAlgo = FF_IDCT_AUTO;
+ m_bDXVACompatible = true;
+ m_pFFBuffer = NULL;
+ m_nFFBufferSize = 0;
+ m_pAlignedFFBuffer = NULL;
+ m_nAlignedFFBufferSize = 0;
+ ResetBuffer();
+
+ m_nWidth = 0;
+ m_nHeight = 0;
+ m_pSwsContext = NULL;
+
+ m_bUseDXVA = true;
+ m_bUseFFmpeg = true;
+
+ m_nDXVAMode = MODE_SOFTWARE;
+ m_pDXVADecoder = NULL;
+ m_pVideoOutputFormat = NULL;
+ m_nVideoOutputCount = 0;
+ m_hDevice = INVALID_HANDLE_VALUE;
+
+ m_nARMode = 1;
+ m_nDXVACheckCompatibility = 1; // skip level check by default
+ m_nDXVA_SD = 0;
+ m_sar.SetSize(1, 1);
+
+ m_bTheoraMTSupport = true;
+ m_bWaitingForKeyFrame = TRUE;
+ m_nPosB = 1;
+ m_bFrame_repeat_pict = false;
+ m_bIsEVO = false;
#ifdef REGISTER_FILTER
- CRegKey key;
- if (ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPC Video Decoder"), KEY_READ)) {
- DWORD dw;
+ CRegKey key;
+ if (ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPC Video Decoder"), KEY_READ)) {
+ DWORD dw;
#if HAS_FFMPEG_VIDEO_DECODERS
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ThreadNumber"), dw)) {
- m_nThreadNumber = dw;
- }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ThreadNumber"), dw)) {
+ m_nThreadNumber = dw;
+ }
#if INTERNAL_DECODER_H264
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("DiscardMode"), dw)) {
- m_nDiscardMode = dw;
- }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("DiscardMode"), dw)) {
+ m_nDiscardMode = dw;
+ }
#endif
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ErrorRecognition"), dw)) {
- m_nErrorRecognition = dw;
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("IDCTAlgo"), dw)) {
- m_nIDCTAlgo = dw;
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ActiveCodecs"), dw)) {
- m_nActiveCodecs = dw;
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ARMode"), dw)) {
- m_nARMode = dw;
- }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ErrorRecognition"), dw)) {
+ m_nErrorRecognition = dw;
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("IDCTAlgo"), dw)) {
+ m_nIDCTAlgo = dw;
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ActiveCodecs"), dw)) {
+ m_nActiveCodecs = dw;
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ARMode"), dw)) {
+ m_nARMode = dw;
+ }
#endif
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("DXVACheckCompatibility"), dw)) {
- m_nDXVACheckCompatibility = dw;
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("DisableDXVA_SD"), dw)) {
- m_nDXVA_SD = dw;
- }
- }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("DXVACheckCompatibility"), dw)) {
+ m_nDXVACheckCompatibility = dw;
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("DisableDXVA_SD"), dw)) {
+ m_nDXVA_SD = dw;
+ }
+ }
#else
#if HAS_FFMPEG_VIDEO_DECODERS
- m_nThreadNumber = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("ThreadNumber"), m_nThreadNumber);
+ m_nThreadNumber = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("ThreadNumber"), m_nThreadNumber);
#if INTERNAL_DECODER_H264
- m_nDiscardMode = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("DiscardMode"), m_nDiscardMode);
+ m_nDiscardMode = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("DiscardMode"), m_nDiscardMode);
#endif
- m_nErrorRecognition = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("ErrorRecognition"), m_nErrorRecognition);
- m_nIDCTAlgo = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("IDCTAlgo"), m_nIDCTAlgo);
- m_nARMode = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("ARMode"), m_nARMode);
+ m_nErrorRecognition = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("ErrorRecognition"), m_nErrorRecognition);
+ m_nIDCTAlgo = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("IDCTAlgo"), m_nIDCTAlgo);
+ m_nARMode = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("ARMode"), m_nARMode);
#endif
- m_nDXVACheckCompatibility = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("DXVACheckCompatibility"), m_nDXVACheckCompatibility);
- m_nDXVA_SD = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("DisableDXVA_SD"), m_nDXVA_SD);
+ m_nDXVACheckCompatibility = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("DXVACheckCompatibility"), m_nDXVACheckCompatibility);
+ m_nDXVA_SD = AfxGetApp()->GetProfileInt(_T("Filters\\MPC Video Decoder"), _T("DisableDXVA_SD"), m_nDXVA_SD);
#endif
- if (m_nErrorRecognition != AV_EF_CAREFUL && m_nErrorRecognition != AV_EF_COMPLIANT && m_nErrorRecognition != AV_EF_AGGRESSIVE) {
- m_nErrorRecognition = AV_EF_CAREFUL;
- }
- if (m_nDXVACheckCompatibility > 3) {
- m_nDXVACheckCompatibility = 1; // skip level check by default
- }
+ if (m_nErrorRecognition != AV_EF_CAREFUL && m_nErrorRecognition != AV_EF_COMPLIANT && m_nErrorRecognition != AV_EF_AGGRESSIVE) {
+ m_nErrorRecognition = AV_EF_CAREFUL;
+ }
+ if (m_nDXVACheckCompatibility > 3) {
+ m_nDXVACheckCompatibility = 1; // skip level check by default
+ }
- ff_avcodec_default_get_buffer = avcodec_default_get_buffer;
- ff_avcodec_default_release_buffer = avcodec_default_release_buffer;
- ff_avcodec_default_reget_buffer = avcodec_default_reget_buffer;
+ ff_avcodec_default_get_buffer = avcodec_default_get_buffer;
+ ff_avcodec_default_release_buffer = avcodec_default_release_buffer;
+ ff_avcodec_default_reget_buffer = avcodec_default_reget_buffer;
- avcodec_register_all();
- av_log_set_callback(LogLibavcodec);
+ avcodec_register_all();
+ av_log_set_callback(LogLibavcodec);
- EnumWindows(EnumFindProcessWnd, (LPARAM)&hWnd);
- DetectVideoCard(hWnd);
+ EnumWindows(EnumFindProcessWnd, (LPARAM)&hWnd);
+ DetectVideoCard(hWnd);
#ifdef _DEBUG
- // Check codec definition table
- int nCodecs = _countof(ffCodecs);
- int nPinTypes = _countof(sudPinTypesIn);
- ASSERT (nCodecs == nPinTypes);
- for (int i=0; i<nPinTypes; i++) {
- ASSERT (ffCodecs[i].clsMinorType == sudPinTypesIn[i].clsMinorType);
- }
+ // Check codec definition table
+ int nCodecs = _countof(ffCodecs);
+ int nPinTypes = _countof(sudPinTypesIn);
+ ASSERT(nCodecs == nPinTypes);
+ for (int i = 0; i < nPinTypes; i++) {
+ ASSERT(ffCodecs[i].clsMinorType == sudPinTypesIn[i].clsMinorType);
+ }
#endif
}
void CMPCVideoDecFilter::DetectVideoCard(HWND hWnd)
{
- IDirect3D9* pD3D9;
- m_nPCIVendor = 0;
- m_nPCIDevice = 0;
- m_VideoDriverVersion.HighPart = 0;
- m_VideoDriverVersion.LowPart = 0;
-
- pD3D9 = Direct3DCreate9(D3D_SDK_VERSION);
- if (pD3D9) {
- D3DADAPTER_IDENTIFIER9 adapterIdentifier;
- if (pD3D9->GetAdapterIdentifier(GetAdapter(pD3D9, hWnd), 0, &adapterIdentifier) == S_OK) {
- m_nPCIVendor = adapterIdentifier.VendorId;
- m_nPCIDevice = adapterIdentifier.DeviceId;
- m_VideoDriverVersion = adapterIdentifier.DriverVersion;
- m_strDeviceDescription = adapterIdentifier.Description;
- m_strDeviceDescription.AppendFormat (_T(" (%04X:%04X)"), m_nPCIVendor, m_nPCIDevice);
- }
- pD3D9->Release();
- }
+ IDirect3D9* pD3D9;
+ m_nPCIVendor = 0;
+ m_nPCIDevice = 0;
+ m_VideoDriverVersion.HighPart = 0;
+ m_VideoDriverVersion.LowPart = 0;
+
+ pD3D9 = Direct3DCreate9(D3D_SDK_VERSION);
+ if (pD3D9) {
+ D3DADAPTER_IDENTIFIER9 adapterIdentifier;
+ if (pD3D9->GetAdapterIdentifier(GetAdapter(pD3D9, hWnd), 0, &adapterIdentifier) == S_OK) {
+ m_nPCIVendor = adapterIdentifier.VendorId;
+ m_nPCIDevice = adapterIdentifier.DeviceId;
+ m_VideoDriverVersion = adapterIdentifier.DriverVersion;
+ m_strDeviceDescription = adapterIdentifier.Description;
+ m_strDeviceDescription.AppendFormat(_T(" (%04X:%04X)"), m_nPCIVendor, m_nPCIDevice);
+ }
+ pD3D9->Release();
+ }
}
CMPCVideoDecFilter::~CMPCVideoDecFilter()
{
- Cleanup();
+ Cleanup();
- SAFE_DELETE(m_pCpuId);
+ SAFE_DELETE(m_pCpuId);
}
bool CMPCVideoDecFilter::IsVideoInterlaced()
{
- // NOT A BUG : always tell DirectShow it's interlaced (progressive flags set in
- // SetTypeSpecificFlags function)
- return true;
+ // NOT A BUG : always tell DirectShow it's interlaced (progressive flags set in
+ // SetTypeSpecificFlags function)
+ return true;
};
-void CMPCVideoDecFilter::UpdateFrameTime (REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop, bool b_repeat_pict)
+void CMPCVideoDecFilter::UpdateFrameTime(REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop, bool b_repeat_pict)
{
- bool m_PullDownFlag = (m_nCodecId == CODEC_ID_VC1 && b_repeat_pict && m_rtAvrTimePerFrame == 333666);
- REFERENCE_TIME m_rtFrameDuration = m_PullDownFlag ? AVRTIMEPERFRAME_VC1_EVO : m_rtAvrTimePerFrame;
+ bool m_PullDownFlag = (m_nCodecId == CODEC_ID_VC1 && b_repeat_pict && m_rtAvrTimePerFrame == 333666);
+ REFERENCE_TIME m_rtFrameDuration = m_PullDownFlag ? AVRTIMEPERFRAME_VC1_EVO : m_rtAvrTimePerFrame;
- if ((rtStart == _I64_MIN) || (m_PullDownFlag && m_rtPrevStop && (rtStart <= m_rtPrevStop))) {
- rtStart = m_rtLastStart + (m_rtFrameDuration / m_dRate) * m_nCountEstimated;
- m_nCountEstimated++;
- } else {
- m_rtLastStart = rtStart;
- m_nCountEstimated = 1;
- }
+ if ((rtStart == _I64_MIN) || (m_PullDownFlag && m_rtPrevStop && (rtStart <= m_rtPrevStop))) {
+ rtStart = m_rtLastStart + (m_rtFrameDuration / m_dRate) * m_nCountEstimated;
+ m_nCountEstimated++;
+ } else {
+ m_rtLastStart = rtStart;
+ m_nCountEstimated = 1;
+ }
- rtStop = rtStart + (m_rtFrameDuration / m_dRate);
+ rtStop = rtStart + (m_rtFrameDuration / m_dRate);
}
void CMPCVideoDecFilter::GetOutputSize(int& w, int& h, int& arx, int& ary, int& RealWidth, int& RealHeight)
{
#if 1
- RealWidth = m_nWidth;
- RealHeight = m_nHeight;
- w = PictWidthRounded();
- h = PictHeightRounded();
+ RealWidth = m_nWidth;
+ RealHeight = m_nHeight;
+ w = PictWidthRounded();
+ h = PictHeightRounded();
#else
- if (m_nDXVAMode == MODE_SOFTWARE) {
- w = m_nWidth;
- h = m_nHeight;
- } else {
- // DXVA surface are multiple of 16 pixels!
- w = PictWidthRounded();
- h = PictHeightRounded();
- }
+ if (m_nDXVAMode == MODE_SOFTWARE) {
+ w = m_nWidth;
+ h = m_nHeight;
+ } else {
+ // DXVA surface are multiple of 16 pixels!
+ w = PictWidthRounded();
+ h = PictHeightRounded();
+ }
#endif
}
int CMPCVideoDecFilter::PictWidth()
{
- return m_nWidth;
+ return m_nWidth;
}
int CMPCVideoDecFilter::PictHeight()
{
- return m_nHeight;
+ return m_nHeight;
}
int CMPCVideoDecFilter::PictWidthRounded()
{
- // Picture height should be rounded to 16 for DXVA
- return ((m_nWidth + 15) / 16) * 16;
+ // Picture height should be rounded to 16 for DXVA
+ return ((m_nWidth + 15) / 16) * 16;
}
int CMPCVideoDecFilter::PictHeightRounded()
{
- // Picture height should be rounded to 16 for DXVA
- return ((m_nHeight + 15) / 16) * 16;
+ // Picture height should be rounded to 16 for DXVA
+ return ((m_nHeight + 15) / 16) * 16;
}
int CMPCVideoDecFilter::FindCodec(const CMediaType* mtIn)
{
- for (int i=0; i<_countof(ffCodecs); i++)
- if (mtIn->subtype == *ffCodecs[i].clsMinorType) {
+ for (int i = 0; i < _countof(ffCodecs); i++)
+ if (mtIn->subtype == *ffCodecs[i].clsMinorType) {
#ifndef REGISTER_FILTER
- switch (ffCodecs[i].nFFCodec) {
- case CODEC_ID_H264 :
+ switch (ffCodecs[i].nFFCodec) {
+ case CODEC_ID_H264 :
#if INTERNAL_DECODER_H264_DXVA
- m_bUseDXVA = DXVAFilters && DXVAFilters[TRA_DXVA_H264];
+ m_bUseDXVA = DXVAFilters && DXVAFilters[TRA_DXVA_H264];
#else
- m_bUseDXVA = false;
+ m_bUseDXVA = false;
#endif
#if INTERNAL_DECODER_H264
- m_bUseFFmpeg = FFmpegFilters && FFmpegFilters[FFM_H264];
+ m_bUseFFmpeg = FFmpegFilters && FFmpegFilters[FFM_H264];
#else
- m_bUseFFmpeg = false;
+ m_bUseFFmpeg = false;
#endif
- break;
- case CODEC_ID_VC1 :
+ break;
+ case CODEC_ID_VC1 :
#if INTERNAL_DECODER_VC1_DXVA
- m_bUseDXVA = DXVAFilters && DXVAFilters[TRA_DXVA_VC1];
+ m_bUseDXVA = DXVAFilters && DXVAFilters[TRA_DXVA_VC1];
#else
- m_bUseDXVA = false;
+ m_bUseDXVA = false;
#endif
#if INTERNAL_DECODER_VC1
- m_bUseFFmpeg = FFmpegFilters && FFmpegFilters[FFM_VC1];
+ m_bUseFFmpeg = FFmpegFilters && FFmpegFilters[FFM_VC1];
#else
- m_bUseFFmpeg = false;
+ m_bUseFFmpeg = false;
#endif
- break;
- case CODEC_ID_WMV3 :
+ break;
+ case CODEC_ID_WMV3 :
#if INTERNAL_DECODER_WMV3_DXVA
- m_bUseDXVA = DXVAFilters && DXVAFilters[TRA_DXVA_WMV3];
+ m_bUseDXVA = DXVAFilters && DXVAFilters[TRA_DXVA_WMV3];
#else
- m_bUseDXVA = false;
+ m_bUseDXVA = false;
#endif
#if INTERNAL_DECODER_WMV
- m_bUseFFmpeg = FFmpegFilters && FFmpegFilters[FFM_WMV];
+ m_bUseFFmpeg = FFmpegFilters && FFmpegFilters[FFM_WMV];
#else
- m_bUseFFmpeg = false;
+ m_bUseFFmpeg = false;
#endif
- break;
- case CODEC_ID_MPEG2VIDEO :
+ break;
+ case CODEC_ID_MPEG2VIDEO :
#if INTERNAL_DECODER_MPEG2_DXVA
- m_bUseDXVA = true;
+ m_bUseDXVA = true;
#endif
- m_bUseFFmpeg = false; // No Mpeg2 software support with ffmpeg!
- break;
- default :
- m_bUseDXVA = false;
- }
+ m_bUseFFmpeg = false; // No Mpeg2 software support with ffmpeg!
+ break;
+ default :
+ m_bUseDXVA = false;
+ }
- return ((m_bUseDXVA || m_bUseFFmpeg) ? i : -1);
+ return ((m_bUseDXVA || m_bUseFFmpeg) ? i : -1);
#else
- bool bCodecActivated = false;
- switch (ffCodecs[i].nFFCodec) {
- case CODEC_ID_FLV1 :
- case CODEC_ID_VP6F :
- bCodecActivated = (m_nActiveCodecs & MPCVD_FLASH) != 0;
- break;
- case CODEC_ID_MPEG4 :
- if ((*ffCodecs[i].clsMinorType == MEDIASUBTYPE_DX50) || // DivX
- (*ffCodecs[i].clsMinorType == MEDIASUBTYPE_dx50) ||
- (*ffCodecs[i].clsMinorType == MEDIASUBTYPE_DIVX) ||
- (*ffCodecs[i].clsMinorType == MEDIASUBTYPE_divx) ) {
- bCodecActivated = (m_nActiveCodecs & MPCVD_DIVX) != 0;
- } else {
- bCodecActivated = (m_nActiveCodecs & MPCVD_XVID) != 0; // Xvid/MPEG-4
- }
- break;
- case CODEC_ID_WMV1 :
- case CODEC_ID_WMV2 :
- bCodecActivated = (m_nActiveCodecs & MPCVD_WMV) != 0;
- break;
- case CODEC_ID_WMV3 :
- m_bUseDXVA = (m_nActiveCodecs & MPCVD_WMV3_DXVA) != 0;
- m_bUseFFmpeg = (m_nActiveCodecs & MPCVD_WMV) != 0;
- bCodecActivated = m_bUseDXVA || m_bUseFFmpeg;
- break;
- case CODEC_ID_MSMPEG4V3 :
- case CODEC_ID_MSMPEG4V2 :
- case CODEC_ID_MSMPEG4V1 :
- bCodecActivated = (m_nActiveCodecs & MPCVD_MSMPEG4) != 0;
- break;
- case CODEC_ID_H264 :
- m_bUseDXVA = (m_nActiveCodecs & MPCVD_H264_DXVA) != 0;
- m_bUseFFmpeg = (m_nActiveCodecs & MPCVD_H264) != 0;
- bCodecActivated = m_bUseDXVA || m_bUseFFmpeg;
- break;
- case CODEC_ID_SVQ3 :
- case CODEC_ID_SVQ1 :
- bCodecActivated = (m_nActiveCodecs & MPCVD_SVQ3) != 0;
- break;
- case CODEC_ID_H263 :
- bCodecActivated = (m_nActiveCodecs & MPCVD_H263) != 0;
- break;
- case CODEC_ID_THEORA :
- bCodecActivated = (m_nActiveCodecs & MPCVD_THEORA) != 0;
- break;
- case CODEC_ID_VC1 :
- m_bUseDXVA = (m_nActiveCodecs & MPCVD_VC1_DXVA) != 0;
- m_bUseFFmpeg = (m_nActiveCodecs & MPCVD_VC1) != 0;
- bCodecActivated = m_bUseDXVA || m_bUseFFmpeg;
- break;
- case CODEC_ID_AMV :
- bCodecActivated = (m_nActiveCodecs & MPCVD_AMVV) != 0;
- break;
- case CODEC_ID_VP3 :
- case CODEC_ID_VP5 :
- case CODEC_ID_VP6 :
- case CODEC_ID_VP6A :
- bCodecActivated = (m_nActiveCodecs & MPCVD_VP356) != 0;
- break;
- case CODEC_ID_VP8 :
- bCodecActivated = (m_nActiveCodecs & MPCVD_VP8) != 0;
- break;
- case CODEC_ID_MJPEG :
- case CODEC_ID_MJPEGB :
- bCodecActivated = (m_nActiveCodecs & MPCVD_MJPEG) != 0;
- break;
- case CODEC_ID_INDEO3 :
- case CODEC_ID_INDEO4 :
- case CODEC_ID_INDEO5 :
- bCodecActivated = (m_nActiveCodecs & MPCVD_INDEO) != 0;
- break;
- case CODEC_ID_TSCC :
- bCodecActivated = 1;
- break;
- case CODEC_ID_RV10 :
- case CODEC_ID_RV20 :
- case CODEC_ID_RV30 :
- case CODEC_ID_RV40 :
- bCodecActivated = (m_nActiveCodecs & MPCVD_RV) != 0;
- break;
- case CODEC_ID_MPEG2VIDEO :
- m_bUseDXVA = (m_nActiveCodecs & MPCVD_MPEG2_DXVA) != 0;
- m_bUseFFmpeg = false;
- bCodecActivated = m_bUseDXVA;
- break;
- }
- return (bCodecActivated ? i : -1);
+ bool bCodecActivated = false;
+ switch (ffCodecs[i].nFFCodec) {
+ case CODEC_ID_FLV1 :
+ case CODEC_ID_VP6F :
+ bCodecActivated = (m_nActiveCodecs & MPCVD_FLASH) != 0;
+ break;
+ case CODEC_ID_MPEG4 :
+ if ((*ffCodecs[i].clsMinorType == MEDIASUBTYPE_DX50) || // DivX
+ (*ffCodecs[i].clsMinorType == MEDIASUBTYPE_dx50) ||
+ (*ffCodecs[i].clsMinorType == MEDIASUBTYPE_DIVX) ||
+ (*ffCodecs[i].clsMinorType == MEDIASUBTYPE_divx)) {
+ bCodecActivated = (m_nActiveCodecs & MPCVD_DIVX) != 0;
+ } else {
+ bCodecActivated = (m_nActiveCodecs & MPCVD_XVID) != 0; // Xvid/MPEG-4
+ }
+ break;
+ case CODEC_ID_WMV1 :
+ case CODEC_ID_WMV2 :
+ bCodecActivated = (m_nActiveCodecs & MPCVD_WMV) != 0;
+ break;
+ case CODEC_ID_WMV3 :
+ m_bUseDXVA = (m_nActiveCodecs & MPCVD_WMV3_DXVA) != 0;
+ m_bUseFFmpeg = (m_nActiveCodecs & MPCVD_WMV) != 0;
+ bCodecActivated = m_bUseDXVA || m_bUseFFmpeg;
+ break;
+ case CODEC_ID_MSMPEG4V3 :
+ case CODEC_ID_MSMPEG4V2 :
+ case CODEC_ID_MSMPEG4V1 :
+ bCodecActivated = (m_nActiveCodecs & MPCVD_MSMPEG4) != 0;
+ break;
+ case CODEC_ID_H264 :
+ m_bUseDXVA = (m_nActiveCodecs & MPCVD_H264_DXVA) != 0;
+ m_bUseFFmpeg = (m_nActiveCodecs & MPCVD_H264) != 0;
+ bCodecActivated = m_bUseDXVA || m_bUseFFmpeg;
+ break;
+ case CODEC_ID_SVQ3 :
+ case CODEC_ID_SVQ1 :
+ bCodecActivated = (m_nActiveCodecs & MPCVD_SVQ3) != 0;
+ break;
+ case CODEC_ID_H263 :
+ bCodecActivated = (m_nActiveCodecs & MPCVD_H263) != 0;
+ break;
+ case CODEC_ID_THEORA :
+ bCodecActivated = (m_nActiveCodecs & MPCVD_THEORA) != 0;
+ break;
+ case CODEC_ID_VC1 :
+ m_bUseDXVA = (m_nActiveCodecs & MPCVD_VC1_DXVA) != 0;
+ m_bUseFFmpeg = (m_nActiveCodecs & MPCVD_VC1) != 0;
+ bCodecActivated = m_bUseDXVA || m_bUseFFmpeg;
+ break;
+ case CODEC_ID_AMV :
+ bCodecActivated = (m_nActiveCodecs & MPCVD_AMVV) != 0;
+ break;
+ case CODEC_ID_VP3 :
+ case CODEC_ID_VP5 :
+ case CODEC_ID_VP6 :
+ case CODEC_ID_VP6A :
+ bCodecActivated = (m_nActiveCodecs & MPCVD_VP356) != 0;
+ break;
+ case CODEC_ID_VP8 :
+ bCodecActivated = (m_nActiveCodecs & MPCVD_VP8) != 0;
+ break;
+ case CODEC_ID_MJPEG :
+ case CODEC_ID_MJPEGB :
+ bCodecActivated = (m_nActiveCodecs & MPCVD_MJPEG) != 0;
+ break;
+ case CODEC_ID_INDEO3 :
+ case CODEC_ID_INDEO4 :
+ case CODEC_ID_INDEO5 :
+ bCodecActivated = (m_nActiveCodecs & MPCVD_INDEO) != 0;
+ break;
+ case CODEC_ID_TSCC :
+ bCodecActivated = 1;
+ break;
+ case CODEC_ID_RV10 :
+ case CODEC_ID_RV20 :
+ case CODEC_ID_RV30 :
+ case CODEC_ID_RV40 :
+ bCodecActivated = (m_nActiveCodecs & MPCVD_RV) != 0;
+ break;
+ case CODEC_ID_MPEG2VIDEO :
+ m_bUseDXVA = (m_nActiveCodecs & MPCVD_MPEG2_DXVA) != 0;
+ m_bUseFFmpeg = false;
+ bCodecActivated = m_bUseDXVA;
+ break;
+ }
+ return (bCodecActivated ? i : -1);
#endif
- }
+ }
- return -1;
+ return -1;
}
void CMPCVideoDecFilter::Cleanup()
{
- SAFE_DELETE (m_pDXVADecoder);
+ SAFE_DELETE(m_pDXVADecoder);
- // Release FFMpeg
- if (m_pAVCtx) {
- if (m_pAVCtx->extradata) {
- av_freep(&m_pAVCtx->extradata);
- }
- if (m_pFFBuffer) {
- av_freep(&m_pFFBuffer);
- }
- m_nFFBufferSize = 0;
- if (m_pAlignedFFBuffer) {
- av_freep(&m_pAlignedFFBuffer);
- }
- m_nAlignedFFBufferSize = 0;
+ // Release FFMpeg
+ if (m_pAVCtx) {
+ if (m_pAVCtx->extradata) {
+ av_freep(&m_pAVCtx->extradata);
+ }
+ if (m_pFFBuffer) {
+ av_freep(&m_pFFBuffer);
+ }
+ m_nFFBufferSize = 0;
+ if (m_pAlignedFFBuffer) {
+ av_freep(&m_pAlignedFFBuffer);
+ }
+ m_nAlignedFFBufferSize = 0;
- if (m_pAVCtx->codec) {
- avcodec_close(m_pAVCtx);
- }
+ if (m_pAVCtx->codec) {
+ avcodec_close(m_pAVCtx);
+ }
- // Free thread resource if necessary
- FFSetThreadNumber (m_pAVCtx, m_pAVCtx->codec_id, 0);
+ // Free thread resource if necessary
+ FFSetThreadNumber(m_pAVCtx, m_pAVCtx->codec_id, 0);
- av_freep(&m_pAVCtx);
- }
+ av_freep(&m_pAVCtx);
+ }
- if (m_pFrame) {
- av_freep(&m_pFrame);
- }
+ if (m_pFrame) {
+ av_freep(&m_pFrame);
+ }
#if HAS_FFMPEG_VIDEO_DECODERS
- if (m_pSwsContext) {
- sws_freeContext(m_pSwsContext);
- m_pSwsContext = NULL;
- }
+ if (m_pSwsContext) {
+ sws_freeContext(m_pSwsContext);
+ m_pSwsContext = NULL;
+ }
#endif /* HAS_FFMPEG_VIDEO_DECODERS */
- m_pAVCodec = NULL;
- m_pAVCtx = NULL;
- m_pFrame = NULL;
- m_pFFBuffer = NULL;
- m_nFFBufferSize = 0;
- m_nFFBufferPos = 0;
- m_nFFPicEnd = INT_MIN;
- m_nCodecNb = -1;
- m_nCodecId = CODEC_ID_NONE;
- SAFE_DELETE_ARRAY (m_pVideoOutputFormat);
+ m_pAVCodec = NULL;
+ m_pAVCtx = NULL;
+ m_pFrame = NULL;
+ m_pFFBuffer = NULL;
+ m_nFFBufferSize = 0;
+ m_nFFBufferPos = 0;
+ m_nFFPicEnd = INT_MIN;
+ m_nCodecNb = -1;
+ m_nCodecId = CODEC_ID_NONE;
+ SAFE_DELETE_ARRAY(m_pVideoOutputFormat);
- // Release DXVA ressources
- if (m_hDevice != INVALID_HANDLE_VALUE) {
- m_pDeviceManager->CloseDeviceHandle(m_hDevice);
- m_hDevice = INVALID_HANDLE_VALUE;
- }
+ // Release DXVA ressources
+ if (m_hDevice != INVALID_HANDLE_VALUE) {
+ m_pDeviceManager->CloseDeviceHandle(m_hDevice);
+ m_hDevice = INVALID_HANDLE_VALUE;
+ }
- m_pDeviceManager = NULL;
- m_pDecoderService = NULL;
- m_pDecoderRenderTarget = NULL;
+ m_pDeviceManager = NULL;
+ m_pDecoderService = NULL;
+ m_pDecoderRenderTarget = NULL;
}
void CMPCVideoDecFilter::CalcAvgTimePerFrame()
{
- CMediaType &mt = m_pInput->CurrentMediaType();
- if (mt.formattype==FORMAT_VideoInfo) {
- m_rtAvrTimePerFrame = ((VIDEOINFOHEADER*)mt.pbFormat)->AvgTimePerFrame;
- } else if (mt.formattype==FORMAT_VideoInfo2) {
- m_rtAvrTimePerFrame = ((VIDEOINFOHEADER2*)mt.pbFormat)->AvgTimePerFrame;
- } else if (mt.formattype==FORMAT_MPEGVideo) {
- m_rtAvrTimePerFrame = ((MPEG1VIDEOINFO*)mt.pbFormat)->hdr.AvgTimePerFrame;
- } else if (mt.formattype==FORMAT_MPEG2Video) {
- m_rtAvrTimePerFrame = ((MPEG2VIDEOINFO*)mt.pbFormat)->hdr.AvgTimePerFrame;
- } else {
- ASSERT (FALSE);
- m_rtAvrTimePerFrame = 1;
- }
+ CMediaType& mt = m_pInput->CurrentMediaType();
+ if (mt.formattype == FORMAT_VideoInfo) {
+ m_rtAvrTimePerFrame = ((VIDEOINFOHEADER*)mt.pbFormat)->AvgTimePerFrame;
+ } else if (mt.formattype == FORMAT_VideoInfo2) {
+ m_rtAvrTimePerFrame = ((VIDEOINFOHEADER2*)mt.pbFormat)->AvgTimePerFrame;
+ } else if (mt.formattype == FORMAT_MPEGVideo) {
+ m_rtAvrTimePerFrame = ((MPEG1VIDEOINFO*)mt.pbFormat)->hdr.AvgTimePerFrame;
+ } else if (mt.formattype == FORMAT_MPEG2Video) {
+ m_rtAvrTimePerFrame = ((MPEG2VIDEOINFO*)mt.pbFormat)->hdr.AvgTimePerFrame;
+ } else {
+ ASSERT(FALSE);
+ m_rtAvrTimePerFrame = 1;
+ }
- m_rtAvrTimePerFrame = max (1, m_rtAvrTimePerFrame);
+ m_rtAvrTimePerFrame = max(1, m_rtAvrTimePerFrame);
}
-void CMPCVideoDecFilter::LogLibavcodec(void* par,int level,const char *fmt,va_list valist)
+void CMPCVideoDecFilter::LogLibavcodec(void* par, int level, const char* fmt, va_list valist)
{
#if defined(_DEBUG) && 0
- char Msg [500];
- vsnprintf_s (Msg, sizeof(Msg), _TRUNCATE, fmt, valist);
- TRACE("AVLIB : %s", Msg);
+ char Msg [500];
+ vsnprintf_s(Msg, sizeof(Msg), _TRUNCATE, fmt, valist);
+ TRACE("AVLIB : %s", Msg);
#endif
}
-void CMPCVideoDecFilter::OnGetBuffer(AVFrame *pic)
+void CMPCVideoDecFilter::OnGetBuffer(AVFrame* pic)
{
- // Callback from FFMpeg to store Ref Time in frame (needed to have correct rtStart after avcodec_decode_video calls)
- // pic->rtStart = m_rtStart;
+ // Callback from FFMpeg to store Ref Time in frame (needed to have correct rtStart after avcodec_decode_video calls)
+ // pic->rtStart = m_rtStart;
}
STDMETHODIMP CMPCVideoDecFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- return
- QI(IMPCVideoDecFilter)
- QI(IMPCVideoDecFilter2)
- QI(ISpecifyPropertyPages)
- QI(ISpecifyPropertyPages2)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IMPCVideoDecFilter)
+ QI(IMPCVideoDecFilter2)
+ QI(ISpecifyPropertyPages)
+ QI(ISpecifyPropertyPages2)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CMPCVideoDecFilter::CheckInputType(const CMediaType* mtIn)
{
- for (int i=0; i<_countof(sudPinTypesIn); i++) {
- if ((mtIn->majortype == *sudPinTypesIn[i].clsMajorType) &&
- (mtIn->subtype == *sudPinTypesIn[i].clsMinorType)) {
- return S_OK;
- }
- }
+ for (int i = 0; i < _countof(sudPinTypesIn); i++) {
+ if ((mtIn->majortype == *sudPinTypesIn[i].clsMajorType) &&
+ (mtIn->subtype == *sudPinTypesIn[i].clsMinorType)) {
+ return S_OK;
+ }
+ }
- return VFW_E_TYPE_NOT_ACCEPTED;
+ return VFW_E_TYPE_NOT_ACCEPTED;
}
bool CMPCVideoDecFilter::IsMultiThreadSupported(enum CodecID nCodec)
{
- return
- (
- nCodec==CODEC_ID_H264 ||
- nCodec==CODEC_ID_MPEG1VIDEO ||
- nCodec==CODEC_ID_FFV1 ||
- nCodec==CODEC_ID_DVVIDEO ||
- nCodec==CODEC_ID_VP3 ||
- nCodec==CODEC_ID_VP8 ||
- nCodec==CODEC_ID_THEORA ||
- nCodec==CODEC_ID_RV30 ||
- nCodec==CODEC_ID_RV40
- );
+ return
+ (
+ nCodec == CODEC_ID_H264 ||
+ nCodec == CODEC_ID_MPEG1VIDEO ||
+ nCodec == CODEC_ID_FFV1 ||
+ nCodec == CODEC_ID_DVVIDEO ||
+ nCodec == CODEC_ID_VP3 ||
+ nCodec == CODEC_ID_VP8 ||
+ nCodec == CODEC_ID_THEORA ||
+ nCodec == CODEC_ID_RV30 ||
+ nCodec == CODEC_ID_RV40
+ );
}
CString CMPCVideoDecFilter::GetFileExtension()
{
- CString ext = _T("");
-
- BeginEnumFilters(m_pGraph, pEF, pBF) {
- CComQIPtr<IFileSourceFilter> pFSF = pBF;
- if (pFSF) {
- LPOLESTR pFN = NULL;
- AM_MEDIA_TYPE mt;
- if (SUCCEEDED(pFSF->GetCurFile(&pFN, &mt)) && pFN && *pFN) {
- ext = CPath(CStringW(pFN)).GetExtension();
- ext.MakeLower();
- CoTaskMemFree(pFN);
- }
- break;
- }
- }
- EndEnumFilters
-
- return ext;
-}
-
-HRESULT CMPCVideoDecFilter::SetMediaType(PIN_DIRECTION direction,const CMediaType *pmt)
-{
- if (direction == PINDIR_INPUT) {
-
- int nNewCodec = FindCodec(pmt);
-
- if (nNewCodec == -1) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
-
- if (nNewCodec != m_nCodecNb) {
- m_nCodecNb = nNewCodec;
- m_nCodecId = ffCodecs[nNewCodec].nFFCodec;
-
- CLSID ClsidSourceFilter = GetCLSID(m_pInput->GetConnected());
- if ((ClsidSourceFilter == __uuidof(COggSourceFilter)) || (ClsidSourceFilter == __uuidof(COggSplitterFilter))) {
- m_bTheoraMTSupport = false;
- } else if ((ClsidSourceFilter == __uuidof(CMpegSourceFilter)) || (ClsidSourceFilter == __uuidof(CMpegSplitterFilter))) {
- if (CComPtr<IBaseFilter> pFilter = GetFilterFromPin(m_pInput->GetConnected()) ) {
- if (CComQIPtr<IMpegSplitterFilter> MpegSplitterFilter = pFilter ) {
- m_bIsEVO = (m_nCodecId == CODEC_ID_VC1 && mpeg_ps == MpegSplitterFilter->GetMPEGType());
- }
- }
- }
-
- m_bReorderBFrame = true;
- m_pAVCodec = avcodec_find_decoder(m_nCodecId);
- CheckPointer (m_pAVCodec, VFW_E_UNSUPPORTED_VIDEO);
-
- m_pAVCtx = avcodec_alloc_context3(m_pAVCodec);
- CheckPointer (m_pAVCtx, E_POINTER);
-
- int nThreadNumber = m_nThreadNumber ? m_nThreadNumber : m_pCpuId->GetProcessorNumber() * 3 / 2;
- if ((nThreadNumber > 1) && IsMultiThreadSupported (m_nCodecId)) {
- FFSetThreadNumber(m_pAVCtx, m_nCodecId, (IsDXVASupported() || (m_nCodecId == CODEC_ID_THEORA && !m_bTheoraMTSupport)) ? 1 : nThreadNumber);
- }
-
- m_pFrame = avcodec_alloc_frame();
- CheckPointer (m_pFrame, E_POINTER);
-
- m_h264RandomAccess.flush(m_pAVCtx->thread_count);
-
- if (pmt->formattype == FORMAT_VideoInfo) {
- VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)pmt->pbFormat;
- m_pAVCtx->width = vih->bmiHeader.biWidth;
- m_pAVCtx->height = abs(vih->bmiHeader.biHeight);
- m_pAVCtx->codec_tag = vih->bmiHeader.biCompression;
- m_pAVCtx->bits_per_coded_sample = vih->bmiHeader.biBitCount;
- } else if (pmt->formattype == FORMAT_VideoInfo2) {
- VIDEOINFOHEADER2* vih2 = (VIDEOINFOHEADER2*)pmt->pbFormat;
- m_pAVCtx->width = vih2->bmiHeader.biWidth;
- m_pAVCtx->height = abs(vih2->bmiHeader.biHeight);
- m_pAVCtx->codec_tag = vih2->bmiHeader.biCompression;
- m_pAVCtx->bits_per_coded_sample = vih2->bmiHeader.biBitCount;
- } else if (pmt->formattype == FORMAT_MPEGVideo) {
- MPEG1VIDEOINFO* mpgv = (MPEG1VIDEOINFO*)pmt->pbFormat;
- m_pAVCtx->width = mpgv->hdr.bmiHeader.biWidth;
- m_pAVCtx->height = abs(mpgv->hdr.bmiHeader.biHeight);
- m_pAVCtx->codec_tag = mpgv->hdr.bmiHeader.biCompression;
- m_pAVCtx->bits_per_coded_sample = mpgv->hdr.bmiHeader.biBitCount;
- } else if (pmt->formattype == FORMAT_MPEG2Video) {
- MPEG2VIDEOINFO* mpg2v = (MPEG2VIDEOINFO*)pmt->pbFormat;
- m_pAVCtx->width = mpg2v->hdr.bmiHeader.biWidth;
- m_pAVCtx->height = abs(mpg2v->hdr.bmiHeader.biHeight);
- m_pAVCtx->codec_tag = mpg2v->hdr.bmiHeader.biCompression;
- m_pAVCtx->bits_per_coded_sample = mpg2v->hdr.bmiHeader.biBitCount;
-
- if (mpg2v->hdr.bmiHeader.biCompression == NULL) {
- m_pAVCtx->codec_tag = pmt->subtype.Data1;
- } else if ( (m_pAVCtx->codec_tag == MAKEFOURCC('a','v','c','1')) || (m_pAVCtx->codec_tag == MAKEFOURCC('A','V','C','1'))) {
- m_pAVCtx->nal_length_size = mpg2v->dwFlags;
- m_bReorderBFrame = (GetFileExtension() == _T(".avi")) ? true : false;
- } else if ( (m_pAVCtx->codec_tag == MAKEFOURCC('m','p','4','v')) || (m_pAVCtx->codec_tag == MAKEFOURCC('M','P','4','V'))) {
- m_bReorderBFrame = false;
- }
- } else {
- return VFW_E_INVALIDMEDIATYPE;
- }
- m_nWidth = m_pAVCtx->width;
- m_nHeight = m_pAVCtx->height;
-
- if (m_pAVCtx->codec_tag == MAKEFOURCC('m','p','g','2')) {
- m_pAVCtx->codec_tag = MAKEFOURCC('M','P','E','G');
- }
-
- if (m_nCodecId == CODEC_ID_RV10 || m_nCodecId == CODEC_ID_RV20 || m_nCodecId == CODEC_ID_RV30 || m_nCodecId == CODEC_ID_RV40) {
- m_bReorderBFrame = false;
- }
-
- m_pAVCtx->codec_id = m_nCodecId;
- m_pAVCtx->workaround_bugs = m_nWorkaroundBug;
- m_pAVCtx->error_concealment = m_nErrorConcealment;
- m_pAVCtx->err_recognition = m_nErrorRecognition;
- m_pAVCtx->idct_algo = m_nIDCTAlgo;
- m_pAVCtx->skip_loop_filter = (AVDiscard)m_nDiscardMode;
- m_pAVCtx->dsp_mask = AV_CPU_FLAG_FORCE | m_pCpuId->GetFeatures();
-
- m_pAVCtx->debug_mv = 0;
-
- m_pAVCtx->opaque = this;
- m_pAVCtx->get_buffer = get_buffer;
-
- if (m_nCodecId == CODEC_ID_H264) {
- m_pAVCtx->flags2 |= CODEC_FLAG2_SHOW_ALL;
- }
-
- AllocExtradata (m_pAVCtx, pmt);
- ConnectTo (m_pAVCtx);
- CalcAvgTimePerFrame();
-
- if (avcodec_open2(m_pAVCtx, m_pAVCodec, NULL)<0) {
- return VFW_E_INVALIDMEDIATYPE;
- }
-
- // if DXVA is supported in theory the file can still be incompatible
- bool bDXVAAvailableButUnused = IsDXVASupported();
- if (IsDXVASupported()) {
- do {
- m_bDXVACompatible = false;
-
- if (!DXVACheckFramesize(PictWidth(), PictHeight(), m_nPCIVendor)) { // check frame size
- break;
- }
-
- if (m_nCodecId == CODEC_ID_H264) {
- if (m_nDXVA_SD && PictWidthRounded() < 1280) { // check "Disable DXVA for SD" option
- break;
- }
- int nCompat = FFH264CheckCompatibility (PictWidthRounded(), PictHeightRounded(), m_pAVCtx, (BYTE*)m_pAVCtx->extradata, m_pAVCtx->extradata_size, m_nPCIVendor, m_nPCIDevice, m_VideoDriverVersion);
- if (nCompat) {
- if ( nCompat == DXVA_HIGH_BIT ||
- m_nDXVACheckCompatibility == 0 || // full check
- m_nDXVACheckCompatibility == 1 && nCompat != DXVA_UNSUPPORTED_LEVEL || // skip level check
- m_nDXVACheckCompatibility == 2 && nCompat != DXVA_TOO_MANY_REF_FRAMES) { // skip reference frame check
- break;
- }
- }
- } else if (m_nCodecId == CODEC_ID_MPEG2VIDEO) {
- // DSP is disable for DXVA decoding (to keep default idct_permutation)
- m_pAVCtx->dsp_mask ^= AV_CPU_FLAG_FORCE;
- if (!MPEG2CheckCompatibility(m_pAVCtx, m_pFrame)) {
- break;
- }
- }
-
- m_bDXVACompatible = true;
- bDXVAAvailableButUnused = false;
- } while (false);
- }
-
- if (bDXVAAvailableButUnused) { // reset the threads count
- m_bUseDXVA = false;
- avcodec_close (m_pAVCtx);
- if ((nThreadNumber > 1) && IsMultiThreadSupported (m_nCodecId)) {
- FFSetThreadNumber(m_pAVCtx, m_nCodecId, nThreadNumber);
- }
- if (avcodec_open2(m_pAVCtx, m_pAVCodec, NULL)<0) {
- return VFW_E_INVALIDMEDIATYPE;
- }
- }
-
- BuildDXVAOutputFormat();
- }
- }
-
- return __super::SetMediaType(direction, pmt);
+ CString ext = _T("");
+
+ BeginEnumFilters(m_pGraph, pEF, pBF) {
+ CComQIPtr<IFileSourceFilter> pFSF = pBF;
+ if (pFSF) {
+ LPOLESTR pFN = NULL;
+ AM_MEDIA_TYPE mt;
+ if (SUCCEEDED(pFSF->GetCurFile(&pFN, &mt)) && pFN && *pFN) {
+ ext = CPath(CStringW(pFN)).GetExtension();
+ ext.MakeLower();
+ CoTaskMemFree(pFN);
+ }
+ break;
+ }
+ }
+ EndEnumFilters
+
+ return ext;
+}
+
+HRESULT CMPCVideoDecFilter::SetMediaType(PIN_DIRECTION direction, const CMediaType* pmt)
+{
+ if (direction == PINDIR_INPUT) {
+
+ int nNewCodec = FindCodec(pmt);
+
+ if (nNewCodec == -1) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+
+ if (nNewCodec != m_nCodecNb) {
+ m_nCodecNb = nNewCodec;
+ m_nCodecId = ffCodecs[nNewCodec].nFFCodec;
+
+ CLSID ClsidSourceFilter = GetCLSID(m_pInput->GetConnected());
+ if ((ClsidSourceFilter == __uuidof(COggSourceFilter)) || (ClsidSourceFilter == __uuidof(COggSplitterFilter))) {
+ m_bTheoraMTSupport = false;
+ } else if ((ClsidSourceFilter == __uuidof(CMpegSourceFilter)) || (ClsidSourceFilter == __uuidof(CMpegSplitterFilter))) {
+ if (CComPtr<IBaseFilter> pFilter = GetFilterFromPin(m_pInput->GetConnected())) {
+ if (CComQIPtr<IMpegSplitterFilter> MpegSplitterFilter = pFilter) {
+ m_bIsEVO = (m_nCodecId == CODEC_ID_VC1 && mpeg_ps == MpegSplitterFilter->GetMPEGType());
+ }
+ }
+ }
+
+ m_bReorderBFrame = true;
+ m_pAVCodec = avcodec_find_decoder(m_nCodecId);
+ CheckPointer(m_pAVCodec, VFW_E_UNSUPPORTED_VIDEO);
+
+ m_pAVCtx = avcodec_alloc_context3(m_pAVCodec);
+ CheckPointer(m_pAVCtx, E_POINTER);
+
+ int nThreadNumber = m_nThreadNumber ? m_nThreadNumber : m_pCpuId->GetProcessorNumber() * 3 / 2;
+ if ((nThreadNumber > 1) && IsMultiThreadSupported(m_nCodecId)) {
+ FFSetThreadNumber(m_pAVCtx, m_nCodecId, (IsDXVASupported() || (m_nCodecId == CODEC_ID_THEORA && !m_bTheoraMTSupport)) ? 1 : nThreadNumber);
+ }
+
+ m_pFrame = avcodec_alloc_frame();
+ CheckPointer(m_pFrame, E_POINTER);
+
+ m_h264RandomAccess.flush(m_pAVCtx->thread_count);
+
+ if (pmt->formattype == FORMAT_VideoInfo) {
+ VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)pmt->pbFormat;
+ m_pAVCtx->width = vih->bmiHeader.biWidth;
+ m_pAVCtx->height = abs(vih->bmiHeader.biHeight);
+ m_pAVCtx->codec_tag = vih->bmiHeader.biCompression;
+ m_pAVCtx->bits_per_coded_sample = vih->bmiHeader.biBitCount;
+ } else if (pmt->formattype == FORMAT_VideoInfo2) {
+ VIDEOINFOHEADER2* vih2 = (VIDEOINFOHEADER2*)pmt->pbFormat;
+ m_pAVCtx->width = vih2->bmiHeader.biWidth;
+ m_pAVCtx->height = abs(vih2->bmiHeader.biHeight);
+ m_pAVCtx->codec_tag = vih2->bmiHeader.biCompression;
+ m_pAVCtx->bits_per_coded_sample = vih2->bmiHeader.biBitCount;
+ } else if (pmt->formattype == FORMAT_MPEGVideo) {
+ MPEG1VIDEOINFO* mpgv = (MPEG1VIDEOINFO*)pmt->pbFormat;
+ m_pAVCtx->width = mpgv->hdr.bmiHeader.biWidth;
+ m_pAVCtx->height = abs(mpgv->hdr.bmiHeader.biHeight);
+ m_pAVCtx->codec_tag = mpgv->hdr.bmiHeader.biCompression;
+ m_pAVCtx->bits_per_coded_sample = mpgv->hdr.bmiHeader.biBitCount;
+ } else if (pmt->formattype == FORMAT_MPEG2Video) {
+ MPEG2VIDEOINFO* mpg2v = (MPEG2VIDEOINFO*)pmt->pbFormat;
+ m_pAVCtx->width = mpg2v->hdr.bmiHeader.biWidth;
+ m_pAVCtx->height = abs(mpg2v->hdr.bmiHeader.biHeight);
+ m_pAVCtx->codec_tag = mpg2v->hdr.bmiHeader.biCompression;
+ m_pAVCtx->bits_per_coded_sample = mpg2v->hdr.bmiHeader.biBitCount;
+
+ if (mpg2v->hdr.bmiHeader.biCompression == NULL) {
+ m_pAVCtx->codec_tag = pmt->subtype.Data1;
+ } else if ((m_pAVCtx->codec_tag == MAKEFOURCC('a', 'v', 'c', '1')) || (m_pAVCtx->codec_tag == MAKEFOURCC('A', 'V', 'C', '1'))) {
+ m_pAVCtx->nal_length_size = mpg2v->dwFlags;
+ m_bReorderBFrame = (GetFileExtension() == _T(".avi")) ? true : false;
+ } else if ((m_pAVCtx->codec_tag == MAKEFOURCC('m', 'p', '4', 'v')) || (m_pAVCtx->codec_tag == MAKEFOURCC('M', 'P', '4', 'V'))) {
+ m_bReorderBFrame = false;
+ }
+ } else {
+ return VFW_E_INVALIDMEDIATYPE;
+ }
+ m_nWidth = m_pAVCtx->width;
+ m_nHeight = m_pAVCtx->height;
+
+ if (m_pAVCtx->codec_tag == MAKEFOURCC('m', 'p', 'g', '2')) {
+ m_pAVCtx->codec_tag = MAKEFOURCC('M', 'P', 'E', 'G');
+ }
+
+ if (m_nCodecId == CODEC_ID_RV10 || m_nCodecId == CODEC_ID_RV20 || m_nCodecId == CODEC_ID_RV30 || m_nCodecId == CODEC_ID_RV40) {
+ m_bReorderBFrame = false;
+ }
+
+ m_pAVCtx->codec_id = m_nCodecId;
+ m_pAVCtx->workaround_bugs = m_nWorkaroundBug;
+ m_pAVCtx->error_concealment = m_nErrorConcealment;
+ m_pAVCtx->err_recognition = m_nErrorRecognition;
+ m_pAVCtx->idct_algo = m_nIDCTAlgo;
+ m_pAVCtx->skip_loop_filter = (AVDiscard)m_nDiscardMode;
+ m_pAVCtx->dsp_mask = AV_CPU_FLAG_FORCE | m_pCpuId->GetFeatures();
+
+ m_pAVCtx->debug_mv = 0;
+
+ m_pAVCtx->opaque = this;
+ m_pAVCtx->get_buffer = get_buffer;
+
+ if (m_nCodecId == CODEC_ID_H264) {
+ m_pAVCtx->flags2 |= CODEC_FLAG2_SHOW_ALL;
+ }
+
+ AllocExtradata(m_pAVCtx, pmt);
+ ConnectTo(m_pAVCtx);
+ CalcAvgTimePerFrame();
+
+ if (avcodec_open2(m_pAVCtx, m_pAVCodec, NULL) < 0) {
+ return VFW_E_INVALIDMEDIATYPE;
+ }
+
+ // if DXVA is supported in theory the file can still be incompatible
+ bool bDXVAAvailableButUnused = IsDXVASupported();
+ if (IsDXVASupported()) {
+ do {
+ m_bDXVACompatible = false;
+
+ if (!DXVACheckFramesize(PictWidth(), PictHeight(), m_nPCIVendor)) { // check frame size
+ break;
+ }
+
+ if (m_nCodecId == CODEC_ID_H264) {
+ if (m_nDXVA_SD && PictWidthRounded() < 1280) { // check "Disable DXVA for SD" option
+ break;
+ }
+ int nCompat = FFH264CheckCompatibility(PictWidthRounded(), PictHeightRounded(), m_pAVCtx, (BYTE*)m_pAVCtx->extradata, m_pAVCtx->extradata_size, m_nPCIVendor, m_nPCIDevice, m_VideoDriverVersion);
+ if (nCompat) {
+ if (nCompat == DXVA_HIGH_BIT ||
+ m_nDXVACheckCompatibility == 0 || // full check
+ m_nDXVACheckCompatibility == 1 && nCompat != DXVA_UNSUPPORTED_LEVEL || // skip level check
+ m_nDXVACheckCompatibility == 2 && nCompat != DXVA_TOO_MANY_REF_FRAMES) { // skip reference frame check
+ break;
+ }
+ }
+ } else if (m_nCodecId == CODEC_ID_MPEG2VIDEO) {
+ // DSP is disable for DXVA decoding (to keep default idct_permutation)
+ m_pAVCtx->dsp_mask ^= AV_CPU_FLAG_FORCE;
+ if (!MPEG2CheckCompatibility(m_pAVCtx, m_pFrame)) {
+ break;
+ }
+ }
+
+ m_bDXVACompatible = true;
+ bDXVAAvailableButUnused = false;
+ } while (false);
+ }
+
+ if (bDXVAAvailableButUnused) { // reset the threads count
+ m_bUseDXVA = false;
+ avcodec_close(m_pAVCtx);
+ if ((nThreadNumber > 1) && IsMultiThreadSupported(m_nCodecId)) {
+ FFSetThreadNumber(m_pAVCtx, m_nCodecId, nThreadNumber);
+ }
+ if (avcodec_open2(m_pAVCtx, m_pAVCodec, NULL) < 0) {
+ return VFW_E_INVALIDMEDIATYPE;
+ }
+ }
+
+ BuildDXVAOutputFormat();
+ }
+ }
+
+ return __super::SetMediaType(direction, pmt);
}
VIDEO_OUTPUT_FORMATS DXVAFormats[] = { // DXVA2
- {&MEDIASUBTYPE_NV12, 1, 12, 'avxd'},
- {&MEDIASUBTYPE_NV12, 1, 12, 'AVXD'},
- {&MEDIASUBTYPE_NV12, 1, 12, 'AVxD'},
- {&MEDIASUBTYPE_NV12, 1, 12, 'AvXD'}
+ {&MEDIASUBTYPE_NV12, 1, 12, 'avxd'},
+ {&MEDIASUBTYPE_NV12, 1, 12, 'AVXD'},
+ {&MEDIASUBTYPE_NV12, 1, 12, 'AVxD'},
+ {&MEDIASUBTYPE_NV12, 1, 12, 'AvXD'}
};
VIDEO_OUTPUT_FORMATS SoftwareFormats1[] = { // Software
- {&MEDIASUBTYPE_NV12, 2, 12, '21VN'},
- {&MEDIASUBTYPE_YV12, 3, 12, '21VY'},
- {&MEDIASUBTYPE_YUY2, 1, 16, '2YUY'},
+ {&MEDIASUBTYPE_NV12, 2, 12, '21VN'},
+ {&MEDIASUBTYPE_YV12, 3, 12, '21VY'},
+ {&MEDIASUBTYPE_YUY2, 1, 16, '2YUY'},
};
VIDEO_OUTPUT_FORMATS SoftwareFormats2[] = { // Software
- {&MEDIASUBTYPE_RGB32, 1, 32, BI_RGB},
+ {&MEDIASUBTYPE_RGB32, 1, 32, BI_RGB},
};
bool CMPCVideoDecFilter::IsDXVASupported()
{
- if (m_nCodecNb != -1) {
- // Does the codec suppport DXVA ?
- if (ffCodecs[m_nCodecNb].DXVAModes != NULL) {
- // Enabled by user ?
- if (m_bUseDXVA) {
- // is the file compatible ?
- if (m_bDXVACompatible) {
- return true;
- }
- }
- }
- }
- return false;
+ if (m_nCodecNb != -1) {
+ // Does the codec suppport DXVA ?
+ if (ffCodecs[m_nCodecNb].DXVAModes != NULL) {
+ // Enabled by user ?
+ if (m_bUseDXVA) {
+ // is the file compatible ?
+ if (m_bDXVACompatible) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
}
void CMPCVideoDecFilter::BuildDXVAOutputFormat()
{
- SAFE_DELETE_ARRAY (m_pVideoOutputFormat);
-
- m_nVideoOutputCount = IsDXVASupported() ? ffCodecs[m_nCodecNb].DXVAModeCount() + _countof (DXVAFormats) : 0;
- if (m_bUseFFmpeg) {
- if (!(m_pAVCtx->width&1 || m_pAVCtx->height&1)) { // Do not use NV12, YV12 and YUY2 if width or height is not even
- m_nVideoOutputCount += _countof(SoftwareFormats1);
- }
- m_nVideoOutputCount += _countof(SoftwareFormats2);
- }
- m_pVideoOutputFormat = DNew VIDEO_OUTPUT_FORMATS[m_nVideoOutputCount];
-
- int nPos = 0;
- if (IsDXVASupported()) {
- // Dynamic DXVA media types for DXVA1
- for (nPos=0; nPos<ffCodecs[m_nCodecNb].DXVAModeCount(); nPos++) {
- m_pVideoOutputFormat[nPos].subtype = ffCodecs[m_nCodecNb].DXVAModes->Decoder[nPos];
- m_pVideoOutputFormat[nPos].biCompression = 'avxd';
- m_pVideoOutputFormat[nPos].biBitCount = 12;
- m_pVideoOutputFormat[nPos].biPlanes = 1;
- }
-
- // Static list for DXVA2
- memcpy (&m_pVideoOutputFormat[nPos], DXVAFormats, sizeof(DXVAFormats));
- nPos += _countof (DXVAFormats);
- }
- // Software rendering
- if (m_bUseFFmpeg) {
- if (!(m_pAVCtx->width&1 || m_pAVCtx->height&1)) { // Do not use NV12, YV12 and YUY2 if width or height is not even
- memcpy (&m_pVideoOutputFormat[nPos], SoftwareFormats1, sizeof(SoftwareFormats1));
- nPos += _countof (SoftwareFormats1);
- }
- memcpy (&m_pVideoOutputFormat[nPos], SoftwareFormats2, sizeof(SoftwareFormats2));
- }
+ SAFE_DELETE_ARRAY(m_pVideoOutputFormat);
+
+ m_nVideoOutputCount = IsDXVASupported() ? ffCodecs[m_nCodecNb].DXVAModeCount() + _countof(DXVAFormats) : 0;
+ if (m_bUseFFmpeg) {
+ if (!(m_pAVCtx->width & 1 || m_pAVCtx->height & 1)) { // Do not use NV12, YV12 and YUY2 if width or height is not even
+ m_nVideoOutputCount += _countof(SoftwareFormats1);
+ }
+ m_nVideoOutputCount += _countof(SoftwareFormats2);
+ }
+ m_pVideoOutputFormat = DNew VIDEO_OUTPUT_FORMATS[m_nVideoOutputCount];
+
+ int nPos = 0;
+ if (IsDXVASupported()) {
+ // Dynamic DXVA media types for DXVA1
+ for (nPos = 0; nPos < ffCodecs[m_nCodecNb].DXVAModeCount(); nPos++) {
+ m_pVideoOutputFormat[nPos].subtype = ffCodecs[m_nCodecNb].DXVAModes->Decoder[nPos];
+ m_pVideoOutputFormat[nPos].biCompression = 'avxd';
+ m_pVideoOutputFormat[nPos].biBitCount = 12;
+ m_pVideoOutputFormat[nPos].biPlanes = 1;
+ }
+
+ // Static list for DXVA2
+ memcpy(&m_pVideoOutputFormat[nPos], DXVAFormats, sizeof(DXVAFormats));
+ nPos += _countof(DXVAFormats);
+ }
+ // Software rendering
+ if (m_bUseFFmpeg) {
+ if (!(m_pAVCtx->width & 1 || m_pAVCtx->height & 1)) { // Do not use NV12, YV12 and YUY2 if width or height is not even
+ memcpy(&m_pVideoOutputFormat[nPos], SoftwareFormats1, sizeof(SoftwareFormats1));
+ nPos += _countof(SoftwareFormats1);
+ }
+ memcpy(&m_pVideoOutputFormat[nPos], SoftwareFormats2, sizeof(SoftwareFormats2));
+ }
}
int CMPCVideoDecFilter::GetPicEntryNumber()
{
- if (IsDXVASupported()) {
- return ffCodecs[m_nCodecNb].DXVAModes->PicEntryNumber;
- } else {
- return 0;
- }
+ if (IsDXVASupported()) {
+ return ffCodecs[m_nCodecNb].DXVAModes->PicEntryNumber;
+ } else {
+ return 0;
+ }
}
-void CMPCVideoDecFilter::GetOutputFormats (int& nNumber, VIDEO_OUTPUT_FORMATS** ppFormats)
+void CMPCVideoDecFilter::GetOutputFormats(int& nNumber, VIDEO_OUTPUT_FORMATS** ppFormats)
{
- nNumber = m_nVideoOutputCount;
- *ppFormats = m_pVideoOutputFormat;
+ nNumber = m_nVideoOutputCount;
+ *ppFormats = m_pVideoOutputFormat;
}
void CMPCVideoDecFilter::AllocExtradata(AVCodecContext* pAVCtx, const CMediaType* pmt)
{
- // code from LAV ...
- // Process Extradata
- BYTE *extra = NULL;
- unsigned int extralen = 0;
- getExtraData((const BYTE *)pmt->Format(), pmt->FormatType(), pmt->FormatLength(), NULL, &extralen);
-
- BOOL bH264avc = FALSE;
- if (extralen > 0) {
- TRACE(_T("CMPCVideoDecFilter::AllocExtradata() : processing extradata of %d bytes"), extralen);
- // Reconstruct AVC1 extradata format
- if (pmt->formattype == FORMAT_MPEG2Video && (m_pAVCtx->codec_tag == MAKEFOURCC('a','v','c','1') || m_pAVCtx->codec_tag == MAKEFOURCC('A','V','C','1') || m_pAVCtx->codec_tag == MAKEFOURCC('C','C','V','1'))) {
- MPEG2VIDEOINFO *mp2vi = (MPEG2VIDEOINFO *)pmt->Format();
- extralen += 7;
- extra = (uint8_t *)av_mallocz(extralen + FF_INPUT_BUFFER_PADDING_SIZE);
- extra[0] = 1;
- extra[1] = (BYTE)mp2vi->dwProfile;
- extra[2] = 0;
- extra[3] = (BYTE)mp2vi->dwLevel;
- extra[4] = (BYTE)(mp2vi->dwFlags ? mp2vi->dwFlags : 2) - 1;
-
- // Actually copy the metadata into our new buffer
- unsigned int actual_len;
- getExtraData((const BYTE *)pmt->Format(), pmt->FormatType(), pmt->FormatLength(), extra+6, &actual_len);
-
- // Count the number of SPS/PPS in them and set the length
- // We'll put them all into one block and add a second block with 0 elements afterwards
- // The parsing logic does not care what type they are, it just expects 2 blocks.
- BYTE *p = extra+6, *end = extra+6+actual_len;
- BOOL bSPS = FALSE, bPPS = FALSE;
- int count = 0;
- while (p+1 < end) {
- unsigned len = (((unsigned)p[0] << 8) | p[1]) + 2;
- if (p + len > end) {
- break;
- }
- if ((p[2] & 0x1F) == 7)
- bSPS = TRUE;
- if ((p[2] & 0x1F) == 8)
- bPPS = TRUE;
- count++;
- p += len;
- }
- extra[5] = count;
- extra[extralen-1] = 0;
-
- bH264avc = TRUE;
- if (!bSPS) {
- TRACE(_T("CMPCVideoDecFilter::AllocExtradata() : AVC1 extradata doesn't contain a SPS, setting thread_count = 1"));
- m_pAVCtx->thread_count = 1;
- }
- } else {
- // Just copy extradata for other formats
- extra = (uint8_t *)av_mallocz(extralen + FF_INPUT_BUFFER_PADDING_SIZE);
- getExtraData((const BYTE *)pmt->Format(), pmt->FormatType(), pmt->FormatLength(), extra, NULL);
- }
- // Hack to discard invalid MP4 metadata with AnnexB style video
- if (m_nCodecId == CODEC_ID_H264 && !bH264avc && extra[0] == 1) {
- av_freep(&extra);
- extralen = 0;
- }
- m_pAVCtx->extradata = extra;
- m_pAVCtx->extradata_size = (int)extralen;
- }
+ // code from LAV ...
+ // Process Extradata
+ BYTE* extra = NULL;
+ unsigned int extralen = 0;
+ getExtraData((const BYTE*)pmt->Format(), pmt->FormatType(), pmt->FormatLength(), NULL, &extralen);
+
+ BOOL bH264avc = FALSE;
+ if (extralen > 0) {
+ TRACE(_T("CMPCVideoDecFilter::AllocExtradata() : processing extradata of %d bytes"), extralen);
+ // Reconstruct AVC1 extradata format
+ if (pmt->formattype == FORMAT_MPEG2Video && (m_pAVCtx->codec_tag == MAKEFOURCC('a', 'v', 'c', '1') || m_pAVCtx->codec_tag == MAKEFOURCC('A', 'V', 'C', '1') || m_pAVCtx->codec_tag == MAKEFOURCC('C', 'C', 'V', '1'))) {
+ MPEG2VIDEOINFO* mp2vi = (MPEG2VIDEOINFO*)pmt->Format();
+ extralen += 7;
+ extra = (uint8_t*)av_mallocz(extralen + FF_INPUT_BUFFER_PADDING_SIZE);
+ extra[0] = 1;
+ extra[1] = (BYTE)mp2vi->dwProfile;
+ extra[2] = 0;
+ extra[3] = (BYTE)mp2vi->dwLevel;
+ extra[4] = (BYTE)(mp2vi->dwFlags ? mp2vi->dwFlags : 2) - 1;
+
+ // Actually copy the metadata into our new buffer
+ unsigned int actual_len;
+ getExtraData((const BYTE*)pmt->Format(), pmt->FormatType(), pmt->FormatLength(), extra + 6, &actual_len);
+
+ // Count the number of SPS/PPS in them and set the length
+ // We'll put them all into one block and add a second block with 0 elements afterwards
+ // The parsing logic does not care what type they are, it just expects 2 blocks.
+ BYTE* p = extra + 6, *end = extra + 6 + actual_len;
+ BOOL bSPS = FALSE, bPPS = FALSE;
+ int count = 0;
+ while (p + 1 < end) {
+ unsigned len = (((unsigned)p[0] << 8) | p[1]) + 2;
+ if (p + len > end) {
+ break;
+ }
+ if ((p[2] & 0x1F) == 7) {
+ bSPS = TRUE;
+ }
+ if ((p[2] & 0x1F) == 8) {
+ bPPS = TRUE;
+ }
+ count++;
+ p += len;
+ }
+ extra[5] = count;
+ extra[extralen - 1] = 0;
+
+ bH264avc = TRUE;
+ if (!bSPS) {
+ TRACE(_T("CMPCVideoDecFilter::AllocExtradata() : AVC1 extradata doesn't contain a SPS, setting thread_count = 1"));
+ m_pAVCtx->thread_count = 1;
+ }
+ } else {
+ // Just copy extradata for other formats
+ extra = (uint8_t*)av_mallocz(extralen + FF_INPUT_BUFFER_PADDING_SIZE);
+ getExtraData((const BYTE*)pmt->Format(), pmt->FormatType(), pmt->FormatLength(), extra, NULL);
+ }
+ // Hack to discard invalid MP4 metadata with AnnexB style video
+ if (m_nCodecId == CODEC_ID_H264 && !bH264avc && extra[0] == 1) {
+ av_freep(&extra);
+ extralen = 0;
+ }
+ m_pAVCtx->extradata = extra;
+ m_pAVCtx->extradata_size = (int)extralen;
+ }
}
HRESULT CMPCVideoDecFilter::CompleteConnect(PIN_DIRECTION direction, IPin* pReceivePin)
{
- LOG(_T("CMPCVideoDecFilter::CompleteConnect"));
+ LOG(_T("CMPCVideoDecFilter::CompleteConnect"));
- if (direction==PINDIR_INPUT && m_pOutput->IsConnected()) {
- ReconnectOutput (m_nWidth, m_nHeight);
- } else if (direction==PINDIR_OUTPUT) {
- if (IsDXVASupported()) {
- if (m_nDXVAMode == MODE_DXVA1) {
- m_pDXVADecoder->ConfigureDXVA1();
- } else if (SUCCEEDED (ConfigureDXVA2 (pReceivePin)) && SUCCEEDED (SetEVRForDXVA2 (pReceivePin)) ) {
- m_nDXVAMode = MODE_DXVA2;
- }
- }
- if (m_nDXVAMode == MODE_SOFTWARE && (!m_bUseFFmpeg || !FFSoftwareCheckCompatibility(m_pAVCtx))) {
- return VFW_E_INVALIDMEDIATYPE;
- }
+ if (direction == PINDIR_INPUT && m_pOutput->IsConnected()) {
+ ReconnectOutput(m_nWidth, m_nHeight);
+ } else if (direction == PINDIR_OUTPUT) {
+ if (IsDXVASupported()) {
+ if (m_nDXVAMode == MODE_DXVA1) {
+ m_pDXVADecoder->ConfigureDXVA1();
+ } else if (SUCCEEDED(ConfigureDXVA2(pReceivePin)) && SUCCEEDED(SetEVRForDXVA2(pReceivePin))) {
+ m_nDXVAMode = MODE_DXVA2;
+ }
+ }
+ if (m_nDXVAMode == MODE_SOFTWARE && (!m_bUseFFmpeg || !FFSoftwareCheckCompatibility(m_pAVCtx))) {
+ return VFW_E_INVALIDMEDIATYPE;
+ }
- CLSID ClsidSourceFilter = GetCLSID(m_pInput->GetConnected());
- if ((ClsidSourceFilter == __uuidof(CMpegSourceFilter)) || (ClsidSourceFilter == __uuidof(CMpegSplitterFilter))) {
- m_bReorderBFrame = false;
- }
- }
+ CLSID ClsidSourceFilter = GetCLSID(m_pInput->GetConnected());
+ if ((ClsidSourceFilter == __uuidof(CMpegSourceFilter)) || (ClsidSourceFilter == __uuidof(CMpegSplitterFilter))) {
+ m_bReorderBFrame = false;
+ }
+ }
- return __super::CompleteConnect (direction, pReceivePin);
+ return __super::CompleteConnect(direction, pReceivePin);
}
HRESULT CMPCVideoDecFilter::DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties)
{
- if (UseDXVA2()) {
- HRESULT hr;
- ALLOCATOR_PROPERTIES Actual;
+ if (UseDXVA2()) {
+ HRESULT hr;
+ ALLOCATOR_PROPERTIES Actual;
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
- pProperties->cBuffers = GetPicEntryNumber();
+ pProperties->cBuffers = GetPicEntryNumber();
- if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- return pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
- ? E_FAIL
- : NOERROR;
- } else {
- return __super::DecideBufferSize (pAllocator, pProperties);
- }
+ return pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
+ ? E_FAIL
+ : NOERROR;
+ } else {
+ return __super::DecideBufferSize(pAllocator, pProperties);
+ }
}
HRESULT CMPCVideoDecFilter::BeginFlush()
{
- return __super::BeginFlush();
+ return __super::BeginFlush();
}
HRESULT CMPCVideoDecFilter::EndFlush()
{
- CAutoLock cAutoLock(&m_csReceive);
- return __super::EndFlush();
+ CAutoLock cAutoLock(&m_csReceive);
+ return __super::EndFlush();
}
HRESULT CMPCVideoDecFilter::NewSegment(REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double dRate)
{
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- if (m_pAVCtx) {
- avcodec_flush_buffers (m_pAVCtx);
- }
+ if (m_pAVCtx) {
+ avcodec_flush_buffers(m_pAVCtx);
+ }
- if (m_pDXVADecoder) {
- m_pDXVADecoder->Flush();
- }
+ if (m_pDXVADecoder) {
+ m_pDXVADecoder->Flush();
+ }
- m_nPosB = 1;
- memset (&m_BFrames, 0, sizeof(m_BFrames));
- m_rtLastStart = 0;
- m_nCountEstimated = 0;
- m_dRate = dRate;
+ m_nPosB = 1;
+ memset(&m_BFrames, 0, sizeof(m_BFrames));
+ m_rtLastStart = 0;
+ m_nCountEstimated = 0;
+ m_dRate = dRate;
- ResetBuffer();
+ ResetBuffer();
- m_h264RandomAccess.flush (m_pAVCtx->thread_count);
+ m_h264RandomAccess.flush(m_pAVCtx->thread_count);
- m_bWaitingForKeyFrame = TRUE;
+ m_bWaitingForKeyFrame = TRUE;
- m_rtPrevStop = 0;
+ m_rtPrevStop = 0;
- rm.video_after_seek = true;
- m_rtStart = rtStart;
+ rm.video_after_seek = true;
+ m_rtStart = rtStart;
- return __super::NewSegment (rtStart, rtStop, dRate);
+ return __super::NewSegment(rtStart, rtStop, dRate);
}
HRESULT CMPCVideoDecFilter::EndOfStream()
{
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
#if HAS_FFMPEG_VIDEO_DECODERS
- if (m_nDXVAMode == MODE_SOFTWARE) {
- REFERENCE_TIME rtStart = 0, rtStop = 0;
- SoftwareDecode(NULL, NULL, 0, rtStart, rtStop);
- } else
+ if (m_nDXVAMode == MODE_SOFTWARE) {
+ REFERENCE_TIME rtStart = 0, rtStop = 0;
+ SoftwareDecode(NULL, NULL, 0, rtStart, rtStop);
+ } else
#endif
- if (m_nDXVAMode == MODE_DXVA2) { // TODO - need to check DXVA1 on WinXP
- m_pDXVADecoder->EndOfStream();
- }
+ if (m_nDXVAMode == MODE_DXVA2) { // TODO - need to check DXVA1 on WinXP
+ m_pDXVADecoder->EndOfStream();
+ }
- return __super::EndOfStream();
+ return __super::EndOfStream();
}
HRESULT CMPCVideoDecFilter::BreakConnect(PIN_DIRECTION dir)
{
- if (dir == PINDIR_INPUT) {
- Cleanup();
- }
+ if (dir == PINDIR_INPUT) {
+ Cleanup();
+ }
- return __super::BreakConnect (dir);
+ return __super::BreakConnect(dir);
}
void CMPCVideoDecFilter::SetTypeSpecificFlags(IMediaSample* pMS)
{
- if (CComQIPtr<IMediaSample2> pMS2 = pMS) {
- AM_SAMPLE2_PROPERTIES props;
- if (SUCCEEDED(pMS2->GetProperties(sizeof(props), (BYTE*)&props))) {
- props.dwTypeSpecificFlags &= ~0x7f;
-
- m_nFrameType = PICT_BOTTOM_FIELD;
- if (!m_pFrame->interlaced_frame) {
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_WEAVE;
- m_nFrameType = PICT_FRAME;
- } else {
- if (m_pFrame->top_field_first) {
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_FIELD1FIRST;
- m_nFrameType = PICT_TOP_FIELD;
- }
- }
-
- switch (m_pFrame->pict_type) {
- case AV_PICTURE_TYPE_I :
- case AV_PICTURE_TYPE_SI :
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_I_SAMPLE;
- break;
- case AV_PICTURE_TYPE_P :
- case AV_PICTURE_TYPE_SP :
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_P_SAMPLE;
- break;
- default :
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_B_SAMPLE;
- break;
- }
-
- pMS2->SetProperties(sizeof(props), (BYTE*)&props);
- }
- }
+ if (CComQIPtr<IMediaSample2> pMS2 = pMS) {
+ AM_SAMPLE2_PROPERTIES props;
+ if (SUCCEEDED(pMS2->GetProperties(sizeof(props), (BYTE*)&props))) {
+ props.dwTypeSpecificFlags &= ~0x7f;
+
+ m_nFrameType = PICT_BOTTOM_FIELD;
+ if (!m_pFrame->interlaced_frame) {
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_WEAVE;
+ m_nFrameType = PICT_FRAME;
+ } else {
+ if (m_pFrame->top_field_first) {
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_FIELD1FIRST;
+ m_nFrameType = PICT_TOP_FIELD;
+ }
+ }
+
+ switch (m_pFrame->pict_type) {
+ case AV_PICTURE_TYPE_I :
+ case AV_PICTURE_TYPE_SI :
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_I_SAMPLE;
+ break;
+ case AV_PICTURE_TYPE_P :
+ case AV_PICTURE_TYPE_SP :
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_P_SAMPLE;
+ break;
+ default :
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_B_SAMPLE;
+ break;
+ }
+
+ pMS2->SetProperties(sizeof(props), (BYTE*)&props);
+ }
+ }
}
#if HAS_FFMPEG_VIDEO_DECODERS
unsigned __int64 CMPCVideoDecFilter::GetCspFromMediaType(GUID& subtype)
{
- if (subtype == MEDIASUBTYPE_I420 || subtype == MEDIASUBTYPE_IYUV || subtype == MEDIASUBTYPE_YV12) {
- return (FF_CSP_420P|FF_CSP_FLAGS_YUV_ADJ);
- } else if (subtype == MEDIASUBTYPE_NV12) {
- return FF_CSP_NV12;
- } else if (subtype == MEDIASUBTYPE_RGB32) {
- return FF_CSP_RGB32;
- } else if (subtype == MEDIASUBTYPE_YUY2) {
- return FF_CSP_YUY2;
- }
+ if (subtype == MEDIASUBTYPE_I420 || subtype == MEDIASUBTYPE_IYUV || subtype == MEDIASUBTYPE_YV12) {
+ return (FF_CSP_420P | FF_CSP_FLAGS_YUV_ADJ);
+ } else if (subtype == MEDIASUBTYPE_NV12) {
+ return FF_CSP_NV12;
+ } else if (subtype == MEDIASUBTYPE_RGB32) {
+ return FF_CSP_RGB32;
+ } else if (subtype == MEDIASUBTYPE_YUY2) {
+ return FF_CSP_YUY2;
+ }
- ASSERT (FALSE);
- return FF_CSP_NULL;
+ ASSERT(FALSE);
+ return FF_CSP_NULL;
}
void CMPCVideoDecFilter::InitSwscale()
{
- if (m_pSwsContext == NULL) {
- BITMAPINFOHEADER bihOut;
- ExtractBIH(&m_pOutput->CurrentMediaType(), &bihOut);
-
- int sws_Flags = SWS_BILINEAR | SWS_FULL_CHR_H_INT | SWS_FULL_CHR_H_INP | SWS_ACCURATE_RND;
-
- m_nOutCsp = GetCspFromMediaType(m_pOutput->CurrentMediaType().subtype);
-
- PixelFormat pix_fmt = csp_ffdshow2lavc(csp_lavc2ffdshow(m_pAVCtx->pix_fmt));
- if (pix_fmt == PIX_FMT_NB) {
- pix_fmt = m_pAVCtx->pix_fmt;
- }
-
- m_pSwsContext = sws_getCachedContext(
- NULL,
- m_pAVCtx->width,
- m_pAVCtx->height,
- pix_fmt,
- m_pAVCtx->width,
- m_pAVCtx->height,
- csp_ffdshow2lavc(m_nOutCsp),
- sws_Flags | SWS_PRINT_INFO,
- NULL,
- NULL,
- NULL);
-
- m_nSwOutBpp = bihOut.biBitCount;
- m_pOutSize.cx = bihOut.biWidth;
- m_pOutSize.cy = abs(bihOut.biHeight);
-
- int *inv_tbl = NULL, *tbl = NULL;
- int srcRange, dstRange, brightness, contrast, saturation;
- int ret = sws_getColorspaceDetails(m_pSwsContext, &inv_tbl, &srcRange, &tbl, &dstRange, &brightness, &contrast, &saturation);
- if (ret >= 0) {
- sws_setColorspaceDetails(m_pSwsContext, sws_getCoefficients((PictWidthRounded() > 768) ? SWS_CS_ITU709 : SWS_CS_ITU601), srcRange, tbl, dstRange, brightness, contrast, saturation);
- }
- }
-}
-
-#define RM_SKIP_BITS(n) (buffer<<=n)
-#define RM_SHOW_BITS(n) ((buffer)>>(32-(n)))
-static int rm_fix_timestamp(uint8_t *buf, int64_t timestamp, enum CodecID nCodecId, int64_t *kf_base, int *kf_pts)
-{
- uint8_t *s = buf + 1 + (*buf+1)*8;
- uint32_t buffer = (s[0]<<24) + (s[1]<<16) + (s[2]<<8) + s[3];
- uint32_t kf = timestamp;
- int pict_type;
- uint32_t orig_kf;
-
- if (nCodecId == CODEC_ID_RV30) {
- RM_SKIP_BITS(3);
- pict_type = RM_SHOW_BITS(2);
- RM_SKIP_BITS(2 + 7);
- } else {
- RM_SKIP_BITS(1);
- pict_type = RM_SHOW_BITS(2);
- RM_SKIP_BITS(2 + 7 + 3);
- }
- orig_kf = kf = RM_SHOW_BITS(13); // kf= 2*RM_SHOW_BITS(12);
- if (pict_type <= 1) {
- // I frame, sync timestamps:
- *kf_base = (int64_t)timestamp-kf;
- kf = timestamp;
- } else {
- // P/B frame, merge timestamps:
- int64_t tmp = (int64_t)timestamp - *kf_base;
- kf |= tmp&(~0x1fff); // combine with packet timestamp
- if (kf<tmp-4096) {
- kf += 8192;
- } else if (kf>tmp+4096) { // workaround wrap-around problems
- kf -= 8192;
- }
- kf += *kf_base;
- }
- if (pict_type != 3) { // P || I frame -> swap timestamps
- uint32_t tmp=kf;
- kf = *kf_pts;
- *kf_pts = tmp;
- }
-
- return kf;
-}
-
-static int64_t process_rv_timestamp(RMDemuxContext *rm, enum CodecID nCodecId, uint8_t *buf, int64_t timestamp)
-{
- if (rm->video_after_seek) {
- rm->kf_base = 0;
- rm->kf_pts = timestamp;
- rm->video_after_seek = false;
- }
- return rm_fix_timestamp(buf, timestamp, nCodecId, &rm->kf_base, &rm->kf_pts);
-}
-
-void copyPlane(BYTE *dstp, stride_t dst_pitch, const BYTE *srcp, stride_t src_pitch, int row_size, int height, bool flip = false)
-{
- if (!flip) {
- for (int y=height; y>0; --y) {
- memcpy(dstp, srcp, row_size);
- dstp += dst_pitch;
- srcp += src_pitch;
- }
- } else {
- dstp += dst_pitch * (height - 1);
- for (int y=height; y>0; --y) {
- memcpy(dstp, srcp, row_size);
- dstp -= dst_pitch;
- srcp += src_pitch;
- }
- }
+ if (m_pSwsContext == NULL) {
+ BITMAPINFOHEADER bihOut;
+ ExtractBIH(&m_pOutput->CurrentMediaType(), &bihOut);
+
+ int sws_Flags = SWS_BILINEAR | SWS_FULL_CHR_H_INT | SWS_FULL_CHR_H_INP | SWS_ACCURATE_RND;
+
+ m_nOutCsp = GetCspFromMediaType(m_pOutput->CurrentMediaType().subtype);
+
+ PixelFormat pix_fmt = csp_ffdshow2lavc(csp_lavc2ffdshow(m_pAVCtx->pix_fmt));
+ if (pix_fmt == PIX_FMT_NB) {
+ pix_fmt = m_pAVCtx->pix_fmt;
+ }
+
+ m_pSwsContext = sws_getCachedContext(
+ NULL,
+ m_pAVCtx->width,
+ m_pAVCtx->height,
+ pix_fmt,
+ m_pAVCtx->width,
+ m_pAVCtx->height,
+ csp_ffdshow2lavc(m_nOutCsp),
+ sws_Flags | SWS_PRINT_INFO,
+ NULL,
+ NULL,
+ NULL);
+
+ m_nSwOutBpp = bihOut.biBitCount;
+ m_pOutSize.cx = bihOut.biWidth;
+ m_pOutSize.cy = abs(bihOut.biHeight);
+
+ int* inv_tbl = NULL, *tbl = NULL;
+ int srcRange, dstRange, brightness, contrast, saturation;
+ int ret = sws_getColorspaceDetails(m_pSwsContext, &inv_tbl, &srcRange, &tbl, &dstRange, &brightness, &contrast, &saturation);
+ if (ret >= 0) {
+ sws_setColorspaceDetails(m_pSwsContext, sws_getCoefficients((PictWidthRounded() > 768) ? SWS_CS_ITU709 : SWS_CS_ITU601), srcRange, tbl, dstRange, brightness, contrast, saturation);
+ }
+ }
+}
+
+#define RM_SKIP_BITS(n) (buffer<<=n)
+#define RM_SHOW_BITS(n) ((buffer)>>(32-(n)))
+static int rm_fix_timestamp(uint8_t* buf, int64_t timestamp, enum CodecID nCodecId, int64_t* kf_base, int* kf_pts)
+{
+ uint8_t* s = buf + 1 + (*buf + 1) * 8;
+ uint32_t buffer = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3];
+ uint32_t kf = timestamp;
+ int pict_type;
+ uint32_t orig_kf;
+
+ if (nCodecId == CODEC_ID_RV30) {
+ RM_SKIP_BITS(3);
+ pict_type = RM_SHOW_BITS(2);
+ RM_SKIP_BITS(2 + 7);
+ } else {
+ RM_SKIP_BITS(1);
+ pict_type = RM_SHOW_BITS(2);
+ RM_SKIP_BITS(2 + 7 + 3);
+ }
+ orig_kf = kf = RM_SHOW_BITS(13); // kf= 2*RM_SHOW_BITS(12);
+ if (pict_type <= 1) {
+ // I frame, sync timestamps:
+ *kf_base = (int64_t)timestamp - kf;
+ kf = timestamp;
+ } else {
+ // P/B frame, merge timestamps:
+ int64_t tmp = (int64_t)timestamp - *kf_base;
+ kf |= tmp & (~0x1fff); // combine with packet timestamp
+ if (kf < tmp - 4096) {
+ kf += 8192;
+ } else if (kf > tmp + 4096) { // workaround wrap-around problems
+ kf -= 8192;
+ }
+ kf += *kf_base;
+ }
+ if (pict_type != 3) { // P || I frame -> swap timestamps
+ uint32_t tmp = kf;
+ kf = *kf_pts;
+ *kf_pts = tmp;
+ }
+
+ return kf;
+}
+
+static int64_t process_rv_timestamp(RMDemuxContext* rm, enum CodecID nCodecId, uint8_t* buf, int64_t timestamp)
+{
+ if (rm->video_after_seek) {
+ rm->kf_base = 0;
+ rm->kf_pts = timestamp;
+ rm->video_after_seek = false;
+ }
+ return rm_fix_timestamp(buf, timestamp, nCodecId, &rm->kf_base, &rm->kf_pts);
+}
+
+void copyPlane(BYTE* dstp, stride_t dst_pitch, const BYTE* srcp, stride_t src_pitch, int row_size, int height, bool flip = false)
+{
+ if (!flip) {
+ for (int y = height; y > 0; --y) {
+ memcpy(dstp, srcp, row_size);
+ dstp += dst_pitch;
+ srcp += src_pitch;
+ }
+ } else {
+ dstp += dst_pitch * (height - 1);
+ for (int y = height; y > 0; --y) {
+ memcpy(dstp, srcp, row_size);
+ dstp -= dst_pitch;
+ srcp += src_pitch;
+ }
+ }
}
#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))
HRESULT CMPCVideoDecFilter::SoftwareDecode(IMediaSample* pIn, BYTE* pDataIn, int nSize, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop)
{
- HRESULT hr = S_OK;
- int got_picture;
- int used_bytes;
- BOOL bFlush = (pDataIn == NULL);
-
- AVPacket avpkt;
- av_init_packet(&avpkt);
-
- if (!bFlush && m_nCodecId == CODEC_ID_H264) {
- if (!m_h264RandomAccess.searchRecoveryPoint(m_pAVCtx, pDataIn, nSize)) {
- return S_OK;
- }
- }
-
- while (nSize > 0 || bFlush) {
- if (!bFlush) {
- if (nSize+FF_INPUT_BUFFER_PADDING_SIZE > m_nFFBufferSize) {
- m_nFFBufferSize = nSize+FF_INPUT_BUFFER_PADDING_SIZE;
- m_pFFBuffer = (BYTE*)av_realloc(m_pFFBuffer, m_nFFBufferSize);
- if (!m_pFFBuffer) {
- m_nFFBufferSize = 0;
- return E_FAIL;
- }
- }
-
- // Required number of additionally allocated bytes at the end of the input bitstream for decoding.
- // This is mainly needed because some optimized bitstream readers read
- // 32 or 64 bit at once and could read over the end.
- // Note: If the first 23 bits of the additional bytes are not 0, then damaged
- // MPEG bitstreams could cause overread and segfault.
- memcpy(m_pFFBuffer, pDataIn, nSize);
- memset(m_pFFBuffer+nSize,0,FF_INPUT_BUFFER_PADDING_SIZE);
-
- avpkt.data = m_pFFBuffer;
- avpkt.size = nSize;
- avpkt.pts = rtStart;
- avpkt.dts = rtStop;
- avpkt.flags = AV_PKT_FLAG_KEY;
- } else {
- avpkt.data = NULL;
- avpkt.size = 0;
- }
- used_bytes = avcodec_decode_video2 (m_pAVCtx, m_pFrame, &got_picture, &avpkt);
-
- if (used_bytes < 0) {
- return S_OK;
- }
-
- // Comment from LAV Video code:
- // When Frame Threading, we won't know how much data has been consumed, so it by default eats everything.
- // In addition, if no data got consumed, and no picture was extracted, the frame probably isn't all that useufl.
- // The MJPEB decoder is somewhat buggy and doesn't let us know how much data was consumed really...
- if ((m_pAVCtx->active_thread_type & FF_THREAD_FRAME || (!got_picture && used_bytes == 0)) || m_nCodecId == CODEC_ID_MJPEGB || bFlush) {
- nSize = 0;
- } else {
- nSize -= used_bytes;
- pDataIn += used_bytes;
- }
-
- if (m_nCodecId == CODEC_ID_H264) {
- m_h264RandomAccess.judgeFrameUsability(m_pFrame, &got_picture);
- } else if (m_nCodecId == CODEC_ID_VC1 || m_nCodecId == CODEC_ID_RV30 || m_nCodecId == CODEC_ID_RV40) {
- if (m_bWaitingForKeyFrame && got_picture) {
- if (m_pFrame->key_frame) {
- m_bWaitingForKeyFrame = FALSE;
- } else {
- got_picture = 0;
- }
- }
- }
-
- if (!got_picture || !m_pFrame->data[0]) {
- bFlush = FALSE;
- continue;
- }
-
- if ((pIn && pIn->IsPreroll() == S_OK) || rtStart < 0) {
- return S_OK;
- }
-
- if (!m_bFrame_repeat_pict && m_pFrame->repeat_pict) {
- m_bFrame_repeat_pict = true;
- }
-
- CComPtr<IMediaSample> pOut;
- BYTE* pDataOut = NULL;
-
- UpdateAspectRatio();
- if (FAILED(hr = GetDeliveryBuffer(m_pAVCtx->width, m_pAVCtx->height, &pOut)) || FAILED(hr = pOut->GetPointer(&pDataOut))) {
- return hr;
- }
-
- if (m_nCodecId == CODEC_ID_THEORA || (m_nCodecId == CODEC_ID_VP8 && m_rtAvrTimePerFrame == 10000)) { // need more tests
- rtStart = m_pFrame->pkt_pts;
- rtStop = m_pFrame->pkt_dts;
- } else if ((m_nCodecId == CODEC_ID_RV10 || m_nCodecId == CODEC_ID_RV20) && m_pFrame->pict_type == AV_PICTURE_TYPE_B) {
- rtStart = m_rtPrevStop;
- rtStop = rtStart + m_rtAvrTimePerFrame;
- } else if ((m_nCodecId == CODEC_ID_RV30 || m_nCodecId == CODEC_ID_RV40) && avpkt.data) {
- rtStart = (rtStart == _I64_MIN) ? m_rtPrevStop : (10000i64*process_rv_timestamp(&rm, m_nCodecId, avpkt.data, (rtStart + m_rtStart)/10000) - m_rtStart);
- rtStop = rtStart + m_rtAvrTimePerFrame;
- } else if (!(m_nCodecId == CODEC_ID_VC1 && m_bFrame_repeat_pict && m_rtAvrTimePerFrame == 333666)) {
- rtStart = m_pFrame->reordered_opaque;
- rtStop = m_pFrame->reordered_opaque2;
- }
-
- m_rtPrevStop = rtStop;
-
- ReorderBFrames(rtStart, rtStop);
-
- pOut->SetTime(&rtStart, &rtStop);
- pOut->SetMediaTime(NULL, NULL);
-
- if (m_pSwsContext == NULL) {
- InitSwscale();
- }
- if (m_pSwsContext != NULL) {
-
- int outStride = m_pOutSize.cx;
- BYTE *outData = pDataOut;
-
- // From LAVVideo ...
- // Check if we have proper pixel alignment and the dst memory is actually aligned
- if (FFALIGN(outStride, 16) != outStride || ((uintptr_t)pDataOut % 16u)) {
- outStride = FFALIGN(outStride, 16);
- int requiredSize = (outStride * m_pAVCtx->height * m_nSwOutBpp) << 3;
- if (requiredSize > m_nAlignedFFBufferSize) {
- av_freep(&m_pAlignedFFBuffer);
- m_nAlignedFFBufferSize = requiredSize;
- m_pAlignedFFBuffer = (BYTE*)av_malloc(m_nAlignedFFBufferSize+FF_INPUT_BUFFER_PADDING_SIZE);
- }
- outData = m_pAlignedFFBuffer;
- }
-
- uint8_t* dst[4] = {NULL, NULL, NULL, NULL};
- stride_t dstStride[4] = {0, 0, 0, 0};
- const TcspInfo *outcspInfo=csp_getInfo(m_nOutCsp);
-
- if (m_nOutCsp == FF_CSP_YUY2 || m_nOutCsp == FF_CSP_RGB32) {
- dst[0] = outData;
- dstStride[0] = (m_nSwOutBpp>>3) * (outStride);
- } else {
- for (unsigned int i=0; i<outcspInfo->numPlanes; i++) {
- dstStride[i] = outStride >> outcspInfo->shiftX[i];
- dst[i] = !i ? outData : dst[i-1] + dstStride[i-1] * (m_pOutSize.cy >> outcspInfo->shiftY[i-1]) ;
- }
-
- if (m_nOutCsp & FF_CSP_420P) {
- std::swap(dst[1], dst[2]);
- }
- }
-
- sws_scale(m_pSwsContext, m_pFrame->data, m_pFrame->linesize, 0, m_pAVCtx->height, dst, dstStride);
-
- if (outData != pDataOut) {
- if (m_nOutCsp & FF_CSP_420P) {
- std::swap(dst[1], dst[2]);
- }
- int rowsize = 0, height = 0;
- for (unsigned int i=0; i<outcspInfo->numPlanes; i++) {
- rowsize = (m_pOutSize.cx*outcspInfo->Bpp) >> outcspInfo->shiftX[i];
- height = m_pAVCtx->height >> outcspInfo->shiftY[i];
- copyPlane(pDataOut, rowsize, dst[i], (outStride*outcspInfo->Bpp) >> outcspInfo->shiftX[i], rowsize, height, (m_nOutCsp == FF_CSP_RGB32));
- pDataOut += rowsize * height;
- }
- }
- }
+ HRESULT hr = S_OK;
+ int got_picture;
+ int used_bytes;
+ BOOL bFlush = (pDataIn == NULL);
+
+ AVPacket avpkt;
+ av_init_packet(&avpkt);
+
+ if (!bFlush && m_nCodecId == CODEC_ID_H264) {
+ if (!m_h264RandomAccess.searchRecoveryPoint(m_pAVCtx, pDataIn, nSize)) {
+ return S_OK;
+ }
+ }
+
+ while (nSize > 0 || bFlush) {
+ if (!bFlush) {
+ if (nSize + FF_INPUT_BUFFER_PADDING_SIZE > m_nFFBufferSize) {
+ m_nFFBufferSize = nSize + FF_INPUT_BUFFER_PADDING_SIZE;
+ m_pFFBuffer = (BYTE*)av_realloc(m_pFFBuffer, m_nFFBufferSize);
+ if (!m_pFFBuffer) {
+ m_nFFBufferSize = 0;
+ return E_FAIL;
+ }
+ }
+
+ // Required number of additionally allocated bytes at the end of the input bitstream for decoding.
+ // This is mainly needed because some optimized bitstream readers read
+ // 32 or 64 bit at once and could read over the end.
+ // Note: If the first 23 bits of the additional bytes are not 0, then damaged
+ // MPEG bitstreams could cause overread and segfault.
+ memcpy(m_pFFBuffer, pDataIn, nSize);
+ memset(m_pFFBuffer + nSize, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+
+ avpkt.data = m_pFFBuffer;
+ avpkt.size = nSize;
+ avpkt.pts = rtStart;
+ avpkt.dts = rtStop;
+ avpkt.flags = AV_PKT_FLAG_KEY;
+ } else {
+ avpkt.data = NULL;
+ avpkt.size = 0;
+ }
+ used_bytes = avcodec_decode_video2(m_pAVCtx, m_pFrame, &got_picture, &avpkt);
+
+ if (used_bytes < 0) {
+ return S_OK;
+ }
+
+ // Comment from LAV Video code:
+ // When Frame Threading, we won't know how much data has been consumed, so it by default eats everything.
+ // In addition, if no data got consumed, and no picture was extracted, the frame probably isn't all that useufl.
+ // The MJPEB decoder is somewhat buggy and doesn't let us know how much data was consumed really...
+ if ((m_pAVCtx->active_thread_type & FF_THREAD_FRAME || (!got_picture && used_bytes == 0)) || m_nCodecId == CODEC_ID_MJPEGB || bFlush) {
+ nSize = 0;
+ } else {
+ nSize -= used_bytes;
+ pDataIn += used_bytes;
+ }
+
+ if (m_nCodecId == CODEC_ID_H264) {
+ m_h264RandomAccess.judgeFrameUsability(m_pFrame, &got_picture);
+ } else if (m_nCodecId == CODEC_ID_VC1 || m_nCodecId == CODEC_ID_RV30 || m_nCodecId == CODEC_ID_RV40) {
+ if (m_bWaitingForKeyFrame && got_picture) {
+ if (m_pFrame->key_frame) {
+ m_bWaitingForKeyFrame = FALSE;
+ } else {
+ got_picture = 0;
+ }
+ }
+ }
+
+ if (!got_picture || !m_pFrame->data[0]) {
+ bFlush = FALSE;
+ continue;
+ }
+
+ if ((pIn && pIn->IsPreroll() == S_OK) || rtStart < 0) {
+ return S_OK;
+ }
+
+ if (!m_bFrame_repeat_pict && m_pFrame->repeat_pict) {
+ m_bFrame_repeat_pict = true;
+ }
+
+ CComPtr<IMediaSample> pOut;
+ BYTE* pDataOut = NULL;
+
+ UpdateAspectRatio();
+ if (FAILED(hr = GetDeliveryBuffer(m_pAVCtx->width, m_pAVCtx->height, &pOut)) || FAILED(hr = pOut->GetPointer(&pDataOut))) {
+ return hr;
+ }
+
+ if (m_nCodecId == CODEC_ID_THEORA || (m_nCodecId == CODEC_ID_VP8 && m_rtAvrTimePerFrame == 10000)) { // need more tests
+ rtStart = m_pFrame->pkt_pts;
+ rtStop = m_pFrame->pkt_dts;
+ } else if ((m_nCodecId == CODEC_ID_RV10 || m_nCodecId == CODEC_ID_RV20) && m_pFrame->pict_type == AV_PICTURE_TYPE_B) {
+ rtStart = m_rtPrevStop;
+ rtStop = rtStart + m_rtAvrTimePerFrame;
+ } else if ((m_nCodecId == CODEC_ID_RV30 || m_nCodecId == CODEC_ID_RV40) && avpkt.data) {
+ rtStart = (rtStart == _I64_MIN) ? m_rtPrevStop : (10000i64 * process_rv_timestamp(&rm, m_nCodecId, avpkt.data, (rtStart + m_rtStart) / 10000) - m_rtStart);
+ rtStop = rtStart + m_rtAvrTimePerFrame;
+ } else if (!(m_nCodecId == CODEC_ID_VC1 && m_bFrame_repeat_pict && m_rtAvrTimePerFrame == 333666)) {
+ rtStart = m_pFrame->reordered_opaque;
+ rtStop = m_pFrame->reordered_opaque2;
+ }
+
+ m_rtPrevStop = rtStop;
+
+ ReorderBFrames(rtStart, rtStop);
+
+ pOut->SetTime(&rtStart, &rtStop);
+ pOut->SetMediaTime(NULL, NULL);
+
+ if (m_pSwsContext == NULL) {
+ InitSwscale();
+ }
+ if (m_pSwsContext != NULL) {
+
+ int outStride = m_pOutSize.cx;
+ BYTE* outData = pDataOut;
+
+ // From LAVVideo ...
+ // Check if we have proper pixel alignment and the dst memory is actually aligned
+ if (FFALIGN(outStride, 16) != outStride || ((uintptr_t)pDataOut % 16u)) {
+ outStride = FFALIGN(outStride, 16);
+ int requiredSize = (outStride * m_pAVCtx->height * m_nSwOutBpp) << 3;
+ if (requiredSize > m_nAlignedFFBufferSize) {
+ av_freep(&m_pAlignedFFBuffer);
+ m_nAlignedFFBufferSize = requiredSize;
+ m_pAlignedFFBuffer = (BYTE*)av_malloc(m_nAlignedFFBufferSize + FF_INPUT_BUFFER_PADDING_SIZE);
+ }
+ outData = m_pAlignedFFBuffer;
+ }
+
+ uint8_t* dst[4] = {NULL, NULL, NULL, NULL};
+ stride_t dstStride[4] = {0, 0, 0, 0};
+ const TcspInfo* outcspInfo = csp_getInfo(m_nOutCsp);
+
+ if (m_nOutCsp == FF_CSP_YUY2 || m_nOutCsp == FF_CSP_RGB32) {
+ dst[0] = outData;
+ dstStride[0] = (m_nSwOutBpp >> 3) * (outStride);
+ } else {
+ for (unsigned int i = 0; i < outcspInfo->numPlanes; i++) {
+ dstStride[i] = outStride >> outcspInfo->shiftX[i];
+ dst[i] = !i ? outData : dst[i - 1] + dstStride[i - 1] * (m_pOutSize.cy >> outcspInfo->shiftY[i - 1]) ;
+ }
+
+ if (m_nOutCsp & FF_CSP_420P) {
+ std::swap(dst[1], dst[2]);
+ }
+ }
+
+ sws_scale(m_pSwsContext, m_pFrame->data, m_pFrame->linesize, 0, m_pAVCtx->height, dst, dstStride);
+
+ if (outData != pDataOut) {
+ if (m_nOutCsp & FF_CSP_420P) {
+ std::swap(dst[1], dst[2]);
+ }
+ int rowsize = 0, height = 0;
+ for (unsigned int i = 0; i < outcspInfo->numPlanes; i++) {
+ rowsize = (m_pOutSize.cx * outcspInfo->Bpp) >> outcspInfo->shiftX[i];
+ height = m_pAVCtx->height >> outcspInfo->shiftY[i];
+ copyPlane(pDataOut, rowsize, dst[i], (outStride * outcspInfo->Bpp) >> outcspInfo->shiftX[i], rowsize, height, (m_nOutCsp == FF_CSP_RGB32));
+ pDataOut += rowsize * height;
+ }
+ }
+ }
#if defined(_DEBUG) && 0
- static REFERENCE_TIME rtLast = 0;
- TRACE ("Deliver : %10I64d - %10I64d (%10I64d) {%10I64d}\n", rtStart, rtStop,
- rtStop - rtStart, rtStart - rtLast);
- rtLast = rtStart;
+ static REFERENCE_TIME rtLast = 0;
+ TRACE("Deliver : %10I64d - %10I64d (%10I64d) {%10I64d}\n", rtStart, rtStop,
+ rtStop - rtStart, rtStart - rtLast);
+ rtLast = rtStart;
#endif
- SetTypeSpecificFlags (pOut);
- hr = m_pOutput->Deliver(pOut);
- }
+ SetTypeSpecificFlags(pOut);
+ hr = m_pOutput->Deliver(pOut);
+ }
- return hr;
+ return hr;
}
#endif /* HAS_FFMPEG_VIDEO_DECODERS */
bool CMPCVideoDecFilter::FindPicture(int nIndex, int nStartCode)
{
- DWORD dw = 0;
+ DWORD dw = 0;
- for (int i=0; i<m_nFFBufferPos-nIndex; i++) {
- dw = (dw<<8) + m_pFFBuffer[i+nIndex];
- if (i >= 4) {
- if (m_nFFPicEnd == INT_MIN) {
- if ( (dw & 0xffffff00) == 0x00000100 &&
- (dw & 0x000000FF) == (DWORD)nStartCode ) {
- m_nFFPicEnd = i+nIndex-3;
- }
- } else {
- if ( (dw & 0xffffff00) == 0x00000100 &&
- ((dw & 0x000000FF) == (DWORD)nStartCode || (dw & 0x000000FF) == 0xB3 )) {
- m_nFFPicEnd = i+nIndex-3;
- return true;
- }
- }
- }
+ for (int i = 0; i < m_nFFBufferPos - nIndex; i++) {
+ dw = (dw << 8) + m_pFFBuffer[i + nIndex];
+ if (i >= 4) {
+ if (m_nFFPicEnd == INT_MIN) {
+ if ((dw & 0xffffff00) == 0x00000100 &&
+ (dw & 0x000000FF) == (DWORD)nStartCode) {
+ m_nFFPicEnd = i + nIndex - 3;
+ }
+ } else {
+ if ((dw & 0xffffff00) == 0x00000100 &&
+ ((dw & 0x000000FF) == (DWORD)nStartCode || (dw & 0x000000FF) == 0xB3)) {
+ m_nFFPicEnd = i + nIndex - 3;
+ return true;
+ }
+ }
+ }
- }
+ }
- return false;
+ return false;
}
void CMPCVideoDecFilter::ResetBuffer()
{
- m_nFFBufferPos = 0;
- m_nFFPicEnd = INT_MIN;
+ m_nFFBufferPos = 0;
+ m_nFFPicEnd = INT_MIN;
- for (int i=0; i<MAX_BUFF_TIME; i++) {
- m_FFBufferTime[i].nBuffPos = INT_MIN;
- m_FFBufferTime[i].rtStart = _I64_MIN;
- m_FFBufferTime[i].rtStop = _I64_MIN;
- }
+ for (int i = 0; i < MAX_BUFF_TIME; i++) {
+ m_FFBufferTime[i].nBuffPos = INT_MIN;
+ m_FFBufferTime[i].rtStart = _I64_MIN;
+ m_FFBufferTime[i].rtStop = _I64_MIN;
+ }
}
void CMPCVideoDecFilter::PushBufferTime(int nPos, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop)
{
- for (int i=0; i<MAX_BUFF_TIME; i++) {
- if (m_FFBufferTime[i].nBuffPos == INT_MIN) {
- m_FFBufferTime[i].nBuffPos = nPos;
- m_FFBufferTime[i].rtStart = rtStart;
- m_FFBufferTime[i].rtStop = rtStop;
- break;
- }
- }
+ for (int i = 0; i < MAX_BUFF_TIME; i++) {
+ if (m_FFBufferTime[i].nBuffPos == INT_MIN) {
+ m_FFBufferTime[i].nBuffPos = nPos;
+ m_FFBufferTime[i].rtStart = rtStart;
+ m_FFBufferTime[i].rtStop = rtStop;
+ break;
+ }
+ }
}
void CMPCVideoDecFilter::PopBufferTime(int nPos)
{
- int nDestPos = 0;
- int i = 0;
+ int nDestPos = 0;
+ int i = 0;
- // Shift buffer time list
- while (i<MAX_BUFF_TIME && m_FFBufferTime[i].nBuffPos!=INT_MIN) {
- if (m_FFBufferTime[i].nBuffPos >= nPos) {
- m_FFBufferTime[nDestPos].nBuffPos = m_FFBufferTime[i].nBuffPos - nPos;
- m_FFBufferTime[nDestPos].rtStart = m_FFBufferTime[i].rtStart;
- m_FFBufferTime[nDestPos].rtStop = m_FFBufferTime[i].rtStop;
- nDestPos++;
- }
- i++;
- }
+ // Shift buffer time list
+ while (i < MAX_BUFF_TIME && m_FFBufferTime[i].nBuffPos != INT_MIN) {
+ if (m_FFBufferTime[i].nBuffPos >= nPos) {
+ m_FFBufferTime[nDestPos].nBuffPos = m_FFBufferTime[i].nBuffPos - nPos;
+ m_FFBufferTime[nDestPos].rtStart = m_FFBufferTime[i].rtStart;
+ m_FFBufferTime[nDestPos].rtStop = m_FFBufferTime[i].rtStop;
+ nDestPos++;
+ }
+ i++;
+ }
- // Free unused slots
- for (i=nDestPos; i<MAX_BUFF_TIME; i++) {
- m_FFBufferTime[i].nBuffPos = INT_MIN;
- m_FFBufferTime[i].rtStart = _I64_MIN;
- m_FFBufferTime[i].rtStop = _I64_MIN;
- }
+ // Free unused slots
+ for (i = nDestPos; i < MAX_BUFF_TIME; i++) {
+ m_FFBufferTime[i].nBuffPos = INT_MIN;
+ m_FFBufferTime[i].rtStart = _I64_MIN;
+ m_FFBufferTime[i].rtStop = _I64_MIN;
+ }
}
-bool CMPCVideoDecFilter::AppendBuffer (BYTE* pDataIn, int nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop)
+bool CMPCVideoDecFilter::AppendBuffer(BYTE* pDataIn, int nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop)
{
- if (rtStart != _I64_MIN) {
- PushBufferTime (m_nFFBufferPos, rtStart, rtStop);
- }
+ if (rtStart != _I64_MIN) {
+ PushBufferTime(m_nFFBufferPos, rtStart, rtStop);
+ }
- if (m_nFFBufferPos+nSize+FF_INPUT_BUFFER_PADDING_SIZE > m_nFFBufferSize) {
- m_nFFBufferSize = m_nFFBufferPos+nSize+FF_INPUT_BUFFER_PADDING_SIZE;
- m_pFFBuffer = (BYTE*)av_realloc(m_pFFBuffer, m_nFFBufferSize);
- }
+ if (m_nFFBufferPos + nSize + FF_INPUT_BUFFER_PADDING_SIZE > m_nFFBufferSize) {
+ m_nFFBufferSize = m_nFFBufferPos + nSize + FF_INPUT_BUFFER_PADDING_SIZE;
+ m_pFFBuffer = (BYTE*)av_realloc(m_pFFBuffer, m_nFFBufferSize);
+ }
- memcpy(m_pFFBuffer+m_nFFBufferPos, pDataIn, nSize);
+ memcpy(m_pFFBuffer + m_nFFBufferPos, pDataIn, nSize);
- m_nFFBufferPos += nSize;
+ m_nFFBufferPos += nSize;
- return true;
+ return true;
}
void CMPCVideoDecFilter::ShrinkBuffer()
{
- int nRemaining = m_nFFBufferPos-m_nFFPicEnd;
+ int nRemaining = m_nFFBufferPos - m_nFFPicEnd;
- ASSERT (m_nFFPicEnd != INT_MIN);
+ ASSERT(m_nFFPicEnd != INT_MIN);
- PopBufferTime (m_nFFPicEnd);
- memcpy (m_pFFBuffer, m_pFFBuffer+m_nFFPicEnd, nRemaining);
- m_nFFBufferPos = nRemaining;
+ PopBufferTime(m_nFFPicEnd);
+ memcpy(m_pFFBuffer, m_pFFBuffer + m_nFFPicEnd, nRemaining);
+ m_nFFBufferPos = nRemaining;
- m_nFFPicEnd = (m_pFFBuffer[3] == 0x00) ? 0 : INT_MIN;
+ m_nFFPicEnd = (m_pFFBuffer[3] == 0x00) ? 0 : INT_MIN;
}
HRESULT CMPCVideoDecFilter::Transform(IMediaSample* pIn)
{
- CAutoLock cAutoLock(&m_csReceive);
- HRESULT hr;
- BYTE* pDataIn;
- int nSize;
- REFERENCE_TIME rtStart = _I64_MIN;
- REFERENCE_TIME rtStop = _I64_MIN;
+ CAutoLock cAutoLock(&m_csReceive);
+ HRESULT hr;
+ BYTE* pDataIn;
+ int nSize;
+ REFERENCE_TIME rtStart = _I64_MIN;
+ REFERENCE_TIME rtStop = _I64_MIN;
- if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
- return hr;
- }
+ if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
+ return hr;
+ }
- nSize = pIn->GetActualDataLength();
- hr = pIn->GetTime(&rtStart, &rtStop);
+ nSize = pIn->GetActualDataLength();
+ hr = pIn->GetTime(&rtStart, &rtStop);
- if (FAILED(hr)) {
- rtStart = rtStop = _I64_MIN;
- }
+ if (FAILED(hr)) {
+ rtStart = rtStop = _I64_MIN;
+ }
- if (m_nDXVAMode == MODE_SOFTWARE || (m_nCodecId == CODEC_ID_VC1 && !m_bIsEVO)) {
- UpdateFrameTime(rtStart, rtStop, m_bFrame_repeat_pict);
- }
+ if (m_nDXVAMode == MODE_SOFTWARE || (m_nCodecId == CODEC_ID_VC1 && !m_bIsEVO)) {
+ UpdateFrameTime(rtStart, rtStop, m_bFrame_repeat_pict);
+ }
- m_pAVCtx->reordered_opaque = rtStart;
- m_pAVCtx->reordered_opaque2 = rtStop;
+ m_pAVCtx->reordered_opaque = rtStart;
+ m_pAVCtx->reordered_opaque2 = rtStop;
- if (m_pAVCtx->has_b_frames) {
- m_BFrames[m_nPosB].rtStart = rtStart;
- m_BFrames[m_nPosB].rtStop = rtStop;
- m_nPosB = 1-m_nPosB;
- }
+ if (m_pAVCtx->has_b_frames) {
+ m_BFrames[m_nPosB].rtStart = rtStart;
+ m_BFrames[m_nPosB].rtStop = rtStop;
+ m_nPosB = 1 - m_nPosB;
+ }
- switch (m_nDXVAMode) {
+ switch (m_nDXVAMode) {
#if HAS_FFMPEG_VIDEO_DECODERS
- case MODE_SOFTWARE :
- hr = SoftwareDecode (pIn, pDataIn, nSize, rtStart, rtStop);
- break;
+ case MODE_SOFTWARE :
+ hr = SoftwareDecode(pIn, pDataIn, nSize, rtStart, rtStop);
+ break;
#endif
- case MODE_DXVA1 :
- case MODE_DXVA2 :
- CheckPointer (m_pDXVADecoder, E_UNEXPECTED);
- UpdateAspectRatio();
-
- // Change aspect ratio for DXVA1
- if ((m_nDXVAMode == MODE_DXVA1) &&
- ReconnectOutput(PictWidthRounded(), PictHeightRounded(), true, PictWidth(), PictHeight()) == S_OK) {
- m_pDXVADecoder->ConfigureDXVA1();
- }
-
- if (m_pAVCtx->codec_id == CODEC_ID_MPEG2VIDEO) {
- AppendBuffer (pDataIn, nSize, rtStart, rtStop);
- hr = S_OK;
-
- while (FindPicture (max (m_nFFBufferPos-nSize-4, 0), 0x00)) {
- if (m_FFBufferTime[0].nBuffPos != INT_MIN && m_FFBufferTime[0].nBuffPos < m_nFFPicEnd) {
- rtStart = m_FFBufferTime[0].rtStart;
- rtStop = m_FFBufferTime[0].rtStop;
- } else {
- rtStart = rtStop = _I64_MIN;
- }
- hr = m_pDXVADecoder->DecodeFrame (m_pFFBuffer, m_nFFPicEnd, rtStart, rtStop);
- ShrinkBuffer();
- }
- } else {
- hr = m_pDXVADecoder->DecodeFrame (pDataIn, nSize, rtStart, rtStop);
- }
- break;
- default :
- ASSERT (FALSE);
- hr = E_UNEXPECTED;
- }
-
- return hr;
+ case MODE_DXVA1 :
+ case MODE_DXVA2 :
+ CheckPointer(m_pDXVADecoder, E_UNEXPECTED);
+ UpdateAspectRatio();
+
+ // Change aspect ratio for DXVA1
+ if ((m_nDXVAMode == MODE_DXVA1) &&
+ ReconnectOutput(PictWidthRounded(), PictHeightRounded(), true, PictWidth(), PictHeight()) == S_OK) {
+ m_pDXVADecoder->ConfigureDXVA1();
+ }
+
+ if (m_pAVCtx->codec_id == CODEC_ID_MPEG2VIDEO) {
+ AppendBuffer(pDataIn, nSize, rtStart, rtStop);
+ hr = S_OK;
+
+ while (FindPicture(max(m_nFFBufferPos - nSize - 4, 0), 0x00)) {
+ if (m_FFBufferTime[0].nBuffPos != INT_MIN && m_FFBufferTime[0].nBuffPos < m_nFFPicEnd) {
+ rtStart = m_FFBufferTime[0].rtStart;
+ rtStop = m_FFBufferTime[0].rtStop;
+ } else {
+ rtStart = rtStop = _I64_MIN;
+ }
+ hr = m_pDXVADecoder->DecodeFrame(m_pFFBuffer, m_nFFPicEnd, rtStart, rtStop);
+ ShrinkBuffer();
+ }
+ } else {
+ hr = m_pDXVADecoder->DecodeFrame(pDataIn, nSize, rtStart, rtStop);
+ }
+ break;
+ default :
+ ASSERT(FALSE);
+ hr = E_UNEXPECTED;
+ }
+
+ return hr;
}
void CMPCVideoDecFilter::UpdateAspectRatio()
{
- if (((m_nARMode) && (m_pAVCtx)) && ((m_pAVCtx->sample_aspect_ratio.num>0) && (m_pAVCtx->sample_aspect_ratio.den>0))) {
- CSize SAR(m_pAVCtx->sample_aspect_ratio.num, m_pAVCtx->sample_aspect_ratio.den);
- if (m_sar != SAR) {
- m_sar = SAR;
- CSize aspect(m_nWidth * SAR.cx, m_nHeight * SAR.cy);
- int lnko = LNKO(aspect.cx, aspect.cy);
- if (lnko > 1) {
- aspect.cx /= lnko, aspect.cy /= lnko;
- }
- SetAspect(aspect);
- }
- }
+ if (((m_nARMode) && (m_pAVCtx)) && ((m_pAVCtx->sample_aspect_ratio.num > 0) && (m_pAVCtx->sample_aspect_ratio.den > 0))) {
+ CSize SAR(m_pAVCtx->sample_aspect_ratio.num, m_pAVCtx->sample_aspect_ratio.den);
+ if (m_sar != SAR) {
+ m_sar = SAR;
+ CSize aspect(m_nWidth * SAR.cx, m_nHeight * SAR.cy);
+ int lnko = LNKO(aspect.cx, aspect.cy);
+ if (lnko > 1) {
+ aspect.cx /= lnko, aspect.cy /= lnko;
+ }
+ SetAspect(aspect);
+ }
+ }
}
void CMPCVideoDecFilter::ReorderBFrames(REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop)
{
- // Re-order B-frames if needed
- if (m_pAVCtx->has_b_frames && m_bReorderBFrame) {
- rtStart = m_BFrames [m_nPosB].rtStart;
- rtStop = m_BFrames [m_nPosB].rtStop;
- }
+ // Re-order B-frames if needed
+ if (m_pAVCtx->has_b_frames && m_bReorderBFrame) {
+ rtStart = m_BFrames [m_nPosB].rtStart;
+ rtStop = m_BFrames [m_nPosB].rtStop;
+ }
}
-void CMPCVideoDecFilter::FillInVideoDescription(DXVA2_VideoDesc *pDesc)
+void CMPCVideoDecFilter::FillInVideoDescription(DXVA2_VideoDesc* pDesc)
{
- memset (pDesc, 0, sizeof(DXVA2_VideoDesc));
- pDesc->SampleWidth = PictWidthRounded();
- pDesc->SampleHeight = PictHeightRounded();
- pDesc->Format = D3DFMT_A8R8G8B8;
- pDesc->UABProtectionLevel = 1;
+ memset(pDesc, 0, sizeof(DXVA2_VideoDesc));
+ pDesc->SampleWidth = PictWidthRounded();
+ pDesc->SampleHeight = PictHeightRounded();
+ pDesc->Format = D3DFMT_A8R8G8B8;
+ pDesc->UABProtectionLevel = 1;
}
BOOL CMPCVideoDecFilter::IsSupportedDecoderMode(const GUID& mode)
{
- if (IsDXVASupported()) {
- for (int i=0; i<MAX_SUPPORTED_MODE; i++) {
- if (*ffCodecs[m_nCodecNb].DXVAModes->Decoder[i] == GUID_NULL) {
- break;
- } else if (*ffCodecs[m_nCodecNb].DXVAModes->Decoder[i] == mode) {
- return true;
- }
- }
- }
+ if (IsDXVASupported()) {
+ for (int i = 0; i < MAX_SUPPORTED_MODE; i++) {
+ if (*ffCodecs[m_nCodecNb].DXVAModes->Decoder[i] == GUID_NULL) {
+ break;
+ } else if (*ffCodecs[m_nCodecNb].DXVAModes->Decoder[i] == mode) {
+ return true;
+ }
+ }
+ }
- return false;
+ return false;
}
BOOL CMPCVideoDecFilter::IsSupportedDecoderConfig(const D3DFORMAT nD3DFormat, const DXVA2_ConfigPictureDecode& config, bool& bIsPrefered)
{
- bool bRet = false;
+ bool bRet = false;
- bRet = (nD3DFormat == MAKEFOURCC('N', 'V', '1', '2') || nD3DFormat == MAKEFOURCC('I', 'M', 'C', '3'));
+ bRet = (nD3DFormat == MAKEFOURCC('N', 'V', '1', '2') || nD3DFormat == MAKEFOURCC('I', 'M', 'C', '3'));
- bIsPrefered = (config.ConfigBitstreamRaw == ffCodecs[m_nCodecNb].DXVAModes->PreferedConfigBitstream);
- LOG (_T("IsSupportedDecoderConfig 0x%08x %d"), nD3DFormat, bRet);
- return bRet;
+ bIsPrefered = (config.ConfigBitstreamRaw == ffCodecs[m_nCodecNb].DXVAModes->PreferedConfigBitstream);
+ LOG(_T("IsSupportedDecoderConfig 0x%08x %d"), nD3DFormat, bRet);
+ return bRet;
}
-HRESULT CMPCVideoDecFilter::FindDXVA2DecoderConfiguration(IDirectXVideoDecoderService *pDecoderService,
- const GUID& guidDecoder,
- DXVA2_ConfigPictureDecode *pSelectedConfig,
- BOOL *pbFoundDXVA2Configuration)
+HRESULT CMPCVideoDecFilter::FindDXVA2DecoderConfiguration(IDirectXVideoDecoderService* pDecoderService,
+ const GUID& guidDecoder,
+ DXVA2_ConfigPictureDecode* pSelectedConfig,
+ BOOL* pbFoundDXVA2Configuration)
{
- HRESULT hr = S_OK;
- UINT cFormats = 0;
- UINT cConfigurations = 0;
- bool bIsPrefered = false;
-
- D3DFORMAT *pFormats = NULL; // size = cFormats
- DXVA2_ConfigPictureDecode *pConfig = NULL; // size = cConfigurations
-
- // Find the valid render target formats for this decoder GUID.
- hr = pDecoderService->GetDecoderRenderTargets(guidDecoder, &cFormats, &pFormats);
- LOG (_T("GetDecoderRenderTargets => %d"), cFormats);
-
- if (SUCCEEDED(hr)) {
- // Look for a format that matches our output format.
- for (UINT iFormat = 0; iFormat < cFormats; iFormat++) {
- LOG (_T("Try to negociate => 0x%08x"), pFormats[iFormat]);
-
- // Fill in the video description. Set the width, height, format, and frame rate.
- FillInVideoDescription(&m_VideoDesc); // Private helper function.
- m_VideoDesc.Format = pFormats[iFormat];
-
- // Get the available configurations.
- hr = pDecoderService->GetDecoderConfigurations(guidDecoder, &m_VideoDesc, NULL, &cConfigurations, &pConfig);
-
- if (FAILED(hr)) {
- continue;
- }
-
- // Find a supported configuration.
- for (UINT iConfig = 0; iConfig < cConfigurations; iConfig++) {
- if (IsSupportedDecoderConfig(pFormats[iFormat], pConfig[iConfig], bIsPrefered)) {
- // This configuration is good.
- if (bIsPrefered || !*pbFoundDXVA2Configuration) {
- *pbFoundDXVA2Configuration = TRUE;
- *pSelectedConfig = pConfig[iConfig];
- }
-
- if (bIsPrefered) {
- break;
- }
- }
- }
-
- CoTaskMemFree(pConfig);
- } // End of formats loop.
- }
-
- CoTaskMemFree(pFormats);
-
- // Note: It is possible to return S_OK without finding a configuration.
- return hr;
-}
-
-HRESULT CMPCVideoDecFilter::ConfigureDXVA2(IPin *pPin)
-{
- HRESULT hr = S_OK;
- UINT cDecoderGuids = 0;
- BOOL bFoundDXVA2Configuration = FALSE;
- BOOL bHasIntelGuid = FALSE;
- GUID guidDecoder = GUID_NULL;
-
- DXVA2_ConfigPictureDecode config;
- ZeroMemory(&config, sizeof(config));
-
- CComPtr<IMFGetService> pGetService;
- CComPtr<IDirect3DDeviceManager9> pDeviceManager;
- CComPtr<IDirectXVideoDecoderService> pDecoderService;
- GUID* pDecoderGuids = NULL;
- HANDLE hDevice = INVALID_HANDLE_VALUE;
-
- // Query the pin for IMFGetService.
- hr = pPin->QueryInterface(__uuidof(IMFGetService), (void**)&pGetService);
-
- // Get the Direct3D device manager.
- if (SUCCEEDED(hr)) {
- hr = pGetService->GetService(
- MR_VIDEO_ACCELERATION_SERVICE,
- __uuidof(IDirect3DDeviceManager9),
- (void**)&pDeviceManager);
- }
-
- // Open a new device handle.
- if (SUCCEEDED(hr)) {
- hr = pDeviceManager->OpenDeviceHandle(&hDevice);
- }
-
- // Get the video decoder service.
- if (SUCCEEDED(hr)) {
- hr = pDeviceManager->GetVideoService(
- hDevice,
- __uuidof(IDirectXVideoDecoderService),
- (void**)&pDecoderService);
- }
-
- // Get the decoder GUIDs.
- if (SUCCEEDED(hr)) {
- hr = pDecoderService->GetDecoderDeviceGuids(&cDecoderGuids, &pDecoderGuids);
- }
-
- if (SUCCEEDED(hr)) {
-
- //Intel patch for Ivy Bridge and Sandy Bridge
- if (m_nPCIVendor == PCIV_Intel) {
- for (UINT iCnt = 0; iCnt < cDecoderGuids; iCnt++) {
- if (pDecoderGuids[iCnt] == DXVA_Intel_H264_ClearVideo)
- bHasIntelGuid = TRUE;
- }
- }
- // Look for the decoder GUIDs we want.
- for (UINT iGuid = 0; iGuid < cDecoderGuids; iGuid++) {
- // Do we support this mode?
- if (!IsSupportedDecoderMode(pDecoderGuids[iGuid])) {
- continue;
- }
-
- // Find a configuration that we support.
- hr = FindDXVA2DecoderConfiguration(pDecoderService, pDecoderGuids[iGuid], &config, &bFoundDXVA2Configuration);
-
- if (FAILED(hr)) {
- break;
- }
-
- // Patch for the Sandy Bridge (prevent crash on Mode_E, fixme later)
- if (m_nPCIVendor == PCIV_Intel && pDecoderGuids[iGuid] == DXVA2_ModeH264_E && bHasIntelGuid) {
- continue;
- }
-
- if (bFoundDXVA2Configuration) {
- // Found a good configuration. Save the GUID.
- guidDecoder = pDecoderGuids[iGuid];
- if (!bHasIntelGuid) break;
- }
- }
- }
-
- if (pDecoderGuids) {
- CoTaskMemFree(pDecoderGuids);
- }
- if (!bFoundDXVA2Configuration) {
- hr = E_FAIL; // Unable to find a configuration.
- }
-
- if (SUCCEEDED(hr)) {
- // Store the things we will need later.
- m_pDeviceManager = pDeviceManager;
- m_pDecoderService = pDecoderService;
-
- m_DXVA2Config = config;
- m_DXVADecoderGUID = guidDecoder;
- m_hDevice = hDevice;
- }
-
- if (FAILED(hr)) {
- if (hDevice != INVALID_HANDLE_VALUE) {
- pDeviceManager->CloseDeviceHandle(hDevice);
- }
- }
-
- return hr;
-}
-
-HRESULT CMPCVideoDecFilter::SetEVRForDXVA2(IPin *pPin)
-{
- HRESULT hr = S_OK;
-
- CComPtr<IMFGetService> pGetService;
- CComPtr<IDirectXVideoMemoryConfiguration> pVideoConfig;
- CComPtr<IMFVideoDisplayControl> pVdc;
-
- // Query the pin for IMFGetService.
- hr = pPin->QueryInterface(__uuidof(IMFGetService), (void**)&pGetService);
-
- // Get the IDirectXVideoMemoryConfiguration interface.
- if (SUCCEEDED(hr)) {
- hr = pGetService->GetService(
- MR_VIDEO_ACCELERATION_SERVICE,
- __uuidof(IDirectXVideoMemoryConfiguration),
- (void**)&pVideoConfig);
-
- if (SUCCEEDED (pGetService->GetService(MR_VIDEO_RENDER_SERVICE, __uuidof(IMFVideoDisplayControl), (void**)&pVdc))) {
- HWND hWnd;
- if (SUCCEEDED (pVdc->GetVideoWindow(&hWnd))) {
- DetectVideoCard(hWnd);
- }
- }
- }
-
- // Notify the EVR.
- if (SUCCEEDED(hr)) {
- DXVA2_SurfaceType surfaceType;
-
- for (DWORD iTypeIndex = 0; ; iTypeIndex++) {
- hr = pVideoConfig->GetAvailableSurfaceTypeByIndex(iTypeIndex, &surfaceType);
-
- if (FAILED(hr)) {
- break;
- }
-
- if (surfaceType == DXVA2_SurfaceType_DecoderRenderTarget) {
- hr = pVideoConfig->SetSurfaceType(DXVA2_SurfaceType_DecoderRenderTarget);
- break;
- }
- }
- }
-
- return hr;
+ HRESULT hr = S_OK;
+ UINT cFormats = 0;
+ UINT cConfigurations = 0;
+ bool bIsPrefered = false;
+
+ D3DFORMAT* pFormats = NULL; // size = cFormats
+ DXVA2_ConfigPictureDecode* pConfig = NULL; // size = cConfigurations
+
+ // Find the valid render target formats for this decoder GUID.
+ hr = pDecoderService->GetDecoderRenderTargets(guidDecoder, &cFormats, &pFormats);
+ LOG(_T("GetDecoderRenderTargets => %d"), cFormats);
+
+ if (SUCCEEDED(hr)) {
+ // Look for a format that matches our output format.
+ for (UINT iFormat = 0; iFormat < cFormats; iFormat++) {
+ LOG(_T("Try to negociate => 0x%08x"), pFormats[iFormat]);
+
+ // Fill in the video description. Set the width, height, format, and frame rate.
+ FillInVideoDescription(&m_VideoDesc); // Private helper function.
+ m_VideoDesc.Format = pFormats[iFormat];
+
+ // Get the available configurations.
+ hr = pDecoderService->GetDecoderConfigurations(guidDecoder, &m_VideoDesc, NULL, &cConfigurations, &pConfig);
+
+ if (FAILED(hr)) {
+ continue;
+ }
+
+ // Find a supported configuration.
+ for (UINT iConfig = 0; iConfig < cConfigurations; iConfig++) {
+ if (IsSupportedDecoderConfig(pFormats[iFormat], pConfig[iConfig], bIsPrefered)) {
+ // This configuration is good.
+ if (bIsPrefered || !*pbFoundDXVA2Configuration) {
+ *pbFoundDXVA2Configuration = TRUE;
+ *pSelectedConfig = pConfig[iConfig];
+ }
+
+ if (bIsPrefered) {
+ break;
+ }
+ }
+ }
+
+ CoTaskMemFree(pConfig);
+ } // End of formats loop.
+ }
+
+ CoTaskMemFree(pFormats);
+
+ // Note: It is possible to return S_OK without finding a configuration.
+ return hr;
+}
+
+HRESULT CMPCVideoDecFilter::ConfigureDXVA2(IPin* pPin)
+{
+ HRESULT hr = S_OK;
+ UINT cDecoderGuids = 0;
+ BOOL bFoundDXVA2Configuration = FALSE;
+ BOOL bHasIntelGuid = FALSE;
+ GUID guidDecoder = GUID_NULL;
+
+ DXVA2_ConfigPictureDecode config;
+ ZeroMemory(&config, sizeof(config));
+
+ CComPtr<IMFGetService> pGetService;
+ CComPtr<IDirect3DDeviceManager9> pDeviceManager;
+ CComPtr<IDirectXVideoDecoderService> pDecoderService;
+ GUID* pDecoderGuids = NULL;
+ HANDLE hDevice = INVALID_HANDLE_VALUE;
+
+ // Query the pin for IMFGetService.
+ hr = pPin->QueryInterface(__uuidof(IMFGetService), (void**)&pGetService);
+
+ // Get the Direct3D device manager.
+ if (SUCCEEDED(hr)) {
+ hr = pGetService->GetService(
+ MR_VIDEO_ACCELERATION_SERVICE,
+ __uuidof(IDirect3DDeviceManager9),
+ (void**)&pDeviceManager);
+ }
+
+ // Open a new device handle.
+ if (SUCCEEDED(hr)) {
+ hr = pDeviceManager->OpenDeviceHandle(&hDevice);
+ }
+
+ // Get the video decoder service.
+ if (SUCCEEDED(hr)) {
+ hr = pDeviceManager->GetVideoService(
+ hDevice,
+ __uuidof(IDirectXVideoDecoderService),
+ (void**)&pDecoderService);
+ }
+
+ // Get the decoder GUIDs.
+ if (SUCCEEDED(hr)) {
+ hr = pDecoderService->GetDecoderDeviceGuids(&cDecoderGuids, &pDecoderGuids);
+ }
+
+ if (SUCCEEDED(hr)) {
+
+ //Intel patch for Ivy Bridge and Sandy Bridge
+ if (m_nPCIVendor == PCIV_Intel) {
+ for (UINT iCnt = 0; iCnt < cDecoderGuids; iCnt++) {
+ if (pDecoderGuids[iCnt] == DXVA_Intel_H264_ClearVideo) {
+ bHasIntelGuid = TRUE;
+ }
+ }
+ }
+ // Look for the decoder GUIDs we want.
+ for (UINT iGuid = 0; iGuid < cDecoderGuids; iGuid++) {
+ // Do we support this mode?
+ if (!IsSupportedDecoderMode(pDecoderGuids[iGuid])) {
+ continue;
+ }
+
+ // Find a configuration that we support.
+ hr = FindDXVA2DecoderConfiguration(pDecoderService, pDecoderGuids[iGuid], &config, &bFoundDXVA2Configuration);
+
+ if (FAILED(hr)) {
+ break;
+ }
+
+ // Patch for the Sandy Bridge (prevent crash on Mode_E, fixme later)
+ if (m_nPCIVendor == PCIV_Intel && pDecoderGuids[iGuid] == DXVA2_ModeH264_E && bHasIntelGuid) {
+ continue;
+ }
+
+ if (bFoundDXVA2Configuration) {
+ // Found a good configuration. Save the GUID.
+ guidDecoder = pDecoderGuids[iGuid];
+ if (!bHasIntelGuid) { break; }
+ }
+ }
+ }
+
+ if (pDecoderGuids) {
+ CoTaskMemFree(pDecoderGuids);
+ }
+ if (!bFoundDXVA2Configuration) {
+ hr = E_FAIL; // Unable to find a configuration.
+ }
+
+ if (SUCCEEDED(hr)) {
+ // Store the things we will need later.
+ m_pDeviceManager = pDeviceManager;
+ m_pDecoderService = pDecoderService;
+
+ m_DXVA2Config = config;
+ m_DXVADecoderGUID = guidDecoder;
+ m_hDevice = hDevice;
+ }
+
+ if (FAILED(hr)) {
+ if (hDevice != INVALID_HANDLE_VALUE) {
+ pDeviceManager->CloseDeviceHandle(hDevice);
+ }
+ }
+
+ return hr;
+}
+
+HRESULT CMPCVideoDecFilter::SetEVRForDXVA2(IPin* pPin)
+{
+ HRESULT hr = S_OK;
+
+ CComPtr<IMFGetService> pGetService;
+ CComPtr<IDirectXVideoMemoryConfiguration> pVideoConfig;
+ CComPtr<IMFVideoDisplayControl> pVdc;
+
+ // Query the pin for IMFGetService.
+ hr = pPin->QueryInterface(__uuidof(IMFGetService), (void**)&pGetService);
+
+ // Get the IDirectXVideoMemoryConfiguration interface.
+ if (SUCCEEDED(hr)) {
+ hr = pGetService->GetService(
+ MR_VIDEO_ACCELERATION_SERVICE,
+ __uuidof(IDirectXVideoMemoryConfiguration),
+ (void**)&pVideoConfig);
+
+ if (SUCCEEDED(pGetService->GetService(MR_VIDEO_RENDER_SERVICE, __uuidof(IMFVideoDisplayControl), (void**)&pVdc))) {
+ HWND hWnd;
+ if (SUCCEEDED(pVdc->GetVideoWindow(&hWnd))) {
+ DetectVideoCard(hWnd);
+ }
+ }
+ }
+
+ // Notify the EVR.
+ if (SUCCEEDED(hr)) {
+ DXVA2_SurfaceType surfaceType;
+
+ for (DWORD iTypeIndex = 0; ; iTypeIndex++) {
+ hr = pVideoConfig->GetAvailableSurfaceTypeByIndex(iTypeIndex, &surfaceType);
+
+ if (FAILED(hr)) {
+ break;
+ }
+
+ if (surfaceType == DXVA2_SurfaceType_DecoderRenderTarget) {
+ hr = pVideoConfig->SetSurfaceType(DXVA2_SurfaceType_DecoderRenderTarget);
+ break;
+ }
+ }
+ }
+
+ return hr;
}
HRESULT CMPCVideoDecFilter::CreateDXVA2Decoder(UINT nNumRenderTargets, IDirect3DSurface9** pDecoderRenderTargets)
{
- HRESULT hr;
- CComPtr<IDirectXVideoDecoder> pDirectXVideoDec;
+ HRESULT hr;
+ CComPtr<IDirectXVideoDecoder> pDirectXVideoDec;
- m_pDecoderRenderTarget = NULL;
+ m_pDecoderRenderTarget = NULL;
- if (m_pDXVADecoder) {
- m_pDXVADecoder->SetDirectXVideoDec (NULL);
- }
+ if (m_pDXVADecoder) {
+ m_pDXVADecoder->SetDirectXVideoDec(NULL);
+ }
- hr = m_pDecoderService->CreateVideoDecoder (m_DXVADecoderGUID, &m_VideoDesc, &m_DXVA2Config,
- pDecoderRenderTargets, nNumRenderTargets, &pDirectXVideoDec);
+ hr = m_pDecoderService->CreateVideoDecoder(m_DXVADecoderGUID, &m_VideoDesc, &m_DXVA2Config,
+ pDecoderRenderTargets, nNumRenderTargets, &pDirectXVideoDec);
- if (SUCCEEDED (hr)) {
- if (!m_pDXVADecoder) {
- m_pDXVADecoder = CDXVADecoder::CreateDecoder (this, pDirectXVideoDec, &m_DXVADecoderGUID, GetPicEntryNumber(), &m_DXVA2Config);
- if (m_pDXVADecoder) {
- m_pDXVADecoder->SetExtraData ((BYTE*)m_pAVCtx->extradata, m_pAVCtx->extradata_size);
- }
- }
+ if (SUCCEEDED(hr)) {
+ if (!m_pDXVADecoder) {
+ m_pDXVADecoder = CDXVADecoder::CreateDecoder(this, pDirectXVideoDec, &m_DXVADecoderGUID, GetPicEntryNumber(), &m_DXVA2Config);
+ if (m_pDXVADecoder) {
+ m_pDXVADecoder->SetExtraData((BYTE*)m_pAVCtx->extradata, m_pAVCtx->extradata_size);
+ }
+ }
- m_pDXVADecoder->SetDirectXVideoDec (pDirectXVideoDec);
- }
+ m_pDXVADecoder->SetDirectXVideoDec(pDirectXVideoDec);
+ }
- return hr;
+ return hr;
}
HRESULT CMPCVideoDecFilter::FindDXVA1DecoderConfiguration(IAMVideoAccelerator* pAMVideoAccelerator, const GUID* guidDecoder, DDPIXELFORMAT* pPixelFormat)
{
- HRESULT hr = E_FAIL;
- DWORD dwFormats = 0;
- DDPIXELFORMAT* pPixelFormats = NULL;
+ HRESULT hr = E_FAIL;
+ DWORD dwFormats = 0;
+ DDPIXELFORMAT* pPixelFormats = NULL;
- pAMVideoAccelerator->GetUncompFormatsSupported (guidDecoder, &dwFormats, NULL);
- if (dwFormats > 0) {
- // Find the valid render target formats for this decoder GUID.
- pPixelFormats = DNew DDPIXELFORMAT[dwFormats];
- hr = pAMVideoAccelerator->GetUncompFormatsSupported (guidDecoder, &dwFormats, pPixelFormats);
- if (SUCCEEDED(hr)) {
- // Look for a format that matches our output format.
- for (DWORD iFormat = 0; iFormat < dwFormats; iFormat++) {
- if (pPixelFormats[iFormat].dwFourCC == MAKEFOURCC ('N', 'V', '1', '2')) {
- memcpy (pPixelFormat, &pPixelFormats[iFormat], sizeof(DDPIXELFORMAT));
- SAFE_DELETE_ARRAY(pPixelFormats)
- return S_OK;
- }
- }
+ pAMVideoAccelerator->GetUncompFormatsSupported(guidDecoder, &dwFormats, NULL);
+ if (dwFormats > 0) {
+ // Find the valid render target formats for this decoder GUID.
+ pPixelFormats = DNew DDPIXELFORMAT[dwFormats];
+ hr = pAMVideoAccelerator->GetUncompFormatsSupported(guidDecoder, &dwFormats, pPixelFormats);
+ if (SUCCEEDED(hr)) {
+ // Look for a format that matches our output format.
+ for (DWORD iFormat = 0; iFormat < dwFormats; iFormat++) {
+ if (pPixelFormats[iFormat].dwFourCC == MAKEFOURCC('N', 'V', '1', '2')) {
+ memcpy(pPixelFormat, &pPixelFormats[iFormat], sizeof(DDPIXELFORMAT));
+ SAFE_DELETE_ARRAY(pPixelFormats)
+ return S_OK;
+ }
+ }
- SAFE_DELETE_ARRAY(pPixelFormats);
- hr = E_FAIL;
- }
- }
+ SAFE_DELETE_ARRAY(pPixelFormats);
+ hr = E_FAIL;
+ }
+ }
- return hr;
+ return hr;
}
-HRESULT CMPCVideoDecFilter::CheckDXVA1Decoder(const GUID *pGuid)
+HRESULT CMPCVideoDecFilter::CheckDXVA1Decoder(const GUID* pGuid)
{
- if (m_nCodecNb != -1) {
- for (int i=0; i<MAX_SUPPORTED_MODE; i++)
- if (*ffCodecs[m_nCodecNb].DXVAModes->Decoder[i] == *pGuid) {
- return S_OK;
- }
- }
+ if (m_nCodecNb != -1) {
+ for (int i = 0; i < MAX_SUPPORTED_MODE; i++)
+ if (*ffCodecs[m_nCodecNb].DXVAModes->Decoder[i] == *pGuid) {
+ return S_OK;
+ }
+ }
- return E_INVALIDARG;
+ return E_INVALIDARG;
}
void CMPCVideoDecFilter::SetDXVA1Params(const GUID* pGuid, DDPIXELFORMAT* pPixelFormat)
{
- m_DXVADecoderGUID = *pGuid;
- memcpy (&m_PixelFormat, pPixelFormat, sizeof (DDPIXELFORMAT));
+ m_DXVADecoderGUID = *pGuid;
+ memcpy(&m_PixelFormat, pPixelFormat, sizeof(DDPIXELFORMAT));
}
WORD CMPCVideoDecFilter::GetDXVA1RestrictedMode()
{
- if (m_nCodecNb != -1) {
- for (int i=0; i<MAX_SUPPORTED_MODE; i++)
- if (*ffCodecs[m_nCodecNb].DXVAModes->Decoder[i] == m_DXVADecoderGUID) {
- return ffCodecs[m_nCodecNb].DXVAModes->RestrictedMode [i];
- }
- }
+ if (m_nCodecNb != -1) {
+ for (int i = 0; i < MAX_SUPPORTED_MODE; i++)
+ if (*ffCodecs[m_nCodecNb].DXVAModes->Decoder[i] == m_DXVADecoderGUID) {
+ return ffCodecs[m_nCodecNb].DXVAModes->RestrictedMode [i];
+ }
+ }
- return DXVA_RESTRICTED_MODE_UNRESTRICTED;
+ return DXVA_RESTRICTED_MODE_UNRESTRICTED;
}
HRESULT CMPCVideoDecFilter::CreateDXVA1Decoder(IAMVideoAccelerator* pAMVideoAccelerator, const GUID* pDecoderGuid, DWORD dwSurfaceCount)
{
- if (m_pDXVADecoder && m_DXVADecoderGUID == *pDecoderGuid) {
- return S_OK;
- }
- SAFE_DELETE (m_pDXVADecoder);
+ if (m_pDXVADecoder && m_DXVADecoderGUID == *pDecoderGuid) {
+ return S_OK;
+ }
+ SAFE_DELETE(m_pDXVADecoder);
- if (!m_bUseDXVA) {
- return E_FAIL;
- }
+ if (!m_bUseDXVA) {
+ return E_FAIL;
+ }
- m_nDXVAMode = MODE_DXVA1;
- m_DXVADecoderGUID = *pDecoderGuid;
- m_pDXVADecoder = CDXVADecoder::CreateDecoder (this, pAMVideoAccelerator, &m_DXVADecoderGUID, dwSurfaceCount);
- if (m_pDXVADecoder) {
- m_pDXVADecoder->SetExtraData ((BYTE*)m_pAVCtx->extradata, m_pAVCtx->extradata_size);
- }
+ m_nDXVAMode = MODE_DXVA1;
+ m_DXVADecoderGUID = *pDecoderGuid;
+ m_pDXVADecoder = CDXVADecoder::CreateDecoder(this, pAMVideoAccelerator, &m_DXVADecoderGUID, dwSurfaceCount);
+ if (m_pDXVADecoder) {
+ m_pDXVADecoder->SetExtraData((BYTE*)m_pAVCtx->extradata, m_pAVCtx->extradata_size);
+ }
- return S_OK;
+ return S_OK;
}
// ISpecifyPropertyPages2
STDMETHODIMP CMPCVideoDecFilter::GetPages(CAUUID* pPages)
{
- CheckPointer(pPages, E_POINTER);
+ CheckPointer(pPages, E_POINTER);
#ifdef REGISTER_FILTER
- pPages->cElems = 2;
+ pPages->cElems = 2;
#else
- pPages->cElems = 1;
+ pPages->cElems = 1;
#endif
- pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID) * pPages->cElems);
- pPages->pElems[0] = __uuidof(CMPCVideoDecSettingsWnd);
- if (pPages->cElems>1) {
- pPages->pElems[1] = __uuidof(CMPCVideoDecCodecWnd);
- }
+ pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID) * pPages->cElems);
+ pPages->pElems[0] = __uuidof(CMPCVideoDecSettingsWnd);
+ if (pPages->cElems > 1) {
+ pPages->pElems[1] = __uuidof(CMPCVideoDecCodecWnd);
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CMPCVideoDecFilter::CreatePage(const GUID& guid, IPropertyPage** ppPage)
{
- CheckPointer(ppPage, E_POINTER);
+ CheckPointer(ppPage, E_POINTER);
- if (*ppPage != NULL) {
- return E_INVALIDARG;
- }
+ if (*ppPage != NULL) {
+ return E_INVALIDARG;
+ }
- HRESULT hr;
+ HRESULT hr;
- if (guid == __uuidof(CMPCVideoDecSettingsWnd)) {
- (*ppPage = DNew CInternalPropertyPageTempl<CMPCVideoDecSettingsWnd>(NULL, &hr))->AddRef();
- } else if (guid == __uuidof(CMPCVideoDecCodecWnd)) {
- (*ppPage = DNew CInternalPropertyPageTempl<CMPCVideoDecCodecWnd>(NULL, &hr))->AddRef();
- }
+ if (guid == __uuidof(CMPCVideoDecSettingsWnd)) {
+ (*ppPage = DNew CInternalPropertyPageTempl<CMPCVideoDecSettingsWnd>(NULL, &hr))->AddRef();
+ } else if (guid == __uuidof(CMPCVideoDecCodecWnd)) {
+ (*ppPage = DNew CInternalPropertyPageTempl<CMPCVideoDecCodecWnd>(NULL, &hr))->AddRef();
+ }
- return *ppPage ? S_OK : E_FAIL;
+ return *ppPage ? S_OK : E_FAIL;
}
void CMPCVideoDecFilter::SetFrameType(FF_FIELD_TYPE nFrameType)
{
- m_nFrameType = nFrameType;
+ m_nFrameType = nFrameType;
}
// IFFmpegDecFilter
STDMETHODIMP CMPCVideoDecFilter::Apply()
{
#ifdef REGISTER_FILTER
- CRegKey key;
- if (ERROR_SUCCESS == key.Create(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPC Video Decoder"))) {
- key.SetDWORDValue(_T("ThreadNumber"), m_nThreadNumber);
- key.SetDWORDValue(_T("DiscardMode"), m_nDiscardMode);
- key.SetDWORDValue(_T("ErrorRecognition"), m_nErrorRecognition);
- key.SetDWORDValue(_T("IDCTAlgo"), m_nIDCTAlgo);
- key.SetDWORDValue(_T("ActiveCodecs"), m_nActiveCodecs);
- key.SetDWORDValue(_T("ARMode"), m_nARMode);
- key.SetDWORDValue(_T("DXVACheckCompatibility"), m_nDXVACheckCompatibility);
- key.SetDWORDValue(_T("DisableDXVA_SD"), m_nDXVA_SD);
- }
+ CRegKey key;
+ if (ERROR_SUCCESS == key.Create(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPC Video Decoder"))) {
+ key.SetDWORDValue(_T("ThreadNumber"), m_nThreadNumber);
+ key.SetDWORDValue(_T("DiscardMode"), m_nDiscardMode);
+ key.SetDWORDValue(_T("ErrorRecognition"), m_nErrorRecognition);
+ key.SetDWORDValue(_T("IDCTAlgo"), m_nIDCTAlgo);
+ key.SetDWORDValue(_T("ActiveCodecs"), m_nActiveCodecs);
+ key.SetDWORDValue(_T("ARMode"), m_nARMode);
+ key.SetDWORDValue(_T("DXVACheckCompatibility"), m_nDXVACheckCompatibility);
+ key.SetDWORDValue(_T("DisableDXVA_SD"), m_nDXVA_SD);
+ }
#else
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("ThreadNumber"), m_nThreadNumber);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("DiscardMode"), m_nDiscardMode);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("ErrorRecognition"), m_nErrorRecognition);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("IDCTAlgo"), m_nIDCTAlgo);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("ARMode"), m_nARMode);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("DXVACheckCompatibility"), m_nDXVACheckCompatibility);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("DisableDXVA_SD"), m_nDXVA_SD);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("ThreadNumber"), m_nThreadNumber);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("DiscardMode"), m_nDiscardMode);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("ErrorRecognition"), m_nErrorRecognition);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("IDCTAlgo"), m_nIDCTAlgo);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("ARMode"), m_nARMode);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("DXVACheckCompatibility"), m_nDXVACheckCompatibility);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPC Video Decoder"), _T("DisableDXVA_SD"), m_nDXVA_SD);
#endif
- return S_OK;
+ return S_OK;
}
// === IMPCVideoDecFilter
STDMETHODIMP CMPCVideoDecFilter::SetThreadNumber(int nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_nThreadNumber = nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_nThreadNumber = nValue;
+ return S_OK;
}
STDMETHODIMP_(int) CMPCVideoDecFilter::GetThreadNumber()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_nThreadNumber;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_nThreadNumber;
}
STDMETHODIMP CMPCVideoDecFilter::SetDiscardMode(int nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_nDiscardMode = nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_nDiscardMode = nValue;
+ return S_OK;
}
STDMETHODIMP_(int) CMPCVideoDecFilter::GetDiscardMode()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_nDiscardMode;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_nDiscardMode;
}
STDMETHODIMP CMPCVideoDecFilter::SetErrorRecognition(int nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_nErrorRecognition = nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_nErrorRecognition = nValue;
+ return S_OK;
}
STDMETHODIMP_(int) CMPCVideoDecFilter::GetErrorRecognition()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_nErrorRecognition;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_nErrorRecognition;
}
STDMETHODIMP CMPCVideoDecFilter::SetIDCTAlgo(int nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_nIDCTAlgo = nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_nIDCTAlgo = nValue;
+ return S_OK;
}
STDMETHODIMP_(int) CMPCVideoDecFilter::GetIDCTAlgo()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_nIDCTAlgo;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_nIDCTAlgo;
}
STDMETHODIMP_(GUID*) CMPCVideoDecFilter::GetDXVADecoderGuid()
{
- if (m_pGraph == NULL) {
- return NULL;
- } else {
- return &m_DXVADecoderGUID;
- }
+ if (m_pGraph == NULL) {
+ return NULL;
+ } else {
+ return &m_DXVADecoderGUID;
+ }
}
STDMETHODIMP CMPCVideoDecFilter::SetActiveCodecs(MPC_VIDEO_CODEC nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_nActiveCodecs = (int)nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_nActiveCodecs = (int)nValue;
+ return S_OK;
}
STDMETHODIMP_(MPC_VIDEO_CODEC) CMPCVideoDecFilter::GetActiveCodecs()
{
- CAutoLock cAutoLock(&m_csProps);
- return (MPC_VIDEO_CODEC)m_nActiveCodecs;
+ CAutoLock cAutoLock(&m_csProps);
+ return (MPC_VIDEO_CODEC)m_nActiveCodecs;
}
STDMETHODIMP_(LPCTSTR) CMPCVideoDecFilter::GetVideoCardDescription()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_strDeviceDescription;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_strDeviceDescription;
}
STDMETHODIMP CMPCVideoDecFilter::SetARMode(int nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_nARMode = nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_nARMode = nValue;
+ return S_OK;
}
STDMETHODIMP_(int) CMPCVideoDecFilter::GetARMode()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_nARMode;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_nARMode;
}
STDMETHODIMP CMPCVideoDecFilter::SetDXVACheckCompatibility(int nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_nDXVACheckCompatibility = nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_nDXVACheckCompatibility = nValue;
+ return S_OK;
}
STDMETHODIMP_(int) CMPCVideoDecFilter::GetDXVACheckCompatibility()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_nDXVACheckCompatibility;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_nDXVACheckCompatibility;
}
STDMETHODIMP CMPCVideoDecFilter::SetDXVA_SD(int nValue)
{
- CAutoLock cAutoLock(&m_csProps);
- m_nDXVA_SD = nValue;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_nDXVA_SD = nValue;
+ return S_OK;
}
STDMETHODIMP_(int) CMPCVideoDecFilter::GetDXVA_SD()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_nDXVA_SD;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_nDXVA_SD;
}
// === IMPCVideoDecFilter2
STDMETHODIMP_(int) CMPCVideoDecFilter::GetFrameType()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_nFrameType;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_nFrameType;
}
diff --git a/src/filters/transform/MPCVideoDec/MPCVideoDecFilter.h b/src/filters/transform/MPCVideoDec/MPCVideoDecFilter.h
index 1444d4ba0..0aea7ed57 100644
--- a/src/filters/transform/MPCVideoDec/MPCVideoDecFilter.h
+++ b/src/filters/transform/MPCVideoDec/MPCVideoDecFilter.h
@@ -23,9 +23,9 @@
#pragma once
#include <d3dx9.h>
-#include <videoacc.h> // DXVA1
+#include <videoacc.h> // DXVA1
#include <dxva.h>
-#include <dxva2api.h> // DXVA2
+#include <dxva2api.h> // DXVA2
#include "../BaseVideoFilter/BaseVideoFilter.h"
#include "IMPCVideoDecFilter.h"
@@ -51,269 +51,269 @@ struct SwsContext;
class CCpuId;
typedef enum {
- MODE_SOFTWARE,
- MODE_DXVA1,
- MODE_DXVA2
+ MODE_SOFTWARE,
+ MODE_DXVA1,
+ MODE_DXVA2
} DXVA_MODE;
typedef struct {
- REFERENCE_TIME rtStart;
- REFERENCE_TIME rtStop;
+ REFERENCE_TIME rtStart;
+ REFERENCE_TIME rtStop;
} B_FRAME;
typedef struct {
- REFERENCE_TIME rtStart;
- REFERENCE_TIME rtStop;
- int nBuffPos;
+ REFERENCE_TIME rtStart;
+ REFERENCE_TIME rtStop;
+ int nBuffPos;
} BUFFER_TIME;
typedef struct {
- bool video_after_seek;
- __int32 kf_pts; ///< timestamp of next video keyframe
- __int64 kf_base; ///< timestamp of the prev. video keyframe
+ bool video_after_seek;
+ __int32 kf_pts; ///< timestamp of next video keyframe
+ __int64 kf_base; ///< timestamp of the prev. video keyframe
} RMDemuxContext;
class __declspec(uuid("008BAC12-FBAF-497b-9670-BC6F6FBAE2C4"))
- CMPCVideoDecFilter
- : public CBaseVideoFilter
- , public TlibavcodecExt
- , public ISpecifyPropertyPages2
- , public IMPCVideoDecFilter
- , public IMPCVideoDecFilter2
+ CMPCVideoDecFilter
+ : public CBaseVideoFilter
+ , public TlibavcodecExt
+ , public ISpecifyPropertyPages2
+ , public IMPCVideoDecFilter
+ , public IMPCVideoDecFilter2
{
protected:
- // === FFMpeg callbacks
- static void LogLibavcodec(void* par,int level,const char *fmt,va_list valist);
- virtual void OnGetBuffer(AVFrame *pic);
-
- friend class CVideoDecDXVAAllocator;
-
- CCpuId* m_pCpuId;
- CCritSec m_csProps;
-
- // === Persistants parameters (registry)
- int m_nThreadNumber;
- int m_nDiscardMode;
- int m_nErrorRecognition;
- int m_nIDCTAlgo;
- bool m_bDXVACompatible;
- int m_nActiveCodecs;
- int m_nARMode;
- int m_nDXVACheckCompatibility;
- int m_nDXVA_SD;
-
- FF_FIELD_TYPE m_nFrameType;
-
- // === FFMpeg variables
- AVCodec* m_pAVCodec;
- AVCodecContext* m_pAVCtx;
- AVFrame* m_pFrame;
- int m_nCodecNb;
- enum CodecID m_nCodecId;
- int m_nWorkaroundBug;
- int m_nErrorConcealment;
- REFERENCE_TIME m_rtAvrTimePerFrame;
- bool m_bReorderBFrame;
- B_FRAME m_BFrames[2];
- int m_nPosB;
- int m_nWidth; // Frame width give to input pin
- int m_nHeight; // Frame height give to input pin
-
- bool m_bTheoraMTSupport;
- bool m_bIsEVO;
-
- // Buffer management for truncated stream (store stream chunks & reference time sent by splitter)
- BYTE* m_pFFBuffer;
- int m_nFFBufferSize;
- BYTE* m_pAlignedFFBuffer;
- int m_nAlignedFFBufferSize;
-
- int m_nFFBufferPos;
- int m_nFFPicEnd;
- BUFFER_TIME m_FFBufferTime[MAX_BUFF_TIME];
-
- REFERENCE_TIME m_rtLastStart; // rtStart for last delivered frame
- int m_nCountEstimated; // Number of rtStart estimated since last rtStart received
- double m_dRate;
- REFERENCE_TIME m_rtPrevStop;
- bool m_bFrame_repeat_pict;
-
- bool m_bUseDXVA;
- bool m_bUseFFmpeg;
- CSize m_sar;
- SwsContext* m_pSwsContext;
- unsigned __int64 m_nOutCsp;
- CSize m_pOutSize; // Picture size on output pin
- int m_nSwOutBpp;
-
- // === DXVA common variables
- VIDEO_OUTPUT_FORMATS* m_pVideoOutputFormat;
- int m_nVideoOutputCount;
- DXVA_MODE m_nDXVAMode;
- CDXVADecoder* m_pDXVADecoder;
- GUID m_DXVADecoderGUID;
-
- DWORD m_nPCIVendor;
- DWORD m_nPCIDevice;
- LARGE_INTEGER m_VideoDriverVersion;
- CString m_strDeviceDescription;
-
- // === DXVA1 variables
- DDPIXELFORMAT m_PixelFormat;
-
- // === DXVA2 variables
- CComPtr<IDirect3DDeviceManager9> m_pDeviceManager;
- CComPtr<IDirectXVideoDecoderService> m_pDecoderService;
- CComPtr<IDirect3DSurface9> m_pDecoderRenderTarget;
- DXVA2_ConfigPictureDecode m_DXVA2Config;
- HANDLE m_hDevice;
- DXVA2_VideoDesc m_VideoDesc;
-
- CH264RandomAccess m_h264RandomAccess;
-
- BOOL m_bWaitingForKeyFrame;
-
- RMDemuxContext rm;
- REFERENCE_TIME m_rtStart;
-
- // === Private functions
- void Cleanup();
- int FindCodec(const CMediaType* mtIn);
- void AllocExtradata(AVCodecContext* pAVCtx, const CMediaType* mt);
- bool IsMultiThreadSupported(enum CodecID nCodec);
- void GetOutputFormats (int& nNumber, VIDEO_OUTPUT_FORMATS** ppFormats);
- void CalcAvgTimePerFrame();
- void DetectVideoCard(HWND hWnd);
- unsigned __int64 GetCspFromMediaType(GUID& subtype);
- void InitSwscale();
-
- void SetTypeSpecificFlags(IMediaSample* pMS);
- HRESULT SoftwareDecode(IMediaSample* pIn, BYTE* pDataIn, int nSize, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop);
- bool AppendBuffer (BYTE* pDataIn, int nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop);
- bool FindPicture(int nIndex, int nStartCode);
- void ShrinkBuffer();
- void ResetBuffer();
- void PushBufferTime(int nPos, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop);
- void PopBufferTime(int nPos);
+ // === FFMpeg callbacks
+ static void LogLibavcodec(void* par, int level, const char* fmt, va_list valist);
+ virtual void OnGetBuffer(AVFrame* pic);
+
+ friend class CVideoDecDXVAAllocator;
+
+ CCpuId* m_pCpuId;
+ CCritSec m_csProps;
+
+ // === Persistants parameters (registry)
+ int m_nThreadNumber;
+ int m_nDiscardMode;
+ int m_nErrorRecognition;
+ int m_nIDCTAlgo;
+ bool m_bDXVACompatible;
+ int m_nActiveCodecs;
+ int m_nARMode;
+ int m_nDXVACheckCompatibility;
+ int m_nDXVA_SD;
+
+ FF_FIELD_TYPE m_nFrameType;
+
+ // === FFMpeg variables
+ AVCodec* m_pAVCodec;
+ AVCodecContext* m_pAVCtx;
+ AVFrame* m_pFrame;
+ int m_nCodecNb;
+ enum CodecID m_nCodecId;
+ int m_nWorkaroundBug;
+ int m_nErrorConcealment;
+ REFERENCE_TIME m_rtAvrTimePerFrame;
+ bool m_bReorderBFrame;
+ B_FRAME m_BFrames[2];
+ int m_nPosB;
+ int m_nWidth; // Frame width give to input pin
+ int m_nHeight; // Frame height give to input pin
+
+ bool m_bTheoraMTSupport;
+ bool m_bIsEVO;
+
+ // Buffer management for truncated stream (store stream chunks & reference time sent by splitter)
+ BYTE* m_pFFBuffer;
+ int m_nFFBufferSize;
+ BYTE* m_pAlignedFFBuffer;
+ int m_nAlignedFFBufferSize;
+
+ int m_nFFBufferPos;
+ int m_nFFPicEnd;
+ BUFFER_TIME m_FFBufferTime[MAX_BUFF_TIME];
+
+ REFERENCE_TIME m_rtLastStart; // rtStart for last delivered frame
+ int m_nCountEstimated; // Number of rtStart estimated since last rtStart received
+ double m_dRate;
+ REFERENCE_TIME m_rtPrevStop;
+ bool m_bFrame_repeat_pict;
+
+ bool m_bUseDXVA;
+ bool m_bUseFFmpeg;
+ CSize m_sar;
+ SwsContext* m_pSwsContext;
+ unsigned __int64 m_nOutCsp;
+ CSize m_pOutSize; // Picture size on output pin
+ int m_nSwOutBpp;
+
+ // === DXVA common variables
+ VIDEO_OUTPUT_FORMATS* m_pVideoOutputFormat;
+ int m_nVideoOutputCount;
+ DXVA_MODE m_nDXVAMode;
+ CDXVADecoder* m_pDXVADecoder;
+ GUID m_DXVADecoderGUID;
+
+ DWORD m_nPCIVendor;
+ DWORD m_nPCIDevice;
+ LARGE_INTEGER m_VideoDriverVersion;
+ CString m_strDeviceDescription;
+
+ // === DXVA1 variables
+ DDPIXELFORMAT m_PixelFormat;
+
+ // === DXVA2 variables
+ CComPtr<IDirect3DDeviceManager9> m_pDeviceManager;
+ CComPtr<IDirectXVideoDecoderService> m_pDecoderService;
+ CComPtr<IDirect3DSurface9> m_pDecoderRenderTarget;
+ DXVA2_ConfigPictureDecode m_DXVA2Config;
+ HANDLE m_hDevice;
+ DXVA2_VideoDesc m_VideoDesc;
+
+ CH264RandomAccess m_h264RandomAccess;
+
+ BOOL m_bWaitingForKeyFrame;
+
+ RMDemuxContext rm;
+ REFERENCE_TIME m_rtStart;
+
+ // === Private functions
+ void Cleanup();
+ int FindCodec(const CMediaType* mtIn);
+ void AllocExtradata(AVCodecContext* pAVCtx, const CMediaType* mt);
+ bool IsMultiThreadSupported(enum CodecID nCodec);
+ void GetOutputFormats(int& nNumber, VIDEO_OUTPUT_FORMATS** ppFormats);
+ void CalcAvgTimePerFrame();
+ void DetectVideoCard(HWND hWnd);
+ unsigned __int64 GetCspFromMediaType(GUID& subtype);
+ void InitSwscale();
+
+ void SetTypeSpecificFlags(IMediaSample* pMS);
+ HRESULT SoftwareDecode(IMediaSample* pIn, BYTE* pDataIn, int nSize, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop);
+ bool AppendBuffer(BYTE* pDataIn, int nSize, REFERENCE_TIME rtStart, REFERENCE_TIME rtStop);
+ bool FindPicture(int nIndex, int nStartCode);
+ void ShrinkBuffer();
+ void ResetBuffer();
+ void PushBufferTime(int nPos, REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop);
+ void PopBufferTime(int nPos);
public:
- const static AMOVIESETUP_MEDIATYPE sudPinTypesIn[];
- const static int sudPinTypesInCount;
- const static AMOVIESETUP_MEDIATYPE sudPinTypesOut[];
- const static int sudPinTypesOutCount;
-
- static bool* FFmpegFilters;
- static bool* DXVAFilters;
-
- CMPCVideoDecFilter(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CMPCVideoDecFilter();
-
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- virtual bool IsVideoInterlaced();
- virtual void GetOutputSize(int& w, int& h, int& arx, int& ary, int& RealWidth, int& RealHeight);
- CTransformOutputPin* GetOutputPin() {
- return m_pOutput;
- }
-
- void UpdateFrameTime (REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop, bool b_repeat_pict = false);
- CString GetFileExtension();
-
- // === Overriden DirectShow functions
- HRESULT SetMediaType(PIN_DIRECTION direction,const CMediaType *pmt);
- HRESULT CheckInputType(const CMediaType* mtIn);
- HRESULT Transform(IMediaSample* pIn);
- HRESULT CompleteConnect(PIN_DIRECTION direction,IPin *pReceivePin);
- HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT BeginFlush();
- HRESULT EndFlush();
- HRESULT NewSegment(REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double dRate);
- HRESULT EndOfStream();
-
- HRESULT BreakConnect(PIN_DIRECTION dir);
-
-
- // === ISpecifyPropertyPages2
-
- STDMETHODIMP GetPages(CAUUID* pPages);
- STDMETHODIMP CreatePage(const GUID& guid, IPropertyPage** ppPage);
-
- // === IMPCVideoDecFilter
- STDMETHODIMP Apply();
- STDMETHODIMP SetThreadNumber(int nValue);
- STDMETHODIMP_(int) GetThreadNumber();
- STDMETHOD(SetDiscardMode(int nValue));
- STDMETHOD_(int, GetDiscardMode());
- STDMETHOD(SetErrorRecognition(int nValue));
- STDMETHOD_(int, GetErrorRecognition());
- STDMETHOD(SetIDCTAlgo(int nValue));
- STDMETHOD_(int, GetIDCTAlgo());
- STDMETHOD_(GUID*, GetDXVADecoderGuid());
- STDMETHOD(SetActiveCodecs(MPC_VIDEO_CODEC nValue));
- STDMETHOD_(MPC_VIDEO_CODEC, GetActiveCodecs());
- STDMETHODIMP_(LPCTSTR) GetVideoCardDescription();
-
- STDMETHOD(SetARMode(int nValue));
- STDMETHOD_(int, GetARMode());
-
- STDMETHOD(SetDXVACheckCompatibility(int nValue));
- STDMETHOD_(int, GetDXVACheckCompatibility());
-
- STDMETHOD(SetDXVA_SD(int nValue));
- STDMETHOD_(int, GetDXVA_SD());
-
- // === IMPCVideoDecFilter2
- STDMETHOD_(int, GetFrameType());
-
- // === DXVA common functions
- BOOL IsSupportedDecoderConfig(const D3DFORMAT nD3DFormat, const DXVA2_ConfigPictureDecode& config, bool& bIsPrefered);
- BOOL IsSupportedDecoderMode(const GUID& mode);
- void BuildDXVAOutputFormat();
- int GetPicEntryNumber();
- int PictWidth();
- int PictHeight();
- int PictWidthRounded();
- int PictHeightRounded();
-
- inline bool UseDXVA2() { return (m_nDXVAMode == MODE_DXVA2); };
- inline AVCodecContext* GetAVCtx() { return m_pAVCtx; };
- inline AVFrame* GetFrame() { return m_pFrame; };
- inline enum CodecID GetCodec() { return m_nCodecId; };
- inline bool IsReorderBFrame() { return m_bReorderBFrame; };
- inline bool IsEvo() { return m_bIsEVO; };
- inline DWORD GetPCIVendor() { return m_nPCIVendor; };
- inline REFERENCE_TIME GetAvrTimePerFrame() { return m_rtAvrTimePerFrame; };
- inline double GetRate() { return m_dRate; };
- bool IsDXVASupported();
- void UpdateAspectRatio();
- void ReorderBFrames(REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop);
- void FlushDXVADecoder() {
- if (m_pDXVADecoder) {
- m_pDXVADecoder->Flush();
- }
- }
-
- void SetFrameType(FF_FIELD_TYPE nFrameType);
-
- // === DXVA1 functions
- DDPIXELFORMAT* GetPixelFormat() { return &m_PixelFormat; }
- HRESULT FindDXVA1DecoderConfiguration(IAMVideoAccelerator* pAMVideoAccelerator, const GUID* guidDecoder, DDPIXELFORMAT* pPixelFormat);
- HRESULT CheckDXVA1Decoder(const GUID *pGuid);
- void SetDXVA1Params(const GUID* pGuid, DDPIXELFORMAT* pPixelFormat);
- WORD GetDXVA1RestrictedMode();
- HRESULT CreateDXVA1Decoder(IAMVideoAccelerator* pAMVideoAccelerator, const GUID* pDecoderGuid, DWORD dwSurfaceCount);
-
-
- // === DXVA2 functions
- void FillInVideoDescription(DXVA2_VideoDesc *pDesc);
- DXVA2_ConfigPictureDecode* GetDXVA2Config() { return &m_DXVA2Config; };
- HRESULT ConfigureDXVA2(IPin *pPin);
- HRESULT SetEVRForDXVA2(IPin *pPin);
- HRESULT FindDXVA2DecoderConfiguration(IDirectXVideoDecoderService *pDecoderService,
- const GUID& guidDecoder,
- DXVA2_ConfigPictureDecode *pSelectedConfig,
- BOOL *pbFoundDXVA2Configuration);
- HRESULT CreateDXVA2Decoder(UINT nNumRenderTargets, IDirect3DSurface9** pDecoderRenderTargets);
+ const static AMOVIESETUP_MEDIATYPE sudPinTypesIn[];
+ const static int sudPinTypesInCount;
+ const static AMOVIESETUP_MEDIATYPE sudPinTypesOut[];
+ const static int sudPinTypesOutCount;
+
+ static bool* FFmpegFilters;
+ static bool* DXVAFilters;
+
+ CMPCVideoDecFilter(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CMPCVideoDecFilter();
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ virtual bool IsVideoInterlaced();
+ virtual void GetOutputSize(int& w, int& h, int& arx, int& ary, int& RealWidth, int& RealHeight);
+ CTransformOutputPin* GetOutputPin() {
+ return m_pOutput;
+ }
+
+ void UpdateFrameTime(REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop, bool b_repeat_pict = false);
+ CString GetFileExtension();
+
+ // === Overriden DirectShow functions
+ HRESULT SetMediaType(PIN_DIRECTION direction, const CMediaType* pmt);
+ HRESULT CheckInputType(const CMediaType* mtIn);
+ HRESULT Transform(IMediaSample* pIn);
+ HRESULT CompleteConnect(PIN_DIRECTION direction, IPin* pReceivePin);
+ HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT BeginFlush();
+ HRESULT EndFlush();
+ HRESULT NewSegment(REFERENCE_TIME rtStart, REFERENCE_TIME rtStop, double dRate);
+ HRESULT EndOfStream();
+
+ HRESULT BreakConnect(PIN_DIRECTION dir);
+
+
+ // === ISpecifyPropertyPages2
+
+ STDMETHODIMP GetPages(CAUUID* pPages);
+ STDMETHODIMP CreatePage(const GUID& guid, IPropertyPage** ppPage);
+
+ // === IMPCVideoDecFilter
+ STDMETHODIMP Apply();
+ STDMETHODIMP SetThreadNumber(int nValue);
+ STDMETHODIMP_(int) GetThreadNumber();
+ STDMETHOD(SetDiscardMode(int nValue));
+ STDMETHOD_(int, GetDiscardMode());
+ STDMETHOD(SetErrorRecognition(int nValue));
+ STDMETHOD_(int, GetErrorRecognition());
+ STDMETHOD(SetIDCTAlgo(int nValue));
+ STDMETHOD_(int, GetIDCTAlgo());
+ STDMETHOD_(GUID*, GetDXVADecoderGuid());
+ STDMETHOD(SetActiveCodecs(MPC_VIDEO_CODEC nValue));
+ STDMETHOD_(MPC_VIDEO_CODEC, GetActiveCodecs());
+ STDMETHODIMP_(LPCTSTR) GetVideoCardDescription();
+
+ STDMETHOD(SetARMode(int nValue));
+ STDMETHOD_(int, GetARMode());
+
+ STDMETHOD(SetDXVACheckCompatibility(int nValue));
+ STDMETHOD_(int, GetDXVACheckCompatibility());
+
+ STDMETHOD(SetDXVA_SD(int nValue));
+ STDMETHOD_(int, GetDXVA_SD());
+
+ // === IMPCVideoDecFilter2
+ STDMETHOD_(int, GetFrameType());
+
+ // === DXVA common functions
+ BOOL IsSupportedDecoderConfig(const D3DFORMAT nD3DFormat, const DXVA2_ConfigPictureDecode& config, bool& bIsPrefered);
+ BOOL IsSupportedDecoderMode(const GUID& mode);
+ void BuildDXVAOutputFormat();
+ int GetPicEntryNumber();
+ int PictWidth();
+ int PictHeight();
+ int PictWidthRounded();
+ int PictHeightRounded();
+
+ inline bool UseDXVA2() { return (m_nDXVAMode == MODE_DXVA2); };
+ inline AVCodecContext* GetAVCtx() { return m_pAVCtx; };
+ inline AVFrame* GetFrame() { return m_pFrame; };
+ inline enum CodecID GetCodec() { return m_nCodecId; };
+ inline bool IsReorderBFrame() { return m_bReorderBFrame; };
+ inline bool IsEvo() { return m_bIsEVO; };
+ inline DWORD GetPCIVendor() { return m_nPCIVendor; };
+ inline REFERENCE_TIME GetAvrTimePerFrame() { return m_rtAvrTimePerFrame; };
+ inline double GetRate() { return m_dRate; };
+ bool IsDXVASupported();
+ void UpdateAspectRatio();
+ void ReorderBFrames(REFERENCE_TIME& rtStart, REFERENCE_TIME& rtStop);
+ void FlushDXVADecoder() {
+ if (m_pDXVADecoder) {
+ m_pDXVADecoder->Flush();
+ }
+ }
+
+ void SetFrameType(FF_FIELD_TYPE nFrameType);
+
+ // === DXVA1 functions
+ DDPIXELFORMAT* GetPixelFormat() { return &m_PixelFormat; }
+ HRESULT FindDXVA1DecoderConfiguration(IAMVideoAccelerator* pAMVideoAccelerator, const GUID* guidDecoder, DDPIXELFORMAT* pPixelFormat);
+ HRESULT CheckDXVA1Decoder(const GUID* pGuid);
+ void SetDXVA1Params(const GUID* pGuid, DDPIXELFORMAT* pPixelFormat);
+ WORD GetDXVA1RestrictedMode();
+ HRESULT CreateDXVA1Decoder(IAMVideoAccelerator* pAMVideoAccelerator, const GUID* pDecoderGuid, DWORD dwSurfaceCount);
+
+
+ // === DXVA2 functions
+ void FillInVideoDescription(DXVA2_VideoDesc* pDesc);
+ DXVA2_ConfigPictureDecode* GetDXVA2Config() { return &m_DXVA2Config; };
+ HRESULT ConfigureDXVA2(IPin* pPin);
+ HRESULT SetEVRForDXVA2(IPin* pPin);
+ HRESULT FindDXVA2DecoderConfiguration(IDirectXVideoDecoderService* pDecoderService,
+ const GUID& guidDecoder,
+ DXVA2_ConfigPictureDecode* pSelectedConfig,
+ BOOL* pbFoundDXVA2Configuration);
+ HRESULT CreateDXVA2Decoder(UINT nNumRenderTargets, IDirect3DSurface9** pDecoderRenderTargets);
};
diff --git a/src/filters/transform/MPCVideoDec/MPCVideoDecSettingsWnd.cpp b/src/filters/transform/MPCVideoDec/MPCVideoDecSettingsWnd.cpp
index eecf3e6b3..a8b8d6a12 100644
--- a/src/filters/transform/MPCVideoDec/MPCVideoDecSettingsWnd.cpp
+++ b/src/filters/transform/MPCVideoDec/MPCVideoDecSettingsWnd.cpp
@@ -32,44 +32,44 @@
// ==>>> Resource identifier from "resource.h" present in mplayerc project!
#define ResStr(id) CString(MAKEINTRESOURCE(id))
-#define LEFT_SPACING 20
-#define VERTICAL_SPACING 25
+#define LEFT_SPACING 20
+#define VERTICAL_SPACING 25
//
// CMPCVideoDecSettingsWnd
//
int g_AVDiscard[] = {
- AVDISCARD_NONE,
- AVDISCARD_DEFAULT,
- AVDISCARD_NONREF,
- AVDISCARD_BIDIR,
- AVDISCARD_NONKEY,
- AVDISCARD_ALL,
+ AVDISCARD_NONE,
+ AVDISCARD_DEFAULT,
+ AVDISCARD_NONREF,
+ AVDISCARD_BIDIR,
+ AVDISCARD_NONKEY,
+ AVDISCARD_ALL,
};
int FindDiscardIndex(int nValue)
{
- for (int i=0; i<_countof (g_AVDiscard); i++)
- if (g_AVDiscard[i] == nValue) {
- return i;
- }
- return 1;
+ for (int i = 0; i < _countof(g_AVDiscard); i++)
+ if (g_AVDiscard[i] == nValue) {
+ return i;
+ }
+ return 1;
}
int g_AVErrRecognition[] = {
- AV_EF_CAREFUL,
- AV_EF_COMPLIANT,
- AV_EF_AGGRESSIVE,
+ AV_EF_CAREFUL,
+ AV_EF_COMPLIANT,
+ AV_EF_AGGRESSIVE,
};
int FindErrRecognitionIndex(int nValue)
{
- for (int i=0; i<_countof (g_AVErrRecognition); i++)
- if (g_AVErrRecognition[i] == nValue) {
- return i;
- }
- return 1;
+ for (int i = 0; i < _countof(g_AVErrRecognition); i++)
+ if (g_AVErrRecognition[i] == nValue) {
+ return i;
+ }
+ return 1;
}
CMPCVideoDecSettingsWnd::CMPCVideoDecSettingsWnd()
@@ -78,146 +78,146 @@ CMPCVideoDecSettingsWnd::CMPCVideoDecSettingsWnd()
bool CMPCVideoDecSettingsWnd::OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks)
{
- ASSERT(!m_pMDF);
+ ASSERT(!m_pMDF);
- m_pMDF.Release();
+ m_pMDF.Release();
- POSITION pos = pUnks.GetHeadPosition();
- while (pos && !(m_pMDF = pUnks.GetNext(pos))) {
- ;
- }
+ POSITION pos = pUnks.GetHeadPosition();
+ while (pos && !(m_pMDF = pUnks.GetNext(pos))) {
+ ;
+ }
- if (!m_pMDF) {
- return false;
- }
+ if (!m_pMDF) {
+ return false;
+ }
- return true;
+ return true;
}
void CMPCVideoDecSettingsWnd::OnDisconnect()
{
- m_pMDF.Release();
+ m_pMDF.Release();
}
bool CMPCVideoDecSettingsWnd::OnActivate()
{
- int nPosY = 10;
- GUID* DxvaGui = NULL;
+ int nPosY = 10;
+ GUID* DxvaGui = NULL;
#if HAS_FFMPEG_VIDEO_DECODERS
- m_grpFFMpeg.Create (ResStr (IDS_VDF_FFSETTINGS), WS_VISIBLE|WS_CHILD | BS_GROUPBOX, CRect (5, nPosY, 350, nPosY+150), this, (UINT)IDC_STATIC);
-
- // Decoding threads
- nPosY += VERTICAL_SPACING;
- m_txtThreadNumber.Create (ResStr (IDS_VDF_THREADNUMBER), WS_VISIBLE|WS_CHILD, CRect (LEFT_SPACING, nPosY, 220, nPosY+15), this, (UINT)IDC_STATIC);
- m_cbThreadNumber.Create (WS_VISIBLE|WS_CHILD|CBS_DROPDOWNLIST|WS_VSCROLL, CRect (230, nPosY-4, 345, nPosY+90), this, IDC_PP_THREAD_NUMBER);
- m_cbThreadNumber.AddString(ResStr(IDS_VDF_IDCT_AUTO));
- CString ThreadNumberStr;
- for (int i=0; i<16; i++) {
- ThreadNumberStr.Format(_T("%d"), i+1);
- m_cbThreadNumber.AddString(ThreadNumberStr);
- }
+ m_grpFFMpeg.Create(ResStr(IDS_VDF_FFSETTINGS), WS_VISIBLE | WS_CHILD | BS_GROUPBOX, CRect(5, nPosY, 350, nPosY + 150), this, (UINT)IDC_STATIC);
+
+ // Decoding threads
+ nPosY += VERTICAL_SPACING;
+ m_txtThreadNumber.Create(ResStr(IDS_VDF_THREADNUMBER), WS_VISIBLE | WS_CHILD, CRect(LEFT_SPACING, nPosY, 220, nPosY + 15), this, (UINT)IDC_STATIC);
+ m_cbThreadNumber.Create(WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST | WS_VSCROLL, CRect(230, nPosY - 4, 345, nPosY + 90), this, IDC_PP_THREAD_NUMBER);
+ m_cbThreadNumber.AddString(ResStr(IDS_VDF_IDCT_AUTO));
+ CString ThreadNumberStr;
+ for (int i = 0; i < 16; i++) {
+ ThreadNumberStr.Format(_T("%d"), i + 1);
+ m_cbThreadNumber.AddString(ThreadNumberStr);
+ }
#if INTERNAL_DECODER_H264
- // H264 deblocking mode
- nPosY += VERTICAL_SPACING;
- m_txtDiscardMode.Create (ResStr (IDS_VDF_SKIPDEBLOCK), WS_VISIBLE|WS_CHILD, CRect (LEFT_SPACING, nPosY, 220, nPosY+15), this, (UINT)IDC_STATIC);
- m_cbDiscardMode.Create (WS_VISIBLE|WS_CHILD|CBS_DROPDOWNLIST|WS_VSCROLL, CRect (230, nPosY-4, 345, nPosY+90), this, IDC_PP_DISCARD_MODE);
- m_cbDiscardMode.AddString (ResStr (IDS_VDF_DBLK_NONE));
- m_cbDiscardMode.AddString (ResStr (IDS_VDF_DBLK_DEFAULT));
- m_cbDiscardMode.AddString (ResStr (IDS_VDF_DBLK_NONREF));
- m_cbDiscardMode.AddString (ResStr (IDS_VDF_DBLK_BIDIR));
- m_cbDiscardMode.AddString (ResStr (IDS_VDF_DBLK_NONKFRM));
- m_cbDiscardMode.AddString (ResStr (IDS_VDF_DBLK_ALL));
+ // H264 deblocking mode
+ nPosY += VERTICAL_SPACING;
+ m_txtDiscardMode.Create(ResStr(IDS_VDF_SKIPDEBLOCK), WS_VISIBLE | WS_CHILD, CRect(LEFT_SPACING, nPosY, 220, nPosY + 15), this, (UINT)IDC_STATIC);
+ m_cbDiscardMode.Create(WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST | WS_VSCROLL, CRect(230, nPosY - 4, 345, nPosY + 90), this, IDC_PP_DISCARD_MODE);
+ m_cbDiscardMode.AddString(ResStr(IDS_VDF_DBLK_NONE));
+ m_cbDiscardMode.AddString(ResStr(IDS_VDF_DBLK_DEFAULT));
+ m_cbDiscardMode.AddString(ResStr(IDS_VDF_DBLK_NONREF));
+ m_cbDiscardMode.AddString(ResStr(IDS_VDF_DBLK_BIDIR));
+ m_cbDiscardMode.AddString(ResStr(IDS_VDF_DBLK_NONKFRM));
+ m_cbDiscardMode.AddString(ResStr(IDS_VDF_DBLK_ALL));
#endif /* INTERNAL_DECODER_H264 */
- // Error recognition
- nPosY += VERTICAL_SPACING;
- m_txtErrorRecognition.Create (ResStr (IDS_VDF_ERROR_RECOGNITION), WS_VISIBLE|WS_CHILD, CRect (LEFT_SPACING, nPosY, 220, nPosY+15), this, (UINT)IDC_STATIC);
- m_cbErrorRecognition.Create (WS_VISIBLE|WS_CHILD|CBS_DROPDOWNLIST|WS_VSCROLL, CRect (230, nPosY-4, 345, nPosY+90), this, IDC_PP_DISCARD_MODE);
- m_cbErrorRecognition.AddString (ResStr (IDS_VDF_ERR_CAREFUL));
- m_cbErrorRecognition.AddString (ResStr (IDS_VDF_ERR_COMPLIANT));
- m_cbErrorRecognition.AddString (ResStr (IDS_VDF_ERR_AGGRESSIVE));
-
- // IDCT Algo
- nPosY += VERTICAL_SPACING;
- m_txtIDCTAlgo.Create (ResStr (IDS_VDF_IDCT_ALGO), WS_VISIBLE|WS_CHILD, CRect (LEFT_SPACING, nPosY, 220, nPosY+15), this, (UINT)IDC_STATIC);
- m_cbIDCTAlgo.Create (WS_VISIBLE|WS_CHILD|CBS_DROPDOWNLIST|WS_VSCROLL, CRect (230, nPosY-4, 345, nPosY+90), this, IDC_PP_DISCARD_MODE);
- m_cbIDCTAlgo.AddString (ResStr (IDS_VDF_IDCT_AUTO));
- m_cbIDCTAlgo.AddString (ResStr (IDS_VDF_IDCT_LIBMPEG2));
- m_cbIDCTAlgo.AddString (ResStr (IDS_VDF_IDCT_SIMPLE_MMX));
- m_cbIDCTAlgo.AddString (ResStr (IDS_VDF_IDCT_XVID));
- m_cbIDCTAlgo.AddString (ResStr (IDS_VDF_IDCT_SIMPLE));
-
- nPosY += VERTICAL_SPACING;
- m_cbARMode.Create (ResStr (IDS_VDF_AR_MODE), WS_VISIBLE|WS_CHILD|BS_AUTOCHECKBOX|BS_LEFTTEXT, CRect (LEFT_SPACING, nPosY, 345, nPosY+15), this, IDC_PP_AR);
- m_cbARMode.SetCheck(FALSE);
-
- nPosY = 170;
+ // Error recognition
+ nPosY += VERTICAL_SPACING;
+ m_txtErrorRecognition.Create(ResStr(IDS_VDF_ERROR_RECOGNITION), WS_VISIBLE | WS_CHILD, CRect(LEFT_SPACING, nPosY, 220, nPosY + 15), this, (UINT)IDC_STATIC);
+ m_cbErrorRecognition.Create(WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST | WS_VSCROLL, CRect(230, nPosY - 4, 345, nPosY + 90), this, IDC_PP_DISCARD_MODE);
+ m_cbErrorRecognition.AddString(ResStr(IDS_VDF_ERR_CAREFUL));
+ m_cbErrorRecognition.AddString(ResStr(IDS_VDF_ERR_COMPLIANT));
+ m_cbErrorRecognition.AddString(ResStr(IDS_VDF_ERR_AGGRESSIVE));
+
+ // IDCT Algo
+ nPosY += VERTICAL_SPACING;
+ m_txtIDCTAlgo.Create(ResStr(IDS_VDF_IDCT_ALGO), WS_VISIBLE | WS_CHILD, CRect(LEFT_SPACING, nPosY, 220, nPosY + 15), this, (UINT)IDC_STATIC);
+ m_cbIDCTAlgo.Create(WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST | WS_VSCROLL, CRect(230, nPosY - 4, 345, nPosY + 90), this, IDC_PP_DISCARD_MODE);
+ m_cbIDCTAlgo.AddString(ResStr(IDS_VDF_IDCT_AUTO));
+ m_cbIDCTAlgo.AddString(ResStr(IDS_VDF_IDCT_LIBMPEG2));
+ m_cbIDCTAlgo.AddString(ResStr(IDS_VDF_IDCT_SIMPLE_MMX));
+ m_cbIDCTAlgo.AddString(ResStr(IDS_VDF_IDCT_XVID));
+ m_cbIDCTAlgo.AddString(ResStr(IDS_VDF_IDCT_SIMPLE));
+
+ nPosY += VERTICAL_SPACING;
+ m_cbARMode.Create(ResStr(IDS_VDF_AR_MODE), WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_LEFTTEXT, CRect(LEFT_SPACING, nPosY, 345, nPosY + 15), this, IDC_PP_AR);
+ m_cbARMode.SetCheck(FALSE);
+
+ nPosY = 170;
#endif /* HAS_FFMPEG_VIDEO_DECODERS */
- m_grpDXVA.Create (ResStr (IDS_VDF_DXVA_SETTING), WS_VISIBLE|WS_CHILD | BS_GROUPBOX, CRect (5, nPosY, 350, nPosY+135), this, (UINT)IDC_STATIC);
-
- // DXVA Compatibility check
- nPosY += VERTICAL_SPACING;
- m_txtDXVACompatibilityCheck.Create (ResStr (IDS_VDF_DXVACOMPATIBILITY), WS_VISIBLE|WS_CHILD, CRect (LEFT_SPACING, nPosY, 225, nPosY+15), this, (UINT)IDC_STATIC);
- m_cbDXVACompatibilityCheck.Create (WS_VISIBLE|WS_CHILD|CBS_DROPDOWNLIST|WS_VSCROLL, CRect (230, nPosY-4, 345, nPosY+90), this, IDC_PP_DXVA_CHECK);
- m_cbDXVACompatibilityCheck.AddString(ResStr(IDS_VDF_DXVA_FULLCHECK));
- m_cbDXVACompatibilityCheck.AddString(ResStr(IDS_VDF_DXVA_SKIP_LEVELCHECK));
- m_cbDXVACompatibilityCheck.AddString(ResStr(IDS_VDF_DXVA_SKIP_REFCHECK));
- m_cbDXVACompatibilityCheck.AddString(ResStr(IDS_VDF_DXVA_SKIP_ALLCHECK));
-
- nPosY += VERTICAL_SPACING;
- m_cbDXVA_SD.Create (ResStr (IDS_VDF_DXVA_SD), WS_VISIBLE|WS_CHILD|BS_AUTOCHECKBOX|BS_LEFTTEXT, CRect (LEFT_SPACING, nPosY, 345, nPosY+15), this, IDC_PP_DXVA_SD);
- m_cbDXVA_SD.SetCheck(FALSE);
-
- // DXVA mode
- nPosY += VERTICAL_SPACING;
- m_txtDXVAMode.Create (ResStr (IDS_VDF_DXVA_MODE), WS_VISIBLE|WS_CHILD, CRect (LEFT_SPACING, nPosY, 120, nPosY+15), this, (UINT)IDC_STATIC);
- m_edtDXVAMode.Create (WS_CHILD|WS_VISIBLE|WS_DISABLED, CRect (120, nPosY, 345, nPosY+20), this, 0);
-
- // Video card description
- nPosY += VERTICAL_SPACING;
- m_txtVideoCardDescription.Create (ResStr (IDS_VDF_VIDEOCARD), WS_VISIBLE|WS_CHILD, CRect (LEFT_SPACING, nPosY, 120, nPosY+15), this, (UINT)IDC_STATIC);
- m_edtVideoCardDescription.Create (ES_MULTILINE|WS_CHILD|WS_VISIBLE|WS_DISABLED, CRect (120, nPosY, 345, nPosY+30), this, 0);
- m_edtVideoCardDescription.SetWindowText (m_pMDF->GetVideoCardDescription());
-
-
- DxvaGui = m_pMDF->GetDXVADecoderGuid();
- if (DxvaGui != NULL) {
- CString DXVAMode = GetDXVAMode (DxvaGui);
- m_edtDXVAMode.SetWindowText (DXVAMode);
- } else {
- m_txtDXVAMode.ShowWindow (SW_HIDE);
- m_edtDXVAMode.ShowWindow (SW_HIDE);
- }
-
- for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
- pWnd->SetFont(&m_font, FALSE);
- }
-
- CorrectComboListWidth(m_cbDXVACompatibilityCheck);
+ m_grpDXVA.Create(ResStr(IDS_VDF_DXVA_SETTING), WS_VISIBLE | WS_CHILD | BS_GROUPBOX, CRect(5, nPosY, 350, nPosY + 135), this, (UINT)IDC_STATIC);
+
+ // DXVA Compatibility check
+ nPosY += VERTICAL_SPACING;
+ m_txtDXVACompatibilityCheck.Create(ResStr(IDS_VDF_DXVACOMPATIBILITY), WS_VISIBLE | WS_CHILD, CRect(LEFT_SPACING, nPosY, 225, nPosY + 15), this, (UINT)IDC_STATIC);
+ m_cbDXVACompatibilityCheck.Create(WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST | WS_VSCROLL, CRect(230, nPosY - 4, 345, nPosY + 90), this, IDC_PP_DXVA_CHECK);
+ m_cbDXVACompatibilityCheck.AddString(ResStr(IDS_VDF_DXVA_FULLCHECK));
+ m_cbDXVACompatibilityCheck.AddString(ResStr(IDS_VDF_DXVA_SKIP_LEVELCHECK));
+ m_cbDXVACompatibilityCheck.AddString(ResStr(IDS_VDF_DXVA_SKIP_REFCHECK));
+ m_cbDXVACompatibilityCheck.AddString(ResStr(IDS_VDF_DXVA_SKIP_ALLCHECK));
+
+ nPosY += VERTICAL_SPACING;
+ m_cbDXVA_SD.Create(ResStr(IDS_VDF_DXVA_SD), WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_LEFTTEXT, CRect(LEFT_SPACING, nPosY, 345, nPosY + 15), this, IDC_PP_DXVA_SD);
+ m_cbDXVA_SD.SetCheck(FALSE);
+
+ // DXVA mode
+ nPosY += VERTICAL_SPACING;
+ m_txtDXVAMode.Create(ResStr(IDS_VDF_DXVA_MODE), WS_VISIBLE | WS_CHILD, CRect(LEFT_SPACING, nPosY, 120, nPosY + 15), this, (UINT)IDC_STATIC);
+ m_edtDXVAMode.Create(WS_CHILD | WS_VISIBLE | WS_DISABLED, CRect(120, nPosY, 345, nPosY + 20), this, 0);
+
+ // Video card description
+ nPosY += VERTICAL_SPACING;
+ m_txtVideoCardDescription.Create(ResStr(IDS_VDF_VIDEOCARD), WS_VISIBLE | WS_CHILD, CRect(LEFT_SPACING, nPosY, 120, nPosY + 15), this, (UINT)IDC_STATIC);
+ m_edtVideoCardDescription.Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_DISABLED, CRect(120, nPosY, 345, nPosY + 30), this, 0);
+ m_edtVideoCardDescription.SetWindowText(m_pMDF->GetVideoCardDescription());
+
+
+ DxvaGui = m_pMDF->GetDXVADecoderGuid();
+ if (DxvaGui != NULL) {
+ CString DXVAMode = GetDXVAMode(DxvaGui);
+ m_edtDXVAMode.SetWindowText(DXVAMode);
+ } else {
+ m_txtDXVAMode.ShowWindow(SW_HIDE);
+ m_edtDXVAMode.ShowWindow(SW_HIDE);
+ }
+
+ for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
+ pWnd->SetFont(&m_font, FALSE);
+ }
+
+ CorrectComboListWidth(m_cbDXVACompatibilityCheck);
#if INTERNAL_DECODER_H264
- CorrectComboListWidth(m_cbDiscardMode);
+ CorrectComboListWidth(m_cbDiscardMode);
#endif
- if (m_pMDF) {
+ if (m_pMDF) {
#if HAS_FFMPEG_VIDEO_DECODERS
#if INTERNAL_DECODER_H264
- m_cbThreadNumber.SetCurSel (m_pMDF->GetThreadNumber());
- m_cbDiscardMode.SetCurSel (FindDiscardIndex (m_pMDF->GetDiscardMode()));
+ m_cbThreadNumber.SetCurSel(m_pMDF->GetThreadNumber());
+ m_cbDiscardMode.SetCurSel(FindDiscardIndex(m_pMDF->GetDiscardMode()));
#endif
- m_cbErrorRecognition.SetCurSel (FindErrRecognitionIndex (m_pMDF->GetErrorRecognition()));
- m_cbIDCTAlgo.SetCurSel (m_pMDF->GetIDCTAlgo());
+ m_cbErrorRecognition.SetCurSel(FindErrRecognitionIndex(m_pMDF->GetErrorRecognition()));
+ m_cbIDCTAlgo.SetCurSel(m_pMDF->GetIDCTAlgo());
- m_cbARMode.SetCheck(m_pMDF->GetARMode());
+ m_cbARMode.SetCheck(m_pMDF->GetARMode());
#endif /* HAS_FFMPEG_VIDEO_DECODERS */
- m_cbDXVACompatibilityCheck.SetCurSel(m_pMDF->GetDXVACheckCompatibility());
- m_cbDXVA_SD.SetCheck(m_pMDF->GetDXVA_SD());
- }
+ m_cbDXVACompatibilityCheck.SetCurSel(m_pMDF->GetDXVACheckCompatibility());
+ m_cbDXVA_SD.SetCheck(m_pMDF->GetDXVA_SD());
+ }
- return true;
+ return true;
}
void CMPCVideoDecSettingsWnd::OnDeactivate()
@@ -226,28 +226,28 @@ void CMPCVideoDecSettingsWnd::OnDeactivate()
bool CMPCVideoDecSettingsWnd::OnApply()
{
- OnDeactivate();
+ OnDeactivate();
- if (m_pMDF && m_cbDXVACompatibilityCheck.m_hWnd) {
+ if (m_pMDF && m_cbDXVACompatibilityCheck.m_hWnd) {
#if HAS_FFMPEG_VIDEO_DECODERS
#if INTERNAL_DECODER_H264
- m_pMDF->SetThreadNumber (m_cbThreadNumber.GetCurSel());
- m_pMDF->SetDiscardMode (g_AVDiscard[m_cbDiscardMode.GetCurSel()]);
+ m_pMDF->SetThreadNumber(m_cbThreadNumber.GetCurSel());
+ m_pMDF->SetDiscardMode(g_AVDiscard[m_cbDiscardMode.GetCurSel()]);
#endif /* INTERNAL_DECODER_H264 */
- m_pMDF->SetErrorRecognition (g_AVErrRecognition[m_cbErrorRecognition.GetCurSel()]);
- m_pMDF->SetIDCTAlgo (m_cbIDCTAlgo.GetCurSel());
+ m_pMDF->SetErrorRecognition(g_AVErrRecognition[m_cbErrorRecognition.GetCurSel()]);
+ m_pMDF->SetIDCTAlgo(m_cbIDCTAlgo.GetCurSel());
- m_pMDF->SetARMode(m_cbARMode.GetCheck());
+ m_pMDF->SetARMode(m_cbARMode.GetCheck());
#endif /* HAS_FFMPEG_VIDEO_DECODERS */
- m_pMDF->SetDXVACheckCompatibility(m_cbDXVACompatibilityCheck.GetCurSel());
+ m_pMDF->SetDXVACheckCompatibility(m_cbDXVACompatibilityCheck.GetCurSel());
- m_pMDF->SetDXVA_SD(m_cbDXVA_SD.GetCheck());
+ m_pMDF->SetDXVA_SD(m_cbDXVA_SD.GetCheck());
- m_pMDF->Apply();
- }
+ m_pMDF->Apply();
+ }
- return true;
+ return true;
}
@@ -263,99 +263,99 @@ CMPCVideoDecCodecWnd::CMPCVideoDecCodecWnd()
bool CMPCVideoDecCodecWnd::OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks)
{
- ASSERT(!m_pMDF);
+ ASSERT(!m_pMDF);
- m_pMDF.Release();
+ m_pMDF.Release();
- POSITION pos = pUnks.GetHeadPosition();
- while (pos && !(m_pMDF = pUnks.GetNext(pos))) {
- ;
- }
+ POSITION pos = pUnks.GetHeadPosition();
+ while (pos && !(m_pMDF = pUnks.GetNext(pos))) {
+ ;
+ }
- if (!m_pMDF) {
- return false;
- }
+ if (!m_pMDF) {
+ return false;
+ }
- return true;
+ return true;
}
void CMPCVideoDecCodecWnd::OnDisconnect()
{
- m_pMDF.Release();
+ m_pMDF.Release();
}
bool CMPCVideoDecCodecWnd::OnActivate()
{
- DWORD dwStyle = WS_VISIBLE|WS_CHILD|WS_BORDER;
- int nPos = 0;
- MPC_VIDEO_CODEC nActiveCodecs = (MPC_VIDEO_CODEC)(m_pMDF ? m_pMDF->GetActiveCodecs() : 0);
+ DWORD dwStyle = WS_VISIBLE | WS_CHILD | WS_BORDER;
+ int nPos = 0;
+ MPC_VIDEO_CODEC nActiveCodecs = (MPC_VIDEO_CODEC)(m_pMDF ? m_pMDF->GetActiveCodecs() : 0);
- m_grpSelectedCodec.Create (_T("Selected codecs"), WS_VISIBLE|WS_CHILD | BS_GROUPBOX, CRect (10, 10, 330, 280), this, (UINT)IDC_STATIC);
+ m_grpSelectedCodec.Create(_T("Selected codecs"), WS_VISIBLE | WS_CHILD | BS_GROUPBOX, CRect(10, 10, 330, 280), this, (UINT)IDC_STATIC);
- m_lstCodecs.Create (dwStyle | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP, CRect (20,30, 320, 270), this, 0);
+ m_lstCodecs.Create(dwStyle | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP, CRect(20, 30, 320, 270), this, 0);
#if INTERNAL_DECODER_H264_DXVA
- m_lstCodecs.AddString (_T("H.264/AVC (DXVA)"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_H264_DXVA) != 0);
+ m_lstCodecs.AddString(_T("H.264/AVC (DXVA)"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_H264_DXVA) != 0);
#endif
#if INTERNAL_DECODER_VC1_DXVA
- m_lstCodecs.AddString (_T("VC1 (DXVA)"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_VC1_DXVA) != 0);
+ m_lstCodecs.AddString(_T("VC1 (DXVA)"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_VC1_DXVA) != 0);
#endif
#if INTERNAL_DECODER_WMV3_DXVA
- m_lstCodecs.AddString (_T("WMV3 (DXVA)"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_WMV3_DXVA) != 0);
+ m_lstCodecs.AddString(_T("WMV3 (DXVA)"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_WMV3_DXVA) != 0);
#endif
#if INTERNAL_DECODER_MPEG2_DXVA
- m_lstCodecs.AddString (_T("MPEG2 (DXVA)"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_MPEG2_DXVA) != 0);
+ m_lstCodecs.AddString(_T("MPEG2 (DXVA)"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_MPEG2_DXVA) != 0);
#endif
#if INTERNAL_DECODER_H264
- m_lstCodecs.AddString (_T("H.264/AVC (FFmpeg)"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_H264) != 0);
+ m_lstCodecs.AddString(_T("H.264/AVC (FFmpeg)"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_H264) != 0);
#endif
#if INTERNAL_DECODER_VC1
- m_lstCodecs.AddString (_T("VC1 (FFmpeg)"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_VC1) != 0);
+ m_lstCodecs.AddString(_T("VC1 (FFmpeg)"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_VC1) != 0);
#endif
#if HAS_FFMPEG_VIDEO_DECODERS
- m_lstCodecs.AddString (_T("Xvid/MPEG-4"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_XVID) != 0);
- m_lstCodecs.AddString (_T("DivX"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_DIVX) != 0);
- m_lstCodecs.AddString (_T("MS-MPEG4"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_MSMPEG4) != 0);
- m_lstCodecs.AddString (_T("FLV1/4"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_FLASH) != 0);
- m_lstCodecs.AddString (_T("VP3/5/6"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_VP356) != 0);
- m_lstCodecs.AddString (_T("VP8"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_VP8) != 0);
- m_lstCodecs.AddString (_T("WMV1/2/3"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_WMV) != 0);
- m_lstCodecs.AddString (_T("H.263"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_H263) != 0);
- m_lstCodecs.AddString (_T("SVQ1/3"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_SVQ3) != 0);
- m_lstCodecs.AddString (_T("AMV video"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_AMVV) != 0);
- m_lstCodecs.AddString (_T("Theora"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_THEORA) != 0);
- m_lstCodecs.AddString (_T("MJPEG"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_MJPEG) != 0);
- m_lstCodecs.AddString (_T("Indeo 3/4/5"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_INDEO) != 0);
- m_lstCodecs.AddString (_T("Real Video"));
- m_lstCodecs.SetCheck (nPos++, (nActiveCodecs & MPCVD_RV) != 0);
+ m_lstCodecs.AddString(_T("Xvid/MPEG-4"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_XVID) != 0);
+ m_lstCodecs.AddString(_T("DivX"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_DIVX) != 0);
+ m_lstCodecs.AddString(_T("MS-MPEG4"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_MSMPEG4) != 0);
+ m_lstCodecs.AddString(_T("FLV1/4"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_FLASH) != 0);
+ m_lstCodecs.AddString(_T("VP3/5/6"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_VP356) != 0);
+ m_lstCodecs.AddString(_T("VP8"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_VP8) != 0);
+ m_lstCodecs.AddString(_T("WMV1/2/3"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_WMV) != 0);
+ m_lstCodecs.AddString(_T("H.263"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_H263) != 0);
+ m_lstCodecs.AddString(_T("SVQ1/3"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_SVQ3) != 0);
+ m_lstCodecs.AddString(_T("AMV video"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_AMVV) != 0);
+ m_lstCodecs.AddString(_T("Theora"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_THEORA) != 0);
+ m_lstCodecs.AddString(_T("MJPEG"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_MJPEG) != 0);
+ m_lstCodecs.AddString(_T("Indeo 3/4/5"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_INDEO) != 0);
+ m_lstCodecs.AddString(_T("Real Video"));
+ m_lstCodecs.SetCheck(nPos++, (nActiveCodecs & MPCVD_RV) != 0);
#endif
- for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
- pWnd->SetFont(&m_font, FALSE);
- }
+ for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
+ pWnd->SetFont(&m_font, FALSE);
+ }
- return true;
+ return true;
}
void CMPCVideoDecCodecWnd::OnDeactivate()
@@ -364,92 +364,92 @@ void CMPCVideoDecCodecWnd::OnDeactivate()
bool CMPCVideoDecCodecWnd::OnApply()
{
- OnDeactivate();
+ OnDeactivate();
- if (m_pMDF) {
- int nActiveCodecs = 0;
- int nPos = 0;
+ if (m_pMDF) {
+ int nActiveCodecs = 0;
+ int nPos = 0;
#if INTERNAL_DECODER_H264_DXVA
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_H264_DXVA;
- }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_H264_DXVA;
+ }
#endif
#if INTERNAL_DECODER_VC1_DXVA
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_VC1_DXVA;
- }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_VC1_DXVA;
+ }
#endif
#if INTERNAL_DECODER_WMV3_DXVA
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_WMV3_DXVA;
- }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_WMV3_DXVA;
+ }
#endif
#if INTERNAL_DECODER_MPEG2_DXVA
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_MPEG2_DXVA;
- }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_MPEG2_DXVA;
+ }
#endif
#if INTERNAL_DECODER_H264
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_H264;
- }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_H264;
+ }
#endif
#if INTERNAL_DECODER_VC1
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_VC1;
- }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_VC1;
+ }
#endif
#if HAS_FFMPEG_VIDEO_DECODERS
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_XVID;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_DIVX;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_MSMPEG4;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_FLASH;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_VP356;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_VP8;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_WMV;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_H263;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_SVQ3;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_AMVV;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_THEORA;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_MJPEG;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_INDEO;
- }
- if (m_lstCodecs.GetCheck (nPos++)) {
- nActiveCodecs |= MPCVD_RV;
- }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_XVID;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_DIVX;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_MSMPEG4;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_FLASH;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_VP356;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_VP8;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_WMV;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_H263;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_SVQ3;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_AMVV;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_THEORA;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_MJPEG;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_INDEO;
+ }
+ if (m_lstCodecs.GetCheck(nPos++)) {
+ nActiveCodecs |= MPCVD_RV;
+ }
#endif
- m_pMDF->SetActiveCodecs ((MPC_VIDEO_CODEC)nActiveCodecs);
+ m_pMDF->SetActiveCodecs((MPC_VIDEO_CODEC)nActiveCodecs);
- m_pMDF->Apply();
- }
+ m_pMDF->Apply();
+ }
- return true;
+ return true;
}
diff --git a/src/filters/transform/MPCVideoDec/MPCVideoDecSettingsWnd.h b/src/filters/transform/MPCVideoDec/MPCVideoDecSettingsWnd.h
index a035b2436..54e6f5bfd 100644
--- a/src/filters/transform/MPCVideoDec/MPCVideoDecSettingsWnd.h
+++ b/src/filters/transform/MPCVideoDec/MPCVideoDecSettingsWnd.h
@@ -27,87 +27,87 @@
#include <afxcmn.h>
class __declspec(uuid("D5AA0389-D274-48e1-BF50-ACB05A56DDE0"))
- CMPCVideoDecSettingsWnd : public CInternalPropertyPageWnd
+ CMPCVideoDecSettingsWnd : public CInternalPropertyPageWnd
{
- CComQIPtr<IMPCVideoDecFilter> m_pMDF;
-
- CButton m_grpFFMpeg;
- CStatic m_txtThreadNumber;
- CComboBox m_cbThreadNumber;
- CStatic m_txtDiscardMode;
- CComboBox m_cbDiscardMode;
- CStatic m_txtErrorRecognition;
- CComboBox m_cbErrorRecognition;
- CStatic m_txtIDCTAlgo;
- CComboBox m_cbIDCTAlgo;
-
- CButton m_grpDXVA;
- CStatic m_txtDXVAMode;
- CEdit m_edtDXVAMode;
- CStatic m_txtVideoCardDescription;
- CEdit m_edtVideoCardDescription;
-
- CButton m_cbARMode;
-
- CStatic m_txtDXVACompatibilityCheck;
- CComboBox m_cbDXVACompatibilityCheck;
-
- CButton m_cbDXVA_SD;
-
- enum {
- IDC_PP_THREAD_NUMBER = 10000,
- IDC_PP_ENABLE_DEBLOCKING,
- IDC_PP_DISCARD_MODE,
- IDC_PP_ERROR_RECOGNITION,
- IDC_PP_AR,
- IDC_PP_DXVA_CHECK,
- IDC_PP_DXVA_SD
- };
+ CComQIPtr<IMPCVideoDecFilter> m_pMDF;
+
+ CButton m_grpFFMpeg;
+ CStatic m_txtThreadNumber;
+ CComboBox m_cbThreadNumber;
+ CStatic m_txtDiscardMode;
+ CComboBox m_cbDiscardMode;
+ CStatic m_txtErrorRecognition;
+ CComboBox m_cbErrorRecognition;
+ CStatic m_txtIDCTAlgo;
+ CComboBox m_cbIDCTAlgo;
+
+ CButton m_grpDXVA;
+ CStatic m_txtDXVAMode;
+ CEdit m_edtDXVAMode;
+ CStatic m_txtVideoCardDescription;
+ CEdit m_edtVideoCardDescription;
+
+ CButton m_cbARMode;
+
+ CStatic m_txtDXVACompatibilityCheck;
+ CComboBox m_cbDXVACompatibilityCheck;
+
+ CButton m_cbDXVA_SD;
+
+ enum {
+ IDC_PP_THREAD_NUMBER = 10000,
+ IDC_PP_ENABLE_DEBLOCKING,
+ IDC_PP_DISCARD_MODE,
+ IDC_PP_ERROR_RECOGNITION,
+ IDC_PP_AR,
+ IDC_PP_DXVA_CHECK,
+ IDC_PP_DXVA_SD
+ };
public:
- CMPCVideoDecSettingsWnd();
-
- bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
- void OnDisconnect();
- bool OnActivate();
- void OnDeactivate();
- bool OnApply();
-
- static LPCTSTR GetWindowTitle() {
- return _T("Settings");
- }
- static CSize GetWindowSize() {
- return CSize(350, 325);
- }
-
- DECLARE_MESSAGE_MAP()
+ CMPCVideoDecSettingsWnd();
+
+ bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
+ void OnDisconnect();
+ bool OnActivate();
+ void OnDeactivate();
+ bool OnApply();
+
+ static LPCTSTR GetWindowTitle() {
+ return _T("Settings");
+ }
+ static CSize GetWindowSize() {
+ return CSize(350, 325);
+ }
+
+ DECLARE_MESSAGE_MAP()
};
class __declspec(uuid("3C395D46-8B0F-440d-B962-2F4A97355453"))
- CMPCVideoDecCodecWnd : public CInternalPropertyPageWnd
+ CMPCVideoDecCodecWnd : public CInternalPropertyPageWnd
{
- CComQIPtr<IMPCVideoDecFilter> m_pMDF;
+ CComQIPtr<IMPCVideoDecFilter> m_pMDF;
- CButton m_grpSelectedCodec;
- CCheckListBox m_lstCodecs;
- CImageList m_onoff;
+ CButton m_grpSelectedCodec;
+ CCheckListBox m_lstCodecs;
+ CImageList m_onoff;
public:
- CMPCVideoDecCodecWnd();
-
- bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
- void OnDisconnect();
- bool OnActivate();
- void OnDeactivate();
- bool OnApply();
-
- static LPCTSTR GetWindowTitle() {
- return _T("Codecs");
- }
- static CSize GetWindowSize() {
- return CSize(350, 300);
- }
-
- DECLARE_MESSAGE_MAP()
+ CMPCVideoDecCodecWnd();
+
+ bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
+ void OnDisconnect();
+ bool OnActivate();
+ void OnDeactivate();
+ bool OnApply();
+
+ static LPCTSTR GetWindowTitle() {
+ return _T("Codecs");
+ }
+ static CSize GetWindowSize() {
+ return CSize(350, 300);
+ }
+
+ DECLARE_MESSAGE_MAP()
};
diff --git a/src/filters/transform/MPCVideoDec/TlibavcodecExt.cpp b/src/filters/transform/MPCVideoDec/TlibavcodecExt.cpp
index 47a7e3c22..383c0c08b 100644
--- a/src/filters/transform/MPCVideoDec/TlibavcodecExt.cpp
+++ b/src/filters/transform/MPCVideoDec/TlibavcodecExt.cpp
@@ -27,34 +27,34 @@
#include "TlibavcodecExt.h"
-void TlibavcodecExt::ConnectTo(AVCodecContext *pAVCtx)
+void TlibavcodecExt::ConnectTo(AVCodecContext* pAVCtx)
{
- pAVCtx->opaque = this;
- pAVCtx->get_buffer = get_buffer;
- pAVCtx->reget_buffer = reget_buffer;
- pAVCtx->release_buffer = release_buffer;
+ pAVCtx->opaque = this;
+ pAVCtx->get_buffer = get_buffer;
+ pAVCtx->reget_buffer = reget_buffer;
+ pAVCtx->release_buffer = release_buffer;
}
-int TlibavcodecExt::get_buffer(AVCodecContext *c, AVFrame *pic)
+int TlibavcodecExt::get_buffer(AVCodecContext* c, AVFrame* pic)
{
- int ret=c->opaque->ff_avcodec_default_get_buffer(c,pic);
- if (ret==0) {
- c->opaque->OnGetBuffer(pic);
- }
- return ret;
+ int ret = c->opaque->ff_avcodec_default_get_buffer(c, pic);
+ if (ret == 0) {
+ c->opaque->OnGetBuffer(pic);
+ }
+ return ret;
}
-int TlibavcodecExt::reget_buffer(AVCodecContext *c, AVFrame *pic)
+int TlibavcodecExt::reget_buffer(AVCodecContext* c, AVFrame* pic)
{
- int ret=c->opaque->ff_avcodec_default_reget_buffer(c,pic);
- if (ret==0) {
- c->opaque->OnRegetBuffer(pic);
- }
- return ret;
+ int ret = c->opaque->ff_avcodec_default_reget_buffer(c, pic);
+ if (ret == 0) {
+ c->opaque->OnRegetBuffer(pic);
+ }
+ return ret;
}
-void TlibavcodecExt::release_buffer(AVCodecContext *c, AVFrame *pic)
+void TlibavcodecExt::release_buffer(AVCodecContext* c, AVFrame* pic)
{
- c->opaque->ff_avcodec_default_release_buffer(c,pic);
- c->opaque->OnReleaseBuffer(pic);
+ c->opaque->ff_avcodec_default_release_buffer(c, pic);
+ c->opaque->OnReleaseBuffer(pic);
}
diff --git a/src/filters/transform/MPCVideoDec/TlibavcodecExt.h b/src/filters/transform/MPCVideoDec/TlibavcodecExt.h
index 5d862f8a2..19d05c353 100644
--- a/src/filters/transform/MPCVideoDec/TlibavcodecExt.h
+++ b/src/filters/transform/MPCVideoDec/TlibavcodecExt.h
@@ -26,25 +26,25 @@
struct AVCodecContext;
struct AVFrame;
-typedef int (*FUNC_AV_DEFAULT_GET_BUFFER)(AVCodecContext *s, AVFrame *pic);
-typedef void (*FUNC_AV_DEFAULT_RELEASE_BUFFER)(AVCodecContext *s, AVFrame *pic);
-typedef int (*FUNC_AV_DEFAULT_REGET_BUFFER)(AVCodecContext *s, AVFrame *pic);
+typedef int (*FUNC_AV_DEFAULT_GET_BUFFER)(AVCodecContext* s, AVFrame* pic);
+typedef void (*FUNC_AV_DEFAULT_RELEASE_BUFFER)(AVCodecContext* s, AVFrame* pic);
+typedef int (*FUNC_AV_DEFAULT_REGET_BUFFER)(AVCodecContext* s, AVFrame* pic);
struct TlibavcodecExt {
protected:
- static int get_buffer(AVCodecContext *s, AVFrame *pic);
- static void release_buffer(AVCodecContext *s, AVFrame *pic);
- static int reget_buffer(AVCodecContext *s, AVFrame *pic);
+ static int get_buffer(AVCodecContext* s, AVFrame* pic);
+ static void release_buffer(AVCodecContext* s, AVFrame* pic);
+ static int reget_buffer(AVCodecContext* s, AVFrame* pic);
- FUNC_AV_DEFAULT_GET_BUFFER ff_avcodec_default_get_buffer;
- FUNC_AV_DEFAULT_RELEASE_BUFFER ff_avcodec_default_release_buffer;
- FUNC_AV_DEFAULT_REGET_BUFFER ff_avcodec_default_reget_buffer;
+ FUNC_AV_DEFAULT_GET_BUFFER ff_avcodec_default_get_buffer;
+ FUNC_AV_DEFAULT_RELEASE_BUFFER ff_avcodec_default_release_buffer;
+ FUNC_AV_DEFAULT_REGET_BUFFER ff_avcodec_default_reget_buffer;
public:
- virtual ~TlibavcodecExt() {}
- void ConnectTo(AVCodecContext *pAVCtx);
- virtual void OnGetBuffer(AVFrame *pic) {}
- virtual void OnRegetBuffer(AVFrame *pic) {}
- virtual void OnReleaseBuffer(AVFrame *pic) {}
+ virtual ~TlibavcodecExt() {}
+ void ConnectTo(AVCodecContext* pAVCtx);
+ virtual void OnGetBuffer(AVFrame* pic) {}
+ virtual void OnRegetBuffer(AVFrame* pic) {}
+ virtual void OnReleaseBuffer(AVFrame* pic) {}
};
diff --git a/src/filters/transform/MPCVideoDec/VideoDecDXVAAllocator.cpp b/src/filters/transform/MPCVideoDec/VideoDecDXVAAllocator.cpp
index d7c0a2af7..3119dd29a 100644
--- a/src/filters/transform/MPCVideoDec/VideoDecDXVAAllocator.cpp
+++ b/src/filters/transform/MPCVideoDec/VideoDecDXVAAllocator.cpp
@@ -26,182 +26,182 @@
#include "MPCVideoDecFilter.h"
-CDXVA2Sample::CDXVA2Sample(CVideoDecDXVAAllocator *pAlloc, HRESULT *phr)
- : CMediaSample(NAME("CDXVA2Sample"), (CBaseAllocator*)pAlloc, phr, NULL, 0)
- , m_dwSurfaceId(0)
+CDXVA2Sample::CDXVA2Sample(CVideoDecDXVAAllocator* pAlloc, HRESULT* phr)
+ : CMediaSample(NAME("CDXVA2Sample"), (CBaseAllocator*)pAlloc, phr, NULL, 0)
+ , m_dwSurfaceId(0)
{
}
//Note: CMediaSample does not derive from CUnknown, so we cannot use the
-// DECLARE_IUNKNOWN macro that is used by most of the filter classes.
+// DECLARE_IUNKNOWN macro that is used by most of the filter classes.
-STDMETHODIMP CDXVA2Sample::QueryInterface(REFIID riid, __deref_out void **ppv)
+STDMETHODIMP CDXVA2Sample::QueryInterface(REFIID riid, __deref_out void** ppv)
{
- CheckPointer(ppv,E_POINTER);
- ValidateReadWritePtr(ppv,sizeof(PVOID));
-
- if (riid == __uuidof(IMFGetService)) {
- return GetInterface((IMFGetService*) this, ppv);
- }
- if (riid == __uuidof(IMPCDXVA2Sample)) {
- return GetInterface((IMPCDXVA2Sample*) this, ppv);
- } else {
- return CMediaSample::QueryInterface(riid, ppv);
- }
+ CheckPointer(ppv, E_POINTER);
+ ValidateReadWritePtr(ppv, sizeof(PVOID));
+
+ if (riid == __uuidof(IMFGetService)) {
+ return GetInterface((IMFGetService*) this, ppv);
+ }
+ if (riid == __uuidof(IMPCDXVA2Sample)) {
+ return GetInterface((IMPCDXVA2Sample*) this, ppv);
+ } else {
+ return CMediaSample::QueryInterface(riid, ppv);
+ }
}
STDMETHODIMP_(ULONG) CDXVA2Sample::AddRef()
{
- return __super::AddRef();
+ return __super::AddRef();
}
STDMETHODIMP_(ULONG) CDXVA2Sample::Release()
{
- // Return a temporary variable for thread safety.
- ULONG cRef = __super::Release();
- return cRef;
+ // Return a temporary variable for thread safety.
+ ULONG cRef = __super::Release();
+ return cRef;
}
// IMFGetService::GetService
-STDMETHODIMP CDXVA2Sample::GetService(REFGUID guidService, REFIID riid, LPVOID *ppv)
+STDMETHODIMP CDXVA2Sample::GetService(REFGUID guidService, REFIID riid, LPVOID* ppv)
{
- if (guidService != MR_BUFFER_SERVICE) {
- return MF_E_UNSUPPORTED_SERVICE;
- } else if (m_pSurface == NULL) {
- return E_NOINTERFACE;
- } else {
- return m_pSurface->QueryInterface(riid, ppv);
- }
+ if (guidService != MR_BUFFER_SERVICE) {
+ return MF_E_UNSUPPORTED_SERVICE;
+ } else if (m_pSurface == NULL) {
+ return E_NOINTERFACE;
+ } else {
+ return m_pSurface->QueryInterface(riid, ppv);
+ }
}
// Override GetPointer because this class does not manage a system memory buffer.
// The EVR uses the MR_BUFFER_SERVICE service to get the Direct3D surface.
-STDMETHODIMP CDXVA2Sample::GetPointer(BYTE ** ppBuffer)
+STDMETHODIMP CDXVA2Sample::GetPointer(BYTE** ppBuffer)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// Sets the pointer to the Direct3D surface.
-void CDXVA2Sample::SetSurface(DWORD surfaceId, IDirect3DSurface9 *pSurf)
+void CDXVA2Sample::SetSurface(DWORD surfaceId, IDirect3DSurface9* pSurf)
{
- m_pSurface = pSurf;
- m_dwSurfaceId = surfaceId;
+ m_pSurface = pSurf;
+ m_dwSurfaceId = surfaceId;
}
STDMETHODIMP_(int) CDXVA2Sample::GetDXSurfaceId()
{
- return m_dwSurfaceId;
+ return m_dwSurfaceId;
}
CVideoDecDXVAAllocator::CVideoDecDXVAAllocator(CMPCVideoDecFilter* pVideoDecFilter, HRESULT* phr)
- : CBaseAllocator(NAME("CVideoDecDXVAAllocator"), NULL, phr)
+ : CBaseAllocator(NAME("CVideoDecDXVAAllocator"), NULL, phr)
{
- m_pVideoDecFilter = pVideoDecFilter;
- m_ppRTSurfaceArray = NULL;
+ m_pVideoDecFilter = pVideoDecFilter;
+ m_ppRTSurfaceArray = NULL;
}
CVideoDecDXVAAllocator::~CVideoDecDXVAAllocator()
{
- Free();
+ Free();
}
HRESULT CVideoDecDXVAAllocator::Alloc()
{
- HRESULT hr;
- CComPtr<IDirectXVideoAccelerationService> pDXVA2Service;
-
- CheckPointer(m_pVideoDecFilter->m_pDeviceManager, E_UNEXPECTED);
- hr = m_pVideoDecFilter->m_pDeviceManager->GetVideoService (m_pVideoDecFilter->m_hDevice, IID_IDirectXVideoAccelerationService, (void**)&pDXVA2Service);
- CheckPointer (pDXVA2Service, E_UNEXPECTED);
- CAutoLock lock(this);
-
-
- hr = __super::Alloc();
-
- if (SUCCEEDED(hr)) {
- // Free the old resources.
- Free();
-
- m_nSurfaceArrayCount = m_lCount;
-
- // Allocate a new array of pointers.
- m_ppRTSurfaceArray = DNew IDirect3DSurface9*[m_lCount];
- if (m_ppRTSurfaceArray == NULL) {
- hr = E_OUTOFMEMORY;
- } else {
- ZeroMemory(m_ppRTSurfaceArray, sizeof(IDirect3DSurface9*) * m_lCount);
- }
- }
-
- // Allocate the surfaces.
- D3DFORMAT m_dwFormat = m_pVideoDecFilter->m_VideoDesc.Format;
- if (SUCCEEDED(hr)) {
- hr = pDXVA2Service->CreateSurface(
- m_pVideoDecFilter->PictWidthRounded(),
- m_pVideoDecFilter->PictHeightRounded(),
- m_lCount - 1,
- (D3DFORMAT)m_dwFormat,
- D3DPOOL_DEFAULT,
- 0,
- DXVA2_VideoDecoderRenderTarget,
- m_ppRTSurfaceArray,
- NULL
- );
- }
-
- if (SUCCEEDED(hr)) {
- // Important : create samples in reverse order !
- for (m_lAllocated = m_lCount-1; m_lAllocated >= 0; m_lAllocated--) {
- CDXVA2Sample *pSample = DNew CDXVA2Sample(this, &hr);
- if (pSample == NULL) {
- hr = E_OUTOFMEMORY;
- break;
- }
- if (FAILED(hr)) {
- break;
- }
- // Assign the Direct3D surface pointer and the index.
- pSample->SetSurface(m_lAllocated, m_ppRTSurfaceArray[m_lAllocated]);
-
- // Add to the sample list.
- m_lFree.Add(pSample);
- }
-
- hr = m_pVideoDecFilter->CreateDXVA2Decoder (m_lCount, m_ppRTSurfaceArray);
- if (FAILED (hr)) {
- Free();
- }
- }
-
- if (SUCCEEDED(hr)) {
- m_bChanged = FALSE;
- }
- return hr;
+ HRESULT hr;
+ CComPtr<IDirectXVideoAccelerationService> pDXVA2Service;
+
+ CheckPointer(m_pVideoDecFilter->m_pDeviceManager, E_UNEXPECTED);
+ hr = m_pVideoDecFilter->m_pDeviceManager->GetVideoService(m_pVideoDecFilter->m_hDevice, IID_IDirectXVideoAccelerationService, (void**)&pDXVA2Service);
+ CheckPointer(pDXVA2Service, E_UNEXPECTED);
+ CAutoLock lock(this);
+
+
+ hr = __super::Alloc();
+
+ if (SUCCEEDED(hr)) {
+ // Free the old resources.
+ Free();
+
+ m_nSurfaceArrayCount = m_lCount;
+
+ // Allocate a new array of pointers.
+ m_ppRTSurfaceArray = DNew IDirect3DSurface9 * [m_lCount];
+ if (m_ppRTSurfaceArray == NULL) {
+ hr = E_OUTOFMEMORY;
+ } else {
+ ZeroMemory(m_ppRTSurfaceArray, sizeof(IDirect3DSurface9*) * m_lCount);
+ }
+ }
+
+ // Allocate the surfaces.
+ D3DFORMAT m_dwFormat = m_pVideoDecFilter->m_VideoDesc.Format;
+ if (SUCCEEDED(hr)) {
+ hr = pDXVA2Service->CreateSurface(
+ m_pVideoDecFilter->PictWidthRounded(),
+ m_pVideoDecFilter->PictHeightRounded(),
+ m_lCount - 1,
+ (D3DFORMAT)m_dwFormat,
+ D3DPOOL_DEFAULT,
+ 0,
+ DXVA2_VideoDecoderRenderTarget,
+ m_ppRTSurfaceArray,
+ NULL
+ );
+ }
+
+ if (SUCCEEDED(hr)) {
+ // Important : create samples in reverse order !
+ for (m_lAllocated = m_lCount - 1; m_lAllocated >= 0; m_lAllocated--) {
+ CDXVA2Sample* pSample = DNew CDXVA2Sample(this, &hr);
+ if (pSample == NULL) {
+ hr = E_OUTOFMEMORY;
+ break;
+ }
+ if (FAILED(hr)) {
+ break;
+ }
+ // Assign the Direct3D surface pointer and the index.
+ pSample->SetSurface(m_lAllocated, m_ppRTSurfaceArray[m_lAllocated]);
+
+ // Add to the sample list.
+ m_lFree.Add(pSample);
+ }
+
+ hr = m_pVideoDecFilter->CreateDXVA2Decoder(m_lCount, m_ppRTSurfaceArray);
+ if (FAILED(hr)) {
+ Free();
+ }
+ }
+
+ if (SUCCEEDED(hr)) {
+ m_bChanged = FALSE;
+ }
+ return hr;
}
void CVideoDecDXVAAllocator::Free()
{
- CMediaSample *pSample = NULL;
-
- m_pVideoDecFilter->FlushDXVADecoder();
- // m_FreeSurface.RemoveAll();
- do {
- pSample = m_lFree.RemoveHead();
- if (pSample) {
- delete pSample;
- }
- } while (pSample);
-
- if (m_ppRTSurfaceArray) {
- for (UINT i = 0; i < m_nSurfaceArrayCount; i++) {
- if (m_ppRTSurfaceArray[i] != NULL) {
- m_ppRTSurfaceArray[i]->Release();
- }
- }
-
- delete [] m_ppRTSurfaceArray;
- m_ppRTSurfaceArray = NULL;
- }
- m_lAllocated = 0;
- m_nSurfaceArrayCount = 0;
+ CMediaSample* pSample = NULL;
+
+ m_pVideoDecFilter->FlushDXVADecoder();
+ // m_FreeSurface.RemoveAll();
+ do {
+ pSample = m_lFree.RemoveHead();
+ if (pSample) {
+ delete pSample;
+ }
+ } while (pSample);
+
+ if (m_ppRTSurfaceArray) {
+ for (UINT i = 0; i < m_nSurfaceArrayCount; i++) {
+ if (m_ppRTSurfaceArray[i] != NULL) {
+ m_ppRTSurfaceArray[i]->Release();
+ }
+ }
+
+ delete [] m_ppRTSurfaceArray;
+ m_ppRTSurfaceArray = NULL;
+ }
+ m_lAllocated = 0;
+ m_nSurfaceArrayCount = 0;
}
diff --git a/src/filters/transform/MPCVideoDec/VideoDecDXVAAllocator.h b/src/filters/transform/MPCVideoDec/VideoDecDXVAAllocator.h
index 08a0cb7c9..bd6794dab 100644
--- a/src/filters/transform/MPCVideoDec/VideoDecDXVAAllocator.h
+++ b/src/filters/transform/MPCVideoDec/VideoDecDXVAAllocator.h
@@ -34,68 +34,68 @@ class CVideoDecDXVAAllocator;
interface __declspec(uuid("AE7EC2A2-1913-4a80-8DD6-DF1497ABA494"))
IMPCDXVA2Sample :
public IUnknown {
- STDMETHOD_(int, GetDXSurfaceId()) = 0;
+ STDMETHOD_(int, GetDXSurfaceId()) = 0;
};
class CDXVA2Sample : public CMediaSample, public IMFGetService, public IMPCDXVA2Sample
{
- friend class CVideoDecDXVAAllocator;
+ friend class CVideoDecDXVAAllocator;
public:
- CDXVA2Sample(CVideoDecDXVAAllocator *pAlloc, HRESULT *phr);
+ CDXVA2Sample(CVideoDecDXVAAllocator* pAlloc, HRESULT* phr);
- //Note: CMediaSample does not derive from CUnknown, so we cannot use the
- // DECLARE_IUNKNOWN macro that is used by most of the filter classes.
+ //Note: CMediaSample does not derive from CUnknown, so we cannot use the
+ // DECLARE_IUNKNOWN macro that is used by most of the filter classes.
- STDMETHODIMP QueryInterface(REFIID riid, __deref_out void **ppv);
- STDMETHODIMP_(ULONG) AddRef();
- STDMETHODIMP_(ULONG) Release();
+ STDMETHODIMP QueryInterface(REFIID riid, __deref_out void** ppv);
+ STDMETHODIMP_(ULONG) AddRef();
+ STDMETHODIMP_(ULONG) Release();
- // IMFGetService::GetService
- STDMETHODIMP GetService(REFGUID guidService, REFIID riid, LPVOID *ppv);
+ // IMFGetService::GetService
+ STDMETHODIMP GetService(REFGUID guidService, REFIID riid, LPVOID* ppv);
- // IMPCDXVA2Sample
- STDMETHODIMP_(int) GetDXSurfaceId();
+ // IMPCDXVA2Sample
+ STDMETHODIMP_(int) GetDXSurfaceId();
- // Override GetPointer because this class does not manage a system memory buffer.
- // The EVR uses the MR_BUFFER_SERVICE service to get the Direct3D surface.
- STDMETHODIMP GetPointer(BYTE ** ppBuffer);
+ // Override GetPointer because this class does not manage a system memory buffer.
+ // The EVR uses the MR_BUFFER_SERVICE service to get the Direct3D surface.
+ STDMETHODIMP GetPointer(BYTE** ppBuffer);
private:
- // Sets the pointer to the Direct3D surface.
- void SetSurface(DWORD surfaceId, IDirect3DSurface9 *pSurf);
+ // Sets the pointer to the Direct3D surface.
+ void SetSurface(DWORD surfaceId, IDirect3DSurface9* pSurf);
- CComPtr<IDirect3DSurface9> m_pSurface;
- DWORD m_dwSurfaceId;
+ CComPtr<IDirect3DSurface9> m_pSurface;
+ DWORD m_dwSurfaceId;
};
class CVideoDecDXVAAllocator : public CBaseAllocator
{
public:
- CVideoDecDXVAAllocator(CMPCVideoDecFilter* pVideoDecFilter, HRESULT* phr);
- virtual ~CVideoDecDXVAAllocator();
+ CVideoDecDXVAAllocator(CMPCVideoDecFilter* pVideoDecFilter, HRESULT* phr);
+ virtual ~CVideoDecDXVAAllocator();
- // STDMETHODIMP GetBuffer(__deref_out IMediaSample **ppBuffer, // Try for a circular buffer!
- // __in_opt REFERENCE_TIME * pStartTime,
- // __in_opt REFERENCE_TIME * pEndTime,
- // DWORD dwFlags);
- //
- // STDMETHODIMP ReleaseBuffer(IMediaSample *pBuffer);
- // CAtlList<int> m_FreeSurface;
+ // STDMETHODIMP GetBuffer(__deref_out IMediaSample **ppBuffer, // Try for a circular buffer!
+ // __in_opt REFERENCE_TIME * pStartTime,
+ // __in_opt REFERENCE_TIME * pEndTime,
+ // DWORD dwFlags);
+ //
+ // STDMETHODIMP ReleaseBuffer(IMediaSample *pBuffer);
+ // CAtlList<int> m_FreeSurface;
protected:
- HRESULT Alloc(void);
- void Free(void);
+ HRESULT Alloc(void);
+ void Free(void);
private :
- CMPCVideoDecFilter* m_pVideoDecFilter;
+ CMPCVideoDecFilter* m_pVideoDecFilter;
- IDirect3DSurface9** m_ppRTSurfaceArray;
- UINT m_nSurfaceArrayCount;
+ IDirect3DSurface9** m_ppRTSurfaceArray;
+ UINT m_nSurfaceArrayCount;
};
diff --git a/src/filters/transform/MPCVideoDec/VideoDecOutputPin.cpp b/src/filters/transform/MPCVideoDec/VideoDecOutputPin.cpp
index 030c4a799..a64e13571 100644
--- a/src/filters/transform/MPCVideoDec/VideoDecOutputPin.cpp
+++ b/src/filters/transform/MPCVideoDec/VideoDecOutputPin.cpp
@@ -27,104 +27,104 @@
#include "../../../DSUtil/DSUtil.h"
CVideoDecOutputPin::CVideoDecOutputPin(TCHAR* pObjectName, CBaseVideoFilter* pFilter, HRESULT* phr, LPCWSTR pName)
- : CBaseVideoOutputPin(pObjectName, pFilter, phr, pName)
+ : CBaseVideoOutputPin(pObjectName, pFilter, phr, pName)
{
- m_pVideoDecFilter = static_cast<CMPCVideoDecFilter*> (pFilter);
- m_pDXVA2Allocator = NULL;
- m_dwDXVA1SurfaceCount = 0;
- m_GuidDecoderDXVA1 = GUID_NULL;
- memset (&m_ddUncompPixelFormat, 0, sizeof(m_ddUncompPixelFormat));
+ m_pVideoDecFilter = static_cast<CMPCVideoDecFilter*>(pFilter);
+ m_pDXVA2Allocator = NULL;
+ m_dwDXVA1SurfaceCount = 0;
+ m_GuidDecoderDXVA1 = GUID_NULL;
+ memset(&m_ddUncompPixelFormat, 0, sizeof(m_ddUncompPixelFormat));
}
CVideoDecOutputPin::~CVideoDecOutputPin(void)
{
}
-HRESULT CVideoDecOutputPin::InitAllocator(IMemAllocator **ppAlloc)
+HRESULT CVideoDecOutputPin::InitAllocator(IMemAllocator** ppAlloc)
{
- TRACE("CVideoDecOutputPin::InitAllocator");
- if (m_pVideoDecFilter->UseDXVA2()) {
- HRESULT hr = S_FALSE;
- m_pDXVA2Allocator = DNew CVideoDecDXVAAllocator(m_pVideoDecFilter, &hr);
- if (!m_pDXVA2Allocator) {
- return E_OUTOFMEMORY;
- }
- if (FAILED(hr)) {
- delete m_pDXVA2Allocator;
- return hr;
- }
- // Return the IMemAllocator interface.
- return m_pDXVA2Allocator->QueryInterface(__uuidof(IMemAllocator), (void **)ppAlloc);
- } else {
- return __super::InitAllocator(ppAlloc);
- }
+ TRACE("CVideoDecOutputPin::InitAllocator");
+ if (m_pVideoDecFilter->UseDXVA2()) {
+ HRESULT hr = S_FALSE;
+ m_pDXVA2Allocator = DNew CVideoDecDXVAAllocator(m_pVideoDecFilter, &hr);
+ if (!m_pDXVA2Allocator) {
+ return E_OUTOFMEMORY;
+ }
+ if (FAILED(hr)) {
+ delete m_pDXVA2Allocator;
+ return hr;
+ }
+ // Return the IMemAllocator interface.
+ return m_pDXVA2Allocator->QueryInterface(__uuidof(IMemAllocator), (void**)ppAlloc);
+ } else {
+ return __super::InitAllocator(ppAlloc);
+ }
}
STDMETHODIMP CVideoDecOutputPin::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- return
- QI(IAMVideoAcceleratorNotify)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IAMVideoAcceleratorNotify)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
// === IAMVideoAcceleratorNotify
-STDMETHODIMP CVideoDecOutputPin::GetUncompSurfacesInfo(const GUID *pGuid, LPAMVAUncompBufferInfo pUncompBufferInfo)
+STDMETHODIMP CVideoDecOutputPin::GetUncompSurfacesInfo(const GUID* pGuid, LPAMVAUncompBufferInfo pUncompBufferInfo)
{
- HRESULT hr = E_INVALIDARG;
-
- if (SUCCEEDED (m_pVideoDecFilter->CheckDXVA1Decoder (pGuid))) {
- CComQIPtr<IAMVideoAccelerator> pAMVideoAccelerator = GetConnected();
-
- if (pAMVideoAccelerator) {
- pUncompBufferInfo->dwMaxNumSurfaces = m_pVideoDecFilter->GetPicEntryNumber();
- pUncompBufferInfo->dwMinNumSurfaces = m_pVideoDecFilter->GetPicEntryNumber();
-
- hr = m_pVideoDecFilter->FindDXVA1DecoderConfiguration (pAMVideoAccelerator, pGuid, &pUncompBufferInfo->ddUncompPixelFormat);
- if (SUCCEEDED (hr)) {
- memcpy (&m_ddUncompPixelFormat, &pUncompBufferInfo->ddUncompPixelFormat, sizeof(DDPIXELFORMAT));
- m_GuidDecoderDXVA1 = *pGuid;
- }
- }
- }
- return hr;
+ HRESULT hr = E_INVALIDARG;
+
+ if (SUCCEEDED(m_pVideoDecFilter->CheckDXVA1Decoder(pGuid))) {
+ CComQIPtr<IAMVideoAccelerator> pAMVideoAccelerator = GetConnected();
+
+ if (pAMVideoAccelerator) {
+ pUncompBufferInfo->dwMaxNumSurfaces = m_pVideoDecFilter->GetPicEntryNumber();
+ pUncompBufferInfo->dwMinNumSurfaces = m_pVideoDecFilter->GetPicEntryNumber();
+
+ hr = m_pVideoDecFilter->FindDXVA1DecoderConfiguration(pAMVideoAccelerator, pGuid, &pUncompBufferInfo->ddUncompPixelFormat);
+ if (SUCCEEDED(hr)) {
+ memcpy(&m_ddUncompPixelFormat, &pUncompBufferInfo->ddUncompPixelFormat, sizeof(DDPIXELFORMAT));
+ m_GuidDecoderDXVA1 = *pGuid;
+ }
+ }
+ }
+ return hr;
}
STDMETHODIMP CVideoDecOutputPin::SetUncompSurfacesInfo(DWORD dwActualUncompSurfacesAllocated)
{
- m_dwDXVA1SurfaceCount = dwActualUncompSurfacesAllocated;
- return S_OK;
+ m_dwDXVA1SurfaceCount = dwActualUncompSurfacesAllocated;
+ return S_OK;
}
-STDMETHODIMP CVideoDecOutputPin::GetCreateVideoAcceleratorData(const GUID *pGuid, LPDWORD pdwSizeMiscData, LPVOID *ppMiscData)
+STDMETHODIMP CVideoDecOutputPin::GetCreateVideoAcceleratorData(const GUID* pGuid, LPDWORD pdwSizeMiscData, LPVOID* ppMiscData)
{
- HRESULT hr = E_UNEXPECTED;
- AMVAUncompDataInfo UncompInfo;
- AMVACompBufferInfo CompInfo[30];
- DWORD dwNumTypesCompBuffers = _countof(CompInfo);
- CComQIPtr<IAMVideoAccelerator> pAMVideoAccelerator = GetConnected();
- DXVA_ConnectMode* pConnectMode;
-
- if (pAMVideoAccelerator) {
- memcpy (&UncompInfo.ddUncompPixelFormat, &m_ddUncompPixelFormat, sizeof (DDPIXELFORMAT));
- UncompInfo.dwUncompWidth = m_pVideoDecFilter->PictWidthRounded();
- UncompInfo.dwUncompHeight = m_pVideoDecFilter->PictHeightRounded();
- hr = pAMVideoAccelerator->GetCompBufferInfo(&m_GuidDecoderDXVA1, &UncompInfo, &dwNumTypesCompBuffers, CompInfo);
-
- if (SUCCEEDED (hr)) {
- hr = m_pVideoDecFilter->CreateDXVA1Decoder (pAMVideoAccelerator, pGuid, m_dwDXVA1SurfaceCount);
-
- if (SUCCEEDED (hr)) {
- m_pVideoDecFilter->SetDXVA1Params (&m_GuidDecoderDXVA1, &m_ddUncompPixelFormat);
-
- pConnectMode = (DXVA_ConnectMode*)CoTaskMemAlloc (sizeof(DXVA_ConnectMode));
- pConnectMode->guidMode = m_GuidDecoderDXVA1;
- pConnectMode->wRestrictedMode = m_pVideoDecFilter->GetDXVA1RestrictedMode();
- *pdwSizeMiscData = sizeof(DXVA_ConnectMode);
- *ppMiscData = pConnectMode;
- }
- }
- }
-
-
- return hr;
+ HRESULT hr = E_UNEXPECTED;
+ AMVAUncompDataInfo UncompInfo;
+ AMVACompBufferInfo CompInfo[30];
+ DWORD dwNumTypesCompBuffers = _countof(CompInfo);
+ CComQIPtr<IAMVideoAccelerator> pAMVideoAccelerator = GetConnected();
+ DXVA_ConnectMode* pConnectMode;
+
+ if (pAMVideoAccelerator) {
+ memcpy(&UncompInfo.ddUncompPixelFormat, &m_ddUncompPixelFormat, sizeof(DDPIXELFORMAT));
+ UncompInfo.dwUncompWidth = m_pVideoDecFilter->PictWidthRounded();
+ UncompInfo.dwUncompHeight = m_pVideoDecFilter->PictHeightRounded();
+ hr = pAMVideoAccelerator->GetCompBufferInfo(&m_GuidDecoderDXVA1, &UncompInfo, &dwNumTypesCompBuffers, CompInfo);
+
+ if (SUCCEEDED(hr)) {
+ hr = m_pVideoDecFilter->CreateDXVA1Decoder(pAMVideoAccelerator, pGuid, m_dwDXVA1SurfaceCount);
+
+ if (SUCCEEDED(hr)) {
+ m_pVideoDecFilter->SetDXVA1Params(&m_GuidDecoderDXVA1, &m_ddUncompPixelFormat);
+
+ pConnectMode = (DXVA_ConnectMode*)CoTaskMemAlloc(sizeof(DXVA_ConnectMode));
+ pConnectMode->guidMode = m_GuidDecoderDXVA1;
+ pConnectMode->wRestrictedMode = m_pVideoDecFilter->GetDXVA1RestrictedMode();
+ *pdwSizeMiscData = sizeof(DXVA_ConnectMode);
+ *ppMiscData = pConnectMode;
+ }
+ }
+ }
+
+
+ return hr;
}
diff --git a/src/filters/transform/MPCVideoDec/VideoDecOutputPin.h b/src/filters/transform/MPCVideoDec/VideoDecOutputPin.h
index cb3a91750..d731f2afe 100644
--- a/src/filters/transform/MPCVideoDec/VideoDecOutputPin.h
+++ b/src/filters/transform/MPCVideoDec/VideoDecOutputPin.h
@@ -32,27 +32,27 @@ class CVideoDecDXVAAllocator;
class CVideoDecOutputPin : public CBaseVideoOutputPin
- , public IAMVideoAcceleratorNotify
+ , public IAMVideoAcceleratorNotify
{
public:
- CVideoDecOutputPin(TCHAR* pObjectName, CBaseVideoFilter* pFilter, HRESULT* phr, LPCWSTR pName);
+ CVideoDecOutputPin(TCHAR* pObjectName, CBaseVideoFilter* pFilter, HRESULT* phr, LPCWSTR pName);
- ~CVideoDecOutputPin();
+ ~CVideoDecOutputPin();
- HRESULT InitAllocator(IMemAllocator **ppAlloc);
+ HRESULT InitAllocator(IMemAllocator** ppAlloc);
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- // IAMVideoAcceleratorNotify
- STDMETHODIMP GetUncompSurfacesInfo(const GUID *pGuid, LPAMVAUncompBufferInfo pUncompBufferInfo);
- STDMETHODIMP SetUncompSurfacesInfo(DWORD dwActualUncompSurfacesAllocated);
- STDMETHODIMP GetCreateVideoAcceleratorData(const GUID *pGuid, LPDWORD pdwSizeMiscData, LPVOID *ppMiscData);
+ // IAMVideoAcceleratorNotify
+ STDMETHODIMP GetUncompSurfacesInfo(const GUID* pGuid, LPAMVAUncompBufferInfo pUncompBufferInfo);
+ STDMETHODIMP SetUncompSurfacesInfo(DWORD dwActualUncompSurfacesAllocated);
+ STDMETHODIMP GetCreateVideoAcceleratorData(const GUID* pGuid, LPDWORD pdwSizeMiscData, LPVOID* ppMiscData);
private :
- CMPCVideoDecFilter* m_pVideoDecFilter;
- CVideoDecDXVAAllocator* m_pDXVA2Allocator;
- DWORD m_dwDXVA1SurfaceCount;
- GUID m_GuidDecoderDXVA1;
- DDPIXELFORMAT m_ddUncompPixelFormat;
+ CMPCVideoDecFilter* m_pVideoDecFilter;
+ CVideoDecDXVAAllocator* m_pDXVA2Allocator;
+ DWORD m_dwDXVA1SurfaceCount;
+ GUID m_GuidDecoderDXVA1;
+ DDPIXELFORMAT m_ddUncompPixelFormat;
};
diff --git a/src/filters/transform/MPCVideoDec/stdafx.cpp b/src/filters/transform/MPCVideoDec/stdafx.cpp
index 31f851930..fd127471b 100644
--- a/src/filters/transform/MPCVideoDec/stdafx.cpp
+++ b/src/filters/transform/MPCVideoDec/stdafx.cpp
@@ -31,18 +31,18 @@
void LOG(LPCTSTR fmt, ...)
{
- va_list args;
- va_start(args, fmt);
- if (TCHAR* buff = DNew TCHAR[_vsctprintf(fmt, args) + 1]) {
- _vstprintf(buff, fmt, args);
- if (FILE* f = _tfopen(LOG_FILE, _T("at"))) {
- fseek(f, 0, 2);
- _ftprintf_s(f, _T("%s\n"), buff);
- fclose(f);
- }
- delete [] buff;
- }
- va_end(args);
+ va_list args;
+ va_start(args, fmt);
+ if (TCHAR* buff = DNew TCHAR[_vsctprintf(fmt, args) + 1]) {
+ _vstprintf(buff, fmt, args);
+ if (FILE* f = _tfopen(LOG_FILE, _T("at"))) {
+ fseek(f, 0, 2);
+ _ftprintf_s(f, _T("%s\n"), buff);
+ fclose(f);
+ }
+ delete [] buff;
+ }
+ va_end(args);
}
#endif
diff --git a/src/filters/transform/MpaDecFilter/IMpaDecFilter.h b/src/filters/transform/MpaDecFilter/IMpaDecFilter.h
index 4bbbda817..424b0c6e8 100644
--- a/src/filters/transform/MpaDecFilter/IMpaDecFilter.h
+++ b/src/filters/transform/MpaDecFilter/IMpaDecFilter.h
@@ -26,26 +26,26 @@
enum MPCSampleFormat {SF_PCM16, SF_PCM24, SF_PCM32, SF_FLOAT32};
enum DolbyDigitalMode {
- DD_Unknown,
- DD_AC3, // Standard AC3
- DD_EAC3, // Dolby Digital +
- DD_TRUEHD, // Dolby True HD
- DD_MLP // Meridian Lossless Packing
+ DD_Unknown,
+ DD_AC3, // Standard AC3
+ DD_EAC3, // Dolby Digital +
+ DD_TRUEHD, // Dolby True HD
+ DD_MLP // Meridian Lossless Packing
};
interface __declspec(uuid("2067C60F-752F-4EBD-B0B1-4CBC5E00741C"))
IMpaDecFilter :
public IUnknown {
- enum enctype {ac3, dts, etlast};
+ enum enctype {ac3, dts, etlast};
- STDMETHOD(SetSampleFormat(MPCSampleFormat sf)) = 0;
- STDMETHOD_(MPCSampleFormat, GetSampleFormat()) = 0;
- STDMETHOD(SetSpeakerConfig(enctype et, int sc)) = 0; // sign of sc tells if spdif is active
- STDMETHOD_(int, GetSpeakerConfig(enctype et)) = 0;
- STDMETHOD(SetDynamicRangeControl(enctype et, bool fDRC)) = 0;
- STDMETHOD_(bool, GetDynamicRangeControl(enctype et)) = 0;
- STDMETHOD_(DolbyDigitalMode, GetDolbyDigitalMode()) = 0;
+ STDMETHOD(SetSampleFormat(MPCSampleFormat sf)) = 0;
+ STDMETHOD_(MPCSampleFormat, GetSampleFormat()) = 0;
+ STDMETHOD(SetSpeakerConfig(enctype et, int sc)) = 0; // sign of sc tells if spdif is active
+ STDMETHOD_(int, GetSpeakerConfig(enctype et)) = 0;
+ STDMETHOD(SetDynamicRangeControl(enctype et, bool fDRC)) = 0;
+ STDMETHOD_(bool, GetDynamicRangeControl(enctype et)) = 0;
+ STDMETHOD_(DolbyDigitalMode, GetDolbyDigitalMode()) = 0;
- STDMETHOD(SaveSettings()) = 0;
+ STDMETHOD(SaveSettings()) = 0;
};
diff --git a/src/filters/transform/MpaDecFilter/MpaDecFilter.cpp b/src/filters/transform/MpaDecFilter/MpaDecFilter.cpp
index bf8562444..1cbed4940 100644
--- a/src/filters/transform/MpaDecFilter/MpaDecFilter.cpp
+++ b/src/filters/transform/MpaDecFilter/MpaDecFilter.cpp
@@ -36,8 +36,8 @@
#ifdef _DEBUG
extern "C" int mingw_app_type = 1; /* 0:console, 1:windows. */
#endif
-void *__imp_toupper = toupper;
-void *__imp_time64 = _time64;
+void* __imp_toupper = toupper;
+void* __imp_time64 = _time64;
#endif
#include <InitGuid.h>
@@ -61,224 +61,224 @@ void *__imp_time64 = _time64;
#if HAS_FFMPEG_AUDIO_DECODERS
typedef struct {
- const CLSID* clsMinorType;
- const enum CodecID nFFCodec;
+ const CLSID* clsMinorType;
+ const enum CodecID nFFCodec;
} FFMPEG_AUDIO_CODECS;
static const FFMPEG_AUDIO_CODECS ffAudioCodecs[] = {
#if INTERNAL_DECODER_AMR
- // AMR
- { &MEDIASUBTYPE_AMR, CODEC_ID_AMR_NB },
- { &MEDIASUBTYPE_SAMR, CODEC_ID_AMR_NB },
- { &MEDIASUBTYPE_SAWB, CODEC_ID_AMR_WB },
+ // AMR
+ { &MEDIASUBTYPE_AMR, CODEC_ID_AMR_NB },
+ { &MEDIASUBTYPE_SAMR, CODEC_ID_AMR_NB },
+ { &MEDIASUBTYPE_SAWB, CODEC_ID_AMR_WB },
#endif
#if INTERNAL_DECODER_AAC
- // AAC
- { &MEDIASUBTYPE_AAC, CODEC_ID_AAC },
- { &MEDIASUBTYPE_MP4A, CODEC_ID_AAC },
- { &MEDIASUBTYPE_mp4a, CODEC_ID_AAC },
- { &MEDIASUBTYPE_AAC_ADTS, CODEC_ID_AAC },
- { &MEDIASUBTYPE_LATM_AAC, CODEC_ID_AAC_LATM },
+ // AAC
+ { &MEDIASUBTYPE_AAC, CODEC_ID_AAC },
+ { &MEDIASUBTYPE_MP4A, CODEC_ID_AAC },
+ { &MEDIASUBTYPE_mp4a, CODEC_ID_AAC },
+ { &MEDIASUBTYPE_AAC_ADTS, CODEC_ID_AAC },
+ { &MEDIASUBTYPE_LATM_AAC, CODEC_ID_AAC_LATM },
#endif
#if INTERNAL_DECODER_ALAC
- // ALAC
- { &MEDIASUBTYPE_ALAC, CODEC_ID_ALAC },
+ // ALAC
+ { &MEDIASUBTYPE_ALAC, CODEC_ID_ALAC },
#endif
#if INTERNAL_DECODER_ALS
- // MPEG-4 ALS
- { &MEDIASUBTYPE_ALS, CODEC_ID_MP4ALS },
+ // MPEG-4 ALS
+ { &MEDIASUBTYPE_ALS, CODEC_ID_MP4ALS },
#endif
#if INTERNAL_DECODER_VORBIS
- // Ogg Vorbis
- { &MEDIASUBTYPE_Vorbis2, CODEC_ID_VORBIS },
+ // Ogg Vorbis
+ { &MEDIASUBTYPE_Vorbis2, CODEC_ID_VORBIS },
#endif
#if INTERNAL_DECODER_NELLYMOSER
- // NellyMoser
- { &MEDIASUBTYPE_NELLYMOSER, CODEC_ID_NELLYMOSER },
+ // NellyMoser
+ { &MEDIASUBTYPE_NELLYMOSER, CODEC_ID_NELLYMOSER },
#endif
#if INTERNAL_DECODER_ADPCM
- // Qt ADPCM
- { &MEDIASUBTYPE_IMA4, CODEC_ID_ADPCM_IMA_QT },
- // FLV ADPCM
- { &MEDIASUBTYPE_ADPCM_SWF, CODEC_ID_ADPCM_SWF },
- // AMV IMA ADPCM
- { &MEDIASUBTYPE_ADPCM_AMV, CODEC_ID_ADPCM_IMA_AMV},
+ // Qt ADPCM
+ { &MEDIASUBTYPE_IMA4, CODEC_ID_ADPCM_IMA_QT },
+ // FLV ADPCM
+ { &MEDIASUBTYPE_ADPCM_SWF, CODEC_ID_ADPCM_SWF },
+ // AMV IMA ADPCM
+ { &MEDIASUBTYPE_ADPCM_AMV, CODEC_ID_ADPCM_IMA_AMV},
#endif
#if INTERNAL_DECODER_MPEGAUDIO
- // MPEG Audio
- { &MEDIASUBTYPE_MPEG1Packet, CODEC_ID_MP2 },
- { &MEDIASUBTYPE_MPEG1Payload, CODEC_ID_MP2 },
- { &MEDIASUBTYPE_MPEG1AudioPayload, CODEC_ID_MP2 },
- { &MEDIASUBTYPE_MPEG2_AUDIO, CODEC_ID_MP2 },
- { &MEDIASUBTYPE_MP3, CODEC_ID_MP3 },
+ // MPEG Audio
+ { &MEDIASUBTYPE_MPEG1Packet, CODEC_ID_MP2 },
+ { &MEDIASUBTYPE_MPEG1Payload, CODEC_ID_MP2 },
+ { &MEDIASUBTYPE_MPEG1AudioPayload, CODEC_ID_MP2 },
+ { &MEDIASUBTYPE_MPEG2_AUDIO, CODEC_ID_MP2 },
+ { &MEDIASUBTYPE_MP3, CODEC_ID_MP3 },
#endif
#if INTERNAL_DECODER_REALAUDIO
- // RealMedia Audio
- { &MEDIASUBTYPE_14_4, CODEC_ID_RA_144 },
- { &MEDIASUBTYPE_28_8, CODEC_ID_RA_288 },
- { &MEDIASUBTYPE_ATRC, CODEC_ID_ATRAC3 },
- { &MEDIASUBTYPE_COOK, CODEC_ID_COOK },
- { &MEDIASUBTYPE_SIPR, CODEC_ID_SIPR },
- { &MEDIASUBTYPE_RAAC, CODEC_ID_AAC },
- { &MEDIASUBTYPE_RACP, CODEC_ID_AAC },
+ // RealMedia Audio
+ { &MEDIASUBTYPE_14_4, CODEC_ID_RA_144 },
+ { &MEDIASUBTYPE_28_8, CODEC_ID_RA_288 },
+ { &MEDIASUBTYPE_ATRC, CODEC_ID_ATRAC3 },
+ { &MEDIASUBTYPE_COOK, CODEC_ID_COOK },
+ { &MEDIASUBTYPE_SIPR, CODEC_ID_SIPR },
+ { &MEDIASUBTYPE_RAAC, CODEC_ID_AAC },
+ { &MEDIASUBTYPE_RACP, CODEC_ID_AAC },
#endif
#if INTERNAL_DECODER_AC3
- { &MEDIASUBTYPE_DOLBY_DDPLUS, CODEC_ID_EAC3 },
- { &MEDIASUBTYPE_DOLBY_TRUEHD, CODEC_ID_TRUEHD },
- { &MEDIASUBTYPE_MLP, CODEC_ID_MLP },
+ { &MEDIASUBTYPE_DOLBY_DDPLUS, CODEC_ID_EAC3 },
+ { &MEDIASUBTYPE_DOLBY_TRUEHD, CODEC_ID_TRUEHD },
+ { &MEDIASUBTYPE_MLP, CODEC_ID_MLP },
#endif
#if INTERNAL_DECODER_FLAC
- { &MEDIASUBTYPE_FLAC_FRAMED, CODEC_ID_FLAC },
+ { &MEDIASUBTYPE_FLAC_FRAMED, CODEC_ID_FLAC },
#endif
- { &MEDIASUBTYPE_None, CODEC_ID_NONE },
+ { &MEDIASUBTYPE_None, CODEC_ID_NONE },
};
#endif
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
#if INTERNAL_DECODER_MPEGAUDIO
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_MP3},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG1AudioPayload},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG1Payload},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG1Packet},
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_MPEG2_AUDIO},
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_MPEG2_AUDIO},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_MPEG2_AUDIO},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG2_AUDIO},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_MP3},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG1AudioPayload},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG1Payload},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG1Packet},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_MPEG2_AUDIO},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_MPEG2_AUDIO},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_MPEG2_AUDIO},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_MPEG2_AUDIO},
#endif
#if INTERNAL_DECODER_AC3
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DOLBY_AC3},
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DOLBY_AC3},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DOLBY_AC3},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_DOLBY_AC3},
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DOLBY_DDPLUS},
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DOLBY_DDPLUS},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DOLBY_DDPLUS},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_DOLBY_DDPLUS},
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DOLBY_TRUEHD},
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DOLBY_TRUEHD},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DOLBY_TRUEHD},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_DOLBY_TRUEHD},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_WAVE_DOLBY_AC3},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_MLP},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DOLBY_AC3},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DOLBY_AC3},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DOLBY_AC3},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_DOLBY_AC3},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DOLBY_DDPLUS},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DOLBY_DDPLUS},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DOLBY_DDPLUS},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_DOLBY_DDPLUS},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DOLBY_TRUEHD},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DOLBY_TRUEHD},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DOLBY_TRUEHD},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_DOLBY_TRUEHD},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_WAVE_DOLBY_AC3},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_MLP},
#endif
#if INTERNAL_DECODER_DTS
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DTS},
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DTS},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DTS},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_DTS},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_WAVE_DTS},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DTS},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DTS},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DTS},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_DTS},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_WAVE_DTS},
#endif
#if INTERNAL_DECODER_LPCM
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DVD_LPCM_AUDIO},
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DVD_LPCM_AUDIO},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DVD_LPCM_AUDIO},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_DVD_LPCM_AUDIO},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_HDMV_LPCM_AUDIO},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_DVD_LPCM_AUDIO},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_DVD_LPCM_AUDIO},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_DVD_LPCM_AUDIO},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_DVD_LPCM_AUDIO},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_HDMV_LPCM_AUDIO},
#endif
#if INTERNAL_DECODER_AAC
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_AAC},
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_AAC},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_AAC},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_AAC},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_LATM_AAC},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_AAC_ADTS},
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_MP4A},
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_MP4A},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_MP4A},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_MP4A},
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_mp4a},
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_mp4a},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_mp4a},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_mp4a},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_AAC},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_AAC},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_AAC},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_AAC},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_LATM_AAC},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_AAC_ADTS},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_MP4A},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_MP4A},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_MP4A},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_MP4A},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_mp4a},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_mp4a},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_mp4a},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_mp4a},
#endif
#if INTERNAL_DECODER_AMR
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_AMR},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_SAMR},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_SAWB},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_AMR},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_SAMR},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_SAWB},
#endif
#if INTERNAL_DECODER_PS2AUDIO
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_PS2_PCM},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_PS2_PCM},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_PS2_PCM},
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_PS2_ADPCM},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_PS2_ADPCM},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_PS2_ADPCM},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_PS2_PCM},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_PS2_PCM},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_PS2_PCM},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_PS2_ADPCM},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_PS2_ADPCM},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_PS2_ADPCM},
#endif
#if INTERNAL_DECODER_VORBIS
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_Vorbis2},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_Vorbis2},
#endif
#if INTERNAL_DECODER_FLAC
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_FLAC_FRAMED},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_FLAC_FRAMED},
#endif
#if INTERNAL_DECODER_NELLYMOSER
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_NELLYMOSER},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_NELLYMOSER},
#endif
#if INTERNAL_DECODER_PCM
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_NONE},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_RAW},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_TWOS},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_SOWT},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_IN24},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_IN32},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_FL32},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_FL64},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_IEEE_FLOAT}, // only for 64-bit float PCM
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_NONE},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_RAW},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_TWOS},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_SOWT},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_IN24},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_IN32},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_FL32},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM_FL64},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_IEEE_FLOAT}, // only for 64-bit float PCM
#endif
#if INTERNAL_DECODER_ADPCM
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_IMA4},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_ADPCM_SWF},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_ADPCM_AMV},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_IMA4},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_ADPCM_SWF},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_ADPCM_AMV},
#endif
#if INTERNAL_DECODER_REALAUDIO
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_14_4},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_28_8},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_ATRC},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_COOK},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_DNET},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_SIPR},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_RAAC},
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_RACP},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_14_4},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_28_8},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_ATRC},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_COOK},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_DNET},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_SIPR},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_RAAC},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_RACP},
#endif
#if INTERNAL_DECODER_ALAC
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_ALAC},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_ALAC},
#endif
#if INTERNAL_DECODER_ALS
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_ALS},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_ALS},
#endif
#if !HAS_OTHER_AUDIO_DECODERS && !HAS_FFMPEG_AUDIO_DECODERS
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_None} // just to prevent compilation error
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_None} // just to prevent compilation error
#endif
};
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM},
+ {&MEDIATYPE_Audio, &MEDIASUBTYPE_PCM},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CMpaDecFilter), MPCAudioDecName, /*MERIT_DO_NOT_USE*/0x40000001, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CMpaDecFilter), MPCAudioDecName, /*MERIT_DO_NOT_USE*/0x40000001, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, &__uuidof(CMpaDecFilter), CreateInstance<CMpaDecFilter>, NULL, &sudFilter[0]},
- {L"CMpaDecPropertyPage", &__uuidof(CMpaDecSettingsWnd), CreateInstance<CInternalPropertyPageTempl<CMpaDecSettingsWnd> >},
+ {sudFilter[0].strName, &__uuidof(CMpaDecFilter), CreateInstance<CMpaDecFilter>, NULL, &sudFilter[0]},
+ {L"CMpaDecPropertyPage", &__uuidof(CMpaDecSettingsWnd), CreateInstance<CInternalPropertyPageTempl<CMpaDecSettingsWnd> >},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
//
@@ -291,9 +291,9 @@ CFilterApp theApp;
#pragma warning(disable : 4245)
static struct scmap_t {
- WORD nChannels;
- BYTE ch[8];
- DWORD dwChannelMask;
+ WORD nChannels;
+ BYTE ch[8];
+ DWORD dwChannelMask;
}
// dshow: left, right, center, LFE, left surround, right surround
// a52dec: LFE, left, center, right, left surround, right surround
@@ -301,1253 +301,1257 @@ static struct scmap_t {
// lets see how we can map these things to dshow (oh the joy!)
-s_scmap_a52dec[2*11] = {
- {2, {0, 1,-1,-1,-1,-1,-1,-1}, 0}, // A52_CHANNEL
- {1, {0,-1,-1,-1,-1,-1,-1,-1}, 0}, // A52_MONO
- {2, {0, 1,-1,-1,-1,-1,-1,-1}, 0}, // A52_STEREO
- {3, {0, 2, 1,-1,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER}, // A52_3F
- {3, {0, 1, 2,-1,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_CENTER}, // A52_2F1R
- {4, {0, 2, 1, 3,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_CENTER}, // A52_3F1R
- {4, {0, 1, 2, 3,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // A52_2F2R
- {5, {0, 2, 1, 3, 4,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // A52_3F2R
- {1, {0,-1,-1,-1,-1,-1,-1,-1}, 0}, // A52_CHANNEL1
- {1, {0,-1,-1,-1,-1,-1,-1,-1}, 0}, // A52_CHANNEL2
- {2, {0, 1,-1,-1,-1,-1,-1,-1}, 0}, // A52_DOLBY
-
- {3, {1, 2, 0,-1,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // A52_CHANNEL|A52_LFE
- {2, {1, 0,-1,-1,-1,-1,-1,-1}, SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // A52_MONO|A52_LFE
- {3, {1, 2, 0,-1,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // A52_STEREO|A52_LFE
- {4, {1, 3, 2, 0,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // A52_3F|A52_LFE
- {4, {1, 2, 0, 3,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_CENTER}, // A52_2F1R|A52_LFE
- {5, {1, 3, 2, 0, 4,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_CENTER}, // A52_3F1R|A52_LFE
- {5, {1, 2, 0, 3, 4,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // A52_2F2R|A52_LFE
- {6, {1, 3, 2, 0, 4, 5,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // A52_3F2R|A52_LFE
- {2, {1, 0,-1,-1,-1,-1,-1,-1}, SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // A52_CHANNEL1|A52_LFE
- {2, {1, 0,-1,-1,-1,-1,-1,-1}, SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // A52_CHANNEL2|A52_LFE
- {3, {1, 2, 0,-1,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // A52_DOLBY|A52_LFE
+s_scmap_a52dec[2 * 11] = {
+ {2, {0, 1, -1, -1, -1, -1, -1, -1}, 0}, // A52_CHANNEL
+ {1, {0, -1, -1, -1, -1, -1, -1, -1}, 0}, // A52_MONO
+ {2, {0, 1, -1, -1, -1, -1, -1, -1}, 0}, // A52_STEREO
+ {3, {0, 2, 1, -1, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER}, // A52_3F
+ {3, {0, 1, 2, -1, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_CENTER}, // A52_2F1R
+ {4, {0, 2, 1, 3, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER}, // A52_3F1R
+ {4, {0, 1, 2, 3, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT}, // A52_2F2R
+ {5, {0, 2, 1, 3, 4, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT}, // A52_3F2R
+ {1, {0, -1, -1, -1, -1, -1, -1, -1}, 0}, // A52_CHANNEL1
+ {1, {0, -1, -1, -1, -1, -1, -1, -1}, 0}, // A52_CHANNEL2
+ {2, {0, 1, -1, -1, -1, -1, -1, -1}, 0}, // A52_DOLBY
+
+ {3, {1, 2, 0, -1, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY}, // A52_CHANNEL|A52_LFE
+ {2, {1, 0, -1, -1, -1, -1, -1, -1}, SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY}, // A52_MONO|A52_LFE
+ {3, {1, 2, 0, -1, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY}, // A52_STEREO|A52_LFE
+ {4, {1, 3, 2, 0, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY}, // A52_3F|A52_LFE
+ {4, {1, 2, 0, 3, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_CENTER}, // A52_2F1R|A52_LFE
+ {5, {1, 3, 2, 0, 4, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_CENTER}, // A52_3F1R|A52_LFE
+ {5, {1, 2, 0, 3, 4, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT}, // A52_2F2R|A52_LFE
+ {6, {1, 3, 2, 0, 4, 5, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT}, // A52_3F2R|A52_LFE
+ {2, {1, 0, -1, -1, -1, -1, -1, -1}, SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY}, // A52_CHANNEL1|A52_LFE
+ {2, {1, 0, -1, -1, -1, -1, -1, -1}, SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY}, // A52_CHANNEL2|A52_LFE
+ {3, {1, 2, 0, -1, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY}, // A52_DOLBY|A52_LFE
},
-s_scmap_libdca[2*10] = {
- {1, {0,-1,-1,-1,-1,-1,-1,-1}, 0}, // DTS_MONO
- {2, {0, 1,-1,-1,-1,-1,-1,-1}, 0}, // DTS_CHANNEL
- {2, {0, 1,-1,-1,-1,-1,-1,-1}, 0}, // DTS_STEREO
- {2, {0, 1,-1,-1,-1,-1,-1,-1}, 0}, // DTS_STEREO_SUMDIFF
- {2, {0, 1,-1,-1,-1,-1,-1,-1}, 0}, // DTS_STEREO_TOTAL
- {3, {1, 2, 0,-1,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER}, // DTS_3F
- {3, {0, 1, 2,-1,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_CENTER}, // DTS_2F1R
- {4, {1, 2, 0, 3,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_CENTER}, // DTS_3F1R
- {4, {0, 1, 2, 3,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // DTS_2F2R
- {5, {1, 2, 0, 3, 4,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // DTS_3F2R
-
- {2, {0, 1,-1,-1,-1,-1,-1,-1}, SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // DTS_MONO|DTS_LFE
- {3, {0, 1, 2,-1,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // DTS_CHANNEL|DTS_LFE
- {3, {0, 1, 2,-1,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // DTS_STEREO|DTS_LFE
- {3, {0, 1, 2,-1,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // DTS_STEREO_SUMDIFF|DTS_LFE
- {3, {0, 1, 2,-1,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // DTS_STEREO_TOTAL|DTS_LFE
- {4, {1, 2, 0, 3,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // DTS_3F|DTS_LFE
- {4, {0, 1, 3, 2,-1,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_CENTER}, // DTS_2F1R|DTS_LFE
- {5, {1, 2, 0, 4, 3,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_CENTER}, // DTS_3F1R|DTS_LFE
- {5, {0, 1, 4, 2, 3,-1,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // DTS_2F2R|DTS_LFE
- {6, {1, 2, 0, 5, 3, 4,-1,-1}, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // DTS_3F2R|DTS_LFE
+s_scmap_libdca[2 * 10] = {
+ {1, {0, -1, -1, -1, -1, -1, -1, -1}, 0}, // DTS_MONO
+ {2, {0, 1, -1, -1, -1, -1, -1, -1}, 0}, // DTS_CHANNEL
+ {2, {0, 1, -1, -1, -1, -1, -1, -1}, 0}, // DTS_STEREO
+ {2, {0, 1, -1, -1, -1, -1, -1, -1}, 0}, // DTS_STEREO_SUMDIFF
+ {2, {0, 1, -1, -1, -1, -1, -1, -1}, 0}, // DTS_STEREO_TOTAL
+ {3, {1, 2, 0, -1, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER}, // DTS_3F
+ {3, {0, 1, 2, -1, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_CENTER}, // DTS_2F1R
+ {4, {1, 2, 0, 3, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER}, // DTS_3F1R
+ {4, {0, 1, 2, 3, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT}, // DTS_2F2R
+ {5, {1, 2, 0, 3, 4, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT}, // DTS_3F2R
+
+ {2, {0, 1, -1, -1, -1, -1, -1, -1}, SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY}, // DTS_MONO|DTS_LFE
+ {3, {0, 1, 2, -1, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY}, // DTS_CHANNEL|DTS_LFE
+ {3, {0, 1, 2, -1, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY}, // DTS_STEREO|DTS_LFE
+ {3, {0, 1, 2, -1, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY}, // DTS_STEREO_SUMDIFF|DTS_LFE
+ {3, {0, 1, 2, -1, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY}, // DTS_STEREO_TOTAL|DTS_LFE
+ {4, {1, 2, 0, 3, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY}, // DTS_3F|DTS_LFE
+ {4, {0, 1, 3, 2, -1, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_CENTER}, // DTS_2F1R|DTS_LFE
+ {5, {1, 2, 0, 4, 3, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_CENTER}, // DTS_3F1R|DTS_LFE
+ {5, {0, 1, 4, 2, 3, -1, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT}, // DTS_2F2R|DTS_LFE
+ {6, {1, 2, 0, 5, 3, 4, -1, -1}, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT}, // DTS_3F2R|DTS_LFE
},
s_scmap_hdmv[] = {
- // FL FR FC LFe BL BR FLC FRC
- {0, {-1,-1,-1,-1,-1,-1,-1,-1 }, 0}, // INVALID
- {1, { 0,-1,-1,-1,-1,-1,-1,-1 }, 0}, // Mono M1, 0
- {0, {-1,-1,-1,-1,-1,-1,-1,-1 }, 0}, // INVALID
- {2, { 0, 1,-1,-1,-1,-1,-1,-1 }, 0}, // Stereo FL, FR
- {4, { 0, 1, 2,-1,-1,-1,-1,-1 }, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER}, // 3/0 FL, FR, FC
- {4, { 0, 1, 2,-1,-1,-1,-1,-1 }, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_LOW_FREQUENCY}, // 2/1 FL, FR, Surround
- {4, { 0, 1, 2, 3,-1,-1,-1,-1 }, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY}, // 3/1 FL, FR, FC, Surround
- {4, { 0, 1, 2, 3,-1,-1,-1,-1 }, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // 2/2 FL, FR, BL, BR
- {6, { 0, 1, 2, 3, 4,-1,-1,-1 }, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT}, // 3/2 FL, FR, FC, BL, BR
- {6, { 0, 1, 2, 5, 3, 4,-1,-1 }, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT},// 3/2+LFe FL, FR, FC, BL, BR, LFe
- {8, { 0, 1, 2, 3, 6, 4, 5,-1 }, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT|SPEAKER_SIDE_LEFT|SPEAKER_SIDE_RIGHT},// 3/4 FL, FR, FC, BL, Bls, Brs, BR
- {8, { 0, 1, 2, 7, 4, 5, 3, 6 }, SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_FRONT_CENTER|SPEAKER_LOW_FREQUENCY|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT|SPEAKER_SIDE_LEFT|SPEAKER_SIDE_RIGHT},// 3/4+LFe FL, FR, FC, BL, Bls, Brs, BR, LFe
+ // FL FR FC LFe BL BR FLC FRC
+ {0, { -1, -1, -1, -1, -1, -1, -1, -1 }, 0}, // INVALID
+ {1, { 0, -1, -1, -1, -1, -1, -1, -1 }, 0}, // Mono M1, 0
+ {0, { -1, -1, -1, -1, -1, -1, -1, -1 }, 0}, // INVALID
+ {2, { 0, 1, -1, -1, -1, -1, -1, -1 }, 0}, // Stereo FL, FR
+ {4, { 0, 1, 2, -1, -1, -1, -1, -1 }, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER}, // 3/0 FL, FR, FC
+ {4, { 0, 1, 2, -1, -1, -1, -1, -1 }, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY}, // 2/1 FL, FR, Surround
+ {4, { 0, 1, 2, 3, -1, -1, -1, -1 }, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY}, // 3/1 FL, FR, FC, Surround
+ {4, { 0, 1, 2, 3, -1, -1, -1, -1 }, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT}, // 2/2 FL, FR, BL, BR
+ {6, { 0, 1, 2, 3, 4, -1, -1, -1 }, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT}, // 3/2 FL, FR, FC, BL, BR
+ {6, { 0, 1, 2, 5, 3, 4, -1, -1 }, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT}, // 3/2+LFe FL, FR, FC, BL, BR, LFe
+ {8, { 0, 1, 2, 3, 6, 4, 5, -1 }, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT}, // 3/4 FL, FR, FC, BL, Bls, Brs, BR
+ {8, { 0, 1, 2, 7, 4, 5, 3, 6 }, SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT}, // 3/4+LFe FL, FR, FC, BL, Bls, Brs, BR, LFe
};
#pragma warning(default : 4245)
static DWORD get_lav_channel_layout(uint64_t layout)
{
- if (layout > UINT32_MAX) {
- if (layout & AV_CH_WIDE_LEFT)
- layout = (layout & ~AV_CH_WIDE_LEFT) | AV_CH_FRONT_LEFT_OF_CENTER;
- if (layout & AV_CH_WIDE_RIGHT)
- layout = (layout & ~AV_CH_WIDE_RIGHT) | AV_CH_FRONT_RIGHT_OF_CENTER;
-
- if (layout & AV_CH_SURROUND_DIRECT_LEFT)
- layout = (layout & ~AV_CH_SURROUND_DIRECT_LEFT) | AV_CH_SIDE_LEFT;
- if (layout & AV_CH_SURROUND_DIRECT_RIGHT)
- layout = (layout & ~AV_CH_SURROUND_DIRECT_RIGHT) | AV_CH_SIDE_RIGHT;
- }
-
- return (DWORD)layout;
+ if (layout > UINT32_MAX) {
+ if (layout & AV_CH_WIDE_LEFT) {
+ layout = (layout & ~AV_CH_WIDE_LEFT) | AV_CH_FRONT_LEFT_OF_CENTER;
+ }
+ if (layout & AV_CH_WIDE_RIGHT) {
+ layout = (layout & ~AV_CH_WIDE_RIGHT) | AV_CH_FRONT_RIGHT_OF_CENTER;
+ }
+
+ if (layout & AV_CH_SURROUND_DIRECT_LEFT) {
+ layout = (layout & ~AV_CH_SURROUND_DIRECT_LEFT) | AV_CH_SIDE_LEFT;
+ }
+ if (layout & AV_CH_SURROUND_DIRECT_RIGHT) {
+ layout = (layout & ~AV_CH_SURROUND_DIRECT_RIGHT) | AV_CH_SIDE_RIGHT;
+ }
+ }
+
+ return (DWORD)layout;
}
CMpaDecFilter::CMpaDecFilter(LPUNKNOWN lpunk, HRESULT* phr)
- : CTransformFilter(NAME("CMpaDecFilter"), lpunk, __uuidof(this))
- , m_iSampleFormat(SF_PCM16)
- , m_bResync(false)
+ : CTransformFilter(NAME("CMpaDecFilter"), lpunk, __uuidof(this))
+ , m_iSampleFormat(SF_PCM16)
+ , m_bResync(false)
{
- if (phr) {
- *phr = S_OK;
- }
-
- m_pInput = DNew CMpaDecInputPin(this, phr, L"In");
- if (!m_pInput) {
- *phr = E_OUTOFMEMORY;
- }
- if (FAILED(*phr)) {
- return;
- }
-
- m_pOutput = DNew CTransformOutputPin(NAME("CTransformOutputPin"), this, phr, L"Out");
- if (!m_pOutput) {
- *phr = E_OUTOFMEMORY;
- }
- if (FAILED(*phr)) {
- delete m_pInput, m_pInput = NULL;
- return;
- }
-
- m_iSpeakerConfig[ac3] = A52_STEREO;
- m_iSpeakerConfig[dts] = DTS_STEREO;
- m_fDynamicRangeControl[ac3] = false;
- m_fDynamicRangeControl[dts] = false;
- m_DolbyDigitalMode = DD_Unknown;
+ if (phr) {
+ *phr = S_OK;
+ }
+
+ m_pInput = DNew CMpaDecInputPin(this, phr, L"In");
+ if (!m_pInput) {
+ *phr = E_OUTOFMEMORY;
+ }
+ if (FAILED(*phr)) {
+ return;
+ }
+
+ m_pOutput = DNew CTransformOutputPin(NAME("CTransformOutputPin"), this, phr, L"Out");
+ if (!m_pOutput) {
+ *phr = E_OUTOFMEMORY;
+ }
+ if (FAILED(*phr)) {
+ delete m_pInput, m_pInput = NULL;
+ return;
+ }
+
+ m_iSpeakerConfig[ac3] = A52_STEREO;
+ m_iSpeakerConfig[dts] = DTS_STEREO;
+ m_fDynamicRangeControl[ac3] = false;
+ m_fDynamicRangeControl[dts] = false;
+ m_DolbyDigitalMode = DD_Unknown;
#if defined(REGISTER_FILTER) || HAS_FFMPEG_AUDIO_DECODERS
- m_pAVCodec = NULL;
- m_pAVCtx = NULL;
- m_pParser = NULL;
- m_pFrame = NULL;
- m_pFFBuffer = NULL;
- m_nFFBufferSize = 0;
+ m_pAVCodec = NULL;
+ m_pAVCtx = NULL;
+ m_pParser = NULL;
+ m_pFrame = NULL;
+ m_pFFBuffer = NULL;
+ m_nFFBufferSize = 0;
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_AC3
- m_a52_state = NULL;
+ m_a52_state = NULL;
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_DTS
- m_dts_state = NULL;
+ m_dts_state = NULL;
#endif
#ifdef REGISTER_FILTER
- CRegKey key;
- if (ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPEG Audio Decoder"), KEY_READ)) {
- DWORD dw;
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("SampleFormat"), dw)) {
- m_iSampleFormat = (MPCSampleFormat)dw;
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Ac3SpeakerConfig"), dw)) {
- m_iSpeakerConfig[ac3] = (int)dw;
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("DtsSpeakerConfig"), dw)) {
- m_iSpeakerConfig[dts] = (int)dw;
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Ac3DynamicRangeControl"), dw)) {
- m_fDynamicRangeControl[ac3] = !!dw;
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("DtsDynamicRangeControl"), dw)) {
- m_fDynamicRangeControl[dts] = !!dw;
- }
- }
+ CRegKey key;
+ if (ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPEG Audio Decoder"), KEY_READ)) {
+ DWORD dw;
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("SampleFormat"), dw)) {
+ m_iSampleFormat = (MPCSampleFormat)dw;
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Ac3SpeakerConfig"), dw)) {
+ m_iSpeakerConfig[ac3] = (int)dw;
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("DtsSpeakerConfig"), dw)) {
+ m_iSpeakerConfig[dts] = (int)dw;
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Ac3DynamicRangeControl"), dw)) {
+ m_fDynamicRangeControl[ac3] = !!dw;
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("DtsDynamicRangeControl"), dw)) {
+ m_fDynamicRangeControl[dts] = !!dw;
+ }
+ }
#else
- m_iSampleFormat = (MPCSampleFormat)AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("SampleFormat"), m_iSampleFormat);
- m_iSpeakerConfig[ac3] = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("Ac3SpeakerConfig"), m_iSpeakerConfig[ac3]);
- m_iSpeakerConfig[dts] = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("DtsSpeakerConfig"), m_iSpeakerConfig[dts]);
- m_fDynamicRangeControl[ac3] = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("Ac3DynamicRangeControl"), m_fDynamicRangeControl[ac3]);
- m_fDynamicRangeControl[dts] = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("DtsDynamicRangeControl"), m_fDynamicRangeControl[dts]);
+ m_iSampleFormat = (MPCSampleFormat)AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("SampleFormat"), m_iSampleFormat);
+ m_iSpeakerConfig[ac3] = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("Ac3SpeakerConfig"), m_iSpeakerConfig[ac3]);
+ m_iSpeakerConfig[dts] = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("DtsSpeakerConfig"), m_iSpeakerConfig[dts]);
+ m_fDynamicRangeControl[ac3] = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("Ac3DynamicRangeControl"), m_fDynamicRangeControl[ac3]);
+ m_fDynamicRangeControl[dts] = !!AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("DtsDynamicRangeControl"), m_fDynamicRangeControl[dts]);
#endif
}
CMpaDecFilter::~CMpaDecFilter()
{
- StopStreaming();
+ StopStreaming();
}
STDMETHODIMP CMpaDecFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- return
- QI(IMpaDecFilter)
- QI(ISpecifyPropertyPages)
- QI(ISpecifyPropertyPages2)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IMpaDecFilter)
+ QI(ISpecifyPropertyPages)
+ QI(ISpecifyPropertyPages2)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
HRESULT CMpaDecFilter::EndOfStream()
{
- CAutoLock cAutoLock(&m_csReceive);
- return __super::EndOfStream();
+ CAutoLock cAutoLock(&m_csReceive);
+ return __super::EndOfStream();
}
HRESULT CMpaDecFilter::BeginFlush()
{
- return __super::BeginFlush();
+ return __super::BeginFlush();
}
HRESULT CMpaDecFilter::EndFlush()
{
- CAutoLock cAutoLock(&m_csReceive);
- m_buff.RemoveAll();
- return __super::EndFlush();
+ CAutoLock cAutoLock(&m_csReceive);
+ m_buff.RemoveAll();
+ return __super::EndFlush();
}
HRESULT CMpaDecFilter::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- CAutoLock cAutoLock(&m_csReceive);
- m_buff.RemoveAll();
- m_ps2_state.sync = false;
- m_DolbyDigitalMode = DD_Unknown;
+ CAutoLock cAutoLock(&m_csReceive);
+ m_buff.RemoveAll();
+ m_ps2_state.sync = false;
+ m_DolbyDigitalMode = DD_Unknown;
#if defined(REGISTER_FILTER) || HAS_FFMPEG_AUDIO_DECODERS
- if (m_pAVCtx) {
- avcodec_flush_buffers (m_pAVCtx);
- }
+ if (m_pAVCtx) {
+ avcodec_flush_buffers(m_pAVCtx);
+ }
#endif
- m_bResync = true;
+ m_bResync = true;
- return __super::NewSegment(tStart, tStop, dRate);
+ return __super::NewSegment(tStart, tStop, dRate);
}
#if defined(REGISTER_FILTER) || HAS_FFMPEG_AUDIO_DECODERS
enum CodecID CMpaDecFilter::FindCodec(const GUID subtype)
{
- for (int i=0; i<_countof(ffAudioCodecs); i++)
- if (subtype == *ffAudioCodecs[i].clsMinorType) {
- return ffAudioCodecs[i].nFFCodec;
- }
+ for (int i = 0; i < _countof(ffAudioCodecs); i++)
+ if (subtype == *ffAudioCodecs[i].clsMinorType) {
+ return ffAudioCodecs[i].nFFCodec;
+ }
- return CODEC_ID_NONE;
+ return CODEC_ID_NONE;
}
#endif
HRESULT CMpaDecFilter::Receive(IMediaSample* pIn)
{
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- HRESULT hr;
+ HRESULT hr;
- AM_SAMPLE2_PROPERTIES* const pProps = m_pInput->SampleProps();
- if (pProps->dwStreamId != AM_STREAM_MEDIA) {
- return m_pOutput->Deliver(pIn);
- }
+ AM_SAMPLE2_PROPERTIES* const pProps = m_pInput->SampleProps();
+ if (pProps->dwStreamId != AM_STREAM_MEDIA) {
+ return m_pOutput->Deliver(pIn);
+ }
- AM_MEDIA_TYPE* pmt;
- if (SUCCEEDED(pIn->GetMediaType(&pmt)) && pmt) {
- CMediaType mt(*pmt);
- m_pInput->SetMediaType(&mt);
- DeleteMediaType(pmt);
- pmt = NULL;
- m_DolbyDigitalMode = DD_Unknown;
- }
+ AM_MEDIA_TYPE* pmt;
+ if (SUCCEEDED(pIn->GetMediaType(&pmt)) && pmt) {
+ CMediaType mt(*pmt);
+ m_pInput->SetMediaType(&mt);
+ DeleteMediaType(pmt);
+ pmt = NULL;
+ m_DolbyDigitalMode = DD_Unknown;
+ }
- BYTE* pDataIn = NULL;
- if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
- return hr;
- }
+ BYTE* pDataIn = NULL;
+ if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
+ return hr;
+ }
- long len = pIn->GetActualDataLength();
+ long len = pIn->GetActualDataLength();
- (static_cast<CDeCSSInputPin*>(m_pInput))->StripPacket(pDataIn, len);
+ (static_cast<CDeCSSInputPin*>(m_pInput))->StripPacket(pDataIn, len);
- REFERENCE_TIME rtStart = _I64_MIN, rtStop = _I64_MIN;
- hr = pIn->GetTime(&rtStart, &rtStop);
+ REFERENCE_TIME rtStart = _I64_MIN, rtStop = _I64_MIN;
+ hr = pIn->GetTime(&rtStart, &rtStop);
#if 0
- if (SUCCEEDED(hr)) {
- TRACE(_T("CMpaDecFilter::Receive(): rtStart = %10I64d, rtStop = %10I64d\n"), rtStart, rtStop);
- } else {
- TRACE(_T("CMpaDecFilter::Receive(): frame without timestamp\n"));
- }
+ if (SUCCEEDED(hr)) {
+ TRACE(_T("CMpaDecFilter::Receive(): rtStart = %10I64d, rtStop = %10I64d\n"), rtStart, rtStop);
+ } else {
+ TRACE(_T("CMpaDecFilter::Receive(): frame without timestamp\n"));
+ }
#endif
- if (pIn->IsDiscontinuity() == S_OK) {
- m_fDiscontinuity = true;
- m_buff.RemoveAll();
- m_rtStart = rtStart;
- m_bResync = true;
- if (FAILED(hr)) {
- TRACE(_T("CMpaDecFilter::Receive() : Discontinuity without timestamp\n"));
- return S_OK;
- }
- }
-
- const GUID& subtype = m_pInput->CurrentMediaType().subtype;
-
- if ((subtype == MEDIASUBTYPE_COOK && (S_OK == pIn->IsSyncPoint())) || ((_abs64((m_rtStart - rtStart)) > MAX_JITTER) && ((subtype != MEDIASUBTYPE_COOK) && (subtype != MEDIASUBTYPE_ATRC) && (subtype != MEDIASUBTYPE_SIPR)))) {
- m_bResync = true;
- }
-
- if (SUCCEEDED(hr) && m_bResync) {
- m_buff.RemoveAll();
- m_rtStart = rtStart;
- m_bResync = false;
- }
-
- int bufflen = m_buff.GetCount();
- m_buff.SetCount(bufflen + len, 4096);
- memcpy(m_buff.GetData() + bufflen, pDataIn, len);
- len += bufflen;
+ if (pIn->IsDiscontinuity() == S_OK) {
+ m_fDiscontinuity = true;
+ m_buff.RemoveAll();
+ m_rtStart = rtStart;
+ m_bResync = true;
+ if (FAILED(hr)) {
+ TRACE(_T("CMpaDecFilter::Receive() : Discontinuity without timestamp\n"));
+ return S_OK;
+ }
+ }
+
+ const GUID& subtype = m_pInput->CurrentMediaType().subtype;
+
+ if ((subtype == MEDIASUBTYPE_COOK && (S_OK == pIn->IsSyncPoint())) || ((_abs64((m_rtStart - rtStart)) > MAX_JITTER) && ((subtype != MEDIASUBTYPE_COOK) && (subtype != MEDIASUBTYPE_ATRC) && (subtype != MEDIASUBTYPE_SIPR)))) {
+ m_bResync = true;
+ }
+
+ if (SUCCEEDED(hr) && m_bResync) {
+ m_buff.RemoveAll();
+ m_rtStart = rtStart;
+ m_bResync = false;
+ }
+
+ int bufflen = m_buff.GetCount();
+ m_buff.SetCount(bufflen + len, 4096);
+ memcpy(m_buff.GetData() + bufflen, pDataIn, len);
+ len += bufflen;
#if defined(REGISTER_FILTER) || HAS_FFMPEG_AUDIO_DECODERS
- enum CodecID nCodecId = FindCodec(subtype);
- if (nCodecId != CODEC_ID_NONE) {
- return ProcessFFmpeg(nCodecId);
- }
+ enum CodecID nCodecId = FindCodec(subtype);
+ if (nCodecId != CODEC_ID_NONE) {
+ return ProcessFFmpeg(nCodecId);
+ }
#endif
- if (0) {} // needed if decoders are disabled below
+ if (0) {} // needed if decoders are disabled below
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_LPCM
- else if (subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO) {
- hr = ProcessLPCM();
- } else if (subtype == MEDIASUBTYPE_HDMV_LPCM_AUDIO) {
- hr = ProcessHdmvLPCM(!!pIn->IsSyncPoint());
- }
+ else if (subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO) {
+ hr = ProcessLPCM();
+ } else if (subtype == MEDIASUBTYPE_HDMV_LPCM_AUDIO) {
+ hr = ProcessHdmvLPCM(!!pIn->IsSyncPoint());
+ }
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_AC3
- else if (subtype == MEDIASUBTYPE_DOLBY_AC3 ||
- subtype == MEDIASUBTYPE_WAVE_DOLBY_AC3 ||
- subtype == MEDIASUBTYPE_DNET) {
- hr = ProcessAC3();
- }
+ else if (subtype == MEDIASUBTYPE_DOLBY_AC3 ||
+ subtype == MEDIASUBTYPE_WAVE_DOLBY_AC3 ||
+ subtype == MEDIASUBTYPE_DNET) {
+ hr = ProcessAC3();
+ }
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_DTS
- else if (subtype == MEDIASUBTYPE_DTS || subtype == MEDIASUBTYPE_WAVE_DTS) {
- hr = ProcessDTS();
- }
+ else if (subtype == MEDIASUBTYPE_DTS || subtype == MEDIASUBTYPE_WAVE_DTS) {
+ hr = ProcessDTS();
+ }
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_PS2AUDIO
- else if (subtype == MEDIASUBTYPE_PS2_PCM) {
- hr = ProcessPS2PCM();
- } else if (subtype == MEDIASUBTYPE_PS2_ADPCM) {
- hr = ProcessPS2ADPCM();
- }
+ else if (subtype == MEDIASUBTYPE_PS2_PCM) {
+ hr = ProcessPS2PCM();
+ } else if (subtype == MEDIASUBTYPE_PS2_ADPCM) {
+ hr = ProcessPS2ADPCM();
+ }
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_PCM
- else if (subtype == MEDIASUBTYPE_PCM_NONE ||
- subtype == MEDIASUBTYPE_PCM_RAW) {
- hr = ProcessPCMraw();
- } else if (subtype == MEDIASUBTYPE_PCM_TWOS ||
- subtype == MEDIASUBTYPE_PCM_IN24 ||
- subtype == MEDIASUBTYPE_PCM_IN32) {
- hr = ProcessPCMintBE();
- } else if (subtype == MEDIASUBTYPE_PCM_SOWT) {
- hr = ProcessPCMintLE();
- } else if (subtype == MEDIASUBTYPE_PCM_FL32 ||
- subtype == MEDIASUBTYPE_PCM_FL64) {
- hr = ProcessPCMfloatBE();
- } else if (subtype == MEDIASUBTYPE_IEEE_FLOAT) {
- hr = ProcessPCMfloatLE();
- }
+ else if (subtype == MEDIASUBTYPE_PCM_NONE ||
+ subtype == MEDIASUBTYPE_PCM_RAW) {
+ hr = ProcessPCMraw();
+ } else if (subtype == MEDIASUBTYPE_PCM_TWOS ||
+ subtype == MEDIASUBTYPE_PCM_IN24 ||
+ subtype == MEDIASUBTYPE_PCM_IN32) {
+ hr = ProcessPCMintBE();
+ } else if (subtype == MEDIASUBTYPE_PCM_SOWT) {
+ hr = ProcessPCMintLE();
+ } else if (subtype == MEDIASUBTYPE_PCM_FL32 ||
+ subtype == MEDIASUBTYPE_PCM_FL64) {
+ hr = ProcessPCMfloatBE();
+ } else if (subtype == MEDIASUBTYPE_IEEE_FLOAT) {
+ hr = ProcessPCMfloatLE();
+ }
#endif
- return hr;
+ return hr;
}
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_LPCM
HRESULT CMpaDecFilter::ProcessLPCM()
{
- WAVEFORMATEX* wfein = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
-
- if (wfein->nChannels < 1 || wfein->nChannels > 8) {
- return ERROR_NOT_SUPPORTED;
- }
-
- int nChannels = wfein->nChannels;
-
- BYTE* pDataIn = m_buff.GetData();
- int BytesPerDoubleSample = (wfein->wBitsPerSample * 2)/8;
- int BytesPerDoubleChannelSample = BytesPerDoubleSample * nChannels;
- int nInBytes = m_buff.GetCount();
- int len = (nInBytes / BytesPerDoubleChannelSample) * (BytesPerDoubleChannelSample); // We always code 2 samples at a time
-
- CAtlArray<float> pBuff;
- pBuff.SetCount((len/BytesPerDoubleSample) * 2);
-
- float* pDataOut = pBuff.GetData();
-
- switch (wfein->wBitsPerSample) {
- case 16 : {
- long nSamples = len/(BytesPerDoubleChannelSample);
- int16 Temp[2][8];
- for (int i=0; i<nSamples; i++) {
- for (int j = 0; j < nChannels; j++) {
- uint16 All = *((uint16 *)pDataIn);
- pDataIn += 2;
- int16 Part1 = (All & 0xFF) << 8 | (All & 0xFF00) >> 8;
- Temp[0][j] = Part1;
- }
- for (int j = 0; j < nChannels; j++) {
- uint16 All = *((uint16 *)pDataIn);
- pDataIn += 2;
- int16 Part1 = (All & 0xFF) << 8 | (All & 0xFF00) >> 8;
- Temp[1][j] = Part1;
- }
-
- for (int j = 0; j < nChannels; j++) {
- *pDataOut = float(Temp[0][j]) / INT16_PEAK;
- ++pDataOut;
- }
- for (int j = 0; j < nChannels; j++) {
- *pDataOut = float(Temp[1][j]) / INT16_PEAK;
- ++pDataOut;
- }
- }
- }
- break;
-
- case 24 : {
- long nSamples = len/(BytesPerDoubleChannelSample);
- int32 Temp[2][8];
- for (int i=0; i<nSamples; i++) {
- // Start by upper 16 bits
- for (int j = 0; j < nChannels; j++) {
- uint32 All = *((uint16 *)pDataIn);
- pDataIn += 2;
- uint32 Part1 = (All & 0xFF) << 24 | (All & 0xFF00) << 8;
- Temp[0][j] = Part1;
- }
- for (int j = 0; j < nChannels; j++) {
- uint32 All = *((uint16 *)pDataIn);
- pDataIn += 2;
- uint32 Part1 = (All & 0xFF) << 24 | (All & 0xFF00) << 8;
- Temp[1][j] = Part1;
- }
-
- // Continue with lower bits
- for (int j = 0; j < nChannels; j++) {
- uint32 All = *((uint8 *)pDataIn);
- pDataIn += 1;
- Temp[0][j] = int32(Temp[0][j] | (All << 8)) >> 8;
- }
- for (int j = 0; j < nChannels; j++) {
- uint32 All = *((uint8 *)pDataIn);
- pDataIn += 1;
- Temp[1][j] = int32(Temp[1][j] | (All << 8)) >> 8;
- }
-
- // Convert into float
- for (int j = 0; j < nChannels; j++) {
- *pDataOut = float(Temp[0][j]) / INT24_PEAK;
- ++pDataOut;
- }
- for (int j = 0; j < nChannels; j++) {
- *pDataOut = float(Temp[1][j]) / INT24_PEAK;
- ++pDataOut;
- }
- }
- }
- break;
- case 20 : {
- long nSamples = len/(BytesPerDoubleChannelSample);
- int32 Temp[2][8];
- for (int i=0; i<nSamples; i++) {
- // Start by upper 16 bits
- for (int j = 0; j < nChannels; j++) {
- uint32 All = *((uint16 *)pDataIn);
- pDataIn += 2;
- uint32 Part1 = (All & 0xFF) << 24 | (All & 0xFF00) << 8;
- Temp[0][j] = Part1;
- }
- for (int j = 0; j < nChannels; j++) {
- uint32 All = *((uint16 *)pDataIn);
- pDataIn += 2;
- uint32 Part1 = (All & 0xFF) << 24 | (All & 0xFF00) << 8;
- Temp[1][j] = Part1;
- }
-
- // Continue with lower bits
- for (int j = 0; j < nChannels; j++) {
- uint32 All = *((uint8 *)pDataIn);
- pDataIn += 1;
- Temp[0][j] = int32(Temp[0][j] | ((All&0xf0) << 8)) >> 8;
- Temp[1][j] = int32(Temp[1][j] | ((All&0x0f) << 12)) >> 8;
- }
-
- // Convert into float
- for (int j = 0; j < nChannels; j++) {
- *pDataOut = float(Temp[0][j]) / INT24_PEAK;
- ++pDataOut;
- }
- for (int j = 0; j < nChannels; j++) {
- *pDataOut = float(Temp[1][j]) / INT24_PEAK;
- ++pDataOut;
- }
- }
- }
- break;
- }
-
- memmove(m_buff.GetData(), pDataIn, m_buff.GetCount() - len );
- m_buff.SetCount(m_buff.GetCount() - len);
-
- return Deliver(pBuff, wfein->nSamplesPerSec, wfein->nChannels, GetDefChannelMask(wfein->nChannels));
+ WAVEFORMATEX* wfein = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
+
+ if (wfein->nChannels < 1 || wfein->nChannels > 8) {
+ return ERROR_NOT_SUPPORTED;
+ }
+
+ int nChannels = wfein->nChannels;
+
+ BYTE* pDataIn = m_buff.GetData();
+ int BytesPerDoubleSample = (wfein->wBitsPerSample * 2) / 8;
+ int BytesPerDoubleChannelSample = BytesPerDoubleSample * nChannels;
+ int nInBytes = m_buff.GetCount();
+ int len = (nInBytes / BytesPerDoubleChannelSample) * (BytesPerDoubleChannelSample); // We always code 2 samples at a time
+
+ CAtlArray<float> pBuff;
+ pBuff.SetCount((len / BytesPerDoubleSample) * 2);
+
+ float* pDataOut = pBuff.GetData();
+
+ switch (wfein->wBitsPerSample) {
+ case 16 : {
+ long nSamples = len / (BytesPerDoubleChannelSample);
+ int16 Temp[2][8];
+ for (int i = 0; i < nSamples; i++) {
+ for (int j = 0; j < nChannels; j++) {
+ uint16 All = *((uint16*)pDataIn);
+ pDataIn += 2;
+ int16 Part1 = (All & 0xFF) << 8 | (All & 0xFF00) >> 8;
+ Temp[0][j] = Part1;
+ }
+ for (int j = 0; j < nChannels; j++) {
+ uint16 All = *((uint16*)pDataIn);
+ pDataIn += 2;
+ int16 Part1 = (All & 0xFF) << 8 | (All & 0xFF00) >> 8;
+ Temp[1][j] = Part1;
+ }
+
+ for (int j = 0; j < nChannels; j++) {
+ *pDataOut = float(Temp[0][j]) / INT16_PEAK;
+ ++pDataOut;
+ }
+ for (int j = 0; j < nChannels; j++) {
+ *pDataOut = float(Temp[1][j]) / INT16_PEAK;
+ ++pDataOut;
+ }
+ }
+ }
+ break;
+
+ case 24 : {
+ long nSamples = len / (BytesPerDoubleChannelSample);
+ int32 Temp[2][8];
+ for (int i = 0; i < nSamples; i++) {
+ // Start by upper 16 bits
+ for (int j = 0; j < nChannels; j++) {
+ uint32 All = *((uint16*)pDataIn);
+ pDataIn += 2;
+ uint32 Part1 = (All & 0xFF) << 24 | (All & 0xFF00) << 8;
+ Temp[0][j] = Part1;
+ }
+ for (int j = 0; j < nChannels; j++) {
+ uint32 All = *((uint16*)pDataIn);
+ pDataIn += 2;
+ uint32 Part1 = (All & 0xFF) << 24 | (All & 0xFF00) << 8;
+ Temp[1][j] = Part1;
+ }
+
+ // Continue with lower bits
+ for (int j = 0; j < nChannels; j++) {
+ uint32 All = *((uint8*)pDataIn);
+ pDataIn += 1;
+ Temp[0][j] = int32(Temp[0][j] | (All << 8)) >> 8;
+ }
+ for (int j = 0; j < nChannels; j++) {
+ uint32 All = *((uint8*)pDataIn);
+ pDataIn += 1;
+ Temp[1][j] = int32(Temp[1][j] | (All << 8)) >> 8;
+ }
+
+ // Convert into float
+ for (int j = 0; j < nChannels; j++) {
+ *pDataOut = float(Temp[0][j]) / INT24_PEAK;
+ ++pDataOut;
+ }
+ for (int j = 0; j < nChannels; j++) {
+ *pDataOut = float(Temp[1][j]) / INT24_PEAK;
+ ++pDataOut;
+ }
+ }
+ }
+ break;
+ case 20 : {
+ long nSamples = len / (BytesPerDoubleChannelSample);
+ int32 Temp[2][8];
+ for (int i = 0; i < nSamples; i++) {
+ // Start by upper 16 bits
+ for (int j = 0; j < nChannels; j++) {
+ uint32 All = *((uint16*)pDataIn);
+ pDataIn += 2;
+ uint32 Part1 = (All & 0xFF) << 24 | (All & 0xFF00) << 8;
+ Temp[0][j] = Part1;
+ }
+ for (int j = 0; j < nChannels; j++) {
+ uint32 All = *((uint16*)pDataIn);
+ pDataIn += 2;
+ uint32 Part1 = (All & 0xFF) << 24 | (All & 0xFF00) << 8;
+ Temp[1][j] = Part1;
+ }
+
+ // Continue with lower bits
+ for (int j = 0; j < nChannels; j++) {
+ uint32 All = *((uint8*)pDataIn);
+ pDataIn += 1;
+ Temp[0][j] = int32(Temp[0][j] | ((All & 0xf0) << 8)) >> 8;
+ Temp[1][j] = int32(Temp[1][j] | ((All & 0x0f) << 12)) >> 8;
+ }
+
+ // Convert into float
+ for (int j = 0; j < nChannels; j++) {
+ *pDataOut = float(Temp[0][j]) / INT24_PEAK;
+ ++pDataOut;
+ }
+ for (int j = 0; j < nChannels; j++) {
+ *pDataOut = float(Temp[1][j]) / INT24_PEAK;
+ ++pDataOut;
+ }
+ }
+ }
+ break;
+ }
+
+ memmove(m_buff.GetData(), pDataIn, m_buff.GetCount() - len);
+ m_buff.SetCount(m_buff.GetCount() - len);
+
+ return Deliver(pBuff, wfein->nSamplesPerSec, wfein->nChannels, GetDefChannelMask(wfein->nChannels));
}
HRESULT CMpaDecFilter::ProcessHdmvLPCM(bool bAlignOldBuffer) // Blu ray LPCM
{
- WAVEFORMATEX_HDMV_LPCM* wfein = (WAVEFORMATEX_HDMV_LPCM*)m_pInput->CurrentMediaType().Format();
-
- scmap_t* remap = &s_scmap_hdmv [wfein->channel_conf];
- int nChannels = wfein->nChannels;
- int xChannels = nChannels + (nChannels % 2);
- int BytesPerSample = (wfein->wBitsPerSample + 7) / 8;
- int BytesPerFrame = BytesPerSample * xChannels;
-
- BYTE* pDataIn = m_buff.GetData();
- int len = m_buff.GetCount() - (m_buff.GetCount() % BytesPerFrame);
- if (bAlignOldBuffer) {
- m_buff.SetCount(len);
- }
- int nFrames = len/xChannels/BytesPerSample;
-
- CAtlArray<float> pBuff;
- pBuff.SetCount(nFrames*nChannels); //nSamples
- float* pDataOut = pBuff.GetData();
-
- switch (wfein->wBitsPerSample) {
- case 16 :
- for (int i=0; i<nFrames; i++) {
- for (int j = 0; j < nChannels; j++) {
- BYTE nRemap = remap->ch[j];
- *pDataOut = (float)(int16_t)(pDataIn[nRemap*2]<<8 | pDataIn[nRemap*2+1]) / INT16_PEAK;
- pDataOut++;
- }
- pDataIn += xChannels*2;
- }
- break;
- case 24 :
- case 20 :
- for (int i=0; i<nFrames; i++) {
- for (int j = 0; j < nChannels; j++) {
- BYTE nRemap = remap->ch[j];
- *pDataOut = (float)(int32_t)(pDataIn[nRemap*3]<<24 | pDataIn[nRemap*3+1]<<16 | pDataIn[nRemap*3+2]<<8) / INT32_PEAK;
- pDataOut++;
- }
- pDataIn += xChannels*3;
- }
- break;
- }
- memmove(m_buff.GetData(), pDataIn, m_buff.GetCount() - len );
- m_buff.SetCount(m_buff.GetCount() - len);
-
- return Deliver(pBuff, wfein->nSamplesPerSec, wfein->nChannels, remap->dwChannelMask);
+ WAVEFORMATEX_HDMV_LPCM* wfein = (WAVEFORMATEX_HDMV_LPCM*)m_pInput->CurrentMediaType().Format();
+
+ scmap_t* remap = &s_scmap_hdmv [wfein->channel_conf];
+ int nChannels = wfein->nChannels;
+ int xChannels = nChannels + (nChannels % 2);
+ int BytesPerSample = (wfein->wBitsPerSample + 7) / 8;
+ int BytesPerFrame = BytesPerSample * xChannels;
+
+ BYTE* pDataIn = m_buff.GetData();
+ int len = m_buff.GetCount() - (m_buff.GetCount() % BytesPerFrame);
+ if (bAlignOldBuffer) {
+ m_buff.SetCount(len);
+ }
+ int nFrames = len / xChannels / BytesPerSample;
+
+ CAtlArray<float> pBuff;
+ pBuff.SetCount(nFrames * nChannels); //nSamples
+ float* pDataOut = pBuff.GetData();
+
+ switch (wfein->wBitsPerSample) {
+ case 16 :
+ for (int i = 0; i < nFrames; i++) {
+ for (int j = 0; j < nChannels; j++) {
+ BYTE nRemap = remap->ch[j];
+ *pDataOut = (float)(int16_t)(pDataIn[nRemap * 2] << 8 | pDataIn[nRemap * 2 + 1]) / INT16_PEAK;
+ pDataOut++;
+ }
+ pDataIn += xChannels * 2;
+ }
+ break;
+ case 24 :
+ case 20 :
+ for (int i = 0; i < nFrames; i++) {
+ for (int j = 0; j < nChannels; j++) {
+ BYTE nRemap = remap->ch[j];
+ *pDataOut = (float)(int32_t)(pDataIn[nRemap * 3] << 24 | pDataIn[nRemap * 3 + 1] << 16 | pDataIn[nRemap * 3 + 2] << 8) / INT32_PEAK;
+ pDataOut++;
+ }
+ pDataIn += xChannels * 3;
+ }
+ break;
+ }
+ memmove(m_buff.GetData(), pDataIn, m_buff.GetCount() - len);
+ m_buff.SetCount(m_buff.GetCount() - len);
+
+ return Deliver(pBuff, wfein->nSamplesPerSec, wfein->nChannels, remap->dwChannelMask);
}
#endif /* INTERNAL_DECODER_LPCM */
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_AC3
HRESULT CMpaDecFilter::ProcessA52(BYTE* p, int buffsize, int& size, bool& fEnoughData)
{
- int flags, sample_rate, bit_rate;
-
- if ((size = a52_syncinfo(p, &flags, &sample_rate, &bit_rate)) > 0) {
- // TRACE(_T("ac3: size=%d, flags=%08x, sample_rate=%d, bit_rate=%d\n"), size, flags, sample_rate, bit_rate);
-
- fEnoughData = size <= buffsize;
-
- if (fEnoughData) {
- int iSpeakerConfig = GetSpeakerConfig(ac3);
-
- if (iSpeakerConfig < 0) {
- HRESULT hr;
- if (S_OK != (hr = DeliverBitstream(p, size, sample_rate, 1536, 0x0001))) {
- return hr;
- }
- } else {
- flags = iSpeakerConfig&(A52_CHANNEL_MASK|A52_LFE);
- flags |= A52_ADJUST_LEVEL;
-
- sample_t level = 1, gain = 1, bias = 0;
- level *= gain;
-
- if (a52_frame(m_a52_state, p, &flags, &level, bias) == 0) {
- if (GetDynamicRangeControl(ac3)) {
- a52_dynrng(m_a52_state, NULL, NULL);
- }
-
- int scmapidx = min(flags&A52_CHANNEL_MASK, _countof(s_scmap_a52dec)/2);
- scmap_t& scmap = s_scmap_a52dec[scmapidx + ((flags&A52_LFE)?(_countof(s_scmap_a52dec)/2):0)];
-
- CAtlArray<float> pBuff;
- pBuff.SetCount(6*256*scmap.nChannels);
- float* p = pBuff.GetData();
-
- int i = 0;
-
- for (; i < 6 && a52_block(m_a52_state) == 0; i++) {
- sample_t* samples = a52_samples(m_a52_state);
-
- for (int j = 0; j < 256; j++, samples++) {
- for (int ch = 0; ch < scmap.nChannels; ch++) {
- ASSERT(scmap.ch[ch] != -1);
- *p++ = (float)(*(samples + 256*scmap.ch[ch]) / level);
- }
- }
- }
-
- if (i == 6) {
- HRESULT hr;
- if (S_OK != (hr = Deliver(pBuff, sample_rate, scmap.nChannels, scmap.dwChannelMask))) {
- return hr;
- }
- }
- }
- }
- }
- }
-
- return S_OK;
+ int flags, sample_rate, bit_rate;
+
+ if ((size = a52_syncinfo(p, &flags, &sample_rate, &bit_rate)) > 0) {
+ // TRACE(_T("ac3: size=%d, flags=%08x, sample_rate=%d, bit_rate=%d\n"), size, flags, sample_rate, bit_rate);
+
+ fEnoughData = size <= buffsize;
+
+ if (fEnoughData) {
+ int iSpeakerConfig = GetSpeakerConfig(ac3);
+
+ if (iSpeakerConfig < 0) {
+ HRESULT hr;
+ if (S_OK != (hr = DeliverBitstream(p, size, sample_rate, 1536, 0x0001))) {
+ return hr;
+ }
+ } else {
+ flags = iSpeakerConfig & (A52_CHANNEL_MASK | A52_LFE);
+ flags |= A52_ADJUST_LEVEL;
+
+ sample_t level = 1, gain = 1, bias = 0;
+ level *= gain;
+
+ if (a52_frame(m_a52_state, p, &flags, &level, bias) == 0) {
+ if (GetDynamicRangeControl(ac3)) {
+ a52_dynrng(m_a52_state, NULL, NULL);
+ }
+
+ int scmapidx = min(flags & A52_CHANNEL_MASK, _countof(s_scmap_a52dec) / 2);
+ scmap_t& scmap = s_scmap_a52dec[scmapidx + ((flags & A52_LFE) ? (_countof(s_scmap_a52dec) / 2) : 0)];
+
+ CAtlArray<float> pBuff;
+ pBuff.SetCount(6 * 256 * scmap.nChannels);
+ float* p = pBuff.GetData();
+
+ int i = 0;
+
+ for (; i < 6 && a52_block(m_a52_state) == 0; i++) {
+ sample_t* samples = a52_samples(m_a52_state);
+
+ for (int j = 0; j < 256; j++, samples++) {
+ for (int ch = 0; ch < scmap.nChannels; ch++) {
+ ASSERT(scmap.ch[ch] != -1);
+ *p++ = (float)(*(samples + 256 * scmap.ch[ch]) / level);
+ }
+ }
+ }
+
+ if (i == 6) {
+ HRESULT hr;
+ if (S_OK != (hr = Deliver(pBuff, sample_rate, scmap.nChannels, scmap.dwChannelMask))) {
+ return hr;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return S_OK;
}
HRESULT CMpaDecFilter::ProcessAC3()
{
- HRESULT hr;
- BYTE* p = m_buff.GetData();
- BYTE* base = p;
- BYTE* end = p + m_buff.GetCount();
-
- while (p < end && end - p >= AC3_HEADER_SIZE) {
- int size = 0;
- bool fEnoughData = true;
-
- if (m_DolbyDigitalMode != DD_TRUEHD && m_DolbyDigitalMode != DD_MLP && (*((__int16*)p) == 0x770b)) { /* AC3-EAC3 syncword */
- BYTE bsid = p[5] >> 3;
- if (bsid <= 10) {
- if (FAILED (hr = ProcessA52 (p, int(end-p), size, fEnoughData))) {
- return hr;
- }
- m_DolbyDigitalMode = DD_AC3;
- } else if (bsid <= 16) {
- DeliverFFmpeg(CODEC_ID_EAC3, p, int(end-p), size);
- if (size > 0) {
- m_DolbyDigitalMode = DD_EAC3;
- }
- } else {
- p++;
- continue;
- }
- } else if ( (*((__int32*)(p+4)) == 0xba6f72f8) || // TrueHD major sync frame
- m_DolbyDigitalMode == DD_TRUEHD ) {
- int nLenght = (((p[0]<<8) + p[1]) & 0x0FFF)*2;
-
- m_DolbyDigitalMode = DD_TRUEHD;
-
- if (nLenght >= 4) {
- DeliverFFmpeg(CODEC_ID_TRUEHD, p, int(end-p), size);
- if (size<0) {
- size = (int)(end-p);
- }
- }
- } else if ( (*((__int32*)(p+4)) == 0xbb6f72f8) || // MLP major sync frame
- m_DolbyDigitalMode == DD_MLP ) {
- int nLenght = (((p[0]<<8) + p[1]) & 0x0FFF)*2;
-
- m_DolbyDigitalMode = DD_MLP;
-
- if (nLenght >= 4) {
- DeliverFFmpeg(CODEC_ID_MLP, p, int(end-p), size);
- if (size<0) {
- size = (int)(end-p);
- }
- }
- } else {
- p++;
- continue;
- }
-
- // Update buffer position
- if (fEnoughData) {
- ASSERT (size <= end-p);
- if (size <= 0 || size > end-p) {
- break;
- }
- p += size;
- }
- memmove(base, p, end - p);
- end = base + (end - p);
- p = base;
- if (!fEnoughData) {
- break;
- }
- }
-
- m_buff.SetCount(end - p);
-
- return S_OK;
+ HRESULT hr;
+ BYTE* p = m_buff.GetData();
+ BYTE* base = p;
+ BYTE* end = p + m_buff.GetCount();
+
+ while (p < end && end - p >= AC3_HEADER_SIZE) {
+ int size = 0;
+ bool fEnoughData = true;
+
+ if (m_DolbyDigitalMode != DD_TRUEHD && m_DolbyDigitalMode != DD_MLP && (*((__int16*)p) == 0x770b)) { /* AC3-EAC3 syncword */
+ BYTE bsid = p[5] >> 3;
+ if (bsid <= 10) {
+ if (FAILED(hr = ProcessA52(p, int(end - p), size, fEnoughData))) {
+ return hr;
+ }
+ m_DolbyDigitalMode = DD_AC3;
+ } else if (bsid <= 16) {
+ DeliverFFmpeg(CODEC_ID_EAC3, p, int(end - p), size);
+ if (size > 0) {
+ m_DolbyDigitalMode = DD_EAC3;
+ }
+ } else {
+ p++;
+ continue;
+ }
+ } else if ((*((__int32*)(p + 4)) == 0xba6f72f8) || // TrueHD major sync frame
+ m_DolbyDigitalMode == DD_TRUEHD) {
+ int nLenght = (((p[0] << 8) + p[1]) & 0x0FFF) * 2;
+
+ m_DolbyDigitalMode = DD_TRUEHD;
+
+ if (nLenght >= 4) {
+ DeliverFFmpeg(CODEC_ID_TRUEHD, p, int(end - p), size);
+ if (size < 0) {
+ size = (int)(end - p);
+ }
+ }
+ } else if ((*((__int32*)(p + 4)) == 0xbb6f72f8) || // MLP major sync frame
+ m_DolbyDigitalMode == DD_MLP) {
+ int nLenght = (((p[0] << 8) + p[1]) & 0x0FFF) * 2;
+
+ m_DolbyDigitalMode = DD_MLP;
+
+ if (nLenght >= 4) {
+ DeliverFFmpeg(CODEC_ID_MLP, p, int(end - p), size);
+ if (size < 0) {
+ size = (int)(end - p);
+ }
+ }
+ } else {
+ p++;
+ continue;
+ }
+
+ // Update buffer position
+ if (fEnoughData) {
+ ASSERT(size <= end - p);
+ if (size <= 0 || size > end - p) {
+ break;
+ }
+ p += size;
+ }
+ memmove(base, p, end - p);
+ end = base + (end - p);
+ p = base;
+ if (!fEnoughData) {
+ break;
+ }
+ }
+
+ m_buff.SetCount(end - p);
+
+ return S_OK;
}
#endif /* INTERNAL_DECODER_AC3 */
#if defined(REGISTER_FILTER) || HAS_FFMPEG_AUDIO_DECODERS
HRESULT CMpaDecFilter::ProcessFFmpeg(enum CodecID nCodecId)
{
- HRESULT hr;
- BYTE* p = m_buff.GetData();
- BYTE* base = p;
- BYTE* end = p + m_buff.GetCount();
-
- int size = 0;
- hr = DeliverFFmpeg(nCodecId, p, int(end-p), size);
- if (FAILED(hr)) {
- if (!(nCodecId == CODEC_ID_AAC || nCodecId == CODEC_ID_AAC_LATM)) {
- m_buff.RemoveAll();
- m_bResync = true;
- }
- return S_OK;
- }
-
- if (size <= 0) {
- return hr;
- }
-
- m_DolbyDigitalMode = (nCodecId == CODEC_ID_TRUEHD) ? DD_TRUEHD : (nCodecId == CODEC_ID_EAC3) ? DD_EAC3 : DD_Unknown;
-
- p += size;
- memmove(base, p, end - p);
- end = base + (end - p);
- p = base;
- m_buff.SetCount(end - p);
-
- return hr;
+ HRESULT hr;
+ BYTE* p = m_buff.GetData();
+ BYTE* base = p;
+ BYTE* end = p + m_buff.GetCount();
+
+ int size = 0;
+ hr = DeliverFFmpeg(nCodecId, p, int(end - p), size);
+ if (FAILED(hr)) {
+ if (!(nCodecId == CODEC_ID_AAC || nCodecId == CODEC_ID_AAC_LATM)) {
+ m_buff.RemoveAll();
+ m_bResync = true;
+ }
+ return S_OK;
+ }
+
+ if (size <= 0) {
+ return hr;
+ }
+
+ m_DolbyDigitalMode = (nCodecId == CODEC_ID_TRUEHD) ? DD_TRUEHD : (nCodecId == CODEC_ID_EAC3) ? DD_EAC3 : DD_Unknown;
+
+ p += size;
+ memmove(base, p, end - p);
+ end = base + (end - p);
+ p = base;
+ m_buff.SetCount(end - p);
+
+ return hr;
}
#endif /* HAS_FFMPEG_AUDIO_DECODERS */
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_DTS
HRESULT CMpaDecFilter::ProcessDTS()
{
- BYTE* p = m_buff.GetData();
- BYTE* base = p;
- BYTE* end = p + m_buff.GetCount();
-
- while (end - p >= 14) {
- int size = 0, flags, sample_rate, bit_rate, frame_length;
-
- if ((size = dts_syncinfo(m_dts_state, p, &flags, &sample_rate, &bit_rate, &frame_length)) > 0) {
- // TRACE(_T("dts: size=%d, flags=%08x, sample_rate=%d, bit_rate=%d, frame_length=%d\n"), size, flags, sample_rate, bit_rate, frame_length);
- bit_rate = int (size * 8i64 * sample_rate / frame_length); // calculate actual bitrate
-
- bool fEnoughData = p + size <= end;
-
- if (fEnoughData) {
- int iSpeakerConfig = GetSpeakerConfig(dts);
-
- if (iSpeakerConfig < 0) {
- HRESULT hr;
- if (S_OK != (hr = DeliverBitstream(p, size, sample_rate, frame_length, 0x000b))) {
- return hr;
- }
- } else {
- flags = iSpeakerConfig&(DTS_CHANNEL_MASK|DTS_LFE);
- flags |= DTS_ADJUST_LEVEL;
-
- sample_t level = 1, gain = 1, bias = 0;
- level *= gain;
-
- if (dts_frame(m_dts_state, p, &flags, &level, bias) == 0) {
- if (GetDynamicRangeControl(dts)) {
- dts_dynrng(m_dts_state, NULL, NULL);
- }
-
- int scmapidx = min(flags&DTS_CHANNEL_MASK, _countof(s_scmap_libdca)/2);
- scmap_t& scmap = s_scmap_libdca[scmapidx + ((flags&DTS_LFE)?(_countof(s_scmap_libdca)/2):0)];
-
- int blocks = dts_blocks_num(m_dts_state);
-
- CAtlArray<float> pBuff;
- pBuff.SetCount(blocks*256*scmap.nChannels);
- float* p = pBuff.GetData();
-
- int i = 0;
-
- for (; i < blocks && dts_block(m_dts_state) == 0; i++) {
- sample_t* samples = dts_samples(m_dts_state);
-
- for (int j = 0; j < 256; j++, samples++) {
- for (int ch = 0; ch < scmap.nChannels; ch++) {
- ASSERT(scmap.ch[ch] != -1);
- *p++ = (float)(*(samples + 256*scmap.ch[ch]) / level);
- }
- }
- }
-
- if (i == blocks) {
- HRESULT hr;
- if (S_OK != (hr = Deliver(pBuff, sample_rate, scmap.nChannels, scmap.dwChannelMask))) {
- return hr;
- }
- }
- }
- }
-
- p += size;
- }
-
- memmove(base, p, end - p);
- end = base + (end - p);
- p = base;
-
- if (!fEnoughData) {
- break;
- }
- } else {
- p++;
- }
- }
-
- m_buff.SetCount(end - p);
-
- return S_OK;
+ BYTE* p = m_buff.GetData();
+ BYTE* base = p;
+ BYTE* end = p + m_buff.GetCount();
+
+ while (end - p >= 14) {
+ int size = 0, flags, sample_rate, bit_rate, frame_length;
+
+ if ((size = dts_syncinfo(m_dts_state, p, &flags, &sample_rate, &bit_rate, &frame_length)) > 0) {
+ // TRACE(_T("dts: size=%d, flags=%08x, sample_rate=%d, bit_rate=%d, frame_length=%d\n"), size, flags, sample_rate, bit_rate, frame_length);
+ bit_rate = int (size * 8i64 * sample_rate / frame_length); // calculate actual bitrate
+
+ bool fEnoughData = p + size <= end;
+
+ if (fEnoughData) {
+ int iSpeakerConfig = GetSpeakerConfig(dts);
+
+ if (iSpeakerConfig < 0) {
+ HRESULT hr;
+ if (S_OK != (hr = DeliverBitstream(p, size, sample_rate, frame_length, 0x000b))) {
+ return hr;
+ }
+ } else {
+ flags = iSpeakerConfig & (DTS_CHANNEL_MASK | DTS_LFE);
+ flags |= DTS_ADJUST_LEVEL;
+
+ sample_t level = 1, gain = 1, bias = 0;
+ level *= gain;
+
+ if (dts_frame(m_dts_state, p, &flags, &level, bias) == 0) {
+ if (GetDynamicRangeControl(dts)) {
+ dts_dynrng(m_dts_state, NULL, NULL);
+ }
+
+ int scmapidx = min(flags & DTS_CHANNEL_MASK, _countof(s_scmap_libdca) / 2);
+ scmap_t& scmap = s_scmap_libdca[scmapidx + ((flags & DTS_LFE) ? (_countof(s_scmap_libdca) / 2) : 0)];
+
+ int blocks = dts_blocks_num(m_dts_state);
+
+ CAtlArray<float> pBuff;
+ pBuff.SetCount(blocks * 256 * scmap.nChannels);
+ float* p = pBuff.GetData();
+
+ int i = 0;
+
+ for (; i < blocks && dts_block(m_dts_state) == 0; i++) {
+ sample_t* samples = dts_samples(m_dts_state);
+
+ for (int j = 0; j < 256; j++, samples++) {
+ for (int ch = 0; ch < scmap.nChannels; ch++) {
+ ASSERT(scmap.ch[ch] != -1);
+ *p++ = (float)(*(samples + 256 * scmap.ch[ch]) / level);
+ }
+ }
+ }
+
+ if (i == blocks) {
+ HRESULT hr;
+ if (S_OK != (hr = Deliver(pBuff, sample_rate, scmap.nChannels, scmap.dwChannelMask))) {
+ return hr;
+ }
+ }
+ }
+ }
+
+ p += size;
+ }
+
+ memmove(base, p, end - p);
+ end = base + (end - p);
+ p = base;
+
+ if (!fEnoughData) {
+ break;
+ }
+ } else {
+ p++;
+ }
+ }
+
+ m_buff.SetCount(end - p);
+
+ return S_OK;
}
#endif /* INTERNAL_DECODER_DTS */
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_PCM
HRESULT CMpaDecFilter::ProcessPCMraw() //'raw '
{
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
- unsigned int nSamples = m_buff.GetCount() * 8 / wfe->wBitsPerSample;
-
- CAtlArray<float> pBuff;
- pBuff.SetCount(nSamples);
- float* f = pBuff.GetData();
-
- switch (wfe->wBitsPerSample) {
- case 8: { //unsigned 8-bit
- uint8_t* b = (uint8_t*)m_buff.GetData();
- for (unsigned int i = 0; i < nSamples; i++) {
- f[i] = (float)(int8_t)(b[i] + 128) / INT8_PEAK;
- }
- }
- break;
- case 16: { //signed big-endian 16 bit
- uint16_t* d = (uint16_t*)m_buff.GetData();//signed take as an unsigned to shift operations.
- for (unsigned int i = 0; i < nSamples; i++) {
- f[i] = (float)(int16_t)(d[i] << 8 | d[i] >> 8) / INT16_PEAK;
- }
- }
- break;
- }
-
- HRESULT hr;
- if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
- return hr;
- }
-
- m_buff.RemoveAll();
- return S_OK;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
+ unsigned int nSamples = m_buff.GetCount() * 8 / wfe->wBitsPerSample;
+
+ CAtlArray<float> pBuff;
+ pBuff.SetCount(nSamples);
+ float* f = pBuff.GetData();
+
+ switch (wfe->wBitsPerSample) {
+ case 8: { //unsigned 8-bit
+ uint8_t* b = (uint8_t*)m_buff.GetData();
+ for (unsigned int i = 0; i < nSamples; i++) {
+ f[i] = (float)(int8_t)(b[i] + 128) / INT8_PEAK;
+ }
+ }
+ break;
+ case 16: { //signed big-endian 16 bit
+ uint16_t* d = (uint16_t*)m_buff.GetData();//signed take as an unsigned to shift operations.
+ for (unsigned int i = 0; i < nSamples; i++) {
+ f[i] = (float)(int16_t)(d[i] << 8 | d[i] >> 8) / INT16_PEAK;
+ }
+ }
+ break;
+ }
+
+ HRESULT hr;
+ if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
+ return hr;
+ }
+
+ m_buff.RemoveAll();
+ return S_OK;
}
HRESULT CMpaDecFilter::ProcessPCMintBE() //'twos', big-endian 'in24' and 'in32'
{
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
- unsigned int nSamples = m_buff.GetCount() * 8 / wfe->wBitsPerSample;
-
- CAtlArray<float> pBuff;
- pBuff.SetCount(nSamples);
- float* f = pBuff.GetData();
-
- switch (wfe->wBitsPerSample) {
- case 8: { //signed 8-bit
- int8_t* b = (int8_t*)m_buff.GetData();
- for (unsigned int i = 0; i < nSamples; i++) {
- f[i] = (float)b[i] / INT8_PEAK;
- }
- }
- break;
- case 16: { //signed big-endian 16-bit
- uint16_t* d = (uint16_t*)m_buff.GetData();//signed take as an unsigned to shift operations.
- for (unsigned int i = 0; i < nSamples; i++) {
- f[i] = (float)(int16_t)(d[i] << 8 | d[i] >> 8) / INT16_PEAK;
- }
- }
- break;
- case 24: { //signed big-endian 24-bit
- uint8_t* b = (uint8_t*)m_buff.GetData();
- for (unsigned int i = 0; i < nSamples; i++) {
- f[i] = (float)(int32_t)((uint32_t)b[3*i] << 24 |
- (uint32_t)b[3*i+1] << 16 |
- (uint32_t)b[3*i+2] << 8) / INT32_PEAK;
- }
- }
- break;
- case 32: { //signed big-endian 32-bit
- uint32_t* q = (uint32_t*)m_buff.GetData();//signed take as an unsigned to shift operations.
- for (unsigned int i = 0; i < nSamples; i++) {
- f[i] = (float)(int32_t)(q[i] >> 24 |
- (q[i] & 0x00ff0000) >> 8 |
- (q[i] & 0x0000ff00) << 8 |
- q[i] << 24) / INT32_PEAK;
- }
- }
- break;
- }
-
- HRESULT hr;
- if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
- return hr;
- }
-
- m_buff.RemoveAll();
- return S_OK;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
+ unsigned int nSamples = m_buff.GetCount() * 8 / wfe->wBitsPerSample;
+
+ CAtlArray<float> pBuff;
+ pBuff.SetCount(nSamples);
+ float* f = pBuff.GetData();
+
+ switch (wfe->wBitsPerSample) {
+ case 8: { //signed 8-bit
+ int8_t* b = (int8_t*)m_buff.GetData();
+ for (unsigned int i = 0; i < nSamples; i++) {
+ f[i] = (float)b[i] / INT8_PEAK;
+ }
+ }
+ break;
+ case 16: { //signed big-endian 16-bit
+ uint16_t* d = (uint16_t*)m_buff.GetData();//signed take as an unsigned to shift operations.
+ for (unsigned int i = 0; i < nSamples; i++) {
+ f[i] = (float)(int16_t)(d[i] << 8 | d[i] >> 8) / INT16_PEAK;
+ }
+ }
+ break;
+ case 24: { //signed big-endian 24-bit
+ uint8_t* b = (uint8_t*)m_buff.GetData();
+ for (unsigned int i = 0; i < nSamples; i++) {
+ f[i] = (float)(int32_t)((uint32_t)b[3 * i] << 24 |
+ (uint32_t)b[3 * i + 1] << 16 |
+ (uint32_t)b[3 * i + 2] << 8) / INT32_PEAK;
+ }
+ }
+ break;
+ case 32: { //signed big-endian 32-bit
+ uint32_t* q = (uint32_t*)m_buff.GetData();//signed take as an unsigned to shift operations.
+ for (unsigned int i = 0; i < nSamples; i++) {
+ f[i] = (float)(int32_t)(q[i] >> 24 |
+ (q[i] & 0x00ff0000) >> 8 |
+ (q[i] & 0x0000ff00) << 8 |
+ q[i] << 24) / INT32_PEAK;
+ }
+ }
+ break;
+ }
+
+ HRESULT hr;
+ if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
+ return hr;
+ }
+
+ m_buff.RemoveAll();
+ return S_OK;
}
HRESULT CMpaDecFilter::ProcessPCMintLE() //'sowt', little-endian 'in24' and 'in32'
{
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
- unsigned int nSamples = m_buff.GetCount() * 8 / wfe->wBitsPerSample;
-
- CAtlArray<float> pBuff;
- pBuff.SetCount(nSamples);
- float* f = pBuff.GetData();
-
- switch (wfe->wBitsPerSample) {
- case 8: { //signed 8-bit
- int8_t* b = (int8_t*)m_buff.GetData();
- for (unsigned int i = 0; i < nSamples; i++) {
- f[i] = (float)b[i] / INT8_PEAK;
- }
- }
- break;
- case 16: { //signed little-endian 16-bit
- int16_t* d = (int16_t*)m_buff.GetData();
- for (unsigned int i = 0; i < nSamples; i++) {
- f[i] = (float)d[i] / INT16_PEAK;
- }
- }
- break;
- case 24: { //signed little-endian 32-bit
- uint8_t* b = (uint8_t*)m_buff.GetData();
- for (unsigned int i = 0; i < nSamples; i++) {
- f[i] = (float)(int32_t)((uint32_t)b[3*i] << 8 |
- (uint32_t)b[3*i+1] << 16 |
- (uint32_t)b[3*i+2] << 24) / INT32_PEAK;
- }
- }
- break;
- case 32: { //signed little-endian 32-bit
- int32_t* q = (int32_t*)m_buff.GetData();
- for (unsigned int i = 0; i < nSamples; i++) {
- f[i] = (float)q[i] / INT32_PEAK;
- }
- }
- break;
- }
-
- HRESULT hr;
- if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
- return hr;
- }
-
- m_buff.RemoveAll();
- return S_OK;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
+ unsigned int nSamples = m_buff.GetCount() * 8 / wfe->wBitsPerSample;
+
+ CAtlArray<float> pBuff;
+ pBuff.SetCount(nSamples);
+ float* f = pBuff.GetData();
+
+ switch (wfe->wBitsPerSample) {
+ case 8: { //signed 8-bit
+ int8_t* b = (int8_t*)m_buff.GetData();
+ for (unsigned int i = 0; i < nSamples; i++) {
+ f[i] = (float)b[i] / INT8_PEAK;
+ }
+ }
+ break;
+ case 16: { //signed little-endian 16-bit
+ int16_t* d = (int16_t*)m_buff.GetData();
+ for (unsigned int i = 0; i < nSamples; i++) {
+ f[i] = (float)d[i] / INT16_PEAK;
+ }
+ }
+ break;
+ case 24: { //signed little-endian 32-bit
+ uint8_t* b = (uint8_t*)m_buff.GetData();
+ for (unsigned int i = 0; i < nSamples; i++) {
+ f[i] = (float)(int32_t)((uint32_t)b[3 * i] << 8 |
+ (uint32_t)b[3 * i + 1] << 16 |
+ (uint32_t)b[3 * i + 2] << 24) / INT32_PEAK;
+ }
+ }
+ break;
+ case 32: { //signed little-endian 32-bit
+ int32_t* q = (int32_t*)m_buff.GetData();
+ for (unsigned int i = 0; i < nSamples; i++) {
+ f[i] = (float)q[i] / INT32_PEAK;
+ }
+ }
+ break;
+ }
+
+ HRESULT hr;
+ if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
+ return hr;
+ }
+
+ m_buff.RemoveAll();
+ return S_OK;
}
HRESULT CMpaDecFilter::ProcessPCMfloatBE() //big-endian 'fl32' and 'fl64'
{
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
- unsigned int nSamples = m_buff.GetCount() * 8 / wfe->wBitsPerSample;
-
- CAtlArray<float> pBuff;
- pBuff.SetCount(nSamples);
- float* f = pBuff.GetData();
-
- switch (wfe->wBitsPerSample) {
- case 32: {
- uint32_t* q = (uint32_t*)m_buff.GetData();
- uint32_t* vf = (uint32_t*)f;
- for (unsigned int i = 0; i < nSamples; i++) {
- vf[i] = q[i] >> 24 |
- (q[i] & 0x00ff0000) >> 8 |
- (q[i] & 0x0000ff00) << 8 |
- q[i] << 24;
- }
- }
- break;
- case 64: {
- uint64_t* q = (uint64_t*)m_buff.GetData();
- uint64_t x;
- for (unsigned int i = 0; i < nSamples; i++) {
- x = q[i] >>56 |
- (q[i] & 0x00FF000000000000) >> 40 |
- (q[i] & 0x0000FF0000000000) >> 24 |
- (q[i] & 0x000000FF00000000) >> 8 |
- (q[i] & 0x00000000FF000000) << 8 |
- (q[i] & 0x0000000000FF0000) << 24 |
- (q[i] & 0x000000000000FF00) << 40 |
- q[i] << 56;
- f[i] = (float)*(double*)&x;
- }
- }
- break;
- }
-
- HRESULT hr;
- if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
- return hr;
- }
-
- m_buff.RemoveAll();
- return S_OK;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
+ unsigned int nSamples = m_buff.GetCount() * 8 / wfe->wBitsPerSample;
+
+ CAtlArray<float> pBuff;
+ pBuff.SetCount(nSamples);
+ float* f = pBuff.GetData();
+
+ switch (wfe->wBitsPerSample) {
+ case 32: {
+ uint32_t* q = (uint32_t*)m_buff.GetData();
+ uint32_t* vf = (uint32_t*)f;
+ for (unsigned int i = 0; i < nSamples; i++) {
+ vf[i] = q[i] >> 24 |
+ (q[i] & 0x00ff0000) >> 8 |
+ (q[i] & 0x0000ff00) << 8 |
+ q[i] << 24;
+ }
+ }
+ break;
+ case 64: {
+ uint64_t* q = (uint64_t*)m_buff.GetData();
+ uint64_t x;
+ for (unsigned int i = 0; i < nSamples; i++) {
+ x = q[i] >> 56 |
+ (q[i] & 0x00FF000000000000) >> 40 |
+ (q[i] & 0x0000FF0000000000) >> 24 |
+ (q[i] & 0x000000FF00000000) >> 8 |
+ (q[i] & 0x00000000FF000000) << 8 |
+ (q[i] & 0x0000000000FF0000) << 24 |
+ (q[i] & 0x000000000000FF00) << 40 |
+ q[i] << 56;
+ f[i] = (float) * (double*)&x;
+ }
+ }
+ break;
+ }
+
+ HRESULT hr;
+ if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
+ return hr;
+ }
+
+ m_buff.RemoveAll();
+ return S_OK;
}
HRESULT CMpaDecFilter::ProcessPCMfloatLE() //little-endian 'fl32' and 'fl64'
{
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
- unsigned int nSamples = m_buff.GetCount() * 8 / wfe->wBitsPerSample;
-
- CAtlArray<float> pBuff;
- pBuff.SetCount(nSamples);
- float* f = pBuff.GetData();
-
- switch (wfe->wBitsPerSample) {
- case 32: {
- float* q = (float*)m_buff.GetData();
- memcpy(f, q, nSamples * 4);
- }
- break;
- case 64: {
- double* q = (double*)m_buff.GetData();
- for (unsigned int i = 0; i < nSamples; i++) {
- f[i] = (float)q[i];
- }
- }
- break;
- }
-
- HRESULT hr;
- if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
- return hr;
- }
-
- m_buff.RemoveAll();
- return S_OK;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)m_pInput->CurrentMediaType().Format();
+ unsigned int nSamples = m_buff.GetCount() * 8 / wfe->wBitsPerSample;
+
+ CAtlArray<float> pBuff;
+ pBuff.SetCount(nSamples);
+ float* f = pBuff.GetData();
+
+ switch (wfe->wBitsPerSample) {
+ case 32: {
+ float* q = (float*)m_buff.GetData();
+ memcpy(f, q, nSamples * 4);
+ }
+ break;
+ case 64: {
+ double* q = (double*)m_buff.GetData();
+ for (unsigned int i = 0; i < nSamples; i++) {
+ f[i] = (float)q[i];
+ }
+ }
+ break;
+ }
+
+ HRESULT hr;
+ if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
+ return hr;
+ }
+
+ m_buff.RemoveAll();
+ return S_OK;
}
#endif /* INTERNAL_DECODER_PCM */
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_PS2AUDIO
HRESULT CMpaDecFilter::ProcessPS2PCM()
{
- BYTE* p = m_buff.GetData();
- BYTE* base = p;
- BYTE* end = p + m_buff.GetCount();
-
- WAVEFORMATEXPS2* wfe = (WAVEFORMATEXPS2*)m_pInput->CurrentMediaType().Format();
- int size = wfe->dwInterleave*wfe->nChannels;
- int samples = wfe->dwInterleave/(wfe->wBitsPerSample>>3);
- int channels = wfe->nChannels;
-
- CAtlArray<float> pBuff;
- pBuff.SetCount(samples*channels);
- float* f = pBuff.GetData();
-
- while (end - p >= size) {
- DWORD* dw = (DWORD*)p;
-
- if (dw[0] == 'dhSS') {
- p += dw[1] + 8;
- } else if (dw[0] == 'dbSS') {
- p += 8;
- m_ps2_state.sync = true;
- } else {
- if (m_ps2_state.sync) {
- short* s = (short*)p;
-
- for (int i = 0; i < samples; i++)
- for (int j = 0; j < channels; j++) {
- f[i*channels+j] = (float)s[j*samples+i] / INT16_PEAK;
- }
- } else {
- for (int i = 0, j = samples*channels; i < j; i++) {
- f[i] = 0;
- }
- }
-
- HRESULT hr;
- if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
- return hr;
- }
-
- p += size;
-
- memmove(base, p, end - p);
- end = base + (end - p);
- p = base;
- }
- }
-
- m_buff.SetCount(end - p);
-
- return S_OK;
+ BYTE* p = m_buff.GetData();
+ BYTE* base = p;
+ BYTE* end = p + m_buff.GetCount();
+
+ WAVEFORMATEXPS2* wfe = (WAVEFORMATEXPS2*)m_pInput->CurrentMediaType().Format();
+ int size = wfe->dwInterleave * wfe->nChannels;
+ int samples = wfe->dwInterleave / (wfe->wBitsPerSample >> 3);
+ int channels = wfe->nChannels;
+
+ CAtlArray<float> pBuff;
+ pBuff.SetCount(samples * channels);
+ float* f = pBuff.GetData();
+
+ while (end - p >= size) {
+ DWORD* dw = (DWORD*)p;
+
+ if (dw[0] == 'dhSS') {
+ p += dw[1] + 8;
+ } else if (dw[0] == 'dbSS') {
+ p += 8;
+ m_ps2_state.sync = true;
+ } else {
+ if (m_ps2_state.sync) {
+ short* s = (short*)p;
+
+ for (int i = 0; i < samples; i++)
+ for (int j = 0; j < channels; j++) {
+ f[i * channels + j] = (float)s[j * samples + i] / INT16_PEAK;
+ }
+ } else {
+ for (int i = 0, j = samples * channels; i < j; i++) {
+ f[i] = 0;
+ }
+ }
+
+ HRESULT hr;
+ if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
+ return hr;
+ }
+
+ p += size;
+
+ memmove(base, p, end - p);
+ end = base + (end - p);
+ p = base;
+ }
+ }
+
+ m_buff.SetCount(end - p);
+
+ return S_OK;
}
static void decodeps2adpcm(ps2_state_t& s, int channel, BYTE* pin, double* pout)
{
- int tbl_index = pin[0]>>4;
- int shift = pin[0]&0xf;
- int unk = pin[1]; // ?
- UNREFERENCED_PARAMETER(unk);
-
- if (tbl_index >= 10) {
- ASSERT(0);
- return;
- }
- // if (unk == 7) {ASSERT(0); return;} // ???
-
- static double s_tbl[] = {
- 0.0, 0.0, 0.9375, 0.0, 1.796875, -0.8125, 1.53125, -0.859375, 1.90625, -0.9375,
- 0.0, 0.0, -0.9375, 0.0, -1.796875, 0.8125, -1.53125, 0.859375 -1.90625, 0.9375
- };
-
- double* tbl = &s_tbl[tbl_index*2];
- double& a = s.a[channel];
- double& b = s.b[channel];
-
- for (int i = 0; i < 28; i++) {
- short input = (short)(((pin[2+i/2] >> ((i&1) << 2)) & 0xf) << 12) >> shift;
- double output = a * tbl[1] + b * tbl[0] + input;
-
- a = b;
- b = output;
-
- *pout++ = output / INT16_PEAK;
- }
+ int tbl_index = pin[0] >> 4;
+ int shift = pin[0] & 0xf;
+ int unk = pin[1]; // ?
+ UNREFERENCED_PARAMETER(unk);
+
+ if (tbl_index >= 10) {
+ ASSERT(0);
+ return;
+ }
+ // if (unk == 7) {ASSERT(0); return;} // ???
+
+ static double s_tbl[] = {
+ 0.0, 0.0, 0.9375, 0.0, 1.796875, -0.8125, 1.53125, -0.859375, 1.90625, -0.9375,
+ 0.0, 0.0, -0.9375, 0.0, -1.796875, 0.8125, -1.53125, 0.859375 - 1.90625, 0.9375
+ };
+
+ double* tbl = &s_tbl[tbl_index * 2];
+ double& a = s.a[channel];
+ double& b = s.b[channel];
+
+ for (int i = 0; i < 28; i++) {
+ short input = (short)(((pin[2 + i / 2] >> ((i & 1) << 2)) & 0xf) << 12) >> shift;
+ double output = a * tbl[1] + b * tbl[0] + input;
+
+ a = b;
+ b = output;
+
+ *pout++ = output / INT16_PEAK;
+ }
}
HRESULT CMpaDecFilter::ProcessPS2ADPCM()
{
- BYTE* p = m_buff.GetData();
- BYTE* base = p;
- BYTE* end = p + m_buff.GetCount();
-
- WAVEFORMATEXPS2* wfe = (WAVEFORMATEXPS2*)m_pInput->CurrentMediaType().Format();
- int size = wfe->dwInterleave*wfe->nChannels;
- int samples = wfe->dwInterleave * 14 / 16 * 2;
- int channels = wfe->nChannels;
-
- CAtlArray<float> pBuff;
- pBuff.SetCount(samples*channels);
- float* f = pBuff.GetData();
-
- while (end - p >= size) {
- DWORD* dw = (DWORD*)p;
-
- if (dw[0] == 'dhSS') {
- p += dw[1] + 8;
- } else if (dw[0] == 'dbSS') {
- p += 8;
- m_ps2_state.sync = true;
- } else {
- if (m_ps2_state.sync) {
- double* tmp = DNew double[samples*channels];
-
- for (int channel = 0, j = 0, k = 0; channel < channels; channel++, j += wfe->dwInterleave)
- for (DWORD i = 0; i < wfe->dwInterleave; i += 16, k += 28) {
- decodeps2adpcm(m_ps2_state, channel, p + i + j, tmp + k);
- }
-
- for (int i = 0, k = 0; i < samples; i++)
- for (int j = 0; j < channels; j++, k++) {
- f[k] = (float)tmp[j*samples+i];
- }
-
- delete [] tmp;
- } else {
- for (int i = 0, j = samples*channels; i < j; i++) {
- f[i] = 0;
- }
- }
-
- HRESULT hr;
- if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
- return hr;
- }
-
- p += size;
- }
- }
-
- memmove(base, p, end - p);
- end = base + (end - p);
- p = base;
-
- m_buff.SetCount(end - p);
-
- return S_OK;
+ BYTE* p = m_buff.GetData();
+ BYTE* base = p;
+ BYTE* end = p + m_buff.GetCount();
+
+ WAVEFORMATEXPS2* wfe = (WAVEFORMATEXPS2*)m_pInput->CurrentMediaType().Format();
+ int size = wfe->dwInterleave * wfe->nChannels;
+ int samples = wfe->dwInterleave * 14 / 16 * 2;
+ int channels = wfe->nChannels;
+
+ CAtlArray<float> pBuff;
+ pBuff.SetCount(samples * channels);
+ float* f = pBuff.GetData();
+
+ while (end - p >= size) {
+ DWORD* dw = (DWORD*)p;
+
+ if (dw[0] == 'dhSS') {
+ p += dw[1] + 8;
+ } else if (dw[0] == 'dbSS') {
+ p += 8;
+ m_ps2_state.sync = true;
+ } else {
+ if (m_ps2_state.sync) {
+ double* tmp = DNew double[samples * channels];
+
+ for (int channel = 0, j = 0, k = 0; channel < channels; channel++, j += wfe->dwInterleave)
+ for (DWORD i = 0; i < wfe->dwInterleave; i += 16, k += 28) {
+ decodeps2adpcm(m_ps2_state, channel, p + i + j, tmp + k);
+ }
+
+ for (int i = 0, k = 0; i < samples; i++)
+ for (int j = 0; j < channels; j++, k++) {
+ f[k] = (float)tmp[j * samples + i];
+ }
+
+ delete [] tmp;
+ } else {
+ for (int i = 0, j = samples * channels; i < j; i++) {
+ f[i] = 0;
+ }
+ }
+
+ HRESULT hr;
+ if (S_OK != (hr = Deliver(pBuff, wfe->nSamplesPerSec, wfe->nChannels))) {
+ return hr;
+ }
+
+ p += size;
+ }
+ }
+
+ memmove(base, p, end - p);
+ end = base + (end - p);
+ p = base;
+
+ m_buff.SetCount(end - p);
+
+ return S_OK;
}
#endif /* INTERNAL_DECODER_PS2AUDIO */
HRESULT CMpaDecFilter::GetDeliveryBuffer(IMediaSample** pSample, BYTE** pData)
{
- HRESULT hr;
-
- *pData = NULL;
- if (FAILED(hr = m_pOutput->GetDeliveryBuffer(pSample, NULL, NULL, 0))
- || FAILED(hr = (*pSample)->GetPointer(pData))) {
- return hr;
- }
-
- AM_MEDIA_TYPE* pmt = NULL;
- if (SUCCEEDED((*pSample)->GetMediaType(&pmt)) && pmt) {
- CMediaType mt = *pmt;
- m_pOutput->SetMediaType(&mt);
- DeleteMediaType(pmt);
- pmt = NULL;
- }
-
- return S_OK;
+ HRESULT hr;
+
+ *pData = NULL;
+ if (FAILED(hr = m_pOutput->GetDeliveryBuffer(pSample, NULL, NULL, 0))
+ || FAILED(hr = (*pSample)->GetPointer(pData))) {
+ return hr;
+ }
+
+ AM_MEDIA_TYPE* pmt = NULL;
+ if (SUCCEEDED((*pSample)->GetMediaType(&pmt)) && pmt) {
+ CMediaType mt = *pmt;
+ m_pOutput->SetMediaType(&mt);
+ DeleteMediaType(pmt);
+ pmt = NULL;
+ }
+
+ return S_OK;
}
HRESULT CMpaDecFilter::Deliver(CAtlArray<float>& pBuff, DWORD nSamplesPerSec, WORD nChannels, DWORD dwChannelMask)
{
- HRESULT hr;
+ HRESULT hr;
- MPCSampleFormat sf = GetSampleFormat();
+ MPCSampleFormat sf = GetSampleFormat();
- CMediaType mt = CreateMediaType(sf, nSamplesPerSec, nChannels, dwChannelMask);
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
+ CMediaType mt = CreateMediaType(sf, nSamplesPerSec, nChannels, dwChannelMask);
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
- int nSamples = pBuff.GetCount()/wfe->nChannels;
+ int nSamples = pBuff.GetCount() / wfe->nChannels;
- if (FAILED(hr = ReconnectOutput(nSamples, mt))) {
- return hr;
- }
+ if (FAILED(hr = ReconnectOutput(nSamples, mt))) {
+ return hr;
+ }
- CComPtr<IMediaSample> pOut;
- BYTE* pDataOut = NULL;
- if (FAILED(GetDeliveryBuffer(&pOut, &pDataOut))) {
- return E_FAIL;
- }
+ CComPtr<IMediaSample> pOut;
+ BYTE* pDataOut = NULL;
+ if (FAILED(GetDeliveryBuffer(&pOut, &pDataOut))) {
+ return E_FAIL;
+ }
- REFERENCE_TIME rtDur = 10000000i64*nSamples/wfe->nSamplesPerSec;
- REFERENCE_TIME rtStart = m_rtStart, rtStop = m_rtStart + rtDur;
- m_rtStart += rtDur;
- //TRACE(_T("CMpaDecFilter: %I64d - %I64d\n"), rtStart/10000, rtStop/10000);
- if (rtStart < 0 /*200000*/ /* < 0, FIXME: 0 makes strange noises */) {
- return S_OK;
- }
+ REFERENCE_TIME rtDur = 10000000i64 * nSamples / wfe->nSamplesPerSec;
+ REFERENCE_TIME rtStart = m_rtStart, rtStop = m_rtStart + rtDur;
+ m_rtStart += rtDur;
+ //TRACE(_T("CMpaDecFilter: %I64d - %I64d\n"), rtStart/10000, rtStop/10000);
+ if (rtStart < 0 /*200000*/ /* < 0, FIXME: 0 makes strange noises */) {
+ return S_OK;
+ }
- if (hr == S_OK) {
- m_pOutput->SetMediaType(&mt);
- pOut->SetMediaType(&mt);
- }
+ if (hr == S_OK) {
+ m_pOutput->SetMediaType(&mt);
+ pOut->SetMediaType(&mt);
+ }
- pOut->SetTime(&rtStart, &rtStop);
- pOut->SetMediaTime(NULL, NULL);
+ pOut->SetTime(&rtStart, &rtStop);
+ pOut->SetMediaTime(NULL, NULL);
- pOut->SetPreroll(FALSE);
- pOut->SetDiscontinuity(m_fDiscontinuity);
- m_fDiscontinuity = false;
- pOut->SetSyncPoint(TRUE);
+ pOut->SetPreroll(FALSE);
+ pOut->SetDiscontinuity(m_fDiscontinuity);
+ m_fDiscontinuity = false;
+ pOut->SetSyncPoint(TRUE);
- pOut->SetActualDataLength(pBuff.GetCount()*wfe->wBitsPerSample/8);
+ pOut->SetActualDataLength(pBuff.GetCount()*wfe->wBitsPerSample / 8);
- WAVEFORMATEX* wfeout = (WAVEFORMATEX*)m_pOutput->CurrentMediaType().Format();
- ASSERT(wfeout->nChannels == wfe->nChannels);
- ASSERT(wfeout->nSamplesPerSec == wfe->nSamplesPerSec);
- UNREFERENCED_PARAMETER(wfeout);
+ WAVEFORMATEX* wfeout = (WAVEFORMATEX*)m_pOutput->CurrentMediaType().Format();
+ ASSERT(wfeout->nChannels == wfe->nChannels);
+ ASSERT(wfeout->nSamplesPerSec == wfe->nSamplesPerSec);
+ UNREFERENCED_PARAMETER(wfeout);
- float* pDataIn = pBuff.GetData();
+ float* pDataIn = pBuff.GetData();
#define f16max (float(INT16_MAX)/INT16_PEAK)
#define f24max (float(INT24_MAX)/INT24_PEAK)
@@ -1555,509 +1559,507 @@ HRESULT CMpaDecFilter::Deliver(CAtlArray<float>& pBuff, DWORD nSamplesPerSec, WO
#define round_f(x) ((x) > 0 ? (x) + 0.5f : (x) - 0.5f)
#define round_d(x) ((x) > 0 ? (x) + 0.5 : (x) - 0.5)
- for (unsigned int i = 0, len = pBuff.GetCount(); i < len; i++) {
- float f = *pDataIn++;
-
- if (f < -1) f = -1;
- switch (sf) {
- default:
- case SF_PCM16:
- if (f > f16max) f = f16max;
- *(int16_t*)pDataOut = (int16_t)round_f(f * INT16_PEAK);
- pDataOut += sizeof(int16_t);
- break;
- case SF_PCM24: {
- if (f > f24max) f = f24max;
- DWORD i24 = (DWORD)(int32_t)round_f(f * INT24_PEAK);
- *pDataOut++ = (BYTE)(i24);
- *pDataOut++ = (BYTE)(i24>>8);
- *pDataOut++ = (BYTE)(i24>>16);
- }
- break;
- case SF_PCM32: {
- double d = (double)f;
- if (d > d32max) d = d32max;
- *(int32_t*)pDataOut = (int32_t)round_d(d * INT32_PEAK);
- pDataOut += sizeof(int32_t);
- }
- break;
- case SF_FLOAT32:
- if (f > 1) f = 1;
- *(float*)pDataOut = f;
- pDataOut += sizeof(float);
- break;
- }
- }
-
- return m_pOutput->Deliver(pOut);
+ for (unsigned int i = 0, len = pBuff.GetCount(); i < len; i++) {
+ float f = *pDataIn++;
+
+ if (f < -1) { f = -1; }
+ switch (sf) {
+ default:
+ case SF_PCM16:
+ if (f > f16max) { f = f16max; }
+ *(int16_t*)pDataOut = (int16_t)round_f(f * INT16_PEAK);
+ pDataOut += sizeof(int16_t);
+ break;
+ case SF_PCM24: {
+ if (f > f24max) { f = f24max; }
+ DWORD i24 = (DWORD)(int32_t)round_f(f * INT24_PEAK);
+ *pDataOut++ = (BYTE)(i24);
+ *pDataOut++ = (BYTE)(i24 >> 8);
+ *pDataOut++ = (BYTE)(i24 >> 16);
+ }
+ break;
+ case SF_PCM32: {
+ double d = (double)f;
+ if (d > d32max) { d = d32max; }
+ *(int32_t*)pDataOut = (int32_t)round_d(d * INT32_PEAK);
+ pDataOut += sizeof(int32_t);
+ }
+ break;
+ case SF_FLOAT32:
+ if (f > 1) { f = 1; }
+ *(float*)pDataOut = f;
+ pDataOut += sizeof(float);
+ break;
+ }
+ }
+
+ return m_pOutput->Deliver(pOut);
}
HRESULT CMpaDecFilter::DeliverBitstream(BYTE* pBuff, int size, int sample_rate, int samples, BYTE type)
{
- HRESULT hr;
- bool isDTSWAV = false;
-
- int length = 0;
-
- if (type == 0x0b) { // DTS
- if (size == 4096 && sample_rate == 44100 && samples == 1024) { // DTSWAV
- length = size;
- isDTSWAV = true;
- }
- else while (length < size+16) {
- length += 2048;
- }
- } else { //if (type == 0x01) { // AC3
- length = samples*4;
- }
-
- CMediaType mt;
- if (isDTSWAV) {
- mt = CreateMediaTypeSPDIF(sample_rate);
- } else {
- mt = CreateMediaTypeSPDIF();
- }
-
- if (FAILED(hr = ReconnectOutput(length, mt))) {
- return hr;
- }
-
- CComPtr<IMediaSample> pOut;
- BYTE* pDataOut = NULL;
- if (FAILED(GetDeliveryBuffer(&pOut, &pDataOut))) {
- return E_FAIL;
- }
-
- if (isDTSWAV) {
- memcpy(pDataOut, pBuff, size);
- }
- else {
- WORD* pDataOutW = (WORD*)pDataOut;
- pDataOutW[0] = 0xf872;
- pDataOutW[1] = 0x4e1f;
- pDataOutW[2] = type;
- pDataOutW[3] = size*8;
- _swab((char*)pBuff, (char*)&pDataOutW[4], size+1); //if the size is odd, the function "_swab" lose the last byte. need add one.
- }
-
- REFERENCE_TIME rtDur;
- rtDur = 10000000i64 * samples / sample_rate;
- REFERENCE_TIME rtStart = m_rtStart, rtStop = m_rtStart + rtDur;
- m_rtStart += rtDur;
-
- if (rtStart < 0) {
- return S_OK;
- }
-
- if (hr == S_OK) {
- m_pOutput->SetMediaType(&mt);
- pOut->SetMediaType(&mt);
- }
-
- pOut->SetTime(&rtStart, &rtStop);
- pOut->SetMediaTime(NULL, NULL);
-
- pOut->SetPreroll(FALSE);
- pOut->SetDiscontinuity(m_fDiscontinuity);
- m_fDiscontinuity = false;
- pOut->SetSyncPoint(TRUE);
-
- pOut->SetActualDataLength(length);
-
- return m_pOutput->Deliver(pOut);
+ HRESULT hr;
+ bool isDTSWAV = false;
+
+ int length = 0;
+
+ if (type == 0x0b) { // DTS
+ if (size == 4096 && sample_rate == 44100 && samples == 1024) { // DTSWAV
+ length = size;
+ isDTSWAV = true;
+ } else while (length < size + 16) {
+ length += 2048;
+ }
+ } else { //if (type == 0x01) { // AC3
+ length = samples * 4;
+ }
+
+ CMediaType mt;
+ if (isDTSWAV) {
+ mt = CreateMediaTypeSPDIF(sample_rate);
+ } else {
+ mt = CreateMediaTypeSPDIF();
+ }
+
+ if (FAILED(hr = ReconnectOutput(length, mt))) {
+ return hr;
+ }
+
+ CComPtr<IMediaSample> pOut;
+ BYTE* pDataOut = NULL;
+ if (FAILED(GetDeliveryBuffer(&pOut, &pDataOut))) {
+ return E_FAIL;
+ }
+
+ if (isDTSWAV) {
+ memcpy(pDataOut, pBuff, size);
+ } else {
+ WORD* pDataOutW = (WORD*)pDataOut;
+ pDataOutW[0] = 0xf872;
+ pDataOutW[1] = 0x4e1f;
+ pDataOutW[2] = type;
+ pDataOutW[3] = size * 8;
+ _swab((char*)pBuff, (char*)&pDataOutW[4], size + 1); //if the size is odd, the function "_swab" lose the last byte. need add one.
+ }
+
+ REFERENCE_TIME rtDur;
+ rtDur = 10000000i64 * samples / sample_rate;
+ REFERENCE_TIME rtStart = m_rtStart, rtStop = m_rtStart + rtDur;
+ m_rtStart += rtDur;
+
+ if (rtStart < 0) {
+ return S_OK;
+ }
+
+ if (hr == S_OK) {
+ m_pOutput->SetMediaType(&mt);
+ pOut->SetMediaType(&mt);
+ }
+
+ pOut->SetTime(&rtStart, &rtStop);
+ pOut->SetMediaTime(NULL, NULL);
+
+ pOut->SetPreroll(FALSE);
+ pOut->SetDiscontinuity(m_fDiscontinuity);
+ m_fDiscontinuity = false;
+ pOut->SetSyncPoint(TRUE);
+
+ pOut->SetActualDataLength(length);
+
+ return m_pOutput->Deliver(pOut);
}
HRESULT CMpaDecFilter::ReconnectOutput(int nSamples, CMediaType& mt)
{
- HRESULT hr;
-
- CComQIPtr<IMemInputPin> pPin = m_pOutput->GetConnected();
- if (!pPin) {
- return E_NOINTERFACE;
- }
-
- CComPtr<IMemAllocator> pAllocator;
- if (FAILED(hr = pPin->GetAllocator(&pAllocator)) || !pAllocator) {
- return hr;
- }
-
- ALLOCATOR_PROPERTIES props, actual;
- if (FAILED(hr = pAllocator->GetProperties(&props))) {
- return hr;
- }
-
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
- long cbBuffer = nSamples * wfe->nBlockAlign;
-
- if (mt != m_pOutput->CurrentMediaType() || cbBuffer > props.cbBuffer) {
- if (cbBuffer > props.cbBuffer) {
- props.cBuffers = 4;
- props.cbBuffer = cbBuffer*3/2;
-
- if (FAILED(hr = m_pOutput->DeliverBeginFlush())
- || FAILED(hr = m_pOutput->DeliverEndFlush())
- || FAILED(hr = pAllocator->Decommit())
- || FAILED(hr = pAllocator->SetProperties(&props, &actual))
- || FAILED(hr = pAllocator->Commit())) {
- return hr;
- }
-
- if (props.cBuffers > actual.cBuffers || props.cbBuffer > actual.cbBuffer) {
- NotifyEvent(EC_ERRORABORT, hr, 0);
- return E_FAIL;
- }
- }
-
- return S_OK;
- }
-
- return S_FALSE;
+ HRESULT hr;
+
+ CComQIPtr<IMemInputPin> pPin = m_pOutput->GetConnected();
+ if (!pPin) {
+ return E_NOINTERFACE;
+ }
+
+ CComPtr<IMemAllocator> pAllocator;
+ if (FAILED(hr = pPin->GetAllocator(&pAllocator)) || !pAllocator) {
+ return hr;
+ }
+
+ ALLOCATOR_PROPERTIES props, actual;
+ if (FAILED(hr = pAllocator->GetProperties(&props))) {
+ return hr;
+ }
+
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
+ long cbBuffer = nSamples * wfe->nBlockAlign;
+
+ if (mt != m_pOutput->CurrentMediaType() || cbBuffer > props.cbBuffer) {
+ if (cbBuffer > props.cbBuffer) {
+ props.cBuffers = 4;
+ props.cbBuffer = cbBuffer * 3 / 2;
+
+ if (FAILED(hr = m_pOutput->DeliverBeginFlush())
+ || FAILED(hr = m_pOutput->DeliverEndFlush())
+ || FAILED(hr = pAllocator->Decommit())
+ || FAILED(hr = pAllocator->SetProperties(&props, &actual))
+ || FAILED(hr = pAllocator->Commit())) {
+ return hr;
+ }
+
+ if (props.cBuffers > actual.cBuffers || props.cbBuffer > actual.cbBuffer) {
+ NotifyEvent(EC_ERRORABORT, hr, 0);
+ return E_FAIL;
+ }
+ }
+
+ return S_OK;
+ }
+
+ return S_FALSE;
}
CMediaType CMpaDecFilter::CreateMediaType(MPCSampleFormat sf, DWORD nSamplesPerSec, WORD nChannels, DWORD dwChannelMask)
{
- CMediaType mt;
-
- mt.majortype = MEDIATYPE_Audio;
- mt.subtype = sf == SF_FLOAT32 ? MEDIASUBTYPE_IEEE_FLOAT : MEDIASUBTYPE_PCM;
- mt.formattype = FORMAT_WaveFormatEx;
-
- WAVEFORMATEXTENSIBLE wfex;
- memset(&wfex, 0, sizeof(wfex));
- WAVEFORMATEX* wfe = &wfex.Format;
- wfe->wFormatTag = (WORD)mt.subtype.Data1;
- wfe->nChannels = nChannels;
- wfe->nSamplesPerSec = nSamplesPerSec;
- switch (sf) {
- default:
- case SF_PCM16:
- wfe->wBitsPerSample = 16;
- break;
- case SF_PCM24:
- wfe->wBitsPerSample = 24;
- break;
- case SF_PCM32:
- case SF_FLOAT32:
- wfe->wBitsPerSample = 32;
- break;
- }
- wfe->nBlockAlign = wfe->nChannels*wfe->wBitsPerSample/8;
- wfe->nAvgBytesPerSec = wfe->nSamplesPerSec*wfe->nBlockAlign;
- mt.SetSampleSize (wfe->wBitsPerSample*wfe->nChannels/8);
-
- // FIXME: 24/32 bit only seems to work with WAVE_FORMAT_EXTENSIBLE
- if (dwChannelMask == 0 && (sf == SF_PCM24 || sf == SF_PCM32)) {
- dwChannelMask = nChannels == 2 ? (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT) : SPEAKER_FRONT_CENTER;
- }
-
- if (dwChannelMask) {
- wfex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
- wfex.Format.cbSize = sizeof(wfex) - sizeof(wfex.Format);
- wfex.dwChannelMask = dwChannelMask;
- wfex.Samples.wValidBitsPerSample = wfex.Format.wBitsPerSample;
- wfex.SubFormat = mt.subtype;
- }
-
- mt.SetFormat((BYTE*)&wfex, sizeof(wfex.Format) + wfex.Format.cbSize);
-
- return mt;
+ CMediaType mt;
+
+ mt.majortype = MEDIATYPE_Audio;
+ mt.subtype = sf == SF_FLOAT32 ? MEDIASUBTYPE_IEEE_FLOAT : MEDIASUBTYPE_PCM;
+ mt.formattype = FORMAT_WaveFormatEx;
+
+ WAVEFORMATEXTENSIBLE wfex;
+ memset(&wfex, 0, sizeof(wfex));
+ WAVEFORMATEX* wfe = &wfex.Format;
+ wfe->wFormatTag = (WORD)mt.subtype.Data1;
+ wfe->nChannels = nChannels;
+ wfe->nSamplesPerSec = nSamplesPerSec;
+ switch (sf) {
+ default:
+ case SF_PCM16:
+ wfe->wBitsPerSample = 16;
+ break;
+ case SF_PCM24:
+ wfe->wBitsPerSample = 24;
+ break;
+ case SF_PCM32:
+ case SF_FLOAT32:
+ wfe->wBitsPerSample = 32;
+ break;
+ }
+ wfe->nBlockAlign = wfe->nChannels * wfe->wBitsPerSample / 8;
+ wfe->nAvgBytesPerSec = wfe->nSamplesPerSec * wfe->nBlockAlign;
+ mt.SetSampleSize(wfe->wBitsPerSample * wfe->nChannels / 8);
+
+ // FIXME: 24/32 bit only seems to work with WAVE_FORMAT_EXTENSIBLE
+ if (dwChannelMask == 0 && (sf == SF_PCM24 || sf == SF_PCM32)) {
+ dwChannelMask = nChannels == 2 ? (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT) : SPEAKER_FRONT_CENTER;
+ }
+
+ if (dwChannelMask) {
+ wfex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+ wfex.Format.cbSize = sizeof(wfex) - sizeof(wfex.Format);
+ wfex.dwChannelMask = dwChannelMask;
+ wfex.Samples.wValidBitsPerSample = wfex.Format.wBitsPerSample;
+ wfex.SubFormat = mt.subtype;
+ }
+
+ mt.SetFormat((BYTE*)&wfex, sizeof(wfex.Format) + wfex.Format.cbSize);
+
+ return mt;
}
CMediaType CMpaDecFilter::CreateMediaTypeSPDIF(DWORD nSamplesPerSec)
{
- CMediaType mt = CreateMediaType(SF_PCM16, nSamplesPerSec, 2);
- ((WAVEFORMATEX*)mt.pbFormat)->wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF;
- return mt;
+ CMediaType mt = CreateMediaType(SF_PCM16, nSamplesPerSec, 2);
+ ((WAVEFORMATEX*)mt.pbFormat)->wFormatTag = WAVE_FORMAT_DOLBY_AC3_SPDIF;
+ return mt;
}
HRESULT CMpaDecFilter::CheckInputType(const CMediaType* mtIn)
{
- if (0) {}
+ if (0) {}
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_LPCM
- else if (mtIn->subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO) {
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mtIn->Format();
- if (wfe->nChannels < 1 || wfe->nChannels > 8 || (wfe->wBitsPerSample != 16 && wfe->wBitsPerSample != 20 && wfe->wBitsPerSample != 24)) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- }
+ else if (mtIn->subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO) {
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mtIn->Format();
+ if (wfe->nChannels < 1 || wfe->nChannels > 8 || (wfe->wBitsPerSample != 16 && wfe->wBitsPerSample != 20 && wfe->wBitsPerSample != 24)) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ }
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_PS2AUDIO
- else if (mtIn->subtype == MEDIASUBTYPE_PS2_ADPCM) {
- WAVEFORMATEXPS2* wfe = (WAVEFORMATEXPS2*)mtIn->Format();
- if (wfe->dwInterleave & 0xf) { // has to be a multiple of the block size (16 bytes)
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- }
+ else if (mtIn->subtype == MEDIASUBTYPE_PS2_ADPCM) {
+ WAVEFORMATEXPS2* wfe = (WAVEFORMATEXPS2*)mtIn->Format();
+ if (wfe->dwInterleave & 0xf) { // has to be a multiple of the block size (16 bytes)
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ }
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_PCM
- else if (mtIn->subtype == MEDIASUBTYPE_IEEE_FLOAT) {
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mtIn->Format();
- if (wfe->wBitsPerSample != 64) { // only for 64-bit float PCM
- return VFW_E_TYPE_NOT_ACCEPTED; // not needed any decoders for 32-bit float
- }
- }
+ else if (mtIn->subtype == MEDIASUBTYPE_IEEE_FLOAT) {
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mtIn->Format();
+ if (wfe->wBitsPerSample != 64) { // only for 64-bit float PCM
+ return VFW_E_TYPE_NOT_ACCEPTED; // not needed any decoders for 32-bit float
+ }
+ }
#endif
- for (int i = 0; i < _countof(sudPinTypesIn); i++) {
- if (*sudPinTypesIn[i].clsMajorType == mtIn->majortype
- && *sudPinTypesIn[i].clsMinorType == mtIn->subtype) {
- return S_OK;
- }
- }
+ for (int i = 0; i < _countof(sudPinTypesIn); i++) {
+ if (*sudPinTypesIn[i].clsMajorType == mtIn->majortype
+ && *sudPinTypesIn[i].clsMinorType == mtIn->subtype) {
+ return S_OK;
+ }
+ }
- return VFW_E_TYPE_NOT_ACCEPTED;
+ return VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CMpaDecFilter::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut)
{
- return SUCCEEDED(CheckInputType(mtIn))
- && mtOut->majortype == MEDIATYPE_Audio && mtOut->subtype == MEDIASUBTYPE_PCM
- || mtOut->majortype == MEDIATYPE_Audio && mtOut->subtype == MEDIASUBTYPE_IEEE_FLOAT
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ return SUCCEEDED(CheckInputType(mtIn))
+ && mtOut->majortype == MEDIATYPE_Audio && mtOut->subtype == MEDIASUBTYPE_PCM
+ || mtOut->majortype == MEDIATYPE_Audio && mtOut->subtype == MEDIASUBTYPE_IEEE_FLOAT
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CMpaDecFilter::DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties)
{
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
-
- CMediaType& mt = m_pInput->CurrentMediaType();
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
- UNREFERENCED_PARAMETER(wfe);
-
- pProperties->cBuffers = 4;
- // pProperties->cbBuffer = 1;
- pProperties->cbBuffer = 48000*6*(32/8)/10; // 48KHz 6ch 32bps 100ms
- pProperties->cbAlign = 1;
- pProperties->cbPrefix = 0;
-
- HRESULT hr;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
- return hr;
- }
-
- return pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
- ? E_FAIL
- : NOERROR;
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
+
+ CMediaType& mt = m_pInput->CurrentMediaType();
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
+ UNREFERENCED_PARAMETER(wfe);
+
+ pProperties->cBuffers = 4;
+ // pProperties->cbBuffer = 1;
+ pProperties->cbBuffer = 48000 * 6 * (32 / 8) / 10; // 48KHz 6ch 32bps 100ms
+ pProperties->cbAlign = 1;
+ pProperties->cbPrefix = 0;
+
+ HRESULT hr;
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
+
+ return pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
+ ? E_FAIL
+ : NOERROR;
}
HRESULT CMpaDecFilter::GetMediaType(int iPosition, CMediaType* pmt)
{
- if (m_pInput->IsConnected() == FALSE) {
- return E_UNEXPECTED;
- }
-
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > 0) {
- return VFW_S_NO_MORE_ITEMS;
- }
-
- CMediaType mt = m_pInput->CurrentMediaType();
- const GUID& subtype = mt.subtype;
- WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
- if (wfe == NULL) {
- return E_INVALIDARG;
- }
+ if (m_pInput->IsConnected() == FALSE) {
+ return E_UNEXPECTED;
+ }
+
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > 0) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
+
+ CMediaType mt = m_pInput->CurrentMediaType();
+ const GUID& subtype = mt.subtype;
+ WAVEFORMATEX* wfe = (WAVEFORMATEX*)mt.Format();
+ if (wfe == NULL) {
+ return E_INVALIDARG;
+ }
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_AC3 || INTERNAL_DECODER_DTS
- if (GetSpeakerConfig(ac3) < 0 && (subtype == MEDIASUBTYPE_DOLBY_AC3 ||
- subtype == MEDIASUBTYPE_WAVE_DOLBY_AC3 ||
- subtype == MEDIASUBTYPE_DOLBY_DDPLUS ||
- subtype == MEDIASUBTYPE_DOLBY_TRUEHD)
- || GetSpeakerConfig(dts) < 0 && (subtype == MEDIASUBTYPE_DTS || subtype == MEDIASUBTYPE_WAVE_DTS)) {
- *pmt = CreateMediaTypeSPDIF();
- }
+ if (GetSpeakerConfig(ac3) < 0 && (subtype == MEDIASUBTYPE_DOLBY_AC3 ||
+ subtype == MEDIASUBTYPE_WAVE_DOLBY_AC3 ||
+ subtype == MEDIASUBTYPE_DOLBY_DDPLUS ||
+ subtype == MEDIASUBTYPE_DOLBY_TRUEHD)
+ || GetSpeakerConfig(dts) < 0 && (subtype == MEDIASUBTYPE_DTS || subtype == MEDIASUBTYPE_WAVE_DTS)) {
+ *pmt = CreateMediaTypeSPDIF();
+ }
#else
- if (0) {}
+ if (0) {}
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_VORBIS
- else if (subtype == MEDIASUBTYPE_Vorbis2) {
- VORBISFORMAT2 *vf2 = (VORBISFORMAT2 *)mt.Format();
- WORD nChannels = (WORD)vf2->Channels;
- *pmt = CreateMediaType(GetSampleFormat(), vf2->SamplesPerSec, nChannels, GetVorbisChannelMask(nChannels));
- }
+ else if (subtype == MEDIASUBTYPE_Vorbis2) {
+ VORBISFORMAT2* vf2 = (VORBISFORMAT2*)mt.Format();
+ WORD nChannels = (WORD)vf2->Channels;
+ *pmt = CreateMediaType(GetSampleFormat(), vf2->SamplesPerSec, nChannels, GetVorbisChannelMask(nChannels));
+ }
#endif
- else {
- *pmt = CreateMediaType(GetSampleFormat(), wfe->nSamplesPerSec, min(2, wfe->nChannels));
- }
+ else {
+ *pmt = CreateMediaType(GetSampleFormat(), wfe->nSamplesPerSec, min(2, wfe->nChannels));
+ }
- return S_OK;
+ return S_OK;
}
HRESULT CMpaDecFilter::StartStreaming()
{
- HRESULT hr = __super::StartStreaming();
- if (FAILED(hr)) {
- return hr;
- }
+ HRESULT hr = __super::StartStreaming();
+ if (FAILED(hr)) {
+ return hr;
+ }
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_AC3
- m_a52_state = a52_init(0);
+ m_a52_state = a52_init(0);
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_DTS
- m_dts_state = dts_init(0);
+ m_dts_state = dts_init(0);
#endif
- m_ps2_state.reset();
+ m_ps2_state.reset();
- m_fDiscontinuity = false;
+ m_fDiscontinuity = false;
- return S_OK;
+ return S_OK;
}
HRESULT CMpaDecFilter::StopStreaming()
{
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_AC3
- if (m_a52_state != NULL) {
- a52_free(m_a52_state);
- m_a52_state = NULL;
- }
+ if (m_a52_state != NULL) {
+ a52_free(m_a52_state);
+ m_a52_state = NULL;
+ }
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_DTS
- if (m_dts_state != NULL) {
- dts_free(m_dts_state);
- m_dts_state = NULL;
- }
+ if (m_dts_state != NULL) {
+ dts_free(m_dts_state);
+ m_dts_state = NULL;
+ }
#endif
#if defined(REGISTER_FILTER) || HAS_FFMPEG_AUDIO_DECODERS
- ffmpeg_stream_finish();
+ ffmpeg_stream_finish();
#endif
- return __super::StopStreaming();
+ return __super::StopStreaming();
}
-HRESULT CMpaDecFilter::SetMediaType(PIN_DIRECTION dir, const CMediaType *pmt)
+HRESULT CMpaDecFilter::SetMediaType(PIN_DIRECTION dir, const CMediaType* pmt)
{
#if defined(REGISTER_FILTER) || HAS_FFMPEG_AUDIO_DECODERS
- if (dir == PINDIR_INPUT) {
- enum CodecID nCodecId = FindCodec(pmt->subtype);
- if (nCodecId != CODEC_ID_NONE && !InitFFmpeg(nCodecId)) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- }
+ if (dir == PINDIR_INPUT) {
+ enum CodecID nCodecId = FindCodec(pmt->subtype);
+ if (nCodecId != CODEC_ID_NONE && !InitFFmpeg(nCodecId)) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ }
#endif
- return __super::SetMediaType(dir, pmt);
+ return __super::SetMediaType(dir, pmt);
}
// IMpaDecFilter
STDMETHODIMP CMpaDecFilter::SetSampleFormat(MPCSampleFormat sf)
{
- CAutoLock cAutoLock(&m_csProps);
- m_iSampleFormat = sf;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_iSampleFormat = sf;
+ return S_OK;
}
STDMETHODIMP_(MPCSampleFormat) CMpaDecFilter::GetSampleFormat()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_iSampleFormat;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_iSampleFormat;
}
STDMETHODIMP CMpaDecFilter::SetSpeakerConfig(enctype et, int sc)
{
- CAutoLock cAutoLock(&m_csProps);
- if (et >= 0 && et < etlast) {
- m_iSpeakerConfig[et] = sc;
- }
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ if (et >= 0 && et < etlast) {
+ m_iSpeakerConfig[et] = sc;
+ }
+ return S_OK;
}
STDMETHODIMP_(int) CMpaDecFilter::GetSpeakerConfig(enctype et)
{
- CAutoLock cAutoLock(&m_csProps);
- if (et >= 0 && et < etlast) {
- return m_iSpeakerConfig[et];
- }
- return -1;
+ CAutoLock cAutoLock(&m_csProps);
+ if (et >= 0 && et < etlast) {
+ return m_iSpeakerConfig[et];
+ }
+ return -1;
}
STDMETHODIMP CMpaDecFilter::SetDynamicRangeControl(enctype et, bool fDRC)
{
- CAutoLock cAutoLock(&m_csProps);
- if (et >= 0 && et < etlast) {
- m_fDynamicRangeControl[et] = fDRC;
- } else {
- return E_INVALIDARG;
- }
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ if (et >= 0 && et < etlast) {
+ m_fDynamicRangeControl[et] = fDRC;
+ } else {
+ return E_INVALIDARG;
+ }
+ return S_OK;
}
STDMETHODIMP_(bool) CMpaDecFilter::GetDynamicRangeControl(enctype et)
{
- CAutoLock cAutoLock(&m_csProps);
- if (et >= 0 && et < etlast) {
- return m_fDynamicRangeControl[et];
- }
- return false;
+ CAutoLock cAutoLock(&m_csProps);
+ if (et >= 0 && et < etlast) {
+ return m_fDynamicRangeControl[et];
+ }
+ return false;
}
STDMETHODIMP_(DolbyDigitalMode) CMpaDecFilter::GetDolbyDigitalMode()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_DolbyDigitalMode;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_DolbyDigitalMode;
}
STDMETHODIMP CMpaDecFilter::SaveSettings()
{
- CAutoLock cAutoLock(&m_csProps);
+ CAutoLock cAutoLock(&m_csProps);
#ifdef REGISTER_FILTER
- CRegKey key;
- if (ERROR_SUCCESS == key.Create(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPEG Audio Decoder"))) {
- key.SetDWORDValue(_T("SampleFormat"), m_iSampleFormat);
- key.SetDWORDValue(_T("Ac3SpeakerConfig"), m_iSpeakerConfig[ac3]);
- key.SetDWORDValue(_T("DtsSpeakerConfig"), m_iSpeakerConfig[dts]);
- key.SetDWORDValue(_T("Ac3DynamicRangeControl"), m_fDynamicRangeControl[ac3]);
- key.SetDWORDValue(_T("DtsDynamicRangeControl"), m_fDynamicRangeControl[dts]);
- }
+ CRegKey key;
+ if (ERROR_SUCCESS == key.Create(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPEG Audio Decoder"))) {
+ key.SetDWORDValue(_T("SampleFormat"), m_iSampleFormat);
+ key.SetDWORDValue(_T("Ac3SpeakerConfig"), m_iSpeakerConfig[ac3]);
+ key.SetDWORDValue(_T("DtsSpeakerConfig"), m_iSpeakerConfig[dts]);
+ key.SetDWORDValue(_T("Ac3DynamicRangeControl"), m_fDynamicRangeControl[ac3]);
+ key.SetDWORDValue(_T("DtsDynamicRangeControl"), m_fDynamicRangeControl[dts]);
+ }
#else
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("SampleFormat"), m_iSampleFormat);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("Ac3SpeakerConfig"), m_iSpeakerConfig[ac3]);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("DtsSpeakerConfig"), m_iSpeakerConfig[dts]);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("Ac3DynamicRangeControl"), m_fDynamicRangeControl[ac3]);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("DtsDynamicRangeControl"), m_fDynamicRangeControl[dts]);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("SampleFormat"), m_iSampleFormat);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("Ac3SpeakerConfig"), m_iSpeakerConfig[ac3]);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("DtsSpeakerConfig"), m_iSpeakerConfig[dts]);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("Ac3DynamicRangeControl"), m_fDynamicRangeControl[ac3]);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Audio Decoder"), _T("DtsDynamicRangeControl"), m_fDynamicRangeControl[dts]);
#endif
- return S_OK;
+ return S_OK;
}
// ISpecifyPropertyPages2
STDMETHODIMP CMpaDecFilter::GetPages(CAUUID* pPages)
{
- CheckPointer(pPages, E_POINTER);
+ CheckPointer(pPages, E_POINTER);
- pPages->cElems = 1;
- pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID) * pPages->cElems);
- pPages->pElems[0] = __uuidof(CMpaDecSettingsWnd);
+ pPages->cElems = 1;
+ pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID) * pPages->cElems);
+ pPages->pElems[0] = __uuidof(CMpaDecSettingsWnd);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CMpaDecFilter::CreatePage(const GUID& guid, IPropertyPage** ppPage)
{
- CheckPointer(ppPage, E_POINTER);
+ CheckPointer(ppPage, E_POINTER);
- if (*ppPage != NULL) {
- return E_INVALIDARG;
- }
+ if (*ppPage != NULL) {
+ return E_INVALIDARG;
+ }
- HRESULT hr;
+ HRESULT hr;
- if (guid == __uuidof(CMpaDecSettingsWnd)) {
- (*ppPage = DNew CInternalPropertyPageTempl<CMpaDecSettingsWnd>(NULL, &hr))->AddRef();
- }
+ if (guid == __uuidof(CMpaDecSettingsWnd)) {
+ (*ppPage = DNew CInternalPropertyPageTempl<CMpaDecSettingsWnd>(NULL, &hr))->AddRef();
+ }
- return *ppPage ? S_OK : E_FAIL;
+ return *ppPage ? S_OK : E_FAIL;
}
//
@@ -2065,7 +2067,7 @@ STDMETHODIMP CMpaDecFilter::CreatePage(const GUID& guid, IPropertyPage** ppPage)
//
CMpaDecInputPin::CMpaDecInputPin(CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName)
- : CDeCSSInputPin(NAME("CMpaDecInputPin"), pFilter, phr, pName)
+ : CDeCSSInputPin(NAME("CMpaDecInputPin"), pFilter, phr, pName)
{
}
@@ -2089,408 +2091,409 @@ CMpaDecInputPin::CMpaDecInputPin(CTransformFilter* pFilter, HRESULT* phr, LPWSTR
HRESULT CMpaDecFilter::DeliverFFmpeg(enum CodecID nCodecId, BYTE* p, int buffsize, int& size)
{
- HRESULT hr = S_OK;
- int got_frame = 0;
- if (!m_pAVCtx || nCodecId != m_pAVCtx->codec_id) {
- if (!InitFFmpeg (nCodecId)) {
- size = 0;
- return E_FAIL;
- }
- }
-
- bool b_use_parse = m_pParser && ((nCodecId == CODEC_ID_TRUEHD) ? ((buffsize > 2000) ? true : false) : true); // Dirty hack for use with MPC MPEGSplitter
-
- BYTE* pDataInBuff = p;
- CAtlArray<float> pBuffOut;
-
- WORD nChannels = 0;
- DWORD dwChannelMask = 0;
-
- BYTE *tmpProcessBuf = NULL;
-
- AVPacket avpkt;
- av_init_packet(&avpkt);
-
- if (m_raData.deint_id == MAKEFOURCC('r','n','e','g') || m_raData.deint_id == MAKEFOURCC('r','p','i','s')) {
-
- int w = m_raData.coded_frame_size;
- int h = m_raData.sub_packet_h;
- int sps = m_raData.sub_packet_size;
- int len = w * h;
-
- if (buffsize >= len) {
- tmpProcessBuf = (BYTE *)av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
- if (sps > 0 && m_raData.deint_id == MAKEFOURCC('r','n','e','g')) { // COOK and ATRAC codec
- const BYTE *srcBuf = pDataInBuff;
- for (int y = 0; y < h; y++) {
- for (int x = 0, w2 = w / sps; x < w2; x++) {
- memcpy(tmpProcessBuf + sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), srcBuf, sps);
- srcBuf += sps;
- }
- }
- } else if (m_raData.deint_id == MAKEFOURCC('r','p','i','s')) { // SIPR codec
- memcpy(tmpProcessBuf, pDataInBuff, len);
-
- // http://mplayerhq.hu/pipermail/mplayer-dev-eng/2002-August/010569.html
- static BYTE sipr_swaps[38][2]= {
- {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68},
- {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46},
- {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56},
- {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83},
- {77,80}
- };
-
- int bs=h*w*2/96; // nibbles per subpacket
- for (int n=0; n<38; n++) {
- int i=bs*sipr_swaps[n][0];
- int o=bs*sipr_swaps[n][1];
- // swap nibbles of block 'i' with 'o'
- for (int j=0; j<bs; j++) {
- int x=(i&1) ? (tmpProcessBuf[(i>>1)]>>4) : (tmpProcessBuf[(i>>1)]&15);
- int y=(o&1) ? (tmpProcessBuf[(o>>1)]>>4) : (tmpProcessBuf[(o>>1)]&15);
- if (o&1) {
- tmpProcessBuf[(o>>1)]=(tmpProcessBuf[(o>>1)]&0x0F)|(x<<4);
- } else {
- tmpProcessBuf[(o>>1)]=(tmpProcessBuf[(o>>1)]&0xF0)|x;
- }
- if (i&1) {
- tmpProcessBuf[(i>>1)]=(tmpProcessBuf[(i>>1)]&0x0F)|(y<<4);
- } else {
- tmpProcessBuf[(i>>1)]=(tmpProcessBuf[(i>>1)]&0xF0)|y;
- }
- ++i;
- ++o;
- }
- }
- }
- pDataInBuff = tmpProcessBuf;
- buffsize = len;
- } else {
- size = 0;
- return S_OK;
- }
- }
-
- while (buffsize > 0) {
- got_frame = 0;
- COPY_TO_BUFFER(pDataInBuff, buffsize);
-
- if (b_use_parse) {
- BYTE *pOut = NULL;
- int pOut_size = 0;
- int used_bytes = av_parser_parse2(m_pParser, m_pAVCtx, &pOut, &pOut_size, m_pFFBuffer, buffsize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
- if (used_bytes < 0) {
- TRACE(_T("CMpaDecFilter::DeliverFFmpeg() - audio parsing failed (ret: %d)\n"), -used_bytes);
- goto fail;
- } else if (used_bytes == 0 && pOut_size == 0) {
- TRACE(_T("CMpaDecFilter::DeliverFFmpeg() - could not process buffer while parsing\n"));
- break;
- }
-
- if (used_bytes > 0) {
- size += used_bytes;
- buffsize -= used_bytes;
- pDataInBuff += used_bytes;
- }
- if (pOut_size > 0) {
- COPY_TO_BUFFER(pOut, pOut_size);
- avpkt.data = (uint8_t *)m_pFFBuffer;
- avpkt.size = pOut_size;
-
- int ret2 = avcodec_decode_audio4(m_pAVCtx, m_pFrame, &got_frame, &avpkt);
- if (ret2 < 0) {
- TRACE(_T("CMpaDecFilter::DeliverFFmpeg() - decoding failed despite successfull parsing\n"));
- m_bResync = true;
- continue;
- }
- } else {
- continue;
- }
- } else {
- avpkt.data = (uint8_t *)m_pFFBuffer;
- avpkt.size = buffsize;
-
- int used_bytes = avcodec_decode_audio4(m_pAVCtx, m_pFrame, &got_frame, &avpkt);
-
- if (used_bytes < 0 || (used_bytes == 0 && !got_frame)) {
- TRACE(_T("CMpaDecFilter::DeliverFFmpeg() - decoding failed\n"));
- size = used_bytes;
- goto fail;
- } else if (used_bytes == 0) {
- TRACE(_T("CMpaDecFilter::DeliverFFmpeg() - could not process buffer while decoding\n"));
- break;
- } else if (m_pAVCtx->channels>8) {
- // sometimes avcodec_decode_audio4 can not identify the garbage and produces incorrect data.
- // this code does not solve the problem, it only reduces the likelihood of crash.
- // do it better!
- got_frame = 0;
- }
-
- size += used_bytes;
- buffsize -= used_bytes;
- pDataInBuff += used_bytes;
- }
-
- if (got_frame) {
- CAtlArray<float> pBuff;
- float* pDataOut;
-
- nChannels = m_pAVCtx->channels;
- if (m_pAVCtx->channel_layout)
- dwChannelMask = get_lav_channel_layout(m_pAVCtx->channel_layout);
- else
- dwChannelMask = GetDefChannelMask(nChannels);
-
- if (nChannels && dwChannelMask) {
-
- DWORD dwPCMSize = m_pFrame->nb_samples * nChannels * av_get_bytes_per_sample(m_pAVCtx->sample_fmt);
- switch (m_pAVCtx->sample_fmt) {
- case AV_SAMPLE_FMT_S16 :
- pBuff.SetCount (dwPCMSize / 2);
- pDataOut = pBuff.GetData();
-
- for (size_t i = 0; i < pBuff.GetCount(); ++i) {
- *pDataOut = (float)((int16_t*)m_pFrame->data[0])[i] / INT16_PEAK;
- pDataOut++;
- }
- break;
-
- case AV_SAMPLE_FMT_S32 :
- pBuff.SetCount (dwPCMSize / 4);
- pDataOut = pBuff.GetData();
-
- for (size_t i = 0; i < pBuff.GetCount(); ++i) {
- *pDataOut = (float)((int32_t*)m_pFrame->data[0])[i] / INT32_PEAK;
- pDataOut++;
- }
- break;
- case AV_SAMPLE_FMT_FLT:
- pBuff.SetCount (dwPCMSize / 4);
- pDataOut = pBuff.GetData();
- memcpy(pDataOut, m_pFrame->data[0], dwPCMSize);
- break;
- default :
- ASSERT(FALSE);
- break;
- }
-
- if (pBuff.GetCount() > 0) {
- hr = Deliver(pBuff, m_pAVCtx->sample_rate, nChannels, dwChannelMask);
- if (FAILED(hr)) {
- TRACE(_T("CMpaDecFilter::DeliverFFmpeg() - Deliver failed\n"));
- goto fail;
- }
- }
-
- }
- }
- }
-
- av_free(tmpProcessBuf);
- return hr;
+ HRESULT hr = S_OK;
+ int got_frame = 0;
+ if (!m_pAVCtx || nCodecId != m_pAVCtx->codec_id) {
+ if (!InitFFmpeg(nCodecId)) {
+ size = 0;
+ return E_FAIL;
+ }
+ }
+
+ bool b_use_parse = m_pParser && ((nCodecId == CODEC_ID_TRUEHD) ? ((buffsize > 2000) ? true : false) : true); // Dirty hack for use with MPC MPEGSplitter
+
+ BYTE* pDataInBuff = p;
+ CAtlArray<float> pBuffOut;
+
+ WORD nChannels = 0;
+ DWORD dwChannelMask = 0;
+
+ BYTE* tmpProcessBuf = NULL;
+
+ AVPacket avpkt;
+ av_init_packet(&avpkt);
+
+ if (m_raData.deint_id == MAKEFOURCC('r', 'n', 'e', 'g') || m_raData.deint_id == MAKEFOURCC('r', 'p', 'i', 's')) {
+
+ int w = m_raData.coded_frame_size;
+ int h = m_raData.sub_packet_h;
+ int sps = m_raData.sub_packet_size;
+ int len = w * h;
+
+ if (buffsize >= len) {
+ tmpProcessBuf = (BYTE*)av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (sps > 0 && m_raData.deint_id == MAKEFOURCC('r', 'n', 'e', 'g')) { // COOK and ATRAC codec
+ const BYTE* srcBuf = pDataInBuff;
+ for (int y = 0; y < h; y++) {
+ for (int x = 0, w2 = w / sps; x < w2; x++) {
+ memcpy(tmpProcessBuf + sps * (h * x + ((h + 1) / 2) * (y & 1) + (y >> 1)), srcBuf, sps);
+ srcBuf += sps;
+ }
+ }
+ } else if (m_raData.deint_id == MAKEFOURCC('r', 'p', 'i', 's')) { // SIPR codec
+ memcpy(tmpProcessBuf, pDataInBuff, len);
+
+ // http://mplayerhq.hu/pipermail/mplayer-dev-eng/2002-August/010569.html
+ static BYTE sipr_swaps[38][2] = {
+ {0, 63}, {1, 22}, {2, 44}, {3, 90}, {5, 81}, {7, 31}, {8, 86}, {9, 58}, {10, 36}, {12, 68},
+ {13, 39}, {14, 73}, {15, 53}, {16, 69}, {17, 57}, {19, 88}, {20, 34}, {21, 71}, {24, 46},
+ {25, 94}, {26, 54}, {28, 75}, {29, 50}, {32, 70}, {33, 92}, {35, 74}, {38, 85}, {40, 56},
+ {42, 87}, {43, 65}, {45, 59}, {48, 79}, {49, 93}, {51, 89}, {55, 95}, {61, 76}, {67, 83},
+ {77, 80}
+ };
+
+ int bs = h * w * 2 / 96; // nibbles per subpacket
+ for (int n = 0; n < 38; n++) {
+ int i = bs * sipr_swaps[n][0];
+ int o = bs * sipr_swaps[n][1];
+ // swap nibbles of block 'i' with 'o'
+ for (int j = 0; j < bs; j++) {
+ int x = (i & 1) ? (tmpProcessBuf[(i >> 1)] >> 4) : (tmpProcessBuf[(i >> 1)] & 15);
+ int y = (o & 1) ? (tmpProcessBuf[(o >> 1)] >> 4) : (tmpProcessBuf[(o >> 1)] & 15);
+ if (o & 1) {
+ tmpProcessBuf[(o >> 1)] = (tmpProcessBuf[(o >> 1)] & 0x0F) | (x << 4);
+ } else {
+ tmpProcessBuf[(o >> 1)] = (tmpProcessBuf[(o >> 1)] & 0xF0) | x;
+ }
+ if (i & 1) {
+ tmpProcessBuf[(i >> 1)] = (tmpProcessBuf[(i >> 1)] & 0x0F) | (y << 4);
+ } else {
+ tmpProcessBuf[(i >> 1)] = (tmpProcessBuf[(i >> 1)] & 0xF0) | y;
+ }
+ ++i;
+ ++o;
+ }
+ }
+ }
+ pDataInBuff = tmpProcessBuf;
+ buffsize = len;
+ } else {
+ size = 0;
+ return S_OK;
+ }
+ }
+
+ while (buffsize > 0) {
+ got_frame = 0;
+ COPY_TO_BUFFER(pDataInBuff, buffsize);
+
+ if (b_use_parse) {
+ BYTE* pOut = NULL;
+ int pOut_size = 0;
+ int used_bytes = av_parser_parse2(m_pParser, m_pAVCtx, &pOut, &pOut_size, m_pFFBuffer, buffsize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
+ if (used_bytes < 0) {
+ TRACE(_T("CMpaDecFilter::DeliverFFmpeg() - audio parsing failed (ret: %d)\n"), -used_bytes);
+ goto fail;
+ } else if (used_bytes == 0 && pOut_size == 0) {
+ TRACE(_T("CMpaDecFilter::DeliverFFmpeg() - could not process buffer while parsing\n"));
+ break;
+ }
+
+ if (used_bytes > 0) {
+ size += used_bytes;
+ buffsize -= used_bytes;
+ pDataInBuff += used_bytes;
+ }
+ if (pOut_size > 0) {
+ COPY_TO_BUFFER(pOut, pOut_size);
+ avpkt.data = (uint8_t*)m_pFFBuffer;
+ avpkt.size = pOut_size;
+
+ int ret2 = avcodec_decode_audio4(m_pAVCtx, m_pFrame, &got_frame, &avpkt);
+ if (ret2 < 0) {
+ TRACE(_T("CMpaDecFilter::DeliverFFmpeg() - decoding failed despite successfull parsing\n"));
+ m_bResync = true;
+ continue;
+ }
+ } else {
+ continue;
+ }
+ } else {
+ avpkt.data = (uint8_t*)m_pFFBuffer;
+ avpkt.size = buffsize;
+
+ int used_bytes = avcodec_decode_audio4(m_pAVCtx, m_pFrame, &got_frame, &avpkt);
+
+ if (used_bytes < 0 || (used_bytes == 0 && !got_frame)) {
+ TRACE(_T("CMpaDecFilter::DeliverFFmpeg() - decoding failed\n"));
+ size = used_bytes;
+ goto fail;
+ } else if (used_bytes == 0) {
+ TRACE(_T("CMpaDecFilter::DeliverFFmpeg() - could not process buffer while decoding\n"));
+ break;
+ } else if (m_pAVCtx->channels > 8) {
+ // sometimes avcodec_decode_audio4 can not identify the garbage and produces incorrect data.
+ // this code does not solve the problem, it only reduces the likelihood of crash.
+ // do it better!
+ got_frame = 0;
+ }
+
+ size += used_bytes;
+ buffsize -= used_bytes;
+ pDataInBuff += used_bytes;
+ }
+
+ if (got_frame) {
+ CAtlArray<float> pBuff;
+ float* pDataOut;
+
+ nChannels = m_pAVCtx->channels;
+ if (m_pAVCtx->channel_layout) {
+ dwChannelMask = get_lav_channel_layout(m_pAVCtx->channel_layout);
+ } else {
+ dwChannelMask = GetDefChannelMask(nChannels);
+ }
+
+ if (nChannels && dwChannelMask) {
+
+ DWORD dwPCMSize = m_pFrame->nb_samples * nChannels * av_get_bytes_per_sample(m_pAVCtx->sample_fmt);
+ switch (m_pAVCtx->sample_fmt) {
+ case AV_SAMPLE_FMT_S16 :
+ pBuff.SetCount(dwPCMSize / 2);
+ pDataOut = pBuff.GetData();
+
+ for (size_t i = 0; i < pBuff.GetCount(); ++i) {
+ *pDataOut = (float)((int16_t*)m_pFrame->data[0])[i] / INT16_PEAK;
+ pDataOut++;
+ }
+ break;
+
+ case AV_SAMPLE_FMT_S32 :
+ pBuff.SetCount(dwPCMSize / 4);
+ pDataOut = pBuff.GetData();
+
+ for (size_t i = 0; i < pBuff.GetCount(); ++i) {
+ *pDataOut = (float)((int32_t*)m_pFrame->data[0])[i] / INT32_PEAK;
+ pDataOut++;
+ }
+ break;
+ case AV_SAMPLE_FMT_FLT:
+ pBuff.SetCount(dwPCMSize / 4);
+ pDataOut = pBuff.GetData();
+ memcpy(pDataOut, m_pFrame->data[0], dwPCMSize);
+ break;
+ default :
+ ASSERT(FALSE);
+ break;
+ }
+
+ if (pBuff.GetCount() > 0) {
+ hr = Deliver(pBuff, m_pAVCtx->sample_rate, nChannels, dwChannelMask);
+ if (FAILED(hr)) {
+ TRACE(_T("CMpaDecFilter::DeliverFFmpeg() - Deliver failed\n"));
+ goto fail;
+ }
+ }
+
+ }
+ }
+ }
+
+ av_free(tmpProcessBuf);
+ return hr;
fail:
- av_free(tmpProcessBuf);
- return E_FAIL;
+ av_free(tmpProcessBuf);
+ return E_FAIL;
}
bool CMpaDecFilter::InitFFmpeg(enum CodecID nCodecId)
{
- if (nCodecId == CODEC_ID_NONE) {
- return false;
- }
-
- bool bRet = false;
-
- avcodec_register_all();
- av_log_set_callback(LogLibavcodec);
-
- if (m_pAVCodec) {
- ffmpeg_stream_finish();
- }
- switch (nCodecId) {
- case CODEC_ID_MP1 :
- m_pAVCodec = avcodec_find_decoder_by_name("mp1float");
- case CODEC_ID_MP2 :
- m_pAVCodec = avcodec_find_decoder_by_name("mp2float");
- case CODEC_ID_MP3 :
- m_pAVCodec = avcodec_find_decoder_by_name("mp3float");
- default :
- m_pAVCodec = avcodec_find_decoder(nCodecId);
- }
-
- if (m_pAVCodec) {
- DWORD nSamples, nBytesPerSec;
- WORD nChannels, nBitsPerSample, nBlockAlign;
- audioFormatTypeHandler((BYTE *)m_pInput->CurrentMediaType().Format(), m_pInput->CurrentMediaType().FormatType(), &nSamples, &nChannels, &nBitsPerSample, &nBlockAlign, &nBytesPerSec);
-
- if (nCodecId == CODEC_ID_AMR_NB || nCodecId == CODEC_ID_AMR_WB) {
- nChannels = 1;
- nSamples = 8000;
- }
-
- m_pAVCtx = avcodec_alloc_context3(m_pAVCodec);
- CheckPointer(m_pAVCtx, false);
-
- m_pAVCtx->sample_rate = nSamples;
- m_pAVCtx->channels = nChannels;
- m_pAVCtx->bit_rate = nBytesPerSec << 3;
- m_pAVCtx->bits_per_coded_sample = nBitsPerSample;
- m_pAVCtx->block_align = nBlockAlign;
-
- m_pAVCtx->err_recognition = AV_EF_CAREFUL;
- m_pAVCtx->codec_id = nCodecId;
- if (m_pAVCodec->capabilities & CODEC_CAP_TRUNCATED) {
- m_pAVCtx->flags |= CODEC_FLAG_TRUNCATED;
- }
-
- if (nCodecId != CODEC_ID_AAC && nCodecId != CODEC_ID_AAC_LATM) {
- m_pParser = av_parser_init(nCodecId);
- }
-
- const void *format = m_pInput->CurrentMediaType().Format();
- GUID format_type = m_pInput->CurrentMediaType().formattype;
- DWORD formatlen = m_pInput->CurrentMediaType().cbFormat;
- unsigned extralen = 0;
- getExtraData((BYTE *)format, &format_type, formatlen, NULL, &extralen);
-
- memset(&m_raData, 0, sizeof(m_raData));
-
- if (extralen) {
- if (nCodecId == CODEC_ID_COOK || nCodecId == CODEC_ID_ATRAC3 || nCodecId == CODEC_ID_SIPR) {
- uint8_t *extra = (uint8_t *)av_mallocz(extralen + FF_INPUT_BUFFER_PADDING_SIZE);
- getExtraData((BYTE *)format, &format_type, formatlen, extra, NULL);
-
- if (extra[0] == '.' && extra[1] == 'r' && extra[2] == 'a' && extra[3] == 0xfd) {
- HRESULT hr = ParseRealAudioHeader(extra, extralen);
- av_freep(&extra);
- if (FAILED(hr)) {
- return false;
- }
- if (nCodecId == CODEC_ID_SIPR) {
- if (m_raData.flavor > 3) {
- TRACE(_T("CMpaDecFilter::InitFFmpeg() : Invalid SIPR flavor (%d)"), m_raData.flavor);
- return false;
- }
- static BYTE sipr_subpk_size[4] = { 29, 19, 37, 20 };
- m_pAVCtx->block_align = sipr_subpk_size[m_raData.flavor];
- }
- } else {
- // Try without any processing?
- m_pAVCtx->extradata_size = extralen;
- m_pAVCtx->extradata = extra;
- }
- } else {
- m_pAVCtx->extradata_size = extralen;
- m_pAVCtx->extradata = (uint8_t *)av_mallocz(m_pAVCtx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
- getExtraData((BYTE *)format, &format_type, formatlen, (BYTE *)m_pAVCtx->extradata, NULL);
- }
- }
-
- if (avcodec_open2(m_pAVCtx, m_pAVCodec, NULL)>=0) {
- m_pFrame = avcodec_alloc_frame();
- bRet = true;
- }
- }
-
- if (!bRet) {
- ffmpeg_stream_finish();
- }
-
- return bRet;
+ if (nCodecId == CODEC_ID_NONE) {
+ return false;
+ }
+
+ bool bRet = false;
+
+ avcodec_register_all();
+ av_log_set_callback(LogLibavcodec);
+
+ if (m_pAVCodec) {
+ ffmpeg_stream_finish();
+ }
+ switch (nCodecId) {
+ case CODEC_ID_MP1 :
+ m_pAVCodec = avcodec_find_decoder_by_name("mp1float");
+ case CODEC_ID_MP2 :
+ m_pAVCodec = avcodec_find_decoder_by_name("mp2float");
+ case CODEC_ID_MP3 :
+ m_pAVCodec = avcodec_find_decoder_by_name("mp3float");
+ default :
+ m_pAVCodec = avcodec_find_decoder(nCodecId);
+ }
+
+ if (m_pAVCodec) {
+ DWORD nSamples, nBytesPerSec;
+ WORD nChannels, nBitsPerSample, nBlockAlign;
+ audioFormatTypeHandler((BYTE*)m_pInput->CurrentMediaType().Format(), m_pInput->CurrentMediaType().FormatType(), &nSamples, &nChannels, &nBitsPerSample, &nBlockAlign, &nBytesPerSec);
+
+ if (nCodecId == CODEC_ID_AMR_NB || nCodecId == CODEC_ID_AMR_WB) {
+ nChannels = 1;
+ nSamples = 8000;
+ }
+
+ m_pAVCtx = avcodec_alloc_context3(m_pAVCodec);
+ CheckPointer(m_pAVCtx, false);
+
+ m_pAVCtx->sample_rate = nSamples;
+ m_pAVCtx->channels = nChannels;
+ m_pAVCtx->bit_rate = nBytesPerSec << 3;
+ m_pAVCtx->bits_per_coded_sample = nBitsPerSample;
+ m_pAVCtx->block_align = nBlockAlign;
+
+ m_pAVCtx->err_recognition = AV_EF_CAREFUL;
+ m_pAVCtx->codec_id = nCodecId;
+ if (m_pAVCodec->capabilities & CODEC_CAP_TRUNCATED) {
+ m_pAVCtx->flags |= CODEC_FLAG_TRUNCATED;
+ }
+
+ if (nCodecId != CODEC_ID_AAC && nCodecId != CODEC_ID_AAC_LATM) {
+ m_pParser = av_parser_init(nCodecId);
+ }
+
+ const void* format = m_pInput->CurrentMediaType().Format();
+ GUID format_type = m_pInput->CurrentMediaType().formattype;
+ DWORD formatlen = m_pInput->CurrentMediaType().cbFormat;
+ unsigned extralen = 0;
+ getExtraData((BYTE*)format, &format_type, formatlen, NULL, &extralen);
+
+ memset(&m_raData, 0, sizeof(m_raData));
+
+ if (extralen) {
+ if (nCodecId == CODEC_ID_COOK || nCodecId == CODEC_ID_ATRAC3 || nCodecId == CODEC_ID_SIPR) {
+ uint8_t* extra = (uint8_t*)av_mallocz(extralen + FF_INPUT_BUFFER_PADDING_SIZE);
+ getExtraData((BYTE*)format, &format_type, formatlen, extra, NULL);
+
+ if (extra[0] == '.' && extra[1] == 'r' && extra[2] == 'a' && extra[3] == 0xfd) {
+ HRESULT hr = ParseRealAudioHeader(extra, extralen);
+ av_freep(&extra);
+ if (FAILED(hr)) {
+ return false;
+ }
+ if (nCodecId == CODEC_ID_SIPR) {
+ if (m_raData.flavor > 3) {
+ TRACE(_T("CMpaDecFilter::InitFFmpeg() : Invalid SIPR flavor (%d)"), m_raData.flavor);
+ return false;
+ }
+ static BYTE sipr_subpk_size[4] = { 29, 19, 37, 20 };
+ m_pAVCtx->block_align = sipr_subpk_size[m_raData.flavor];
+ }
+ } else {
+ // Try without any processing?
+ m_pAVCtx->extradata_size = extralen;
+ m_pAVCtx->extradata = extra;
+ }
+ } else {
+ m_pAVCtx->extradata_size = extralen;
+ m_pAVCtx->extradata = (uint8_t*)av_mallocz(m_pAVCtx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
+ getExtraData((BYTE*)format, &format_type, formatlen, (BYTE*)m_pAVCtx->extradata, NULL);
+ }
+ }
+
+ if (avcodec_open2(m_pAVCtx, m_pAVCodec, NULL) >= 0) {
+ m_pFrame = avcodec_alloc_frame();
+ bRet = true;
+ }
+ }
+
+ if (!bRet) {
+ ffmpeg_stream_finish();
+ }
+
+ return bRet;
}
-void CMpaDecFilter::LogLibavcodec(void* par,int level,const char *fmt,va_list valist)
+void CMpaDecFilter::LogLibavcodec(void* par, int level, const char* fmt, va_list valist)
{
#if defined(_DEBUG) && 0
- char Msg [500];
- vsnprintf_s (Msg, sizeof(Msg), _TRUNCATE, fmt, valist);
- TRACE("AVLIB : %s", Msg);
+ char Msg [500];
+ vsnprintf_s(Msg, sizeof(Msg), _TRUNCATE, fmt, valist);
+ TRACE("AVLIB : %s", Msg);
#endif
}
void CMpaDecFilter::ffmpeg_stream_finish()
{
- m_pAVCodec = NULL;
- if (m_pAVCtx) {
- if (m_pAVCtx->extradata) {
- av_freep(&m_pAVCtx->extradata);
- }
- if (m_pAVCtx->codec) {
- avcodec_close(m_pAVCtx);
- }
- av_freep(&m_pAVCtx);
- }
-
- if (m_pParser) {
- av_parser_close(m_pParser);
- m_pParser = NULL;
- }
-
- if (m_pFrame) {
- av_freep(&m_pFrame);
- }
-
- if (m_pFFBuffer) {
- av_freep(&m_pFFBuffer);
- }
- m_nFFBufferSize = 0;
+ m_pAVCodec = NULL;
+ if (m_pAVCtx) {
+ if (m_pAVCtx->extradata) {
+ av_freep(&m_pAVCtx->extradata);
+ }
+ if (m_pAVCtx->codec) {
+ avcodec_close(m_pAVCtx);
+ }
+ av_freep(&m_pAVCtx);
+ }
+
+ if (m_pParser) {
+ av_parser_close(m_pParser);
+ m_pParser = NULL;
+ }
+
+ if (m_pFrame) {
+ av_freep(&m_pFrame);
+ }
+
+ if (m_pFFBuffer) {
+ av_freep(&m_pFFBuffer);
+ }
+ m_nFFBufferSize = 0;
}
-HRESULT CMpaDecFilter::ParseRealAudioHeader(const BYTE *extra, const int extralen)
+HRESULT CMpaDecFilter::ParseRealAudioHeader(const BYTE* extra, const int extralen)
{
- const uint8_t *fmt = extra+4;
- uint16_t version = AV_RB16(fmt);
- fmt += 2;
- if (version == 3) {
- TRACE(_T("RealAudio Header version 3 unsupported\n"));
- return VFW_E_UNSUPPORTED_AUDIO;
- } else if (version == 4 || version == 5 && extralen > 50) {
- // main format block
- fmt += 2; // word - unused (always 0)
- fmt += 4; // byte[4] - .ra4/.ra5 signature
- fmt += 4; // dword - unknown
- fmt += 2; // word - Version2
- fmt += 4; // dword - header size
- m_raData.flavor = AV_RB16(fmt); fmt += 2; // word - codec flavor
- m_raData.coded_frame_size = AV_RB32(fmt); fmt += 4; // dword - coded frame size
- fmt += 12; // byte[12] - unknown
- m_raData.sub_packet_h = AV_RB16(fmt); fmt += 2; // word - sub packet h
- fmt += 2; // word - frame size
- m_raData.sub_packet_size = m_pAVCtx->block_align = AV_RB16(fmt); fmt += 2; // word - subpacket size
- fmt += 2; // word - unknown
- // 6 Unknown bytes in ver 5
- if (version == 5) {
- fmt += 6;
- }
- // Audio format block
- fmt += 8;
- // Tag info in v4
- if (version == 4) {
- int len = *fmt++;
- m_raData.deint_id = AV_RB32(fmt); fmt += len;
- len = *fmt++;
- fmt += len;
- } else if (version == 5) {
- m_raData.deint_id = AV_RB32(fmt); fmt += 4;
- fmt += 4;
- }
- fmt += 3;
- if (version == 5) {
- fmt++;
- }
-
- int ra_extralen = AV_RB32(fmt);
- if (ra_extralen > 0) {
- m_pAVCtx->extradata_size = ra_extralen;
- m_pAVCtx->extradata = (uint8_t *)av_mallocz(ra_extralen + FF_INPUT_BUFFER_PADDING_SIZE);
- memcpy((void *)m_pAVCtx->extradata, fmt+4, ra_extralen);
- }
- } else {
- TRACE(_T("Unknown RealAudio Header version: %d\n"), version);
- return VFW_E_UNSUPPORTED_AUDIO;
- }
-
- return S_OK;
+ const uint8_t* fmt = extra + 4;
+ uint16_t version = AV_RB16(fmt);
+ fmt += 2;
+ if (version == 3) {
+ TRACE(_T("RealAudio Header version 3 unsupported\n"));
+ return VFW_E_UNSUPPORTED_AUDIO;
+ } else if (version == 4 || version == 5 && extralen > 50) {
+ // main format block
+ fmt += 2; // word - unused (always 0)
+ fmt += 4; // byte[4] - .ra4/.ra5 signature
+ fmt += 4; // dword - unknown
+ fmt += 2; // word - Version2
+ fmt += 4; // dword - header size
+ m_raData.flavor = AV_RB16(fmt); fmt += 2; // word - codec flavor
+ m_raData.coded_frame_size = AV_RB32(fmt); fmt += 4; // dword - coded frame size
+ fmt += 12; // byte[12] - unknown
+ m_raData.sub_packet_h = AV_RB16(fmt); fmt += 2; // word - sub packet h
+ fmt += 2; // word - frame size
+ m_raData.sub_packet_size = m_pAVCtx->block_align = AV_RB16(fmt); fmt += 2; // word - subpacket size
+ fmt += 2; // word - unknown
+ // 6 Unknown bytes in ver 5
+ if (version == 5) {
+ fmt += 6;
+ }
+ // Audio format block
+ fmt += 8;
+ // Tag info in v4
+ if (version == 4) {
+ int len = *fmt++;
+ m_raData.deint_id = AV_RB32(fmt); fmt += len;
+ len = *fmt++;
+ fmt += len;
+ } else if (version == 5) {
+ m_raData.deint_id = AV_RB32(fmt); fmt += 4;
+ fmt += 4;
+ }
+ fmt += 3;
+ if (version == 5) {
+ fmt++;
+ }
+
+ int ra_extralen = AV_RB32(fmt);
+ if (ra_extralen > 0) {
+ m_pAVCtx->extradata_size = ra_extralen;
+ m_pAVCtx->extradata = (uint8_t*)av_mallocz(ra_extralen + FF_INPUT_BUFFER_PADDING_SIZE);
+ memcpy((void*)m_pAVCtx->extradata, fmt + 4, ra_extralen);
+ }
+ } else {
+ TRACE(_T("Unknown RealAudio Header version: %d\n"), version);
+ return VFW_E_UNSUPPORTED_AUDIO;
+ }
+
+ return S_OK;
}
#pragma endregion
diff --git a/src/filters/transform/MpaDecFilter/MpaDecFilter.h b/src/filters/transform/MpaDecFilter/MpaDecFilter.h
index 1dca25af7..8aaf1deb1 100644
--- a/src/filters/transform/MpaDecFilter/MpaDecFilter.h
+++ b/src/filters/transform/MpaDecFilter/MpaDecFilter.h
@@ -40,15 +40,15 @@
#define MPCAudioDecName L"MPC Audio Decoder"
struct ps2_state_t {
- bool sync;
- double a[2], b[2];
- ps2_state_t() {
- reset();
- }
- void reset() {
- sync = false;
- a[0] = a[1] = b[0] = b[1] = 0;
- }
+ bool sync;
+ double a[2], b[2];
+ ps2_state_t() {
+ reset();
+ }
+ void reset() {
+ sync = false;
+ a[0] = a[1] = b[0] = b[1] = 0;
+ }
};
struct AVCodec;
@@ -57,140 +57,140 @@ struct AVFrame;
struct AVCodecParserContext;
class __declspec(uuid("3D446B6F-71DE-4437-BE15-8CE47174340F"))
- CMpaDecFilter
- : public CTransformFilter
- , public IMpaDecFilter
- , public ISpecifyPropertyPages2
+ CMpaDecFilter
+ : public CTransformFilter
+ , public IMpaDecFilter
+ , public ISpecifyPropertyPages2
{
protected:
- CCritSec m_csReceive;
+ CCritSec m_csReceive;
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_AC3
- a52_state_t* m_a52_state;
+ a52_state_t* m_a52_state;
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_DTS
- dts_state_t* m_dts_state;
+ dts_state_t* m_dts_state;
#endif
- ps2_state_t m_ps2_state;
+ ps2_state_t m_ps2_state;
- DolbyDigitalMode m_DolbyDigitalMode;
+ DolbyDigitalMode m_DolbyDigitalMode;
#if defined(REGISTER_FILTER) || HAS_FFMPEG_AUDIO_DECODERS
- // === FFMpeg variables
- AVCodec* m_pAVCodec;
- AVCodecContext* m_pAVCtx;
- AVCodecParserContext* m_pParser;
- AVFrame* m_pFrame;
+ // === FFMpeg variables
+ AVCodec* m_pAVCodec;
+ AVCodecContext* m_pAVCtx;
+ AVCodecParserContext* m_pParser;
+ AVFrame* m_pFrame;
#endif
- CAtlArray<BYTE> m_buff;
- REFERENCE_TIME m_rtStart;
- bool m_fDiscontinuity;
+ CAtlArray<BYTE> m_buff;
+ REFERENCE_TIME m_rtStart;
+ bool m_fDiscontinuity;
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_LPCM
- HRESULT ProcessLPCM();
- HRESULT ProcessHdmvLPCM(bool bAlignOldBuffer);
+ HRESULT ProcessLPCM();
+ HRESULT ProcessHdmvLPCM(bool bAlignOldBuffer);
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_AC3
- HRESULT ProcessAC3();
- HRESULT ProcessA52(BYTE* p, int buffsize, int& size, bool& fEnoughData);
+ HRESULT ProcessAC3();
+ HRESULT ProcessA52(BYTE* p, int buffsize, int& size, bool& fEnoughData);
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_DTS
- HRESULT ProcessDTS();
+ HRESULT ProcessDTS();
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_PS2AUDIO
- HRESULT ProcessPS2PCM();
- HRESULT ProcessPS2ADPCM();
+ HRESULT ProcessPS2PCM();
+ HRESULT ProcessPS2ADPCM();
#endif
#if defined(REGISTER_FILTER) || INTERNAL_DECODER_PCM
- HRESULT ProcessPCMraw();
- HRESULT ProcessPCMintBE();
- HRESULT ProcessPCMintLE();
- HRESULT ProcessPCMfloatBE();
- HRESULT ProcessPCMfloatLE();
+ HRESULT ProcessPCMraw();
+ HRESULT ProcessPCMintBE();
+ HRESULT ProcessPCMintLE();
+ HRESULT ProcessPCMfloatBE();
+ HRESULT ProcessPCMfloatLE();
#endif
- HRESULT GetDeliveryBuffer(IMediaSample** pSample, BYTE** pData);
- HRESULT Deliver(CAtlArray<float>& pBuff, DWORD nSamplesPerSec, WORD nChannels, DWORD dwChannelMask = 0);
- HRESULT DeliverBitstream(BYTE* pBuff, int size, int sample_rate, int frame_length, BYTE type);
- HRESULT ReconnectOutput(int nSamples, CMediaType& mt);
- CMediaType CreateMediaType(MPCSampleFormat sf, DWORD nSamplesPerSec, WORD nChannels, DWORD dwChannelMask = 0);
- CMediaType CreateMediaTypeSPDIF(DWORD nSamplesPerSec = 48000);
+ HRESULT GetDeliveryBuffer(IMediaSample** pSample, BYTE** pData);
+ HRESULT Deliver(CAtlArray<float>& pBuff, DWORD nSamplesPerSec, WORD nChannels, DWORD dwChannelMask = 0);
+ HRESULT DeliverBitstream(BYTE* pBuff, int size, int sample_rate, int frame_length, BYTE type);
+ HRESULT ReconnectOutput(int nSamples, CMediaType& mt);
+ CMediaType CreateMediaType(MPCSampleFormat sf, DWORD nSamplesPerSec, WORD nChannels, DWORD dwChannelMask = 0);
+ CMediaType CreateMediaTypeSPDIF(DWORD nSamplesPerSec = 48000);
#if defined(REGISTER_FILTER) || HAS_FFMPEG_AUDIO_DECODERS
- bool InitFFmpeg(enum CodecID nCodecId);
- void ffmpeg_stream_finish();
- HRESULT DeliverFFmpeg(enum CodecID nCodecId, BYTE* p, int samples, int& size);
- HRESULT ProcessFFmpeg(enum CodecID nCodecId);
- static void LogLibavcodec(void* par,int level,const char *fmt,va_list valist);
-
- BYTE* m_pFFBuffer;
- int m_nFFBufferSize;
-
- enum CodecID FindCodec(const GUID subtype);
-
- struct {
- int flavor;
- int coded_frame_size;
- int sub_packet_h;
- int sub_packet_size;
- unsigned int deint_id;
- } m_raData;
-
- HRESULT ParseRealAudioHeader(const BYTE *extra, const int extralen);
+ bool InitFFmpeg(enum CodecID nCodecId);
+ void ffmpeg_stream_finish();
+ HRESULT DeliverFFmpeg(enum CodecID nCodecId, BYTE* p, int samples, int& size);
+ HRESULT ProcessFFmpeg(enum CodecID nCodecId);
+ static void LogLibavcodec(void* par, int level, const char* fmt, va_list valist);
+
+ BYTE* m_pFFBuffer;
+ int m_nFFBufferSize;
+
+ enum CodecID FindCodec(const GUID subtype);
+
+ struct {
+ int flavor;
+ int coded_frame_size;
+ int sub_packet_h;
+ int sub_packet_size;
+ unsigned int deint_id;
+ } m_raData;
+
+ HRESULT ParseRealAudioHeader(const BYTE* extra, const int extralen);
#endif
protected:
- CCritSec m_csProps;
- MPCSampleFormat m_iSampleFormat;
- int m_iSpeakerConfig[etlast];
- bool m_fDynamicRangeControl[etlast];
+ CCritSec m_csProps;
+ MPCSampleFormat m_iSampleFormat;
+ int m_iSpeakerConfig[etlast];
+ bool m_fDynamicRangeControl[etlast];
- bool m_bResync;
+ bool m_bResync;
public:
- CMpaDecFilter(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CMpaDecFilter();
+ CMpaDecFilter(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CMpaDecFilter();
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- HRESULT EndOfStream();
- HRESULT BeginFlush();
- HRESULT EndFlush();
- HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
- HRESULT Receive(IMediaSample* pIn);
+ HRESULT EndOfStream();
+ HRESULT BeginFlush();
+ HRESULT EndFlush();
+ HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT Receive(IMediaSample* pIn);
- HRESULT CheckInputType(const CMediaType* mtIn);
- HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
- HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
- HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
+ HRESULT CheckInputType(const CMediaType* mtIn);
+ HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
+ HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
- HRESULT StartStreaming();
- HRESULT StopStreaming();
+ HRESULT StartStreaming();
+ HRESULT StopStreaming();
- HRESULT SetMediaType(PIN_DIRECTION dir, const CMediaType *pmt);
+ HRESULT SetMediaType(PIN_DIRECTION dir, const CMediaType* pmt);
- // ISpecifyPropertyPages2
+ // ISpecifyPropertyPages2
- STDMETHODIMP GetPages(CAUUID* pPages);
- STDMETHODIMP CreatePage(const GUID& guid, IPropertyPage** ppPage);
+ STDMETHODIMP GetPages(CAUUID* pPages);
+ STDMETHODIMP CreatePage(const GUID& guid, IPropertyPage** ppPage);
- // IMpaDecFilter
+ // IMpaDecFilter
- STDMETHODIMP SetSampleFormat(MPCSampleFormat sf);
- STDMETHODIMP_(MPCSampleFormat) GetSampleFormat();
- STDMETHODIMP SetSpeakerConfig(enctype et, int sc);
- STDMETHODIMP_(int) GetSpeakerConfig(enctype et);
- STDMETHODIMP SetDynamicRangeControl(enctype et, bool fDRC);
- STDMETHODIMP_(bool) GetDynamicRangeControl(enctype et);
- STDMETHODIMP_(DolbyDigitalMode) GetDolbyDigitalMode();
+ STDMETHODIMP SetSampleFormat(MPCSampleFormat sf);
+ STDMETHODIMP_(MPCSampleFormat) GetSampleFormat();
+ STDMETHODIMP SetSpeakerConfig(enctype et, int sc);
+ STDMETHODIMP_(int) GetSpeakerConfig(enctype et);
+ STDMETHODIMP SetDynamicRangeControl(enctype et, bool fDRC);
+ STDMETHODIMP_(bool) GetDynamicRangeControl(enctype et);
+ STDMETHODIMP_(DolbyDigitalMode) GetDolbyDigitalMode();
- STDMETHODIMP SaveSettings();
+ STDMETHODIMP SaveSettings();
};
class CMpaDecInputPin : public CDeCSSInputPin
{
public:
- CMpaDecInputPin(CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName);
+ CMpaDecInputPin(CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName);
};
diff --git a/src/filters/transform/MpaDecFilter/MpaDecSettingsWnd.cpp b/src/filters/transform/MpaDecFilter/MpaDecSettingsWnd.cpp
index 9273c9d85..243a7759b 100644
--- a/src/filters/transform/MpaDecFilter/MpaDecSettingsWnd.cpp
+++ b/src/filters/transform/MpaDecFilter/MpaDecSettingsWnd.cpp
@@ -38,207 +38,207 @@ static TCHAR m_strDecodeToSpeaker[50];
CMpaDecSettingsWnd::CMpaDecSettingsWnd()
{
- wcscpy_s(m_strDecodeToSpeaker, ResStr(IDS_MPADECSETTINGSWND_5));
+ wcscpy_s(m_strDecodeToSpeaker, ResStr(IDS_MPADECSETTINGSWND_5));
}
bool CMpaDecSettingsWnd::OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks)
{
- ASSERT(!m_pMDF);
+ ASSERT(!m_pMDF);
- m_pMDF.Release();
+ m_pMDF.Release();
- POSITION pos = pUnks.GetHeadPosition();
- while (pos && !(m_pMDF = pUnks.GetNext(pos))) {
- ;
- }
+ POSITION pos = pUnks.GetHeadPosition();
+ while (pos && !(m_pMDF = pUnks.GetNext(pos))) {
+ ;
+ }
- if (!m_pMDF) {
- return false;
- }
+ if (!m_pMDF) {
+ return false;
+ }
- m_outputformat = m_pMDF->GetSampleFormat();
- m_ac3spkcfg = m_pMDF->GetSpeakerConfig(IMpaDecFilter::ac3);
- m_ac3drc = m_pMDF->GetDynamicRangeControl(IMpaDecFilter::ac3);
- m_dtsspkcfg = m_pMDF->GetSpeakerConfig(IMpaDecFilter::dts);
- m_dtsdrc = m_pMDF->GetDynamicRangeControl(IMpaDecFilter::dts);
- m_ddmode = m_pMDF->GetDolbyDigitalMode();
+ m_outputformat = m_pMDF->GetSampleFormat();
+ m_ac3spkcfg = m_pMDF->GetSpeakerConfig(IMpaDecFilter::ac3);
+ m_ac3drc = m_pMDF->GetDynamicRangeControl(IMpaDecFilter::ac3);
+ m_dtsspkcfg = m_pMDF->GetSpeakerConfig(IMpaDecFilter::dts);
+ m_dtsdrc = m_pMDF->GetDynamicRangeControl(IMpaDecFilter::dts);
+ m_ddmode = m_pMDF->GetDolbyDigitalMode();
- return true;
+ return true;
}
void CMpaDecSettingsWnd::OnDisconnect()
{
- m_pMDF.Release();
+ m_pMDF.Release();
}
-LPCTSTR CMpaDecSettingsWnd::GetDolbyMode (DolbyDigitalMode ddmode)
+LPCTSTR CMpaDecSettingsWnd::GetDolbyMode(DolbyDigitalMode ddmode)
{
- switch (ddmode) {
- case DD_AC3 :
- return _T(" (AC3)");
- case DD_EAC3 :
- return _T(" (Dolby Digital Plus)");
- case DD_TRUEHD :
- return _T(" (Dolby True HD)");
- case DD_MLP :
- return _T(" (MLP)");
- default :
- return _T("");
- }
+ switch (ddmode) {
+ case DD_AC3 :
+ return _T(" (AC3)");
+ case DD_EAC3 :
+ return _T(" (Dolby Digital Plus)");
+ case DD_TRUEHD :
+ return _T(" (Dolby True HD)");
+ case DD_MLP :
+ return _T(" (MLP)");
+ default :
+ return _T("");
+ }
}
bool CMpaDecSettingsWnd::OnActivate()
{
- DWORD dwStyle = WS_VISIBLE|WS_CHILD|WS_TABSTOP;
+ DWORD dwStyle = WS_VISIBLE | WS_CHILD | WS_TABSTOP;
- CRect r;
+ CRect r;
- CPoint p(10, 10);
+ CPoint p(10, 10);
- m_outputformat_static.Create(ResStr(IDS_MPADECSETTINGSWND_0), dwStyle, CRect(p, CSize(120, m_fontheight)), this);
+ m_outputformat_static.Create(ResStr(IDS_MPADECSETTINGSWND_0), dwStyle, CRect(p, CSize(120, m_fontheight)), this);
- p.y += m_fontheight + 5;
+ p.y += m_fontheight + 5;
- m_outputformat_combo.Create(dwStyle|CBS_DROPDOWNLIST, CRect(p + CSize(10, 0), CSize(100, 200)), this, IDC_PP_COMBO1);
- m_outputformat_combo.SetItemData(m_outputformat_combo.AddString(_T("PCM 16 Bit")), SF_PCM16);
- m_outputformat_combo.SetItemData(m_outputformat_combo.AddString(_T("PCM 24 Bit")), SF_PCM24);
- m_outputformat_combo.SetItemData(m_outputformat_combo.AddString(_T("PCM 32 Bit")), SF_PCM32);
- m_outputformat_combo.SetItemData(m_outputformat_combo.AddString(_T("IEEE Float")), SF_FLOAT32);
- m_outputformat_combo.SetCurSel(0);
+ m_outputformat_combo.Create(dwStyle | CBS_DROPDOWNLIST, CRect(p + CSize(10, 0), CSize(100, 200)), this, IDC_PP_COMBO1);
+ m_outputformat_combo.SetItemData(m_outputformat_combo.AddString(_T("PCM 16 Bit")), SF_PCM16);
+ m_outputformat_combo.SetItemData(m_outputformat_combo.AddString(_T("PCM 24 Bit")), SF_PCM24);
+ m_outputformat_combo.SetItemData(m_outputformat_combo.AddString(_T("PCM 32 Bit")), SF_PCM32);
+ m_outputformat_combo.SetItemData(m_outputformat_combo.AddString(_T("IEEE Float")), SF_FLOAT32);
+ m_outputformat_combo.SetCurSel(0);
- for (int i = 0; i < m_outputformat_combo.GetCount(); i++)
- if ((int)m_outputformat_combo.GetItemData(i) == m_outputformat) {
- m_outputformat_combo.SetCurSel(i);
- }
+ for (int i = 0; i < m_outputformat_combo.GetCount(); i++)
+ if ((int)m_outputformat_combo.GetItemData(i) == m_outputformat) {
+ m_outputformat_combo.SetCurSel(i);
+ }
- p.y += 30;
+ p.y += 30;
- CString strSpeak;
- strSpeak.Format (_T("%s%s"), ResStr(IDS_MPADECSETTINGSWND_1), GetDolbyMode(m_ddmode));
- m_ac3spkcfg_static.Create(ResStr(IDS_MPADECSETTINGSWND_1) + GetDolbyMode(m_ddmode), dwStyle, CRect(p, CSize(220, m_fontheight)), this);
+ CString strSpeak;
+ strSpeak.Format(_T("%s%s"), ResStr(IDS_MPADECSETTINGSWND_1), GetDolbyMode(m_ddmode));
+ m_ac3spkcfg_static.Create(ResStr(IDS_MPADECSETTINGSWND_1) + GetDolbyMode(m_ddmode), dwStyle, CRect(p, CSize(220, m_fontheight)), this);
- p.y += m_fontheight + 5;
+ p.y += m_fontheight + 5;
- m_ac3spkcfg_combo.Create(dwStyle|CBS_DROPDOWNLIST, CRect(p + CSize(150, 0), CSize(100, 200)), this, IDC_PP_COMBO2);
- m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(_T("Mono")), A52_MONO);
- m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(_T("Dual Mono")), A52_CHANNEL);
- m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(_T("Stereo")), A52_STEREO);
- m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(_T("Dolby Stereo")), A52_DOLBY);
- m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_3F)), A52_3F);
- m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_2F_1R)), A52_2F1R);
- m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_3F_1R)), A52_3F1R);
- m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_2F_2R)), A52_2F2R);
- m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_3F_2R)), A52_3F2R);
- m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_CHANNEL_1)), A52_CHANNEL1);
- m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_CHANNEL_2)), A52_CHANNEL2);
+ m_ac3spkcfg_combo.Create(dwStyle | CBS_DROPDOWNLIST, CRect(p + CSize(150, 0), CSize(100, 200)), this, IDC_PP_COMBO2);
+ m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(_T("Mono")), A52_MONO);
+ m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(_T("Dual Mono")), A52_CHANNEL);
+ m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(_T("Stereo")), A52_STEREO);
+ m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(_T("Dolby Stereo")), A52_DOLBY);
+ m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_3F)), A52_3F);
+ m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_2F_1R)), A52_2F1R);
+ m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_3F_1R)), A52_3F1R);
+ m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_2F_2R)), A52_2F2R);
+ m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_3F_2R)), A52_3F2R);
+ m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_CHANNEL_1)), A52_CHANNEL1);
+ m_ac3spkcfg_combo.SetItemData(m_ac3spkcfg_combo.AddString(ResStr(IDS_MPA_CHANNEL_2)), A52_CHANNEL2);
- for (int i = 0, sel = abs(m_ac3spkcfg) & A52_CHANNEL_MASK; i < m_ac3spkcfg_combo.GetCount(); i++)
- if ((int)m_ac3spkcfg_combo.GetItemData(i) == sel) {
- m_ac3spkcfg_combo.SetCurSel(i);
- }
+ for (int i = 0, sel = abs(m_ac3spkcfg) & A52_CHANNEL_MASK; i < m_ac3spkcfg_combo.GetCount(); i++)
+ if ((int)m_ac3spkcfg_combo.GetItemData(i) == sel) {
+ m_ac3spkcfg_combo.SetCurSel(i);
+ }
- m_ac3spkcfg_combo.GetWindowRect(r);
- ScreenToClient(r);
+ m_ac3spkcfg_combo.GetWindowRect(r);
+ ScreenToClient(r);
- m_ac3lfe_check.Create(_T("LFE"), dwStyle|BS_AUTOCHECKBOX, CRect(CPoint(r.left, r.bottom + 3), CSize(50, m_fontheight)), this, IDC_PP_CHECK4);
- m_ac3lfe_check.SetCheck(!!(abs(m_ac3spkcfg) & A52_LFE));
+ m_ac3lfe_check.Create(_T("LFE"), dwStyle | BS_AUTOCHECKBOX, CRect(CPoint(r.left, r.bottom + 3), CSize(50, m_fontheight)), this, IDC_PP_CHECK4);
+ m_ac3lfe_check.SetCheck(!!(abs(m_ac3spkcfg) & A52_LFE));
- for (int i = 0, h = max(20, m_fontheight)+1; i < _countof(m_ac3spkcfg_radio); i++, p.y += h) {
- static const TCHAR* labels[] = {m_strDecodeToSpeaker, _T("SPDIF")};
- m_ac3spkcfg_radio[i].Create(labels[i], dwStyle|BS_AUTORADIOBUTTON|(i == 0 ? WS_GROUP : 0), CRect(p + CPoint(10, 0), CSize(140, h)), this, IDC_PP_RADIO1+i);
- }
+ for (int i = 0, h = max(20, m_fontheight) + 1; i < _countof(m_ac3spkcfg_radio); i++, p.y += h) {
+ static const TCHAR* labels[] = {m_strDecodeToSpeaker, _T("SPDIF")};
+ m_ac3spkcfg_radio[i].Create(labels[i], dwStyle | BS_AUTORADIOBUTTON | (i == 0 ? WS_GROUP : 0), CRect(p + CPoint(10, 0), CSize(140, h)), this, IDC_PP_RADIO1 + i);
+ }
- CheckRadioButton(IDC_PP_RADIO1, IDC_PP_RADIO2, m_ac3spkcfg >= 0 ? IDC_PP_RADIO1 : IDC_PP_RADIO2);
+ CheckRadioButton(IDC_PP_RADIO1, IDC_PP_RADIO2, m_ac3spkcfg >= 0 ? IDC_PP_RADIO1 : IDC_PP_RADIO2);
- p.y += 5;
+ p.y += 5;
- m_ac3spkcfg_check.Create(ResStr(IDS_MPA_DYNRANGE), dwStyle|BS_AUTOCHECKBOX, CRect(p + CPoint(10, 0), CSize(205, m_fontheight)), this, IDC_PP_CHECK1);
- m_ac3spkcfg_check.SetCheck(m_ac3drc);
+ m_ac3spkcfg_check.Create(ResStr(IDS_MPA_DYNRANGE), dwStyle | BS_AUTOCHECKBOX, CRect(p + CPoint(10, 0), CSize(205, m_fontheight)), this, IDC_PP_CHECK1);
+ m_ac3spkcfg_check.SetCheck(m_ac3drc);
- p.y += m_fontheight + 10;
+ p.y += m_fontheight + 10;
- m_dtsspkcfg_static.Create(ResStr(IDS_MPADECSETTINGSWND_7), dwStyle, CRect(p, CSize(120, m_fontheight)), this);
+ m_dtsspkcfg_static.Create(ResStr(IDS_MPADECSETTINGSWND_7), dwStyle, CRect(p, CSize(120, m_fontheight)), this);
- p.y += m_fontheight + 5;
+ p.y += m_fontheight + 5;
- m_dtsspkcfg_combo.Create(dwStyle|CBS_DROPDOWNLIST, CRect(p + CSize(150, 0), CSize(100, 200)), this, IDC_PP_COMBO3);
- m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(_T("Mono")), DTS_MONO);
- m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(_T("Dual Mono")), DTS_CHANNEL);
- m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(_T("Stereo")), DTS_STEREO);
- //m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(_T("Stereo ..")), DTS_STEREO_SUMDIFF);
- //m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(_T("Stereo ..")), DTS_STEREO_TOTAL);
- m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(ResStr(IDS_MPA_3F)), DTS_3F);
- m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(ResStr(IDS_MPA_2F_1R)), DTS_2F1R);
- m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(ResStr(IDS_MPA_3F_1R)), DTS_3F1R);
- m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(ResStr(IDS_MPA_2F_2R)), DTS_2F2R);
- m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(ResStr(IDS_MPA_3F_2R)), DTS_3F2R);
+ m_dtsspkcfg_combo.Create(dwStyle | CBS_DROPDOWNLIST, CRect(p + CSize(150, 0), CSize(100, 200)), this, IDC_PP_COMBO3);
+ m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(_T("Mono")), DTS_MONO);
+ m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(_T("Dual Mono")), DTS_CHANNEL);
+ m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(_T("Stereo")), DTS_STEREO);
+ //m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(_T("Stereo ..")), DTS_STEREO_SUMDIFF);
+ //m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(_T("Stereo ..")), DTS_STEREO_TOTAL);
+ m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(ResStr(IDS_MPA_3F)), DTS_3F);
+ m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(ResStr(IDS_MPA_2F_1R)), DTS_2F1R);
+ m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(ResStr(IDS_MPA_3F_1R)), DTS_3F1R);
+ m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(ResStr(IDS_MPA_2F_2R)), DTS_2F2R);
+ m_dtsspkcfg_combo.SetItemData(m_dtsspkcfg_combo.AddString(ResStr(IDS_MPA_3F_2R)), DTS_3F2R);
- for (int i = 0, sel = abs(m_dtsspkcfg) & DTS_CHANNEL_MASK; i < m_dtsspkcfg_combo.GetCount(); i++)
- if ((int)m_dtsspkcfg_combo.GetItemData(i) == sel) {
- m_dtsspkcfg_combo.SetCurSel(i);
- }
+ for (int i = 0, sel = abs(m_dtsspkcfg) & DTS_CHANNEL_MASK; i < m_dtsspkcfg_combo.GetCount(); i++)
+ if ((int)m_dtsspkcfg_combo.GetItemData(i) == sel) {
+ m_dtsspkcfg_combo.SetCurSel(i);
+ }
- m_dtsspkcfg_combo.GetWindowRect(r);
- ScreenToClient(r);
+ m_dtsspkcfg_combo.GetWindowRect(r);
+ ScreenToClient(r);
- m_dtslfe_check.Create(_T("LFE"), dwStyle|BS_AUTOCHECKBOX, CRect(CPoint(r.left, r.bottom + 3), CSize(50, m_fontheight)), this, IDC_PP_CHECK5);
- m_dtslfe_check.SetCheck(!!(abs(m_dtsspkcfg) & DTS_LFE));
+ m_dtslfe_check.Create(_T("LFE"), dwStyle | BS_AUTOCHECKBOX, CRect(CPoint(r.left, r.bottom + 3), CSize(50, m_fontheight)), this, IDC_PP_CHECK5);
+ m_dtslfe_check.SetCheck(!!(abs(m_dtsspkcfg) & DTS_LFE));
- for (int i = 0, h = max(20, m_fontheight)+1; i < _countof(m_dtsspkcfg_radio); i++, p.y += h) {
- static const TCHAR* labels[] = {m_strDecodeToSpeaker, _T("SPDIF")};
- m_dtsspkcfg_radio[i].Create(labels[i], dwStyle|BS_AUTORADIOBUTTON|(i == 0 ? WS_GROUP : 0), CRect(p + CPoint(10, 0), CSize(140, h)), this, IDC_PP_RADIO3+i);
- }
+ for (int i = 0, h = max(20, m_fontheight) + 1; i < _countof(m_dtsspkcfg_radio); i++, p.y += h) {
+ static const TCHAR* labels[] = {m_strDecodeToSpeaker, _T("SPDIF")};
+ m_dtsspkcfg_radio[i].Create(labels[i], dwStyle | BS_AUTORADIOBUTTON | (i == 0 ? WS_GROUP : 0), CRect(p + CPoint(10, 0), CSize(140, h)), this, IDC_PP_RADIO3 + i);
+ }
- CheckRadioButton(IDC_PP_RADIO3, IDC_PP_RADIO4, m_dtsspkcfg >= 0 ? IDC_PP_RADIO3 : IDC_PP_RADIO4);
+ CheckRadioButton(IDC_PP_RADIO3, IDC_PP_RADIO4, m_dtsspkcfg >= 0 ? IDC_PP_RADIO3 : IDC_PP_RADIO4);
- p.y += 5;
+ p.y += 5;
- m_dtsspkcfg_check.Create(ResStr(IDS_MPA_DYNRANGE), dwStyle|WS_DISABLED|BS_AUTOCHECKBOX, CRect(p + CPoint(10, 0), CSize(205, m_fontheight)), this, IDC_PP_CHECK2);
- m_dtsspkcfg_check.SetCheck(m_dtsdrc);
+ m_dtsspkcfg_check.Create(ResStr(IDS_MPA_DYNRANGE), dwStyle | WS_DISABLED | BS_AUTOCHECKBOX, CRect(p + CPoint(10, 0), CSize(205, m_fontheight)), this, IDC_PP_CHECK2);
+ m_dtsspkcfg_check.SetCheck(m_dtsdrc);
- for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
- pWnd->SetFont(&m_font, FALSE);
- }
+ for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
+ pWnd->SetFont(&m_font, FALSE);
+ }
- return true;
+ return true;
}
void CMpaDecSettingsWnd::OnDeactivate()
{
- m_outputformat = (int)m_outputformat_combo.GetItemData(m_outputformat_combo.GetCurSel());
- m_ac3spkcfg = (int)m_ac3spkcfg_combo.GetItemData(m_ac3spkcfg_combo.GetCurSel());
- if (!!m_ac3lfe_check.GetCheck()) {
- m_ac3spkcfg |= A52_LFE;
- }
- if (IsDlgButtonChecked(IDC_PP_RADIO2)) {
- m_ac3spkcfg = -m_ac3spkcfg;
- }
- m_ac3drc = !!m_ac3spkcfg_check.GetCheck();
- m_dtsspkcfg = (int)m_dtsspkcfg_combo.GetItemData(m_dtsspkcfg_combo.GetCurSel());
- if (!!m_dtslfe_check.GetCheck()) {
- m_dtsspkcfg |= DTS_LFE;
- }
- if (IsDlgButtonChecked(IDC_PP_RADIO4)) {
- m_dtsspkcfg = -m_dtsspkcfg;
- }
- m_dtsdrc = !!m_dtsspkcfg_check.GetCheck();
+ m_outputformat = (int)m_outputformat_combo.GetItemData(m_outputformat_combo.GetCurSel());
+ m_ac3spkcfg = (int)m_ac3spkcfg_combo.GetItemData(m_ac3spkcfg_combo.GetCurSel());
+ if (!!m_ac3lfe_check.GetCheck()) {
+ m_ac3spkcfg |= A52_LFE;
+ }
+ if (IsDlgButtonChecked(IDC_PP_RADIO2)) {
+ m_ac3spkcfg = -m_ac3spkcfg;
+ }
+ m_ac3drc = !!m_ac3spkcfg_check.GetCheck();
+ m_dtsspkcfg = (int)m_dtsspkcfg_combo.GetItemData(m_dtsspkcfg_combo.GetCurSel());
+ if (!!m_dtslfe_check.GetCheck()) {
+ m_dtsspkcfg |= DTS_LFE;
+ }
+ if (IsDlgButtonChecked(IDC_PP_RADIO4)) {
+ m_dtsspkcfg = -m_dtsspkcfg;
+ }
+ m_dtsdrc = !!m_dtsspkcfg_check.GetCheck();
}
bool CMpaDecSettingsWnd::OnApply()
{
- OnDeactivate();
+ OnDeactivate();
- if (m_pMDF) {
- m_pMDF->SetSampleFormat((MPCSampleFormat)m_outputformat);
- m_pMDF->SetSpeakerConfig(IMpaDecFilter::ac3, m_ac3spkcfg);
- m_pMDF->SetDynamicRangeControl(IMpaDecFilter::ac3, m_ac3drc);
- m_pMDF->SetSpeakerConfig(IMpaDecFilter::dts, m_dtsspkcfg);
- m_pMDF->SetDynamicRangeControl(IMpaDecFilter::dts, m_dtsdrc);
+ if (m_pMDF) {
+ m_pMDF->SetSampleFormat((MPCSampleFormat)m_outputformat);
+ m_pMDF->SetSpeakerConfig(IMpaDecFilter::ac3, m_ac3spkcfg);
+ m_pMDF->SetDynamicRangeControl(IMpaDecFilter::ac3, m_ac3drc);
+ m_pMDF->SetSpeakerConfig(IMpaDecFilter::dts, m_dtsspkcfg);
+ m_pMDF->SetDynamicRangeControl(IMpaDecFilter::dts, m_dtsdrc);
- m_pMDF->SaveSettings();
- }
+ m_pMDF->SaveSettings();
+ }
- return true;
+ return true;
}
BEGIN_MESSAGE_MAP(CMpaDecSettingsWnd, CInternalPropertyPageWnd)
diff --git a/src/filters/transform/MpaDecFilter/MpaDecSettingsWnd.h b/src/filters/transform/MpaDecFilter/MpaDecSettingsWnd.h
index 95263852b..87443f49c 100644
--- a/src/filters/transform/MpaDecFilter/MpaDecSettingsWnd.h
+++ b/src/filters/transform/MpaDecFilter/MpaDecSettingsWnd.h
@@ -28,60 +28,60 @@
#include <afxcmn.h>
class __declspec(uuid("24103041-884B-4772-B0D3-A600E7CBFEC7"))
- CMpaDecSettingsWnd : public CInternalPropertyPageWnd
+ CMpaDecSettingsWnd : public CInternalPropertyPageWnd
{
- CComQIPtr<IMpaDecFilter> m_pMDF;
+ CComQIPtr<IMpaDecFilter> m_pMDF;
- int m_outputformat;
- int m_ac3spkcfg;
- bool m_ac3drc;
- int m_dtsspkcfg;
- bool m_dtsdrc;
- DolbyDigitalMode m_ddmode;
+ int m_outputformat;
+ int m_ac3spkcfg;
+ bool m_ac3drc;
+ int m_dtsspkcfg;
+ bool m_dtsdrc;
+ DolbyDigitalMode m_ddmode;
- enum {
- IDC_PP_RADIO1 = 10000,
- IDC_PP_RADIO2,
- IDC_PP_RADIO3,
- IDC_PP_RADIO4,
- IDC_PP_COMBO1,
- IDC_PP_COMBO2,
- IDC_PP_COMBO3,
- IDC_PP_CHECK1,
- IDC_PP_CHECK2,
- IDC_PP_CHECK4,
- IDC_PP_CHECK5
- };
+ enum {
+ IDC_PP_RADIO1 = 10000,
+ IDC_PP_RADIO2,
+ IDC_PP_RADIO3,
+ IDC_PP_RADIO4,
+ IDC_PP_COMBO1,
+ IDC_PP_COMBO2,
+ IDC_PP_COMBO3,
+ IDC_PP_CHECK1,
+ IDC_PP_CHECK2,
+ IDC_PP_CHECK4,
+ IDC_PP_CHECK5
+ };
- CStatic m_outputformat_static;
- CComboBox m_outputformat_combo;
- CStatic m_ac3spkcfg_static;
- CButton m_ac3spkcfg_radio[2];
- CComboBox m_ac3spkcfg_combo;
- CButton m_ac3spkcfg_check;
- CButton m_ac3lfe_check;
- CStatic m_dtsspkcfg_static;
- CButton m_dtsspkcfg_radio[2];
- CComboBox m_dtsspkcfg_combo;
- CButton m_dtsspkcfg_check;
- CButton m_dtslfe_check;
+ CStatic m_outputformat_static;
+ CComboBox m_outputformat_combo;
+ CStatic m_ac3spkcfg_static;
+ CButton m_ac3spkcfg_radio[2];
+ CComboBox m_ac3spkcfg_combo;
+ CButton m_ac3spkcfg_check;
+ CButton m_ac3lfe_check;
+ CStatic m_dtsspkcfg_static;
+ CButton m_dtsspkcfg_radio[2];
+ CComboBox m_dtsspkcfg_combo;
+ CButton m_dtsspkcfg_check;
+ CButton m_dtslfe_check;
public:
- CMpaDecSettingsWnd();
+ CMpaDecSettingsWnd();
- bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
- void OnDisconnect();
- bool OnActivate();
- void OnDeactivate();
- bool OnApply();
- LPCTSTR GetDolbyMode (DolbyDigitalMode ddmode);
+ bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
+ void OnDisconnect();
+ bool OnActivate();
+ void OnDeactivate();
+ bool OnApply();
+ LPCTSTR GetDolbyMode(DolbyDigitalMode ddmode);
- static LPCTSTR GetWindowTitle() {
- return _T("Settings");
- }
- static CSize GetWindowSize() {
- return CSize(320, 305);
- }
+ static LPCTSTR GetWindowTitle() {
+ return _T("Settings");
+ }
+ static CSize GetWindowSize() {
+ return CSize(320, 305);
+ }
- DECLARE_MESSAGE_MAP()
+ DECLARE_MESSAGE_MAP()
}; \ No newline at end of file
diff --git a/src/filters/transform/Mpeg2DecFilter/IMpeg2DecFilter.h b/src/filters/transform/Mpeg2DecFilter/IMpeg2DecFilter.h
index 00a1d4fcc..a7d23fc65 100644
--- a/src/filters/transform/Mpeg2DecFilter/IMpeg2DecFilter.h
+++ b/src/filters/transform/Mpeg2DecFilter/IMpeg2DecFilter.h
@@ -28,33 +28,33 @@ typedef enum {DIAuto, DIWeave, DIBlend, DIBob, DIFieldShift, DIELA} ditype;
interface __declspec(uuid("0ABEAA65-0317-47B9-AE1D-D9EA905AFD25"))
IMpeg2DecFilter :
public IUnknown {
- STDMETHOD(SetDeinterlaceMethod(ditype di)) = 0;
- STDMETHOD_(ditype, GetDeinterlaceMethod()) = 0;
- // Brightness: -255.0 to 255.0, default 0.0
- // Contrast: 0.0 to 10.0, default 1.0
- // Hue: -180.0 to +180.0, default 0.0
- // Saturation: 0.0 to 10.0, default 1.0
-
- STDMETHOD(SetBrightness(float brightness)) = 0;
- STDMETHOD(SetContrast(float contrast)) = 0;
- STDMETHOD(SetHue(float hue)) = 0;
- STDMETHOD(SetSaturation(float saturation)) = 0;
- STDMETHOD_(float, GetBrightness()) = 0;
- STDMETHOD_(float, GetContrast()) = 0;
- STDMETHOD_(float, GetHue()) = 0;
- STDMETHOD_(float, GetSaturation()) = 0;
-
- STDMETHOD(EnableForcedSubtitles(bool fEnable)) = 0;
- STDMETHOD_(bool, IsForcedSubtitlesEnabled()) = 0;
-
- STDMETHOD(EnablePlanarYUV(bool fEnable)) = 0;
- STDMETHOD_(bool, IsPlanarYUVEnabled()) = 0;
-
- STDMETHOD(EnableInterlaced(bool fEnable)) = 0;
- STDMETHOD_(bool, IsInterlacedEnabled()) = 0;
-
- STDMETHOD(EnableReadARFromStream(bool fEnable)) = 0;
- STDMETHOD_(bool, IsReadARFromStreamEnabled()) = 0;
-
- STDMETHOD(Apply()) = 0;
+ STDMETHOD(SetDeinterlaceMethod(ditype di)) = 0;
+ STDMETHOD_(ditype, GetDeinterlaceMethod()) = 0;
+ // Brightness: -255.0 to 255.0, default 0.0
+ // Contrast: 0.0 to 10.0, default 1.0
+ // Hue: -180.0 to +180.0, default 0.0
+ // Saturation: 0.0 to 10.0, default 1.0
+
+ STDMETHOD(SetBrightness(float brightness)) = 0;
+ STDMETHOD(SetContrast(float contrast)) = 0;
+ STDMETHOD(SetHue(float hue)) = 0;
+ STDMETHOD(SetSaturation(float saturation)) = 0;
+ STDMETHOD_(float, GetBrightness()) = 0;
+ STDMETHOD_(float, GetContrast()) = 0;
+ STDMETHOD_(float, GetHue()) = 0;
+ STDMETHOD_(float, GetSaturation()) = 0;
+
+ STDMETHOD(EnableForcedSubtitles(bool fEnable)) = 0;
+ STDMETHOD_(bool, IsForcedSubtitlesEnabled()) = 0;
+
+ STDMETHOD(EnablePlanarYUV(bool fEnable)) = 0;
+ STDMETHOD_(bool, IsPlanarYUVEnabled()) = 0;
+
+ STDMETHOD(EnableInterlaced(bool fEnable)) = 0;
+ STDMETHOD_(bool, IsInterlacedEnabled()) = 0;
+
+ STDMETHOD(EnableReadARFromStream(bool fEnable)) = 0;
+ STDMETHOD_(bool, IsReadARFromStreamEnabled()) = 0;
+
+ STDMETHOD(Apply()) = 0;
};
diff --git a/src/filters/transform/Mpeg2DecFilter/Mpeg2DecFilter.cpp b/src/filters/transform/Mpeg2DecFilter/Mpeg2DecFilter.cpp
index 243ab4856..db8c7a9a4 100644
--- a/src/filters/transform/Mpeg2DecFilter/Mpeg2DecFilter.cpp
+++ b/src/filters/transform/Mpeg2DecFilter/Mpeg2DecFilter.cpp
@@ -47,103 +47,103 @@
#ifdef REGISTER_FILTER
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_MPEG2_VIDEO},
- {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_MPEG2_VIDEO},
- {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_MPEG2_VIDEO},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_MPEG2_VIDEO},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_MPG2},
+ {&MEDIATYPE_DVD_ENCRYPTED_PACK, &MEDIASUBTYPE_MPEG2_VIDEO},
+ {&MEDIATYPE_MPEG2_PACK, &MEDIASUBTYPE_MPEG2_VIDEO},
+ {&MEDIATYPE_MPEG2_PES, &MEDIASUBTYPE_MPEG2_VIDEO},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_MPEG2_VIDEO},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_MPG2},
#ifndef MPEG2ONLY
- {&MEDIATYPE_Video, &MEDIASUBTYPE_MPEG1Packet},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_MPEG1Payload},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_MPEG1Packet},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_MPEG1Payload},
#endif
};
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Video, &MEDIASUBTYPE_IYUV},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_IYUV},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut}
};
const AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CMpeg2DecFilter), Mpeg2DecFilterName, 0x00600001, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CMpeg2DecFilter), Mpeg2DecFilterName, 0x00600001, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CMpeg2DecFilter>, NULL, &sudFilter[0]},
- {L"CMpeg2DecPropertyPage", &__uuidof(CMpeg2DecSettingsWnd), CreateInstance<CInternalPropertyPageTempl<CMpeg2DecSettingsWnd> >},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CMpeg2DecFilter>, NULL, &sudFilter[0]},
+ {L"CMpeg2DecPropertyPage", &__uuidof(CMpeg2DecSettingsWnd), CreateInstance<CInternalPropertyPageTempl<CMpeg2DecSettingsWnd> >},
};
int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
//
#include <detours/detours.h>
-BOOL (__stdcall * Real_IsDebuggerPresent)(void)
- = IsDebuggerPresent;
+BOOL (__stdcall* Real_IsDebuggerPresent)(void)
+ = IsDebuggerPresent;
-LONG (__stdcall * Real_ChangeDisplaySettingsExA)(LPCSTR a0,
- LPDEVMODEA a1,
- HWND a2,
- DWORD a3,
- LPVOID a4)
- = ChangeDisplaySettingsExA;
+LONG(__stdcall* Real_ChangeDisplaySettingsExA)(LPCSTR a0,
+ LPDEVMODEA a1,
+ HWND a2,
+ DWORD a3,
+ LPVOID a4)
+ = ChangeDisplaySettingsExA;
-LONG (__stdcall * Real_ChangeDisplaySettingsExW)(LPCWSTR a0,
- LPDEVMODEW a1,
- HWND a2,
- DWORD a3,
- LPVOID a4)
- = ChangeDisplaySettingsExW;
+LONG(__stdcall* Real_ChangeDisplaySettingsExW)(LPCWSTR a0,
+ LPDEVMODEW a1,
+ HWND a2,
+ DWORD a3,
+ LPVOID a4)
+ = ChangeDisplaySettingsExW;
BOOL WINAPI Mine_IsDebuggerPresent()
{
- TRACE(_T("Oops, somebody was trying to be naughty! (called IsDebuggerPresent)\n"));
- return FALSE;
+ TRACE(_T("Oops, somebody was trying to be naughty! (called IsDebuggerPresent)\n"));
+ return FALSE;
}
LONG WINAPI Mine_ChangeDisplaySettingsEx(LONG ret, DWORD dwFlags, LPVOID lParam)
{
- if (dwFlags&CDS_VIDEOPARAMETERS) {
- VIDEOPARAMETERS* vp = (VIDEOPARAMETERS*)lParam;
-
- if (vp->Guid == GUIDFromCString(_T("{02C62061-1097-11d1-920F-00A024DF156E}"))
- && (vp->dwFlags&VP_FLAGS_COPYPROTECT)) {
- if (vp->dwCommand == VP_COMMAND_GET) {
- if ((vp->dwTVStandard&VP_TV_STANDARD_WIN_VGA) && vp->dwTVStandard != VP_TV_STANDARD_WIN_VGA) {
- TRACE(_T("Ooops, tv-out enabled? macrovision checks suck..."));
- vp->dwTVStandard = VP_TV_STANDARD_WIN_VGA;
- }
- } else if (vp->dwCommand == VP_COMMAND_SET) {
- TRACE(_T("Ooops, as I already told ya, no need for any macrovision bs here"));
- return 0;
- }
- }
- }
-
- return ret;
+ if (dwFlags & CDS_VIDEOPARAMETERS) {
+ VIDEOPARAMETERS* vp = (VIDEOPARAMETERS*)lParam;
+
+ if (vp->Guid == GUIDFromCString(_T("{02C62061-1097-11d1-920F-00A024DF156E}"))
+ && (vp->dwFlags & VP_FLAGS_COPYPROTECT)) {
+ if (vp->dwCommand == VP_COMMAND_GET) {
+ if ((vp->dwTVStandard & VP_TV_STANDARD_WIN_VGA) && vp->dwTVStandard != VP_TV_STANDARD_WIN_VGA) {
+ TRACE(_T("Ooops, tv-out enabled? macrovision checks suck..."));
+ vp->dwTVStandard = VP_TV_STANDARD_WIN_VGA;
+ }
+ } else if (vp->dwCommand == VP_COMMAND_SET) {
+ TRACE(_T("Ooops, as I already told ya, no need for any macrovision bs here"));
+ return 0;
+ }
+ }
+ }
+
+ return ret;
}
LONG WINAPI Mine_ChangeDisplaySettingsExA(LPCSTR lpszDeviceName, LPDEVMODEA lpDevMode, HWND hwnd, DWORD dwFlags, LPVOID lParam)
{
- return Mine_ChangeDisplaySettingsEx(Real_ChangeDisplaySettingsExA(lpszDeviceName, lpDevMode, hwnd, dwFlags, lParam), dwFlags, lParam);
+ return Mine_ChangeDisplaySettingsEx(Real_ChangeDisplaySettingsExA(lpszDeviceName, lpDevMode, hwnd, dwFlags, lParam), dwFlags, lParam);
}
LONG WINAPI Mine_ChangeDisplaySettingsExW(LPCWSTR lpszDeviceName, LPDEVMODEW lpDevMode, HWND hwnd, DWORD dwFlags, LPVOID lParam)
{
- return Mine_ChangeDisplaySettingsEx(Real_ChangeDisplaySettingsExW(lpszDeviceName, lpDevMode, hwnd, dwFlags, lParam), dwFlags, lParam);
+ return Mine_ChangeDisplaySettingsEx(Real_ChangeDisplaySettingsExW(lpszDeviceName, lpDevMode, hwnd, dwFlags, lParam), dwFlags, lParam);
}
//
@@ -153,26 +153,26 @@ LONG WINAPI Mine_ChangeDisplaySettingsExW(LPCWSTR lpszDeviceName, LPDEVMODEW lpD
class CMpeg2DecFilterApp : public CFilterApp
{
public:
- BOOL InitInstance() {
- long lError;
+ BOOL InitInstance() {
+ long lError;
- if (!__super::InitInstance()) {
- return FALSE;
- }
+ if (!__super::InitInstance()) {
+ return FALSE;
+ }
- DetourRestoreAfterWith();
- DetourTransactionBegin();
- DetourUpdateThread(GetCurrentThread());
+ DetourRestoreAfterWith();
+ DetourTransactionBegin();
+ DetourUpdateThread(GetCurrentThread());
- DetourAttach(&(PVOID&)Real_IsDebuggerPresent, (PVOID)Mine_IsDebuggerPresent);
- DetourAttach(&(PVOID&)Real_ChangeDisplaySettingsExA, (PVOID)Mine_ChangeDisplaySettingsExA);
- DetourAttach(&(PVOID&)Real_ChangeDisplaySettingsExW, (PVOID)Mine_ChangeDisplaySettingsExW);
+ DetourAttach(&(PVOID&)Real_IsDebuggerPresent, (PVOID)Mine_IsDebuggerPresent);
+ DetourAttach(&(PVOID&)Real_ChangeDisplaySettingsExA, (PVOID)Mine_ChangeDisplaySettingsExA);
+ DetourAttach(&(PVOID&)Real_ChangeDisplaySettingsExW, (PVOID)Mine_ChangeDisplaySettingsExW);
- lError = DetourTransactionCommit();
- ASSERT (lError == NOERROR);
+ lError = DetourTransactionCommit();
+ ASSERT(lError == NOERROR);
- return TRUE;
- }
+ return TRUE;
+ }
};
CMpeg2DecFilterApp theApp;
@@ -184,1143 +184,1143 @@ CMpeg2DecFilterApp theApp;
//
CMpeg2DecFilter::CMpeg2DecFilter(LPUNKNOWN lpunk, HRESULT* phr)
- : CBaseVideoFilter(NAME("CMpeg2DecFilter"), lpunk, phr, __uuidof(this), 1)
- , m_fWaitForKeyFrame(true)
- , m_fInitializedBuffer(true)
-{
- delete m_pInput;
- // delete m_pOutput;
-
- if (FAILED(*phr)) {
- return;
- }
-
- m_pInput = DNew CMpeg2DecInputPin(this, phr, L"Video");
- if (!m_pInput) {
- *phr = E_OUTOFMEMORY;
- }
- if (FAILED(*phr)) {
- return;
- }
-
- // m_pOutput = DNew CMpeg2DecOutputPin(this, phr, L"Output");
- // if (!m_pOutput) *phr = E_OUTOFMEMORY;
- // if (FAILED(*phr)) return;
-
- m_pSubpicInput = DNew CSubpicInputPin(this, phr);
- if (!m_pSubpicInput) {
- *phr = E_OUTOFMEMORY;
- }
- if (FAILED(*phr)) {
- return;
- }
-
- m_pClosedCaptionOutput = DNew CClosedCaptionOutputPin(this, m_pLock, phr);
- if (!m_pClosedCaptionOutput) {
- *phr = E_OUTOFMEMORY;
- }
- if (FAILED(*phr)) {
- return;
- }
-
- SetDeinterlaceMethod(DIAuto);
- SetBrightness(0.0f);
- SetContrast(1.0f);
- SetHue(0.0f);
- SetSaturation(1.0f);
- EnableForcedSubtitles(true);
- EnablePlanarYUV(true);
- EnableInterlaced(false);
- EnableReadARFromStream(true);
+ : CBaseVideoFilter(NAME("CMpeg2DecFilter"), lpunk, phr, __uuidof(this), 1)
+ , m_fWaitForKeyFrame(true)
+ , m_fInitializedBuffer(true)
+{
+ delete m_pInput;
+ // delete m_pOutput;
+
+ if (FAILED(*phr)) {
+ return;
+ }
+
+ m_pInput = DNew CMpeg2DecInputPin(this, phr, L"Video");
+ if (!m_pInput) {
+ *phr = E_OUTOFMEMORY;
+ }
+ if (FAILED(*phr)) {
+ return;
+ }
+
+ // m_pOutput = DNew CMpeg2DecOutputPin(this, phr, L"Output");
+ // if (!m_pOutput) *phr = E_OUTOFMEMORY;
+ // if (FAILED(*phr)) return;
+
+ m_pSubpicInput = DNew CSubpicInputPin(this, phr);
+ if (!m_pSubpicInput) {
+ *phr = E_OUTOFMEMORY;
+ }
+ if (FAILED(*phr)) {
+ return;
+ }
+
+ m_pClosedCaptionOutput = DNew CClosedCaptionOutputPin(this, m_pLock, phr);
+ if (!m_pClosedCaptionOutput) {
+ *phr = E_OUTOFMEMORY;
+ }
+ if (FAILED(*phr)) {
+ return;
+ }
+
+ SetDeinterlaceMethod(DIAuto);
+ SetBrightness(0.0f);
+ SetContrast(1.0f);
+ SetHue(0.0f);
+ SetSaturation(1.0f);
+ EnableForcedSubtitles(true);
+ EnablePlanarYUV(true);
+ EnableInterlaced(false);
+ EnableReadARFromStream(true);
#ifdef REGISTER_FILTER
- CRegKey key;
- if (ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPEG Video Decoder"), KEY_READ)) {
- DWORD dw;
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("DeinterlaceMethod"), dw)) {
- SetDeinterlaceMethod((ditype)dw);
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Brightness"), dw)) {
- SetBrightness(*(float*)&dw);
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Contrast"), dw)) {
- SetContrast(*(float*)&dw);
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Hue"), dw)) {
- SetHue(*(float*)&dw);
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Saturation"), dw)) {
- SetSaturation(*(float*)&dw);
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ForcedSubtitles"), dw)) {
- EnableForcedSubtitles(!!dw);
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("PlanarYUV"), dw)) {
- EnablePlanarYUV(!!dw);
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Interlaced"), dw)) {
- EnableInterlaced(!!dw);
- }
- if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ReadARFromStream"), dw)) {
- EnableReadARFromStream(!!dw);
- }
- }
+ CRegKey key;
+ if (ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPEG Video Decoder"), KEY_READ)) {
+ DWORD dw;
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("DeinterlaceMethod"), dw)) {
+ SetDeinterlaceMethod((ditype)dw);
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Brightness"), dw)) {
+ SetBrightness(*(float*)&dw);
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Contrast"), dw)) {
+ SetContrast(*(float*)&dw);
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Hue"), dw)) {
+ SetHue(*(float*)&dw);
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Saturation"), dw)) {
+ SetSaturation(*(float*)&dw);
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ForcedSubtitles"), dw)) {
+ EnableForcedSubtitles(!!dw);
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("PlanarYUV"), dw)) {
+ EnablePlanarYUV(!!dw);
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("Interlaced"), dw)) {
+ EnableInterlaced(!!dw);
+ }
+ if (ERROR_SUCCESS == key.QueryDWORDValue(_T("ReadARFromStream"), dw)) {
+ EnableReadARFromStream(!!dw);
+ }
+ }
#else
- DWORD dw;
- dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("DeinterlaceMethod"), m_ditype);
- SetDeinterlaceMethod((ditype)dw);
- dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Brightness"), *(DWORD*)&m_bright);
- SetBrightness(*(float*)&dw);
- dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Contrast"), *(DWORD*)&m_cont);
- SetContrast(*(float*)&dw);
- dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Hue"), *(DWORD*)&m_hue);
- SetHue(*(float*)&dw);
- dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Saturation"), *(DWORD*)&m_sat);
- SetSaturation(*(float*)&dw);
- dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("ForcedSubtitles"), m_fForcedSubs);
- EnableForcedSubtitles(!!dw);
- dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("PlanarYUV"), m_fPlanarYUV);
- EnablePlanarYUV(!!dw);
- dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Interlaced"), m_fInterlaced);
- EnableInterlaced(!!dw);
- dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("ReadARFromStream"), m_bReadARFromStream);
- EnableReadARFromStream(!!dw);
+ DWORD dw;
+ dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("DeinterlaceMethod"), m_ditype);
+ SetDeinterlaceMethod((ditype)dw);
+ dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Brightness"), *(DWORD*)&m_bright);
+ SetBrightness(*(float*)&dw);
+ dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Contrast"), *(DWORD*)&m_cont);
+ SetContrast(*(float*)&dw);
+ dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Hue"), *(DWORD*)&m_hue);
+ SetHue(*(float*)&dw);
+ dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Saturation"), *(DWORD*)&m_sat);
+ SetSaturation(*(float*)&dw);
+ dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("ForcedSubtitles"), m_fForcedSubs);
+ EnableForcedSubtitles(!!dw);
+ dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("PlanarYUV"), m_fPlanarYUV);
+ EnablePlanarYUV(!!dw);
+ dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Interlaced"), m_fInterlaced);
+ EnableInterlaced(!!dw);
+ dw = AfxGetApp()->GetProfileInt(_T("Filters\\MPEG Video Decoder"), _T("ReadARFromStream"), m_bReadARFromStream);
+ EnableReadARFromStream(!!dw);
#endif
- m_rate.Rate = 10000;
- m_rate.StartTime = 0;
+ m_rate.Rate = 10000;
+ m_rate.StartTime = 0;
- m_par.SetSize(1,1);
+ m_par.SetSize(1, 1);
}
CMpeg2DecFilter::~CMpeg2DecFilter()
{
- delete m_pSubpicInput;
- delete m_pClosedCaptionOutput;
+ delete m_pSubpicInput;
+ delete m_pClosedCaptionOutput;
}
STDMETHODIMP CMpeg2DecFilter::Apply()
{
#ifdef REGISTER_FILTER
- CRegKey key;
- if (ERROR_SUCCESS == key.Create(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPEG Video Decoder"))) {
- key.SetDWORDValue(_T("DeinterlaceMethod"), m_ditype);
- key.SetDWORDValue(_T("Brightness"), *(DWORD*)&m_bright);
- key.SetDWORDValue(_T("Contrast"), *(DWORD*)&m_cont);
- key.SetDWORDValue(_T("Hue"), *(DWORD*)&m_hue);
- key.SetDWORDValue(_T("Saturation"), *(DWORD*)&m_sat);
- key.SetDWORDValue(_T("ForcedSubtitles"), m_fForcedSubs);
- key.SetDWORDValue(_T("PlanarYUV"), m_fPlanarYUV);
- key.SetDWORDValue(_T("Interlaced"), m_fInterlaced);
- key.SetDWORDValue(_T("ReadARFromStream"), m_bReadARFromStream);
- }
+ CRegKey key;
+ if (ERROR_SUCCESS == key.Create(HKEY_CURRENT_USER, _T("Software\\Gabest\\Filters\\MPEG Video Decoder"))) {
+ key.SetDWORDValue(_T("DeinterlaceMethod"), m_ditype);
+ key.SetDWORDValue(_T("Brightness"), *(DWORD*)&m_bright);
+ key.SetDWORDValue(_T("Contrast"), *(DWORD*)&m_cont);
+ key.SetDWORDValue(_T("Hue"), *(DWORD*)&m_hue);
+ key.SetDWORDValue(_T("Saturation"), *(DWORD*)&m_sat);
+ key.SetDWORDValue(_T("ForcedSubtitles"), m_fForcedSubs);
+ key.SetDWORDValue(_T("PlanarYUV"), m_fPlanarYUV);
+ key.SetDWORDValue(_T("Interlaced"), m_fInterlaced);
+ key.SetDWORDValue(_T("ReadARFromStream"), m_bReadARFromStream);
+ }
#else
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("DeinterlaceMethod"), m_ditype);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Brightness"), *(DWORD*)&m_bright);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Contrast"), *(DWORD*)&m_cont);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Hue"), *(DWORD*)&m_hue);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Saturation"), *(DWORD*)&m_sat);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("ForcedSubtitles"), m_fForcedSubs);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("PlanarYUV"), m_fPlanarYUV);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Interlaced"), m_fInterlaced);
- AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("ReadARFromStream"), m_bReadARFromStream);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("DeinterlaceMethod"), m_ditype);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Brightness"), *(DWORD*)&m_bright);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Contrast"), *(DWORD*)&m_cont);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Hue"), *(DWORD*)&m_hue);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Saturation"), *(DWORD*)&m_sat);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("ForcedSubtitles"), m_fForcedSubs);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("PlanarYUV"), m_fPlanarYUV);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("Interlaced"), m_fInterlaced);
+ AfxGetApp()->WriteProfileInt(_T("Filters\\MPEG Video Decoder"), _T("ReadARFromStream"), m_bReadARFromStream);
#endif
- return S_OK;
+ return S_OK;
}
-void CMpeg2DecFilter::GetOutputSize(int& w, int& h, int& arx, int& ary, int &RealWidth, int &RealHeight)
+void CMpeg2DecFilter::GetOutputSize(int& w, int& h, int& arx, int& ary, int& RealWidth, int& RealHeight)
{
- w = m_dec->m_info.m_sequence->picture_width;
- h = m_dec->m_info.m_sequence->picture_height;
+ w = m_dec->m_info.m_sequence->picture_width;
+ h = m_dec->m_info.m_sequence->picture_height;
}
STDMETHODIMP CMpeg2DecFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- return
- QI(IMpeg2DecFilter)
- QI(ISpecifyPropertyPages)
- QI(ISpecifyPropertyPages2)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ return
+ QI(IMpeg2DecFilter)
+ QI(ISpecifyPropertyPages)
+ QI(ISpecifyPropertyPages2)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
int CMpeg2DecFilter::GetPinCount()
{
- return 4;
+ return 4;
}
CBasePin* CMpeg2DecFilter::GetPin(int n)
{
- switch (n) {
- case 0:
- return m_pInput;
- case 1:
- return m_pOutput;
- case 2:
- return m_pSubpicInput;
- case 3:
- return m_pClosedCaptionOutput;
- }
- return NULL;
+ switch (n) {
+ case 0:
+ return m_pInput;
+ case 1:
+ return m_pOutput;
+ case 2:
+ return m_pSubpicInput;
+ case 3:
+ return m_pClosedCaptionOutput;
+ }
+ return NULL;
}
HRESULT CMpeg2DecFilter::EndOfStream()
{
- CAutoLock cAutoLock(&m_csReceive);
- m_pClosedCaptionOutput->EndOfStream();
- return __super::EndOfStream();
+ CAutoLock cAutoLock(&m_csReceive);
+ m_pClosedCaptionOutput->EndOfStream();
+ return __super::EndOfStream();
}
HRESULT CMpeg2DecFilter::BeginFlush()
{
- m_pClosedCaptionOutput->DeliverBeginFlush();
- return __super::BeginFlush();
+ m_pClosedCaptionOutput->DeliverBeginFlush();
+ return __super::BeginFlush();
}
HRESULT CMpeg2DecFilter::EndFlush()
{
- m_pClosedCaptionOutput->DeliverEndFlush();
- return __super::EndFlush();
+ m_pClosedCaptionOutput->DeliverEndFlush();
+ return __super::EndFlush();
}
HRESULT CMpeg2DecFilter::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- CAutoLock cAutoLock(&m_csReceive);
- m_pClosedCaptionOutput->DeliverNewSegment(tStart, tStop, dRate);
- m_fDropFrames = false;
- return __super::NewSegment(tStart, tStop, dRate);
+ CAutoLock cAutoLock(&m_csReceive);
+ m_pClosedCaptionOutput->DeliverNewSegment(tStart, tStop, dRate);
+ m_fDropFrames = false;
+ return __super::NewSegment(tStart, tStop, dRate);
}
void CMpeg2DecFilter::InputTypeChanged()
{
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- TRACE(_T("ResetMpeg2Decoder()\n"));
+ TRACE(_T("ResetMpeg2Decoder()\n"));
- for (int i = 0; i < _countof(m_dec->m_pictures); i++) {
- m_dec->m_pictures[i].rtStart = m_dec->m_pictures[i].rtStop = _I64_MIN+1;
- m_dec->m_pictures[i].fDelivered = false;
- m_dec->m_pictures[i].flags &= ~PIC_MASK_CODING_TYPE;
- }
+ for (int i = 0; i < _countof(m_dec->m_pictures); i++) {
+ m_dec->m_pictures[i].rtStart = m_dec->m_pictures[i].rtStop = _I64_MIN + 1;
+ m_dec->m_pictures[i].fDelivered = false;
+ m_dec->m_pictures[i].flags &= ~PIC_MASK_CODING_TYPE;
+ }
- const CMediaType& mt = m_pInput->CurrentMediaType();
+ const CMediaType& mt = m_pInput->CurrentMediaType();
- BYTE* pSequenceHeader = NULL;
- DWORD cbSequenceHeader = 0;
+ BYTE* pSequenceHeader = NULL;
+ DWORD cbSequenceHeader = 0;
- if (mt.formattype == FORMAT_MPEGVideo) {
- pSequenceHeader = ((MPEG1VIDEOINFO*)mt.Format())->bSequenceHeader;
- cbSequenceHeader = ((MPEG1VIDEOINFO*)mt.Format())->cbSequenceHeader;
- } else if (mt.formattype == FORMAT_MPEG2_VIDEO) {
- pSequenceHeader = (BYTE*)((MPEG2VIDEOINFO*)mt.Format())->dwSequenceHeader;
- cbSequenceHeader = ((MPEG2VIDEOINFO*)mt.Format())->cbSequenceHeader;
- }
+ if (mt.formattype == FORMAT_MPEGVideo) {
+ pSequenceHeader = ((MPEG1VIDEOINFO*)mt.Format())->bSequenceHeader;
+ cbSequenceHeader = ((MPEG1VIDEOINFO*)mt.Format())->cbSequenceHeader;
+ } else if (mt.formattype == FORMAT_MPEG2_VIDEO) {
+ pSequenceHeader = (BYTE*)((MPEG2VIDEOINFO*)mt.Format())->dwSequenceHeader;
+ cbSequenceHeader = ((MPEG2VIDEOINFO*)mt.Format())->cbSequenceHeader;
+ }
- m_dec->mpeg2_close();
- m_dec->mpeg2_init();
+ m_dec->mpeg2_close();
+ m_dec->mpeg2_init();
- m_dec->mpeg2_buffer(pSequenceHeader, pSequenceHeader + cbSequenceHeader);
+ m_dec->mpeg2_buffer(pSequenceHeader, pSequenceHeader + cbSequenceHeader);
- m_fWaitForKeyFrame = true;
+ m_fWaitForKeyFrame = true;
- m_fFilm = false;
- m_fb.flags = 0;
+ m_fFilm = false;
+ m_fb.flags = 0;
}
void CMpeg2DecFilter::SetDeinterlaceMethod()
{
- ASSERT(m_dec->m_info.m_sequence);
- ASSERT(m_dec->m_info.m_display_picture);
-
- DWORD seqflags = m_dec->m_info.m_sequence->flags;
- DWORD oldflags = m_fb.flags;
- DWORD newflags = m_dec->m_info.m_display_picture->flags;
-
- if (!(seqflags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)
- && !(oldflags & PIC_FLAG_REPEAT_FIRST_FIELD)
- && (newflags & PIC_FLAG_PROGRESSIVE_FRAME)) {
- if (!m_fFilm && (newflags & PIC_FLAG_REPEAT_FIRST_FIELD)) {
- TRACE(_T("m_fFilm = true\n"));
- m_fFilm = true;
- } else if (m_fFilm && !(newflags & PIC_FLAG_REPEAT_FIRST_FIELD)) {
- TRACE(_T("m_fFilm = false\n"));
- m_fFilm = false;
- }
- }
-
- const CMediaType& mt = m_pOutput->CurrentMediaType();
-
- if (mt.formattype == FORMAT_VideoInfo2 && (((VIDEOINFOHEADER2*)mt.pbFormat)->dwInterlaceFlags & AMINTERLACE_IsInterlaced)) {
- m_fb.di = DIWeave;
- } else {
- m_fb.di = GetDeinterlaceMethod();
-
- if (m_fb.di == DIAuto || m_fb.di != DIWeave && m_fb.di != DIBlend && m_fb.di != DIBob && m_fb.di != DIFieldShift && m_fb.di != DIELA) {
- if (seqflags & SEQ_FLAG_PROGRESSIVE_SEQUENCE) {
- m_fb.di = DIWeave; // hurray!
- } else if (m_fFilm) {
- m_fb.di = DIWeave; // we are lucky
- } else if (!(m_fb.flags & PIC_FLAG_PROGRESSIVE_FRAME)) {
- m_fb.di = DIBlend; // ok, clear thing
- } else
- // big trouble here, the progressive_frame bit is not reliable :'(
- // frames without temporal field diffs can be only detected when ntsc
- // uses the repeat field flag (signaled with m_fFilm), if it's not set
- // or we have pal then we might end up blending the fields unnecessarily...
- {
- m_fb.di = DIBlend;
- }
- }
- }
-
- m_fb.flags = newflags;
+ ASSERT(m_dec->m_info.m_sequence);
+ ASSERT(m_dec->m_info.m_display_picture);
+
+ DWORD seqflags = m_dec->m_info.m_sequence->flags;
+ DWORD oldflags = m_fb.flags;
+ DWORD newflags = m_dec->m_info.m_display_picture->flags;
+
+ if (!(seqflags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)
+ && !(oldflags & PIC_FLAG_REPEAT_FIRST_FIELD)
+ && (newflags & PIC_FLAG_PROGRESSIVE_FRAME)) {
+ if (!m_fFilm && (newflags & PIC_FLAG_REPEAT_FIRST_FIELD)) {
+ TRACE(_T("m_fFilm = true\n"));
+ m_fFilm = true;
+ } else if (m_fFilm && !(newflags & PIC_FLAG_REPEAT_FIRST_FIELD)) {
+ TRACE(_T("m_fFilm = false\n"));
+ m_fFilm = false;
+ }
+ }
+
+ const CMediaType& mt = m_pOutput->CurrentMediaType();
+
+ if (mt.formattype == FORMAT_VideoInfo2 && (((VIDEOINFOHEADER2*)mt.pbFormat)->dwInterlaceFlags & AMINTERLACE_IsInterlaced)) {
+ m_fb.di = DIWeave;
+ } else {
+ m_fb.di = GetDeinterlaceMethod();
+
+ if (m_fb.di == DIAuto || m_fb.di != DIWeave && m_fb.di != DIBlend && m_fb.di != DIBob && m_fb.di != DIFieldShift && m_fb.di != DIELA) {
+ if (seqflags & SEQ_FLAG_PROGRESSIVE_SEQUENCE) {
+ m_fb.di = DIWeave; // hurray!
+ } else if (m_fFilm) {
+ m_fb.di = DIWeave; // we are lucky
+ } else if (!(m_fb.flags & PIC_FLAG_PROGRESSIVE_FRAME)) {
+ m_fb.di = DIBlend; // ok, clear thing
+ } else
+ // big trouble here, the progressive_frame bit is not reliable :'(
+ // frames without temporal field diffs can be only detected when ntsc
+ // uses the repeat field flag (signaled with m_fFilm), if it's not set
+ // or we have pal then we might end up blending the fields unnecessarily...
+ {
+ m_fb.di = DIBlend;
+ }
+ }
+ }
+
+ m_fb.flags = newflags;
}
void CMpeg2DecFilter::SetTypeSpecificFlags(IMediaSample* pMS)
{
- if (CComQIPtr<IMediaSample2> pMS2 = pMS) {
- AM_SAMPLE2_PROPERTIES props;
- if (SUCCEEDED(pMS2->GetProperties(sizeof(props), (BYTE*)&props))) {
- props.dwTypeSpecificFlags &= ~0x7f;
-
- const CMediaType& mt = m_pOutput->CurrentMediaType();
- if (mt.formattype == FORMAT_VideoInfo2 && (((VIDEOINFOHEADER2*)mt.pbFormat)->dwInterlaceFlags & AMINTERLACE_IsInterlaced)) {
- // props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_WEAVE;
-
- if (m_dec->m_info.m_sequence->flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE) {
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_WEAVE;
- }
-
- if (m_fb.flags & PIC_FLAG_TOP_FIELD_FIRST) {
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_FIELD1FIRST;
- }
- if (m_fb.flags & PIC_FLAG_REPEAT_FIRST_FIELD) {
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_REPEAT_FIELD;
- }
-
- if ((m_fb.flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_I) {
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_I_SAMPLE;
- }
- if ((m_fb.flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_P) {
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_P_SAMPLE;
- }
- if ((m_fb.flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_B) {
- props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_B_SAMPLE;
- }
- }
-
- pMS2->SetProperties(sizeof(props), (BYTE*)&props);
- }
- }
+ if (CComQIPtr<IMediaSample2> pMS2 = pMS) {
+ AM_SAMPLE2_PROPERTIES props;
+ if (SUCCEEDED(pMS2->GetProperties(sizeof(props), (BYTE*)&props))) {
+ props.dwTypeSpecificFlags &= ~0x7f;
+
+ const CMediaType& mt = m_pOutput->CurrentMediaType();
+ if (mt.formattype == FORMAT_VideoInfo2 && (((VIDEOINFOHEADER2*)mt.pbFormat)->dwInterlaceFlags & AMINTERLACE_IsInterlaced)) {
+ // props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_WEAVE;
+
+ if (m_dec->m_info.m_sequence->flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE) {
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_WEAVE;
+ }
+
+ if (m_fb.flags & PIC_FLAG_TOP_FIELD_FIRST) {
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_FIELD1FIRST;
+ }
+ if (m_fb.flags & PIC_FLAG_REPEAT_FIRST_FIELD) {
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_REPEAT_FIELD;
+ }
+
+ if ((m_fb.flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_I) {
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_I_SAMPLE;
+ }
+ if ((m_fb.flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_P) {
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_P_SAMPLE;
+ }
+ if ((m_fb.flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_B) {
+ props.dwTypeSpecificFlags |= AM_VIDEO_FLAG_B_SAMPLE;
+ }
+ }
+
+ pMS2->SetProperties(sizeof(props), (BYTE*)&props);
+ }
+ }
}
HRESULT CMpeg2DecFilter::Transform(IMediaSample* pIn)
{
- HRESULT hr;
+ HRESULT hr;
- BYTE* pDataIn = NULL;
- if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
- return hr;
- }
+ BYTE* pDataIn = NULL;
+ if (FAILED(hr = pIn->GetPointer(&pDataIn))) {
+ return hr;
+ }
- long len = pIn->GetActualDataLength();
+ long len = pIn->GetActualDataLength();
- (static_cast<CDeCSSInputPin*>(m_pInput))->StripPacket(pDataIn, len);
+ (static_cast<CDeCSSInputPin*>(m_pInput))->StripPacket(pDataIn, len);
- if (pIn->IsDiscontinuity() == S_OK) {
- InputTypeChanged();
- }
+ if (pIn->IsDiscontinuity() == S_OK) {
+ InputTypeChanged();
+ }
- REFERENCE_TIME rtStart = _I64_MIN, rtStop = _I64_MIN;
- hr = pIn->GetTime(&rtStart, &rtStop);
- if (FAILED(hr)) {
- rtStart = rtStop = _I64_MIN;
- }
+ REFERENCE_TIME rtStart = _I64_MIN, rtStop = _I64_MIN;
+ hr = pIn->GetTime(&rtStart, &rtStop);
+ if (FAILED(hr)) {
+ rtStart = rtStop = _I64_MIN;
+ }
- while (len >= 0) {
- mpeg2_state_t state = m_dec->mpeg2_parse();
+ while (len >= 0) {
+ mpeg2_state_t state = m_dec->mpeg2_parse();
#ifndef _WIN64
- __asm emms; // this one is missing somewhere in the precompiled mmx obj files
+ __asm emms; // this one is missing somewhere in the precompiled mmx obj files
#endif
- switch (state) {
- case STATE_BUFFER:
- if (len > 0) {
- m_dec->mpeg2_buffer(pDataIn, pDataIn + len);
- len = 0;
- } else {
- len = -1;
- }
- break;
- case STATE_INVALID:
- TRACE(_T("*** STATE_INVALID\n"));
- break;
- case STATE_GOP:
- m_pClosedCaptionOutput->Deliver(m_dec->m_info.m_user_data, m_dec->m_info.m_user_data_len);
- break;
- case STATE_SEQUENCE:
- m_AvgTimePerFrame = m_dec->m_info.m_sequence->frame_period
- ? 10i64 * m_dec->m_info.m_sequence->frame_period / 27
- : ((VIDEOINFOHEADER*)m_pInput->CurrentMediaType().Format())->AvgTimePerFrame;
- break;
- case STATE_PICTURE:
- m_dec->m_picture->rtStart = rtStart;
- rtStart = _I64_MIN;
- m_dec->m_picture->fDelivered = false;
- m_dec->mpeg2_skip(m_fDropFrames && (m_dec->m_picture->flags&PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_B);
- break;
- case STATE_SLICE:
- case STATE_END: {
- mpeg2_picture_t* picture = m_dec->m_info.m_display_picture;
- mpeg2_fbuf_t* fbuf = m_dec->m_info.m_display_fbuf;
-
- if (picture && !(picture->flags&PIC_FLAG_SKIP) && fbuf) {
- ASSERT(!picture->fDelivered);
-
- picture->fDelivered = true;
-
- // frame buffer
-
- int w = m_dec->m_info.m_sequence->picture_width;
- int h = m_dec->m_info.m_sequence->picture_height;
- int pitch = (m_dec->m_info.m_sequence->width + 31) & ~31;
-
- if (m_fb.w != w || m_fb.h != h || m_fb.pitch != pitch) {
- m_fb.Alloc(w, h, pitch);
- m_fInitializedBuffer = false;
- }
-
- // start - end
-
- m_fb.rtStart = picture->rtStart;
- if (m_fb.rtStart == _I64_MIN) {
- m_fb.rtStart = m_fb.rtStop;
- }
- m_fb.rtStop = m_fb.rtStart + m_AvgTimePerFrame * picture->nb_fields / (m_dec->m_info.m_display_picture_2nd ? 1 : 2);
-
- REFERENCE_TIME rtStart = m_fb.rtStart;
- REFERENCE_TIME rtStop = m_fb.rtStop;
- UNREFERENCED_PARAMETER(rtStart);
- UNREFERENCED_PARAMETER(rtStop);
-
- //
-
- SetDeinterlaceMethod();
- UpdateAspectRatio();
-
- hr = DeliverFast();
- if (hr != S_OK) {
- hr = DeliverNormal();
- }
- if (hr != S_OK) {
- return hr;
- }
- if (hr == S_OK && !m_fWaitForKeyFrame) {
- m_fInitializedBuffer = true;
- }
- }
- }
- break;
- default:
- break;
- }
- }
-
- return S_OK;
+ switch (state) {
+ case STATE_BUFFER:
+ if (len > 0) {
+ m_dec->mpeg2_buffer(pDataIn, pDataIn + len);
+ len = 0;
+ } else {
+ len = -1;
+ }
+ break;
+ case STATE_INVALID:
+ TRACE(_T("*** STATE_INVALID\n"));
+ break;
+ case STATE_GOP:
+ m_pClosedCaptionOutput->Deliver(m_dec->m_info.m_user_data, m_dec->m_info.m_user_data_len);
+ break;
+ case STATE_SEQUENCE:
+ m_AvgTimePerFrame = m_dec->m_info.m_sequence->frame_period
+ ? 10i64 * m_dec->m_info.m_sequence->frame_period / 27
+ : ((VIDEOINFOHEADER*)m_pInput->CurrentMediaType().Format())->AvgTimePerFrame;
+ break;
+ case STATE_PICTURE:
+ m_dec->m_picture->rtStart = rtStart;
+ rtStart = _I64_MIN;
+ m_dec->m_picture->fDelivered = false;
+ m_dec->mpeg2_skip(m_fDropFrames && (m_dec->m_picture->flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_B);
+ break;
+ case STATE_SLICE:
+ case STATE_END: {
+ mpeg2_picture_t* picture = m_dec->m_info.m_display_picture;
+ mpeg2_fbuf_t* fbuf = m_dec->m_info.m_display_fbuf;
+
+ if (picture && !(picture->flags & PIC_FLAG_SKIP) && fbuf) {
+ ASSERT(!picture->fDelivered);
+
+ picture->fDelivered = true;
+
+ // frame buffer
+
+ int w = m_dec->m_info.m_sequence->picture_width;
+ int h = m_dec->m_info.m_sequence->picture_height;
+ int pitch = (m_dec->m_info.m_sequence->width + 31) & ~31;
+
+ if (m_fb.w != w || m_fb.h != h || m_fb.pitch != pitch) {
+ m_fb.Alloc(w, h, pitch);
+ m_fInitializedBuffer = false;
+ }
+
+ // start - end
+
+ m_fb.rtStart = picture->rtStart;
+ if (m_fb.rtStart == _I64_MIN) {
+ m_fb.rtStart = m_fb.rtStop;
+ }
+ m_fb.rtStop = m_fb.rtStart + m_AvgTimePerFrame * picture->nb_fields / (m_dec->m_info.m_display_picture_2nd ? 1 : 2);
+
+ REFERENCE_TIME rtStart = m_fb.rtStart;
+ REFERENCE_TIME rtStop = m_fb.rtStop;
+ UNREFERENCED_PARAMETER(rtStart);
+ UNREFERENCED_PARAMETER(rtStop);
+
+ //
+
+ SetDeinterlaceMethod();
+ UpdateAspectRatio();
+
+ hr = DeliverFast();
+ if (hr != S_OK) {
+ hr = DeliverNormal();
+ }
+ if (hr != S_OK) {
+ return hr;
+ }
+ if (hr == S_OK && !m_fWaitForKeyFrame) {
+ m_fInitializedBuffer = true;
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ return S_OK;
}
bool CMpeg2DecFilter::IsVideoInterlaced()
{
- return IsInterlacedEnabled();
+ return IsInterlacedEnabled();
}
void CMpeg2DecFilter::UpdateAspectRatio()
{
- if (m_bReadARFromStream && ((unsigned int)m_par.cx != m_dec->m_info.m_sequence->pixel_width || (unsigned int)m_par.cy != m_dec->m_info.m_sequence->pixel_height)) {
- m_par.cx = m_dec->m_info.m_sequence->pixel_width;
- m_par.cy = m_dec->m_info.m_sequence->pixel_height;
- CSize dar(m_dec->m_info.m_sequence->picture_width * m_par.cx,
- m_dec->m_info.m_sequence->picture_height * m_par.cy);
- int lnko = LNKO(dar.cx, dar.cy);
- if (lnko > 1) {
- dar.cx /= lnko, dar.cy /= lnko;
- }
- SetAspect(dar);
- }
+ if (m_bReadARFromStream && ((unsigned int)m_par.cx != m_dec->m_info.m_sequence->pixel_width || (unsigned int)m_par.cy != m_dec->m_info.m_sequence->pixel_height)) {
+ m_par.cx = m_dec->m_info.m_sequence->pixel_width;
+ m_par.cy = m_dec->m_info.m_sequence->pixel_height;
+ CSize dar(m_dec->m_info.m_sequence->picture_width * m_par.cx,
+ m_dec->m_info.m_sequence->picture_height * m_par.cy);
+ int lnko = LNKO(dar.cx, dar.cy);
+ if (lnko > 1) {
+ dar.cx /= lnko, dar.cy /= lnko;
+ }
+ SetAspect(dar);
+ }
}
HRESULT CMpeg2DecFilter::DeliverFast()
{
- HRESULT hr;
+ HRESULT hr;
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- mpeg2_fbuf_t* fbuf = m_dec->m_info.m_display_fbuf;
- if (!fbuf) {
- return S_FALSE;
- }
+ mpeg2_fbuf_t* fbuf = m_dec->m_info.m_display_fbuf;
+ if (!fbuf) {
+ return S_FALSE;
+ }
- {
+ {
- CAutoLock cAutoLock2(&m_csProps);
+ CAutoLock cAutoLock2(&m_csProps);
- if (GetCLSID(m_pInput->GetConnected()) == CLSID_DVDNavigator
- || m_pSubpicInput->HasAnythingToRender(m_fb.rtStart)
- || fabs(m_bright) > EPSILON || fabs(m_cont-1.0) > EPSILON
- || fabs(m_hue) > EPSILON || fabs(m_sat-1.0) > EPSILON) {
- return S_FALSE;
- }
- }
+ if (GetCLSID(m_pInput->GetConnected()) == CLSID_DVDNavigator
+ || m_pSubpicInput->HasAnythingToRender(m_fb.rtStart)
+ || fabs(m_bright) > EPSILON || fabs(m_cont - 1.0) > EPSILON
+ || fabs(m_hue) > EPSILON || fabs(m_sat - 1.0) > EPSILON) {
+ return S_FALSE;
+ }
+ }
- if ((m_fb.flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_I) {
- m_fWaitForKeyFrame = false;
- }
+ if ((m_fb.flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_I) {
+ m_fWaitForKeyFrame = false;
+ }
- if (m_fb.rtStart < 0 || m_fWaitForKeyFrame) {
- return S_OK;
- }
+ if (m_fb.rtStart < 0 || m_fWaitForKeyFrame) {
+ return S_OK;
+ }
- const CMediaType& mt = m_pOutput->CurrentMediaType();
+ const CMediaType& mt = m_pOutput->CurrentMediaType();
- if (mt.subtype != MEDIASUBTYPE_I420 && mt.subtype != MEDIASUBTYPE_IYUV && mt.subtype != MEDIASUBTYPE_YV12) {
- return S_FALSE;
- }
+ if (mt.subtype != MEDIASUBTYPE_I420 && mt.subtype != MEDIASUBTYPE_IYUV && mt.subtype != MEDIASUBTYPE_YV12) {
+ return S_FALSE;
+ }
- CComPtr<IMediaSample> pOut;
- BYTE* pDataOut = NULL;
- if (FAILED(hr = GetDeliveryBuffer(m_fb.w, m_fb.h, &pOut))
- || FAILED(hr = pOut->GetPointer(&pDataOut))) {
- return hr;
- }
+ CComPtr<IMediaSample> pOut;
+ BYTE* pDataOut = NULL;
+ if (FAILED(hr = GetDeliveryBuffer(m_fb.w, m_fb.h, &pOut))
+ || FAILED(hr = pOut->GetPointer(&pDataOut))) {
+ return hr;
+ }
- if (mt.subtype != MEDIASUBTYPE_I420 && mt.subtype != MEDIASUBTYPE_IYUV && mt.subtype != MEDIASUBTYPE_YV12) {
- return S_FALSE;
- }
+ if (mt.subtype != MEDIASUBTYPE_I420 && mt.subtype != MEDIASUBTYPE_IYUV && mt.subtype != MEDIASUBTYPE_YV12) {
+ return S_FALSE;
+ }
- BITMAPINFOHEADER bihOut;
- ExtractBIH(&mt, &bihOut);
+ BITMAPINFOHEADER bihOut;
+ ExtractBIH(&mt, &bihOut);
- int w = bihOut.biWidth;
- int h = abs(bihOut.biHeight);
- int srcpitch = m_dec->m_info.m_sequence->width; // TODO (..+7)&~7; ?
- int dstpitch = bihOut.biWidth;
+ int w = bihOut.biWidth;
+ int h = abs(bihOut.biHeight);
+ int srcpitch = m_dec->m_info.m_sequence->width; // TODO (..+7)&~7; ?
+ int dstpitch = bihOut.biWidth;
- BYTE* y = pDataOut;
- BYTE* u = y + dstpitch*h;
- BYTE* v = y + dstpitch*h*5/4;
+ BYTE* y = pDataOut;
+ BYTE* u = y + dstpitch * h;
+ BYTE* v = y + dstpitch * h * 5 / 4;
- if (bihOut.biCompression == '21VY') {
- BYTE* tmp = u;
- u = v;
- v = tmp;
- }
+ if (bihOut.biCompression == '21VY') {
+ BYTE* tmp = u;
+ u = v;
+ v = tmp;
+ }
- if (m_fb.di == DIWeave) {
- BitBltFromI420ToI420(w, h, y, u, v, dstpitch, fbuf->buf[0], fbuf->buf[1], fbuf->buf[2], srcpitch);
- } else if (m_fb.di == DIBlend) {
- DeinterlaceBlend(y, fbuf->buf[0], w, h, dstpitch, srcpitch);
- DeinterlaceBlend(u, fbuf->buf[1], w/2, h/2, dstpitch/2, srcpitch/2);
- DeinterlaceBlend(v, fbuf->buf[2], w/2, h/2, dstpitch/2, srcpitch/2);
- } else { // TODO
- return S_FALSE;
- }
+ if (m_fb.di == DIWeave) {
+ BitBltFromI420ToI420(w, h, y, u, v, dstpitch, fbuf->buf[0], fbuf->buf[1], fbuf->buf[2], srcpitch);
+ } else if (m_fb.di == DIBlend) {
+ DeinterlaceBlend(y, fbuf->buf[0], w, h, dstpitch, srcpitch);
+ DeinterlaceBlend(u, fbuf->buf[1], w / 2, h / 2, dstpitch / 2, srcpitch / 2);
+ DeinterlaceBlend(v, fbuf->buf[2], w / 2, h / 2, dstpitch / 2, srcpitch / 2);
+ } else { // TODO
+ return S_FALSE;
+ }
- if (h == 1088) {
- memset(y + dstpitch*(h-8), 0xff, dstpitch*8);
- memset(u + dstpitch*(h-8)/4, 0x80, dstpitch*8/4);
- memset(v + dstpitch*(h-8)/4, 0x80, dstpitch*8/4);
- }
+ if (h == 1088) {
+ memset(y + dstpitch * (h - 8), 0xff, dstpitch * 8);
+ memset(u + dstpitch * (h - 8) / 4, 0x80, dstpitch * 8 / 4);
+ memset(v + dstpitch * (h - 8) / 4, 0x80, dstpitch * 8 / 4);
+ }
- if (CMpeg2DecInputPin* pPin = dynamic_cast<CMpeg2DecInputPin*>(m_pInput)) {
- CAutoLock cAutoLock(&pPin->m_csRateLock);
+ if (CMpeg2DecInputPin* pPin = dynamic_cast<CMpeg2DecInputPin*>(m_pInput)) {
+ CAutoLock cAutoLock(&pPin->m_csRateLock);
- if (m_rate.Rate != pPin->m_ratechange.Rate) {
- m_rate.Rate = pPin->m_ratechange.Rate;
- m_rate.StartTime = m_fb.rtStart;
- }
- }
+ if (m_rate.Rate != pPin->m_ratechange.Rate) {
+ m_rate.Rate = pPin->m_ratechange.Rate;
+ m_rate.StartTime = m_fb.rtStart;
+ }
+ }
- REFERENCE_TIME rtStart = m_fb.rtStart;
- REFERENCE_TIME rtStop = m_fb.rtStop;
+ REFERENCE_TIME rtStart = m_fb.rtStart;
+ REFERENCE_TIME rtStop = m_fb.rtStop;
- rtStart = m_rate.StartTime + (rtStart - m_rate.StartTime) * m_rate.Rate / 10000;
- rtStop = m_rate.StartTime + (rtStop - m_rate.StartTime) * m_rate.Rate / 10000;
+ rtStart = m_rate.StartTime + (rtStart - m_rate.StartTime) * m_rate.Rate / 10000;
+ rtStop = m_rate.StartTime + (rtStop - m_rate.StartTime) * m_rate.Rate / 10000;
- pOut->SetTime(&rtStart, &rtStop);
- pOut->SetMediaTime(NULL, NULL);
+ pOut->SetTime(&rtStart, &rtStop);
+ pOut->SetMediaTime(NULL, NULL);
- //
+ //
- SetTypeSpecificFlags(pOut);
+ SetTypeSpecificFlags(pOut);
- //
+ //
- return m_pOutput->Deliver(pOut);
+ return m_pOutput->Deliver(pOut);
}
HRESULT CMpeg2DecFilter::DeliverNormal()
{
- HRESULT hr = S_OK;
+ HRESULT hr = S_OK;
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- mpeg2_fbuf_t* fbuf = m_dec->m_info.m_display_fbuf;
- if (!fbuf) {
- return S_FALSE;
- }
+ mpeg2_fbuf_t* fbuf = m_dec->m_info.m_display_fbuf;
+ if (!fbuf) {
+ return S_FALSE;
+ }
- int w = m_fb.w;
- int h = m_fb.h;
- int spitch = m_dec->m_info.m_sequence->width; // TODO (..+7)&~7; ?
- int dpitch = m_fb.pitch;
+ int w = m_fb.w;
+ int h = m_fb.h;
+ int spitch = m_dec->m_info.m_sequence->width; // TODO (..+7)&~7; ?
+ int dpitch = m_fb.pitch;
- REFERENCE_TIME rtStart = m_fb.rtStart;
- REFERENCE_TIME rtStop = m_fb.rtStop;
+ REFERENCE_TIME rtStart = m_fb.rtStart;
+ REFERENCE_TIME rtStop = m_fb.rtStop;
- bool tff = !!(m_fb.flags&PIC_FLAG_TOP_FIELD_FIRST);
+ bool tff = !!(m_fb.flags & PIC_FLAG_TOP_FIELD_FIRST);
- // deinterlace
+ // deinterlace
- if (m_fb.di == DIWeave) {
- BitBltFromI420ToI420(w, h, m_fb.buf[0], m_fb.buf[1], m_fb.buf[2], dpitch, fbuf->buf[0], fbuf->buf[1], fbuf->buf[2], spitch);
- } else if (m_fb.di == DIBlend) {
- DeinterlaceBlend(m_fb.buf[0], fbuf->buf[0], w, h, dpitch, spitch);
- DeinterlaceBlend(m_fb.buf[1], fbuf->buf[1], w/2, h/2, dpitch/2, spitch/2);
- DeinterlaceBlend(m_fb.buf[2], fbuf->buf[2], w/2, h/2, dpitch/2, spitch/2);
- } else if (m_fb.di == DIBob) {
- DeinterlaceBob(m_fb.buf[0], fbuf->buf[0], w, h, dpitch, spitch, tff);
- DeinterlaceBob(m_fb.buf[1], fbuf->buf[1], w/2, h/2, dpitch/2, spitch/2, tff);
- DeinterlaceBob(m_fb.buf[2], fbuf->buf[2], w/2, h/2, dpitch/2, spitch/2, tff);
+ if (m_fb.di == DIWeave) {
+ BitBltFromI420ToI420(w, h, m_fb.buf[0], m_fb.buf[1], m_fb.buf[2], dpitch, fbuf->buf[0], fbuf->buf[1], fbuf->buf[2], spitch);
+ } else if (m_fb.di == DIBlend) {
+ DeinterlaceBlend(m_fb.buf[0], fbuf->buf[0], w, h, dpitch, spitch);
+ DeinterlaceBlend(m_fb.buf[1], fbuf->buf[1], w / 2, h / 2, dpitch / 2, spitch / 2);
+ DeinterlaceBlend(m_fb.buf[2], fbuf->buf[2], w / 2, h / 2, dpitch / 2, spitch / 2);
+ } else if (m_fb.di == DIBob) {
+ DeinterlaceBob(m_fb.buf[0], fbuf->buf[0], w, h, dpitch, spitch, tff);
+ DeinterlaceBob(m_fb.buf[1], fbuf->buf[1], w / 2, h / 2, dpitch / 2, spitch / 2, tff);
+ DeinterlaceBob(m_fb.buf[2], fbuf->buf[2], w / 2, h / 2, dpitch / 2, spitch / 2, tff);
- m_fb.rtStart = rtStart;
- m_fb.rtStop = (rtStart + rtStop) / 2;
- } else if (m_fb.di == DIFieldShift) {
- int soffset = tff ? 0 : spitch;
- int doffset = tff ? 0 : dpitch;
- BitBltFromRGBToRGB(w, h/2, m_fb.buf[0] + doffset, dpitch*2, 8, fbuf->buf[0] + soffset, spitch*2, 8);
- BitBltFromRGBToRGB(w/2, h/4, m_fb.buf[1] + doffset/2, dpitch, 8, fbuf->buf[1] + soffset/2, spitch, 8);
- BitBltFromRGBToRGB(w/2, h/4, m_fb.buf[2] + doffset/2, dpitch, 8, fbuf->buf[2] + soffset/2, spitch, 8);
- } else if (m_fb.di == DIELA) {
- DeinterlaceELA(m_fb.buf[0], fbuf->buf[0], w, h, dpitch, spitch, tff);
- DeinterlaceELA(m_fb.buf[1], fbuf->buf[1], w/2, h/2, dpitch/2, spitch/2, tff);
- DeinterlaceELA(m_fb.buf[2], fbuf->buf[2], w/2, h/2, dpitch/2, spitch/2, tff);
- }
+ m_fb.rtStart = rtStart;
+ m_fb.rtStop = (rtStart + rtStop) / 2;
+ } else if (m_fb.di == DIFieldShift) {
+ int soffset = tff ? 0 : spitch;
+ int doffset = tff ? 0 : dpitch;
+ BitBltFromRGBToRGB(w, h / 2, m_fb.buf[0] + doffset, dpitch * 2, 8, fbuf->buf[0] + soffset, spitch * 2, 8);
+ BitBltFromRGBToRGB(w / 2, h / 4, m_fb.buf[1] + doffset / 2, dpitch, 8, fbuf->buf[1] + soffset / 2, spitch, 8);
+ BitBltFromRGBToRGB(w / 2, h / 4, m_fb.buf[2] + doffset / 2, dpitch, 8, fbuf->buf[2] + soffset / 2, spitch, 8);
+ } else if (m_fb.di == DIELA) {
+ DeinterlaceELA(m_fb.buf[0], fbuf->buf[0], w, h, dpitch, spitch, tff);
+ DeinterlaceELA(m_fb.buf[1], fbuf->buf[1], w / 2, h / 2, dpitch / 2, spitch / 2, tff);
+ DeinterlaceELA(m_fb.buf[2], fbuf->buf[2], w / 2, h / 2, dpitch / 2, spitch / 2, tff);
+ }
- // postproc
+ // postproc
- ApplyBrContHueSat(m_fb.buf[0], m_fb.buf[1], m_fb.buf[2], w, h, dpitch);
+ ApplyBrContHueSat(m_fb.buf[0], m_fb.buf[1], m_fb.buf[2], w, h, dpitch);
- // deliver
+ // deliver
- if (m_fb.di == DIWeave || m_fInitializedBuffer) {
- hr = Deliver(false);
- if (FAILED(hr)) {
- return hr;
- }
- }
+ if (m_fb.di == DIWeave || m_fInitializedBuffer) {
+ hr = Deliver(false);
+ if (FAILED(hr)) {
+ return hr;
+ }
+ }
- if (m_fb.di == DIBob) {
- DeinterlaceBob(m_fb.buf[0], fbuf->buf[0], w, h, dpitch, spitch, !tff);
- DeinterlaceBob(m_fb.buf[1], fbuf->buf[1], w/2, h/2, dpitch/2, spitch/2, !tff);
- DeinterlaceBob(m_fb.buf[2], fbuf->buf[2], w/2, h/2, dpitch/2, spitch/2, !tff);
+ if (m_fb.di == DIBob) {
+ DeinterlaceBob(m_fb.buf[0], fbuf->buf[0], w, h, dpitch, spitch, !tff);
+ DeinterlaceBob(m_fb.buf[1], fbuf->buf[1], w / 2, h / 2, dpitch / 2, spitch / 2, !tff);
+ DeinterlaceBob(m_fb.buf[2], fbuf->buf[2], w / 2, h / 2, dpitch / 2, spitch / 2, !tff);
- m_fb.rtStart = (rtStart + rtStop) / 2;
- m_fb.rtStop = rtStop;
+ m_fb.rtStart = (rtStart + rtStop) / 2;
+ m_fb.rtStop = rtStop;
- // postproc
+ // postproc
- ApplyBrContHueSat(m_fb.buf[0], m_fb.buf[1], m_fb.buf[2], w, h, dpitch);
+ ApplyBrContHueSat(m_fb.buf[0], m_fb.buf[1], m_fb.buf[2], w, h, dpitch);
- // deliver
+ // deliver
- hr = Deliver(false);
- } else if (m_fb.di == DIFieldShift) {
- int soffset = !tff ? 0 : spitch;
- int doffset = !tff ? 0 : dpitch;
- BitBltFromRGBToRGB(w, h/2, m_fb.buf[0] + doffset, dpitch*2, 8, fbuf->buf[0] + soffset, spitch*2, 8);
- BitBltFromRGBToRGB(w/2, h/4, m_fb.buf[1] + doffset/2, dpitch, 8, fbuf->buf[1] + soffset/2, spitch, 8);
- BitBltFromRGBToRGB(w/2, h/4, m_fb.buf[2] + doffset/2, dpitch, 8, fbuf->buf[2] + soffset/2, spitch, 8);
- } else if (m_fb.di == DIELA) {
- DeinterlaceELA(m_fb.buf[0], fbuf->buf[0], w, h, dpitch, spitch, !tff);
- DeinterlaceELA(m_fb.buf[1], fbuf->buf[1], w/2, h/2, dpitch/2, spitch/2, !tff);
- DeinterlaceELA(m_fb.buf[2], fbuf->buf[2], w/2, h/2, dpitch/2, spitch/2, !tff);
- }
+ hr = Deliver(false);
+ } else if (m_fb.di == DIFieldShift) {
+ int soffset = !tff ? 0 : spitch;
+ int doffset = !tff ? 0 : dpitch;
+ BitBltFromRGBToRGB(w, h / 2, m_fb.buf[0] + doffset, dpitch * 2, 8, fbuf->buf[0] + soffset, spitch * 2, 8);
+ BitBltFromRGBToRGB(w / 2, h / 4, m_fb.buf[1] + doffset / 2, dpitch, 8, fbuf->buf[1] + soffset / 2, spitch, 8);
+ BitBltFromRGBToRGB(w / 2, h / 4, m_fb.buf[2] + doffset / 2, dpitch, 8, fbuf->buf[2] + soffset / 2, spitch, 8);
+ } else if (m_fb.di == DIELA) {
+ DeinterlaceELA(m_fb.buf[0], fbuf->buf[0], w, h, dpitch, spitch, !tff);
+ DeinterlaceELA(m_fb.buf[1], fbuf->buf[1], w / 2, h / 2, dpitch / 2, spitch / 2, !tff);
+ DeinterlaceELA(m_fb.buf[2], fbuf->buf[2], w / 2, h / 2, dpitch / 2, spitch / 2, !tff);
+ }
- if (!m_fInitializedBuffer) {
- hr = Deliver(false);
- }
+ if (!m_fInitializedBuffer) {
+ hr = Deliver(false);
+ }
- return hr;
+ return hr;
}
HRESULT CMpeg2DecFilter::Deliver(bool fRepeatLast)
{
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- if ((m_fb.flags&PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_I) {
- m_fWaitForKeyFrame = false;
- }
+ if ((m_fb.flags & PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_I) {
+ m_fWaitForKeyFrame = false;
+ }
- if (m_fb.rtStart < 0 || m_fWaitForKeyFrame) {
- return S_OK;
- }
+ if (m_fb.rtStart < 0 || m_fWaitForKeyFrame) {
+ return S_OK;
+ }
- HRESULT hr;
+ HRESULT hr;
- CComPtr<IMediaSample> pOut;
- BYTE* pDataOut = NULL;
- if (FAILED(hr = GetDeliveryBuffer(m_fb.w, m_fb.h, &pOut))
- || FAILED(hr = pOut->GetPointer(&pDataOut))) {
- return hr;
- }
+ CComPtr<IMediaSample> pOut;
+ BYTE* pDataOut = NULL;
+ if (FAILED(hr = GetDeliveryBuffer(m_fb.w, m_fb.h, &pOut))
+ || FAILED(hr = pOut->GetPointer(&pDataOut))) {
+ return hr;
+ }
- if (m_fb.h == 1088) {
- memset(m_fb.buf[0] + m_fb.w*(m_fb.h-8), 0xff, m_fb.pitch*8);
- memset(m_fb.buf[1] + m_fb.w*(m_fb.h-8)/4, 0x80, m_fb.pitch*8/4);
- memset(m_fb.buf[2] + m_fb.w*(m_fb.h-8)/4, 0x80, m_fb.pitch*8/4);
- }
+ if (m_fb.h == 1088) {
+ memset(m_fb.buf[0] + m_fb.w * (m_fb.h - 8), 0xff, m_fb.pitch * 8);
+ memset(m_fb.buf[1] + m_fb.w * (m_fb.h - 8) / 4, 0x80, m_fb.pitch * 8 / 4);
+ memset(m_fb.buf[2] + m_fb.w * (m_fb.h - 8) / 4, 0x80, m_fb.pitch * 8 / 4);
+ }
- BYTE** buf = &m_fb.buf[0];
+ BYTE** buf = &m_fb.buf[0];
- if (m_pSubpicInput->HasAnythingToRender(m_fb.rtStart)) {
- BitBltFromI420ToI420(m_fb.w, m_fb.h,
- m_fb.buf[3], m_fb.buf[4], m_fb.buf[5], m_fb.pitch,
- m_fb.buf[0], m_fb.buf[1], m_fb.buf[2], m_fb.pitch);
+ if (m_pSubpicInput->HasAnythingToRender(m_fb.rtStart)) {
+ BitBltFromI420ToI420(m_fb.w, m_fb.h,
+ m_fb.buf[3], m_fb.buf[4], m_fb.buf[5], m_fb.pitch,
+ m_fb.buf[0], m_fb.buf[1], m_fb.buf[2], m_fb.pitch);
- buf = &m_fb.buf[3];
+ buf = &m_fb.buf[3];
- m_pSubpicInput->RenderSubpics(m_fb.rtStart, buf, m_fb.pitch, m_fb.h);
- }
+ m_pSubpicInput->RenderSubpics(m_fb.rtStart, buf, m_fb.pitch, m_fb.h);
+ }
- CopyBuffer(pDataOut, buf, (m_fb.w+7)&~7, m_fb.h, m_fb.pitch, MEDIASUBTYPE_I420, !(m_fb.flags & PIC_FLAG_PROGRESSIVE_FRAME));
+ CopyBuffer(pDataOut, buf, (m_fb.w + 7)&~7, m_fb.h, m_fb.pitch, MEDIASUBTYPE_I420, !(m_fb.flags & PIC_FLAG_PROGRESSIVE_FRAME));
- //
+ //
- if (CMpeg2DecInputPin* pPin = dynamic_cast<CMpeg2DecInputPin*>(m_pInput)) {
- CAutoLock cAutoLock(&pPin->m_csRateLock);
+ if (CMpeg2DecInputPin* pPin = dynamic_cast<CMpeg2DecInputPin*>(m_pInput)) {
+ CAutoLock cAutoLock(&pPin->m_csRateLock);
- if (m_rate.Rate != pPin->m_ratechange.Rate) {
- m_rate.Rate = pPin->m_ratechange.Rate;
- m_rate.StartTime = m_fb.rtStart;
- }
- }
+ if (m_rate.Rate != pPin->m_ratechange.Rate) {
+ m_rate.Rate = pPin->m_ratechange.Rate;
+ m_rate.StartTime = m_fb.rtStart;
+ }
+ }
- REFERENCE_TIME rtStart = m_fb.rtStart;
- REFERENCE_TIME rtStop = m_fb.rtStop;
+ REFERENCE_TIME rtStart = m_fb.rtStart;
+ REFERENCE_TIME rtStop = m_fb.rtStop;
- rtStart = m_rate.StartTime + (rtStart - m_rate.StartTime) * m_rate.Rate / 10000;
- rtStop = m_rate.StartTime + (rtStop - m_rate.StartTime) * m_rate.Rate / 10000;
+ rtStart = m_rate.StartTime + (rtStart - m_rate.StartTime) * m_rate.Rate / 10000;
+ rtStop = m_rate.StartTime + (rtStop - m_rate.StartTime) * m_rate.Rate / 10000;
- pOut->SetTime(&rtStart, &rtStop);
- pOut->SetMediaTime(NULL, NULL);
+ pOut->SetTime(&rtStart, &rtStop);
+ pOut->SetMediaTime(NULL, NULL);
- //
+ //
- SetTypeSpecificFlags(pOut);
+ SetTypeSpecificFlags(pOut);
- //
+ //
- hr = m_pOutput->Deliver(pOut);
+ hr = m_pOutput->Deliver(pOut);
- return hr;
+ return hr;
}
HRESULT CMpeg2DecFilter::CheckConnect(PIN_DIRECTION dir, IPin* pPin)
{
- if (dir == PINDIR_OUTPUT) {
- if (GetCLSID(m_pInput->GetConnected()) == CLSID_DVDNavigator) {
- // one of these needed for dynamic format changes
+ if (dir == PINDIR_OUTPUT) {
+ if (GetCLSID(m_pInput->GetConnected()) == CLSID_DVDNavigator) {
+ // one of these needed for dynamic format changes
- CLSID clsid = GetCLSID(pPin);
+ CLSID clsid = GetCLSID(pPin);
- DWORD ver = 0;
- if (CComQIPtr<IFilterVersion> pFV = GetFilterFromPin(pPin)) {
- ver = pFV->GetFilterVersion();
- }
+ DWORD ver = 0;
+ if (CComQIPtr<IFilterVersion> pFV = GetFilterFromPin(pPin)) {
+ ver = pFV->GetFilterVersion();
+ }
- if (clsid != CLSID_OverlayMixer
- /*&& clsid != CLSID_OverlayMixer2*/
- && clsid != CLSID_VideoMixingRenderer
- && clsid != CLSID_VideoMixingRenderer9
- && clsid != GUIDFromCString(_T("{FA10746C-9B63-4b6c-BC49-FC300EA5F256}")) // EVR
- && clsid != GUIDFromCString(_T("{04FE9017-F873-410E-871E-AB91661A4EF7}")) // ffdshow
- && (clsid != GUIDFromCString(_T("{93A22E7A-5091-45ef-BA61-6DA26156A5D0}")) || ver < 0x0234) // dvobsub
- && (clsid != GUIDFromCString(_T("{9852A670-F845-491b-9BE6-EBD841B8A613}")) || ver < 0x0234) // dvobsub auto
- && clsid != CLSID_madVR
- && clsid != CLSID_DXR) { // Haali's video renderer
- return E_FAIL;
- }
- }
- }
+ if (clsid != CLSID_OverlayMixer
+ /*&& clsid != CLSID_OverlayMixer2*/
+ && clsid != CLSID_VideoMixingRenderer
+ && clsid != CLSID_VideoMixingRenderer9
+ && clsid != GUIDFromCString(_T("{FA10746C-9B63-4b6c-BC49-FC300EA5F256}")) // EVR
+ && clsid != GUIDFromCString(_T("{04FE9017-F873-410E-871E-AB91661A4EF7}")) // ffdshow
+ && (clsid != GUIDFromCString(_T("{93A22E7A-5091-45ef-BA61-6DA26156A5D0}")) || ver < 0x0234) // dvobsub
+ && (clsid != GUIDFromCString(_T("{9852A670-F845-491b-9BE6-EBD841B8A613}")) || ver < 0x0234) // dvobsub auto
+ && clsid != CLSID_madVR
+ && clsid != CLSID_DXR) { // Haali's video renderer
+ return E_FAIL;
+ }
+ }
+ }
- return __super::CheckConnect(dir, pPin);
+ return __super::CheckConnect(dir, pPin);
}
int NextMpegStartCode(CGolombBuffer& gb, BYTE& code, __int64 len)
{
- gb.BitByteAlign();
- DWORD dw = (DWORD)-1;
- do {
- if (len-- == 0) {
- return false;
- }
- dw = (dw << 8) | (BYTE)gb.BitRead(8);
- } while ((dw&0xffffff00) != 0x00000100);
- code = (BYTE)(dw&0xff);
- return true;
+ gb.BitByteAlign();
+ DWORD dw = (DWORD) - 1;
+ do {
+ if (len-- == 0) {
+ return false;
+ }
+ dw = (dw << 8) | (BYTE)gb.BitRead(8);
+ } while ((dw & 0xffffff00) != 0x00000100);
+ code = (BYTE)(dw & 0xff);
+ return true;
}
HRESULT CMpeg2DecFilter::CheckInputType(const CMediaType* mtIn)
{
- if (mtIn->formattype == FORMAT_MPEG2_VIDEO && mtIn->pbFormat) {
- MPEG2VIDEOINFO* vih = (MPEG2VIDEOINFO*)mtIn->pbFormat;
- if (vih->cbSequenceHeader > 0 && (vih->dwSequenceHeader[0] & 0x00ffffff) != 0x00010000) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- BYTE* pSequenceHeader = (BYTE*)vih->dwSequenceHeader;
- DWORD cbSequenceHeader = vih->cbSequenceHeader;
-
- BYTE id = 0;
- CGolombBuffer gb(pSequenceHeader, cbSequenceHeader);
- while (gb.GetPos() < gb.GetSize() && id != 0xb5) {
- if (!NextMpegStartCode(gb, id, cbSequenceHeader)) {
- break;
- }
- }
- if (id == 0xb5) {
- gb.BitRead(4); // startcodeid
- gb.BitRead(1); // profile_levelescape
- gb.BitRead(3); // profile
- gb.BitRead(4); // level
- gb.BitRead(1); // interlaced
- BYTE chroma = (BYTE)gb.BitRead(2);
- if (chroma >= 2) { // current support only 4:2:0 profile
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
- }
- }
-
- return (mtIn->majortype == MEDIATYPE_DVD_ENCRYPTED_PACK && mtIn->subtype == MEDIASUBTYPE_MPEG2_VIDEO
- || mtIn->majortype == MEDIATYPE_MPEG2_PACK && mtIn->subtype == MEDIASUBTYPE_MPEG2_VIDEO
- || mtIn->majortype == MEDIATYPE_MPEG2_PES && mtIn->subtype == MEDIASUBTYPE_MPEG2_VIDEO
- || mtIn->majortype == MEDIATYPE_Video && mtIn->subtype == MEDIASUBTYPE_MPEG2_VIDEO
- || mtIn->majortype == MEDIATYPE_Video && mtIn->subtype == MEDIASUBTYPE_MPG2
- || mtIn->majortype == MEDIATYPE_Video && mtIn->subtype == MEDIASUBTYPE_MPEG1Packet
- || mtIn->majortype == MEDIATYPE_Video && mtIn->subtype == MEDIASUBTYPE_MPEG1Payload)
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ if (mtIn->formattype == FORMAT_MPEG2_VIDEO && mtIn->pbFormat) {
+ MPEG2VIDEOINFO* vih = (MPEG2VIDEOINFO*)mtIn->pbFormat;
+ if (vih->cbSequenceHeader > 0 && (vih->dwSequenceHeader[0] & 0x00ffffff) != 0x00010000) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ BYTE* pSequenceHeader = (BYTE*)vih->dwSequenceHeader;
+ DWORD cbSequenceHeader = vih->cbSequenceHeader;
+
+ BYTE id = 0;
+ CGolombBuffer gb(pSequenceHeader, cbSequenceHeader);
+ while (gb.GetPos() < gb.GetSize() && id != 0xb5) {
+ if (!NextMpegStartCode(gb, id, cbSequenceHeader)) {
+ break;
+ }
+ }
+ if (id == 0xb5) {
+ gb.BitRead(4); // startcodeid
+ gb.BitRead(1); // profile_levelescape
+ gb.BitRead(3); // profile
+ gb.BitRead(4); // level
+ gb.BitRead(1); // interlaced
+ BYTE chroma = (BYTE)gb.BitRead(2);
+ if (chroma >= 2) { // current support only 4:2:0 profile
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
+ }
+ }
+
+ return (mtIn->majortype == MEDIATYPE_DVD_ENCRYPTED_PACK && mtIn->subtype == MEDIASUBTYPE_MPEG2_VIDEO
+ || mtIn->majortype == MEDIATYPE_MPEG2_PACK && mtIn->subtype == MEDIASUBTYPE_MPEG2_VIDEO
+ || mtIn->majortype == MEDIATYPE_MPEG2_PES && mtIn->subtype == MEDIASUBTYPE_MPEG2_VIDEO
+ || mtIn->majortype == MEDIATYPE_Video && mtIn->subtype == MEDIASUBTYPE_MPEG2_VIDEO
+ || mtIn->majortype == MEDIATYPE_Video && mtIn->subtype == MEDIASUBTYPE_MPG2
+ || mtIn->majortype == MEDIATYPE_Video && mtIn->subtype == MEDIASUBTYPE_MPEG1Packet
+ || mtIn->majortype == MEDIATYPE_Video && mtIn->subtype == MEDIASUBTYPE_MPEG1Payload)
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CMpeg2DecFilter::CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut)
{
- bool fPlanarYUV = mtOut->subtype == MEDIASUBTYPE_YV12
- || mtOut->subtype == MEDIASUBTYPE_I420
- || mtOut->subtype == MEDIASUBTYPE_IYUV;
+ bool fPlanarYUV = mtOut->subtype == MEDIASUBTYPE_YV12
+ || mtOut->subtype == MEDIASUBTYPE_I420
+ || mtOut->subtype == MEDIASUBTYPE_IYUV;
- return SUCCEEDED(__super::CheckTransform(mtIn, mtOut))
- && (!fPlanarYUV || IsPlanarYUVEnabled())
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ return SUCCEEDED(__super::CheckTransform(mtIn, mtOut))
+ && (!fPlanarYUV || IsPlanarYUVEnabled())
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
DWORD g_clock;
HRESULT CMpeg2DecFilter::StartStreaming()
{
- HRESULT hr = __super::StartStreaming();
- if (FAILED(hr)) {
- return hr;
- }
+ HRESULT hr = __super::StartStreaming();
+ if (FAILED(hr)) {
+ return hr;
+ }
- m_dec.Attach(DNew CMpeg2Dec());
- if (!m_dec) {
- return E_OUTOFMEMORY;
- }
+ m_dec.Attach(DNew CMpeg2Dec());
+ if (!m_dec) {
+ return E_OUTOFMEMORY;
+ }
- InputTypeChanged();
+ InputTypeChanged();
- // g_clock = clock();
+ // g_clock = clock();
- return S_OK;
+ return S_OK;
}
HRESULT CMpeg2DecFilter::StopStreaming()
{
- /*
- CString str;
- str.Format(_T("%d"), clock()-g_clock);
- AfxMessageBox(str);
- */
- m_dec.Free();
+ /*
+ CString str;
+ str.Format(_T("%d"), clock()-g_clock);
+ AfxMessageBox(str);
+ */
+ m_dec.Free();
- return __super::StopStreaming();
+ return __super::StopStreaming();
}
HRESULT CMpeg2DecFilter::AlterQuality(Quality q)
{
- if (q.Late > 100*10000i64) {
- m_fDropFrames = true;
- } else if (q.Late <= 0) {
- m_fDropFrames = false;
- }
+ if (q.Late > 100 * 10000i64) {
+ m_fDropFrames = true;
+ } else if (q.Late <= 0) {
+ m_fDropFrames = false;
+ }
- //TRACE(_T("CMpeg2DecFilter::AlterQuality: Type=%d, Proportion=%d, Late=%I64d, TimeStamp=%I64d\n"), q.Type, q.Proportion, q.Late, q.TimeStamp);
- return S_OK;
+ //TRACE(_T("CMpeg2DecFilter::AlterQuality: Type=%d, Proportion=%d, Late=%I64d, TimeStamp=%I64d\n"), q.Type, q.Proportion, q.Late, q.TimeStamp);
+ return S_OK;
}
// ISpecifyPropertyPages2
STDMETHODIMP CMpeg2DecFilter::GetPages(CAUUID* pPages)
{
- CheckPointer(pPages, E_POINTER);
+ CheckPointer(pPages, E_POINTER);
- pPages->cElems = 1;
- pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID) * pPages->cElems);
- pPages->pElems[0] = __uuidof(CMpeg2DecSettingsWnd);
+ pPages->cElems = 1;
+ pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID) * pPages->cElems);
+ pPages->pElems[0] = __uuidof(CMpeg2DecSettingsWnd);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CMpeg2DecFilter::CreatePage(const GUID& guid, IPropertyPage** ppPage)
{
- CheckPointer(ppPage, E_POINTER);
+ CheckPointer(ppPage, E_POINTER);
- if (*ppPage != NULL) {
- return E_INVALIDARG;
- }
+ if (*ppPage != NULL) {
+ return E_INVALIDARG;
+ }
- HRESULT hr;
+ HRESULT hr;
- if (guid == __uuidof(CMpeg2DecSettingsWnd)) {
- (*ppPage = DNew CInternalPropertyPageTempl<CMpeg2DecSettingsWnd>(NULL, &hr))->AddRef();
- }
+ if (guid == __uuidof(CMpeg2DecSettingsWnd)) {
+ (*ppPage = DNew CInternalPropertyPageTempl<CMpeg2DecSettingsWnd>(NULL, &hr))->AddRef();
+ }
- return *ppPage ? S_OK : E_FAIL;
+ return *ppPage ? S_OK : E_FAIL;
}
// IMpeg2DecFilter
STDMETHODIMP CMpeg2DecFilter::SetDeinterlaceMethod(ditype di)
{
- CAutoLock cAutoLock(&m_csProps);
- m_ditype = di;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_ditype = di;
+ return S_OK;
}
STDMETHODIMP_(ditype) CMpeg2DecFilter::GetDeinterlaceMethod()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_ditype;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_ditype;
}
void CMpeg2DecFilter::CalcBrCont(BYTE* YTbl, float bright, float cont)
{
- int Cont = (int)(cont * 512);
- int Bright = (int)bright;
+ int Cont = (int)(cont * 512);
+ int Bright = (int)bright;
- for (int i = 0; i < 256; i++) {
- int y = ((Cont * (i - 16)) >> 9) + Bright + 16;
- YTbl[i] = min(max(y, 0), 255);
- //YTbl[i] = min(max(y, 16), 235);
- }
+ for (int i = 0; i < 256; i++) {
+ int y = ((Cont * (i - 16)) >> 9) + Bright + 16;
+ YTbl[i] = min(max(y, 0), 255);
+ //YTbl[i] = min(max(y, 16), 235);
+ }
}
void CMpeg2DecFilter::CalcHueSat(BYTE* UTbl, BYTE* VTbl, float hue, float sat)
{
- int Sat = (int)(sat * 512);
- double Hue = (hue * 3.1415926) / 180.0;
- int Sin = (int)(sin(Hue) * 4096);
- int Cos = (int)(cos(Hue) * 4096);
-
- for (int y = 0; y < 256; y++) {
- for (int x = 0; x < 256; x++) {
- int u = x - 128;
- int v = y - 128;
- int ux = (u * Cos + v * Sin) >> 12;
- v = (v * Cos - u * Sin) >> 12;
- u = ((ux * Sat) >> 9) + 128;
- v = ((v * Sat) >> 9) + 128;
- u = min(max(u, 16), 235);
- v = min(max(v, 16), 235);
- UTbl[(y << 8) | x] = u;
- VTbl[(y << 8) | x] = v;
- }
- }
+ int Sat = (int)(sat * 512);
+ double Hue = (hue * 3.1415926) / 180.0;
+ int Sin = (int)(sin(Hue) * 4096);
+ int Cos = (int)(cos(Hue) * 4096);
+
+ for (int y = 0; y < 256; y++) {
+ for (int x = 0; x < 256; x++) {
+ int u = x - 128;
+ int v = y - 128;
+ int ux = (u * Cos + v * Sin) >> 12;
+ v = (v * Cos - u * Sin) >> 12;
+ u = ((ux * Sat) >> 9) + 128;
+ v = ((v * Sat) >> 9) + 128;
+ u = min(max(u, 16), 235);
+ v = min(max(v, 16), 235);
+ UTbl[(y << 8) | x] = u;
+ VTbl[(y << 8) | x] = v;
+ }
+ }
}
void CMpeg2DecFilter::ApplyBrContHueSat(BYTE* srcy, BYTE* srcu, BYTE* srcv, int w, int h, int pitch)
{
- CAutoLock cAutoLock(&m_csProps);
+ CAutoLock cAutoLock(&m_csProps);
- if (fabs(m_bright) > EPSILON || fabs(m_cont-1.0) > EPSILON) {
- int size = pitch*h;
+ if (fabs(m_bright) > EPSILON || fabs(m_cont - 1.0) > EPSILON) {
+ int size = pitch * h;
- if ((g_cpuid.m_flags&CCpuID::sse2) && ((DWORD_PTR)srcy & 15) == 0) {
- short Cont = (short)(min(max(m_cont, 0) * 512, (1<<16)-1));
- short Bright = (short)(m_bright + 16);
+ if ((g_cpuid.m_flags & CCpuID::sse2) && ((DWORD_PTR)srcy & 15) == 0) {
+ short Cont = (short)(min(max(m_cont, 0) * 512, (1 << 16) - 1));
+ short Bright = (short)(m_bright + 16);
- __m128i bc = _mm_set_epi16(Bright, Cont, Bright, Cont, Bright, Cont, Bright, Cont);
+ __m128i bc = _mm_set_epi16(Bright, Cont, Bright, Cont, Bright, Cont, Bright, Cont);
- __m128i zero = _mm_setzero_si128();
- __m128i _16 = _mm_set1_epi16(16);
- __m128i _512 = _mm_set1_epi16(512);
+ __m128i zero = _mm_setzero_si128();
+ __m128i _16 = _mm_set1_epi16(16);
+ __m128i _512 = _mm_set1_epi16(512);
- for (int i = 0, j = size>>4; i < j; i++) {
- __m128i r = _mm_load_si128((__m128i*)&srcy[i*16]);
+ for (int i = 0, j = size >> 4; i < j; i++) {
+ __m128i r = _mm_load_si128((__m128i*)&srcy[i * 16]);
- __m128i rl = _mm_unpacklo_epi8(r, zero);
- __m128i rh = _mm_unpackhi_epi8(r, zero);
+ __m128i rl = _mm_unpacklo_epi8(r, zero);
+ __m128i rh = _mm_unpackhi_epi8(r, zero);
- rl = _mm_subs_epi16(rl, _16);
- rh = _mm_subs_epi16(rh, _16);
+ rl = _mm_subs_epi16(rl, _16);
+ rh = _mm_subs_epi16(rh, _16);
- __m128i rll = _mm_unpacklo_epi16(rl, _512);
- __m128i rlh = _mm_unpackhi_epi16(rl, _512);
- __m128i rhl = _mm_unpacklo_epi16(rh, _512);
- __m128i rhh = _mm_unpackhi_epi16(rh, _512);
+ __m128i rll = _mm_unpacklo_epi16(rl, _512);
+ __m128i rlh = _mm_unpackhi_epi16(rl, _512);
+ __m128i rhl = _mm_unpacklo_epi16(rh, _512);
+ __m128i rhh = _mm_unpackhi_epi16(rh, _512);
- rll = _mm_madd_epi16(rll, bc);
- rlh = _mm_madd_epi16(rlh, bc);
- rhl = _mm_madd_epi16(rhl, bc);
- rhh = _mm_madd_epi16(rhh, bc);
+ rll = _mm_madd_epi16(rll, bc);
+ rlh = _mm_madd_epi16(rlh, bc);
+ rhl = _mm_madd_epi16(rhl, bc);
+ rhh = _mm_madd_epi16(rhh, bc);
- rll = _mm_srai_epi32(rll, 9);
- rlh = _mm_srai_epi32(rlh, 9);
- rhl = _mm_srai_epi32(rhl, 9);
- rhh = _mm_srai_epi32(rhh, 9);
+ rll = _mm_srai_epi32(rll, 9);
+ rlh = _mm_srai_epi32(rlh, 9);
+ rhl = _mm_srai_epi32(rhl, 9);
+ rhh = _mm_srai_epi32(rhh, 9);
- rl = _mm_packs_epi32(rll, rlh);
- rh = _mm_packs_epi32(rhl, rhh);
+ rl = _mm_packs_epi32(rll, rlh);
+ rh = _mm_packs_epi32(rhl, rhh);
- r = _mm_packus_epi16(rl, rh);
+ r = _mm_packus_epi16(rl, rh);
- _mm_store_si128((__m128i*)&srcy[i*16], r);
- }
+ _mm_store_si128((__m128i*)&srcy[i * 16], r);
+ }
- srcy += size>>4;
- size &= 15;
- }
+ srcy += size >> 4;
+ size &= 15;
+ }
- for (; size > 0; size--) {
- *srcy++ = m_YTbl[*srcy];
- }
- }
+ for (; size > 0; size--) {
+ *srcy++ = m_YTbl[*srcy];
+ }
+ }
- pitch /= 2;
- w /= 2;
- h /= 2;
+ pitch /= 2;
+ w /= 2;
+ h /= 2;
- if (fabs(m_hue) > EPSILON || fabs(m_sat-1.0) > EPSILON) {
- for (int size = pitch*h; size > 0; size--) {
- WORD uv = (*srcv<<8)|*srcu;
- *srcu++ = m_UTbl[uv];
- *srcv++ = m_VTbl[uv];
- }
- }
+ if (fabs(m_hue) > EPSILON || fabs(m_sat - 1.0) > EPSILON) {
+ for (int size = pitch * h; size > 0; size--) {
+ WORD uv = (*srcv << 8) | *srcu;
+ *srcu++ = m_UTbl[uv];
+ *srcv++ = m_VTbl[uv];
+ }
+ }
}
STDMETHODIMP CMpeg2DecFilter::SetBrightness(float bright)
{
- CAutoLock cAutoLock(&m_csProps);
- CalcBrCont(m_YTbl, m_bright = bright, m_cont);
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ CalcBrCont(m_YTbl, m_bright = bright, m_cont);
+ return S_OK;
}
STDMETHODIMP CMpeg2DecFilter::SetContrast(float cont)
{
- CAutoLock cAutoLock(&m_csProps);
- CalcBrCont(m_YTbl, m_bright, m_cont = cont);
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ CalcBrCont(m_YTbl, m_bright, m_cont = cont);
+ return S_OK;
}
STDMETHODIMP CMpeg2DecFilter::SetHue(float hue)
{
- CAutoLock cAutoLock(&m_csProps);
- CalcHueSat(m_UTbl, m_VTbl, m_hue = hue, m_sat);
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ CalcHueSat(m_UTbl, m_VTbl, m_hue = hue, m_sat);
+ return S_OK;
}
STDMETHODIMP CMpeg2DecFilter::SetSaturation(float sat)
{
- CAutoLock cAutoLock(&m_csProps);
- CalcHueSat(m_UTbl, m_VTbl, m_hue, m_sat = sat);
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ CalcHueSat(m_UTbl, m_VTbl, m_hue, m_sat = sat);
+ return S_OK;
}
STDMETHODIMP_(float) CMpeg2DecFilter::GetBrightness()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_bright;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_bright;
}
STDMETHODIMP_(float) CMpeg2DecFilter::GetContrast()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_cont;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_cont;
}
STDMETHODIMP_(float) CMpeg2DecFilter::GetHue()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_hue;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_hue;
}
STDMETHODIMP_(float) CMpeg2DecFilter::GetSaturation()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_sat;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_sat;
}
STDMETHODIMP CMpeg2DecFilter::EnableForcedSubtitles(bool fEnable)
{
- CAutoLock cAutoLock(&m_csProps);
- m_fForcedSubs = fEnable;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_fForcedSubs = fEnable;
+ return S_OK;
}
STDMETHODIMP_(bool) CMpeg2DecFilter::IsForcedSubtitlesEnabled()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_fForcedSubs;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_fForcedSubs;
}
STDMETHODIMP CMpeg2DecFilter::EnablePlanarYUV(bool fEnable)
{
- CAutoLock cAutoLock(&m_csProps);
- m_fPlanarYUV = fEnable;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_fPlanarYUV = fEnable;
+ return S_OK;
}
STDMETHODIMP_(bool) CMpeg2DecFilter::IsPlanarYUVEnabled()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_fPlanarYUV;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_fPlanarYUV;
}
STDMETHODIMP CMpeg2DecFilter::EnableInterlaced(bool fEnable)
{
- CAutoLock cAutoLock(&m_csProps);
- m_fInterlaced = fEnable;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_fInterlaced = fEnable;
+ return S_OK;
}
STDMETHODIMP_(bool) CMpeg2DecFilter::IsInterlacedEnabled()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_fInterlaced;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_fInterlaced;
}
STDMETHODIMP CMpeg2DecFilter::EnableReadARFromStream(bool fEnable)
{
- CAutoLock cAutoLock(&m_csProps);
- m_bReadARFromStream = fEnable;
- return S_OK;
+ CAutoLock cAutoLock(&m_csProps);
+ m_bReadARFromStream = fEnable;
+ return S_OK;
}
STDMETHODIMP_(bool) CMpeg2DecFilter::IsReadARFromStreamEnabled()
{
- CAutoLock cAutoLock(&m_csProps);
- return m_bReadARFromStream;
+ CAutoLock cAutoLock(&m_csProps);
+ return m_bReadARFromStream;
}
//
@@ -1328,184 +1328,184 @@ STDMETHODIMP_(bool) CMpeg2DecFilter::IsReadARFromStreamEnabled()
//
CMpeg2DecInputPin::CMpeg2DecInputPin(CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName)
- : CDeCSSInputPin(NAME("CMpeg2DecInputPin"), pFilter, phr, pName)
+ : CDeCSSInputPin(NAME("CMpeg2DecInputPin"), pFilter, phr, pName)
{
- m_CorrectTS = 0;
- m_ratechange.Rate = 10000;
- m_ratechange.StartTime = _I64_MAX;
+ m_CorrectTS = 0;
+ m_ratechange.Rate = 10000;
+ m_ratechange.StartTime = _I64_MAX;
}
// IKsPropertySet
STDMETHODIMP CMpeg2DecInputPin::Set(REFGUID PropSet, ULONG Id, LPVOID pInstanceData, ULONG InstanceLength, LPVOID pPropertyData, ULONG DataLength)
{
- if (PropSet != AM_KSPROPSETID_TSRateChange /*&& PropSet != AM_KSPROPSETID_DVD_RateChange*/) {
- return __super::Set(PropSet, Id, pInstanceData, InstanceLength, pPropertyData, DataLength);
- }
-
- if (PropSet == AM_KSPROPSETID_TSRateChange)
- switch (Id) {
- case AM_RATE_SimpleRateChange: {
- AM_SimpleRateChange* p = (AM_SimpleRateChange*)pPropertyData;
- if (!m_CorrectTS) {
- return E_PROP_ID_UNSUPPORTED;
- }
- CAutoLock cAutoLock(&m_csRateLock);
- m_ratechange = *p;
- DbgLog((LOG_TRACE, 0, _T("StartTime=%I64d, Rate=%d"), p->StartTime, p->Rate));
- }
- break;
- case AM_RATE_UseRateVersion: {
- WORD* p = (WORD*)pPropertyData;
- if (*p > 0x0101) {
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- break;
- case AM_RATE_CorrectTS: {
- LONG* p = (LONG*)pPropertyData;
- m_CorrectTS = *p;
- }
- break;
- default:
- return E_PROP_ID_UNSUPPORTED;
- }
- /*
- if (PropSet == AM_KSPROPSETID_DVD_RateChange)
- switch (Id)
- {
- case AM_RATE_ChangeRate:
- {
- AM_DVD_ChangeRate* p = (AM_DVD_ChangeRate*)pPropertyData;
- }
- break;
- default:
- return E_PROP_ID_UNSUPPORTED;
- }
- */
- return S_OK;
+ if (PropSet != AM_KSPROPSETID_TSRateChange /*&& PropSet != AM_KSPROPSETID_DVD_RateChange*/) {
+ return __super::Set(PropSet, Id, pInstanceData, InstanceLength, pPropertyData, DataLength);
+ }
+
+ if (PropSet == AM_KSPROPSETID_TSRateChange)
+ switch (Id) {
+ case AM_RATE_SimpleRateChange: {
+ AM_SimpleRateChange* p = (AM_SimpleRateChange*)pPropertyData;
+ if (!m_CorrectTS) {
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ CAutoLock cAutoLock(&m_csRateLock);
+ m_ratechange = *p;
+ DbgLog((LOG_TRACE, 0, _T("StartTime=%I64d, Rate=%d"), p->StartTime, p->Rate));
+ }
+ break;
+ case AM_RATE_UseRateVersion: {
+ WORD* p = (WORD*)pPropertyData;
+ if (*p > 0x0101) {
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ }
+ break;
+ case AM_RATE_CorrectTS: {
+ LONG* p = (LONG*)pPropertyData;
+ m_CorrectTS = *p;
+ }
+ break;
+ default:
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ /*
+ if (PropSet == AM_KSPROPSETID_DVD_RateChange)
+ switch (Id)
+ {
+ case AM_RATE_ChangeRate:
+ {
+ AM_DVD_ChangeRate* p = (AM_DVD_ChangeRate*)pPropertyData;
+ }
+ break;
+ default:
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ */
+ return S_OK;
}
STDMETHODIMP CMpeg2DecInputPin::Get(REFGUID PropSet, ULONG Id, LPVOID pInstanceData, ULONG InstanceLength, LPVOID pPropertyData, ULONG DataLength, ULONG* pBytesReturned)
{
- if (PropSet != AM_KSPROPSETID_TSRateChange /*&& PropSet != AM_KSPROPSETID_DVD_RateChange*/) {
- return __super::Get(PropSet, Id, pInstanceData, InstanceLength, pPropertyData, DataLength, pBytesReturned);
- }
-
- if (PropSet == AM_KSPROPSETID_TSRateChange)
- switch (Id) {
- case AM_RATE_SimpleRateChange: {
- AM_SimpleRateChange* p = (AM_SimpleRateChange*)pPropertyData;
- UNREFERENCED_PARAMETER(p);
- return E_PROP_ID_UNSUPPORTED;
- }
- break;
- case AM_RATE_MaxFullDataRate: {
- AM_MaxFullDataRate* p = (AM_MaxFullDataRate*)pPropertyData;
- UNREFERENCED_PARAMETER(p);
- *p = 8*10000;
- *pBytesReturned = sizeof(AM_MaxFullDataRate);
- }
- break;
- case AM_RATE_QueryFullFrameRate: {
- AM_QueryRate* p = (AM_QueryRate*)pPropertyData;
- p->lMaxForwardFullFrame = 8*10000;
- p->lMaxReverseFullFrame = 8*10000;
- *pBytesReturned = sizeof(AM_QueryRate);
- }
- break;
- case AM_RATE_QueryLastRateSegPTS: {
- //REFERENCE_TIME* p = (REFERENCE_TIME*)pPropertyData;
- return E_PROP_ID_UNSUPPORTED;
- }
- break;
- default:
- return E_PROP_ID_UNSUPPORTED;
- }
- /*
- if (PropSet == AM_KSPROPSETID_DVD_RateChange)
- switch (Id)
- {
- case AM_RATE_FullDataRateMax:
- {
- AM_MaxFullDataRate* p = (AM_MaxFullDataRate*)pPropertyData;
- }
- break;
- case AM_RATE_ReverseDecode:
- {
- LONG* p = (LONG*)pPropertyData;
- }
- break;
- case AM_RATE_DecoderPosition:
- {
- AM_DVD_DecoderPosition* p = (AM_DVD_DecoderPosition*)pPropertyData;
- }
- break;
- case AM_RATE_DecoderVersion:
- {
- LONG* p = (LONG*)pPropertyData;
- }
- break;
- default:
- return E_PROP_ID_UNSUPPORTED;
- }
- */
- return S_OK;
+ if (PropSet != AM_KSPROPSETID_TSRateChange /*&& PropSet != AM_KSPROPSETID_DVD_RateChange*/) {
+ return __super::Get(PropSet, Id, pInstanceData, InstanceLength, pPropertyData, DataLength, pBytesReturned);
+ }
+
+ if (PropSet == AM_KSPROPSETID_TSRateChange)
+ switch (Id) {
+ case AM_RATE_SimpleRateChange: {
+ AM_SimpleRateChange* p = (AM_SimpleRateChange*)pPropertyData;
+ UNREFERENCED_PARAMETER(p);
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ break;
+ case AM_RATE_MaxFullDataRate: {
+ AM_MaxFullDataRate* p = (AM_MaxFullDataRate*)pPropertyData;
+ UNREFERENCED_PARAMETER(p);
+ *p = 8 * 10000;
+ *pBytesReturned = sizeof(AM_MaxFullDataRate);
+ }
+ break;
+ case AM_RATE_QueryFullFrameRate: {
+ AM_QueryRate* p = (AM_QueryRate*)pPropertyData;
+ p->lMaxForwardFullFrame = 8 * 10000;
+ p->lMaxReverseFullFrame = 8 * 10000;
+ *pBytesReturned = sizeof(AM_QueryRate);
+ }
+ break;
+ case AM_RATE_QueryLastRateSegPTS: {
+ //REFERENCE_TIME* p = (REFERENCE_TIME*)pPropertyData;
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ break;
+ default:
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ /*
+ if (PropSet == AM_KSPROPSETID_DVD_RateChange)
+ switch (Id)
+ {
+ case AM_RATE_FullDataRateMax:
+ {
+ AM_MaxFullDataRate* p = (AM_MaxFullDataRate*)pPropertyData;
+ }
+ break;
+ case AM_RATE_ReverseDecode:
+ {
+ LONG* p = (LONG*)pPropertyData;
+ }
+ break;
+ case AM_RATE_DecoderPosition:
+ {
+ AM_DVD_DecoderPosition* p = (AM_DVD_DecoderPosition*)pPropertyData;
+ }
+ break;
+ case AM_RATE_DecoderVersion:
+ {
+ LONG* p = (LONG*)pPropertyData;
+ }
+ break;
+ default:
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ */
+ return S_OK;
}
STDMETHODIMP CMpeg2DecInputPin::QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport)
{
- if (PropSet != AM_KSPROPSETID_TSRateChange /*&& PropSet != AM_KSPROPSETID_DVD_RateChange*/) {
- return __super::QuerySupported(PropSet, Id, pTypeSupport);
- }
-
- if (PropSet == AM_KSPROPSETID_TSRateChange)
- switch (Id) {
- case AM_RATE_SimpleRateChange:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET | KSPROPERTY_SUPPORT_SET;
- break;
- case AM_RATE_MaxFullDataRate:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- break;
- case AM_RATE_UseRateVersion:
- *pTypeSupport = KSPROPERTY_SUPPORT_SET;
- break;
- case AM_RATE_QueryFullFrameRate:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- break;
- case AM_RATE_QueryLastRateSegPTS:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- break;
- case AM_RATE_CorrectTS:
- *pTypeSupport = KSPROPERTY_SUPPORT_SET;
- break;
- default:
- return E_PROP_ID_UNSUPPORTED;
- }
- /*
- if (PropSet == AM_KSPROPSETID_DVD_RateChange)
- switch (Id)
- {
- case AM_RATE_ChangeRate:
- *pTypeSupport = KSPROPERTY_SUPPORT_SET;
- break;
- case AM_RATE_FullDataRateMax:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- break;
- case AM_RATE_ReverseDecode:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- break;
- case AM_RATE_DecoderPosition:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- break;
- case AM_RATE_DecoderVersion:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- break;
- default:
- return E_PROP_ID_UNSUPPORTED;
- }
- */
- return S_OK;
+ if (PropSet != AM_KSPROPSETID_TSRateChange /*&& PropSet != AM_KSPROPSETID_DVD_RateChange*/) {
+ return __super::QuerySupported(PropSet, Id, pTypeSupport);
+ }
+
+ if (PropSet == AM_KSPROPSETID_TSRateChange)
+ switch (Id) {
+ case AM_RATE_SimpleRateChange:
+ *pTypeSupport = KSPROPERTY_SUPPORT_GET | KSPROPERTY_SUPPORT_SET;
+ break;
+ case AM_RATE_MaxFullDataRate:
+ *pTypeSupport = KSPROPERTY_SUPPORT_GET;
+ break;
+ case AM_RATE_UseRateVersion:
+ *pTypeSupport = KSPROPERTY_SUPPORT_SET;
+ break;
+ case AM_RATE_QueryFullFrameRate:
+ *pTypeSupport = KSPROPERTY_SUPPORT_GET;
+ break;
+ case AM_RATE_QueryLastRateSegPTS:
+ *pTypeSupport = KSPROPERTY_SUPPORT_GET;
+ break;
+ case AM_RATE_CorrectTS:
+ *pTypeSupport = KSPROPERTY_SUPPORT_SET;
+ break;
+ default:
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ /*
+ if (PropSet == AM_KSPROPSETID_DVD_RateChange)
+ switch (Id)
+ {
+ case AM_RATE_ChangeRate:
+ *pTypeSupport = KSPROPERTY_SUPPORT_SET;
+ break;
+ case AM_RATE_FullDataRateMax:
+ *pTypeSupport = KSPROPERTY_SUPPORT_GET;
+ break;
+ case AM_RATE_ReverseDecode:
+ *pTypeSupport = KSPROPERTY_SUPPORT_GET;
+ break;
+ case AM_RATE_DecoderPosition:
+ *pTypeSupport = KSPROPERTY_SUPPORT_GET;
+ break;
+ case AM_RATE_DecoderVersion:
+ *pTypeSupport = KSPROPERTY_SUPPORT_GET;
+ break;
+ default:
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ */
+ return S_OK;
}
//
@@ -1513,47 +1513,47 @@ STDMETHODIMP CMpeg2DecInputPin::QuerySupported(REFGUID PropSet, ULONG Id, ULONG*
//
CMpeg2DecOutputPin::CMpeg2DecOutputPin(CBaseVideoFilter* pFilter, HRESULT* phr, LPWSTR pName)
- : CBaseVideoOutputPin(NAME("CMpeg2DecOutputPin"), pFilter, phr, pName)
+ : CBaseVideoOutputPin(NAME("CMpeg2DecOutputPin"), pFilter, phr, pName)
{
}
HRESULT CMpeg2DecOutputPin::Active()
{
- CAutoLock cAutoLock(m_pLock);
+ CAutoLock cAutoLock(m_pLock);
- // TODO
+ // TODO
- if (m_Connected && !m_pOutputQueue) {
- HRESULT hr = NOERROR;
+ if (m_Connected && !m_pOutputQueue) {
+ HRESULT hr = NOERROR;
- m_pOutputQueue.Attach(DNew COutputQueue(m_Connected, &hr));
- if (!m_pOutputQueue) {
- hr = E_OUTOFMEMORY;
- }
+ m_pOutputQueue.Attach(DNew COutputQueue(m_Connected, &hr));
+ if (!m_pOutputQueue) {
+ hr = E_OUTOFMEMORY;
+ }
- if (FAILED(hr)) {
- m_pOutputQueue.Free();
- return hr;
- }
- }
+ if (FAILED(hr)) {
+ m_pOutputQueue.Free();
+ return hr;
+ }
+ }
- return __super::Active();
+ return __super::Active();
}
HRESULT CMpeg2DecOutputPin::Inactive()
{
- CAutoLock cAutoLock(m_pLock);
- m_pOutputQueue.Free();
- return __super::Inactive();
+ CAutoLock cAutoLock(m_pLock);
+ m_pOutputQueue.Free();
+ return __super::Inactive();
}
HRESULT CMpeg2DecOutputPin::Deliver(IMediaSample* pMediaSample)
{
- if (!m_pOutputQueue) {
- return NOERROR;
- }
- pMediaSample->AddRef();
- return m_pOutputQueue->Receive(pMediaSample);
+ if (!m_pOutputQueue) {
+ return NOERROR;
+ }
+ pMediaSample->AddRef();
+ return m_pOutputQueue->Receive(pMediaSample);
}
#define CallQueue(call) \
@@ -1563,22 +1563,22 @@ HRESULT CMpeg2DecOutputPin::Deliver(IMediaSample* pMediaSample)
HRESULT CMpeg2DecOutputPin::DeliverEndOfStream()
{
- CallQueue(EOS());
+ CallQueue(EOS());
}
HRESULT CMpeg2DecOutputPin::DeliverBeginFlush()
{
- CallQueue(BeginFlush());
+ CallQueue(BeginFlush());
}
HRESULT CMpeg2DecOutputPin::DeliverEndFlush()
{
- CallQueue(EndFlush());
+ CallQueue(EndFlush());
}
HRESULT CMpeg2DecOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- CallQueue(NewSegment(tStart, tStop, dRate));
+ CallQueue(NewSegment(tStart, tStop, dRate));
}
@@ -1589,767 +1589,767 @@ HRESULT CMpeg2DecOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_T
#define PTS2RT(pts) (10000i64*pts/90)
CSubpicInputPin::CSubpicInputPin(CTransformFilter* pFilter, HRESULT* phr)
- : CMpeg2DecInputPin(pFilter, phr, L"SubPicture")
- , m_spon(TRUE)
- , m_fsppal(false)
+ : CMpeg2DecInputPin(pFilter, phr, L"SubPicture")
+ , m_spon(TRUE)
+ , m_fsppal(false)
{
- m_sppal[0].Y = 0x00;
- m_sppal[0].U = m_sppal[0].V = 0x80;
- m_sppal[1].Y = 0xe0;
- m_sppal[1].U = m_sppal[1].V = 0x80;
- m_sppal[2].Y = 0x80;
- m_sppal[2].U = m_sppal[2].V = 0x80;
- m_sppal[3].Y = 0x20;
- m_sppal[3].U = m_sppal[3].V = 0x80;
+ m_sppal[0].Y = 0x00;
+ m_sppal[0].U = m_sppal[0].V = 0x80;
+ m_sppal[1].Y = 0xe0;
+ m_sppal[1].U = m_sppal[1].V = 0x80;
+ m_sppal[2].Y = 0x80;
+ m_sppal[2].U = m_sppal[2].V = 0x80;
+ m_sppal[3].Y = 0x20;
+ m_sppal[3].U = m_sppal[3].V = 0x80;
}
HRESULT CSubpicInputPin::CheckMediaType(const CMediaType* mtIn)
{
- return (mtIn->majortype == MEDIATYPE_DVD_ENCRYPTED_PACK
- || mtIn->majortype == MEDIATYPE_MPEG2_PACK
- || mtIn->majortype == MEDIATYPE_MPEG2_PES
- || mtIn->majortype == MEDIATYPE_Video)
- && (mtIn->subtype == MEDIASUBTYPE_DVD_SUBPICTURE
- || mtIn->subtype == MEDIASUBTYPE_CVD_SUBPICTURE
- || mtIn->subtype == MEDIASUBTYPE_SVCD_SUBPICTURE)
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ return (mtIn->majortype == MEDIATYPE_DVD_ENCRYPTED_PACK
+ || mtIn->majortype == MEDIATYPE_MPEG2_PACK
+ || mtIn->majortype == MEDIATYPE_MPEG2_PES
+ || mtIn->majortype == MEDIATYPE_Video)
+ && (mtIn->subtype == MEDIASUBTYPE_DVD_SUBPICTURE
+ || mtIn->subtype == MEDIASUBTYPE_CVD_SUBPICTURE
+ || mtIn->subtype == MEDIASUBTYPE_SVCD_SUBPICTURE)
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CSubpicInputPin::SetMediaType(const CMediaType* mtIn)
{
- return CBasePin::SetMediaType(mtIn);
+ return CBasePin::SetMediaType(mtIn);
}
bool CSubpicInputPin::HasAnythingToRender(REFERENCE_TIME rt)
{
- if (!IsConnected()) {
- return false;
- }
+ if (!IsConnected()) {
+ return false;
+ }
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- POSITION pos = m_sps.GetHeadPosition();
- while (pos) {
- spu* sp = m_sps.GetNext(pos);
- if (sp->m_rtStart <= rt && rt < sp->m_rtStop && (/*sp->m_psphli ||*/ sp->m_fForced || m_spon)) {
- return true;
- }
- }
+ POSITION pos = m_sps.GetHeadPosition();
+ while (pos) {
+ spu* sp = m_sps.GetNext(pos);
+ if (sp->m_rtStart <= rt && rt < sp->m_rtStop && (/*sp->m_psphli ||*/ sp->m_fForced || m_spon)) {
+ return true;
+ }
+ }
- return false;
+ return false;
}
void CSubpicInputPin::RenderSubpics(REFERENCE_TIME rt, BYTE** yuv, int w, int h)
{
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- POSITION pos;
+ POSITION pos;
- // remove no longer needed things first
- pos = m_sps.GetHeadPosition();
- while (pos) {
- POSITION cur = pos;
- spu* sp = m_sps.GetNext(pos);
- if (sp->m_rtStop <= rt) {
- m_sps.RemoveAt(cur);
- }
- }
+ // remove no longer needed things first
+ pos = m_sps.GetHeadPosition();
+ while (pos) {
+ POSITION cur = pos;
+ spu* sp = m_sps.GetNext(pos);
+ if (sp->m_rtStop <= rt) {
+ m_sps.RemoveAt(cur);
+ }
+ }
- pos = m_sps.GetHeadPosition();
- while (pos) {
- spu* sp = m_sps.GetNext(pos);
- if (sp->m_rtStart <= rt && rt < sp->m_rtStop
- && (m_spon || sp->m_fForced && ((static_cast<CMpeg2DecFilter*>(m_pFilter))->IsForcedSubtitlesEnabled() || sp->m_psphli))) {
- sp->Render(rt, yuv, w, h, m_sppal, m_fsppal);
- }
- }
+ pos = m_sps.GetHeadPosition();
+ while (pos) {
+ spu* sp = m_sps.GetNext(pos);
+ if (sp->m_rtStart <= rt && rt < sp->m_rtStop
+ && (m_spon || sp->m_fForced && ((static_cast<CMpeg2DecFilter*>(m_pFilter))->IsForcedSubtitlesEnabled() || sp->m_psphli))) {
+ sp->Render(rt, yuv, w, h, m_sppal, m_fsppal);
+ }
+ }
}
HRESULT CSubpicInputPin::Transform(IMediaSample* pSample)
{
- HRESULT hr;
+ HRESULT hr;
- AM_MEDIA_TYPE* pmt;
- if (SUCCEEDED(pSample->GetMediaType(&pmt)) && pmt) {
- CMediaType mt(*pmt);
- SetMediaType(&mt);
- DeleteMediaType(pmt);
- }
+ AM_MEDIA_TYPE* pmt;
+ if (SUCCEEDED(pSample->GetMediaType(&pmt)) && pmt) {
+ CMediaType mt(*pmt);
+ SetMediaType(&mt);
+ DeleteMediaType(pmt);
+ }
- BYTE* pDataIn = NULL;
- if (FAILED(hr = pSample->GetPointer(&pDataIn))) {
- return hr;
- }
+ BYTE* pDataIn = NULL;
+ if (FAILED(hr = pSample->GetPointer(&pDataIn))) {
+ return hr;
+ }
- long len = pSample->GetActualDataLength();
+ long len = pSample->GetActualDataLength();
- StripPacket(pDataIn, len);
+ StripPacket(pDataIn, len);
- if (len <= 0) {
- return S_FALSE;
- }
+ if (len <= 0) {
+ return S_FALSE;
+ }
- if (m_mt.subtype == MEDIASUBTYPE_SVCD_SUBPICTURE) {
- pDataIn += 4;
- len -= 4;
- }
+ if (m_mt.subtype == MEDIASUBTYPE_SVCD_SUBPICTURE) {
+ pDataIn += 4;
+ len -= 4;
+ }
- if (len <= 0) {
- return S_FALSE;
- }
+ if (len <= 0) {
+ return S_FALSE;
+ }
- CAutoLock cAutoLock(&m_csReceive);
+ CAutoLock cAutoLock(&m_csReceive);
- REFERENCE_TIME rtStart = 0, rtStop = 0;
- hr = pSample->GetTime(&rtStart, &rtStop);
+ REFERENCE_TIME rtStart = 0, rtStop = 0;
+ hr = pSample->GetTime(&rtStart, &rtStop);
- bool fRefresh = false;
+ bool fRefresh = false;
- if (FAILED(hr)) {
- if (!m_sps.IsEmpty()) {
- spu* sp = m_sps.GetTail();
- sp->SetCount(sp->GetCount() + len);
- memcpy(sp->GetData() + sp->GetCount() - len, pDataIn, len);
- }
- } else {
- POSITION pos = m_sps.GetTailPosition();
- while (pos) {
- spu* sp = m_sps.GetPrev(pos);
- if (sp->m_rtStop == _I64_MAX) {
- sp->m_rtStop = rtStart;
- break;
- }
- }
+ if (FAILED(hr)) {
+ if (!m_sps.IsEmpty()) {
+ spu* sp = m_sps.GetTail();
+ sp->SetCount(sp->GetCount() + len);
+ memcpy(sp->GetData() + sp->GetCount() - len, pDataIn, len);
+ }
+ } else {
+ POSITION pos = m_sps.GetTailPosition();
+ while (pos) {
+ spu* sp = m_sps.GetPrev(pos);
+ if (sp->m_rtStop == _I64_MAX) {
+ sp->m_rtStop = rtStart;
+ break;
+ }
+ }
- CAutoPtr<spu> p;
+ CAutoPtr<spu> p;
- if (m_mt.subtype == MEDIASUBTYPE_DVD_SUBPICTURE) {
- p.Attach(DNew dvdspu());
- } else if (m_mt.subtype == MEDIASUBTYPE_CVD_SUBPICTURE) {
- p.Attach(DNew cvdspu());
- } else if (m_mt.subtype == MEDIASUBTYPE_SVCD_SUBPICTURE) {
- p.Attach(DNew svcdspu());
- } else {
- return E_FAIL;
- }
+ if (m_mt.subtype == MEDIASUBTYPE_DVD_SUBPICTURE) {
+ p.Attach(DNew dvdspu());
+ } else if (m_mt.subtype == MEDIASUBTYPE_CVD_SUBPICTURE) {
+ p.Attach(DNew cvdspu());
+ } else if (m_mt.subtype == MEDIASUBTYPE_SVCD_SUBPICTURE) {
+ p.Attach(DNew svcdspu());
+ } else {
+ return E_FAIL;
+ }
- p->m_rtStart = rtStart;
- p->m_rtStop = _I64_MAX;
+ p->m_rtStart = rtStart;
+ p->m_rtStop = _I64_MAX;
- p->SetCount(len);
- memcpy(p->GetData(), pDataIn, len);
+ p->SetCount(len);
+ memcpy(p->GetData(), pDataIn, len);
- if (m_sphli && p->m_rtStart == PTS2RT(m_sphli->StartPTM)) {
- p->m_psphli = m_sphli;
- fRefresh = true;
- }
+ if (m_sphli && p->m_rtStart == PTS2RT(m_sphli->StartPTM)) {
+ p->m_psphli = m_sphli;
+ fRefresh = true;
+ }
- m_sps.AddTail(p);
- }
+ m_sps.AddTail(p);
+ }
- if (!m_sps.IsEmpty()) {
- m_sps.GetTail()->Parse();
- }
+ if (!m_sps.IsEmpty()) {
+ m_sps.GetTail()->Parse();
+ }
- if (fRefresh) {
- //((CMpeg2DecFilter*)m_pFilter)->Deliver(true);
- }
+ if (fRefresh) {
+ //((CMpeg2DecFilter*)m_pFilter)->Deliver(true);
+ }
- return S_FALSE;
+ return S_FALSE;
}
STDMETHODIMP CSubpicInputPin::EndFlush()
{
- CAutoLock cAutoLock(&m_csReceive);
- m_sps.RemoveAll();
- return S_OK;
+ CAutoLock cAutoLock(&m_csReceive);
+ m_sps.RemoveAll();
+ return S_OK;
}
// IKsPropertySet
STDMETHODIMP CSubpicInputPin::Set(REFGUID PropSet, ULONG Id, LPVOID pInstanceData, ULONG InstanceLength, LPVOID pPropertyData, ULONG DataLength)
{
- if (PropSet != AM_KSPROPSETID_DvdSubPic) {
- return __super::Set(PropSet, Id, pInstanceData, InstanceLength, pPropertyData, DataLength);
- }
-
- bool fRefresh = false;
-
- switch (Id) {
- case AM_PROPERTY_DVDSUBPIC_PALETTE: {
- CAutoLock cAutoLock(&m_csReceive);
-
- AM_PROPERTY_SPPAL* pSPPAL = (AM_PROPERTY_SPPAL*)pPropertyData;
- memcpy(m_sppal, pSPPAL->sppal, sizeof(AM_PROPERTY_SPPAL));
- m_fsppal = true;
-
- DbgLog((LOG_TRACE, 0, _T("new palette")));
- }
- break;
- case AM_PROPERTY_DVDSUBPIC_HLI: {
- CAutoLock cAutoLock(&m_csReceive);
-
- AM_PROPERTY_SPHLI* pSPHLI = (AM_PROPERTY_SPHLI*)pPropertyData;
-
- m_sphli.Free();
-
- if (pSPHLI->HLISS) {
- POSITION pos = m_sps.GetHeadPosition();
- while (pos) {
- spu* sp = m_sps.GetNext(pos);
- if (sp->m_rtStart <= PTS2RT(pSPHLI->StartPTM) && PTS2RT(pSPHLI->StartPTM) < sp->m_rtStop) {
- fRefresh = true;
- sp->m_psphli.Free();
- sp->m_psphli.Attach(DNew AM_PROPERTY_SPHLI);
- memcpy((AM_PROPERTY_SPHLI*)sp->m_psphli, pSPHLI, sizeof(AM_PROPERTY_SPHLI));
- }
- }
-
- if (!fRefresh) { // save it for later, a subpic might be late for this hli
- m_sphli.Attach(DNew AM_PROPERTY_SPHLI);
- memcpy((AM_PROPERTY_SPHLI*)m_sphli, pSPHLI, sizeof(AM_PROPERTY_SPHLI));
- }
- } else {
- POSITION pos = m_sps.GetHeadPosition();
- while (pos) {
- spu* sp = m_sps.GetNext(pos);
- fRefresh |= !!sp->m_psphli;
- sp->m_psphli.Free();
- }
- }
-
- if (pSPHLI->HLISS)
- DbgLog((LOG_TRACE, 0, _T("hli: %I64d - %I64d, (%d,%d) - (%d,%d)"),
- PTS2RT(pSPHLI->StartPTM)/10000, PTS2RT(pSPHLI->EndPTM)/10000,
- pSPHLI->StartX, pSPHLI->StartY, pSPHLI->StopX, pSPHLI->StopY));
- }
- break;
- case AM_PROPERTY_DVDSUBPIC_COMPOSIT_ON: {
- CAutoLock cAutoLock(&m_csReceive);
-
- AM_PROPERTY_COMPOSIT_ON* pCompositOn = (AM_PROPERTY_COMPOSIT_ON*)pPropertyData;
- m_spon = *pCompositOn;
- }
- break;
- default:
- return E_PROP_ID_UNSUPPORTED;
- }
-
- if (fRefresh) {
- (static_cast<CMpeg2DecFilter*>(m_pFilter))->Deliver(true);
- }
-
- return S_OK;
+ if (PropSet != AM_KSPROPSETID_DvdSubPic) {
+ return __super::Set(PropSet, Id, pInstanceData, InstanceLength, pPropertyData, DataLength);
+ }
+
+ bool fRefresh = false;
+
+ switch (Id) {
+ case AM_PROPERTY_DVDSUBPIC_PALETTE: {
+ CAutoLock cAutoLock(&m_csReceive);
+
+ AM_PROPERTY_SPPAL* pSPPAL = (AM_PROPERTY_SPPAL*)pPropertyData;
+ memcpy(m_sppal, pSPPAL->sppal, sizeof(AM_PROPERTY_SPPAL));
+ m_fsppal = true;
+
+ DbgLog((LOG_TRACE, 0, _T("new palette")));
+ }
+ break;
+ case AM_PROPERTY_DVDSUBPIC_HLI: {
+ CAutoLock cAutoLock(&m_csReceive);
+
+ AM_PROPERTY_SPHLI* pSPHLI = (AM_PROPERTY_SPHLI*)pPropertyData;
+
+ m_sphli.Free();
+
+ if (pSPHLI->HLISS) {
+ POSITION pos = m_sps.GetHeadPosition();
+ while (pos) {
+ spu* sp = m_sps.GetNext(pos);
+ if (sp->m_rtStart <= PTS2RT(pSPHLI->StartPTM) && PTS2RT(pSPHLI->StartPTM) < sp->m_rtStop) {
+ fRefresh = true;
+ sp->m_psphli.Free();
+ sp->m_psphli.Attach(DNew AM_PROPERTY_SPHLI);
+ memcpy((AM_PROPERTY_SPHLI*)sp->m_psphli, pSPHLI, sizeof(AM_PROPERTY_SPHLI));
+ }
+ }
+
+ if (!fRefresh) { // save it for later, a subpic might be late for this hli
+ m_sphli.Attach(DNew AM_PROPERTY_SPHLI);
+ memcpy((AM_PROPERTY_SPHLI*)m_sphli, pSPHLI, sizeof(AM_PROPERTY_SPHLI));
+ }
+ } else {
+ POSITION pos = m_sps.GetHeadPosition();
+ while (pos) {
+ spu* sp = m_sps.GetNext(pos);
+ fRefresh |= !!sp->m_psphli;
+ sp->m_psphli.Free();
+ }
+ }
+
+ if (pSPHLI->HLISS)
+ DbgLog((LOG_TRACE, 0, _T("hli: %I64d - %I64d, (%d,%d) - (%d,%d)"),
+ PTS2RT(pSPHLI->StartPTM) / 10000, PTS2RT(pSPHLI->EndPTM) / 10000,
+ pSPHLI->StartX, pSPHLI->StartY, pSPHLI->StopX, pSPHLI->StopY));
+ }
+ break;
+ case AM_PROPERTY_DVDSUBPIC_COMPOSIT_ON: {
+ CAutoLock cAutoLock(&m_csReceive);
+
+ AM_PROPERTY_COMPOSIT_ON* pCompositOn = (AM_PROPERTY_COMPOSIT_ON*)pPropertyData;
+ m_spon = *pCompositOn;
+ }
+ break;
+ default:
+ return E_PROP_ID_UNSUPPORTED;
+ }
+
+ if (fRefresh) {
+ (static_cast<CMpeg2DecFilter*>(m_pFilter))->Deliver(true);
+ }
+
+ return S_OK;
}
STDMETHODIMP CSubpicInputPin::QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport)
{
- if (PropSet != AM_KSPROPSETID_DvdSubPic) {
- return __super::QuerySupported(PropSet, Id, pTypeSupport);
- }
+ if (PropSet != AM_KSPROPSETID_DvdSubPic) {
+ return __super::QuerySupported(PropSet, Id, pTypeSupport);
+ }
- switch (Id) {
- case AM_PROPERTY_DVDSUBPIC_PALETTE:
- *pTypeSupport = KSPROPERTY_SUPPORT_SET;
- break;
- case AM_PROPERTY_DVDSUBPIC_HLI:
- *pTypeSupport = KSPROPERTY_SUPPORT_SET;
- break;
- case AM_PROPERTY_DVDSUBPIC_COMPOSIT_ON:
- *pTypeSupport = KSPROPERTY_SUPPORT_SET;
- break;
- default:
- return E_PROP_ID_UNSUPPORTED;
- }
+ switch (Id) {
+ case AM_PROPERTY_DVDSUBPIC_PALETTE:
+ *pTypeSupport = KSPROPERTY_SUPPORT_SET;
+ break;
+ case AM_PROPERTY_DVDSUBPIC_HLI:
+ *pTypeSupport = KSPROPERTY_SUPPORT_SET;
+ break;
+ case AM_PROPERTY_DVDSUBPIC_COMPOSIT_ON:
+ *pTypeSupport = KSPROPERTY_SUPPORT_SET;
+ break;
+ default:
+ return E_PROP_ID_UNSUPPORTED;
+ }
- return S_OK;
+ return S_OK;
}
// CSubpicInputPin::spu
static __inline BYTE GetNibble(BYTE* p, DWORD* offset, int& nField, int& fAligned)
{
- BYTE ret = (p[offset[nField]] >> (fAligned << 2)) & 0x0f;
- offset[nField] += 1-fAligned;
- fAligned = !fAligned;
- return ret;
+ BYTE ret = (p[offset[nField]] >> (fAligned << 2)) & 0x0f;
+ offset[nField] += 1 - fAligned;
+ fAligned = !fAligned;
+ return ret;
}
static __inline BYTE GetHalfNibble(BYTE* p, DWORD* offset, int& nField, int& n)
{
- BYTE ret = (p[offset[nField]] >> (n << 1)) & 0x03;
- if (!n) {
- offset[nField]++;
- }
- n = (n-1+4)&3;
- return ret;
+ BYTE ret = (p[offset[nField]] >> (n << 1)) & 0x03;
+ if (!n) {
+ offset[nField]++;
+ }
+ n = (n - 1 + 4) & 3;
+ return ret;
}
static __inline void DrawPixel(BYTE** yuv, CPoint pt, int pitch, AM_DVD_YUV& c)
{
- if (c.Reserved == 0) {
- return;
- }
+ if (c.Reserved == 0) {
+ return;
+ }
- BYTE* p = &yuv[0][pt.y*pitch + pt.x];
- //*p = (*p*(15-contrast) + sppal[color].Y*contrast)>>4;
- *p -= (*p - c.Y) * c.Reserved >> 4;
+ BYTE* p = &yuv[0][pt.y * pitch + pt.x];
+ //*p = (*p*(15-contrast) + sppal[color].Y*contrast)>>4;
+ *p -= (*p - c.Y) * c.Reserved >> 4;
- if (pt.y&1) {
- return; // since U/V is half res there is no need to overwrite the same line again
- }
+ if (pt.y & 1) {
+ return; // since U/V is half res there is no need to overwrite the same line again
+ }
- pt.x = (pt.x + 1) / 2;
- pt.y = (pt.y /*+ 1*/) / 2; // only paint the upper field always, don't round it
- pitch /= 2;
+ pt.x = (pt.x + 1) / 2;
+ pt.y = (pt.y /*+ 1*/) / 2; // only paint the upper field always, don't round it
+ pitch /= 2;
- // U/V is exchanged? wierd but looks true when comparing the outputted colors from other decoders
+ // U/V is exchanged? wierd but looks true when comparing the outputted colors from other decoders
- p = &yuv[1][pt.y*pitch + pt.x];
- //*p = (BYTE)(((((int)*p-0x80)*(15-contrast) + ((int)sppal[color].V-0x80)*contrast) >> 4) + 0x80);
- *p -= (*p - c.V) * c.Reserved >> 4;
+ p = &yuv[1][pt.y * pitch + pt.x];
+ //*p = (BYTE)(((((int)*p-0x80)*(15-contrast) + ((int)sppal[color].V-0x80)*contrast) >> 4) + 0x80);
+ *p -= (*p - c.V) * c.Reserved >> 4;
- p = &yuv[2][pt.y*pitch + pt.x];
- //*p = (BYTE)(((((int)*p-0x80)*(15-contrast) + ((int)sppal[color].U-0x80)*contrast) >> 4) + 0x80);
- *p -= (*p - c.U) * c.Reserved >> 4;
+ p = &yuv[2][pt.y * pitch + pt.x];
+ //*p = (BYTE)(((((int)*p-0x80)*(15-contrast) + ((int)sppal[color].U-0x80)*contrast) >> 4) + 0x80);
+ *p -= (*p - c.U) * c.Reserved >> 4;
- // Neighter of the blending formulas are accurate (">>4" should be "/15").
- // Even though the second one is a bit worse, since we are scaling the difference only,
- // the error is still not noticable.
+ // Neighter of the blending formulas are accurate (">>4" should be "/15").
+ // Even though the second one is a bit worse, since we are scaling the difference only,
+ // the error is still not noticable.
}
static __inline void DrawPixels(BYTE** yuv, int pitch, CPoint pt, int len, AM_DVD_YUV& c, CRect& rc)
{
- if (pt.y < rc.top || pt.y >= rc.bottom) {
- return;
- }
- if (pt.x < rc.left) {
- len -= rc.left - pt.x;
- pt.x = rc.left;
- }
- if (pt.x + len > rc.right) {
- len = rc.right - pt.x;
- }
- if (len <= 0 || pt.x >= rc.right) {
- return;
- }
-
- if (c.Reserved == 0) {
- if (rc.IsRectEmpty()) {
- return;
- }
-
- if (pt.y < rc.top || pt.y >= rc.bottom
- || pt.x+len < rc.left || pt.x >= rc.right) {
- return;
- }
- }
-
- while (len-- > 0) {
- DrawPixel(yuv, pt, pitch, c);
- pt.x++;
- }
+ if (pt.y < rc.top || pt.y >= rc.bottom) {
+ return;
+ }
+ if (pt.x < rc.left) {
+ len -= rc.left - pt.x;
+ pt.x = rc.left;
+ }
+ if (pt.x + len > rc.right) {
+ len = rc.right - pt.x;
+ }
+ if (len <= 0 || pt.x >= rc.right) {
+ return;
+ }
+
+ if (c.Reserved == 0) {
+ if (rc.IsRectEmpty()) {
+ return;
+ }
+
+ if (pt.y < rc.top || pt.y >= rc.bottom
+ || pt.x + len < rc.left || pt.x >= rc.right) {
+ return;
+ }
+ }
+
+ while (len-- > 0) {
+ DrawPixel(yuv, pt, pitch, c);
+ pt.x++;
+ }
}
// CSubpicInputPin::dvdspu
bool CSubpicInputPin::dvdspu::Parse()
{
- m_offsets.RemoveAll();
+ m_offsets.RemoveAll();
- BYTE* p = GetData();
+ BYTE* p = GetData();
- WORD packetsize = (p[0]<<8)|p[1];
- WORD datasize = (p[2]<<8)|p[3];
+ WORD packetsize = (p[0] << 8) | p[1];
+ WORD datasize = (p[2] << 8) | p[3];
- if (packetsize > GetCount() || datasize > packetsize) {
- return false;
- }
+ if (packetsize > GetCount() || datasize > packetsize) {
+ return false;
+ }
- int i, next = datasize;
+ int i, next = datasize;
#define GetWORD (p[i]<<8)|p[i+1]; i += 2
- do {
- i = next;
-
- int pts = GetWORD;
- next = GetWORD;
-
- if (next > packetsize || next < datasize) {
- return false;
- }
-
- REFERENCE_TIME rt = m_rtStart + 1024*PTS2RT(pts);
-
- for (bool fBreak = false; !fBreak; ) {
- int len = 0;
-
- switch (p[i]) {
- case 0x00:
- len = 0;
- break;
- case 0x01:
- len = 0;
- break;
- case 0x02:
- len = 0;
- break;
- case 0x03:
- len = 2;
- break;
- case 0x04:
- len = 2;
- break;
- case 0x05:
- len = 6;
- break;
- case 0x06:
- len = 4;
- break;
- case 0x07:
- len = 0;
- break; // TODO
- default:
- len = 0;
- break;
- }
-
- if (i+len >= packetsize) {
- TRACE(_T("Warning: Wrong subpicture parameter block ending\n"));
- break;
- }
-
- switch (p[i++]) {
- case 0x00: // forced start displaying
- m_fForced = true;
- break;
- case 0x01: // normal start displaying
- m_fForced = false;
- break;
- case 0x02: // stop displaying
- m_rtStop = rt;
- break;
- case 0x03:
- m_sphli.ColCon.emph2col = p[i]>>4;
- m_sphli.ColCon.emph1col = p[i]&0xf;
- m_sphli.ColCon.patcol = p[i+1]>>4;
- m_sphli.ColCon.backcol = p[i+1]&0xf;
- i += 2;
- break;
- case 0x04:
- m_sphli.ColCon.emph2con = p[i]>>4;
- m_sphli.ColCon.emph1con = p[i]&0xf;
- m_sphli.ColCon.patcon = p[i+1]>>4;
- m_sphli.ColCon.backcon = p[i+1]&0xf;
- i += 2;
- break;
- case 0x05:
- m_sphli.StartX = (p[i]<<4) + (p[i+1]>>4);
- m_sphli.StopX = ((p[i+1]&0x0f)<<8) + p[i+2]+1;
- m_sphli.StartY = (p[i+3]<<4) + (p[i+4]>>4);
- m_sphli.StopY = ((p[i+4]&0x0f)<<8) + p[i+5]+1;
- i += 6;
- break;
- case 0x06:
- m_offset[0] = GetWORD;
- m_offset[1] = GetWORD;
- break;
- case 0x07:
- // TODO
- break;
- case 0xff: // end of ctrlblk
- fBreak = true;
- continue;
- default: // skip this ctrlblk
- fBreak = true;
- break;
- }
- }
-
- offset_t o = {rt, m_sphli};
- m_offsets.AddTail(o); // is it always going to be sorted?
- } while (i <= next && i < packetsize);
-
- return true;
+ do {
+ i = next;
+
+ int pts = GetWORD;
+ next = GetWORD;
+
+ if (next > packetsize || next < datasize) {
+ return false;
+ }
+
+ REFERENCE_TIME rt = m_rtStart + 1024 * PTS2RT(pts);
+
+ for (bool fBreak = false; !fBreak;) {
+ int len = 0;
+
+ switch (p[i]) {
+ case 0x00:
+ len = 0;
+ break;
+ case 0x01:
+ len = 0;
+ break;
+ case 0x02:
+ len = 0;
+ break;
+ case 0x03:
+ len = 2;
+ break;
+ case 0x04:
+ len = 2;
+ break;
+ case 0x05:
+ len = 6;
+ break;
+ case 0x06:
+ len = 4;
+ break;
+ case 0x07:
+ len = 0;
+ break; // TODO
+ default:
+ len = 0;
+ break;
+ }
+
+ if (i + len >= packetsize) {
+ TRACE(_T("Warning: Wrong subpicture parameter block ending\n"));
+ break;
+ }
+
+ switch (p[i++]) {
+ case 0x00: // forced start displaying
+ m_fForced = true;
+ break;
+ case 0x01: // normal start displaying
+ m_fForced = false;
+ break;
+ case 0x02: // stop displaying
+ m_rtStop = rt;
+ break;
+ case 0x03:
+ m_sphli.ColCon.emph2col = p[i] >> 4;
+ m_sphli.ColCon.emph1col = p[i] & 0xf;
+ m_sphli.ColCon.patcol = p[i + 1] >> 4;
+ m_sphli.ColCon.backcol = p[i + 1] & 0xf;
+ i += 2;
+ break;
+ case 0x04:
+ m_sphli.ColCon.emph2con = p[i] >> 4;
+ m_sphli.ColCon.emph1con = p[i] & 0xf;
+ m_sphli.ColCon.patcon = p[i + 1] >> 4;
+ m_sphli.ColCon.backcon = p[i + 1] & 0xf;
+ i += 2;
+ break;
+ case 0x05:
+ m_sphli.StartX = (p[i] << 4) + (p[i + 1] >> 4);
+ m_sphli.StopX = ((p[i + 1] & 0x0f) << 8) + p[i + 2] + 1;
+ m_sphli.StartY = (p[i + 3] << 4) + (p[i + 4] >> 4);
+ m_sphli.StopY = ((p[i + 4] & 0x0f) << 8) + p[i + 5] + 1;
+ i += 6;
+ break;
+ case 0x06:
+ m_offset[0] = GetWORD;
+ m_offset[1] = GetWORD;
+ break;
+ case 0x07:
+ // TODO
+ break;
+ case 0xff: // end of ctrlblk
+ fBreak = true;
+ continue;
+ default: // skip this ctrlblk
+ fBreak = true;
+ break;
+ }
+ }
+
+ offset_t o = {rt, m_sphli};
+ m_offsets.AddTail(o); // is it always going to be sorted?
+ } while (i <= next && i < packetsize);
+
+ return true;
}
void CSubpicInputPin::dvdspu::Render(REFERENCE_TIME rt, BYTE** yuv, int w, int h, AM_DVD_YUV* sppal, bool fsppal)
{
- BYTE* p = GetData();
- DWORD offset[2] = {m_offset[0], m_offset[1]};
-
- AM_PROPERTY_SPHLI sphli = m_sphli;
- CPoint pt(sphli.StartX, sphli.StartY);
- CRect rc(pt, CPoint(sphli.StopX, sphli.StopY));
-
- CRect rcclip(0, 0, w, h);
- rcclip &= rc;
-
- if (m_psphli) {
- rcclip &= CRect(m_psphli->StartX, m_psphli->StartY, m_psphli->StopX, m_psphli->StopY);
- sphli = *m_psphli;
- } else if (m_offsets.GetCount() > 1) {
- POSITION pos = m_offsets.GetTailPosition();
- while (pos) {
- const offset_t& o = m_offsets.GetPrev(pos);
- if (rt >= o.rt) {
- sphli = o.sphli;
- break;
- }
- }
- }
-
- AM_DVD_YUV pal[4];
- pal[0] = sppal[fsppal ? sphli.ColCon.backcol : 0];
- pal[0].Reserved = sphli.ColCon.backcon;
- pal[1] = sppal[fsppal ? sphli.ColCon.patcol : 1];
- pal[1].Reserved = sphli.ColCon.patcon;
- pal[2] = sppal[fsppal ? sphli.ColCon.emph1col : 2];
- pal[2].Reserved = sphli.ColCon.emph1con;
- pal[3] = sppal[fsppal ? sphli.ColCon.emph2col : 3];
- pal[3].Reserved = sphli.ColCon.emph2con;
-
- int nField = 0;
- int fAligned = 1;
-
- DWORD end[2] = {offset[1], (p[2]<<8)|p[3]};
-
- while ((nField == 0 && offset[0] < end[0]) || (nField == 1 && offset[1] < end[1])) {
- DWORD code;
-
- if ((code = GetNibble(p, offset, nField, fAligned)) >= 0x4
- || (code = (code << 4) | GetNibble(p, offset, nField, fAligned)) >= 0x10
- || (code = (code << 4) | GetNibble(p, offset, nField, fAligned)) >= 0x40
- || (code = (code << 4) | GetNibble(p, offset, nField, fAligned)) >= 0x100) {
- DrawPixels(yuv, w, pt, code >> 2, pal[code&3], rcclip);
- if ((pt.x += code >> 2) < rc.right) {
- continue;
- }
- }
-
- DrawPixels(yuv, w, pt, rc.right - pt.x, pal[code&3], rcclip);
-
- if (!fAligned) {
- GetNibble(p, offset, nField, fAligned); // align to byte
- }
-
- pt.x = rc.left;
- pt.y++;
- nField = 1 - nField;
- }
+ BYTE* p = GetData();
+ DWORD offset[2] = {m_offset[0], m_offset[1]};
+
+ AM_PROPERTY_SPHLI sphli = m_sphli;
+ CPoint pt(sphli.StartX, sphli.StartY);
+ CRect rc(pt, CPoint(sphli.StopX, sphli.StopY));
+
+ CRect rcclip(0, 0, w, h);
+ rcclip &= rc;
+
+ if (m_psphli) {
+ rcclip &= CRect(m_psphli->StartX, m_psphli->StartY, m_psphli->StopX, m_psphli->StopY);
+ sphli = *m_psphli;
+ } else if (m_offsets.GetCount() > 1) {
+ POSITION pos = m_offsets.GetTailPosition();
+ while (pos) {
+ const offset_t& o = m_offsets.GetPrev(pos);
+ if (rt >= o.rt) {
+ sphli = o.sphli;
+ break;
+ }
+ }
+ }
+
+ AM_DVD_YUV pal[4];
+ pal[0] = sppal[fsppal ? sphli.ColCon.backcol : 0];
+ pal[0].Reserved = sphli.ColCon.backcon;
+ pal[1] = sppal[fsppal ? sphli.ColCon.patcol : 1];
+ pal[1].Reserved = sphli.ColCon.patcon;
+ pal[2] = sppal[fsppal ? sphli.ColCon.emph1col : 2];
+ pal[2].Reserved = sphli.ColCon.emph1con;
+ pal[3] = sppal[fsppal ? sphli.ColCon.emph2col : 3];
+ pal[3].Reserved = sphli.ColCon.emph2con;
+
+ int nField = 0;
+ int fAligned = 1;
+
+ DWORD end[2] = {offset[1], (p[2] << 8) | p[3]};
+
+ while ((nField == 0 && offset[0] < end[0]) || (nField == 1 && offset[1] < end[1])) {
+ DWORD code;
+
+ if ((code = GetNibble(p, offset, nField, fAligned)) >= 0x4
+ || (code = (code << 4) | GetNibble(p, offset, nField, fAligned)) >= 0x10
+ || (code = (code << 4) | GetNibble(p, offset, nField, fAligned)) >= 0x40
+ || (code = (code << 4) | GetNibble(p, offset, nField, fAligned)) >= 0x100) {
+ DrawPixels(yuv, w, pt, code >> 2, pal[code & 3], rcclip);
+ if ((pt.x += code >> 2) < rc.right) {
+ continue;
+ }
+ }
+
+ DrawPixels(yuv, w, pt, rc.right - pt.x, pal[code & 3], rcclip);
+
+ if (!fAligned) {
+ GetNibble(p, offset, nField, fAligned); // align to byte
+ }
+
+ pt.x = rc.left;
+ pt.y++;
+ nField = 1 - nField;
+ }
}
// CSubpicInputPin::cvdspu
bool CSubpicInputPin::cvdspu::Parse()
{
- BYTE* p = GetData();
-
- WORD packetsize = (p[0]<<8)|p[1];
- WORD datasize = (p[2]<<8)|p[3];
-
- if (packetsize > GetCount() || datasize > packetsize) {
- return false;
- }
-
- p = GetData() + datasize;
-
- for (int i = datasize, j = packetsize-4; i <= j; i+=4, p+=4) {
- switch (p[0]) {
- case 0x0c:
- break;
- case 0x04:
- m_rtStop = m_rtStart + 10000i64*((p[1]<<16)|(p[2]<<8)|p[3])/90;
- break;
- case 0x17:
- m_sphli.StartX = ((p[1]&0x0f)<<6) + (p[2]>>2);
- m_sphli.StartY = ((p[2]&0x03)<<8) + p[3];
- break;
- case 0x1f:
- m_sphli.StopX = ((p[1]&0x0f)<<6) + (p[2]>>2);
- m_sphli.StopY = ((p[2]&0x03)<<8) + p[3];
- break;
- case 0x24:
- case 0x25:
- case 0x26:
- case 0x27:
- m_sppal[0][p[0]-0x24].Y = p[1];
- m_sppal[0][p[0]-0x24].U = p[2];
- m_sppal[0][p[0]-0x24].V = p[3];
- break;
- case 0x2c:
- case 0x2d:
- case 0x2e:
- case 0x2f:
- m_sppal[1][p[0]-0x2c].Y = p[1];
- m_sppal[1][p[0]-0x2c].U = p[2];
- m_sppal[1][p[0]-0x2c].V = p[3];
- break;
- case 0x37:
- m_sppal[0][3].Reserved = p[2]>>4;
- m_sppal[0][2].Reserved = p[2]&0xf;
- m_sppal[0][1].Reserved = p[3]>>4;
- m_sppal[0][0].Reserved = p[3]&0xf;
- break;
- case 0x3f:
- m_sppal[1][3].Reserved = p[2]>>4;
- m_sppal[1][2].Reserved = p[2]&0xf;
- m_sppal[1][1].Reserved = p[3]>>4;
- m_sppal[1][0].Reserved = p[3]&0xf;
- break;
- case 0x47:
- m_offset[0] = (p[2]<<8)|p[3];
- break;
- case 0x4f:
- m_offset[1] = (p[2]<<8)|p[3];
- break;
- default:
- break;
- }
- }
-
- return true;
+ BYTE* p = GetData();
+
+ WORD packetsize = (p[0] << 8) | p[1];
+ WORD datasize = (p[2] << 8) | p[3];
+
+ if (packetsize > GetCount() || datasize > packetsize) {
+ return false;
+ }
+
+ p = GetData() + datasize;
+
+ for (int i = datasize, j = packetsize - 4; i <= j; i += 4, p += 4) {
+ switch (p[0]) {
+ case 0x0c:
+ break;
+ case 0x04:
+ m_rtStop = m_rtStart + 10000i64 * ((p[1] << 16) | (p[2] << 8) | p[3]) / 90;
+ break;
+ case 0x17:
+ m_sphli.StartX = ((p[1] & 0x0f) << 6) + (p[2] >> 2);
+ m_sphli.StartY = ((p[2] & 0x03) << 8) + p[3];
+ break;
+ case 0x1f:
+ m_sphli.StopX = ((p[1] & 0x0f) << 6) + (p[2] >> 2);
+ m_sphli.StopY = ((p[2] & 0x03) << 8) + p[3];
+ break;
+ case 0x24:
+ case 0x25:
+ case 0x26:
+ case 0x27:
+ m_sppal[0][p[0] - 0x24].Y = p[1];
+ m_sppal[0][p[0] - 0x24].U = p[2];
+ m_sppal[0][p[0] - 0x24].V = p[3];
+ break;
+ case 0x2c:
+ case 0x2d:
+ case 0x2e:
+ case 0x2f:
+ m_sppal[1][p[0] - 0x2c].Y = p[1];
+ m_sppal[1][p[0] - 0x2c].U = p[2];
+ m_sppal[1][p[0] - 0x2c].V = p[3];
+ break;
+ case 0x37:
+ m_sppal[0][3].Reserved = p[2] >> 4;
+ m_sppal[0][2].Reserved = p[2] & 0xf;
+ m_sppal[0][1].Reserved = p[3] >> 4;
+ m_sppal[0][0].Reserved = p[3] & 0xf;
+ break;
+ case 0x3f:
+ m_sppal[1][3].Reserved = p[2] >> 4;
+ m_sppal[1][2].Reserved = p[2] & 0xf;
+ m_sppal[1][1].Reserved = p[3] >> 4;
+ m_sppal[1][0].Reserved = p[3] & 0xf;
+ break;
+ case 0x47:
+ m_offset[0] = (p[2] << 8) | p[3];
+ break;
+ case 0x4f:
+ m_offset[1] = (p[2] << 8) | p[3];
+ break;
+ default:
+ break;
+ }
+ }
+
+ return true;
}
void CSubpicInputPin::cvdspu::Render(REFERENCE_TIME rt, BYTE** yuv, int w, int h, AM_DVD_YUV* sppal, bool fsppal)
{
- BYTE* p = GetData();
- DWORD offset[2] = {m_offset[0], m_offset[1]};
+ BYTE* p = GetData();
+ DWORD offset[2] = {m_offset[0], m_offset[1]};
- CRect rcclip(0, 0, w, h);
+ CRect rcclip(0, 0, w, h);
- /* FIXME: startx/y looks to be wrong in the sample I tested
- CPoint pt(m_sphli.StartX, m_sphli.StartY);
- CRect rc(pt, CPoint(m_sphli.StopX, m_sphli.StopY));
- */
+ /* FIXME: startx/y looks to be wrong in the sample I tested
+ CPoint pt(m_sphli.StartX, m_sphli.StartY);
+ CRect rc(pt, CPoint(m_sphli.StopX, m_sphli.StopY));
+ */
- CSize size(m_sphli.StopX - m_sphli.StartX, m_sphli.StopY - m_sphli.StartY);
- CPoint pt((rcclip.Width() - size.cx) / 2, (rcclip.Height()*3 - size.cy*1) / 4);
- CRect rc(pt, size);
+ CSize size(m_sphli.StopX - m_sphli.StartX, m_sphli.StopY - m_sphli.StartY);
+ CPoint pt((rcclip.Width() - size.cx) / 2, (rcclip.Height() * 3 - size.cy * 1) / 4);
+ CRect rc(pt, size);
- int nField = 0;
- int fAligned = 1;
+ int nField = 0;
+ int fAligned = 1;
- DWORD end[2] = {offset[1], (p[2]<<8)|p[3]};
+ DWORD end[2] = {offset[1], (p[2] << 8) | p[3]};
- while ((nField == 0 && offset[0] < end[0]) || (nField == 1 && offset[1] < end[1])) {
- BYTE code;
+ while ((nField == 0 && offset[0] < end[0]) || (nField == 1 && offset[1] < end[1])) {
+ BYTE code;
- if ((code = GetNibble(p, offset, nField, fAligned)) >= 0x4) {
- DrawPixels(yuv, w, pt, code >> 2, m_sppal[0][code&3], rcclip);
- pt.x += code >> 2;
- continue;
- }
+ if ((code = GetNibble(p, offset, nField, fAligned)) >= 0x4) {
+ DrawPixels(yuv, w, pt, code >> 2, m_sppal[0][code & 3], rcclip);
+ pt.x += code >> 2;
+ continue;
+ }
- code = GetNibble(p, offset, nField, fAligned);
- DrawPixels(yuv, w, pt, rc.right - pt.x, m_sppal[0][code&3], rcclip);
+ code = GetNibble(p, offset, nField, fAligned);
+ DrawPixels(yuv, w, pt, rc.right - pt.x, m_sppal[0][code & 3], rcclip);
- if (!fAligned) {
- GetNibble(p, offset, nField, fAligned); // align to byte
- }
+ if (!fAligned) {
+ GetNibble(p, offset, nField, fAligned); // align to byte
+ }
- pt.x = rc.left;
- pt.y++;
- nField = 1 - nField;
- }
+ pt.x = rc.left;
+ pt.y++;
+ nField = 1 - nField;
+ }
}
// CSubpicInputPin::svcdspu
bool CSubpicInputPin::svcdspu::Parse()
{
- BYTE* p = GetData();
- BYTE* p0 = p;
+ BYTE* p = GetData();
+ BYTE* p0 = p;
- if (GetCount() < 2) {
- return false;
- }
+ if (GetCount() < 2) {
+ return false;
+ }
- WORD packetsize = (p[0]<<8)|p[1];
- p += 2;
+ WORD packetsize = (p[0] << 8) | p[1];
+ p += 2;
- if (packetsize > GetCount()) {
- return false;
- }
+ if (packetsize > GetCount()) {
+ return false;
+ }
- bool duration = !!(*p++&0x04);
+ bool duration = !!(*p++ & 0x04);
- *p++; // unknown
+ *p++; // unknown
- if (duration) {
- m_rtStop = m_rtStart + 10000i64*((p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3])/90;
- p += 4;
- }
+ if (duration) {
+ m_rtStop = m_rtStart + 10000i64 * ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]) / 90;
+ p += 4;
+ }
- m_sphli.StartX = m_sphli.StopX = (p[0]<<8)|p[1];
- p += 2;
- m_sphli.StartY = m_sphli.StopY = (p[0]<<8)|p[1];
- p += 2;
- m_sphli.StopX += (p[0]<<8)|p[1];
- p += 2;
- m_sphli.StopY += (p[0]<<8)|p[1];
- p += 2;
+ m_sphli.StartX = m_sphli.StopX = (p[0] << 8) | p[1];
+ p += 2;
+ m_sphli.StartY = m_sphli.StopY = (p[0] << 8) | p[1];
+ p += 2;
+ m_sphli.StopX += (p[0] << 8) | p[1];
+ p += 2;
+ m_sphli.StopY += (p[0] << 8) | p[1];
+ p += 2;
- for (int i = 0; i < 4; i++) {
- m_sppal[i].Y = *p++;
- m_sppal[i].U = *p++;
- m_sppal[i].V = *p++;
- m_sppal[i].Reserved = *p++ >> 4;
- }
+ for (int i = 0; i < 4; i++) {
+ m_sppal[i].Y = *p++;
+ m_sppal[i].U = *p++;
+ m_sppal[i].V = *p++;
+ m_sppal[i].Reserved = *p++ >> 4;
+ }
- if (*p++&0xc0) {
- p += 4; // duration of the shift operation should be here, but it is untested
- }
+ if (*p++ & 0xc0) {
+ p += 4; // duration of the shift operation should be here, but it is untested
+ }
- m_offset[1] = (p[0]<<8)|p[1];
- p += 2;
+ m_offset[1] = (p[0] << 8) | p[1];
+ p += 2;
- m_offset[0] = p - p0;
- m_offset[1] += m_offset[0];
+ m_offset[0] = p - p0;
+ m_offset[1] += m_offset[0];
- return true;
+ return true;
}
void CSubpicInputPin::svcdspu::Render(REFERENCE_TIME rt, BYTE** yuv, int w, int h, AM_DVD_YUV* sppal, bool fsppal)
{
- BYTE* p = GetData();
- DWORD offset[2] = {m_offset[0], m_offset[1]};
+ BYTE* p = GetData();
+ DWORD offset[2] = {m_offset[0], m_offset[1]};
- CRect rcclip(0, 0, w, h);
+ CRect rcclip(0, 0, w, h);
- /* FIXME: startx/y looks to be wrong in the sample I tested (yes, this one too!)
- CPoint pt(m_sphli.StartX, m_sphli.StartY);
- CRect rc(pt, CPoint(m_sphli.StopX, m_sphli.StopY));
- */
+ /* FIXME: startx/y looks to be wrong in the sample I tested (yes, this one too!)
+ CPoint pt(m_sphli.StartX, m_sphli.StartY);
+ CRect rc(pt, CPoint(m_sphli.StopX, m_sphli.StopY));
+ */
- CSize size(m_sphli.StopX - m_sphli.StartX, m_sphli.StopY - m_sphli.StartY);
- CPoint pt((rcclip.Width() - size.cx) / 2, (rcclip.Height()*3 - size.cy*1) / 4);
- CRect rc(pt, size);
+ CSize size(m_sphli.StopX - m_sphli.StartX, m_sphli.StopY - m_sphli.StartY);
+ CPoint pt((rcclip.Width() - size.cx) / 2, (rcclip.Height() * 3 - size.cy * 1) / 4);
+ CRect rc(pt, size);
- int nField = 0;
- int n = 3;
+ int nField = 0;
+ int n = 3;
- DWORD end[2] = {offset[1], (p[2]<<8)|p[3]};
+ DWORD end[2] = {offset[1], (p[2] << 8) | p[3]};
- while ((nField == 0 && offset[0] < end[0]) || (nField == 1 && offset[1] < end[1])) {
- BYTE code = GetHalfNibble(p, offset, nField, n);
- BYTE repeat = 1 + (code == 0 ? GetHalfNibble(p, offset, nField, n) : 0);
+ while ((nField == 0 && offset[0] < end[0]) || (nField == 1 && offset[1] < end[1])) {
+ BYTE code = GetHalfNibble(p, offset, nField, n);
+ BYTE repeat = 1 + (code == 0 ? GetHalfNibble(p, offset, nField, n) : 0);
- DrawPixels(yuv, w, pt, repeat, m_sppal[code&3], rcclip);
- if ((pt.x += repeat) < rc.right) {
- continue;
- }
+ DrawPixels(yuv, w, pt, repeat, m_sppal[code & 3], rcclip);
+ if ((pt.x += repeat) < rc.right) {
+ continue;
+ }
- while (n != 3) {
- GetHalfNibble(p, offset, nField, n); // align to byte
- }
+ while (n != 3) {
+ GetHalfNibble(p, offset, nField, n); // align to byte
+ }
- pt.x = rc.left;
- pt.y++;
- nField = 1 - nField;
- }
+ pt.x = rc.left;
+ pt.y++;
+ nField = 1 - nField;
+ }
}
//
@@ -2357,66 +2357,66 @@ void CSubpicInputPin::svcdspu::Render(REFERENCE_TIME rt, BYTE** yuv, int w, int
//
CClosedCaptionOutputPin::CClosedCaptionOutputPin(CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr)
- : CBaseOutputPin(NAME("CClosedCaptionOutputPin"), pFilter, pLock, phr, L"~CC")
+ : CBaseOutputPin(NAME("CClosedCaptionOutputPin"), pFilter, pLock, phr, L"~CC")
{
}
HRESULT CClosedCaptionOutputPin::CheckMediaType(const CMediaType* mtOut)
{
- return mtOut->majortype == MEDIATYPE_AUXLine21Data && mtOut->subtype == MEDIASUBTYPE_Line21_GOPPacket
- ? S_OK
- : VFW_E_TYPE_NOT_ACCEPTED;
+ return mtOut->majortype == MEDIATYPE_AUXLine21Data && mtOut->subtype == MEDIASUBTYPE_Line21_GOPPacket
+ ? S_OK
+ : VFW_E_TYPE_NOT_ACCEPTED;
}
HRESULT CClosedCaptionOutputPin::GetMediaType(int iPosition, CMediaType* pmt)
{
- if (iPosition < 0) {
- return E_INVALIDARG;
- }
- if (iPosition > 0) {
- return VFW_S_NO_MORE_ITEMS;
- }
+ if (iPosition < 0) {
+ return E_INVALIDARG;
+ }
+ if (iPosition > 0) {
+ return VFW_S_NO_MORE_ITEMS;
+ }
- pmt->InitMediaType();
- pmt->majortype = MEDIATYPE_AUXLine21Data;
- pmt->subtype = MEDIASUBTYPE_Line21_GOPPacket;
- pmt->formattype = FORMAT_None;
+ pmt->InitMediaType();
+ pmt->majortype = MEDIATYPE_AUXLine21Data;
+ pmt->subtype = MEDIASUBTYPE_Line21_GOPPacket;
+ pmt->formattype = FORMAT_None;
- return S_OK;
+ return S_OK;
}
HRESULT CClosedCaptionOutputPin::DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties)
{
- pProperties->cBuffers = 1;
- pProperties->cbBuffer = 2048;
- pProperties->cbAlign = 1;
- pProperties->cbPrefix = 0;
+ pProperties->cBuffers = 1;
+ pProperties->cbBuffer = 2048;
+ pProperties->cbAlign = 1;
+ pProperties->cbPrefix = 0;
- HRESULT hr;
- ALLOCATOR_PROPERTIES Actual;
- if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
- return hr;
- }
+ HRESULT hr;
+ ALLOCATOR_PROPERTIES Actual;
+ if (FAILED(hr = pAllocator->SetProperties(pProperties, &Actual))) {
+ return hr;
+ }
- return pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
- ? E_FAIL
- : NOERROR;
+ return pProperties->cBuffers > Actual.cBuffers || pProperties->cbBuffer > Actual.cbBuffer
+ ? E_FAIL
+ : NOERROR;
}
HRESULT CClosedCaptionOutputPin::Deliver(const void* ptr, int len)
{
- HRESULT hr = S_FALSE;
+ HRESULT hr = S_FALSE;
- if (len > 4 && ptr && *(DWORD*)ptr == 0xf8014343 && IsConnected()) {
- CComPtr<IMediaSample> pSample;
- GetDeliveryBuffer(&pSample, NULL, NULL, 0);
- BYTE* pData = NULL;
- pSample->GetPointer(&pData);
- *(DWORD*)pData = 0xb2010000;
- memcpy(pData + 4, ptr, len);
- pSample->SetActualDataLength(len + 4);
- hr = __super::Deliver(pSample);
- }
+ if (len > 4 && ptr && *(DWORD*)ptr == 0xf8014343 && IsConnected()) {
+ CComPtr<IMediaSample> pSample;
+ GetDeliveryBuffer(&pSample, NULL, NULL, 0);
+ BYTE* pData = NULL;
+ pSample->GetPointer(&pData);
+ *(DWORD*)pData = 0xb2010000;
+ memcpy(pData + 4, ptr, len);
+ pSample->SetActualDataLength(len + 4);
+ hr = __super::Deliver(pSample);
+ }
- return hr;
+ return hr;
}
diff --git a/src/filters/transform/Mpeg2DecFilter/Mpeg2DecFilter.h b/src/filters/transform/Mpeg2DecFilter/Mpeg2DecFilter.h
index f5b4a88a2..713e8cfda 100644
--- a/src/filters/transform/Mpeg2DecFilter/Mpeg2DecFilter.h
+++ b/src/filters/transform/Mpeg2DecFilter/Mpeg2DecFilter.h
@@ -41,296 +41,296 @@ class CClosedCaptionOutputPin;
class CMpeg2Dec;
class __declspec(uuid("39F498AF-1A09-4275-B193-673B0BA3D478"))
- CMpeg2DecFilter
- : public CBaseVideoFilter
- , public IMpeg2DecFilter
- , public ISpecifyPropertyPages2
+ CMpeg2DecFilter
+ : public CBaseVideoFilter
+ , public IMpeg2DecFilter
+ , public ISpecifyPropertyPages2
{
- CSubpicInputPin* m_pSubpicInput;
- CClosedCaptionOutputPin* m_pClosedCaptionOutput;
-
- CAutoPtr<CMpeg2Dec> m_dec;
-
- REFERENCE_TIME m_AvgTimePerFrame;
- bool m_fWaitForKeyFrame;
- bool m_fInitializedBuffer;
- CSize m_par;
-
- struct framebuf {
- int w, h, pitch;
- BYTE* buf_base;
- BYTE* buf[6];
- REFERENCE_TIME rtStart, rtStop;
- DWORD flags;
- ditype di;
- framebuf() {
- w = h = pitch = 0;
- buf_base = NULL;
- memset(&buf, 0, sizeof(buf));
- rtStart = rtStop = 0;
- flags = 0;
- }
- ~framebuf() {
- Free();
- }
- void Alloc(int w, int h, int pitch) {
- this->w = w;
- this->h = h;
- this->pitch = pitch;
- int size = pitch*h;
- buf_base = (BYTE*)_aligned_malloc(size*3+6*32, 32);
- BYTE* p = buf_base;
- buf[0] = p;
- p += (size + 31) & ~31;
- buf[3] = p;
- p += (size + 31) & ~31;
- buf[1] = p;
- p += (size/4 + 31) & ~31;
- buf[4] = p;
- p += (size/4 + 31) & ~31;
- buf[2] = p;
- p += (size/4 + 31) & ~31;
- buf[5] = p;
- p += (size/4 + 31) & ~31;
- }
- void Free() {
- if (buf_base) {
- _aligned_free(buf_base);
- }
- buf_base = NULL;
- }
- } m_fb;
-
- bool m_fFilm;
- void SetDeinterlaceMethod();
- void SetTypeSpecificFlags(IMediaSample* pMS);
-
- AM_SimpleRateChange m_rate;
+ CSubpicInputPin* m_pSubpicInput;
+ CClosedCaptionOutputPin* m_pClosedCaptionOutput;
+
+ CAutoPtr<CMpeg2Dec> m_dec;
+
+ REFERENCE_TIME m_AvgTimePerFrame;
+ bool m_fWaitForKeyFrame;
+ bool m_fInitializedBuffer;
+ CSize m_par;
+
+ struct framebuf {
+ int w, h, pitch;
+ BYTE* buf_base;
+ BYTE* buf[6];
+ REFERENCE_TIME rtStart, rtStop;
+ DWORD flags;
+ ditype di;
+ framebuf() {
+ w = h = pitch = 0;
+ buf_base = NULL;
+ memset(&buf, 0, sizeof(buf));
+ rtStart = rtStop = 0;
+ flags = 0;
+ }
+ ~framebuf() {
+ Free();
+ }
+ void Alloc(int w, int h, int pitch) {
+ this->w = w;
+ this->h = h;
+ this->pitch = pitch;
+ int size = pitch * h;
+ buf_base = (BYTE*)_aligned_malloc(size * 3 + 6 * 32, 32);
+ BYTE* p = buf_base;
+ buf[0] = p;
+ p += (size + 31) & ~31;
+ buf[3] = p;
+ p += (size + 31) & ~31;
+ buf[1] = p;
+ p += (size / 4 + 31) & ~31;
+ buf[4] = p;
+ p += (size / 4 + 31) & ~31;
+ buf[2] = p;
+ p += (size / 4 + 31) & ~31;
+ buf[5] = p;
+ p += (size / 4 + 31) & ~31;
+ }
+ void Free() {
+ if (buf_base) {
+ _aligned_free(buf_base);
+ }
+ buf_base = NULL;
+ }
+ } m_fb;
+
+ bool m_fFilm;
+ void SetDeinterlaceMethod();
+ void SetTypeSpecificFlags(IMediaSample* pMS);
+
+ AM_SimpleRateChange m_rate;
protected:
- void InputTypeChanged();
- HRESULT Transform(IMediaSample* pIn);
- bool IsVideoInterlaced();
- void UpdateAspectRatio();
+ void InputTypeChanged();
+ HRESULT Transform(IMediaSample* pIn);
+ bool IsVideoInterlaced();
+ void UpdateAspectRatio();
public:
- CMpeg2DecFilter(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CMpeg2DecFilter();
+ CMpeg2DecFilter(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CMpeg2DecFilter();
- virtual void GetOutputSize(int& w, int& h, int& arx, int& ary, int &RealWidth, int &RealHeight);
+ virtual void GetOutputSize(int& w, int& h, int& arx, int& ary, int& RealWidth, int& RealHeight);
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
- HRESULT DeliverFast();
- HRESULT DeliverNormal();
- HRESULT Deliver(bool fRepeatLast);
+ HRESULT DeliverFast();
+ HRESULT DeliverNormal();
+ HRESULT Deliver(bool fRepeatLast);
- int GetPinCount();
- CBasePin* GetPin(int n);
+ int GetPinCount();
+ CBasePin* GetPin(int n);
- HRESULT EndOfStream();
- HRESULT BeginFlush();
- HRESULT EndFlush();
- HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT EndOfStream();
+ HRESULT BeginFlush();
+ HRESULT EndFlush();
+ HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
- HRESULT CheckConnect(PIN_DIRECTION dir, IPin* pPin);
- HRESULT CheckInputType(const CMediaType* mtIn);
- HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
+ HRESULT CheckConnect(PIN_DIRECTION dir, IPin* pPin);
+ HRESULT CheckInputType(const CMediaType* mtIn);
+ HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
- HRESULT StartStreaming();
- HRESULT StopStreaming();
+ HRESULT StartStreaming();
+ HRESULT StopStreaming();
- bool m_fDropFrames;
- HRESULT AlterQuality(Quality q);
+ bool m_fDropFrames;
+ HRESULT AlterQuality(Quality q);
protected:
- CCritSec m_csProps;
- ditype m_ditype;
- float m_bright, m_cont, m_hue, m_sat;
- BYTE m_YTbl[256], m_UTbl[256*256], m_VTbl[256*256];
- bool m_fForcedSubs;
- bool m_fPlanarYUV;
- bool m_fInterlaced;
- bool m_bReadARFromStream;
-
- static void CalcBrCont(BYTE* YTbl, float bright, float cont);
- static void CalcHueSat(BYTE* UTbl, BYTE* VTbl, float hue, float sat);
- void ApplyBrContHueSat(BYTE* srcy, BYTE* srcu, BYTE* srcv, int w, int h, int pitch);
+ CCritSec m_csProps;
+ ditype m_ditype;
+ float m_bright, m_cont, m_hue, m_sat;
+ BYTE m_YTbl[256], m_UTbl[256 * 256], m_VTbl[256 * 256];
+ bool m_fForcedSubs;
+ bool m_fPlanarYUV;
+ bool m_fInterlaced;
+ bool m_bReadARFromStream;
+
+ static void CalcBrCont(BYTE* YTbl, float bright, float cont);
+ static void CalcHueSat(BYTE* UTbl, BYTE* VTbl, float hue, float sat);
+ void ApplyBrContHueSat(BYTE* srcy, BYTE* srcu, BYTE* srcv, int w, int h, int pitch);
public:
- // ISpecifyPropertyPages2
+ // ISpecifyPropertyPages2
- STDMETHODIMP GetPages(CAUUID* pPages);
- STDMETHODIMP CreatePage(const GUID& guid, IPropertyPage** ppPage);
+ STDMETHODIMP GetPages(CAUUID* pPages);
+ STDMETHODIMP CreatePage(const GUID& guid, IPropertyPage** ppPage);
- // IMpeg2DecFilter
+ // IMpeg2DecFilter
- STDMETHODIMP SetDeinterlaceMethod(ditype di);
- STDMETHODIMP_(ditype) GetDeinterlaceMethod();
+ STDMETHODIMP SetDeinterlaceMethod(ditype di);
+ STDMETHODIMP_(ditype) GetDeinterlaceMethod();
- STDMETHODIMP SetBrightness(float bright);
- STDMETHODIMP SetContrast(float cont);
- STDMETHODIMP SetHue(float hue);
- STDMETHODIMP SetSaturation(float sat);
- STDMETHODIMP_(float) GetBrightness();
- STDMETHODIMP_(float) GetContrast();
- STDMETHODIMP_(float) GetHue();
- STDMETHODIMP_(float) GetSaturation();
+ STDMETHODIMP SetBrightness(float bright);
+ STDMETHODIMP SetContrast(float cont);
+ STDMETHODIMP SetHue(float hue);
+ STDMETHODIMP SetSaturation(float sat);
+ STDMETHODIMP_(float) GetBrightness();
+ STDMETHODIMP_(float) GetContrast();
+ STDMETHODIMP_(float) GetHue();
+ STDMETHODIMP_(float) GetSaturation();
- STDMETHODIMP EnableForcedSubtitles(bool fEnable);
- STDMETHODIMP_(bool) IsForcedSubtitlesEnabled();
+ STDMETHODIMP EnableForcedSubtitles(bool fEnable);
+ STDMETHODIMP_(bool) IsForcedSubtitlesEnabled();
- STDMETHODIMP EnablePlanarYUV(bool fEnable);
- STDMETHODIMP_(bool) IsPlanarYUVEnabled();
- STDMETHODIMP Apply();
- // IMpeg2DecFilter2
+ STDMETHODIMP EnablePlanarYUV(bool fEnable);
+ STDMETHODIMP_(bool) IsPlanarYUVEnabled();
+ STDMETHODIMP Apply();
+ // IMpeg2DecFilter2
- STDMETHODIMP EnableInterlaced(bool fEnable);
- STDMETHODIMP_(bool) IsInterlacedEnabled();
+ STDMETHODIMP EnableInterlaced(bool fEnable);
+ STDMETHODIMP_(bool) IsInterlacedEnabled();
- STDMETHODIMP EnableReadARFromStream(bool fEnable);
- STDMETHODIMP_(bool) IsReadARFromStreamEnabled();
+ STDMETHODIMP EnableReadARFromStream(bool fEnable);
+ STDMETHODIMP_(bool) IsReadARFromStreamEnabled();
};
class CMpeg2DecInputPin : public CDeCSSInputPin
{
- LONG m_CorrectTS;
+ LONG m_CorrectTS;
public:
- CMpeg2DecInputPin(CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName);
+ CMpeg2DecInputPin(CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName);
- CCritSec m_csRateLock;
- AM_SimpleRateChange m_ratechange;
+ CCritSec m_csRateLock;
+ AM_SimpleRateChange m_ratechange;
- // IKsPropertySet
- STDMETHODIMP Set(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength);
- STDMETHODIMP Get(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength, ULONG* pBytesReturned);
- STDMETHODIMP QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport);
+ // IKsPropertySet
+ STDMETHODIMP Set(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength);
+ STDMETHODIMP Get(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength, ULONG* pBytesReturned);
+ STDMETHODIMP QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport);
};
class CMpeg2DecOutputPin : public CBaseVideoOutputPin
{
public:
- CMpeg2DecOutputPin(CBaseVideoFilter* pFilter, HRESULT* phr, LPWSTR pName);
+ CMpeg2DecOutputPin(CBaseVideoFilter* pFilter, HRESULT* phr, LPWSTR pName);
- CAutoPtr<COutputQueue> m_pOutputQueue;
+ CAutoPtr<COutputQueue> m_pOutputQueue;
- HRESULT Active();
- HRESULT Inactive();
+ HRESULT Active();
+ HRESULT Inactive();
- HRESULT Deliver(IMediaSample* pMediaSample);
- HRESULT DeliverEndOfStream();
- HRESULT DeliverBeginFlush();
- HRESULT DeliverEndFlush();
- HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+ HRESULT Deliver(IMediaSample* pMediaSample);
+ HRESULT DeliverEndOfStream();
+ HRESULT DeliverBeginFlush();
+ HRESULT DeliverEndFlush();
+ HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
};
class CSubpicInputPin : public CMpeg2DecInputPin
{
- CCritSec m_csReceive;
-
- AM_PROPERTY_COMPOSIT_ON m_spon;
- AM_DVD_YUV m_sppal[16];
- bool m_fsppal;
- CAutoPtr<AM_PROPERTY_SPHLI> m_sphli; // temp
-
- class spu : public CAtlArray<BYTE>
- {
- public:
- bool m_fForced;
- REFERENCE_TIME m_rtStart, m_rtStop;
- DWORD m_offset[2];
- AM_PROPERTY_SPHLI m_sphli; // parsed
- CAutoPtr<AM_PROPERTY_SPHLI> m_psphli; // for the menu (optional)
- spu() {
- memset(&m_sphli, 0, sizeof(m_sphli));
- m_fForced = false;
- m_rtStart = m_rtStop = 0;
- }
- virtual ~spu() {}
- virtual bool Parse() = 0;
- virtual void Render(REFERENCE_TIME rt, BYTE** p, int w, int h, AM_DVD_YUV* sppal, bool fsppal) = 0;
- };
-
- class dvdspu : public spu
- {
- public:
- struct offset_t {
- REFERENCE_TIME rt;
- AM_PROPERTY_SPHLI sphli;
- };
- CAtlList<offset_t> m_offsets;
- bool Parse();
- void Render(REFERENCE_TIME rt, BYTE** p, int w, int h, AM_DVD_YUV* sppal, bool fsppal);
- };
-
- class cvdspu : public spu
- {
- public:
- AM_DVD_YUV m_sppal[2][4];
- cvdspu() {
- memset(m_sppal, 0, sizeof(m_sppal));
- }
- bool Parse();
- void Render(REFERENCE_TIME rt, BYTE** p, int w, int h, AM_DVD_YUV* sppal, bool fsppal);
- };
-
- class svcdspu : public spu
- {
- public:
- AM_DVD_YUV m_sppal[4];
- svcdspu() {
- memset(m_sppal, 0, sizeof(m_sppal));
- }
- bool Parse();
- void Render(REFERENCE_TIME rt, BYTE** p, int w, int h, AM_DVD_YUV* sppal, bool fsppal);
- };
-
- CAutoPtrList<spu> m_sps;
+ CCritSec m_csReceive;
+
+ AM_PROPERTY_COMPOSIT_ON m_spon;
+ AM_DVD_YUV m_sppal[16];
+ bool m_fsppal;
+ CAutoPtr<AM_PROPERTY_SPHLI> m_sphli; // temp
+
+ class spu : public CAtlArray<BYTE>
+ {
+ public:
+ bool m_fForced;
+ REFERENCE_TIME m_rtStart, m_rtStop;
+ DWORD m_offset[2];
+ AM_PROPERTY_SPHLI m_sphli; // parsed
+ CAutoPtr<AM_PROPERTY_SPHLI> m_psphli; // for the menu (optional)
+ spu() {
+ memset(&m_sphli, 0, sizeof(m_sphli));
+ m_fForced = false;
+ m_rtStart = m_rtStop = 0;
+ }
+ virtual ~spu() {}
+ virtual bool Parse() = 0;
+ virtual void Render(REFERENCE_TIME rt, BYTE** p, int w, int h, AM_DVD_YUV* sppal, bool fsppal) = 0;
+ };
+
+ class dvdspu : public spu
+ {
+ public:
+ struct offset_t {
+ REFERENCE_TIME rt;
+ AM_PROPERTY_SPHLI sphli;
+ };
+ CAtlList<offset_t> m_offsets;
+ bool Parse();
+ void Render(REFERENCE_TIME rt, BYTE** p, int w, int h, AM_DVD_YUV* sppal, bool fsppal);
+ };
+
+ class cvdspu : public spu
+ {
+ public:
+ AM_DVD_YUV m_sppal[2][4];
+ cvdspu() {
+ memset(m_sppal, 0, sizeof(m_sppal));
+ }
+ bool Parse();
+ void Render(REFERENCE_TIME rt, BYTE** p, int w, int h, AM_DVD_YUV* sppal, bool fsppal);
+ };
+
+ class svcdspu : public spu
+ {
+ public:
+ AM_DVD_YUV m_sppal[4];
+ svcdspu() {
+ memset(m_sppal, 0, sizeof(m_sppal));
+ }
+ bool Parse();
+ void Render(REFERENCE_TIME rt, BYTE** p, int w, int h, AM_DVD_YUV* sppal, bool fsppal);
+ };
+
+ CAutoPtrList<spu> m_sps;
protected:
- HRESULT Transform(IMediaSample* pSample);
+ HRESULT Transform(IMediaSample* pSample);
public:
- CSubpicInputPin(CTransformFilter* pFilter, HRESULT* phr);
-
- bool HasAnythingToRender(REFERENCE_TIME rt);
- void RenderSubpics(REFERENCE_TIME rt, BYTE** p, int w, int h);
-
- HRESULT CheckMediaType(const CMediaType* mtIn);
- HRESULT SetMediaType(const CMediaType* mtIn);
-
- // we shouldn't pass these to the filter from this pin
- STDMETHODIMP EndOfStream() {
- return S_OK;
- }
- STDMETHODIMP BeginFlush() {
- return S_OK;
- }
- STDMETHODIMP EndFlush();
- STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) {
- return S_OK;
- }
-
- // IKsPropertySet
- STDMETHODIMP Set(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength);
- STDMETHODIMP QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport);
+ CSubpicInputPin(CTransformFilter* pFilter, HRESULT* phr);
+
+ bool HasAnythingToRender(REFERENCE_TIME rt);
+ void RenderSubpics(REFERENCE_TIME rt, BYTE** p, int w, int h);
+
+ HRESULT CheckMediaType(const CMediaType* mtIn);
+ HRESULT SetMediaType(const CMediaType* mtIn);
+
+ // we shouldn't pass these to the filter from this pin
+ STDMETHODIMP EndOfStream() {
+ return S_OK;
+ }
+ STDMETHODIMP BeginFlush() {
+ return S_OK;
+ }
+ STDMETHODIMP EndFlush();
+ STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) {
+ return S_OK;
+ }
+
+ // IKsPropertySet
+ STDMETHODIMP Set(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength);
+ STDMETHODIMP QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport);
};
class CClosedCaptionOutputPin : public CBaseOutputPin
{
public:
- CClosedCaptionOutputPin(CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
+ CClosedCaptionOutputPin(CBaseFilter* pFilter, CCritSec* pLock, HRESULT* phr);
- HRESULT CheckMediaType(const CMediaType* mtOut);
- HRESULT GetMediaType(int iPosition, CMediaType* pmt);
- HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
+ HRESULT CheckMediaType(const CMediaType* mtOut);
+ HRESULT GetMediaType(int iPosition, CMediaType* pmt);
+ HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
- CMediaType& CurrentMediaType() {
- return m_mt;
- }
+ CMediaType& CurrentMediaType() {
+ return m_mt;
+ }
- HRESULT Deliver(const void* ptr, int len);
+ HRESULT Deliver(const void* ptr, int len);
};
diff --git a/src/filters/transform/Mpeg2DecFilter/Mpeg2DecSettingsWnd.cpp b/src/filters/transform/Mpeg2DecFilter/Mpeg2DecSettingsWnd.cpp
index e51a4997f..c6271f6e4 100644
--- a/src/filters/transform/Mpeg2DecFilter/Mpeg2DecSettingsWnd.cpp
+++ b/src/filters/transform/Mpeg2DecFilter/Mpeg2DecSettingsWnd.cpp
@@ -40,208 +40,208 @@ static TCHAR m_strSaturation[100];
CMpeg2DecSettingsWnd::CMpeg2DecSettingsWnd()
{
- wcscpy_s(m_strBrightness, ResStr(IDS_MPEG2_BRIGHTNESS));
- wcscpy_s(m_strContrast, ResStr(IDS_MPEG2_CONTRAST));
- wcscpy_s(m_strHue, ResStr(IDS_MPEG2_HUE));
- wcscpy_s(m_strSaturation, ResStr(IDS_MPEG2_SATURATION));
+ wcscpy_s(m_strBrightness, ResStr(IDS_MPEG2_BRIGHTNESS));
+ wcscpy_s(m_strContrast, ResStr(IDS_MPEG2_CONTRAST));
+ wcscpy_s(m_strHue, ResStr(IDS_MPEG2_HUE));
+ wcscpy_s(m_strSaturation, ResStr(IDS_MPEG2_SATURATION));
}
bool CMpeg2DecSettingsWnd::OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks)
{
- ASSERT(!m_pM2DF);
-
- m_pM2DF.Release();
-
- POSITION pos = pUnks.GetHeadPosition();
- while (pos && !(m_pM2DF = pUnks.GetNext(pos))) {
- ;
- }
-
- if (!m_pM2DF) {
- return false;
- }
-
- m_ditype = m_pM2DF->GetDeinterlaceMethod();
- m_procamp[0] = m_pM2DF->GetBrightness();
- m_procamp[1] = m_pM2DF->GetContrast();
- m_procamp[2] = m_pM2DF->GetHue();
- m_procamp[3] = m_pM2DF->GetSaturation();
- m_forcedsubs = m_pM2DF->IsForcedSubtitlesEnabled();
- m_planaryuv = m_pM2DF->IsPlanarYUVEnabled();
- m_interlaced = m_pM2DF->IsInterlacedEnabled();
- m_readARFromStream = m_pM2DF->IsReadARFromStreamEnabled();
-
- return true;
+ ASSERT(!m_pM2DF);
+
+ m_pM2DF.Release();
+
+ POSITION pos = pUnks.GetHeadPosition();
+ while (pos && !(m_pM2DF = pUnks.GetNext(pos))) {
+ ;
+ }
+
+ if (!m_pM2DF) {
+ return false;
+ }
+
+ m_ditype = m_pM2DF->GetDeinterlaceMethod();
+ m_procamp[0] = m_pM2DF->GetBrightness();
+ m_procamp[1] = m_pM2DF->GetContrast();
+ m_procamp[2] = m_pM2DF->GetHue();
+ m_procamp[3] = m_pM2DF->GetSaturation();
+ m_forcedsubs = m_pM2DF->IsForcedSubtitlesEnabled();
+ m_planaryuv = m_pM2DF->IsPlanarYUVEnabled();
+ m_interlaced = m_pM2DF->IsInterlacedEnabled();
+ m_readARFromStream = m_pM2DF->IsReadARFromStreamEnabled();
+
+ return true;
}
void CMpeg2DecSettingsWnd::OnDisconnect()
{
- m_pM2DF.Release();
+ m_pM2DF.Release();
}
bool CMpeg2DecSettingsWnd::OnActivate()
{
- DWORD dwStyle = WS_VISIBLE|WS_CHILD|WS_TABSTOP;
-
- CPoint p(10, 10);
-
- m_planaryuv_check.Create(ResStr(IDS_MPEG2DECSETTINGSWND_0), dwStyle|BS_AUTOCHECKBOX, CRect(p, CSize(300, m_fontheight)), this, IDC_PP_CHECK1);
- m_planaryuv_check.SetCheck(m_planaryuv ? BST_CHECKED : BST_UNCHECKED);
- p.y += m_fontheight + 5;
-
- m_interlaced_check.Create(ResStr(IDS_MPEG2DECSETTINGSWND_1), dwStyle|BS_AUTOCHECKBOX, CRect(p, CSize(300, m_fontheight)), this, IDC_PP_CHECK2);
- m_interlaced_check.SetCheck(m_interlaced ? BST_CHECKED : BST_UNCHECKED);
- p.y += m_fontheight + 5;
-
- m_forcedsubs_check.Create(ResStr(IDS_MPEG2DECSETTINGSWND_2), dwStyle|BS_AUTOCHECKBOX, CRect(p, CSize(300, m_fontheight)), this, IDC_PP_CHECK3);
- m_forcedsubs_check.SetCheck(m_forcedsubs ? BST_CHECKED : BST_UNCHECKED);
- p.y += m_fontheight + 5;
-
- m_readARFromStream_check.Create(ResStr(IDS_MPEG2DECSETTINGSWND_3), dwStyle|BS_AUTOCHECKBOX, CRect(p, CSize(300, m_fontheight)), this, IDC_PP_CHECK4);
- m_readARFromStream_check.SetCheck(m_readARFromStream ? BST_CHECKED : BST_UNCHECKED);
- p.y += m_fontheight + 5;
-
- p.y += 10;
-
- m_ditype_static.Create(ResStr(IDS_MPEG2_DEINTERLACING), dwStyle, CRect(p, CSize(100, m_fontheight)), this);
- m_ditype_combo.Create(dwStyle|CBS_DROPDOWNLIST, CRect(p + CSize(110, -3), CSize(100, 200)), this, IDC_PP_COMBO1);
- m_ditype_combo.SetItemData(m_ditype_combo.AddString(_T("Auto")), (DWORD)DIAuto);
- m_ditype_combo.SetItemData(m_ditype_combo.AddString(_T("Weave")), (DWORD)DIWeave);
- m_ditype_combo.SetItemData(m_ditype_combo.AddString(_T("Blend")), (DWORD)DIBlend);
- m_ditype_combo.SetItemData(m_ditype_combo.AddString(_T("Bob")), (DWORD)DIBob);
- m_ditype_combo.SetItemData(m_ditype_combo.AddString(_T("Field Shift")), (DWORD)DIFieldShift);
- m_ditype_combo.SetItemData(m_ditype_combo.AddString(_T("ELA")), (DWORD)DIELA);
- m_ditype_combo.SetCurSel(0);
- for (int i = 0; i < m_ditype_combo.GetCount(); i++)
- if ((int)m_ditype_combo.GetItemData(i) == m_ditype) {
- m_ditype_combo.SetCurSel(i);
- }
-
- m_ditype_combo.EnableWindow(!IsDlgButtonChecked(m_interlaced_check.GetDlgCtrlID()));
-
- p.y += m_fontheight + 20;
-
- for (int i = 0, h = max(20, m_fontheight)+1; i < _countof(m_procamp_slider); i++, p.y += h) {
- static const TCHAR* labels[] = {m_strBrightness, m_strContrast, m_strHue, m_strSaturation};
- m_procamp_static[i].Create(labels[i], dwStyle, CRect(p, CSize(70, h)), this);
- m_procamp_slider[i].Create(dwStyle, CRect(p + CPoint(80, 0), CSize(201, h)), this, IDC_PP_SLIDER1+i);
- m_procamp_value[i].Create(_T(""), dwStyle, CRect(p + CPoint(280, 0), CSize(40, h)), this);
- }
-
- m_procamp_slider[0].SetRange(0, 2*128);
- m_procamp_slider[0].SetTic(128);
- m_procamp_slider[0].SetPos((int)(m_procamp[0] + (m_procamp[0] >= 0 ? 0.5f : -0.5f)) + 128);
- m_procamp_slider[1].SetRange(0, 200);
- m_procamp_slider[1].SetTic(100);
- m_procamp_slider[1].SetPos((int)(100*m_procamp[1] + 0.5f));
- m_procamp_slider[2].SetRange(0, 2*180);
- m_procamp_slider[2].SetTic(180);
- m_procamp_slider[2].SetPos((int)(m_procamp[2] + (m_procamp[2] >= 0 ? 0.5f : -0.5f)) + 180);
- m_procamp_slider[3].SetRange(0, 200);
- m_procamp_slider[3].SetTic(100);
- m_procamp_slider[3].SetPos((int)(100*m_procamp[3] + 0.5f));
-
- p.y += 5;
-
- m_procamp_tv2pc.Create(_T("TV->PC"), dwStyle, CRect(p + CPoint(50 + 200/2 - 55, 0), CSize(80, 20)), this, IDC_PP_BUTTON1);
- m_procamp_reset.Create(ResStr(IDS_MPEG2_RESET), dwStyle, CRect(p + CPoint(80 + 200/2 + 5, 0), CSize(80, 20)), this, IDC_PP_BUTTON2);
-
- p.y += 30;
-
- UpdateProcampValues();
-
- m_note_static.Create(
- ResStr(IDS_MPEG2DECSETTINGSWND_7) +
- ResStr(IDS_MPEG2DECSETTINGSWND_8),
- dwStyle, CRect(p, CSize(320, m_fontheight * 4)), this);
-
- for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
- pWnd->SetFont(&m_font, FALSE);
- }
-
- return true;
+ DWORD dwStyle = WS_VISIBLE | WS_CHILD | WS_TABSTOP;
+
+ CPoint p(10, 10);
+
+ m_planaryuv_check.Create(ResStr(IDS_MPEG2DECSETTINGSWND_0), dwStyle | BS_AUTOCHECKBOX, CRect(p, CSize(300, m_fontheight)), this, IDC_PP_CHECK1);
+ m_planaryuv_check.SetCheck(m_planaryuv ? BST_CHECKED : BST_UNCHECKED);
+ p.y += m_fontheight + 5;
+
+ m_interlaced_check.Create(ResStr(IDS_MPEG2DECSETTINGSWND_1), dwStyle | BS_AUTOCHECKBOX, CRect(p, CSize(300, m_fontheight)), this, IDC_PP_CHECK2);
+ m_interlaced_check.SetCheck(m_interlaced ? BST_CHECKED : BST_UNCHECKED);
+ p.y += m_fontheight + 5;
+
+ m_forcedsubs_check.Create(ResStr(IDS_MPEG2DECSETTINGSWND_2), dwStyle | BS_AUTOCHECKBOX, CRect(p, CSize(300, m_fontheight)), this, IDC_PP_CHECK3);
+ m_forcedsubs_check.SetCheck(m_forcedsubs ? BST_CHECKED : BST_UNCHECKED);
+ p.y += m_fontheight + 5;
+
+ m_readARFromStream_check.Create(ResStr(IDS_MPEG2DECSETTINGSWND_3), dwStyle | BS_AUTOCHECKBOX, CRect(p, CSize(300, m_fontheight)), this, IDC_PP_CHECK4);
+ m_readARFromStream_check.SetCheck(m_readARFromStream ? BST_CHECKED : BST_UNCHECKED);
+ p.y += m_fontheight + 5;
+
+ p.y += 10;
+
+ m_ditype_static.Create(ResStr(IDS_MPEG2_DEINTERLACING), dwStyle, CRect(p, CSize(100, m_fontheight)), this);
+ m_ditype_combo.Create(dwStyle | CBS_DROPDOWNLIST, CRect(p + CSize(110, -3), CSize(100, 200)), this, IDC_PP_COMBO1);
+ m_ditype_combo.SetItemData(m_ditype_combo.AddString(_T("Auto")), (DWORD)DIAuto);
+ m_ditype_combo.SetItemData(m_ditype_combo.AddString(_T("Weave")), (DWORD)DIWeave);
+ m_ditype_combo.SetItemData(m_ditype_combo.AddString(_T("Blend")), (DWORD)DIBlend);
+ m_ditype_combo.SetItemData(m_ditype_combo.AddString(_T("Bob")), (DWORD)DIBob);
+ m_ditype_combo.SetItemData(m_ditype_combo.AddString(_T("Field Shift")), (DWORD)DIFieldShift);
+ m_ditype_combo.SetItemData(m_ditype_combo.AddString(_T("ELA")), (DWORD)DIELA);
+ m_ditype_combo.SetCurSel(0);
+ for (int i = 0; i < m_ditype_combo.GetCount(); i++)
+ if ((int)m_ditype_combo.GetItemData(i) == m_ditype) {
+ m_ditype_combo.SetCurSel(i);
+ }
+
+ m_ditype_combo.EnableWindow(!IsDlgButtonChecked(m_interlaced_check.GetDlgCtrlID()));
+
+ p.y += m_fontheight + 20;
+
+ for (int i = 0, h = max(20, m_fontheight) + 1; i < _countof(m_procamp_slider); i++, p.y += h) {
+ static const TCHAR* labels[] = {m_strBrightness, m_strContrast, m_strHue, m_strSaturation};
+ m_procamp_static[i].Create(labels[i], dwStyle, CRect(p, CSize(70, h)), this);
+ m_procamp_slider[i].Create(dwStyle, CRect(p + CPoint(80, 0), CSize(201, h)), this, IDC_PP_SLIDER1 + i);
+ m_procamp_value[i].Create(_T(""), dwStyle, CRect(p + CPoint(280, 0), CSize(40, h)), this);
+ }
+
+ m_procamp_slider[0].SetRange(0, 2 * 128);
+ m_procamp_slider[0].SetTic(128);
+ m_procamp_slider[0].SetPos((int)(m_procamp[0] + (m_procamp[0] >= 0 ? 0.5f : -0.5f)) + 128);
+ m_procamp_slider[1].SetRange(0, 200);
+ m_procamp_slider[1].SetTic(100);
+ m_procamp_slider[1].SetPos((int)(100 * m_procamp[1] + 0.5f));
+ m_procamp_slider[2].SetRange(0, 2 * 180);
+ m_procamp_slider[2].SetTic(180);
+ m_procamp_slider[2].SetPos((int)(m_procamp[2] + (m_procamp[2] >= 0 ? 0.5f : -0.5f)) + 180);
+ m_procamp_slider[3].SetRange(0, 200);
+ m_procamp_slider[3].SetTic(100);
+ m_procamp_slider[3].SetPos((int)(100 * m_procamp[3] + 0.5f));
+
+ p.y += 5;
+
+ m_procamp_tv2pc.Create(_T("TV->PC"), dwStyle, CRect(p + CPoint(50 + 200 / 2 - 55, 0), CSize(80, 20)), this, IDC_PP_BUTTON1);
+ m_procamp_reset.Create(ResStr(IDS_MPEG2_RESET), dwStyle, CRect(p + CPoint(80 + 200 / 2 + 5, 0), CSize(80, 20)), this, IDC_PP_BUTTON2);
+
+ p.y += 30;
+
+ UpdateProcampValues();
+
+ m_note_static.Create(
+ ResStr(IDS_MPEG2DECSETTINGSWND_7) +
+ ResStr(IDS_MPEG2DECSETTINGSWND_8),
+ dwStyle, CRect(p, CSize(320, m_fontheight * 4)), this);
+
+ for (CWnd* pWnd = GetWindow(GW_CHILD); pWnd; pWnd = pWnd->GetNextWindow()) {
+ pWnd->SetFont(&m_font, FALSE);
+ }
+
+ return true;
}
void CMpeg2DecSettingsWnd::OnDeactivate()
{
- m_ditype = (ditype)m_ditype_combo.GetItemData(m_ditype_combo.GetCurSel());
- m_procamp[0] = (float)m_procamp_slider[0].GetPos() - 128;
- m_procamp[1] = (float)m_procamp_slider[1].GetPos() / 100;
- m_procamp[2] = (float)m_procamp_slider[2].GetPos() - 180;
- m_procamp[3] = (float)m_procamp_slider[3].GetPos() / 100;
- m_planaryuv = !!IsDlgButtonChecked(m_planaryuv_check.GetDlgCtrlID());
- m_interlaced = !!IsDlgButtonChecked(m_interlaced_check.GetDlgCtrlID());
- m_forcedsubs = !!IsDlgButtonChecked(m_forcedsubs_check.GetDlgCtrlID());
- m_readARFromStream = !!IsDlgButtonChecked(m_readARFromStream_check.GetDlgCtrlID());
+ m_ditype = (ditype)m_ditype_combo.GetItemData(m_ditype_combo.GetCurSel());
+ m_procamp[0] = (float)m_procamp_slider[0].GetPos() - 128;
+ m_procamp[1] = (float)m_procamp_slider[1].GetPos() / 100;
+ m_procamp[2] = (float)m_procamp_slider[2].GetPos() - 180;
+ m_procamp[3] = (float)m_procamp_slider[3].GetPos() / 100;
+ m_planaryuv = !!IsDlgButtonChecked(m_planaryuv_check.GetDlgCtrlID());
+ m_interlaced = !!IsDlgButtonChecked(m_interlaced_check.GetDlgCtrlID());
+ m_forcedsubs = !!IsDlgButtonChecked(m_forcedsubs_check.GetDlgCtrlID());
+ m_readARFromStream = !!IsDlgButtonChecked(m_readARFromStream_check.GetDlgCtrlID());
}
bool CMpeg2DecSettingsWnd::OnApply()
{
- OnDeactivate();
-
- if (m_pM2DF) {
- m_pM2DF->SetDeinterlaceMethod(m_ditype);
- m_pM2DF->SetBrightness(m_procamp[0]);
- m_pM2DF->SetContrast(m_procamp[1]);
- m_pM2DF->SetHue(m_procamp[2]);
- m_pM2DF->SetSaturation(m_procamp[3]);
- m_pM2DF->EnableForcedSubtitles(m_forcedsubs);
- m_pM2DF->EnablePlanarYUV(m_planaryuv);
- m_pM2DF->EnableInterlaced(m_interlaced);
- m_pM2DF->EnableReadARFromStream(m_readARFromStream);
- m_pM2DF->Apply();
- }
-
- return true;
+ OnDeactivate();
+
+ if (m_pM2DF) {
+ m_pM2DF->SetDeinterlaceMethod(m_ditype);
+ m_pM2DF->SetBrightness(m_procamp[0]);
+ m_pM2DF->SetContrast(m_procamp[1]);
+ m_pM2DF->SetHue(m_procamp[2]);
+ m_pM2DF->SetSaturation(m_procamp[3]);
+ m_pM2DF->EnableForcedSubtitles(m_forcedsubs);
+ m_pM2DF->EnablePlanarYUV(m_planaryuv);
+ m_pM2DF->EnableInterlaced(m_interlaced);
+ m_pM2DF->EnableReadARFromStream(m_readARFromStream);
+ m_pM2DF->Apply();
+ }
+
+ return true;
}
void CMpeg2DecSettingsWnd::UpdateProcampValues()
{
- CString str;
-
- str.Format(_T("%d"), m_procamp_slider[0].GetPos() - 128);
- m_procamp_value[0].SetWindowText(str);
- str.Format(_T("%d%%"), m_procamp_slider[1].GetPos());
- m_procamp_value[1].SetWindowText(str);
- str.Format(_T("%d"), m_procamp_slider[2].GetPos() - 180);
- m_procamp_value[2].SetWindowText(str);
- str.Format(_T("%d%%"), m_procamp_slider[3].GetPos());
- m_procamp_value[3].SetWindowText(str);
+ CString str;
+
+ str.Format(_T("%d"), m_procamp_slider[0].GetPos() - 128);
+ m_procamp_value[0].SetWindowText(str);
+ str.Format(_T("%d%%"), m_procamp_slider[1].GetPos());
+ m_procamp_value[1].SetWindowText(str);
+ str.Format(_T("%d"), m_procamp_slider[2].GetPos() - 180);
+ m_procamp_value[2].SetWindowText(str);
+ str.Format(_T("%d%%"), m_procamp_slider[3].GetPos());
+ m_procamp_value[3].SetWindowText(str);
}
BEGIN_MESSAGE_MAP(CMpeg2DecSettingsWnd, CInternalPropertyPageWnd)
- ON_BN_CLICKED(IDC_PP_BUTTON1, OnButtonProcampPc2Tv)
- ON_BN_CLICKED(IDC_PP_BUTTON2, OnButtonProcampReset)
- ON_BN_CLICKED(IDC_PP_CHECK2, OnButtonInterlaced)
- ON_WM_HSCROLL()
+ ON_BN_CLICKED(IDC_PP_BUTTON1, OnButtonProcampPc2Tv)
+ ON_BN_CLICKED(IDC_PP_BUTTON2, OnButtonProcampReset)
+ ON_BN_CLICKED(IDC_PP_CHECK2, OnButtonInterlaced)
+ ON_WM_HSCROLL()
END_MESSAGE_MAP()
void CMpeg2DecSettingsWnd::OnButtonProcampPc2Tv()
{
- m_procamp_slider[0].SetPos(128 - 16);
- m_procamp_slider[1].SetPos(100 * 255/(235-16));
+ m_procamp_slider[0].SetPos(128 - 16);
+ m_procamp_slider[1].SetPos(100 * 255 / (235 - 16));
- UpdateProcampValues();
+ UpdateProcampValues();
}
void CMpeg2DecSettingsWnd::OnButtonProcampReset()
{
- m_procamp_slider[0].SetPos(128);
- m_procamp_slider[1].SetPos(100);
- m_procamp_slider[2].SetPos(180);
- m_procamp_slider[3].SetPos(100);
+ m_procamp_slider[0].SetPos(128);
+ m_procamp_slider[1].SetPos(100);
+ m_procamp_slider[2].SetPos(180);
+ m_procamp_slider[3].SetPos(100);
- UpdateProcampValues();
+ UpdateProcampValues();
}
void CMpeg2DecSettingsWnd::OnButtonInterlaced()
{
- m_ditype_combo.EnableWindow(!IsDlgButtonChecked(m_interlaced_check.GetDlgCtrlID()));
+ m_ditype_combo.EnableWindow(!IsDlgButtonChecked(m_interlaced_check.GetDlgCtrlID()));
}
void CMpeg2DecSettingsWnd::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
- UpdateProcampValues();
+ UpdateProcampValues();
- __super::OnHScroll(nSBCode, nPos, pScrollBar);
+ __super::OnHScroll(nSBCode, nPos, pScrollBar);
}
diff --git a/src/filters/transform/Mpeg2DecFilter/Mpeg2DecSettingsWnd.h b/src/filters/transform/Mpeg2DecFilter/Mpeg2DecSettingsWnd.h
index 6aa9f16df..c2665c15c 100644
--- a/src/filters/transform/Mpeg2DecFilter/Mpeg2DecSettingsWnd.h
+++ b/src/filters/transform/Mpeg2DecFilter/Mpeg2DecSettingsWnd.h
@@ -28,66 +28,66 @@
#include <afxcmn.h>
class __declspec(uuid("E5FB6957-65E6-491B-BB37-B25C9FE3BEA7"))
- CMpeg2DecSettingsWnd : public CInternalPropertyPageWnd
+ CMpeg2DecSettingsWnd : public CInternalPropertyPageWnd
{
- CComQIPtr<IMpeg2DecFilter> m_pM2DF;
+ CComQIPtr<IMpeg2DecFilter> m_pM2DF;
- ditype m_ditype;
- float m_procamp[4];
- bool m_planaryuv;
- bool m_interlaced;
- bool m_forcedsubs;
- bool m_readARFromStream;
+ ditype m_ditype;
+ float m_procamp[4];
+ bool m_planaryuv;
+ bool m_interlaced;
+ bool m_forcedsubs;
+ bool m_readARFromStream;
- enum {
- IDC_PP_COMBO1 = 10000,
- IDC_PP_SLIDER1,
- IDC_PP_SLIDER2,
- IDC_PP_SLIDER3,
- IDC_PP_SLIDER4,
- IDC_PP_CHECK1,
- IDC_PP_CHECK2,
- IDC_PP_CHECK3,
- IDC_PP_CHECK4,
- IDC_PP_BUTTON1,
- IDC_PP_BUTTON2,
- };
+ enum {
+ IDC_PP_COMBO1 = 10000,
+ IDC_PP_SLIDER1,
+ IDC_PP_SLIDER2,
+ IDC_PP_SLIDER3,
+ IDC_PP_SLIDER4,
+ IDC_PP_CHECK1,
+ IDC_PP_CHECK2,
+ IDC_PP_CHECK3,
+ IDC_PP_CHECK4,
+ IDC_PP_BUTTON1,
+ IDC_PP_BUTTON2,
+ };
- CStatic m_ditype_static;
- CComboBox m_ditype_combo;
- CStatic m_procamp_static[4];
- CSliderCtrl m_procamp_slider[4];
- CStatic m_procamp_value[4];
- CButton m_procamp_tv2pc;
- CButton m_procamp_reset;
- CButton m_planaryuv_check;
- CButton m_interlaced_check;
- CButton m_forcedsubs_check;
- CButton m_readARFromStream_check;
- CStatic m_note_static;
+ CStatic m_ditype_static;
+ CComboBox m_ditype_combo;
+ CStatic m_procamp_static[4];
+ CSliderCtrl m_procamp_slider[4];
+ CStatic m_procamp_value[4];
+ CButton m_procamp_tv2pc;
+ CButton m_procamp_reset;
+ CButton m_planaryuv_check;
+ CButton m_interlaced_check;
+ CButton m_forcedsubs_check;
+ CButton m_readARFromStream_check;
+ CStatic m_note_static;
- void UpdateProcampValues();
+ void UpdateProcampValues();
public:
- CMpeg2DecSettingsWnd();
+ CMpeg2DecSettingsWnd();
- bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
- void OnDisconnect();
- bool OnActivate();
- void OnDeactivate();
- bool OnApply();
+ bool OnConnect(const CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
+ void OnDisconnect();
+ bool OnActivate();
+ void OnDeactivate();
+ bool OnApply();
- static LPCTSTR GetWindowTitle() {
- return _T("Settings");
- }
- static CSize GetWindowSize() {
- return CSize(320, 240);
- }
+ static LPCTSTR GetWindowTitle() {
+ return _T("Settings");
+ }
+ static CSize GetWindowSize() {
+ return CSize(320, 240);
+ }
- DECLARE_MESSAGE_MAP()
+ DECLARE_MESSAGE_MAP()
- afx_msg void OnButtonProcampPc2Tv();
- afx_msg void OnButtonProcampReset();
- afx_msg void OnButtonInterlaced();
- afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
+ afx_msg void OnButtonProcampPc2Tv();
+ afx_msg void OnButtonProcampReset();
+ afx_msg void OnButtonInterlaced();
+ afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
}; \ No newline at end of file
diff --git a/src/filters/transform/Mpeg2DecFilter/idct_sse2.cpp b/src/filters/transform/Mpeg2DecFilter/idct_sse2.cpp
index da555e2ce..df1dd7748 100644
--- a/src/filters/transform/Mpeg2DecFilter/idct_sse2.cpp
+++ b/src/filters/transform/Mpeg2DecFilter/idct_sse2.cpp
@@ -31,292 +31,292 @@
// AP-945
// http://cache-www.intel.com/cd/00/00/01/76/17680_w_idct.pdf
-static const int BITS_INV_ACC=4;
-static const int SHIFT_INV_ROW=16-BITS_INV_ACC;
-static const int SHIFT_INV_COL=1+BITS_INV_ACC;
-static const int RND_INV_ROW =1024*(6-BITS_INV_ACC);
-static const int RND_INV_COL =16*(BITS_INV_ACC-3);
-static const int RND_INV_CORR =RND_INV_COL-1;
+static const int BITS_INV_ACC = 4;
+static const int SHIFT_INV_ROW = 16 - BITS_INV_ACC;
+static const int SHIFT_INV_COL = 1 + BITS_INV_ACC;
+static const int RND_INV_ROW = 1024 * (6 - BITS_INV_ACC);
+static const int RND_INV_COL = 16 * (BITS_INV_ACC - 3);
+static const int RND_INV_CORR = RND_INV_COL - 1;
-static __align16(const short,M128_round_inv_row[8]) = {RND_INV_ROW, 0, RND_INV_ROW, 0, RND_INV_ROW, 0, RND_INV_ROW, 0};
-static __align16(const short,M128_one_corr[8]) = {1,1,1,1,1,1,1,1};
-static __align16(const short,M128_round_inv_col[8]) = {RND_INV_COL, RND_INV_COL, RND_INV_COL, RND_INV_COL, RND_INV_COL, RND_INV_COL, RND_INV_COL, RND_INV_COL};
-static __align16(const short,M128_round_inv_corr[8])= {RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR};
-static __align16(const short,M128_tg_1_16[8]) = {13036, 13036, 13036, 13036, 13036, 13036, 13036, 13036}; // tg * (2<<16) + 0.5
-static __align16(const short,M128_tg_2_16[8]) = {27146, 27146, 27146, 27146, 27146, 27146, 27146, 27146}; // tg * (2<<16) + 0.5
-static __align16(const short,M128_tg_3_16[8]) = {-21746, -21746, -21746, -21746, -21746, -21746, -21746, -21746}; // tg * (2<<16) + 0.5
-static __align16(const short,M128_cos_4_16[8]) = {-19195, -19195, -19195, -19195, -19195, -19195, -19195, -19195};// cos * (2<<16) + 0.5
+static __align16(const short, M128_round_inv_row[8]) = {RND_INV_ROW, 0, RND_INV_ROW, 0, RND_INV_ROW, 0, RND_INV_ROW, 0};
+static __align16(const short, M128_one_corr[8]) = {1, 1, 1, 1, 1, 1, 1, 1};
+static __align16(const short, M128_round_inv_col[8]) = {RND_INV_COL, RND_INV_COL, RND_INV_COL, RND_INV_COL, RND_INV_COL, RND_INV_COL, RND_INV_COL, RND_INV_COL};
+static __align16(const short, M128_round_inv_corr[8]) = {RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR};
+static __align16(const short, M128_tg_1_16[8]) = {13036, 13036, 13036, 13036, 13036, 13036, 13036, 13036}; // tg * (2<<16) + 0.5
+static __align16(const short, M128_tg_2_16[8]) = {27146, 27146, 27146, 27146, 27146, 27146, 27146, 27146}; // tg * (2<<16) + 0.5
+static __align16(const short, M128_tg_3_16[8]) = { -21746, -21746, -21746, -21746, -21746, -21746, -21746, -21746}; // tg * (2<<16) + 0.5
+static __align16(const short, M128_cos_4_16[8]) = { -19195, -19195, -19195, -19195, -19195, -19195, -19195, -19195}; // cos * (2<<16) + 0.5
-static __align16(const int16_t,M128_tab_i_04[])= {16384, 21407, 16384, 8867, 16384, -8867, 16384, -21407, 16384, 8867, -16384, -21407, -16384, 21407, 16384, -8867, 22725, 19266, 19266, -4520, 12873, -22725, 4520, -12873, 12873, 4520, -22725, -12873, 4520, 19266, 19266, -22725};
-static __align16(const int16_t,M128_tab_i_17[])= {22725, 29692, 22725, 12299, 22725, -12299, 22725, -29692, 22725, 12299, -22725, -29692, -22725, 29692, 22725, -12299, 31521, 26722, 26722, -6270, 17855, -31521, 6270, -17855, 17855, 6270, -31521, -17855, 6270, 26722, 26722, -31521};
-static __align16(const int16_t,M128_tab_i_26[])= {21407, 27969, 21407, 11585, 21407, -11585, 21407, -27969, 21407, 11585, -21407, -27969, -21407, 27969, 21407, -11585, 29692, 25172, 25172, -5906, 16819, -29692, 5906, -16819, 16819, 5906, -29692, -16819, 5906, 25172, 25172, -29692};
-static __align16(const int16_t,M128_tab_i_35[])= {19266, 25172, 19266, 10426, 19266, -10426, 19266, -25172, 19266, 10426, -19266, -25172, -19266, 25172, 19266, -10426, 26722, 22654, 22654, -5315, 15137, -26722, 5315, -15137, 15137, 5315, -26722, -15137, 5315, 22654, 22654, -26722};
+static __align16(const int16_t, M128_tab_i_04[]) = {16384, 21407, 16384, 8867, 16384, -8867, 16384, -21407, 16384, 8867, -16384, -21407, -16384, 21407, 16384, -8867, 22725, 19266, 19266, -4520, 12873, -22725, 4520, -12873, 12873, 4520, -22725, -12873, 4520, 19266, 19266, -22725};
+static __align16(const int16_t, M128_tab_i_17[]) = {22725, 29692, 22725, 12299, 22725, -12299, 22725, -29692, 22725, 12299, -22725, -29692, -22725, 29692, 22725, -12299, 31521, 26722, 26722, -6270, 17855, -31521, 6270, -17855, 17855, 6270, -31521, -17855, 6270, 26722, 26722, -31521};
+static __align16(const int16_t, M128_tab_i_26[]) = {21407, 27969, 21407, 11585, 21407, -11585, 21407, -27969, 21407, 11585, -21407, -27969, -21407, 27969, 21407, -11585, 29692, 25172, 25172, -5906, 16819, -29692, 5906, -16819, 16819, 5906, -29692, -16819, 5906, 25172, 25172, -29692};
+static __align16(const int16_t, M128_tab_i_35[]) = {19266, 25172, 19266, 10426, 19266, -10426, 19266, -25172, 19266, 10426, -19266, -25172, -19266, 25172, 19266, -10426, 26722, 22654, 22654, -5315, 15137, -26722, 5315, -15137, 15137, 5315, -26722, -15137, 5315, 22654, 22654, -26722};
-static __forceinline void DCT_8_INV_ROW(const uint8_t * const ecx,const uint8_t * const esi,__m128i &xmm0,__m128i &xmm1,__m128i &xmm2,__m128i &xmm3,__m128i &xmm4,__m128i &xmm5,__m128i &xmm6,__m128i &xmm7)
+static __forceinline void DCT_8_INV_ROW(const uint8_t* const ecx, const uint8_t* const esi, __m128i& xmm0, __m128i& xmm1, __m128i& xmm2, __m128i& xmm3, __m128i& xmm4, __m128i& xmm5, __m128i& xmm6, __m128i& xmm7)
{
- xmm0=_mm_shufflelo_epi16(xmm0, 0xD8 );
- xmm1=_mm_shuffle_epi32( xmm0, 0 );
- pmaddwd (xmm1, esi);
- xmm3=_mm_shuffle_epi32( xmm0, 0x55);
- xmm0=_mm_shufflehi_epi16( xmm0, 0xD8 );
- pmaddwd( xmm3, esi+32 );
- xmm2=_mm_shuffle_epi32( xmm0, 0xAA );
- xmm0=_mm_shuffle_epi32( xmm0, 0xFF );
- pmaddwd( xmm2, esi+16 );
- xmm4=_mm_shufflehi_epi16( xmm4, 0xD8 );
- paddd (xmm1, M128_round_inv_row);
- xmm4=_mm_shufflelo_epi16 (xmm4, 0xD8 );
- pmaddwd (xmm0, esi+48 );
- xmm5=_mm_shuffle_epi32( xmm4, 0 );
- xmm6=_mm_shuffle_epi32( xmm4, 0xAA );
- pmaddwd (xmm5, ecx );
- paddd (xmm1, xmm2 );
- movdqa (xmm2, xmm1 );
- xmm7=_mm_shuffle_epi32( xmm4, 0x55 );
- pmaddwd (xmm6, ecx+16 );
- paddd (xmm0, xmm3 );
- xmm4=_mm_shuffle_epi32( xmm4, 0xFF );
- psubd (xmm2, xmm0 );
- pmaddwd (xmm7, ecx+32 );
- paddd (xmm0, xmm1 );
- psrad (xmm2, 12 );
- paddd (xmm5, M128_round_inv_row);
- pmaddwd (xmm4, ecx+48 );
- paddd (xmm5, xmm6 );
- movdqa (xmm6, xmm5 );
- psrad (xmm0, 12 );
- xmm2=_mm_shuffle_epi32( xmm2, 0x1B );
- packssdw (xmm0, xmm2 );
- paddd (xmm4, xmm7 );
- psubd (xmm6, xmm4 );
- paddd (xmm4, xmm5 );
- psrad (xmm6, 12 );
- psrad (xmm4, 12 );
- xmm6=_mm_shuffle_epi32( xmm6, 0x1B );
- packssdw (xmm4, xmm6 );
+ xmm0 = _mm_shufflelo_epi16(xmm0, 0xD8);
+ xmm1 = _mm_shuffle_epi32(xmm0, 0);
+ pmaddwd(xmm1, esi);
+ xmm3 = _mm_shuffle_epi32(xmm0, 0x55);
+ xmm0 = _mm_shufflehi_epi16(xmm0, 0xD8);
+ pmaddwd(xmm3, esi + 32);
+ xmm2 = _mm_shuffle_epi32(xmm0, 0xAA);
+ xmm0 = _mm_shuffle_epi32(xmm0, 0xFF);
+ pmaddwd(xmm2, esi + 16);
+ xmm4 = _mm_shufflehi_epi16(xmm4, 0xD8);
+ paddd(xmm1, M128_round_inv_row);
+ xmm4 = _mm_shufflelo_epi16(xmm4, 0xD8);
+ pmaddwd(xmm0, esi + 48);
+ xmm5 = _mm_shuffle_epi32(xmm4, 0);
+ xmm6 = _mm_shuffle_epi32(xmm4, 0xAA);
+ pmaddwd(xmm5, ecx);
+ paddd(xmm1, xmm2);
+ movdqa(xmm2, xmm1);
+ xmm7 = _mm_shuffle_epi32(xmm4, 0x55);
+ pmaddwd(xmm6, ecx + 16);
+ paddd(xmm0, xmm3);
+ xmm4 = _mm_shuffle_epi32(xmm4, 0xFF);
+ psubd(xmm2, xmm0);
+ pmaddwd(xmm7, ecx + 32);
+ paddd(xmm0, xmm1);
+ psrad(xmm2, 12);
+ paddd(xmm5, M128_round_inv_row);
+ pmaddwd(xmm4, ecx + 48);
+ paddd(xmm5, xmm6);
+ movdqa(xmm6, xmm5);
+ psrad(xmm0, 12);
+ xmm2 = _mm_shuffle_epi32(xmm2, 0x1B);
+ packssdw(xmm0, xmm2);
+ paddd(xmm4, xmm7);
+ psubd(xmm6, xmm4);
+ paddd(xmm4, xmm5);
+ psrad(xmm6, 12);
+ psrad(xmm4, 12);
+ xmm6 = _mm_shuffle_epi32(xmm6, 0x1B);
+ packssdw(xmm4, xmm6);
}
-static __forceinline void DCT_8_INV_COL_8(__m128i &src0,__m128i &src1,__m128i &src2,__m128i &src3,__m128i &src4,__m128i &src5,__m128i &src6,__m128i &src7,
- __m128i &xmm0,__m128i &xmm1,__m128i &xmm2,__m128i &xmm3,__m128i &xmm4,__m128i &xmm5,__m128i &xmm6,__m128i &xmm7)
+static __forceinline void DCT_8_INV_COL_8(__m128i& src0, __m128i& src1, __m128i& src2, __m128i& src3, __m128i& src4, __m128i& src5, __m128i& src6, __m128i& src7,
+ __m128i& xmm0, __m128i& xmm1, __m128i& xmm2, __m128i& xmm3, __m128i& xmm4, __m128i& xmm5, __m128i& xmm6, __m128i& xmm7)
{
- movdqa( xmm1, M128_tg_3_16 );
- movdqa( xmm2, xmm0 );
- movdqa( xmm3, src3 );
- pmulhw( xmm0, xmm1 );
- pmulhw( xmm1, xmm3 );
- movdqa( xmm5, M128_tg_1_16 );
- movdqa( xmm6, xmm4 );
- pmulhw( xmm4, xmm5 );
- paddsw( xmm0, xmm2 );
- pmulhw( xmm5, src1 );
- paddsw( xmm1, xmm3 );
- movdqa( xmm7, src6 );
- paddsw( xmm0, xmm3 );
- movdqa( xmm3, M128_tg_2_16 );
- psubsw( xmm2, xmm1 );
- pmulhw( xmm7, xmm3 );
- movdqa( xmm1, xmm0 );
- pmulhw( xmm3, src2 );
- psubsw( xmm5, xmm6 );
- paddsw( xmm4, src1 );
- paddsw( xmm0, xmm4 );
- paddsw( xmm0, M128_one_corr );
- psubsw( xmm4, xmm1 );
- movdqa( xmm6, xmm5 );
- psubsw( xmm5, xmm2 );
- paddsw( xmm5, M128_one_corr );
- paddsw( xmm6, xmm2 );
- movdqa( src7, xmm0 );
- movdqa( xmm1, xmm4 );
- movdqa( xmm0, M128_cos_4_16 );
- paddsw( xmm4, xmm5 );
- movdqa( xmm2, M128_cos_4_16 );
- pmulhw( xmm2, xmm4 );
- movdqa( src3, xmm6 );
- psubsw( xmm1, xmm5 );
- paddsw( xmm7, src2 );
- psubsw( xmm3, src6 );
- movdqa( xmm6, src0 );
- pmulhw( xmm0, xmm1 );
- movdqa( xmm5, src4 );
- paddsw( xmm5, xmm6 );
- psubsw( xmm6, src4 );
- paddsw( xmm4, xmm2 );
- por ( xmm4, M128_one_corr );
- paddsw( xmm0, xmm1 );
- por ( xmm0, M128_one_corr );
- movdqa( xmm2, xmm5 );
- paddsw( xmm5, xmm7 );
- movdqa( xmm1, xmm6 );
- paddsw( xmm5, M128_round_inv_col );
- psubsw( xmm2, xmm7 );
- movdqa( xmm7, src7 );
- paddsw( xmm6, xmm3 );
- paddsw( xmm6, M128_round_inv_col );
- paddsw( xmm7, xmm5 );
- psraw ( xmm7, SHIFT_INV_COL );
- psubsw( xmm1, xmm3 );
- paddsw( xmm1, M128_round_inv_corr );
- movdqa( xmm3, xmm6 );
- paddsw( xmm2, M128_round_inv_corr );
- paddsw( xmm6, xmm4 );
- movdqa( src0,xmm7 );
- psraw (xmm6, SHIFT_INV_COL );
- movdqa( xmm7, xmm1 );
- paddsw( xmm1, xmm0 );
- movdqa( src1, xmm6 );
- psraw (xmm1, SHIFT_INV_COL );
- movdqa( xmm6, src3 );
- psubsw( xmm7, xmm0 );
- psraw (xmm7, SHIFT_INV_COL );
- movdqa( src2, xmm1 );
- psubsw( xmm5, src7 );
- psraw (xmm5, SHIFT_INV_COL );
- movdqa( src7, xmm5 );
- psubsw( xmm3, xmm4 );
- paddsw( xmm6, xmm2 );
- psubsw( xmm2, src3 );
- psraw (xmm6, SHIFT_INV_COL );
- psraw (xmm2, SHIFT_INV_COL );
- movdqa( src3, xmm6 );
- psraw (xmm3, SHIFT_INV_COL );
- movdqa( src4, xmm2 );
- movdqa( src5, xmm7 );
- movdqa( src6, xmm3 );
+ movdqa(xmm1, M128_tg_3_16);
+ movdqa(xmm2, xmm0);
+ movdqa(xmm3, src3);
+ pmulhw(xmm0, xmm1);
+ pmulhw(xmm1, xmm3);
+ movdqa(xmm5, M128_tg_1_16);
+ movdqa(xmm6, xmm4);
+ pmulhw(xmm4, xmm5);
+ paddsw(xmm0, xmm2);
+ pmulhw(xmm5, src1);
+ paddsw(xmm1, xmm3);
+ movdqa(xmm7, src6);
+ paddsw(xmm0, xmm3);
+ movdqa(xmm3, M128_tg_2_16);
+ psubsw(xmm2, xmm1);
+ pmulhw(xmm7, xmm3);
+ movdqa(xmm1, xmm0);
+ pmulhw(xmm3, src2);
+ psubsw(xmm5, xmm6);
+ paddsw(xmm4, src1);
+ paddsw(xmm0, xmm4);
+ paddsw(xmm0, M128_one_corr);
+ psubsw(xmm4, xmm1);
+ movdqa(xmm6, xmm5);
+ psubsw(xmm5, xmm2);
+ paddsw(xmm5, M128_one_corr);
+ paddsw(xmm6, xmm2);
+ movdqa(src7, xmm0);
+ movdqa(xmm1, xmm4);
+ movdqa(xmm0, M128_cos_4_16);
+ paddsw(xmm4, xmm5);
+ movdqa(xmm2, M128_cos_4_16);
+ pmulhw(xmm2, xmm4);
+ movdqa(src3, xmm6);
+ psubsw(xmm1, xmm5);
+ paddsw(xmm7, src2);
+ psubsw(xmm3, src6);
+ movdqa(xmm6, src0);
+ pmulhw(xmm0, xmm1);
+ movdqa(xmm5, src4);
+ paddsw(xmm5, xmm6);
+ psubsw(xmm6, src4);
+ paddsw(xmm4, xmm2);
+ por(xmm4, M128_one_corr);
+ paddsw(xmm0, xmm1);
+ por(xmm0, M128_one_corr);
+ movdqa(xmm2, xmm5);
+ paddsw(xmm5, xmm7);
+ movdqa(xmm1, xmm6);
+ paddsw(xmm5, M128_round_inv_col);
+ psubsw(xmm2, xmm7);
+ movdqa(xmm7, src7);
+ paddsw(xmm6, xmm3);
+ paddsw(xmm6, M128_round_inv_col);
+ paddsw(xmm7, xmm5);
+ psraw(xmm7, SHIFT_INV_COL);
+ psubsw(xmm1, xmm3);
+ paddsw(xmm1, M128_round_inv_corr);
+ movdqa(xmm3, xmm6);
+ paddsw(xmm2, M128_round_inv_corr);
+ paddsw(xmm6, xmm4);
+ movdqa(src0, xmm7);
+ psraw(xmm6, SHIFT_INV_COL);
+ movdqa(xmm7, xmm1);
+ paddsw(xmm1, xmm0);
+ movdqa(src1, xmm6);
+ psraw(xmm1, SHIFT_INV_COL);
+ movdqa(xmm6, src3);
+ psubsw(xmm7, xmm0);
+ psraw(xmm7, SHIFT_INV_COL);
+ movdqa(src2, xmm1);
+ psubsw(xmm5, src7);
+ psraw(xmm5, SHIFT_INV_COL);
+ movdqa(src7, xmm5);
+ psubsw(xmm3, xmm4);
+ paddsw(xmm6, xmm2);
+ psubsw(xmm2, src3);
+ psraw(xmm6, SHIFT_INV_COL);
+ psraw(xmm2, SHIFT_INV_COL);
+ movdqa(src3, xmm6);
+ psraw(xmm3, SHIFT_INV_COL);
+ movdqa(src4, xmm2);
+ movdqa(src5, xmm7);
+ movdqa(src6, xmm3);
}
-static __forceinline void idct_M128ASM(__m128i &src0,__m128i &src1,__m128i &src2,__m128i &src3,__m128i &src4,__m128i &src5,__m128i &src6,__m128i &src7)
+static __forceinline void idct_M128ASM(__m128i& src0, __m128i& src1, __m128i& src2, __m128i& src3, __m128i& src4, __m128i& src5, __m128i& src6, __m128i& src7)
{
- __m128i xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7;
- movdqa (xmm0, src0);
- uint8_t *esi=(uint8_t*)M128_tab_i_04;
- movdqa (xmm4, src2);
- uint8_t *ecx=(uint8_t*)M128_tab_i_26;
- DCT_8_INV_ROW(ecx,esi,xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7);
- movdqa (src0, xmm0);
- movdqa (src2, xmm4);
+ __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7;
+ movdqa(xmm0, src0);
+ uint8_t* esi = (uint8_t*)M128_tab_i_04;
+ movdqa(xmm4, src2);
+ uint8_t* ecx = (uint8_t*)M128_tab_i_26;
+ DCT_8_INV_ROW(ecx, esi, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+ movdqa(src0, xmm0);
+ movdqa(src2, xmm4);
- movdqa (xmm0, src4);
- movdqa (xmm4, src6);
- DCT_8_INV_ROW(ecx,esi,xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7);
- movdqa (src4, xmm0);
- movdqa (src6, xmm4);
+ movdqa(xmm0, src4);
+ movdqa(xmm4, src6);
+ DCT_8_INV_ROW(ecx, esi, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+ movdqa(src4, xmm0);
+ movdqa(src6, xmm4);
- movdqa (xmm0, src3);
- esi=(uint8_t*)M128_tab_i_35;
- movdqa (xmm4, src1);
- ecx=(uint8_t*)M128_tab_i_17;
- DCT_8_INV_ROW(ecx,esi,xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7);
- movdqa (src3, xmm0);
- movdqa (src1, xmm4);
+ movdqa(xmm0, src3);
+ esi = (uint8_t*)M128_tab_i_35;
+ movdqa(xmm4, src1);
+ ecx = (uint8_t*)M128_tab_i_17;
+ DCT_8_INV_ROW(ecx, esi, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+ movdqa(src3, xmm0);
+ movdqa(src1, xmm4);
- movdqa (xmm0, src5);
- movdqa (xmm4, src7);
- DCT_8_INV_ROW(ecx,esi,xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7);
- DCT_8_INV_COL_8(src0,src1,src2,src3,src4,src5,src6,src7,
- xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7);
+ movdqa(xmm0, src5);
+ movdqa(xmm4, src7);
+ DCT_8_INV_ROW(ecx, esi, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
+ DCT_8_INV_COL_8(src0, src1, src2, src3, src4, src5, src6, src7,
+ xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7);
}
void mpeg2_idct_copy_sse2(int16_t* block, uint8_t* dest, const int stride)
{
- __m128i &src0=*(__m128i*)(block+0*16/2);
- __m128i &src1=*(__m128i*)(block+1*16/2);
- __m128i &src2=*(__m128i*)(block+2*16/2);
- __m128i &src3=*(__m128i*)(block+3*16/2);
- __m128i &src4=*(__m128i*)(block+4*16/2);
- __m128i &src5=*(__m128i*)(block+5*16/2);
- __m128i &src6=*(__m128i*)(block+6*16/2);
- __m128i &src7=*(__m128i*)(block+7*16/2);
- idct_M128ASM (src0,src1,src2,src3,src4,src5,src6,src7);
+ __m128i& src0 = *(__m128i*)(block + 0 * 16 / 2);
+ __m128i& src1 = *(__m128i*)(block + 1 * 16 / 2);
+ __m128i& src2 = *(__m128i*)(block + 2 * 16 / 2);
+ __m128i& src3 = *(__m128i*)(block + 3 * 16 / 2);
+ __m128i& src4 = *(__m128i*)(block + 4 * 16 / 2);
+ __m128i& src5 = *(__m128i*)(block + 5 * 16 / 2);
+ __m128i& src6 = *(__m128i*)(block + 6 * 16 / 2);
+ __m128i& src7 = *(__m128i*)(block + 7 * 16 / 2);
+ idct_M128ASM(src0, src1, src2, src3, src4, src5, src6, src7);
- __m128i zero = _mm_setzero_si128();
+ __m128i zero = _mm_setzero_si128();
- __m128i r0 = _mm_packus_epi16(_mm_load_si128(&src0), _mm_load_si128(&src1));
- __m128i r1 = _mm_packus_epi16(_mm_load_si128(&src2), _mm_load_si128(&src3));
- __m128i r2 = _mm_packus_epi16(_mm_load_si128(&src4), _mm_load_si128(&src5));
- __m128i r3 = _mm_packus_epi16(_mm_load_si128(&src6), _mm_load_si128(&src7));
+ __m128i r0 = _mm_packus_epi16(_mm_load_si128(&src0), _mm_load_si128(&src1));
+ __m128i r1 = _mm_packus_epi16(_mm_load_si128(&src2), _mm_load_si128(&src3));
+ __m128i r2 = _mm_packus_epi16(_mm_load_si128(&src4), _mm_load_si128(&src5));
+ __m128i r3 = _mm_packus_epi16(_mm_load_si128(&src6), _mm_load_si128(&src7));
- _mm_storel_pi((__m64*)&dest[0*stride], *(__m128*)&r0);
- _mm_storeh_pi((__m64*)&dest[1*stride], *(__m128*)&r0);
- _mm_storel_pi((__m64*)&dest[2*stride], *(__m128*)&r1);
- _mm_storeh_pi((__m64*)&dest[3*stride], *(__m128*)&r1);
- _mm_storel_pi((__m64*)&dest[4*stride], *(__m128*)&r2);
- _mm_storeh_pi((__m64*)&dest[5*stride], *(__m128*)&r2);
- _mm_storel_pi((__m64*)&dest[6*stride], *(__m128*)&r3);
- _mm_storeh_pi((__m64*)&dest[7*stride], *(__m128*)&r3);
+ _mm_storel_pi((__m64*)&dest[0 * stride], *(__m128*)&r0);
+ _mm_storeh_pi((__m64*)&dest[1 * stride], *(__m128*)&r0);
+ _mm_storel_pi((__m64*)&dest[2 * stride], *(__m128*)&r1);
+ _mm_storeh_pi((__m64*)&dest[3 * stride], *(__m128*)&r1);
+ _mm_storel_pi((__m64*)&dest[4 * stride], *(__m128*)&r2);
+ _mm_storeh_pi((__m64*)&dest[5 * stride], *(__m128*)&r2);
+ _mm_storel_pi((__m64*)&dest[6 * stride], *(__m128*)&r3);
+ _mm_storeh_pi((__m64*)&dest[7 * stride], *(__m128*)&r3);
- _mm_store_si128(&src0, zero);
- _mm_store_si128(&src1, zero);
- _mm_store_si128(&src2, zero);
- _mm_store_si128(&src3, zero);
- _mm_store_si128(&src4, zero);
- _mm_store_si128(&src5, zero);
- _mm_store_si128(&src6, zero);
- _mm_store_si128(&src7, zero);
+ _mm_store_si128(&src0, zero);
+ _mm_store_si128(&src1, zero);
+ _mm_store_si128(&src2, zero);
+ _mm_store_si128(&src3, zero);
+ _mm_store_si128(&src4, zero);
+ _mm_store_si128(&src5, zero);
+ _mm_store_si128(&src6, zero);
+ _mm_store_si128(&src7, zero);
}
-void mpeg2_idct_add_sse2(int,int16_t* block, uint8_t* dest, const int stride)
+void mpeg2_idct_add_sse2(int, int16_t* block, uint8_t* dest, const int stride)
{
- __m128i &src0=*(__m128i*)(block+0*16/2);
- __m128i &src1=*(__m128i*)(block+1*16/2);
- __m128i &src2=*(__m128i*)(block+2*16/2);
- __m128i &src3=*(__m128i*)(block+3*16/2);
- __m128i &src4=*(__m128i*)(block+4*16/2);
- __m128i &src5=*(__m128i*)(block+5*16/2);
- __m128i &src6=*(__m128i*)(block+6*16/2);
- __m128i &src7=*(__m128i*)(block+7*16/2);
- idct_M128ASM (src0,src1,src2,src3,src4,src5,src6,src7);
+ __m128i& src0 = *(__m128i*)(block + 0 * 16 / 2);
+ __m128i& src1 = *(__m128i*)(block + 1 * 16 / 2);
+ __m128i& src2 = *(__m128i*)(block + 2 * 16 / 2);
+ __m128i& src3 = *(__m128i*)(block + 3 * 16 / 2);
+ __m128i& src4 = *(__m128i*)(block + 4 * 16 / 2);
+ __m128i& src5 = *(__m128i*)(block + 5 * 16 / 2);
+ __m128i& src6 = *(__m128i*)(block + 6 * 16 / 2);
+ __m128i& src7 = *(__m128i*)(block + 7 * 16 / 2);
+ idct_M128ASM(src0, src1, src2, src3, src4, src5, src6, src7);
- __m128i zero = _mm_setzero_si128();
+ __m128i zero = _mm_setzero_si128();
- __m128i r0 = _mm_load_si128(&src0);
- __m128i r1 = _mm_load_si128(&src1);
- __m128i r2 = _mm_load_si128(&src2);
- __m128i r3 = _mm_load_si128(&src3);
- __m128i r4 = _mm_load_si128(&src4);
- __m128i r5 = _mm_load_si128(&src5);
- __m128i r6 = _mm_load_si128(&src6);
- __m128i r7 = _mm_load_si128(&src7);
+ __m128i r0 = _mm_load_si128(&src0);
+ __m128i r1 = _mm_load_si128(&src1);
+ __m128i r2 = _mm_load_si128(&src2);
+ __m128i r3 = _mm_load_si128(&src3);
+ __m128i r4 = _mm_load_si128(&src4);
+ __m128i r5 = _mm_load_si128(&src5);
+ __m128i r6 = _mm_load_si128(&src6);
+ __m128i r7 = _mm_load_si128(&src7);
- __m128 q0 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[0*stride]);
- __m128 q1 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[1*stride]);
- __m128 q2 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[2*stride]);
- __m128 q3 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[3*stride]);
- __m128 q4 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[4*stride]);
- __m128 q5 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[5*stride]);
- __m128 q6 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[6*stride]);
- __m128 q7 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[7*stride]);
+ __m128 q0 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[0 * stride]);
+ __m128 q1 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[1 * stride]);
+ __m128 q2 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[2 * stride]);
+ __m128 q3 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[3 * stride]);
+ __m128 q4 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[4 * stride]);
+ __m128 q5 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[5 * stride]);
+ __m128 q6 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[6 * stride]);
+ __m128 q7 = _mm_loadl_pi(*(__m128*)&zero, (__m64*)&dest[7 * stride]);
- r0 = _mm_adds_epi16(r0, _mm_unpacklo_epi8(*(__m128i*)&q0, zero));
- r1 = _mm_adds_epi16(r1, _mm_unpacklo_epi8(*(__m128i*)&q1, zero));
- r2 = _mm_adds_epi16(r2, _mm_unpacklo_epi8(*(__m128i*)&q2, zero));
- r3 = _mm_adds_epi16(r3, _mm_unpacklo_epi8(*(__m128i*)&q3, zero));
- r4 = _mm_adds_epi16(r4, _mm_unpacklo_epi8(*(__m128i*)&q4, zero));
- r5 = _mm_adds_epi16(r5, _mm_unpacklo_epi8(*(__m128i*)&q5, zero));
- r6 = _mm_adds_epi16(r6, _mm_unpacklo_epi8(*(__m128i*)&q6, zero));
- r7 = _mm_adds_epi16(r7, _mm_unpacklo_epi8(*(__m128i*)&q7, zero));
+ r0 = _mm_adds_epi16(r0, _mm_unpacklo_epi8(*(__m128i*)&q0, zero));
+ r1 = _mm_adds_epi16(r1, _mm_unpacklo_epi8(*(__m128i*)&q1, zero));
+ r2 = _mm_adds_epi16(r2, _mm_unpacklo_epi8(*(__m128i*)&q2, zero));
+ r3 = _mm_adds_epi16(r3, _mm_unpacklo_epi8(*(__m128i*)&q3, zero));
+ r4 = _mm_adds_epi16(r4, _mm_unpacklo_epi8(*(__m128i*)&q4, zero));
+ r5 = _mm_adds_epi16(r5, _mm_unpacklo_epi8(*(__m128i*)&q5, zero));
+ r6 = _mm_adds_epi16(r6, _mm_unpacklo_epi8(*(__m128i*)&q6, zero));
+ r7 = _mm_adds_epi16(r7, _mm_unpacklo_epi8(*(__m128i*)&q7, zero));
- r0 = _mm_packus_epi16(r0, r1);
- r1 = _mm_packus_epi16(r2, r3);
- r2 = _mm_packus_epi16(r4, r5);
- r3 = _mm_packus_epi16(r6, r7);
+ r0 = _mm_packus_epi16(r0, r1);
+ r1 = _mm_packus_epi16(r2, r3);
+ r2 = _mm_packus_epi16(r4, r5);
+ r3 = _mm_packus_epi16(r6, r7);
- _mm_storel_pi((__m64*)&dest[0*stride], *(__m128*)&r0);
- _mm_storeh_pi((__m64*)&dest[1*stride], *(__m128*)&r0);
- _mm_storel_pi((__m64*)&dest[2*stride], *(__m128*)&r1);
- _mm_storeh_pi((__m64*)&dest[3*stride], *(__m128*)&r1);
- _mm_storel_pi((__m64*)&dest[4*stride], *(__m128*)&r2);
- _mm_storeh_pi((__m64*)&dest[5*stride], *(__m128*)&r2);
- _mm_storel_pi((__m64*)&dest[6*stride], *(__m128*)&r3);
- _mm_storeh_pi((__m64*)&dest[7*stride], *(__m128*)&r3);
+ _mm_storel_pi((__m64*)&dest[0 * stride], *(__m128*)&r0);
+ _mm_storeh_pi((__m64*)&dest[1 * stride], *(__m128*)&r0);
+ _mm_storel_pi((__m64*)&dest[2 * stride], *(__m128*)&r1);
+ _mm_storeh_pi((__m64*)&dest[3 * stride], *(__m128*)&r1);
+ _mm_storel_pi((__m64*)&dest[4 * stride], *(__m128*)&r2);
+ _mm_storeh_pi((__m64*)&dest[5 * stride], *(__m128*)&r2);
+ _mm_storel_pi((__m64*)&dest[6 * stride], *(__m128*)&r3);
+ _mm_storeh_pi((__m64*)&dest[7 * stride], *(__m128*)&r3);
- _mm_store_si128(&src0, zero);
- _mm_store_si128(&src1, zero);
- _mm_store_si128(&src2, zero);
- _mm_store_si128(&src3, zero);
- _mm_store_si128(&src4, zero);
- _mm_store_si128(&src5, zero);
- _mm_store_si128(&src6, zero);
- _mm_store_si128(&src7, zero);
+ _mm_store_si128(&src0, zero);
+ _mm_store_si128(&src1, zero);
+ _mm_store_si128(&src2, zero);
+ _mm_store_si128(&src3, zero);
+ _mm_store_si128(&src4, zero);
+ _mm_store_si128(&src5, zero);
+ _mm_store_si128(&src6, zero);
+ _mm_store_si128(&src7, zero);
}
void mpeg2_idct_init_sse2()
diff --git a/src/filters/transform/Mpeg2DecFilter/mc_sse2.cpp b/src/filters/transform/Mpeg2DecFilter/mc_sse2.cpp
index ff0de812e..33fedcbb5 100644
--- a/src/filters/transform/Mpeg2DecFilter/mc_sse2.cpp
+++ b/src/filters/transform/Mpeg2DecFilter/mc_sse2.cpp
@@ -30,456 +30,456 @@
#include "attributes.h"
#include "../../../DSUtil/simd.h"
-static const __m128i const_1_16_bytes=_mm_set1_epi16(1);
+static const __m128i const_1_16_bytes = _mm_set1_epi16(1);
static void MC_put_o_16_sse2(uint8_t* ecx, const uint8_t* edx, const int eax, int esi)
{
- const int edi= eax+eax;
- const int ebx= edi+eax;
- for (; esi; edx+=edi*2,ecx+=edi*2,esi-=4) {
- __m128i xmm0,xmm1,xmm2,xmm3;
- movdqu (xmm0, edx );
- movdqu (xmm1, edx+eax);
- movdqu (xmm2, edx+edi);
- movdqu (xmm3, edx+ebx);
- movdqa (ecx, xmm0 );
- movdqa (ecx+eax, xmm1 );
- movdqa (ecx+edi, xmm2 );
- movdqa (ecx+ebx, xmm3 );
- }
+ const int edi = eax + eax;
+ const int ebx = edi + eax;
+ for (; esi; edx += edi * 2, ecx += edi * 2, esi -= 4) {
+ __m128i xmm0, xmm1, xmm2, xmm3;
+ movdqu(xmm0, edx);
+ movdqu(xmm1, edx + eax);
+ movdqu(xmm2, edx + edi);
+ movdqu(xmm3, edx + ebx);
+ movdqa(ecx, xmm0);
+ movdqa(ecx + eax, xmm1);
+ movdqa(ecx + edi, xmm2);
+ movdqa(ecx + ebx, xmm3);
+ }
}
static void MC_put_o_8_sse2(uint8_t* ecx, const uint8_t* edx, const int eax, int esi)
{
- const int edi= eax+eax;
- const int ebx= edi+eax;
- for (; esi; edx+=edi*2,ecx+=edi*2,esi-=4) {
- __m128d xmm0,xmm1,xmm2,xmm3;
- movlpd (xmm0, edx);
- movlpd (xmm1, edx+eax);
- movlpd (xmm2, edx+edi);
- movlpd (xmm3, edx+ebx);
- movlpd (ecx, xmm0);
- movlpd (ecx+eax, xmm1 );
- movlpd (ecx+edi, xmm2);
- movlpd (ecx+ebx, xmm3 );
- }
+ const int edi = eax + eax;
+ const int ebx = edi + eax;
+ for (; esi; edx += edi * 2, ecx += edi * 2, esi -= 4) {
+ __m128d xmm0, xmm1, xmm2, xmm3;
+ movlpd(xmm0, edx);
+ movlpd(xmm1, edx + eax);
+ movlpd(xmm2, edx + edi);
+ movlpd(xmm3, edx + ebx);
+ movlpd(ecx, xmm0);
+ movlpd(ecx + eax, xmm1);
+ movlpd(ecx + edi, xmm2);
+ movlpd(ecx + ebx, xmm3);
+ }
}
static void MC_put_x_16_sse2(uint8_t* ecx, const uint8_t* edx, const int eax, int esi)
{
- const int edi= eax+eax;
- const int ebx= edi+eax;
- for (; esi; edx+=edi*2,ecx+=edi*2,esi-=4) {
- __m128i xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7;
- movdqu (xmm0, edx);
- movdqu (xmm1, edx+1);
- movdqu (xmm2, edx+eax);
- movdqu (xmm3, edx+eax+1);
- movdqu (xmm4, edx+edi);
- movdqu( xmm5, edx+edi+1);
- movdqu( xmm6, edx+ebx );
- movdqu( xmm7, edx+ebx+1 );
- pavgb (xmm0, xmm1);
- pavgb (xmm2, xmm3);
- pavgb (xmm4, xmm5);
- pavgb (xmm6, xmm7);
- movdqa (ecx, xmm0);
- movdqa (ecx+eax, xmm2);
- movdqa (ecx+edi, xmm4);
- movdqa (ecx+ebx, xmm6);
- }
+ const int edi = eax + eax;
+ const int ebx = edi + eax;
+ for (; esi; edx += edi * 2, ecx += edi * 2, esi -= 4) {
+ __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7;
+ movdqu(xmm0, edx);
+ movdqu(xmm1, edx + 1);
+ movdqu(xmm2, edx + eax);
+ movdqu(xmm3, edx + eax + 1);
+ movdqu(xmm4, edx + edi);
+ movdqu(xmm5, edx + edi + 1);
+ movdqu(xmm6, edx + ebx);
+ movdqu(xmm7, edx + ebx + 1);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm2, xmm3);
+ pavgb(xmm4, xmm5);
+ pavgb(xmm6, xmm7);
+ movdqa(ecx, xmm0);
+ movdqa(ecx + eax, xmm2);
+ movdqa(ecx + edi, xmm4);
+ movdqa(ecx + ebx, xmm6);
+ }
}
static void MC_put_x_8_sse2(uint8_t* ecx, const uint8_t* edx, const int eax, int esi)
{
- const int edi= eax+eax;
- const int ebx= edi+eax;
- __m128i xmm0,xmm1,xmm2,xmm3;
- for (; esi; edx+=edi*2,ecx+=edi*2,esi-=4) {
- movlpd (xmm0, edx);
- movlpd (xmm1, edx+1);
- movhpd (xmm0, edx+eax);
- movhpd (xmm1, edx+eax+1);
- movlpd (xmm2, edx+edi);
- movlpd (xmm3, edx+edi+1);
- movhpd (xmm2, edx+ebx);
- movhpd (xmm3, edx+ebx+1);
- pavgb (xmm0, xmm1);
- pavgb (xmm2, xmm3);
- movlpd (ecx, xmm0);
- movhpd (ecx+eax, xmm0);
- movlpd (ecx+edi, xmm2);
- movhpd (ecx+ebx, xmm2);
- }
+ const int edi = eax + eax;
+ const int ebx = edi + eax;
+ __m128i xmm0, xmm1, xmm2, xmm3;
+ for (; esi; edx += edi * 2, ecx += edi * 2, esi -= 4) {
+ movlpd(xmm0, edx);
+ movlpd(xmm1, edx + 1);
+ movhpd(xmm0, edx + eax);
+ movhpd(xmm1, edx + eax + 1);
+ movlpd(xmm2, edx + edi);
+ movlpd(xmm3, edx + edi + 1);
+ movhpd(xmm2, edx + ebx);
+ movhpd(xmm3, edx + ebx + 1);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm2, xmm3);
+ movlpd(ecx, xmm0);
+ movhpd(ecx + eax, xmm0);
+ movlpd(ecx + edi, xmm2);
+ movhpd(ecx + ebx, xmm2);
+ }
}
static void MC_put_y_16_sse2(uint8_t* ecx, const uint8_t* edx, const int eax, int esi)
{
- const int edi= eax+eax;
- const int ebx= edi+eax;
- __m128i xmm0;
- movdqu (xmm0, edx);
- for (; esi; edx+=edi*2,ecx+=edi*2,esi-=4) {
- __m128i xmm1,xmm2,xmm3,xmm4;
- movdqu (xmm1, edx+eax);
- movdqu (xmm2, edx+edi );
- movdqu (xmm3, edx+ebx );
- movdqu (xmm4, edx+edi*2 );
- pavgb (xmm0, xmm1 );
- pavgb (xmm1, xmm2 );
- pavgb (xmm2, xmm3 );
- pavgb (xmm3, xmm4 );
- movdqa (ecx, xmm0 );
- movdqa (ecx+eax, xmm1 );
- movdqa (ecx+edi, xmm2 );
- movdqa (ecx+ebx, xmm3 );
- movdqa (xmm0, xmm4 );
- }
+ const int edi = eax + eax;
+ const int ebx = edi + eax;
+ __m128i xmm0;
+ movdqu(xmm0, edx);
+ for (; esi; edx += edi * 2, ecx += edi * 2, esi -= 4) {
+ __m128i xmm1, xmm2, xmm3, xmm4;
+ movdqu(xmm1, edx + eax);
+ movdqu(xmm2, edx + edi);
+ movdqu(xmm3, edx + ebx);
+ movdqu(xmm4, edx + edi * 2);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm1, xmm2);
+ pavgb(xmm2, xmm3);
+ pavgb(xmm3, xmm4);
+ movdqa(ecx, xmm0);
+ movdqa(ecx + eax, xmm1);
+ movdqa(ecx + edi, xmm2);
+ movdqa(ecx + ebx, xmm3);
+ movdqa(xmm0, xmm4);
+ }
}
static void MC_put_y_8_sse2(uint8_t* ecx, const uint8_t* edx, const int eax, int esi)
{
- const int edi= eax+eax;
- const int ebx= edi+eax;
- __m128i xmm0;
- movlpd (xmm0, edx);
+ const int edi = eax + eax;
+ const int ebx = edi + eax;
+ __m128i xmm0;
+ movlpd(xmm0, edx);
- for (; esi; edx+=edi*2,ecx+=edi*2,esi-=4) {
- __m128i xmm1,xmm2,xmm3,xmm4;
- movlpd (xmm1, edx+eax );
- movlpd (xmm2, edx+edi );
- movlpd (xmm3, edx+ebx );
- movlpd (xmm4, edx+edi*2 );
- pavgb (xmm0, xmm1 );
- pavgb (xmm1, xmm2);
- pavgb (xmm2, xmm3 );
- pavgb (xmm3, xmm4 );
- movlpd (ecx, xmm0 );
- movlpd (ecx+eax, xmm1 );
- movlpd (ecx+edi, xmm2 );
- movlpd (ecx+ebx, xmm3 );
- movdqa (xmm0, xmm4 );
- }
+ for (; esi; edx += edi * 2, ecx += edi * 2, esi -= 4) {
+ __m128i xmm1, xmm2, xmm3, xmm4;
+ movlpd(xmm1, edx + eax);
+ movlpd(xmm2, edx + edi);
+ movlpd(xmm3, edx + ebx);
+ movlpd(xmm4, edx + edi * 2);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm1, xmm2);
+ pavgb(xmm2, xmm3);
+ pavgb(xmm3, xmm4);
+ movlpd(ecx, xmm0);
+ movlpd(ecx + eax, xmm1);
+ movlpd(ecx + edi, xmm2);
+ movlpd(ecx + ebx, xmm3);
+ movdqa(xmm0, xmm4);
+ }
}
static void MC_put_xy_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
{
- const uint8_t *edx= ref ;
- uint8_t *ecx= dest;
- int eax= stride;
- int esi= height;
- int edi= eax+eax;
- __m128i xmm7,xmm0,xmm1,xmm4,xmm5,xmm2,xmm3;
- movdqa (xmm7, const_1_16_bytes );
- movdqu (xmm0, edx );
- movdqu (xmm1, edx+1 );
- for (; esi; edx+= edi,ecx+= edi,esi-= 2) {
- movdqu (xmm2, edx+eax );
- movdqu (xmm3, edx+eax+1 );
- movdqu (xmm4, edx+edi );
- movdqu (xmm5, edx+edi+1 );
- pavgb (xmm0, xmm1 );
- pavgb (xmm2, xmm3 );
- movdqa( xmm1, xmm5 );
- pavgb (xmm5, xmm4 );
- psubusb( xmm2, xmm7 );
- pavgb (xmm0, xmm2 );
- pavgb (xmm2, xmm5);
- movdqa (ecx, xmm0);
- movdqa (xmm0, xmm4);
- movdqa (ecx+eax, xmm2);
- }
+ const uint8_t* edx = ref ;
+ uint8_t* ecx = dest;
+ int eax = stride;
+ int esi = height;
+ int edi = eax + eax;
+ __m128i xmm7, xmm0, xmm1, xmm4, xmm5, xmm2, xmm3;
+ movdqa(xmm7, const_1_16_bytes);
+ movdqu(xmm0, edx);
+ movdqu(xmm1, edx + 1);
+ for (; esi; edx += edi, ecx += edi, esi -= 2) {
+ movdqu(xmm2, edx + eax);
+ movdqu(xmm3, edx + eax + 1);
+ movdqu(xmm4, edx + edi);
+ movdqu(xmm5, edx + edi + 1);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm2, xmm3);
+ movdqa(xmm1, xmm5);
+ pavgb(xmm5, xmm4);
+ psubusb(xmm2, xmm7);
+ pavgb(xmm0, xmm2);
+ pavgb(xmm2, xmm5);
+ movdqa(ecx, xmm0);
+ movdqa(xmm0, xmm4);
+ movdqa(ecx + eax, xmm2);
+ }
}
static void MC_put_xy_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
{
- const uint8_t *edx= ref;
- uint8_t *ecx= dest;
- int eax= stride;
- int esi= height;
- int edi= eax+eax;
- __m128i xmm7,xmm0,xmm2,xmm1,xmm3,xmm4,xmm5;
- movdqa (xmm7, const_1_16_bytes);
- movlpd (xmm0, edx);
- movlpd (xmm1, edx+1);
- for (; esi; edx+= edi,ecx+= edi,esi-= 2) {
- movlpd (xmm2, edx+eax);
- movlpd (xmm3, edx+eax+1);
- movlpd (xmm4, edx+edi);
- movlpd (xmm5, edx+edi+1);
- pavgb (xmm0, xmm1 );
- pavgb (xmm2, xmm3 );
- movdqa( xmm1, xmm5 );
- pavgb (xmm5, xmm4 );
- psubusb( xmm2, xmm7 );
- pavgb (xmm0, xmm2 );
- pavgb (xmm2, xmm5);
- movlpd (ecx, xmm0);
- movdqa (xmm0, xmm4);
- movlpd (ecx+eax, xmm2);
- }
+ const uint8_t* edx = ref;
+ uint8_t* ecx = dest;
+ int eax = stride;
+ int esi = height;
+ int edi = eax + eax;
+ __m128i xmm7, xmm0, xmm2, xmm1, xmm3, xmm4, xmm5;
+ movdqa(xmm7, const_1_16_bytes);
+ movlpd(xmm0, edx);
+ movlpd(xmm1, edx + 1);
+ for (; esi; edx += edi, ecx += edi, esi -= 2) {
+ movlpd(xmm2, edx + eax);
+ movlpd(xmm3, edx + eax + 1);
+ movlpd(xmm4, edx + edi);
+ movlpd(xmm5, edx + edi + 1);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm2, xmm3);
+ movdqa(xmm1, xmm5);
+ pavgb(xmm5, xmm4);
+ psubusb(xmm2, xmm7);
+ pavgb(xmm0, xmm2);
+ pavgb(xmm2, xmm5);
+ movlpd(ecx, xmm0);
+ movdqa(xmm0, xmm4);
+ movlpd(ecx + eax, xmm2);
+ }
}
static void MC_avg_o_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
{
- const uint8_t *edx= ref;
- uint8_t *ecx= dest;
- int esi= height;
- int eax= stride;
- int edi= eax+eax;
- int ebx= edi+eax;
+ const uint8_t* edx = ref;
+ uint8_t* ecx = dest;
+ int esi = height;
+ int eax = stride;
+ int edi = eax + eax;
+ int ebx = edi + eax;
- for (; esi; edx+=edi*2,ecx+=edi*2,esi-=4) {
- __m128i xmm0,xmm1,xmm2,xmm3;
- movdqu (xmm0, edx);
- movdqu (xmm1, edx+eax );
- movdqu (xmm2, edx+edi);
- movdqu (xmm3, edx+ebx );
- pavgb (xmm0, ecx);
- pavgb (xmm1, ecx+eax);
- pavgb (xmm2, ecx+edi);
- pavgb (xmm3, ecx+ebx);
- movdqa (ecx, xmm0);
- movdqa (ecx+eax, xmm1 );
- movdqa (ecx+edi, xmm2);
- movdqa (ecx+ebx, xmm3 );
- }
+ for (; esi; edx += edi * 2, ecx += edi * 2, esi -= 4) {
+ __m128i xmm0, xmm1, xmm2, xmm3;
+ movdqu(xmm0, edx);
+ movdqu(xmm1, edx + eax);
+ movdqu(xmm2, edx + edi);
+ movdqu(xmm3, edx + ebx);
+ pavgb(xmm0, ecx);
+ pavgb(xmm1, ecx + eax);
+ pavgb(xmm2, ecx + edi);
+ pavgb(xmm3, ecx + ebx);
+ movdqa(ecx, xmm0);
+ movdqa(ecx + eax, xmm1);
+ movdqa(ecx + edi, xmm2);
+ movdqa(ecx + ebx, xmm3);
+ }
}
static void MC_avg_o_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
{
- const uint8_t *edx= ref;
- uint8_t *ecx= dest;
- int esi= height;
- int eax= stride;
- int edi= eax+eax;
- int ebx= edi+eax;
+ const uint8_t* edx = ref;
+ uint8_t* ecx = dest;
+ int esi = height;
+ int eax = stride;
+ int edi = eax + eax;
+ int ebx = edi + eax;
- __m128i xmm0,xmm1,xmm2,xmm3;
- for (; esi; edx+=edi*2,ecx+=edi*2,esi-=4) {
- movlpd (xmm0, edx);
- movhpd (xmm0, edx+eax );
- movlpd (xmm2, edx+edi);
- movhpd (xmm2, edx+ebx );
- movlpd (xmm1, ecx);
- movhpd (xmm1, ecx+eax);
- movlpd (xmm3, ecx+edi);
- movhpd (xmm3, ecx+ebx);
- pavgb (xmm0, xmm1);
- pavgb (xmm2, xmm3);
- movlpd (ecx, xmm0);
- movhpd (ecx+eax, xmm0);
- movlpd (ecx+edi, xmm2);
- movhpd (ecx+ebx, xmm2);
- }
+ __m128i xmm0, xmm1, xmm2, xmm3;
+ for (; esi; edx += edi * 2, ecx += edi * 2, esi -= 4) {
+ movlpd(xmm0, edx);
+ movhpd(xmm0, edx + eax);
+ movlpd(xmm2, edx + edi);
+ movhpd(xmm2, edx + ebx);
+ movlpd(xmm1, ecx);
+ movhpd(xmm1, ecx + eax);
+ movlpd(xmm3, ecx + edi);
+ movhpd(xmm3, ecx + ebx);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm2, xmm3);
+ movlpd(ecx, xmm0);
+ movhpd(ecx + eax, xmm0);
+ movlpd(ecx + edi, xmm2);
+ movhpd(ecx + ebx, xmm2);
+ }
}
static void MC_avg_x_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
{
- const uint8_t *edx= ref;
- uint8_t *ecx= dest;
- int esi= height;
- int eax= stride;
- int edi= eax+eax;
- int ebx= edi+eax;
+ const uint8_t* edx = ref;
+ uint8_t* ecx = dest;
+ int esi = height;
+ int eax = stride;
+ int edi = eax + eax;
+ int ebx = edi + eax;
- __m128i xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7;
- for (; esi; edx+=edi*2,ecx+=edi*2,esi-=4) {
- movdqu (xmm0, edx);
- movdqu (xmm1, edx+1);
- movdqu (xmm2, edx+eax);
- movdqu (xmm3, edx+eax+1);
- movdqu (xmm4, edx+edi);
- movdqu (xmm5, edx+edi+1);
- movdqu (xmm6, edx+ebx);
- movdqu (xmm7, edx+ebx+1);
- pavgb (xmm0, xmm1);
- pavgb (xmm2, xmm3);
- pavgb (xmm4, xmm5);
- pavgb (xmm6, xmm7);
- pavgb (xmm0, ecx);
- pavgb (xmm2, ecx+eax);
- pavgb (xmm4, ecx+edi);
- pavgb (xmm6, ecx+ebx);
- movdqa (ecx, xmm0);
- movdqa (ecx+eax, xmm2);
- movdqa (ecx+edi, xmm4);
- movdqa (ecx+ebx, xmm6);
- }
+ __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7;
+ for (; esi; edx += edi * 2, ecx += edi * 2, esi -= 4) {
+ movdqu(xmm0, edx);
+ movdqu(xmm1, edx + 1);
+ movdqu(xmm2, edx + eax);
+ movdqu(xmm3, edx + eax + 1);
+ movdqu(xmm4, edx + edi);
+ movdqu(xmm5, edx + edi + 1);
+ movdqu(xmm6, edx + ebx);
+ movdqu(xmm7, edx + ebx + 1);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm2, xmm3);
+ pavgb(xmm4, xmm5);
+ pavgb(xmm6, xmm7);
+ pavgb(xmm0, ecx);
+ pavgb(xmm2, ecx + eax);
+ pavgb(xmm4, ecx + edi);
+ pavgb(xmm6, ecx + ebx);
+ movdqa(ecx, xmm0);
+ movdqa(ecx + eax, xmm2);
+ movdqa(ecx + edi, xmm4);
+ movdqa(ecx + ebx, xmm6);
+ }
}
static void MC_avg_x_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
{
- const uint8_t *edx= ref;
- uint8_t *ecx= dest;
- int esi= height;
- int eax= stride;
- int edi= eax+eax;
- int ebx= edi+eax;
+ const uint8_t* edx = ref;
+ uint8_t* ecx = dest;
+ int esi = height;
+ int eax = stride;
+ int edi = eax + eax;
+ int ebx = edi + eax;
- __m128i xmm0,xmm1,xmm2,xmm3,xmm4,xmm5;
- for (; esi; edx+=edi*2,ecx+=edi*2,esi-=4) {
- movlpd (xmm0, edx);
- movlpd (xmm1, edx+1);
- movhpd (xmm0, edx+eax);
- movhpd (xmm1, edx+eax+1);
- movlpd (xmm2, edx+edi);
- movlpd (xmm3, edx+edi+1);
- movhpd (xmm2, edx+ebx);
- movhpd (xmm3, edx+ebx+1);
- movlpd (xmm4, ecx);
- movhpd (xmm4, ecx+eax);
- movlpd (xmm5, ecx+edi);
- movhpd (xmm5, ecx+ebx);
- pavgb (xmm0, xmm1);
- pavgb (xmm2, xmm3);
- pavgb (xmm0, xmm4);
- pavgb (xmm2, xmm5);
- movlpd (ecx, xmm0);
- movhpd (ecx+eax, xmm0);
- movlpd (ecx+edi, xmm2);
- movhpd (ecx+ebx, xmm2);
- }
+ __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5;
+ for (; esi; edx += edi * 2, ecx += edi * 2, esi -= 4) {
+ movlpd(xmm0, edx);
+ movlpd(xmm1, edx + 1);
+ movhpd(xmm0, edx + eax);
+ movhpd(xmm1, edx + eax + 1);
+ movlpd(xmm2, edx + edi);
+ movlpd(xmm3, edx + edi + 1);
+ movhpd(xmm2, edx + ebx);
+ movhpd(xmm3, edx + ebx + 1);
+ movlpd(xmm4, ecx);
+ movhpd(xmm4, ecx + eax);
+ movlpd(xmm5, ecx + edi);
+ movhpd(xmm5, ecx + ebx);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm2, xmm3);
+ pavgb(xmm0, xmm4);
+ pavgb(xmm2, xmm5);
+ movlpd(ecx, xmm0);
+ movhpd(ecx + eax, xmm0);
+ movlpd(ecx + edi, xmm2);
+ movhpd(ecx + ebx, xmm2);
+ }
}
static void MC_avg_y_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
{
- const uint8_t *edx= ref;
- uint8_t *ecx= dest;
- int esi= height;
- int eax= stride;
- int edi= eax+eax;
- int ebx= edi+eax;
- __m128i xmm0,xmm1,xmm2,xmm3,xmm4;
+ const uint8_t* edx = ref;
+ uint8_t* ecx = dest;
+ int esi = height;
+ int eax = stride;
+ int edi = eax + eax;
+ int ebx = edi + eax;
+ __m128i xmm0, xmm1, xmm2, xmm3, xmm4;
- movdqu (xmm0,edx);
- for (; esi; edx+=edi*2,ecx+=edi*2,esi-=4) {
- movdqu (xmm1, edx+eax );
- movdqu (xmm2, edx+edi );
- movdqu (xmm3, edx+ebx );
- movdqu (xmm4, edx+edi*2 );
- pavgb (xmm0, xmm1 );
- pavgb (xmm1, xmm2 );
- pavgb (xmm2, xmm3 );
- pavgb (xmm3, xmm4 );
- pavgb (xmm0, ecx);
- pavgb (xmm1, ecx+eax );
- pavgb (xmm2, ecx+edi);
- pavgb (xmm3, ecx+ebx );
- movdqa (ecx, xmm0 );
- movdqa (ecx+eax, xmm1 );
- movdqa (ecx+edi, xmm2 );
- movdqa (ecx+ebx, xmm3 );
- movdqa (xmm0, xmm4 );
- }
+ movdqu(xmm0, edx);
+ for (; esi; edx += edi * 2, ecx += edi * 2, esi -= 4) {
+ movdqu(xmm1, edx + eax);
+ movdqu(xmm2, edx + edi);
+ movdqu(xmm3, edx + ebx);
+ movdqu(xmm4, edx + edi * 2);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm1, xmm2);
+ pavgb(xmm2, xmm3);
+ pavgb(xmm3, xmm4);
+ pavgb(xmm0, ecx);
+ pavgb(xmm1, ecx + eax);
+ pavgb(xmm2, ecx + edi);
+ pavgb(xmm3, ecx + ebx);
+ movdqa(ecx, xmm0);
+ movdqa(ecx + eax, xmm1);
+ movdqa(ecx + edi, xmm2);
+ movdqa(ecx + ebx, xmm3);
+ movdqa(xmm0, xmm4);
+ }
}
static void MC_avg_y_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
{
- const uint8_t *edx= ref;
- uint8_t *ecx= dest;
- int esi= height;
- int eax= stride;
- int edi= eax+eax;
- int ebx= edi+eax;
- __m128i xmm0,xmm1,xmm2,xmm3,xmm4,xmm5;
- movhpd (xmm0, edx );
- movlpd (xmm0, edx+eax );
- for (; esi; edx+=edi*2,ecx+=edi*2,esi-=4) {
- movlhps (xmm1, xmm0);
- movlpd (xmm1, edx+edi );
- movlhps (xmm2, xmm1);
- movlpd (xmm2, edx+ebx );
- movlhps (xmm3, xmm2);
- movlpd (xmm3, edx+edi*2 );
- movhpd (xmm4, ecx );
- movlpd (xmm4, ecx+eax );
- movhpd (xmm5, ecx+edi );
- movlpd (xmm5, ecx+ebx );
- pavgb (xmm0, xmm1 );
- pavgb (xmm2, xmm3);
- pavgb (xmm0, xmm4);
- pavgb (xmm2, xmm5);
- movhpd (ecx, xmm0 );
- movlpd (ecx+eax, xmm0 );
- movhpd (ecx+edi, xmm2 );
- movlpd (ecx+ebx, xmm2);
- movdqa (xmm0, xmm3 );
- }
+ const uint8_t* edx = ref;
+ uint8_t* ecx = dest;
+ int esi = height;
+ int eax = stride;
+ int edi = eax + eax;
+ int ebx = edi + eax;
+ __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5;
+ movhpd(xmm0, edx);
+ movlpd(xmm0, edx + eax);
+ for (; esi; edx += edi * 2, ecx += edi * 2, esi -= 4) {
+ movlhps(xmm1, xmm0);
+ movlpd(xmm1, edx + edi);
+ movlhps(xmm2, xmm1);
+ movlpd(xmm2, edx + ebx);
+ movlhps(xmm3, xmm2);
+ movlpd(xmm3, edx + edi * 2);
+ movhpd(xmm4, ecx);
+ movlpd(xmm4, ecx + eax);
+ movhpd(xmm5, ecx + edi);
+ movlpd(xmm5, ecx + ebx);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm2, xmm3);
+ pavgb(xmm0, xmm4);
+ pavgb(xmm2, xmm5);
+ movhpd(ecx, xmm0);
+ movlpd(ecx + eax, xmm0);
+ movhpd(ecx + edi, xmm2);
+ movlpd(ecx + ebx, xmm2);
+ movdqa(xmm0, xmm3);
+ }
}
static void MC_avg_xy_16_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
{
- const uint8_t *edx= ref;
- uint8_t *ecx= dest;
- int esi= height;
- int eax= stride;
- int edi= eax+eax;
- __m128i xmm7,xmm0,xmm1,xmm2,xmm3,xmm4,xmm5;
- movdqa (xmm7, const_1_16_bytes );
- movdqu (xmm0, edx );
- movdqu (xmm1, edx+1 );
- for (; esi; edx+=edi,ecx+=edi,esi-=2) {
- movdqu (xmm2, edx+eax );
- movdqu (xmm3, edx+eax+1 );
- movdqu (xmm4, edx+edi );
- movdqu (xmm5, edx+edi+1 );
- pavgb (xmm0, xmm1 );
- pavgb (xmm2, xmm3 );
- movdqa (xmm1, xmm5 );
- pavgb (xmm5, xmm4 );
- psubusb (xmm2, xmm7 );
- pavgb (xmm0, xmm2 );
- pavgb (xmm2, xmm5);
- pavgb (xmm0, ecx );
- pavgb (xmm2, ecx+eax);
- movdqa (ecx, xmm0);
- movdqa (xmm0, xmm4);
- movdqa (ecx+eax, xmm2);
- }
+ const uint8_t* edx = ref;
+ uint8_t* ecx = dest;
+ int esi = height;
+ int eax = stride;
+ int edi = eax + eax;
+ __m128i xmm7, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5;
+ movdqa(xmm7, const_1_16_bytes);
+ movdqu(xmm0, edx);
+ movdqu(xmm1, edx + 1);
+ for (; esi; edx += edi, ecx += edi, esi -= 2) {
+ movdqu(xmm2, edx + eax);
+ movdqu(xmm3, edx + eax + 1);
+ movdqu(xmm4, edx + edi);
+ movdqu(xmm5, edx + edi + 1);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm2, xmm3);
+ movdqa(xmm1, xmm5);
+ pavgb(xmm5, xmm4);
+ psubusb(xmm2, xmm7);
+ pavgb(xmm0, xmm2);
+ pavgb(xmm2, xmm5);
+ pavgb(xmm0, ecx);
+ pavgb(xmm2, ecx + eax);
+ movdqa(ecx, xmm0);
+ movdqa(xmm0, xmm4);
+ movdqa(ecx + eax, xmm2);
+ }
}
static void MC_avg_xy_8_sse2(uint8_t* dest, const uint8_t* ref, const int stride, int height)
{
- const uint8_t *edx= ref;
- uint8_t *ecx= dest;
- int esi= height;
- int eax= stride;
- int edi= eax+eax;
- __m128i xmm7,xmm0,xmm2,xmm1,xmm3,xmm4;
- movdqa (xmm7, const_1_16_bytes );
- movhpd (xmm0, edx );
- movlpd (xmm0, edx+eax );
- movhpd (xmm2, edx+1 );
- movlpd (xmm2, edx+eax+1 );
- for (; esi; edx+=edi,ecx+=edi,esi-=2) {
+ const uint8_t* edx = ref;
+ uint8_t* ecx = dest;
+ int esi = height;
+ int eax = stride;
+ int edi = eax + eax;
+ __m128i xmm7, xmm0, xmm2, xmm1, xmm3, xmm4;
+ movdqa(xmm7, const_1_16_bytes);
+ movhpd(xmm0, edx);
+ movlpd(xmm0, edx + eax);
+ movhpd(xmm2, edx + 1);
+ movlpd(xmm2, edx + eax + 1);
+ for (; esi; edx += edi, ecx += edi, esi -= 2) {
- movhpd (xmm1, edx+eax );
- movlpd (xmm1, edx+edi );
- movhpd (xmm3, edx+eax+1 );
- movlpd (xmm3, edx+edi+1 );
- pavgb (xmm0, xmm1 );
- pavgb (xmm2, xmm3 );
- psubusb( xmm0, xmm7 );
- pavgb (xmm0, xmm2 );
- movhpd( xmm4, ecx);
- movlpd( xmm4, ecx+eax);
- pavgb (xmm0, xmm4 );
- movhpd (ecx, xmm0 );
- movlpd (ecx+eax, xmm0 );
- movdqa (xmm0, xmm1 );
- movdqa (xmm2, xmm3 );
- }
+ movhpd(xmm1, edx + eax);
+ movlpd(xmm1, edx + edi);
+ movhpd(xmm3, edx + eax + 1);
+ movlpd(xmm3, edx + edi + 1);
+ pavgb(xmm0, xmm1);
+ pavgb(xmm2, xmm3);
+ psubusb(xmm0, xmm7);
+ pavgb(xmm0, xmm2);
+ movhpd(xmm4, ecx);
+ movlpd(xmm4, ecx + eax);
+ pavgb(xmm0, xmm4);
+ movhpd(ecx, xmm0);
+ movlpd(ecx + eax, xmm0);
+ movdqa(xmm0, xmm1);
+ movdqa(xmm2, xmm3);
+ }
}
mpeg2_mc_t mpeg2_mc_sse2 = {
- {
- MC_put_o_16_sse2, MC_put_x_16_sse2, MC_put_y_16_sse2, MC_put_xy_16_sse2,
- MC_put_o_8_sse2, MC_put_x_8_sse2, MC_put_y_8_sse2, MC_put_xy_8_sse2
- },
- {
- MC_avg_o_16_sse2, MC_avg_x_16_sse2, MC_avg_y_16_sse2, MC_avg_xy_16_sse2,
- MC_avg_o_8_sse2, MC_avg_x_8_sse2, MC_avg_y_8_sse2, MC_avg_xy_8_sse2
- }
+ {
+ MC_put_o_16_sse2, MC_put_x_16_sse2, MC_put_y_16_sse2, MC_put_xy_16_sse2,
+ MC_put_o_8_sse2, MC_put_x_8_sse2, MC_put_y_8_sse2, MC_put_xy_8_sse2
+ },
+ {
+ MC_avg_o_16_sse2, MC_avg_x_16_sse2, MC_avg_y_16_sse2, MC_avg_xy_16_sse2,
+ MC_avg_o_8_sse2, MC_avg_x_8_sse2, MC_avg_y_8_sse2, MC_avg_xy_8_sse2
+ }
};
diff --git a/src/filters/transform/VSFilter/AvgLines.cpp b/src/filters/transform/VSFilter/AvgLines.cpp
index a8bc535aa..8379128c6 100644
--- a/src/filters/transform/VSFilter/AvgLines.cpp
+++ b/src/filters/transform/VSFilter/AvgLines.cpp
@@ -1,298 +1,298 @@
-// VirtualDub - Video processing and capture application
-// Copyright (C) 1998-2001 Avery Lee
+// VirtualDub - Video processing and capture application
+// Copyright (C) 1998-2001 Avery Lee
//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "stdafx.h"
void AvgLines8(BYTE* dst, DWORD h, DWORD pitch)
{
- if (h <= 1) {
- return;
- }
+ if (h <= 1) {
+ return;
+ }
- BYTE* s = dst;
- BYTE* d = dst + (h-2)*pitch;
+ BYTE* s = dst;
+ BYTE* d = dst + (h - 2) * pitch;
- for (; s < d; s += pitch*2) {
- BYTE* tmp = s;
+ for (; s < d; s += pitch * 2) {
+ BYTE* tmp = s;
#ifndef _WIN64
- if ((g_cpuid.m_flags & CCpuID::sse2) && !((DWORD)tmp&0xf) && !((DWORD)pitch&0xf)) {
- __asm {
- mov esi, tmp
- mov ebx, pitch
+ if ((g_cpuid.m_flags & CCpuID::sse2) && !((DWORD)tmp & 0xf) && !((DWORD)pitch & 0xf)) {
+ __asm {
+ mov esi, tmp
+ mov ebx, pitch
- mov ecx, ebx
- shr ecx, 4
+ mov ecx, ebx
+ shr ecx, 4
- AvgLines8_sse2_loop:
- movdqa xmm0, [esi]
- pavgb xmm0, [esi+ebx*2]
- movdqa [esi+ebx], xmm0
- add esi, 16
+ AvgLines8_sse2_loop:
+ movdqa xmm0, [esi]
+ pavgb xmm0, [esi+ebx*2]
+ movdqa [esi+ebx], xmm0
+ add esi, 16
- dec ecx
- jnz AvgLines8_sse2_loop
+ dec ecx
+ jnz AvgLines8_sse2_loop
- mov tmp, esi
- }
+ mov tmp, esi
+ }
- for (ptrdiff_t i = pitch&7; i--; tmp++) {
- tmp[pitch] = (tmp[0] + tmp[pitch<<1] + 1) >> 1;
- }
- } else if (g_cpuid.m_flags & CCpuID::mmx) {
- __asm {
- mov esi, tmp
- mov ebx, pitch
+ for (ptrdiff_t i = pitch & 7; i--; tmp++) {
+ tmp[pitch] = (tmp[0] + tmp[pitch << 1] + 1) >> 1;
+ }
+ } else if (g_cpuid.m_flags & CCpuID::mmx) {
+ __asm {
+ mov esi, tmp
+ mov ebx, pitch
- mov ecx, ebx
- shr ecx, 3
+ mov ecx, ebx
+ shr ecx, 3
- pxor mm7, mm7
- AvgLines8_mmx_loop:
- movq mm0, [esi]
- movq mm1, mm0
+ pxor mm7, mm7
+ AvgLines8_mmx_loop:
+ movq mm0, [esi]
+ movq mm1, mm0
- punpcklbw mm0, mm7
- punpckhbw mm1, mm7
+ punpcklbw mm0, mm7
+ punpckhbw mm1, mm7
- movq mm2, [esi+ebx*2]
- movq mm3, mm2
+ movq mm2, [esi+ebx*2]
+ movq mm3, mm2
- punpcklbw mm2, mm7
- punpckhbw mm3, mm7
+ punpcklbw mm2, mm7
+ punpckhbw mm3, mm7
- paddw mm0, mm2
- psrlw mm0, 1
+ paddw mm0, mm2
+ psrlw mm0, 1
- paddw mm1, mm3
- psrlw mm1, 1
+ paddw mm1, mm3
+ psrlw mm1, 1
- packuswb mm0, mm1
+ packuswb mm0, mm1
- movq [esi+ebx], mm0
+ movq [esi+ebx], mm0
- lea esi, [esi+8]
+ lea esi, [esi+8]
- dec ecx
- jnz AvgLines8_mmx_loop
+ dec ecx
+ jnz AvgLines8_mmx_loop
- mov tmp, esi
- }
+ mov tmp, esi
+ }
- for (ptrdiff_t i = pitch&7; i--; tmp++) {
- tmp[pitch] = (tmp[0] + tmp[pitch<<1] + 1) >> 1;
- }
- } else
+ for (ptrdiff_t i = pitch & 7; i--; tmp++) {
+ tmp[pitch] = (tmp[0] + tmp[pitch << 1] + 1) >> 1;
+ }
+ } else
#endif
- {
- for (ptrdiff_t i = pitch; i--; tmp++) {
- tmp[pitch] = (tmp[0] + tmp[pitch<<1] + 1) >> 1;
- }
- }
- }
-
- if (!(h&1) && h >= 2) {
- dst += (h-2)*pitch;
- memcpy(dst + pitch, dst, pitch);
- }
+ {
+ for (ptrdiff_t i = pitch; i--; tmp++) {
+ tmp[pitch] = (tmp[0] + tmp[pitch << 1] + 1) >> 1;
+ }
+ }
+ }
+
+ if (!(h & 1) && h >= 2) {
+ dst += (h - 2) * pitch;
+ memcpy(dst + pitch, dst, pitch);
+ }
#ifndef _WIN64
- __asm emms;
+ __asm emms;
#endif
}
void AvgLines555(BYTE* dst, DWORD h, DWORD pitch)
{
- if (h <= 1) {
- return;
- }
+ if (h <= 1) {
+ return;
+ }
- unsigned __int64 __0x03e003e003e003e0 = 0x03e003e003e003e0;
- unsigned __int64 __0x001f001f001f001f = 0x001f001f001f001f;
+ unsigned __int64 __0x03e003e003e003e0 = 0x03e003e003e003e0;
+ unsigned __int64 __0x001f001f001f001f = 0x001f001f001f001f;
- BYTE* s = dst;
- BYTE* d = dst + (h-2)*pitch;
+ BYTE* s = dst;
+ BYTE* d = dst + (h - 2) * pitch;
- for (; s < d; s += pitch*2) {
- BYTE* tmp = s;
+ for (; s < d; s += pitch * 2) {
+ BYTE* tmp = s;
#ifndef _WIN64
- __asm {
- mov esi, tmp
- mov ebx, pitch
+ __asm {
+ mov esi, tmp
+ mov ebx, pitch
- mov ecx, ebx
- shr ecx, 3
+ mov ecx, ebx
+ shr ecx, 3
- movq mm6, __0x03e003e003e003e0
- movq mm7, __0x001f001f001f001f
+ movq mm6, __0x03e003e003e003e0
+ movq mm7, __0x001f001f001f001f
- AvgLines555_loop:
- movq mm0, [esi]
- movq mm1, mm0
- movq mm2, mm0
+ AvgLines555_loop:
+ movq mm0, [esi]
+ movq mm1, mm0
+ movq mm2, mm0
- psrlw mm0, 10 // red1 bits: mm0 = 001f001f001f001f
- pand mm1, mm6 // green1 bits: mm1 = 03e003e003e003e0
- pand mm2, mm7 // blue1 bits: mm2 = 001f001f001f001f
+ psrlw mm0, 10 // red1 bits: mm0 = 001f001f001f001f
+ pand mm1, mm6 // green1 bits: mm1 = 03e003e003e003e0
+ pand mm2, mm7 // blue1 bits: mm2 = 001f001f001f001f
- movq mm3, [esi+ebx*2]
- movq mm4, mm3
- movq mm5, mm3
+ movq mm3, [esi+ebx*2]
+ movq mm4, mm3
+ movq mm5, mm3
- psrlw mm3, 10 // red2 bits: mm3 = 001f001f001f001f
- pand mm4, mm6 // green2 bits: mm4 = 03e003e003e003e0
- pand mm5, mm7 // blue2 bits: mm5 = 001f001f001f001f
+ psrlw mm3, 10 // red2 bits: mm3 = 001f001f001f001f
+ pand mm4, mm6 // green2 bits: mm4 = 03e003e003e003e0
+ pand mm5, mm7 // blue2 bits: mm5 = 001f001f001f001f
- paddw mm0, mm3
- psrlw mm0, 1 // (red1+red2)/2
- psllw mm0, 10 // red bits at 7c007c007c007c00
+ paddw mm0, mm3
+ psrlw mm0, 1 // (red1+red2)/2
+ psllw mm0, 10 // red bits at 7c007c007c007c00
- paddw mm1, mm4
- psrlw mm1, 1 // (green1+green2)/2
- pand mm1, mm6 // green bits at 03e003e003e003e0
+ paddw mm1, mm4
+ psrlw mm1, 1 // (green1+green2)/2
+ pand mm1, mm6 // green bits at 03e003e003e003e0
- paddw mm2, mm5
- psrlw mm2, 1 // (blue1+blue2)/2
- // blue bits at 001f001f001f001f (no need to pand, lower bits were discareded)
+ paddw mm2, mm5
+ psrlw mm2, 1 // (blue1+blue2)/2
+ // blue bits at 001f001f001f001f (no need to pand, lower bits were discareded)
- por mm0, mm1
- por mm0, mm2
+ por mm0, mm1
+ por mm0, mm2
- movq [esi+ebx], mm0
+ movq [esi+ebx], mm0
- lea esi, [esi+8]
+ lea esi, [esi+8]
- dec ecx
- jnz AvgLines555_loop
+ dec ecx
+ jnz AvgLines555_loop
- mov tmp, esi
- }
+ mov tmp, esi
+ }
#endif
- for (ptrdiff_t i = (pitch&7)>>1; i--; tmp++) {
- tmp[pitch] =
- ((((*tmp&0x7c00) + (tmp[pitch<<1]&0x7c00)) >> 1)&0x7c00)|
- ((((*tmp&0x03e0) + (tmp[pitch<<1]&0x03e0)) >> 1)&0x03e0)|
- ((((*tmp&0x001f) + (tmp[pitch<<1]&0x001f)) >> 1)&0x001f);
- }
- }
+ for (ptrdiff_t i = (pitch & 7) >> 1; i--; tmp++) {
+ tmp[pitch] =
+ ((((*tmp & 0x7c00) + (tmp[pitch << 1] & 0x7c00)) >> 1) & 0x7c00) |
+ ((((*tmp & 0x03e0) + (tmp[pitch << 1] & 0x03e0)) >> 1) & 0x03e0) |
+ ((((*tmp & 0x001f) + (tmp[pitch << 1] & 0x001f)) >> 1) & 0x001f);
+ }
+ }
- if (!(h&1) && h >= 2) {
- dst += (h-2)*pitch;
- memcpy(dst + pitch, dst, pitch);
- }
+ if (!(h & 1) && h >= 2) {
+ dst += (h - 2) * pitch;
+ memcpy(dst + pitch, dst, pitch);
+ }
#ifndef _WIN64
- __asm emms;
+ __asm emms;
#endif
}
void AvgLines565(BYTE* dst, DWORD h, DWORD pitch)
{
- if (h <= 1) {
- return;
- }
+ if (h <= 1) {
+ return;
+ }
- unsigned __int64 __0x07e007e007e007e0 = 0x07e007e007e007e0;
- unsigned __int64 __0x001f001f001f001f = 0x001f001f001f001f;
+ unsigned __int64 __0x07e007e007e007e0 = 0x07e007e007e007e0;
+ unsigned __int64 __0x001f001f001f001f = 0x001f001f001f001f;
- BYTE* s = dst;
- BYTE* d = dst + (h-2)*pitch;
+ BYTE* s = dst;
+ BYTE* d = dst + (h - 2) * pitch;
- for (; s < d; s += pitch*2) {
- WORD* tmp = (WORD*)s;
+ for (; s < d; s += pitch * 2) {
+ WORD* tmp = (WORD*)s;
#ifndef _WIN64
- __asm {
- mov esi, tmp
- mov ebx, pitch
+ __asm {
+ mov esi, tmp
+ mov ebx, pitch
- mov ecx, ebx
- shr ecx, 3
+ mov ecx, ebx
+ shr ecx, 3
- movq mm6, __0x07e007e007e007e0
- movq mm7, __0x001f001f001f001f
+ movq mm6, __0x07e007e007e007e0
+ movq mm7, __0x001f001f001f001f
- AvgLines565_loop:
- movq mm0, [esi]
- movq mm1, mm0
- movq mm2, mm0
+ AvgLines565_loop:
+ movq mm0, [esi]
+ movq mm1, mm0
+ movq mm2, mm0
- psrlw mm0, 11 // red1 bits: mm0 = 001f001f001f001f
- pand mm1, mm6 // green1 bits: mm1 = 07e007e007e007e0
- pand mm2, mm7 // blue1 bits: mm2 = 001f001f001f001f
+ psrlw mm0, 11 // red1 bits: mm0 = 001f001f001f001f
+ pand mm1, mm6 // green1 bits: mm1 = 07e007e007e007e0
+ pand mm2, mm7 // blue1 bits: mm2 = 001f001f001f001f
- movq mm3, [esi+ebx*2]
- movq mm4, mm3
- movq mm5, mm3
+ movq mm3, [esi+ebx*2]
+ movq mm4, mm3
+ movq mm5, mm3
- psrlw mm3, 11 // red2 bits: mm3 = 001f001f001f001f
- pand mm4, mm6 // green2 bits: mm4 = 07e007e007e007e0
- pand mm5, mm7 // blue2 bits: mm5 = 001f001f001f001f
+ psrlw mm3, 11 // red2 bits: mm3 = 001f001f001f001f
+ pand mm4, mm6 // green2 bits: mm4 = 07e007e007e007e0
+ pand mm5, mm7 // blue2 bits: mm5 = 001f001f001f001f
- paddw mm0, mm3
- psrlw mm0, 1 // (red1+red2)/2
- psllw mm0, 11 // red bits at f800f800f800f800
+ paddw mm0, mm3
+ psrlw mm0, 1 // (red1+red2)/2
+ psllw mm0, 11 // red bits at f800f800f800f800
- paddw mm1, mm4
- psrlw mm1, 1 // (green1+green2)/2
- pand mm1, mm6 // green bits at 03e003e003e003e0
+ paddw mm1, mm4
+ psrlw mm1, 1 // (green1+green2)/2
+ pand mm1, mm6 // green bits at 03e003e003e003e0
- paddw mm2, mm5
- psrlw mm2, 1 // (blue1+blue2)/2
- // blue bits at 001f001f001f001f (no need to pand, lower bits were discareded)
+ paddw mm2, mm5
+ psrlw mm2, 1 // (blue1+blue2)/2
+ // blue bits at 001f001f001f001f (no need to pand, lower bits were discareded)
- por mm0, mm1
- por mm0, mm2
+ por mm0, mm1
+ por mm0, mm2
- movq [esi+ebx], mm0
+ movq [esi+ebx], mm0
- lea esi, [esi+8]
+ lea esi, [esi+8]
- dec ecx
- jnz AvgLines565_loop
+ dec ecx
+ jnz AvgLines565_loop
- mov tmp, esi
- }
+ mov tmp, esi
+ }
#else
- for (ptrdiff_t wd=(pitch>>3); wd--; tmp++) {
- tmp[0] =
- ((((*tmp&0xf800) + (tmp[pitch<<1]&0xf800)) >> 1)&0xf800)|
- ((((*tmp&0x07e0) + (tmp[pitch<<1]&0x07e0)) >> 1)&0x07e0)|
- ((((*tmp&0x001f) + (tmp[pitch<<1]&0x001f)) >> 1)&0x001f);
- }
+ for (ptrdiff_t wd = (pitch >> 3); wd--; tmp++) {
+ tmp[0] =
+ ((((*tmp & 0xf800) + (tmp[pitch << 1] & 0xf800)) >> 1) & 0xf800) |
+ ((((*tmp & 0x07e0) + (tmp[pitch << 1] & 0x07e0)) >> 1) & 0x07e0) |
+ ((((*tmp & 0x001f) + (tmp[pitch << 1] & 0x001f)) >> 1) & 0x001f);
+ }
#endif
- for (ptrdiff_t i = (pitch&7)>>1; i--; tmp++) {
- tmp[pitch] =
- ((((*tmp&0xf800) + (tmp[pitch<<1]&0xf800)) >> 1)&0xf800)|
- ((((*tmp&0x07e0) + (tmp[pitch<<1]&0x07e0)) >> 1)&0x07e0)|
- ((((*tmp&0x001f) + (tmp[pitch<<1]&0x001f)) >> 1)&0x001f);
- }
- }
+ for (ptrdiff_t i = (pitch & 7) >> 1; i--; tmp++) {
+ tmp[pitch] =
+ ((((*tmp & 0xf800) + (tmp[pitch << 1] & 0xf800)) >> 1) & 0xf800) |
+ ((((*tmp & 0x07e0) + (tmp[pitch << 1] & 0x07e0)) >> 1) & 0x07e0) |
+ ((((*tmp & 0x001f) + (tmp[pitch << 1] & 0x001f)) >> 1) & 0x001f);
+ }
+ }
- if (!(h&1) && h >= 2) {
- dst += (h-2)*pitch;
- memcpy(dst + pitch, dst, pitch);
- }
+ if (!(h & 1) && h >= 2) {
+ dst += (h - 2) * pitch;
+ memcpy(dst + pitch, dst, pitch);
+ }
#ifndef _WIN64
- __asm emms;
+ __asm emms;
#endif
}
diff --git a/src/filters/transform/VSFilter/AvgLines.h b/src/filters/transform/VSFilter/AvgLines.h
index af769fbb3..94763be6e 100644
--- a/src/filters/transform/VSFilter/AvgLines.h
+++ b/src/filters/transform/VSFilter/AvgLines.h
@@ -1,19 +1,19 @@
-// VirtualDub - Video processing and capture application
-// Copyright (C) 1998-2001 Avery Lee
+// VirtualDub - Video processing and capture application
+// Copyright (C) 1998-2001 Avery Lee
//
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#pragma once
diff --git a/src/filters/transform/VSFilter/Copy.cpp b/src/filters/transform/VSFilter/Copy.cpp
index a4c146ed4..3ddefafb7 100644
--- a/src/filters/transform/VSFilter/Copy.cpp
+++ b/src/filters/transform/VSFilter/Copy.cpp
@@ -38,215 +38,215 @@ extern void ColorConvInit();
void BltLineRGB32(DWORD* d, BYTE* sub, int w, const GUID& subtype)
{
- if (subtype == MEDIASUBTYPE_YV12 || subtype == MEDIASUBTYPE_I420 || subtype == MEDIASUBTYPE_IYUV) {
- BYTE* db = (BYTE*)d;
- BYTE* dbtend = db + w;
-
- for (; db < dbtend; sub+=4, db++) {
- if (sub[3] < 0xff) {
- int y = (c2y_yb[sub[0]] + c2y_yg[sub[1]] + c2y_yr[sub[2]] + 0x108000) >> 16;
- *db = y; // w/o colors
- }
- }
- } else if (subtype == MEDIASUBTYPE_YUY2) {
- WORD* ds = (WORD*)d;
- WORD* dstend = ds + w;
-
- for (; ds < dstend; sub+=4, ds++) {
- if (sub[3] < 0xff) {
- int y = (c2y_yb[sub[0]] + c2y_yg[sub[1]] + c2y_yr[sub[2]] + 0x108000) >> 16;
- *ds = 0x8000|y; // w/o colors
- }
- }
- } else if (subtype == MEDIASUBTYPE_RGB555) {
- WORD* ds = (WORD*)d;
- WORD* dstend = ds + w;
-
- for (; ds < dstend; sub+=4, ds++) {
- if (sub[3] < 0xff) {
- *ds = ((*((DWORD*)sub)>>9)&0x7c00)|((*((DWORD*)sub)>>6)&0x03e0)|((*((DWORD*)sub)>>3)&0x001f);
- }
- }
- } else if (subtype == MEDIASUBTYPE_RGB565) {
- WORD* ds = (WORD*)d;
- WORD* dstend = ds + w;
-
- for (; ds < dstend; sub+=4, ds++) {
- if (sub[3] < 0xff) {
- *ds = ((*((DWORD*)sub)>>8)&0xf800)|((*((DWORD*)sub)>>5)&0x07e0)|((*((DWORD*)sub)>>3)&0x001f);
- }
- }
- } else if (subtype == MEDIASUBTYPE_RGB24) {
- BYTE* dt = (BYTE*)d;
- BYTE* dstend = dt + w*3;
-
- for (; dt < dstend; sub+=4, dt+=3) {
- if (sub[3] < 0xff) {
- dt[0] = sub[0];
- dt[1] = sub[1];
- dt[2] = sub[2];
- }
- }
- } else if (subtype == MEDIASUBTYPE_RGB32 || subtype == MEDIASUBTYPE_ARGB32) {
- DWORD* dstend = d + w;
-
- for (; d < dstend; sub+=4, d++) {
- if (sub[3] < 0xff) {
- *d = *((DWORD*)sub)&0xffffff;
- }
- }
- }
+ if (subtype == MEDIASUBTYPE_YV12 || subtype == MEDIASUBTYPE_I420 || subtype == MEDIASUBTYPE_IYUV) {
+ BYTE* db = (BYTE*)d;
+ BYTE* dbtend = db + w;
+
+ for (; db < dbtend; sub += 4, db++) {
+ if (sub[3] < 0xff) {
+ int y = (c2y_yb[sub[0]] + c2y_yg[sub[1]] + c2y_yr[sub[2]] + 0x108000) >> 16;
+ *db = y; // w/o colors
+ }
+ }
+ } else if (subtype == MEDIASUBTYPE_YUY2) {
+ WORD* ds = (WORD*)d;
+ WORD* dstend = ds + w;
+
+ for (; ds < dstend; sub += 4, ds++) {
+ if (sub[3] < 0xff) {
+ int y = (c2y_yb[sub[0]] + c2y_yg[sub[1]] + c2y_yr[sub[2]] + 0x108000) >> 16;
+ *ds = 0x8000 | y; // w/o colors
+ }
+ }
+ } else if (subtype == MEDIASUBTYPE_RGB555) {
+ WORD* ds = (WORD*)d;
+ WORD* dstend = ds + w;
+
+ for (; ds < dstend; sub += 4, ds++) {
+ if (sub[3] < 0xff) {
+ *ds = ((*((DWORD*)sub) >> 9) & 0x7c00) | ((*((DWORD*)sub) >> 6) & 0x03e0) | ((*((DWORD*)sub) >> 3) & 0x001f);
+ }
+ }
+ } else if (subtype == MEDIASUBTYPE_RGB565) {
+ WORD* ds = (WORD*)d;
+ WORD* dstend = ds + w;
+
+ for (; ds < dstend; sub += 4, ds++) {
+ if (sub[3] < 0xff) {
+ *ds = ((*((DWORD*)sub) >> 8) & 0xf800) | ((*((DWORD*)sub) >> 5) & 0x07e0) | ((*((DWORD*)sub) >> 3) & 0x001f);
+ }
+ }
+ } else if (subtype == MEDIASUBTYPE_RGB24) {
+ BYTE* dt = (BYTE*)d;
+ BYTE* dstend = dt + w * 3;
+
+ for (; dt < dstend; sub += 4, dt += 3) {
+ if (sub[3] < 0xff) {
+ dt[0] = sub[0];
+ dt[1] = sub[1];
+ dt[2] = sub[2];
+ }
+ }
+ } else if (subtype == MEDIASUBTYPE_RGB32 || subtype == MEDIASUBTYPE_ARGB32) {
+ DWORD* dstend = d + w;
+
+ for (; d < dstend; sub += 4, d++) {
+ if (sub[3] < 0xff) {
+ *d = *((DWORD*)sub) & 0xffffff;
+ }
+ }
+ }
}
HRESULT CDirectVobSubFilter::Copy(BYTE* pSub, BYTE* pIn, CSize sub, CSize in, int bpp, const GUID& subtype, DWORD black)
{
- int wIn = in.cx, hIn = in.cy, pitchIn = wIn*bpp>>3;
- int wSub = sub.cx, hSub = sub.cy, pitchSub = wSub*bpp>>3;
- bool fScale2x = wIn*2 <= wSub;
+ int wIn = in.cx, hIn = in.cy, pitchIn = wIn * bpp >> 3;
+ int wSub = sub.cx, hSub = sub.cy, pitchSub = wSub * bpp >> 3;
+ bool fScale2x = wIn * 2 <= wSub;
- if (fScale2x) {
- wIn <<= 1, hIn <<= 1;
- }
+ if (fScale2x) {
+ wIn <<= 1, hIn <<= 1;
+ }
- int left = ((wSub - wIn)>>1)&~1;
- int mid = wIn;
- int right = left + ((wSub - wIn)&1);
+ int left = ((wSub - wIn) >> 1)&~1;
+ int mid = wIn;
+ int right = left + ((wSub - wIn) & 1);
- int dpLeft = left*bpp>>3;
- int dpMid = mid*bpp>>3;
- int dpRight = right*bpp>>3;
+ int dpLeft = left * bpp >> 3;
+ int dpMid = mid * bpp >> 3;
+ int dpRight = right * bpp >> 3;
- ASSERT(wSub >= wIn);
+ ASSERT(wSub >= wIn);
- {
- int i = 0, j = 0;
+ {
+ int i = 0, j = 0;
- j += (hSub - hIn) >> 1;
+ j += (hSub - hIn) >> 1;
- for (; i < j; i++, pSub += pitchSub) {
- memsetd(pSub, black, dpLeft+dpMid+dpRight);
- }
+ for (; i < j; i++, pSub += pitchSub) {
+ memsetd(pSub, black, dpLeft + dpMid + dpRight);
+ }
- j += hIn;
+ j += hIn;
- if (hIn > hSub) {
- pIn += pitchIn * ((hIn - hSub) >> (fScale2x?2:1));
- }
+ if (hIn > hSub) {
+ pIn += pitchIn * ((hIn - hSub) >> (fScale2x ? 2 : 1));
+ }
- if (fScale2x) {
- Scale2x(subtype,
- pSub + dpLeft, pitchSub, pIn, pitchIn,
- in.cx, (min(j, hSub) - i) >> 1);
+ if (fScale2x) {
+ Scale2x(subtype,
+ pSub + dpLeft, pitchSub, pIn, pitchIn,
+ in.cx, (min(j, hSub) - i) >> 1);
- for (ptrdiff_t k = min(j, hSub); i < k; i++, pIn += pitchIn, pSub += pitchSub) {
- memsetd(pSub, black, dpLeft);
- memsetd(pSub + dpLeft+dpMid, black, dpRight);
- }
- } else {
- for (ptrdiff_t k = min(j, hSub); i < k; i++, pIn += pitchIn, pSub += pitchSub) {
- memsetd(pSub, black, dpLeft);
- memcpy(pSub + dpLeft, pIn, dpMid);
- memsetd(pSub + dpLeft+dpMid, black, dpRight);
- }
- }
+ for (ptrdiff_t k = min(j, hSub); i < k; i++, pIn += pitchIn, pSub += pitchSub) {
+ memsetd(pSub, black, dpLeft);
+ memsetd(pSub + dpLeft + dpMid, black, dpRight);
+ }
+ } else {
+ for (ptrdiff_t k = min(j, hSub); i < k; i++, pIn += pitchIn, pSub += pitchSub) {
+ memsetd(pSub, black, dpLeft);
+ memcpy(pSub + dpLeft, pIn, dpMid);
+ memsetd(pSub + dpLeft + dpMid, black, dpRight);
+ }
+ }
- j = hSub;
+ j = hSub;
- for (; i < j; i++, pSub += pitchSub) {
- memsetd(pSub, black, dpLeft+dpMid+dpRight);
- }
- }
+ for (; i < j; i++, pSub += pitchSub) {
+ memsetd(pSub, black, dpLeft + dpMid + dpRight);
+ }
+ }
- return NOERROR;
+ return NOERROR;
}
void CDirectVobSubFilter::PrintMessages(BYTE* pOut)
{
- if (!m_hdc || !m_hbm) {
- return;
- }
+ if (!m_hdc || !m_hbm) {
+ return;
+ }
- ColorConvInit();
+ ColorConvInit();
- const GUID& subtype = m_pOutput->CurrentMediaType().subtype;
+ const GUID& subtype = m_pOutput->CurrentMediaType().subtype;
- BITMAPINFOHEADER bihOut;
- ExtractBIH(&m_pOutput->CurrentMediaType(), &bihOut);
+ BITMAPINFOHEADER bihOut;
+ ExtractBIH(&m_pOutput->CurrentMediaType(), &bihOut);
- if (!m_fOSD) {
- return;
- }
+ if (!m_fOSD) {
+ return;
+ }
- CString msg;
+ CString msg;
- msg.Format(_T("in: %dx%d %s\nout: %dx%d %s\n"),
- m_w, m_h,
- Subtype2String(m_pInput->CurrentMediaType().subtype),
- bihOut.biWidth, bihOut.biHeight,
- Subtype2String(m_pOutput->CurrentMediaType().subtype));
+ msg.Format(_T("in: %dx%d %s\nout: %dx%d %s\n"),
+ m_w, m_h,
+ Subtype2String(m_pInput->CurrentMediaType().subtype),
+ bihOut.biWidth, bihOut.biHeight,
+ Subtype2String(m_pOutput->CurrentMediaType().subtype));
- msg.AppendFormat(_T("real fps: %.3f, current fps: %.3f\nmedia time: %d, subtitle time: %I64d [ms]\nframe number: %d (calculated)\nrate: %.4lf\n"),
- m_fps, m_fMediaFPSEnabled ? m_MediaFPS : fabs(m_fps),
- m_tPrev.Millisecs(), CalcCurrentTime()/10000,
- (int)(m_tPrev.m_time * m_fps / 10000000),
- m_pInput->CurrentRate());
+ msg.AppendFormat(_T("real fps: %.3f, current fps: %.3f\nmedia time: %d, subtitle time: %I64d [ms]\nframe number: %d (calculated)\nrate: %.4lf\n"),
+ m_fps, m_fMediaFPSEnabled ? m_MediaFPS : fabs(m_fps),
+ m_tPrev.Millisecs(), CalcCurrentTime() / 10000,
+ (int)(m_tPrev.m_time * m_fps / 10000000),
+ m_pInput->CurrentRate());
- CAutoLock cAutoLock(&m_csQueueLock);
+ CAutoLock cAutoLock(&m_csQueueLock);
- if (m_pSubPicQueue) {
- int nSubPics = -1;
- REFERENCE_TIME rtNow = -1, rtStart = -1, rtStop = -1;
- m_pSubPicQueue->GetStats(nSubPics, rtNow, rtStart, rtStop);
- msg.AppendFormat(_T("queue stats: %I64d - %I64d [ms]\n"), rtStart/10000, rtStop/10000);
+ if (m_pSubPicQueue) {
+ int nSubPics = -1;
+ REFERENCE_TIME rtNow = -1, rtStart = -1, rtStop = -1;
+ m_pSubPicQueue->GetStats(nSubPics, rtNow, rtStart, rtStop);
+ msg.AppendFormat(_T("queue stats: %I64d - %I64d [ms]\n"), rtStart / 10000, rtStop / 10000);
- for (int i = 0; i < nSubPics; i++) {
- m_pSubPicQueue->GetStats(i, rtStart, rtStop);
- msg.AppendFormat(_T("%d: %I64d - %I64d [ms]\n"), i, rtStart/10000, rtStop/10000);
- }
- }
+ for (int i = 0; i < nSubPics; i++) {
+ m_pSubPicQueue->GetStats(i, rtStart, rtStop);
+ msg.AppendFormat(_T("%d: %I64d - %I64d [ms]\n"), i, rtStart / 10000, rtStop / 10000);
+ }
+ }
- HANDLE hOldBitmap = SelectObject(m_hdc, m_hbm);
- HANDLE hOldFont = SelectObject(m_hdc, m_hfont);
+ HANDLE hOldBitmap = SelectObject(m_hdc, m_hbm);
+ HANDLE hOldFont = SelectObject(m_hdc, m_hfont);
- SetTextColor(m_hdc, 0xffffff);
- SetBkMode(m_hdc, TRANSPARENT);
- SetMapMode(m_hdc, MM_TEXT);
+ SetTextColor(m_hdc, 0xffffff);
+ SetBkMode(m_hdc, TRANSPARENT);
+ SetMapMode(m_hdc, MM_TEXT);
- BITMAP bm;
- GetObject(m_hbm, sizeof(BITMAP), &bm);
+ BITMAP bm;
+ GetObject(m_hbm, sizeof(BITMAP), &bm);
- CRect r(0, 0, bm.bmWidth, bm.bmHeight);
- DrawText(m_hdc, msg, msg.GetLength(), &r, DT_CALCRECT|DT_EXTERNALLEADING|DT_NOPREFIX|DT_WORDBREAK);
+ CRect r(0, 0, bm.bmWidth, bm.bmHeight);
+ DrawText(m_hdc, msg, msg.GetLength(), &r, DT_CALCRECT | DT_EXTERNALLEADING | DT_NOPREFIX | DT_WORDBREAK);
- r += CPoint(10, 10);
- r &= CRect(0, 0, bm.bmWidth, bm.bmHeight);
+ r += CPoint(10, 10);
+ r &= CRect(0, 0, bm.bmWidth, bm.bmHeight);
- DrawText(m_hdc, msg, msg.GetLength(), &r, DT_LEFT|DT_TOP|DT_NOPREFIX|DT_WORDBREAK);
+ DrawText(m_hdc, msg, msg.GetLength(), &r, DT_LEFT | DT_TOP | DT_NOPREFIX | DT_WORDBREAK);
- BYTE* pIn = (BYTE*)bm.bmBits;
- int pitchIn = bm.bmWidthBytes;
- int pitchOut = bihOut.biWidth * bihOut.biBitCount >> 3;
+ BYTE* pIn = (BYTE*)bm.bmBits;
+ int pitchIn = bm.bmWidthBytes;
+ int pitchOut = bihOut.biWidth * bihOut.biBitCount >> 3;
- if (subtype == MEDIASUBTYPE_YV12 || subtype == MEDIASUBTYPE_I420 || subtype == MEDIASUBTYPE_IYUV) {
- pitchOut = bihOut.biWidth;
- }
+ if (subtype == MEDIASUBTYPE_YV12 || subtype == MEDIASUBTYPE_I420 || subtype == MEDIASUBTYPE_IYUV) {
+ pitchOut = bihOut.biWidth;
+ }
- pitchIn = (pitchIn+3)&~3;
- pitchOut = (pitchOut+3)&~3;
+ pitchIn = (pitchIn + 3)&~3;
+ pitchOut = (pitchOut + 3)&~3;
- if (bihOut.biHeight > 0 && bihOut.biCompression <= 3) { // flip if the dst bitmap is flipped rgb (m_hbm is a top-down bitmap, not like the subpictures)
- pOut += pitchOut * (abs(bihOut.biHeight)-1);
- pitchOut = -pitchOut;
- }
+ if (bihOut.biHeight > 0 && bihOut.biCompression <= 3) { // flip if the dst bitmap is flipped rgb (m_hbm is a top-down bitmap, not like the subpictures)
+ pOut += pitchOut * (abs(bihOut.biHeight) - 1);
+ pitchOut = -pitchOut;
+ }
- pIn += pitchIn * r.top;
- pOut += pitchOut * r.top;
+ pIn += pitchIn * r.top;
+ pOut += pitchOut * r.top;
- for (int w = min(r.right, m_w), h = r.Height(); h--; pIn += pitchIn, pOut += pitchOut) {
- BltLineRGB32((DWORD*)pOut, pIn, w, subtype);
- memsetd(pIn, 0xff000000, r.right*4);
- }
+ for (int w = min(r.right, m_w), h = r.Height(); h--; pIn += pitchIn, pOut += pitchOut) {
+ BltLineRGB32((DWORD*)pOut, pIn, w, subtype);
+ memsetd(pIn, 0xff000000, r.right * 4);
+ }
- SelectObject(m_hdc, hOldBitmap);
- SelectObject(m_hdc, hOldFont);
+ SelectObject(m_hdc, hOldBitmap);
+ SelectObject(m_hdc, hOldFont);
}
diff --git a/src/filters/transform/VSFilter/DirectVobSub.cpp b/src/filters/transform/VSFilter/DirectVobSub.cpp
index 7f1a1bc92..15ed3e6d0 100644
--- a/src/filters/transform/VSFilter/DirectVobSub.cpp
+++ b/src/filters/transform/VSFilter/DirectVobSub.cpp
@@ -27,763 +27,763 @@
CDirectVobSub::CDirectVobSub()
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- BYTE* pData;
- UINT nSize;
-
- m_iSelectedLanguage = 0;
- m_fHideSubtitles = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_HIDE), 0);
- m_uSubPictToBuffer = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SUBPICTTOBUFFER), 10);
- m_fAnimWhenBuffering = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_ANIMWHENBUFFERING), 1);
- m_fOverridePlacement = !!theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_OVERRIDEPLACEMENT), 0);
- m_PlacementXperc = theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_XPERC), 50);
- m_PlacementYperc = theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_YPERC), 90);
- m_fBufferVobSub = !!theApp.GetProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_BUFFER), 1);
- m_fOnlyShowForcedVobSubs = !!theApp.GetProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_ONLYSHOWFORCEDSUBS), 0);
- m_fPolygonize = !!theApp.GetProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_POLYGONIZE), 0);
- m_defStyle <<= theApp.GetProfileString(ResStr(IDS_R_TEXT), ResStr(IDS_RT_STYLE), _T(""));
- m_fFlipPicture = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPPICTURE), 0);
- m_fFlipSubtitles = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPSUBTITLES), 0);
- m_fOSD = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SHOWOSDSTATS), 0);
- m_fSaveFullPath = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SAVEFULLPATH), 0);
- m_nReloaderDisableCount = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DISABLERELOADER), 0) ? 1 : 0;
- m_SubtitleDelay = theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLEDELAY), 0);
- m_SubtitleSpeedMul = theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDMUL), 1000);
- m_SubtitleSpeedDiv = theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDDIV), 1000);
- m_fMediaFPSEnabled = !!theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPSENABLED), 0);
- m_ePARCompensationType = static_cast<CSimpleTextSubtitle::EPARCompensationType>(theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_AUTOPARCOMPENSATION), 0));
- pData = NULL;
- if (theApp.GetProfileBinary(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPS), &pData, &nSize) && pData) {
- if (nSize != sizeof(m_MediaFPS)) {
- m_MediaFPS = 25.0;
- } else {
- memcpy(&m_MediaFPS, pData, sizeof(m_MediaFPS));
- }
- delete [] pData;
- }
- m_ZoomRect.left = m_ZoomRect.top = 0;
- m_ZoomRect.right = m_ZoomRect.bottom = 1;
-
- m_fForced = false;
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ BYTE* pData;
+ UINT nSize;
+
+ m_iSelectedLanguage = 0;
+ m_fHideSubtitles = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_HIDE), 0);
+ m_uSubPictToBuffer = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SUBPICTTOBUFFER), 10);
+ m_fAnimWhenBuffering = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_ANIMWHENBUFFERING), 1);
+ m_fOverridePlacement = !!theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_OVERRIDEPLACEMENT), 0);
+ m_PlacementXperc = theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_XPERC), 50);
+ m_PlacementYperc = theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_YPERC), 90);
+ m_fBufferVobSub = !!theApp.GetProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_BUFFER), 1);
+ m_fOnlyShowForcedVobSubs = !!theApp.GetProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_ONLYSHOWFORCEDSUBS), 0);
+ m_fPolygonize = !!theApp.GetProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_POLYGONIZE), 0);
+ m_defStyle <<= theApp.GetProfileString(ResStr(IDS_R_TEXT), ResStr(IDS_RT_STYLE), _T(""));
+ m_fFlipPicture = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPPICTURE), 0);
+ m_fFlipSubtitles = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPSUBTITLES), 0);
+ m_fOSD = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SHOWOSDSTATS), 0);
+ m_fSaveFullPath = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SAVEFULLPATH), 0);
+ m_nReloaderDisableCount = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DISABLERELOADER), 0) ? 1 : 0;
+ m_SubtitleDelay = theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLEDELAY), 0);
+ m_SubtitleSpeedMul = theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDMUL), 1000);
+ m_SubtitleSpeedDiv = theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDDIV), 1000);
+ m_fMediaFPSEnabled = !!theApp.GetProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPSENABLED), 0);
+ m_ePARCompensationType = static_cast<CSimpleTextSubtitle::EPARCompensationType>(theApp.GetProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_AUTOPARCOMPENSATION), 0));
+ pData = NULL;
+ if (theApp.GetProfileBinary(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPS), &pData, &nSize) && pData) {
+ if (nSize != sizeof(m_MediaFPS)) {
+ m_MediaFPS = 25.0;
+ } else {
+ memcpy(&m_MediaFPS, pData, sizeof(m_MediaFPS));
+ }
+ delete [] pData;
+ }
+ m_ZoomRect.left = m_ZoomRect.top = 0;
+ m_ZoomRect.right = m_ZoomRect.bottom = 1;
+
+ m_fForced = false;
}
CDirectVobSub::~CDirectVobSub()
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
}
STDMETHODIMP CDirectVobSub::get_FileName(WCHAR* fn)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (!fn) {
- return E_POINTER;
- }
+ if (!fn) {
+ return E_POINTER;
+ }
- wcscpy(fn, m_FileName);
+ wcscpy(fn, m_FileName);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_FileName(WCHAR* fn)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (!fn) {
- return E_POINTER;
- }
+ if (!fn) {
+ return E_POINTER;
+ }
- CString tmp = fn;
- if (!m_FileName.Left(m_FileName.ReverseFind('.')+1).CompareNoCase(tmp.Left(tmp.ReverseFind('.')+1))) {
- return S_FALSE;
- }
+ CString tmp = fn;
+ if (!m_FileName.Left(m_FileName.ReverseFind('.') + 1).CompareNoCase(tmp.Left(tmp.ReverseFind('.') + 1))) {
+ return S_FALSE;
+ }
- m_FileName = fn;
+ m_FileName = fn;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_LanguageCount(int* nLangs)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- return nLangs ? *nLangs = 0, S_OK : E_POINTER;
+ return nLangs ? *nLangs = 0, S_OK : E_POINTER;
}
STDMETHODIMP CDirectVobSub::get_LanguageName(int iLanguage, WCHAR** ppName)
{
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_SelectedLanguage(int* iSelected)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- return iSelected ? *iSelected = m_iSelectedLanguage, S_OK : E_POINTER;
+ return iSelected ? *iSelected = m_iSelectedLanguage, S_OK : E_POINTER;
}
STDMETHODIMP CDirectVobSub::put_SelectedLanguage(int iSelected)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (m_iSelectedLanguage == iSelected) {
- return S_FALSE;
- }
+ if (m_iSelectedLanguage == iSelected) {
+ return S_FALSE;
+ }
- int nCount;
- if (FAILED(get_LanguageCount(&nCount))
- || iSelected < 0
- || iSelected >= nCount) {
- return E_FAIL;
- }
+ int nCount;
+ if (FAILED(get_LanguageCount(&nCount))
+ || iSelected < 0
+ || iSelected >= nCount) {
+ return E_FAIL;
+ }
- m_iSelectedLanguage = iSelected;
+ m_iSelectedLanguage = iSelected;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_HideSubtitles(bool* fHideSubtitles)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- return fHideSubtitles ? *fHideSubtitles = m_fHideSubtitles, S_OK : E_POINTER;
+ return fHideSubtitles ? *fHideSubtitles = m_fHideSubtitles, S_OK : E_POINTER;
}
STDMETHODIMP CDirectVobSub::put_HideSubtitles(bool fHideSubtitles)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (m_fHideSubtitles == fHideSubtitles) {
- return S_FALSE;
- }
+ if (m_fHideSubtitles == fHideSubtitles) {
+ return S_FALSE;
+ }
- m_fHideSubtitles = fHideSubtitles;
+ m_fHideSubtitles = fHideSubtitles;
- return S_OK;
+ return S_OK;
}
// deprecated
STDMETHODIMP CDirectVobSub::get_PreBuffering(bool* fDoPreBuffering)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- return fDoPreBuffering ? *fDoPreBuffering = (m_uSubPictToBuffer > 0), S_OK : E_POINTER;
+ return fDoPreBuffering ? *fDoPreBuffering = (m_uSubPictToBuffer > 0), S_OK : E_POINTER;
}
// deprecated
STDMETHODIMP CDirectVobSub::put_PreBuffering(bool fDoPreBuffering)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if ((m_uSubPictToBuffer > 0) == fDoPreBuffering) {
- return S_FALSE;
- }
+ if ((m_uSubPictToBuffer > 0) == fDoPreBuffering) {
+ return S_FALSE;
+ }
- m_uSubPictToBuffer = fDoPreBuffering ? 4 : 0; // 4 is the default value for SubPictToBuffer
+ m_uSubPictToBuffer = fDoPreBuffering ? 4 : 0; // 4 is the default value for SubPictToBuffer
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_SubPictToBuffer(unsigned int* uSubPictToBuffer)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- return uSubPictToBuffer ? *uSubPictToBuffer = m_uSubPictToBuffer, S_OK : E_POINTER;
+ return uSubPictToBuffer ? *uSubPictToBuffer = m_uSubPictToBuffer, S_OK : E_POINTER;
}
STDMETHODIMP CDirectVobSub::put_SubPictToBuffer(unsigned int uSubPictToBuffer)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (m_uSubPictToBuffer == uSubPictToBuffer) {
- return S_FALSE;
- }
+ if (m_uSubPictToBuffer == uSubPictToBuffer) {
+ return S_FALSE;
+ }
- m_uSubPictToBuffer = uSubPictToBuffer;
+ m_uSubPictToBuffer = uSubPictToBuffer;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_AnimWhenBuffering(bool* fAnimWhenBuffering)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- return fAnimWhenBuffering ? *fAnimWhenBuffering = m_fAnimWhenBuffering, S_OK : E_POINTER;
+ return fAnimWhenBuffering ? *fAnimWhenBuffering = m_fAnimWhenBuffering, S_OK : E_POINTER;
}
STDMETHODIMP CDirectVobSub::put_AnimWhenBuffering(bool fAnimWhenBuffering)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (m_fAnimWhenBuffering == fAnimWhenBuffering) {
- return S_FALSE;
- }
+ if (m_fAnimWhenBuffering == fAnimWhenBuffering) {
+ return S_FALSE;
+ }
- m_fAnimWhenBuffering = fAnimWhenBuffering;
+ m_fAnimWhenBuffering = fAnimWhenBuffering;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_Placement(bool* fOverridePlacement, int* xperc, int* yperc)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (fOverridePlacement) {
- *fOverridePlacement = m_fOverridePlacement;
- }
- if (xperc) {
- *xperc = m_PlacementXperc;
- }
- if (yperc) {
- *yperc = m_PlacementYperc;
- }
+ if (fOverridePlacement) {
+ *fOverridePlacement = m_fOverridePlacement;
+ }
+ if (xperc) {
+ *xperc = m_PlacementXperc;
+ }
+ if (yperc) {
+ *yperc = m_PlacementYperc;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_Placement(bool fOverridePlacement, int xperc, int yperc)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (m_fOverridePlacement == fOverridePlacement && m_PlacementXperc == xperc && m_PlacementYperc == yperc) {
- return S_FALSE;
- }
+ if (m_fOverridePlacement == fOverridePlacement && m_PlacementXperc == xperc && m_PlacementYperc == yperc) {
+ return S_FALSE;
+ }
- m_fOverridePlacement = fOverridePlacement;
- m_PlacementXperc = xperc;
- m_PlacementYperc = yperc;
+ m_fOverridePlacement = fOverridePlacement;
+ m_PlacementXperc = xperc;
+ m_PlacementYperc = yperc;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_VobSubSettings(bool* fBuffer, bool* fOnlyShowForcedSubs, bool* fPolygonize)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (fBuffer) {
- *fBuffer = m_fBufferVobSub;
- }
- if (fOnlyShowForcedSubs) {
- *fOnlyShowForcedSubs = m_fOnlyShowForcedVobSubs;
- }
- if (fPolygonize) {
- *fPolygonize = m_fPolygonize;
- }
+ if (fBuffer) {
+ *fBuffer = m_fBufferVobSub;
+ }
+ if (fOnlyShowForcedSubs) {
+ *fOnlyShowForcedSubs = m_fOnlyShowForcedVobSubs;
+ }
+ if (fPolygonize) {
+ *fPolygonize = m_fPolygonize;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_VobSubSettings(bool fBuffer, bool fOnlyShowForcedSubs, bool fPolygonize)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (m_fBufferVobSub == fBuffer && m_fOnlyShowForcedVobSubs == fOnlyShowForcedSubs && m_fPolygonize == fPolygonize) {
- return S_FALSE;
- }
+ if (m_fBufferVobSub == fBuffer && m_fOnlyShowForcedVobSubs == fOnlyShowForcedSubs && m_fPolygonize == fPolygonize) {
+ return S_FALSE;
+ }
- m_fBufferVobSub = fBuffer;
- m_fOnlyShowForcedVobSubs = fOnlyShowForcedSubs;
- m_fPolygonize = fPolygonize;
+ m_fBufferVobSub = fBuffer;
+ m_fOnlyShowForcedVobSubs = fOnlyShowForcedSubs;
+ m_fPolygonize = fPolygonize;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_TextSettings(void* lf, int lflen, COLORREF* color, bool* fShadow, bool* fOutline, bool* fAdvancedRenderer)
{
- CAutoLock cAutoLock(&m_propsLock);
-
- if (lf) {
- if (lflen == sizeof(LOGFONTA)) {
- strncpy_s(((LOGFONTA*)lf)->lfFaceName, LF_FACESIZE, CStringA(m_defStyle.fontName), _TRUNCATE);
- } else if (lflen == sizeof(LOGFONTW)) {
- wcsncpy_s(((LOGFONTW*)lf)->lfFaceName, LF_FACESIZE, CStringW(m_defStyle.fontName), _TRUNCATE);
- } else {
- return E_INVALIDARG;
- }
-
- ((LOGFONT*)lf)->lfCharSet = m_defStyle.charSet;
- ((LOGFONT*)lf)->lfItalic = m_defStyle.fItalic;
- ((LOGFONT*)lf)->lfHeight = (LONG)m_defStyle.fontSize;
- ((LOGFONT*)lf)->lfWeight = m_defStyle.fontWeight;
- ((LOGFONT*)lf)->lfStrikeOut = m_defStyle.fStrikeOut;
- ((LOGFONT*)lf)->lfUnderline = m_defStyle.fUnderline;
- }
-
- if (color) {
- *color = m_defStyle.colors[0];
- }
- if (fShadow) {
- *fShadow = (m_defStyle.shadowDepthX!=0) || (m_defStyle.shadowDepthY!=0);
- }
- if (fOutline) {
- *fOutline = (m_defStyle.outlineWidthX+m_defStyle.outlineWidthY)>0;
- }
- if (fAdvancedRenderer) {
- *fAdvancedRenderer = m_fAdvancedRenderer;
- }
-
- return S_OK;
+ CAutoLock cAutoLock(&m_propsLock);
+
+ if (lf) {
+ if (lflen == sizeof(LOGFONTA)) {
+ strncpy_s(((LOGFONTA*)lf)->lfFaceName, LF_FACESIZE, CStringA(m_defStyle.fontName), _TRUNCATE);
+ } else if (lflen == sizeof(LOGFONTW)) {
+ wcsncpy_s(((LOGFONTW*)lf)->lfFaceName, LF_FACESIZE, CStringW(m_defStyle.fontName), _TRUNCATE);
+ } else {
+ return E_INVALIDARG;
+ }
+
+ ((LOGFONT*)lf)->lfCharSet = m_defStyle.charSet;
+ ((LOGFONT*)lf)->lfItalic = m_defStyle.fItalic;
+ ((LOGFONT*)lf)->lfHeight = (LONG)m_defStyle.fontSize;
+ ((LOGFONT*)lf)->lfWeight = m_defStyle.fontWeight;
+ ((LOGFONT*)lf)->lfStrikeOut = m_defStyle.fStrikeOut;
+ ((LOGFONT*)lf)->lfUnderline = m_defStyle.fUnderline;
+ }
+
+ if (color) {
+ *color = m_defStyle.colors[0];
+ }
+ if (fShadow) {
+ *fShadow = (m_defStyle.shadowDepthX != 0) || (m_defStyle.shadowDepthY != 0);
+ }
+ if (fOutline) {
+ *fOutline = (m_defStyle.outlineWidthX + m_defStyle.outlineWidthY) > 0;
+ }
+ if (fAdvancedRenderer) {
+ *fAdvancedRenderer = m_fAdvancedRenderer;
+ }
+
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_TextSettings(void* lf, int lflen, COLORREF color, bool fShadow, bool fOutline, bool fAdvancedRenderer)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (lf) {
- if (lflen == sizeof(LOGFONTA)) {
- m_defStyle.fontName = ((LOGFONTA*)lf)->lfFaceName;
- } else if (lflen == sizeof(LOGFONTW)) {
- m_defStyle.fontName = ((LOGFONTW*)lf)->lfFaceName;
- } else {
- return E_INVALIDARG;
- }
+ if (lf) {
+ if (lflen == sizeof(LOGFONTA)) {
+ m_defStyle.fontName = ((LOGFONTA*)lf)->lfFaceName;
+ } else if (lflen == sizeof(LOGFONTW)) {
+ m_defStyle.fontName = ((LOGFONTW*)lf)->lfFaceName;
+ } else {
+ return E_INVALIDARG;
+ }
- m_defStyle.charSet = ((LOGFONT*)lf)->lfCharSet;
- m_defStyle.fItalic = !!((LOGFONT*)lf)->lfItalic;
- m_defStyle.fontSize = ((LOGFONT*)lf)->lfHeight;
- m_defStyle.fontWeight = ((LOGFONT*)lf)->lfWeight;
- m_defStyle.fStrikeOut = !!((LOGFONT*)lf)->lfStrikeOut;
- m_defStyle.fUnderline = !!((LOGFONT*)lf)->lfUnderline;
+ m_defStyle.charSet = ((LOGFONT*)lf)->lfCharSet;
+ m_defStyle.fItalic = !!((LOGFONT*)lf)->lfItalic;
+ m_defStyle.fontSize = ((LOGFONT*)lf)->lfHeight;
+ m_defStyle.fontWeight = ((LOGFONT*)lf)->lfWeight;
+ m_defStyle.fStrikeOut = !!((LOGFONT*)lf)->lfStrikeOut;
+ m_defStyle.fUnderline = !!((LOGFONT*)lf)->lfUnderline;
- if (m_defStyle.fontSize < 0) {
- HDC hdc = ::GetDC(0);
- m_defStyle.fontSize = -m_defStyle.fontSize * 72 / GetDeviceCaps(hdc, LOGPIXELSY);
- ::ReleaseDC(0, hdc);
- }
+ if (m_defStyle.fontSize < 0) {
+ HDC hdc = ::GetDC(0);
+ m_defStyle.fontSize = -m_defStyle.fontSize * 72 / GetDeviceCaps(hdc, LOGPIXELSY);
+ ::ReleaseDC(0, hdc);
+ }
- }
+ }
- m_defStyle.colors[0] = color;
- m_defStyle.shadowDepthX = m_defStyle.shadowDepthY = fShadow?2:0;
- m_defStyle.outlineWidthX = m_defStyle.outlineWidthY = fOutline?2:0;
+ m_defStyle.colors[0] = color;
+ m_defStyle.shadowDepthX = m_defStyle.shadowDepthY = fShadow ? 2 : 0;
+ m_defStyle.outlineWidthX = m_defStyle.outlineWidthY = fOutline ? 2 : 0;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_Flip(bool* fPicture, bool* fSubtitles)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (fPicture) {
- *fPicture = m_fFlipPicture;
- }
- if (fSubtitles) {
- *fSubtitles = m_fFlipSubtitles;
- }
+ if (fPicture) {
+ *fPicture = m_fFlipPicture;
+ }
+ if (fSubtitles) {
+ *fSubtitles = m_fFlipSubtitles;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_Flip(bool fPicture, bool fSubtitles)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (m_fFlipPicture == fPicture && m_fFlipSubtitles == fSubtitles) {
- return S_FALSE;
- }
+ if (m_fFlipPicture == fPicture && m_fFlipSubtitles == fSubtitles) {
+ return S_FALSE;
+ }
- m_fFlipPicture = fPicture;
- m_fFlipSubtitles = fSubtitles;
+ m_fFlipPicture = fPicture;
+ m_fFlipSubtitles = fSubtitles;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_OSD(bool* fOSD)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- return fOSD ? *fOSD = m_fOSD, S_OK : E_POINTER;
+ return fOSD ? *fOSD = m_fOSD, S_OK : E_POINTER;
}
STDMETHODIMP CDirectVobSub::put_OSD(bool fOSD)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (m_fOSD == fOSD) {
- return S_FALSE;
- }
+ if (m_fOSD == fOSD) {
+ return S_FALSE;
+ }
- m_fOSD = fOSD;
+ m_fOSD = fOSD;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_SaveFullPath(bool* fSaveFullPath)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- return fSaveFullPath ? *fSaveFullPath = m_fSaveFullPath, S_OK : E_POINTER;
+ return fSaveFullPath ? *fSaveFullPath = m_fSaveFullPath, S_OK : E_POINTER;
}
STDMETHODIMP CDirectVobSub::put_SaveFullPath(bool fSaveFullPath)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (m_fSaveFullPath == fSaveFullPath) {
- return S_FALSE;
- }
+ if (m_fSaveFullPath == fSaveFullPath) {
+ return S_FALSE;
+ }
- m_fSaveFullPath = fSaveFullPath;
+ m_fSaveFullPath = fSaveFullPath;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_SubtitleTiming(int* delay, int* speedmul, int* speeddiv)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (delay) {
- *delay = m_SubtitleDelay;
- }
- if (speedmul) {
- *speedmul = m_SubtitleSpeedMul;
- }
- if (speeddiv) {
- *speeddiv = m_SubtitleSpeedDiv;
- }
+ if (delay) {
+ *delay = m_SubtitleDelay;
+ }
+ if (speedmul) {
+ *speedmul = m_SubtitleSpeedMul;
+ }
+ if (speeddiv) {
+ *speeddiv = m_SubtitleSpeedDiv;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_SubtitleTiming(int delay, int speedmul, int speeddiv)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (m_SubtitleDelay == delay && m_SubtitleSpeedMul == speedmul && m_SubtitleSpeedDiv == speeddiv) {
- return S_FALSE;
- }
+ if (m_SubtitleDelay == delay && m_SubtitleSpeedMul == speedmul && m_SubtitleSpeedDiv == speeddiv) {
+ return S_FALSE;
+ }
- m_SubtitleDelay = delay;
- m_SubtitleSpeedMul = speedmul;
- if (speeddiv > 0) {
- m_SubtitleSpeedDiv = speeddiv;
- }
+ m_SubtitleDelay = delay;
+ m_SubtitleSpeedMul = speedmul;
+ if (speeddiv > 0) {
+ m_SubtitleSpeedDiv = speeddiv;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_MediaFPS(bool* fEnabled, double* fps)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (fEnabled) {
- *fEnabled = m_fMediaFPSEnabled;
- }
- if (fps) {
- *fps = m_MediaFPS;
- }
+ if (fEnabled) {
+ *fEnabled = m_fMediaFPSEnabled;
+ }
+ if (fps) {
+ *fps = m_MediaFPS;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_MediaFPS(bool fEnabled, double fps)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (m_fMediaFPSEnabled == fEnabled && m_MediaFPS == fps) {
- return S_FALSE;
- }
+ if (m_fMediaFPSEnabled == fEnabled && m_MediaFPS == fps) {
+ return S_FALSE;
+ }
- m_fMediaFPSEnabled = fEnabled;
- if (fps > 0) {
- m_MediaFPS = fps;
- }
+ m_fMediaFPSEnabled = fEnabled;
+ if (fps > 0) {
+ m_MediaFPS = fps;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_ZoomRect(NORMALIZEDRECT* rect)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (!rect) {
- return E_POINTER;
- }
+ if (!rect) {
+ return E_POINTER;
+ }
- *rect = m_ZoomRect;
+ *rect = m_ZoomRect;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_ZoomRect(NORMALIZEDRECT* rect)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (!rect) {
- return E_POINTER;
- }
+ if (!rect) {
+ return E_POINTER;
+ }
- if (!memcmp(&m_ZoomRect, rect, sizeof(m_ZoomRect))) {
- return S_FALSE;
- }
+ if (!memcmp(&m_ZoomRect, rect, sizeof(m_ZoomRect))) {
+ return S_FALSE;
+ }
- m_ZoomRect = *rect;
+ m_ZoomRect = *rect;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::UpdateRegistry()
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- CAutoLock cAutoLock(&m_propsLock);
-
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_HIDE), m_fHideSubtitles);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SUBPICTTOBUFFER), m_uSubPictToBuffer);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_ANIMWHENBUFFERING), m_fAnimWhenBuffering);
- theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_OVERRIDEPLACEMENT), m_fOverridePlacement);
- theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_XPERC), m_PlacementXperc);
- theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_YPERC), m_PlacementYperc);
- theApp.WriteProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_BUFFER), m_fBufferVobSub);
- theApp.WriteProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_ONLYSHOWFORCEDSUBS), m_fOnlyShowForcedVobSubs);
- theApp.WriteProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_POLYGONIZE), m_fPolygonize);
- CString style;
- theApp.WriteProfileString(ResStr(IDS_R_TEXT), ResStr(IDS_RT_STYLE), style <<= m_defStyle);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPPICTURE), m_fFlipPicture);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPSUBTITLES), m_fFlipSubtitles);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SHOWOSDSTATS), m_fOSD);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SAVEFULLPATH), m_fSaveFullPath);
- theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLEDELAY), m_SubtitleDelay);
- theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDMUL), m_SubtitleSpeedMul);
- theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDDIV), m_SubtitleSpeedDiv);
- theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPSENABLED), m_fMediaFPSEnabled);
- theApp.WriteProfileBinary(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPS), (BYTE*)&m_MediaFPS, sizeof(m_MediaFPS));
- theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_AUTOPARCOMPENSATION), m_ePARCompensationType);
-
- return S_OK;
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ CAutoLock cAutoLock(&m_propsLock);
+
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_HIDE), m_fHideSubtitles);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SUBPICTTOBUFFER), m_uSubPictToBuffer);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_ANIMWHENBUFFERING), m_fAnimWhenBuffering);
+ theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_OVERRIDEPLACEMENT), m_fOverridePlacement);
+ theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_XPERC), m_PlacementXperc);
+ theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_YPERC), m_PlacementYperc);
+ theApp.WriteProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_BUFFER), m_fBufferVobSub);
+ theApp.WriteProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_ONLYSHOWFORCEDSUBS), m_fOnlyShowForcedVobSubs);
+ theApp.WriteProfileInt(ResStr(IDS_R_VOBSUB), ResStr(IDS_RV_POLYGONIZE), m_fPolygonize);
+ CString style;
+ theApp.WriteProfileString(ResStr(IDS_R_TEXT), ResStr(IDS_RT_STYLE), style <<= m_defStyle);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPPICTURE), m_fFlipPicture);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FLIPSUBTITLES), m_fFlipSubtitles);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SHOWOSDSTATS), m_fOSD);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SAVEFULLPATH), m_fSaveFullPath);
+ theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLEDELAY), m_SubtitleDelay);
+ theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDMUL), m_SubtitleSpeedMul);
+ theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_SUBTITLESPEEDDIV), m_SubtitleSpeedDiv);
+ theApp.WriteProfileInt(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPSENABLED), m_fMediaFPSEnabled);
+ theApp.WriteProfileBinary(ResStr(IDS_R_TIMING), ResStr(IDS_RTM_MEDIAFPS), (BYTE*)&m_MediaFPS, sizeof(m_MediaFPS));
+ theApp.WriteProfileInt(ResStr(IDS_R_TEXT), ResStr(IDS_RT_AUTOPARCOMPENSATION), m_ePARCompensationType);
+
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::HasConfigDialog(int iSelected)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CDirectVobSub::ShowConfigDialog(int iSelected, HWND hWndParent)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CDirectVobSub::IsSubtitleReloaderLocked(bool* fLocked)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (!fLocked) {
- return E_POINTER;
- }
+ if (!fLocked) {
+ return E_POINTER;
+ }
- bool fDisabled;
- get_SubtitleReloader(&fDisabled);
+ bool fDisabled;
+ get_SubtitleReloader(&fDisabled);
- *fLocked = fDisabled || m_nReloaderDisableCount > 0;
+ *fLocked = fDisabled || m_nReloaderDisableCount > 0;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::LockSubtitleReloader(bool fLock)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (fLock) {
- m_nReloaderDisableCount++;
- } else {
- m_nReloaderDisableCount--;
- }
+ if (fLock) {
+ m_nReloaderDisableCount++;
+ } else {
+ m_nReloaderDisableCount--;
+ }
- ASSERT(m_nReloaderDisableCount >= 0);
- if (m_nReloaderDisableCount < 0) {
- m_nReloaderDisableCount = 0;
- }
+ ASSERT(m_nReloaderDisableCount >= 0);
+ if (m_nReloaderDisableCount < 0) {
+ m_nReloaderDisableCount = 0;
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_SubtitleReloader(bool* fDisabled)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (fDisabled) {
- *fDisabled = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DISABLERELOADER), 0);
- }
+ if (fDisabled) {
+ *fDisabled = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DISABLERELOADER), 0);
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_SubtitleReloader(bool fDisable)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- bool b;
- get_SubtitleReloader(&b);
- if (b == fDisable) {
- return S_FALSE;
- }
+ bool b;
+ get_SubtitleReloader(&b);
+ if (b == fDisable) {
+ return S_FALSE;
+ }
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DISABLERELOADER), fDisable);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_DISABLERELOADER), fDisable);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_ExtendPicture(int* horizontal, int* vertical, int* resx2, int* resx2minw, int* resx2minh)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (horizontal) {
- *horizontal = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_MOD32FIX), 0) & 1;
- }
- if (vertical) {
- *vertical = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTPIC), 0);
- }
- if (resx2) {
- *resx2 = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2), 2) & 3;
- }
- if (resx2minw) {
- *resx2minw = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINW), 384);
- }
- if (resx2minh) {
- *resx2minh = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINH), 288);
- }
+ if (horizontal) {
+ *horizontal = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_MOD32FIX), 0) & 1;
+ }
+ if (vertical) {
+ *vertical = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTPIC), 0);
+ }
+ if (resx2) {
+ *resx2 = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2), 2) & 3;
+ }
+ if (resx2minw) {
+ *resx2minw = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINW), 384);
+ }
+ if (resx2minh) {
+ *resx2minh = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINH), 288);
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_ExtendPicture(int horizontal, int vertical, int resx2, int resx2minw, int resx2minh)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- int i[5];
- get_ExtendPicture(i, i+1, i+2, i+3, i+4);
- if (i[0] == horizontal && i[1] == vertical && i[2] == resx2 && i[3] == resx2minw && i[4] == resx2minh) {
- return S_FALSE;
- }
+ int i[5];
+ get_ExtendPicture(i, i + 1, i + 2, i + 3, i + 4);
+ if (i[0] == horizontal && i[1] == vertical && i[2] == resx2 && i[3] == resx2minw && i[4] == resx2minh) {
+ return S_FALSE;
+ }
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_MOD32FIX), horizontal & 1);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTPIC), vertical);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2), resx2 & 3);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINW), resx2minw);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINH), resx2minh);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_MOD32FIX), horizontal & 1);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTPIC), vertical);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2), resx2 & 3);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINW), resx2minw);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_RESX2MINH), resx2minh);
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_LoadSettings(int* level, bool* fExternalLoad, bool* fWebLoad, bool* fEmbeddedLoad)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (level) {
- *level = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_LOADLEVEL), 0) & 3;
- }
- if (fExternalLoad) {
- *fExternalLoad = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTERNALLOAD), 1);
- }
- if (fWebLoad) {
- *fWebLoad = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_WEBLOAD), 0);
- }
- if (fEmbeddedLoad) {
- *fEmbeddedLoad = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EMBEDDEDLOAD), 1);
- }
+ if (level) {
+ *level = theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_LOADLEVEL), 0) & 3;
+ }
+ if (fExternalLoad) {
+ *fExternalLoad = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTERNALLOAD), 1);
+ }
+ if (fWebLoad) {
+ *fWebLoad = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_WEBLOAD), 0);
+ }
+ if (fEmbeddedLoad) {
+ *fEmbeddedLoad = !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EMBEDDEDLOAD), 1);
+ }
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_LoadSettings(int level, bool fExternalLoad, bool fWebLoad, bool fEmbeddedLoad)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- int i;
- bool b[3];
- get_LoadSettings(&i, b, b+1, b+2);
- if (i == level && b[0] == fExternalLoad && b[1] == fWebLoad && b[2] == fEmbeddedLoad) {
- return S_FALSE;
- }
+ int i;
+ bool b[3];
+ get_LoadSettings(&i, b, b + 1, b + 2);
+ if (i == level && b[0] == fExternalLoad && b[1] == fWebLoad && b[2] == fEmbeddedLoad) {
+ return S_FALSE;
+ }
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_LOADLEVEL), level & 3);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTERNALLOAD), fExternalLoad);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_WEBLOAD), fWebLoad);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EMBEDDEDLOAD), fEmbeddedLoad);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_LOADLEVEL), level & 3);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EXTERNALLOAD), fExternalLoad);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_WEBLOAD), fWebLoad);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_EMBEDDEDLOAD), fEmbeddedLoad);
- return S_OK;
+ return S_OK;
}
// IDirectVobSub2
STDMETHODIMP CDirectVobSub::AdviseSubClock(ISubClock* pSubClock)
{
- m_pSubClock = pSubClock;
- return S_OK;
+ m_pSubClock = pSubClock;
+ return S_OK;
}
STDMETHODIMP_(bool) CDirectVobSub::get_Forced()
{
- return m_fForced;
+ return m_fForced;
}
STDMETHODIMP CDirectVobSub::put_Forced(bool fForced)
{
- m_fForced = fForced;
- return S_OK;
+ m_fForced = fForced;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_TextSettings(STSStyle* pDefStyle)
{
- CheckPointer(pDefStyle, E_POINTER);
+ CheckPointer(pDefStyle, E_POINTER);
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- *pDefStyle = m_defStyle;
+ *pDefStyle = m_defStyle;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_TextSettings(STSStyle* pDefStyle)
{
- CheckPointer(pDefStyle, E_POINTER);
+ CheckPointer(pDefStyle, E_POINTER);
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- if (!memcmp(&m_defStyle, pDefStyle, sizeof(m_defStyle))) {
- return S_FALSE;
- }
+ if (!memcmp(&m_defStyle, pDefStyle, sizeof(m_defStyle))) {
+ return S_FALSE;
+ }
- m_defStyle = *pDefStyle;
+ m_defStyle = *pDefStyle;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::get_AspectRatioSettings(CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- *ePARCompensationType = m_ePARCompensationType;
+ *ePARCompensationType = m_ePARCompensationType;
- return S_OK;
+ return S_OK;
}
STDMETHODIMP CDirectVobSub::put_AspectRatioSettings(CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType)
{
- CAutoLock cAutoLock(&m_propsLock);
+ CAutoLock cAutoLock(&m_propsLock);
- m_ePARCompensationType = *ePARCompensationType;
+ m_ePARCompensationType = *ePARCompensationType;
- return S_OK;
+ return S_OK;
}
// IFilterVersion
STDMETHODIMP_(DWORD) CDirectVobSub::GetFilterVersion()
{
- return 0x0234;
+ return 0x0234;
}
diff --git a/src/filters/transform/VSFilter/DirectVobSub.h b/src/filters/transform/VSFilter/DirectVobSub.h
index e7cb42e25..3c307b1e8 100644
--- a/src/filters/transform/VSFilter/DirectVobSub.h
+++ b/src/filters/transform/VSFilter/DirectVobSub.h
@@ -29,110 +29,110 @@
class CDirectVobSub : public IDirectVobSub2, public IFilterVersion
{
protected:
- CDirectVobSub();
- virtual ~CDirectVobSub();
+ CDirectVobSub();
+ virtual ~CDirectVobSub();
protected:
- CCritSec m_propsLock;
-
- CString m_FileName;
- int m_iSelectedLanguage;
- bool m_fHideSubtitles;
- unsigned int m_uSubPictToBuffer;
- bool m_fAnimWhenBuffering;
- bool m_fOverridePlacement;
- int m_PlacementXperc, m_PlacementYperc;
- bool m_fBufferVobSub, m_fOnlyShowForcedVobSubs, m_fPolygonize;
- CSimpleTextSubtitle::EPARCompensationType m_ePARCompensationType;
-
- STSStyle m_defStyle;
-
- bool m_fAdvancedRenderer;
- bool m_fFlipPicture, m_fFlipSubtitles;
- bool m_fOSD;
- int m_nReloaderDisableCount;
- int m_SubtitleDelay, m_SubtitleSpeedMul, m_SubtitleSpeedDiv;
- bool m_fMediaFPSEnabled;
- double m_MediaFPS;
- bool m_fSaveFullPath;
- NORMALIZEDRECT m_ZoomRect;
-
- CComPtr<ISubClock> m_pSubClock;
- bool m_fForced;
+ CCritSec m_propsLock;
+
+ CString m_FileName;
+ int m_iSelectedLanguage;
+ bool m_fHideSubtitles;
+ unsigned int m_uSubPictToBuffer;
+ bool m_fAnimWhenBuffering;
+ bool m_fOverridePlacement;
+ int m_PlacementXperc, m_PlacementYperc;
+ bool m_fBufferVobSub, m_fOnlyShowForcedVobSubs, m_fPolygonize;
+ CSimpleTextSubtitle::EPARCompensationType m_ePARCompensationType;
+
+ STSStyle m_defStyle;
+
+ bool m_fAdvancedRenderer;
+ bool m_fFlipPicture, m_fFlipSubtitles;
+ bool m_fOSD;
+ int m_nReloaderDisableCount;
+ int m_SubtitleDelay, m_SubtitleSpeedMul, m_SubtitleSpeedDiv;
+ bool m_fMediaFPSEnabled;
+ double m_MediaFPS;
+ bool m_fSaveFullPath;
+ NORMALIZEDRECT m_ZoomRect;
+
+ CComPtr<ISubClock> m_pSubClock;
+ bool m_fForced;
public:
- // IDirectVobSub
-
- STDMETHODIMP get_FileName(WCHAR* fn);
- STDMETHODIMP put_FileName(WCHAR* fn);
- STDMETHODIMP get_LanguageCount(int* nLangs);
- STDMETHODIMP get_LanguageName(int iLanguage, WCHAR** ppName);
- STDMETHODIMP get_SelectedLanguage(int* iSelected);
- STDMETHODIMP put_SelectedLanguage(int iSelected);
- STDMETHODIMP get_HideSubtitles(bool* fHideSubtitles);
- STDMETHODIMP put_HideSubtitles(bool fHideSubtitles);
- STDMETHODIMP get_PreBuffering(bool* fDoPreBuffering); // deprecated
- STDMETHODIMP put_PreBuffering(bool fDoPreBuffering); // deprecated
- STDMETHODIMP get_SubPictToBuffer(unsigned int* uSubPictToBuffer);
- STDMETHODIMP put_SubPictToBuffer(unsigned int uSubPictToBuffer);
- STDMETHODIMP get_AnimWhenBuffering(bool* fAnimWhenBuffering);
- STDMETHODIMP put_AnimWhenBuffering(bool fAnimWhenBuffering);
- STDMETHODIMP get_Placement(bool* fOverridePlacement, int* xperc, int* yperc);
- STDMETHODIMP put_Placement(bool fOverridePlacement, int xperc, int yperc);
- STDMETHODIMP get_VobSubSettings(bool* fBuffer, bool* fOnlyShowForcedSubs, bool* fPolygonize);
- STDMETHODIMP put_VobSubSettings(bool fBuffer, bool fOnlyShowForcedSubs, bool fPolygonize);
- STDMETHODIMP get_TextSettings(void* lf, int lflen, COLORREF* color, bool* fShadow, bool* fOutline, bool* fAdvancedRenderer);
- STDMETHODIMP put_TextSettings(void* lf, int lflen, COLORREF color, bool fShadow, bool fOutline, bool fAdvancedRenderer);
- STDMETHODIMP get_Flip(bool* fPicture, bool* fSubtitles);
- STDMETHODIMP put_Flip(bool fPicture, bool fSubtitles);
- STDMETHODIMP get_OSD(bool* fShowOSD);
- STDMETHODIMP put_OSD(bool fShowOSD);
- STDMETHODIMP get_SaveFullPath(bool* fSaveFullPath);
- STDMETHODIMP put_SaveFullPath(bool fSaveFullPath);
- STDMETHODIMP get_SubtitleTiming(int* delay, int* speedmul, int* speeddiv);
- STDMETHODIMP put_SubtitleTiming(int delay, int speedmul, int speeddiv);
- STDMETHODIMP get_MediaFPS(bool* fEnabled, double* fps);
- STDMETHODIMP put_MediaFPS(bool fEnabled, double fps);
- STDMETHODIMP get_ZoomRect(NORMALIZEDRECT* rect);
- STDMETHODIMP put_ZoomRect(NORMALIZEDRECT* rect);
- STDMETHODIMP get_ColorFormat(int* iPosition) {
- return E_NOTIMPL;
- }
- STDMETHODIMP put_ColorFormat(int iPosition) {
- return E_NOTIMPL;
- }
-
- STDMETHODIMP UpdateRegistry();
-
- STDMETHODIMP HasConfigDialog(int iSelected);
- STDMETHODIMP ShowConfigDialog(int iSelected, HWND hWndParent);
-
- // settings for the rest are stored in the registry
-
- STDMETHODIMP IsSubtitleReloaderLocked(bool* fLocked);
- STDMETHODIMP LockSubtitleReloader(bool fLock);
- STDMETHODIMP get_SubtitleReloader(bool* fDisabled);
- STDMETHODIMP put_SubtitleReloader(bool fDisable);
-
- // the followings need a partial or full reloading of the filter
-
- STDMETHODIMP get_ExtendPicture(int* horizontal, int* vertical, int* resx2, int* resx2minw, int* resx2minh);
- STDMETHODIMP put_ExtendPicture(int horizontal, int vertical, int resx2, int resx2minw, int resx2minh);
- STDMETHODIMP get_LoadSettings(int* level, bool* fExternalLoad, bool* fWebLoad, bool* fEmbeddedLoad);
- STDMETHODIMP put_LoadSettings(int level, bool fExternalLoad, bool fWebLoad, bool fEmbeddedLoad);
-
- // IDirectVobSub2
-
- STDMETHODIMP AdviseSubClock(ISubClock* pSubClock);
- STDMETHODIMP_(bool) get_Forced();
- STDMETHODIMP put_Forced(bool fForced);
- STDMETHODIMP get_TextSettings(STSStyle* pDefStyle);
- STDMETHODIMP put_TextSettings(STSStyle* pDefStyle);
- STDMETHODIMP get_AspectRatioSettings(CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType);
- STDMETHODIMP put_AspectRatioSettings(CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType);
-
- // IFilterVersion
-
- STDMETHODIMP_(DWORD) GetFilterVersion();
+ // IDirectVobSub
+
+ STDMETHODIMP get_FileName(WCHAR* fn);
+ STDMETHODIMP put_FileName(WCHAR* fn);
+ STDMETHODIMP get_LanguageCount(int* nLangs);
+ STDMETHODIMP get_LanguageName(int iLanguage, WCHAR** ppName);
+ STDMETHODIMP get_SelectedLanguage(int* iSelected);
+ STDMETHODIMP put_SelectedLanguage(int iSelected);
+ STDMETHODIMP get_HideSubtitles(bool* fHideSubtitles);
+ STDMETHODIMP put_HideSubtitles(bool fHideSubtitles);
+ STDMETHODIMP get_PreBuffering(bool* fDoPreBuffering); // deprecated
+ STDMETHODIMP put_PreBuffering(bool fDoPreBuffering); // deprecated
+ STDMETHODIMP get_SubPictToBuffer(unsigned int* uSubPictToBuffer);
+ STDMETHODIMP put_SubPictToBuffer(unsigned int uSubPictToBuffer);
+ STDMETHODIMP get_AnimWhenBuffering(bool* fAnimWhenBuffering);
+ STDMETHODIMP put_AnimWhenBuffering(bool fAnimWhenBuffering);
+ STDMETHODIMP get_Placement(bool* fOverridePlacement, int* xperc, int* yperc);
+ STDMETHODIMP put_Placement(bool fOverridePlacement, int xperc, int yperc);
+ STDMETHODIMP get_VobSubSettings(bool* fBuffer, bool* fOnlyShowForcedSubs, bool* fPolygonize);
+ STDMETHODIMP put_VobSubSettings(bool fBuffer, bool fOnlyShowForcedSubs, bool fPolygonize);
+ STDMETHODIMP get_TextSettings(void* lf, int lflen, COLORREF* color, bool* fShadow, bool* fOutline, bool* fAdvancedRenderer);
+ STDMETHODIMP put_TextSettings(void* lf, int lflen, COLORREF color, bool fShadow, bool fOutline, bool fAdvancedRenderer);
+ STDMETHODIMP get_Flip(bool* fPicture, bool* fSubtitles);
+ STDMETHODIMP put_Flip(bool fPicture, bool fSubtitles);
+ STDMETHODIMP get_OSD(bool* fShowOSD);
+ STDMETHODIMP put_OSD(bool fShowOSD);
+ STDMETHODIMP get_SaveFullPath(bool* fSaveFullPath);
+ STDMETHODIMP put_SaveFullPath(bool fSaveFullPath);
+ STDMETHODIMP get_SubtitleTiming(int* delay, int* speedmul, int* speeddiv);
+ STDMETHODIMP put_SubtitleTiming(int delay, int speedmul, int speeddiv);
+ STDMETHODIMP get_MediaFPS(bool* fEnabled, double* fps);
+ STDMETHODIMP put_MediaFPS(bool fEnabled, double fps);
+ STDMETHODIMP get_ZoomRect(NORMALIZEDRECT* rect);
+ STDMETHODIMP put_ZoomRect(NORMALIZEDRECT* rect);
+ STDMETHODIMP get_ColorFormat(int* iPosition) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_ColorFormat(int iPosition) {
+ return E_NOTIMPL;
+ }
+
+ STDMETHODIMP UpdateRegistry();
+
+ STDMETHODIMP HasConfigDialog(int iSelected);
+ STDMETHODIMP ShowConfigDialog(int iSelected, HWND hWndParent);
+
+ // settings for the rest are stored in the registry
+
+ STDMETHODIMP IsSubtitleReloaderLocked(bool* fLocked);
+ STDMETHODIMP LockSubtitleReloader(bool fLock);
+ STDMETHODIMP get_SubtitleReloader(bool* fDisabled);
+ STDMETHODIMP put_SubtitleReloader(bool fDisable);
+
+ // the followings need a partial or full reloading of the filter
+
+ STDMETHODIMP get_ExtendPicture(int* horizontal, int* vertical, int* resx2, int* resx2minw, int* resx2minh);
+ STDMETHODIMP put_ExtendPicture(int horizontal, int vertical, int resx2, int resx2minw, int resx2minh);
+ STDMETHODIMP get_LoadSettings(int* level, bool* fExternalLoad, bool* fWebLoad, bool* fEmbeddedLoad);
+ STDMETHODIMP put_LoadSettings(int level, bool fExternalLoad, bool fWebLoad, bool fEmbeddedLoad);
+
+ // IDirectVobSub2
+
+ STDMETHODIMP AdviseSubClock(ISubClock* pSubClock);
+ STDMETHODIMP_(bool) get_Forced();
+ STDMETHODIMP put_Forced(bool fForced);
+ STDMETHODIMP get_TextSettings(STSStyle* pDefStyle);
+ STDMETHODIMP put_TextSettings(STSStyle* pDefStyle);
+ STDMETHODIMP get_AspectRatioSettings(CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType);
+ STDMETHODIMP put_AspectRatioSettings(CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType);
+
+ // IFilterVersion
+
+ STDMETHODIMP_(DWORD) GetFilterVersion();
};
diff --git a/src/filters/transform/VSFilter/DirectVobSubFilter.cpp b/src/filters/transform/VSFilter/DirectVobSubFilter.cpp
index e70ade97b..74c4b9d6d 100644
--- a/src/filters/transform/VSFilter/DirectVobSubFilter.cpp
+++ b/src/filters/transform/VSFilter/DirectVobSubFilter.cpp
@@ -47,1744 +47,1744 @@ bool g_RegOK = true;//false; // doesn't work with the dvd graph builder
//
CDirectVobSubFilter::CDirectVobSubFilter(LPUNKNOWN punk, HRESULT* phr, const GUID& clsid)
- : CBaseVideoFilter(NAME("CDirectVobSubFilter"), punk, phr, clsid)
- , m_nSubtitleId((DWORD_PTR)-1)
- , m_fMSMpeg4Fix(false)
- , m_fps(25)
+ : CBaseVideoFilter(NAME("CDirectVobSubFilter"), punk, phr, clsid)
+ , m_nSubtitleId((DWORD_PTR) - 1)
+ , m_fMSMpeg4Fix(false)
+ , m_fps(25)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- m_hdc = 0;
- m_hbm = 0;
- m_hfont = 0;
-
- {
- LOGFONT lf;
- memset(&lf, 0, sizeof(lf));
- lf.lfCharSet = DEFAULT_CHARSET;
- lf.lfOutPrecision = OUT_CHARACTER_PRECIS;
- lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
- lf.lfQuality = ANTIALIASED_QUALITY;
- HDC hdc = GetDC(NULL);
- lf.lfHeight = -MulDiv(10, GetDeviceCaps(hdc, LOGPIXELSY), 72);
- ReleaseDC(NULL, hdc);
- lf.lfWeight = FW_BOLD;
- _tcscpy_s(lf.lfFaceName, _T("Arial"));
- m_hfont = CreateFontIndirect(&lf);
- }
-
- theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), _T("Hint"), _T("The first three are fixed, but you can add more up to ten entries."));
- theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), _T("Path0"), _T("."));
- theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), _T("Path1"), _T("c:\\subtitles"));
- theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), _T("Path2"), _T(".\\subtitles"));
-
- m_fLoading = true;
-
- m_hSystrayThread = 0;
- m_tbid.hSystrayWnd = NULL;
- m_tbid.graph = NULL;
- m_tbid.fRunOnce = false;
- m_tbid.fShowIcon = (theApp.m_AppName.Find(_T("zplayer"), 0) < 0 || !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_ENABLEZPICON), 0));
-
- HRESULT hr = S_OK;
- m_pTextInput.Add(DNew CTextInputPin(this, m_pLock, &m_csSubLock, &hr));
- ASSERT(SUCCEEDED(hr));
-
- CAMThread::Create();
- m_frd.EndThreadEvent.Create(0, FALSE, FALSE, 0);
- m_frd.RefreshEvent.Create(0, FALSE, FALSE, 0);
-
- memset(&m_CurrentVIH2, 0, sizeof(VIDEOINFOHEADER2));
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ m_hdc = 0;
+ m_hbm = 0;
+ m_hfont = 0;
+
+ {
+ LOGFONT lf;
+ memset(&lf, 0, sizeof(lf));
+ lf.lfCharSet = DEFAULT_CHARSET;
+ lf.lfOutPrecision = OUT_CHARACTER_PRECIS;
+ lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
+ lf.lfQuality = ANTIALIASED_QUALITY;
+ HDC hdc = GetDC(NULL);
+ lf.lfHeight = -MulDiv(10, GetDeviceCaps(hdc, LOGPIXELSY), 72);
+ ReleaseDC(NULL, hdc);
+ lf.lfWeight = FW_BOLD;
+ _tcscpy_s(lf.lfFaceName, _T("Arial"));
+ m_hfont = CreateFontIndirect(&lf);
+ }
+
+ theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), _T("Hint"), _T("The first three are fixed, but you can add more up to ten entries."));
+ theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), _T("Path0"), _T("."));
+ theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), _T("Path1"), _T("c:\\subtitles"));
+ theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), _T("Path2"), _T(".\\subtitles"));
+
+ m_fLoading = true;
+
+ m_hSystrayThread = 0;
+ m_tbid.hSystrayWnd = NULL;
+ m_tbid.graph = NULL;
+ m_tbid.fRunOnce = false;
+ m_tbid.fShowIcon = (theApp.m_AppName.Find(_T("zplayer"), 0) < 0 || !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_ENABLEZPICON), 0));
+
+ HRESULT hr = S_OK;
+ m_pTextInput.Add(DNew CTextInputPin(this, m_pLock, &m_csSubLock, &hr));
+ ASSERT(SUCCEEDED(hr));
+
+ CAMThread::Create();
+ m_frd.EndThreadEvent.Create(0, FALSE, FALSE, 0);
+ m_frd.RefreshEvent.Create(0, FALSE, FALSE, 0);
+
+ memset(&m_CurrentVIH2, 0, sizeof(VIDEOINFOHEADER2));
}
CDirectVobSubFilter::~CDirectVobSubFilter()
{
- CAutoLock cAutoLock(&m_csQueueLock);
- if (m_pSubPicQueue) {
- m_pSubPicQueue->Invalidate();
- }
- m_pSubPicQueue = NULL;
-
- if (m_hfont) {
- DeleteObject(m_hfont);
- m_hfont = 0;
- }
- if (m_hbm) {
- DeleteObject(m_hbm);
- m_hbm = 0;
- }
- if (m_hdc) {
- DeleteObject(m_hdc);
- m_hdc = 0;
- }
-
- for (size_t i = 0; i < m_pTextInput.GetCount(); i++) {
- delete m_pTextInput[i];
- }
-
- m_frd.EndThreadEvent.Set();
- CAMThread::Close();
+ CAutoLock cAutoLock(&m_csQueueLock);
+ if (m_pSubPicQueue) {
+ m_pSubPicQueue->Invalidate();
+ }
+ m_pSubPicQueue = NULL;
+
+ if (m_hfont) {
+ DeleteObject(m_hfont);
+ m_hfont = 0;
+ }
+ if (m_hbm) {
+ DeleteObject(m_hbm);
+ m_hbm = 0;
+ }
+ if (m_hdc) {
+ DeleteObject(m_hdc);
+ m_hdc = 0;
+ }
+
+ for (size_t i = 0; i < m_pTextInput.GetCount(); i++) {
+ delete m_pTextInput[i];
+ }
+
+ m_frd.EndThreadEvent.Set();
+ CAMThread::Close();
}
STDMETHODIMP CDirectVobSubFilter::NonDelegatingQueryInterface(REFIID riid, void** ppv)
{
- CheckPointer(ppv, E_POINTER);
-
- return
- QI(IDirectVobSub)
- QI(IDirectVobSub2)
- QI(IFilterVersion)
- QI(ISpecifyPropertyPages)
- QI(IAMStreamSelect)
- __super::NonDelegatingQueryInterface(riid, ppv);
+ CheckPointer(ppv, E_POINTER);
+
+ return
+ QI(IDirectVobSub)
+ QI(IDirectVobSub2)
+ QI(IFilterVersion)
+ QI(ISpecifyPropertyPages)
+ QI(IAMStreamSelect)
+ __super::NonDelegatingQueryInterface(riid, ppv);
}
// CBaseVideoFilter
void CDirectVobSubFilter::GetOutputSize(int& w, int& h, int& arx, int& ary, int& RealWidth, int& RealHeight, int& vsfilter)
{
- CSize s(w, h), os = s;
- AdjustFrameSize(s);
- w = s.cx;
- h = s.cy;
- vsfilter = 1; // enable workaround, see BaseVideoFilter.cpp
-
- if (w != os.cx) {
- while (arx < 100) {
- arx *= 10, ary *= 10;
- }
- arx = arx * w / os.cx;
- }
-
- if (h != os.cy) {
- while (ary < 100) {
- arx *= 10, ary *= 10;
- }
- ary = ary * h / os.cy;
- }
+ CSize s(w, h), os = s;
+ AdjustFrameSize(s);
+ w = s.cx;
+ h = s.cy;
+ vsfilter = 1; // enable workaround, see BaseVideoFilter.cpp
+
+ if (w != os.cx) {
+ while (arx < 100) {
+ arx *= 10, ary *= 10;
+ }
+ arx = arx * w / os.cx;
+ }
+
+ if (h != os.cy) {
+ while (ary < 100) {
+ arx *= 10, ary *= 10;
+ }
+ ary = ary * h / os.cy;
+ }
}
HRESULT CDirectVobSubFilter::Transform(IMediaSample* pIn)
{
- HRESULT hr;
+ HRESULT hr;
- REFERENCE_TIME rtStart, rtStop;
- if (SUCCEEDED(pIn->GetTime(&rtStart, &rtStop))) {
- double dRate = m_pInput->CurrentRate();
+ REFERENCE_TIME rtStart, rtStop;
+ if (SUCCEEDED(pIn->GetTime(&rtStart, &rtStop))) {
+ double dRate = m_pInput->CurrentRate();
- m_tPrev = m_pInput->CurrentStartTime() + (REFERENCE_TIME)(dRate*rtStart);
-
- REFERENCE_TIME rtAvgTimePerFrame = rtStop - rtStart;
- if (CComQIPtr<ISubClock2> pSC2 = m_pSubClock) {
- REFERENCE_TIME rt;
- if (S_OK == pSC2->GetAvgTimePerFrame(&rt)) {
- rtAvgTimePerFrame = rt;
- }
- }
+ m_tPrev = m_pInput->CurrentStartTime() + (REFERENCE_TIME)(dRate * rtStart);
+
+ REFERENCE_TIME rtAvgTimePerFrame = rtStop - rtStart;
+ if (CComQIPtr<ISubClock2> pSC2 = m_pSubClock) {
+ REFERENCE_TIME rt;
+ if (S_OK == pSC2->GetAvgTimePerFrame(&rt)) {
+ rtAvgTimePerFrame = rt;
+ }
+ }
- m_fps = 10000000.0/rtAvgTimePerFrame / dRate;
- }
-
- //
+ m_fps = 10000000.0 / rtAvgTimePerFrame / dRate;
+ }
+
+ //
- {
- CAutoLock cAutoLock(&m_csQueueLock);
+ {
+ CAutoLock cAutoLock(&m_csQueueLock);
- if (m_pSubPicQueue) {
- m_pSubPicQueue->SetTime(CalcCurrentTime());
- m_pSubPicQueue->SetFPS(m_fps);
- }
- }
+ if (m_pSubPicQueue) {
+ m_pSubPicQueue->SetTime(CalcCurrentTime());
+ m_pSubPicQueue->SetFPS(m_fps);
+ }
+ }
- //
+ //
- BYTE* pDataIn = NULL;
- if (FAILED(pIn->GetPointer(&pDataIn)) || !pDataIn) {
- return S_FALSE;
- }
+ BYTE* pDataIn = NULL;
+ if (FAILED(pIn->GetPointer(&pDataIn)) || !pDataIn) {
+ return S_FALSE;
+ }
- const CMediaType& mt = m_pInput->CurrentMediaType();
+ const CMediaType& mt = m_pInput->CurrentMediaType();
- BITMAPINFOHEADER bihIn;
- ExtractBIH(&mt, &bihIn);
+ BITMAPINFOHEADER bihIn;
+ ExtractBIH(&mt, &bihIn);
- bool fYV12 = (mt.subtype == MEDIASUBTYPE_YV12 || mt.subtype == MEDIASUBTYPE_I420 || mt.subtype == MEDIASUBTYPE_IYUV);
- int bpp = fYV12 ? 8 : bihIn.biBitCount;
- DWORD black = fYV12 ? 0x10101010 : (bihIn.biCompression == '2YUY') ? 0x80108010 : 0;
+ bool fYV12 = (mt.subtype == MEDIASUBTYPE_YV12 || mt.subtype == MEDIASUBTYPE_I420 || mt.subtype == MEDIASUBTYPE_IYUV);
+ int bpp = fYV12 ? 8 : bihIn.biBitCount;
+ DWORD black = fYV12 ? 0x10101010 : (bihIn.biCompression == '2YUY') ? 0x80108010 : 0;
- CSize sub(m_w, m_h);
- CSize in(bihIn.biWidth, bihIn.biHeight);
+ CSize sub(m_w, m_h);
+ CSize in(bihIn.biWidth, bihIn.biHeight);
- if (FAILED(Copy((BYTE*)m_pTempPicBuff, pDataIn, sub, in, bpp, mt.subtype, black))) {
- return E_FAIL;
- }
+ if (FAILED(Copy((BYTE*)m_pTempPicBuff, pDataIn, sub, in, bpp, mt.subtype, black))) {
+ return E_FAIL;
+ }
- if (fYV12) {
- BYTE* pSubV = (BYTE*)m_pTempPicBuff + (sub.cx*bpp>>3)*sub.cy;
- BYTE* pInV = pDataIn + (in.cx*bpp>>3)*in.cy;
- sub.cx >>= 1;
- sub.cy >>= 1;
- in.cx >>= 1;
- in.cy >>= 1;
- BYTE* pSubU = pSubV + (sub.cx*bpp>>3)*sub.cy;
- BYTE* pInU = pInV + (in.cx*bpp>>3)*in.cy;
- if (FAILED(Copy(pSubV, pInV, sub, in, bpp, mt.subtype, 0x80808080))) {
- return E_FAIL;
- }
- if (FAILED(Copy(pSubU, pInU, sub, in, bpp, mt.subtype, 0x80808080))) {
- return E_FAIL;
- }
- }
+ if (fYV12) {
+ BYTE* pSubV = (BYTE*)m_pTempPicBuff + (sub.cx * bpp >> 3) * sub.cy;
+ BYTE* pInV = pDataIn + (in.cx * bpp >> 3) * in.cy;
+ sub.cx >>= 1;
+ sub.cy >>= 1;
+ in.cx >>= 1;
+ in.cy >>= 1;
+ BYTE* pSubU = pSubV + (sub.cx * bpp >> 3) * sub.cy;
+ BYTE* pInU = pInV + (in.cx * bpp >> 3) * in.cy;
+ if (FAILED(Copy(pSubV, pInV, sub, in, bpp, mt.subtype, 0x80808080))) {
+ return E_FAIL;
+ }
+ if (FAILED(Copy(pSubU, pInU, sub, in, bpp, mt.subtype, 0x80808080))) {
+ return E_FAIL;
+ }
+ }
- //
+ //
- SubPicDesc spd = m_spd;
+ SubPicDesc spd = m_spd;
- CComPtr<IMediaSample> pOut;
- BYTE* pDataOut = NULL;
- if (FAILED(hr = GetDeliveryBuffer(spd.w, spd.h, &pOut))
- || FAILED(hr = pOut->GetPointer(&pDataOut))) {
- return hr;
- }
+ CComPtr<IMediaSample> pOut;
+ BYTE* pDataOut = NULL;
+ if (FAILED(hr = GetDeliveryBuffer(spd.w, spd.h, &pOut))
+ || FAILED(hr = pOut->GetPointer(&pDataOut))) {
+ return hr;
+ }
- pOut->SetTime(&rtStart, &rtStop);
- pOut->SetMediaTime(NULL, NULL);
+ pOut->SetTime(&rtStart, &rtStop);
+ pOut->SetMediaTime(NULL, NULL);
- pOut->SetDiscontinuity(pIn->IsDiscontinuity() == S_OK);
- pOut->SetSyncPoint(pIn->IsSyncPoint() == S_OK);
- pOut->SetPreroll(pIn->IsPreroll() == S_OK);
+ pOut->SetDiscontinuity(pIn->IsDiscontinuity() == S_OK);
+ pOut->SetSyncPoint(pIn->IsSyncPoint() == S_OK);
+ pOut->SetPreroll(pIn->IsPreroll() == S_OK);
- //
+ //
- BITMAPINFOHEADER bihOut;
- ExtractBIH(&m_pOutput->CurrentMediaType(), &bihOut);
+ BITMAPINFOHEADER bihOut;
+ ExtractBIH(&m_pOutput->CurrentMediaType(), &bihOut);
- bool fInputFlipped = bihIn.biHeight >= 0 && bihIn.biCompression <= 3;
- bool fOutputFlipped = bihOut.biHeight >= 0 && bihOut.biCompression <= 3;
+ bool fInputFlipped = bihIn.biHeight >= 0 && bihIn.biCompression <= 3;
+ bool fOutputFlipped = bihOut.biHeight >= 0 && bihOut.biCompression <= 3;
- bool fFlip = fInputFlipped != fOutputFlipped;
- if (m_fFlipPicture) {
- fFlip = !fFlip;
- }
- if (m_fMSMpeg4Fix) {
- fFlip = !fFlip;
- }
+ bool fFlip = fInputFlipped != fOutputFlipped;
+ if (m_fFlipPicture) {
+ fFlip = !fFlip;
+ }
+ if (m_fMSMpeg4Fix) {
+ fFlip = !fFlip;
+ }
- bool fFlipSub = fOutputFlipped;
- if (m_fFlipSubtitles) {
- fFlipSub = !fFlipSub;
- }
-
- //
-
- {
- CAutoLock cAutoLock(&m_csQueueLock);
+ bool fFlipSub = fOutputFlipped;
+ if (m_fFlipSubtitles) {
+ fFlipSub = !fFlipSub;
+ }
+
+ //
+
+ {
+ CAutoLock cAutoLock(&m_csQueueLock);
- if (m_pSubPicQueue) {
- CComPtr<ISubPic> pSubPic;
- if ((m_pSubPicQueue->LookupSubPic(CalcCurrentTime(), pSubPic)) && pSubPic) {
- CRect r;
- pSubPic->GetDirtyRect(r);
+ if (m_pSubPicQueue) {
+ CComPtr<ISubPic> pSubPic;
+ if ((m_pSubPicQueue->LookupSubPic(CalcCurrentTime(), pSubPic)) && pSubPic) {
+ CRect r;
+ pSubPic->GetDirtyRect(r);
- if (fFlip ^ fFlipSub) {
- spd.h = -spd.h;
- }
+ if (fFlip ^ fFlipSub) {
+ spd.h = -spd.h;
+ }
- pSubPic->AlphaBlt(r, r, &spd);
- }
- }
- }
+ pSubPic->AlphaBlt(r, r, &spd);
+ }
+ }
+ }
- CopyBuffer(pDataOut, (BYTE*)spd.bits, spd.w, abs(spd.h)*(fFlip?-1:1), spd.pitch, mt.subtype);
-
- PrintMessages(pDataOut);
-
- return m_pOutput->Deliver(pOut);
+ CopyBuffer(pDataOut, (BYTE*)spd.bits, spd.w, abs(spd.h) * (fFlip ? -1 : 1), spd.pitch, mt.subtype);
+
+ PrintMessages(pDataOut);
+
+ return m_pOutput->Deliver(pOut);
}
// CBaseFilter
CBasePin* CDirectVobSubFilter::GetPin(int n)
{
- if (n < __super::GetPinCount()) {
- return __super::GetPin(n);
- }
+ if (n < __super::GetPinCount()) {
+ return __super::GetPin(n);
+ }
- n -= __super::GetPinCount();
+ n -= __super::GetPinCount();
- if (n >= 0 && (size_t)n < m_pTextInput.GetCount()) {
- return m_pTextInput[n];
- }
+ if (n >= 0 && (size_t)n < m_pTextInput.GetCount()) {
+ return m_pTextInput[n];
+ }
- n -= m_pTextInput.GetCount();
+ n -= m_pTextInput.GetCount();
- return NULL;
+ return NULL;
}
int CDirectVobSubFilter::GetPinCount()
{
- return __super::GetPinCount() + m_pTextInput.GetCount();
+ return __super::GetPinCount() + m_pTextInput.GetCount();
}
HRESULT CDirectVobSubFilter::JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName)
{
- if (pGraph) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- if (!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SEENDIVXWARNING), 0)) {
- unsigned __int64 ver = GetFileVersion(_T("divx_c32.ax"));
- if (((ver >> 48)&0xffff) == 4 && ((ver >> 32)&0xffff) == 2) {
- DWORD dwVersion = GetVersion();
- DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
- //DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
-
- if (dwVersion < 0x80000000 && dwWindowsMajorVersion >= 5) {
- AfxMessageBox(IDS_DIVX_WARNING, MB_ICONWARNING | MB_OK, 0);
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SEENDIVXWARNING), 1);
- }
- }
- }
-
- /*removeme*/
- if (!g_RegOK) {
- DllRegisterServer();
- g_RegOK = true;
- }
- } else {
- if (m_hSystrayThread) {
- SendMessage(m_tbid.hSystrayWnd, WM_CLOSE, 0, 0);
-
- if (WaitForSingleObject(m_hSystrayThread, 10000) != WAIT_OBJECT_0) {
- DbgLog((LOG_TRACE, 0, _T("CALL THE AMBULANCE!!!")));
- TerminateThread(m_hSystrayThread, (DWORD)-1);
- }
-
- m_hSystrayThread = 0;
- }
- }
-
- return __super::JoinFilterGraph(pGraph, pName);
+ if (pGraph) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ if (!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SEENDIVXWARNING), 0)) {
+ unsigned __int64 ver = GetFileVersion(_T("divx_c32.ax"));
+ if (((ver >> 48) & 0xffff) == 4 && ((ver >> 32) & 0xffff) == 2) {
+ DWORD dwVersion = GetVersion();
+ DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
+ //DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
+
+ if (dwVersion < 0x80000000 && dwWindowsMajorVersion >= 5) {
+ AfxMessageBox(IDS_DIVX_WARNING, MB_ICONWARNING | MB_OK, 0);
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SEENDIVXWARNING), 1);
+ }
+ }
+ }
+
+ /*removeme*/
+ if (!g_RegOK) {
+ DllRegisterServer();
+ g_RegOK = true;
+ }
+ } else {
+ if (m_hSystrayThread) {
+ SendMessage(m_tbid.hSystrayWnd, WM_CLOSE, 0, 0);
+
+ if (WaitForSingleObject(m_hSystrayThread, 10000) != WAIT_OBJECT_0) {
+ DbgLog((LOG_TRACE, 0, _T("CALL THE AMBULANCE!!!")));
+ TerminateThread(m_hSystrayThread, (DWORD) - 1);
+ }
+
+ m_hSystrayThread = 0;
+ }
+ }
+
+ return __super::JoinFilterGraph(pGraph, pName);
}
STDMETHODIMP CDirectVobSubFilter::QueryFilterInfo(FILTER_INFO* pInfo)
{
- CheckPointer(pInfo, E_POINTER);
- ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
+ CheckPointer(pInfo, E_POINTER);
+ ValidateReadWritePtr(pInfo, sizeof(FILTER_INFO));
- if (!get_Forced()) {
- return __super::QueryFilterInfo(pInfo);
- }
+ if (!get_Forced()) {
+ return __super::QueryFilterInfo(pInfo);
+ }
- wcscpy_s(pInfo->achName, L"DirectVobSub (forced auto-loading version)");
- pInfo->pGraph = m_pGraph;
- if (m_pGraph) {
- m_pGraph->AddRef();
- }
+ wcscpy_s(pInfo->achName, L"DirectVobSub (forced auto-loading version)");
+ pInfo->pGraph = m_pGraph;
+ if (m_pGraph) {
+ m_pGraph->AddRef();
+ }
- return S_OK;
+ return S_OK;
}
// CTransformFilter
HRESULT CDirectVobSubFilter::SetMediaType(PIN_DIRECTION dir, const CMediaType* pmt)
{
- HRESULT hr = __super::SetMediaType(dir, pmt);
- if (FAILED(hr)) {
- return hr;
- }
+ HRESULT hr = __super::SetMediaType(dir, pmt);
+ if (FAILED(hr)) {
+ return hr;
+ }
- if (dir == PINDIR_INPUT) {
- CAutoLock cAutoLock(&m_csReceive);
+ if (dir == PINDIR_INPUT) {
+ CAutoLock cAutoLock(&m_csReceive);
- REFERENCE_TIME atpf =
- pmt->formattype == FORMAT_VideoInfo ? ((VIDEOINFOHEADER*)pmt->Format())->AvgTimePerFrame :
- pmt->formattype == FORMAT_VideoInfo2 ? ((VIDEOINFOHEADER2*)pmt->Format())->AvgTimePerFrame :
- 0;
+ REFERENCE_TIME atpf =
+ pmt->formattype == FORMAT_VideoInfo ? ((VIDEOINFOHEADER*)pmt->Format())->AvgTimePerFrame :
+ pmt->formattype == FORMAT_VideoInfo2 ? ((VIDEOINFOHEADER2*)pmt->Format())->AvgTimePerFrame :
+ 0;
- m_fps = atpf ? 10000000.0 / atpf : 25;
+ m_fps = atpf ? 10000000.0 / atpf : 25;
- if (pmt->formattype == FORMAT_VideoInfo2) {
- m_CurrentVIH2 = *(VIDEOINFOHEADER2*)pmt->Format();
- }
+ if (pmt->formattype == FORMAT_VideoInfo2) {
+ m_CurrentVIH2 = *(VIDEOINFOHEADER2*)pmt->Format();
+ }
- InitSubPicQueue();
- } else if (dir == PINDIR_OUTPUT) {
+ InitSubPicQueue();
+ } else if (dir == PINDIR_OUTPUT) {
- }
+ }
- return hr;
+ return hr;
}
HRESULT CDirectVobSubFilter::CheckConnect(PIN_DIRECTION dir, IPin* pPin)
{
- if (dir == PINDIR_INPUT) {
- } else if (dir == PINDIR_OUTPUT) {
- }
+ if (dir == PINDIR_INPUT) {
+ } else if (dir == PINDIR_OUTPUT) {
+ }
- return __super::CheckConnect(dir, pPin);
+ return __super::CheckConnect(dir, pPin);
}
HRESULT CDirectVobSubFilter::CompleteConnect(PIN_DIRECTION dir, IPin* pReceivePin)
{
- if (dir == PINDIR_INPUT) {
- CComPtr<IBaseFilter> pFilter;
-
- // needed when we have a decoder with a version number of 3.x
- if (SUCCEEDED(m_pGraph->FindFilterByName(L"DivX MPEG-4 DVD Video Decompressor ", &pFilter))
- && (GetFileVersion(_T("divx_c32.ax")) >> 48) <= 4
- || SUCCEEDED(m_pGraph->FindFilterByName(L"Microcrap MPEG-4 Video Decompressor", &pFilter))
- || SUCCEEDED(m_pGraph->FindFilterByName(L"Microsoft MPEG-4 Video Decompressor", &pFilter))
- && (GetFileVersion(_T("mpg4ds32.ax")) >> 48) <= 3) {
- m_fMSMpeg4Fix = true;
- }
- } else if (dir == PINDIR_OUTPUT) {
- if (!m_hSystrayThread) {
- m_tbid.graph = m_pGraph;
- m_tbid.dvs = static_cast<IDirectVobSub*>(this);
-
- DWORD tid;
- m_hSystrayThread = CreateThread(0, 0, SystrayThreadProc, &m_tbid, 0, &tid);
- }
-
- // HACK: triggers CBaseVideoFilter::SetMediaType to adjust m_w/m_h/.. and InitSubPicQueue() to realloc buffers
- m_pInput->SetMediaType(&m_pInput->CurrentMediaType());
- }
-
- return __super::CompleteConnect(dir, pReceivePin);
+ if (dir == PINDIR_INPUT) {
+ CComPtr<IBaseFilter> pFilter;
+
+ // needed when we have a decoder with a version number of 3.x
+ if (SUCCEEDED(m_pGraph->FindFilterByName(L"DivX MPEG-4 DVD Video Decompressor ", &pFilter))
+ && (GetFileVersion(_T("divx_c32.ax")) >> 48) <= 4
+ || SUCCEEDED(m_pGraph->FindFilterByName(L"Microcrap MPEG-4 Video Decompressor", &pFilter))
+ || SUCCEEDED(m_pGraph->FindFilterByName(L"Microsoft MPEG-4 Video Decompressor", &pFilter))
+ && (GetFileVersion(_T("mpg4ds32.ax")) >> 48) <= 3) {
+ m_fMSMpeg4Fix = true;
+ }
+ } else if (dir == PINDIR_OUTPUT) {
+ if (!m_hSystrayThread) {
+ m_tbid.graph = m_pGraph;
+ m_tbid.dvs = static_cast<IDirectVobSub*>(this);
+
+ DWORD tid;
+ m_hSystrayThread = CreateThread(0, 0, SystrayThreadProc, &m_tbid, 0, &tid);
+ }
+
+ // HACK: triggers CBaseVideoFilter::SetMediaType to adjust m_w/m_h/.. and InitSubPicQueue() to realloc buffers
+ m_pInput->SetMediaType(&m_pInput->CurrentMediaType());
+ }
+
+ return __super::CompleteConnect(dir, pReceivePin);
}
HRESULT CDirectVobSubFilter::BreakConnect(PIN_DIRECTION dir)
{
- if (dir == PINDIR_INPUT) {
- if (m_pOutput->IsConnected()) {
- m_pOutput->GetConnected()->Disconnect();
- m_pOutput->Disconnect();
- }
- } else if (dir == PINDIR_OUTPUT) {
- // not really needed, but may free up a little memory
- CAutoLock cAutoLock(&m_csQueueLock);
- m_pSubPicQueue = NULL;
- }
-
- return __super::BreakConnect(dir);
+ if (dir == PINDIR_INPUT) {
+ if (m_pOutput->IsConnected()) {
+ m_pOutput->GetConnected()->Disconnect();
+ m_pOutput->Disconnect();
+ }
+ } else if (dir == PINDIR_OUTPUT) {
+ // not really needed, but may free up a little memory
+ CAutoLock cAutoLock(&m_csQueueLock);
+ m_pSubPicQueue = NULL;
+ }
+
+ return __super::BreakConnect(dir);
}
HRESULT CDirectVobSubFilter::StartStreaming()
{
- // WARNING : calls to m_pGraph member functions from here will generate deadlock with Haali Renderer
- // within MPC-HC (reason is CAutoLock's variables in IFilterGraph functions overriden by CFGManager class)
+ // WARNING : calls to m_pGraph member functions from here will generate deadlock with Haali Renderer
+ // within MPC-HC (reason is CAutoLock's variables in IFilterGraph functions overriden by CFGManager class)
- m_fLoading = false;
+ m_fLoading = false;
- InitSubPicQueue();
+ InitSubPicQueue();
- m_tbid.fRunOnce = true;
+ m_tbid.fRunOnce = true;
- put_MediaFPS(m_fMediaFPSEnabled, m_MediaFPS);
+ put_MediaFPS(m_fMediaFPSEnabled, m_MediaFPS);
- return __super::StartStreaming();
+ return __super::StartStreaming();
}
HRESULT CDirectVobSubFilter::StopStreaming()
{
- InvalidateSubtitle();
+ InvalidateSubtitle();
- return __super::StopStreaming();
+ return __super::StopStreaming();
}
HRESULT CDirectVobSubFilter::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate)
{
- m_tPrev = tStart;
- return __super::NewSegment(tStart, tStop, dRate);
+ m_tPrev = tStart;
+ return __super::NewSegment(tStart, tStop, dRate);
}
//
REFERENCE_TIME CDirectVobSubFilter::CalcCurrentTime()
{
- REFERENCE_TIME rt = m_pSubClock ? m_pSubClock->GetTime() : m_tPrev;
- return (rt - 10000i64*m_SubtitleDelay) * m_SubtitleSpeedMul / m_SubtitleSpeedDiv; // no, it won't overflow if we use normal parameters (__int64 is enough for about 2000 hours if we multiply it by the max: 65536 as m_SubtitleSpeedMul)
+ REFERENCE_TIME rt = m_pSubClock ? m_pSubClock->GetTime() : m_tPrev;
+ return (rt - 10000i64 * m_SubtitleDelay) * m_SubtitleSpeedMul / m_SubtitleSpeedDiv; // no, it won't overflow if we use normal parameters (__int64 is enough for about 2000 hours if we multiply it by the max: 65536 as m_SubtitleSpeedMul)
}
void CDirectVobSubFilter::InitSubPicQueue()
{
- CAutoLock cAutoLock(&m_csQueueLock);
-
- m_pSubPicQueue = NULL;
-
- m_pTempPicBuff.Free();
- m_pTempPicBuff.Allocate(4*m_w*m_h);
-
- const GUID& subtype = m_pInput->CurrentMediaType().subtype;
-
- BITMAPINFOHEADER bihIn;
- ExtractBIH(&m_pInput->CurrentMediaType(), &bihIn);
-
- m_spd.type = -1;
- if (subtype == MEDIASUBTYPE_YV12) {
- m_spd.type = MSP_YV12;
- } else if (subtype == MEDIASUBTYPE_I420 || subtype == MEDIASUBTYPE_IYUV) {
- m_spd.type = MSP_IYUV;
- } else if (subtype == MEDIASUBTYPE_YUY2) {
- m_spd.type = MSP_YUY2;
- } else if (subtype == MEDIASUBTYPE_RGB32) {
- m_spd.type = MSP_RGB32;
- } else if (subtype == MEDIASUBTYPE_RGB24) {
- m_spd.type = MSP_RGB24;
- } else if (subtype == MEDIASUBTYPE_RGB565) {
- m_spd.type = MSP_RGB16;
- } else if (subtype == MEDIASUBTYPE_RGB555) {
- m_spd.type = MSP_RGB15;
- }
- m_spd.w = m_w;
- m_spd.h = m_h;
- m_spd.bpp = (m_spd.type == MSP_YV12 || m_spd.type == MSP_IYUV) ? 8 : bihIn.biBitCount;
- m_spd.pitch = m_spd.w*m_spd.bpp>>3;
- m_spd.bits = (void*)m_pTempPicBuff;
-
- CComPtr<ISubPicAllocator> pSubPicAllocator = new CMemSubPicAllocator(m_spd.type, CSize(m_w, m_h));
-
- CSize video(bihIn.biWidth, bihIn.biHeight), window = video;
- if (AdjustFrameSize(window)) {
- video += video;
- }
- ASSERT(window == CSize(m_w, m_h));
-
- pSubPicAllocator->SetCurSize(window);
- pSubPicAllocator->SetCurVidRect(CRect(CPoint((window.cx - video.cx)/2, (window.cy - video.cy)/2), video));
-
- HRESULT hr = S_OK;
-
- m_pSubPicQueue = m_uSubPictToBuffer > 0
- ? (ISubPicQueue*)DNew CSubPicQueue(m_uSubPictToBuffer, !m_fAnimWhenBuffering, pSubPicAllocator, &hr)
- : (ISubPicQueue*)DNew CSubPicQueueNoThread(pSubPicAllocator, &hr);
-
- if (FAILED(hr)) {
- m_pSubPicQueue = NULL;
- }
-
- UpdateSubtitle(false);
-
- if (m_hbm) {
- DeleteObject(m_hbm);
- m_hbm = NULL;
- }
- if (m_hdc) {
- DeleteDC(m_hdc);
- m_hdc = NULL;
- }
-
- struct {
- BITMAPINFOHEADER bih;
- DWORD mask[3];
- } b = {{sizeof(BITMAPINFOHEADER), m_w, -(int)m_h, 1, 32, BI_BITFIELDS, 0, 0, 0, 0, 0}, 0xFF0000, 0x00FF00, 0x0000FF};
- m_hdc = CreateCompatibleDC(NULL);
- m_hbm = CreateDIBSection(m_hdc, (BITMAPINFO*)&b, DIB_RGB_COLORS, NULL, NULL, 0);
-
- BITMAP bm;
- GetObject(m_hbm, sizeof(bm), &bm);
- memsetd(bm.bmBits, 0xFF000000, bm.bmHeight*bm.bmWidthBytes);
+ CAutoLock cAutoLock(&m_csQueueLock);
+
+ m_pSubPicQueue = NULL;
+
+ m_pTempPicBuff.Free();
+ m_pTempPicBuff.Allocate(4 * m_w * m_h);
+
+ const GUID& subtype = m_pInput->CurrentMediaType().subtype;
+
+ BITMAPINFOHEADER bihIn;
+ ExtractBIH(&m_pInput->CurrentMediaType(), &bihIn);
+
+ m_spd.type = -1;
+ if (subtype == MEDIASUBTYPE_YV12) {
+ m_spd.type = MSP_YV12;
+ } else if (subtype == MEDIASUBTYPE_I420 || subtype == MEDIASUBTYPE_IYUV) {
+ m_spd.type = MSP_IYUV;
+ } else if (subtype == MEDIASUBTYPE_YUY2) {
+ m_spd.type = MSP_YUY2;
+ } else if (subtype == MEDIASUBTYPE_RGB32) {
+ m_spd.type = MSP_RGB32;
+ } else if (subtype == MEDIASUBTYPE_RGB24) {
+ m_spd.type = MSP_RGB24;
+ } else if (subtype == MEDIASUBTYPE_RGB565) {
+ m_spd.type = MSP_RGB16;
+ } else if (subtype == MEDIASUBTYPE_RGB555) {
+ m_spd.type = MSP_RGB15;
+ }
+ m_spd.w = m_w;
+ m_spd.h = m_h;
+ m_spd.bpp = (m_spd.type == MSP_YV12 || m_spd.type == MSP_IYUV) ? 8 : bihIn.biBitCount;
+ m_spd.pitch = m_spd.w * m_spd.bpp >> 3;
+ m_spd.bits = (void*)m_pTempPicBuff;
+
+ CComPtr<ISubPicAllocator> pSubPicAllocator = new CMemSubPicAllocator(m_spd.type, CSize(m_w, m_h));
+
+ CSize video(bihIn.biWidth, bihIn.biHeight), window = video;
+ if (AdjustFrameSize(window)) {
+ video += video;
+ }
+ ASSERT(window == CSize(m_w, m_h));
+
+ pSubPicAllocator->SetCurSize(window);
+ pSubPicAllocator->SetCurVidRect(CRect(CPoint((window.cx - video.cx) / 2, (window.cy - video.cy) / 2), video));
+
+ HRESULT hr = S_OK;
+
+ m_pSubPicQueue = m_uSubPictToBuffer > 0
+ ? (ISubPicQueue*)DNew CSubPicQueue(m_uSubPictToBuffer, !m_fAnimWhenBuffering, pSubPicAllocator, &hr)
+ : (ISubPicQueue*)DNew CSubPicQueueNoThread(pSubPicAllocator, &hr);
+
+ if (FAILED(hr)) {
+ m_pSubPicQueue = NULL;
+ }
+
+ UpdateSubtitle(false);
+
+ if (m_hbm) {
+ DeleteObject(m_hbm);
+ m_hbm = NULL;
+ }
+ if (m_hdc) {
+ DeleteDC(m_hdc);
+ m_hdc = NULL;
+ }
+
+ struct {
+ BITMAPINFOHEADER bih;
+ DWORD mask[3];
+ } b = {{sizeof(BITMAPINFOHEADER), m_w, -(int)m_h, 1, 32, BI_BITFIELDS, 0, 0, 0, 0, 0}, 0xFF0000, 0x00FF00, 0x0000FF};
+ m_hdc = CreateCompatibleDC(NULL);
+ m_hbm = CreateDIBSection(m_hdc, (BITMAPINFO*)&b, DIB_RGB_COLORS, NULL, NULL, 0);
+
+ BITMAP bm;
+ GetObject(m_hbm, sizeof(bm), &bm);
+ memsetd(bm.bmBits, 0xFF000000, bm.bmHeight * bm.bmWidthBytes);
}
bool CDirectVobSubFilter::AdjustFrameSize(CSize& s)
{
- int horizontal, vertical, resx2, resx2minw, resx2minh;
- get_ExtendPicture(&horizontal, &vertical, &resx2, &resx2minw, &resx2minh);
-
- bool fRet = (resx2 == 1) || (resx2 == 2 && s.cx*s.cy <= resx2minw*resx2minh);
-
- if (fRet) {
- s.cx <<= 1;
- s.cy <<= 1;
- }
-
- int h;
- switch (vertical&0x7f) {
- case 1:
- h = s.cx * 9 / 16;
- if (s.cy < h || !!(vertical&0x80)) {
- s.cy = (h + 3) & ~3;
- }
- break;
- case 2:
- h = s.cx * 3 / 4;
- if (s.cy < h || !!(vertical&0x80)) {
- s.cy = (h + 3) & ~3;
- }
- break;
- case 3:
- h = 480;
- if (s.cy < h || !!(vertical&0x80)) {
- s.cy = (h + 3) & ~3;
- }
- break;
- case 4:
- h = 576;
- if (s.cy < h || !!(vertical&0x80)) {
- s.cy = (h + 3) & ~3;
- }
- break;
- }
-
- if (horizontal == 1) {
- s.cx = (s.cx + 31) & ~31;
- s.cy = (s.cy + 1) & ~1;
- }
-
- return fRet;
+ int horizontal, vertical, resx2, resx2minw, resx2minh;
+ get_ExtendPicture(&horizontal, &vertical, &resx2, &resx2minw, &resx2minh);
+
+ bool fRet = (resx2 == 1) || (resx2 == 2 && s.cx * s.cy <= resx2minw * resx2minh);
+
+ if (fRet) {
+ s.cx <<= 1;
+ s.cy <<= 1;
+ }
+
+ int h;
+ switch (vertical & 0x7f) {
+ case 1:
+ h = s.cx * 9 / 16;
+ if (s.cy < h || !!(vertical & 0x80)) {
+ s.cy = (h + 3) & ~3;
+ }
+ break;
+ case 2:
+ h = s.cx * 3 / 4;
+ if (s.cy < h || !!(vertical & 0x80)) {
+ s.cy = (h + 3) & ~3;
+ }
+ break;
+ case 3:
+ h = 480;
+ if (s.cy < h || !!(vertical & 0x80)) {
+ s.cy = (h + 3) & ~3;
+ }
+ break;
+ case 4:
+ h = 576;
+ if (s.cy < h || !!(vertical & 0x80)) {
+ s.cy = (h + 3) & ~3;
+ }
+ break;
+ }
+
+ if (horizontal == 1) {
+ s.cx = (s.cx + 31) & ~31;
+ s.cy = (s.cy + 1) & ~1;
+ }
+
+ return fRet;
}
STDMETHODIMP CDirectVobSubFilter::Count(DWORD* pcStreams)
{
- if (!pcStreams) {
- return E_POINTER;
- }
+ if (!pcStreams) {
+ return E_POINTER;
+ }
- *pcStreams = 0;
+ *pcStreams = 0;
- int nLangs = 0;
- if (SUCCEEDED(get_LanguageCount(&nLangs))) {
- (*pcStreams) += nLangs;
- }
+ int nLangs = 0;
+ if (SUCCEEDED(get_LanguageCount(&nLangs))) {
+ (*pcStreams) += nLangs;
+ }
- (*pcStreams) += 2; // enable ... disable
+ (*pcStreams) += 2; // enable ... disable
- (*pcStreams) += 2; // normal flipped
+ (*pcStreams) += 2; // normal flipped
- return S_OK;
+ return S_OK;
}
#define MAXPREFLANGS 5
int CDirectVobSubFilter::FindPreferedLanguage(bool fHideToo)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- int nLangs;
- get_LanguageCount(&nLangs);
+ int nLangs;
+ get_LanguageCount(&nLangs);
- if (nLangs <= 0) {
- return 0;
- }
+ if (nLangs <= 0) {
+ return 0;
+ }
- for (ptrdiff_t i = 0; i < MAXPREFLANGS; i++) {
- CString tmp;
- tmp.Format(IDS_RL_LANG, i);
+ for (ptrdiff_t i = 0; i < MAXPREFLANGS; i++) {
+ CString tmp;
+ tmp.Format(IDS_RL_LANG, i);
- CString lang = theApp.GetProfileString(ResStr(IDS_R_PREFLANGS), tmp);
+ CString lang = theApp.GetProfileString(ResStr(IDS_R_PREFLANGS), tmp);
- if (!lang.IsEmpty()) {
- for (int ret = 0; ret < nLangs; ret++) {
- CString l;
- WCHAR* pName = NULL;
- get_LanguageName(ret, &pName);
- l = pName;
- CoTaskMemFree(pName);
+ if (!lang.IsEmpty()) {
+ for (int ret = 0; ret < nLangs; ret++) {
+ CString l;
+ WCHAR* pName = NULL;
+ get_LanguageName(ret, &pName);
+ l = pName;
+ CoTaskMemFree(pName);
- if (!l.CompareNoCase(lang)) {
- return ret;
- }
- }
- }
- }
+ if (!l.CompareNoCase(lang)) {
+ return ret;
+ }
+ }
+ }
+ }
- return 0;
+ return 0;
}
void CDirectVobSubFilter::UpdatePreferedLanguages(CString l)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- CString langs[MAXPREFLANGS+1];
-
- int i = 0, j = 0, k = -1;
- for (; i < MAXPREFLANGS; i++) {
- CString tmp;
- tmp.Format(IDS_RL_LANG, i);
-
- langs[j] = theApp.GetProfileString(ResStr(IDS_R_PREFLANGS), tmp);
-
- if (!langs[j].IsEmpty()) {
- if (!langs[j].CompareNoCase(l)) {
- k = j;
- }
- j++;
- }
- }
-
- if (k == -1) {
- langs[k = j] = l;
- j++;
- }
-
- // move the selected to the top of the list
-
- while (k > 0) {
- CString tmp = langs[k];
- langs[k] = langs[k-1];
- langs[k-1] = tmp;
- k--;
- }
-
- // move "Hide subtitles" to the last position if it wasn't our selection
-
- CString hidesubs;
- hidesubs.LoadString(IDS_M_HIDESUBTITLES);
-
- for (k = 1; k < j; k++) {
- if (!langs[k].CompareNoCase(hidesubs)) {
- break;
- }
- }
-
- while (k < j-1) {
- CString tmp = langs[k];
- langs[k] = langs[k+1];
- langs[k+1] = tmp;
- k++;
- }
-
- for (i = 0; i < j; i++) {
- CString tmp;
- tmp.Format(IDS_RL_LANG, i);
-
- theApp.WriteProfileString(ResStr(IDS_R_PREFLANGS), tmp, langs[i]);
- }
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ CString langs[MAXPREFLANGS + 1];
+
+ int i = 0, j = 0, k = -1;
+ for (; i < MAXPREFLANGS; i++) {
+ CString tmp;
+ tmp.Format(IDS_RL_LANG, i);
+
+ langs[j] = theApp.GetProfileString(ResStr(IDS_R_PREFLANGS), tmp);
+
+ if (!langs[j].IsEmpty()) {
+ if (!langs[j].CompareNoCase(l)) {
+ k = j;
+ }
+ j++;
+ }
+ }
+
+ if (k == -1) {
+ langs[k = j] = l;
+ j++;
+ }
+
+ // move the selected to the top of the list
+
+ while (k > 0) {
+ CString tmp = langs[k];
+ langs[k] = langs[k - 1];
+ langs[k - 1] = tmp;
+ k--;
+ }
+
+ // move "Hide subtitles" to the last position if it wasn't our selection
+
+ CString hidesubs;
+ hidesubs.LoadString(IDS_M_HIDESUBTITLES);
+
+ for (k = 1; k < j; k++) {
+ if (!langs[k].CompareNoCase(hidesubs)) {
+ break;
+ }
+ }
+
+ while (k < j - 1) {
+ CString tmp = langs[k];
+ langs[k] = langs[k + 1];
+ langs[k + 1] = tmp;
+ k++;
+ }
+
+ for (i = 0; i < j; i++) {
+ CString tmp;
+ tmp.Format(IDS_RL_LANG, i);
+
+ theApp.WriteProfileString(ResStr(IDS_R_PREFLANGS), tmp, langs[i]);
+ }
}
STDMETHODIMP CDirectVobSubFilter::Enable(long lIndex, DWORD dwFlags)
{
- if (!(dwFlags & AMSTREAMSELECTENABLE_ENABLE)) {
- return E_NOTIMPL;
- }
-
- int nLangs = 0;
- get_LanguageCount(&nLangs);
-
- if (!(lIndex >= 0 && lIndex < nLangs+2+2)) {
- return E_INVALIDARG;
- }
-
- int i = lIndex-1;
-
- if (i == -1 && !m_fLoading) { // we need this because when loading something stupid media player pushes the first stream it founds, which is "enable" in our case
- put_HideSubtitles(false);
- } else if (i >= 0 && i < nLangs) {
- put_HideSubtitles(false);
- put_SelectedLanguage(i);
-
- WCHAR* pName = NULL;
- if (SUCCEEDED(get_LanguageName(i, &pName))) {
- UpdatePreferedLanguages(CString(pName));
- if (pName) {
- CoTaskMemFree(pName);
- }
- }
- } else if (i == nLangs && !m_fLoading) {
- put_HideSubtitles(true);
- } else if ((i == nLangs+1 || i == nLangs+2) && !m_fLoading) {
- put_Flip(i == nLangs+2, m_fFlipSubtitles);
- }
-
- return S_OK;
+ if (!(dwFlags & AMSTREAMSELECTENABLE_ENABLE)) {
+ return E_NOTIMPL;
+ }
+
+ int nLangs = 0;
+ get_LanguageCount(&nLangs);
+
+ if (!(lIndex >= 0 && lIndex < nLangs + 2 + 2)) {
+ return E_INVALIDARG;
+ }
+
+ int i = lIndex - 1;
+
+ if (i == -1 && !m_fLoading) { // we need this because when loading something stupid media player pushes the first stream it founds, which is "enable" in our case
+ put_HideSubtitles(false);
+ } else if (i >= 0 && i < nLangs) {
+ put_HideSubtitles(false);
+ put_SelectedLanguage(i);
+
+ WCHAR* pName = NULL;
+ if (SUCCEEDED(get_LanguageName(i, &pName))) {
+ UpdatePreferedLanguages(CString(pName));
+ if (pName) {
+ CoTaskMemFree(pName);
+ }
+ }
+ } else if (i == nLangs && !m_fLoading) {
+ put_HideSubtitles(true);
+ } else if ((i == nLangs + 1 || i == nLangs + 2) && !m_fLoading) {
+ put_Flip(i == nLangs + 2, m_fFlipSubtitles);
+ }
+
+ return S_OK;
}
STDMETHODIMP CDirectVobSubFilter::Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD* pdwFlags, LCID* plcid, DWORD* pdwGroup, WCHAR** ppszName, IUnknown** ppObject, IUnknown** ppUnk)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- int nLangs = 0;
- get_LanguageCount(&nLangs);
-
- if (!(lIndex >= 0 && lIndex < nLangs+2+2)) {
- return E_INVALIDARG;
- }
-
- int i = lIndex-1;
-
- if (ppmt) {
- *ppmt = CreateMediaType(&m_pInput->CurrentMediaType());
- }
-
- if (pdwFlags) {
- *pdwFlags = 0;
-
- if (i == -1 && !m_fHideSubtitles
- || i >= 0 && i < nLangs && i == m_iSelectedLanguage
- || i == nLangs && m_fHideSubtitles
- || i == nLangs+1 && !m_fFlipPicture
- || i == nLangs+2 && m_fFlipPicture) {
- *pdwFlags |= AMSTREAMSELECTINFO_ENABLED;
- }
- }
-
- if (plcid) {
- *plcid = 0;
- }
-
- if (pdwGroup) {
- *pdwGroup = 0x648E51;
- }
-
- if (ppszName) {
- *ppszName = NULL;
-
- CStringW str;
- if (i == -1) {
- str.LoadString(IDS_M_SHOWSUBTITLES);
- } else if (i >= 0 && i < nLangs) {
- get_LanguageName(i, ppszName);
- } else if (i == nLangs) {
- str.LoadString(IDS_M_HIDESUBTITLES);
- } else if (i == nLangs+1) {
- str.LoadString(IDS_M_ORIGINALPICTURE);
- if (pdwGroup) {
- (*pdwGroup)++;
- }
- } else if (i == nLangs+2) {
- str.LoadString(IDS_M_FLIPPEDPICTURE);
- if (pdwGroup) {
- (*pdwGroup)++;
- }
- }
-
- if (!str.IsEmpty()) {
- *ppszName = (WCHAR*)CoTaskMemAlloc((str.GetLength()+1)*sizeof(WCHAR));
- if (*ppszName == NULL) {
- return S_FALSE;
- }
- wcscpy_s(*ppszName, str.GetLength() + 1, str);
- }
- }
-
- if (ppObject) {
- *ppObject = NULL;
- }
-
- if (ppUnk) {
- *ppUnk = NULL;
- }
-
- return S_OK;
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ int nLangs = 0;
+ get_LanguageCount(&nLangs);
+
+ if (!(lIndex >= 0 && lIndex < nLangs + 2 + 2)) {
+ return E_INVALIDARG;
+ }
+
+ int i = lIndex - 1;
+
+ if (ppmt) {
+ *ppmt = CreateMediaType(&m_pInput->CurrentMediaType());
+ }
+
+ if (pdwFlags) {
+ *pdwFlags = 0;
+
+ if (i == -1 && !m_fHideSubtitles
+ || i >= 0 && i < nLangs && i == m_iSelectedLanguage
+ || i == nLangs && m_fHideSubtitles
+ || i == nLangs + 1 && !m_fFlipPicture
+ || i == nLangs + 2 && m_fFlipPicture) {
+ *pdwFlags |= AMSTREAMSELECTINFO_ENABLED;
+ }
+ }
+
+ if (plcid) {
+ *plcid = 0;
+ }
+
+ if (pdwGroup) {
+ *pdwGroup = 0x648E51;
+ }
+
+ if (ppszName) {
+ *ppszName = NULL;
+
+ CStringW str;
+ if (i == -1) {
+ str.LoadString(IDS_M_SHOWSUBTITLES);
+ } else if (i >= 0 && i < nLangs) {
+ get_LanguageName(i, ppszName);
+ } else if (i == nLangs) {
+ str.LoadString(IDS_M_HIDESUBTITLES);
+ } else if (i == nLangs + 1) {
+ str.LoadString(IDS_M_ORIGINALPICTURE);
+ if (pdwGroup) {
+ (*pdwGroup)++;
+ }
+ } else if (i == nLangs + 2) {
+ str.LoadString(IDS_M_FLIPPEDPICTURE);
+ if (pdwGroup) {
+ (*pdwGroup)++;
+ }
+ }
+
+ if (!str.IsEmpty()) {
+ *ppszName = (WCHAR*)CoTaskMemAlloc((str.GetLength() + 1) * sizeof(WCHAR));
+ if (*ppszName == NULL) {
+ return S_FALSE;
+ }
+ wcscpy_s(*ppszName, str.GetLength() + 1, str);
+ }
+ }
+
+ if (ppObject) {
+ *ppObject = NULL;
+ }
+
+ if (ppUnk) {
+ *ppUnk = NULL;
+ }
+
+ return S_OK;
}
STDMETHODIMP CDirectVobSubFilter::GetClassID(CLSID* pClsid)
{
- if (pClsid == NULL) {
- return E_POINTER;
- }
- *pClsid = m_clsid;
- return NOERROR;
+ if (pClsid == NULL) {
+ return E_POINTER;
+ }
+ *pClsid = m_clsid;
+ return NOERROR;
}
STDMETHODIMP CDirectVobSubFilter::GetPages(CAUUID* pPages)
{
- CheckPointer(pPages, E_POINTER);
+ CheckPointer(pPages, E_POINTER);
- pPages->cElems = 7;
- pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID)*pPages->cElems);
+ pPages->cElems = 7;
+ pPages->pElems = (GUID*)CoTaskMemAlloc(sizeof(GUID) * pPages->cElems);
- if (pPages->pElems == NULL) {
- return E_OUTOFMEMORY;
- }
+ if (pPages->pElems == NULL) {
+ return E_OUTOFMEMORY;
+ }
- int i = 0;
- pPages->pElems[i++] = __uuidof(CDVSMainPPage);
- pPages->pElems[i++] = __uuidof(CDVSGeneralPPage);
- pPages->pElems[i++] = __uuidof(CDVSMiscPPage);
- pPages->pElems[i++] = __uuidof(CDVSTimingPPage);
- pPages->pElems[i++] = __uuidof(CDVSColorPPage);
- pPages->pElems[i++] = __uuidof(CDVSPathsPPage);
- pPages->pElems[i++] = __uuidof(CDVSAboutPPage);
+ int i = 0;
+ pPages->pElems[i++] = __uuidof(CDVSMainPPage);
+ pPages->pElems[i++] = __uuidof(CDVSGeneralPPage);
+ pPages->pElems[i++] = __uuidof(CDVSMiscPPage);
+ pPages->pElems[i++] = __uuidof(CDVSTimingPPage);
+ pPages->pElems[i++] = __uuidof(CDVSColorPPage);
+ pPages->pElems[i++] = __uuidof(CDVSPathsPPage);
+ pPages->pElems[i++] = __uuidof(CDVSAboutPPage);
- return NOERROR;
+ return NOERROR;
}
// IDirectVobSub
STDMETHODIMP CDirectVobSubFilter::put_FileName(WCHAR* fn)
{
- HRESULT hr = CDirectVobSub::put_FileName(fn);
+ HRESULT hr = CDirectVobSub::put_FileName(fn);
- if (hr == S_OK && !Open()) {
- m_FileName.Empty();
- hr = E_FAIL;
- }
+ if (hr == S_OK && !Open()) {
+ m_FileName.Empty();
+ hr = E_FAIL;
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::get_LanguageCount(int* nLangs)
{
- HRESULT hr = CDirectVobSub::get_LanguageCount(nLangs);
+ HRESULT hr = CDirectVobSub::get_LanguageCount(nLangs);
- if (hr == NOERROR && nLangs) {
- CAutoLock cAutolock(&m_csQueueLock);
+ if (hr == NOERROR && nLangs) {
+ CAutoLock cAutolock(&m_csQueueLock);
- *nLangs = 0;
- POSITION pos = m_pSubStreams.GetHeadPosition();
- while (pos) {
- (*nLangs) += m_pSubStreams.GetNext(pos)->GetStreamCount();
- }
- }
+ *nLangs = 0;
+ POSITION pos = m_pSubStreams.GetHeadPosition();
+ while (pos) {
+ (*nLangs) += m_pSubStreams.GetNext(pos)->GetStreamCount();
+ }
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::get_LanguageName(int iLanguage, WCHAR** ppName)
{
- HRESULT hr = CDirectVobSub::get_LanguageName(iLanguage, ppName);
+ HRESULT hr = CDirectVobSub::get_LanguageName(iLanguage, ppName);
- if (!ppName) {
- return E_POINTER;
- }
+ if (!ppName) {
+ return E_POINTER;
+ }
- if (hr == NOERROR) {
- CAutoLock cAutolock(&m_csQueueLock);
+ if (hr == NOERROR) {
+ CAutoLock cAutolock(&m_csQueueLock);
- hr = E_INVALIDARG;
+ hr = E_INVALIDARG;
- int i = iLanguage;
+ int i = iLanguage;
- POSITION pos = m_pSubStreams.GetHeadPosition();
- while (i >= 0 && pos) {
- CComPtr<ISubStream> pSubStream = m_pSubStreams.GetNext(pos);
+ POSITION pos = m_pSubStreams.GetHeadPosition();
+ while (i >= 0 && pos) {
+ CComPtr<ISubStream> pSubStream = m_pSubStreams.GetNext(pos);
- if (i < pSubStream->GetStreamCount()) {
- pSubStream->GetStreamInfo(i, ppName, NULL);
- hr = NOERROR;
- break;
- }
+ if (i < pSubStream->GetStreamCount()) {
+ pSubStream->GetStreamInfo(i, ppName, NULL);
+ hr = NOERROR;
+ break;
+ }
- i -= pSubStream->GetStreamCount();
- }
- }
+ i -= pSubStream->GetStreamCount();
+ }
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::put_SelectedLanguage(int iSelected)
{
- HRESULT hr = CDirectVobSub::put_SelectedLanguage(iSelected);
+ HRESULT hr = CDirectVobSub::put_SelectedLanguage(iSelected);
- if (hr == NOERROR) {
- UpdateSubtitle(false);
- }
+ if (hr == NOERROR) {
+ UpdateSubtitle(false);
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::put_HideSubtitles(bool fHideSubtitles)
{
- HRESULT hr = CDirectVobSub::put_HideSubtitles(fHideSubtitles);
+ HRESULT hr = CDirectVobSub::put_HideSubtitles(fHideSubtitles);
- if (hr == NOERROR) {
- UpdateSubtitle(false);
- }
+ if (hr == NOERROR) {
+ UpdateSubtitle(false);
+ }
- return hr;
+ return hr;
}
// deprecated
STDMETHODIMP CDirectVobSubFilter::put_PreBuffering(bool fDoPreBuffering)
{
- HRESULT hr = CDirectVobSub::put_PreBuffering(fDoPreBuffering);
+ HRESULT hr = CDirectVobSub::put_PreBuffering(fDoPreBuffering);
- if (hr == NOERROR && m_pInput && m_pInput->IsConnected()) {
- InitSubPicQueue();
- }
+ if (hr == NOERROR && m_pInput && m_pInput->IsConnected()) {
+ InitSubPicQueue();
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::put_SubPictToBuffer(unsigned int uSubPictToBuffer)
{
- HRESULT hr = CDirectVobSub::put_SubPictToBuffer(uSubPictToBuffer);
+ HRESULT hr = CDirectVobSub::put_SubPictToBuffer(uSubPictToBuffer);
- if (hr == NOERROR && m_pInput && m_pInput->IsConnected()) {
- InitSubPicQueue();
- }
+ if (hr == NOERROR && m_pInput && m_pInput->IsConnected()) {
+ InitSubPicQueue();
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::put_AnimWhenBuffering(bool fAnimWhenBuffering)
{
- HRESULT hr = CDirectVobSub::put_AnimWhenBuffering(fAnimWhenBuffering);
+ HRESULT hr = CDirectVobSub::put_AnimWhenBuffering(fAnimWhenBuffering);
- if (hr == NOERROR && m_pInput && m_pInput->IsConnected()) {
- InitSubPicQueue();
- }
+ if (hr == NOERROR && m_pInput && m_pInput->IsConnected()) {
+ InitSubPicQueue();
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::put_Placement(bool fOverridePlacement, int xperc, int yperc)
{
- HRESULT hr = CDirectVobSub::put_Placement(fOverridePlacement, xperc, yperc);
+ HRESULT hr = CDirectVobSub::put_Placement(fOverridePlacement, xperc, yperc);
- if (hr == NOERROR) {
- UpdateSubtitle(true);
- }
+ if (hr == NOERROR) {
+ UpdateSubtitle(true);
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::put_VobSubSettings(bool fBuffer, bool fOnlyShowForcedSubs, bool fReserved)
{
- HRESULT hr = CDirectVobSub::put_VobSubSettings(fBuffer, fOnlyShowForcedSubs, fReserved);
+ HRESULT hr = CDirectVobSub::put_VobSubSettings(fBuffer, fOnlyShowForcedSubs, fReserved);
- if (hr == NOERROR) {
- // UpdateSubtitle(false);
- InvalidateSubtitle();
- }
+ if (hr == NOERROR) {
+ // UpdateSubtitle(false);
+ InvalidateSubtitle();
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::put_TextSettings(void* lf, int lflen, COLORREF color, bool fShadow, bool fOutline, bool fAdvancedRenderer)
{
- HRESULT hr = CDirectVobSub::put_TextSettings(lf, lflen, color, fShadow, fOutline, fAdvancedRenderer);
+ HRESULT hr = CDirectVobSub::put_TextSettings(lf, lflen, color, fShadow, fOutline, fAdvancedRenderer);
- if (hr == NOERROR) {
- // UpdateSubtitle(true);
- InvalidateSubtitle();
- }
+ if (hr == NOERROR) {
+ // UpdateSubtitle(true);
+ InvalidateSubtitle();
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::put_SubtitleTiming(int delay, int speedmul, int speeddiv)
{
- HRESULT hr = CDirectVobSub::put_SubtitleTiming(delay, speedmul, speeddiv);
+ HRESULT hr = CDirectVobSub::put_SubtitleTiming(delay, speedmul, speeddiv);
- if (hr == NOERROR) {
- InvalidateSubtitle();
- }
+ if (hr == NOERROR) {
+ InvalidateSubtitle();
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::get_MediaFPS(bool* fEnabled, double* fps)
{
- HRESULT hr = CDirectVobSub::get_MediaFPS(fEnabled, fps);
-
- CComQIPtr<IMediaSeeking> pMS = m_pGraph;
- double rate;
- if (pMS && SUCCEEDED(pMS->GetRate(&rate))) {
- m_MediaFPS = rate * m_fps;
- if (fps) {
- *fps = m_MediaFPS;
- }
- }
-
- return hr;
+ HRESULT hr = CDirectVobSub::get_MediaFPS(fEnabled, fps);
+
+ CComQIPtr<IMediaSeeking> pMS = m_pGraph;
+ double rate;
+ if (pMS && SUCCEEDED(pMS->GetRate(&rate))) {
+ m_MediaFPS = rate * m_fps;
+ if (fps) {
+ *fps = m_MediaFPS;
+ }
+ }
+
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::put_MediaFPS(bool fEnabled, double fps)
{
- HRESULT hr = CDirectVobSub::put_MediaFPS(fEnabled, fps);
+ HRESULT hr = CDirectVobSub::put_MediaFPS(fEnabled, fps);
- CComQIPtr<IMediaSeeking> pMS = m_pGraph;
- if (pMS) {
- if (hr == NOERROR) {
- hr = pMS->SetRate(m_fMediaFPSEnabled ? m_MediaFPS / m_fps : 1.0);
- }
+ CComQIPtr<IMediaSeeking> pMS = m_pGraph;
+ if (pMS) {
+ if (hr == NOERROR) {
+ hr = pMS->SetRate(m_fMediaFPSEnabled ? m_MediaFPS / m_fps : 1.0);
+ }
- double dRate;
- if (SUCCEEDED(pMS->GetRate(&dRate))) {
- m_MediaFPS = dRate * m_fps;
- }
- }
+ double dRate;
+ if (SUCCEEDED(pMS->GetRate(&dRate))) {
+ m_MediaFPS = dRate * m_fps;
+ }
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::get_ZoomRect(NORMALIZEDRECT* rect)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
STDMETHODIMP CDirectVobSubFilter::put_ZoomRect(NORMALIZEDRECT* rect)
{
- return E_NOTIMPL;
+ return E_NOTIMPL;
}
// IDirectVobSub2
STDMETHODIMP CDirectVobSubFilter::put_TextSettings(STSStyle* pDefStyle)
{
- HRESULT hr = CDirectVobSub::put_TextSettings(pDefStyle);
+ HRESULT hr = CDirectVobSub::put_TextSettings(pDefStyle);
- if (hr == NOERROR) {
- UpdateSubtitle(true);
- }
+ if (hr == NOERROR) {
+ UpdateSubtitle(true);
+ }
- return hr;
+ return hr;
}
STDMETHODIMP CDirectVobSubFilter::put_AspectRatioSettings(CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType)
{
- HRESULT hr = CDirectVobSub::put_AspectRatioSettings(ePARCompensationType);
+ HRESULT hr = CDirectVobSub::put_AspectRatioSettings(ePARCompensationType);
- if (hr == NOERROR) {
- UpdateSubtitle(true);
- }
+ if (hr == NOERROR) {
+ UpdateSubtitle(true);
+ }
- return hr;
+ return hr;
}
// IDirectVobSubFilterColor
STDMETHODIMP CDirectVobSubFilter::HasConfigDialog(int iSelected)
{
- int nLangs;
- if (FAILED(get_LanguageCount(&nLangs))) {
- return E_FAIL;
- }
- return E_FAIL;
- // TODO: temporally disabled since we don't have a new textsub/vobsub editor dlg for dvs yet
- // return (nLangs >= 0 && iSelected < nLangs ? S_OK : E_FAIL);
+ int nLangs;
+ if (FAILED(get_LanguageCount(&nLangs))) {
+ return E_FAIL;
+ }
+ return E_FAIL;
+ // TODO: temporally disabled since we don't have a new textsub/vobsub editor dlg for dvs yet
+ // return (nLangs >= 0 && iSelected < nLangs ? S_OK : E_FAIL);
}
STDMETHODIMP CDirectVobSubFilter::ShowConfigDialog(int iSelected, HWND hWndParent)
{
- // TODO: temporally disabled since we don't have a new textsub/vobsub editor dlg for dvs yet
- return E_FAIL;
+ // TODO: temporally disabled since we don't have a new textsub/vobsub editor dlg for dvs yet
+ return E_FAIL;
}
///////////////////////////////////////////////////////////////////////////
CDirectVobSubFilter2::CDirectVobSubFilter2(LPUNKNOWN punk, HRESULT* phr, const GUID& clsid) :
- CDirectVobSubFilter(punk, phr, clsid)
+ CDirectVobSubFilter(punk, phr, clsid)
{
}
HRESULT CDirectVobSubFilter2::CheckConnect(PIN_DIRECTION dir, IPin* pPin)
{
- CPinInfo pi;
- if (FAILED(pPin->QueryPinInfo(&pi))) {
- return E_FAIL;
- }
-
- if (CComQIPtr<IDirectVobSub>(pi.pFilter)) {
- return E_FAIL;
- }
-
- if (dir == PINDIR_INPUT) {
- CFilterInfo fi;
- if (SUCCEEDED(pi.pFilter->QueryFilterInfo(&fi))
- && !_wcsnicmp(fi.achName, L"Overlay Mixer", 13)) {
- return E_FAIL;
- }
- } else {
- }
-
- return __super::CheckConnect(dir, pPin);
+ CPinInfo pi;
+ if (FAILED(pPin->QueryPinInfo(&pi))) {
+ return E_FAIL;
+ }
+
+ if (CComQIPtr<IDirectVobSub>(pi.pFilter)) {
+ return E_FAIL;
+ }
+
+ if (dir == PINDIR_INPUT) {
+ CFilterInfo fi;
+ if (SUCCEEDED(pi.pFilter->QueryFilterInfo(&fi))
+ && !_wcsnicmp(fi.achName, L"Overlay Mixer", 13)) {
+ return E_FAIL;
+ }
+ } else {
+ }
+
+ return __super::CheckConnect(dir, pPin);
}
HRESULT CDirectVobSubFilter2::JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName)
{
- if (pGraph) {
- BeginEnumFilters(pGraph, pEF, pBF) {
- if (pBF != (IBaseFilter*)this && CComQIPtr<IDirectVobSub>(pBF)) {
- return E_FAIL;
- }
- }
- EndEnumFilters
-
- // don't look... we will do some serious graph hacking again...
- //
- // we will add dvs2 to the filter graph cache
- // - if the main app has already added some kind of renderer or overlay mixer (anything which accepts video on its input)
- // and
- // - if we have a reason to auto-load (we don't want to make any trouble when there is no need :)
- //
- // This whole workaround is needed because the video stream will always be connected
- // to the pre-added filters first, no matter how high merit we have.
-
- if (!get_Forced()) {
- BeginEnumFilters(pGraph, pEF, pBF) {
- if (CComQIPtr<IDirectVobSub>(pBF)) {
- continue;
- }
-
- CComPtr<IPin> pInPin = GetFirstPin(pBF, PINDIR_INPUT);
- CComPtr<IPin> pOutPin = GetFirstPin(pBF, PINDIR_OUTPUT);
-
- if (!pInPin) {
- continue;
- }
-
- CComPtr<IPin> pPin;
- if (pInPin && SUCCEEDED(pInPin->ConnectedTo(&pPin))
- || pOutPin && SUCCEEDED(pOutPin->ConnectedTo(&pPin))) {
- continue;
- }
-
- if (pOutPin && GetFilterName(pBF) == _T("Overlay Mixer")) {
- continue;
- }
-
- bool fVideoInputPin = false;
-
- do {
- BITMAPINFOHEADER bih = {sizeof(BITMAPINFOHEADER), 384, 288, 1, 16, '2YUY', 384*288*2, 0, 0, 0, 0};
-
- CMediaType cmt;
- cmt.majortype = MEDIATYPE_Video;
- cmt.subtype = MEDIASUBTYPE_YUY2;
- cmt.formattype = FORMAT_VideoInfo;
- cmt.pUnk = NULL;
- cmt.bFixedSizeSamples = TRUE;
- cmt.bTemporalCompression = TRUE;
- cmt.lSampleSize = 384*288*2;
- VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)cmt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
- memset(vih, 0, sizeof(VIDEOINFOHEADER));
- memcpy(&vih->bmiHeader, &bih, sizeof(bih));
- vih->AvgTimePerFrame = 400000;
-
- if (SUCCEEDED(pInPin->QueryAccept(&cmt))) {
- fVideoInputPin = true;
- break;
- }
-
- VIDEOINFOHEADER2* vih2 = (VIDEOINFOHEADER2*)cmt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER2));
- memset(vih2, 0, sizeof(VIDEOINFOHEADER2));
- memcpy(&vih2->bmiHeader, &bih, sizeof(bih));
- vih2->AvgTimePerFrame = 400000;
- vih2->dwPictAspectRatioX = 384;
- vih2->dwPictAspectRatioY = 288;
-
- if (SUCCEEDED(pInPin->QueryAccept(&cmt))) {
- fVideoInputPin = true;
- break;
- }
- } while (false);
-
- if (fVideoInputPin) {
- CComPtr<IBaseFilter> pDVS;
- if (ShouldWeAutoload(pGraph) && SUCCEEDED(pDVS.CoCreateInstance(__uuidof(CDirectVobSubFilter2)))) {
- CComQIPtr<IDirectVobSub2>(pDVS)->put_Forced(true);
- CComQIPtr<IGraphConfig>(pGraph)->AddFilterToCache(pDVS);
- }
-
- break;
- }
- }
- EndEnumFilters
- }
- } else {
- }
-
- return __super::JoinFilterGraph(pGraph, pName);
+ if (pGraph) {
+ BeginEnumFilters(pGraph, pEF, pBF) {
+ if (pBF != (IBaseFilter*)this && CComQIPtr<IDirectVobSub>(pBF)) {
+ return E_FAIL;
+ }
+ }
+ EndEnumFilters
+
+ // don't look... we will do some serious graph hacking again...
+ //
+ // we will add dvs2 to the filter graph cache
+ // - if the main app has already added some kind of renderer or overlay mixer (anything which accepts video on its input)
+ // and
+ // - if we have a reason to auto-load (we don't want to make any trouble when there is no need :)
+ //
+ // This whole workaround is needed because the video stream will always be connected
+ // to the pre-added filters first, no matter how high merit we have.
+
+ if (!get_Forced()) {
+ BeginEnumFilters(pGraph, pEF, pBF) {
+ if (CComQIPtr<IDirectVobSub>(pBF)) {
+ continue;
+ }
+
+ CComPtr<IPin> pInPin = GetFirstPin(pBF, PINDIR_INPUT);
+ CComPtr<IPin> pOutPin = GetFirstPin(pBF, PINDIR_OUTPUT);
+
+ if (!pInPin) {
+ continue;
+ }
+
+ CComPtr<IPin> pPin;
+ if (pInPin && SUCCEEDED(pInPin->ConnectedTo(&pPin))
+ || pOutPin && SUCCEEDED(pOutPin->ConnectedTo(&pPin))) {
+ continue;
+ }
+
+ if (pOutPin && GetFilterName(pBF) == _T("Overlay Mixer")) {
+ continue;
+ }
+
+ bool fVideoInputPin = false;
+
+ do {
+ BITMAPINFOHEADER bih = {sizeof(BITMAPINFOHEADER), 384, 288, 1, 16, '2YUY', 384 * 288 * 2, 0, 0, 0, 0};
+
+ CMediaType cmt;
+ cmt.majortype = MEDIATYPE_Video;
+ cmt.subtype = MEDIASUBTYPE_YUY2;
+ cmt.formattype = FORMAT_VideoInfo;
+ cmt.pUnk = NULL;
+ cmt.bFixedSizeSamples = TRUE;
+ cmt.bTemporalCompression = TRUE;
+ cmt.lSampleSize = 384 * 288 * 2;
+ VIDEOINFOHEADER* vih = (VIDEOINFOHEADER*)cmt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER));
+ memset(vih, 0, sizeof(VIDEOINFOHEADER));
+ memcpy(&vih->bmiHeader, &bih, sizeof(bih));
+ vih->AvgTimePerFrame = 400000;
+
+ if (SUCCEEDED(pInPin->QueryAccept(&cmt))) {
+ fVideoInputPin = true;
+ break;
+ }
+
+ VIDEOINFOHEADER2* vih2 = (VIDEOINFOHEADER2*)cmt.AllocFormatBuffer(sizeof(VIDEOINFOHEADER2));
+ memset(vih2, 0, sizeof(VIDEOINFOHEADER2));
+ memcpy(&vih2->bmiHeader, &bih, sizeof(bih));
+ vih2->AvgTimePerFrame = 400000;
+ vih2->dwPictAspectRatioX = 384;
+ vih2->dwPictAspectRatioY = 288;
+
+ if (SUCCEEDED(pInPin->QueryAccept(&cmt))) {
+ fVideoInputPin = true;
+ break;
+ }
+ } while (false);
+
+ if (fVideoInputPin) {
+ CComPtr<IBaseFilter> pDVS;
+ if (ShouldWeAutoload(pGraph) && SUCCEEDED(pDVS.CoCreateInstance(__uuidof(CDirectVobSubFilter2)))) {
+ CComQIPtr<IDirectVobSub2>(pDVS)->put_Forced(true);
+ CComQIPtr<IGraphConfig>(pGraph)->AddFilterToCache(pDVS);
+ }
+
+ break;
+ }
+ }
+ EndEnumFilters
+ }
+ } else {
+ }
+
+ return __super::JoinFilterGraph(pGraph, pName);
}
HRESULT CDirectVobSubFilter2::CheckInputType(const CMediaType* mtIn)
{
- HRESULT hr = __super::CheckInputType(mtIn);
+ HRESULT hr = __super::CheckInputType(mtIn);
- if (FAILED(hr) || m_pInput->IsConnected()) {
- return hr;
- }
+ if (FAILED(hr) || m_pInput->IsConnected()) {
+ return hr;
+ }
- if (!ShouldWeAutoload(m_pGraph)) {
- return VFW_E_TYPE_NOT_ACCEPTED;
- }
+ if (!ShouldWeAutoload(m_pGraph)) {
+ return VFW_E_TYPE_NOT_ACCEPTED;
+ }
- GetRidOfInternalScriptRenderer();
+ GetRidOfInternalScriptRenderer();
- return NOERROR;
+ return NOERROR;
}
bool CDirectVobSubFilter2::ShouldWeAutoload(IFilterGraph* pGraph)
{
- TCHAR blacklistedapps[][32] = {
- _T("WM8EUTIL."), // wmp8 encoder's dummy renderer releases the outputted media sample after calling Receive on its input pin (yes, even when dvobsub isn't registered at all)
- _T("explorer."), // as some users reported thumbnail preview loads dvobsub, I've never experienced this yet...
- _T("producer."), // this is real's producer
- _T("GoogleDesktopIndex."), // Google Desktop
- _T("GoogleDesktopDisplay."), // Google Desktop
- _T("GoogleDesktopCrawl."), // Google Desktop
- };
-
- for (ptrdiff_t i = 0; i < _countof(blacklistedapps); i++) {
- if (theApp.m_AppName.Find(blacklistedapps[i]) >= 0) {
- return false;
- }
- }
-
- int level;
- bool m_fExternalLoad, m_fWebLoad, m_fEmbeddedLoad;
- get_LoadSettings(&level, &m_fExternalLoad, &m_fWebLoad, &m_fEmbeddedLoad);
-
- if (level < 0 || level >= 2) {
- return false;
- }
-
- bool fRet = false;
-
- if (level == 1) {
- fRet = m_fExternalLoad = m_fWebLoad = m_fEmbeddedLoad = true;
- }
-
- // find text stream on known splitters
-
- if (!fRet && m_fEmbeddedLoad) {
- CComPtr<IBaseFilter> pBF;
- if ((pBF = FindFilter(CLSID_OggSplitter, pGraph)) || (pBF = FindFilter(CLSID_AviSplitter, pGraph))
- || (pBF = FindFilter(L"{34293064-02F2-41D5-9D75-CC5967ACA1AB}", pGraph)) // matroska demux
- || (pBF = FindFilter(L"{0A68C3B5-9164-4a54-AFAF-995B2FF0E0D4}", pGraph)) // matroska source
- || (pBF = FindFilter(L"{149D2E01-C32E-4939-80F6-C07B81015A7A}", pGraph)) // matroska splitter
- || (pBF = FindFilter(L"{55DA30FC-F16B-49fc-BAA5-AE59FC65F82D}", pGraph)) // Haali's matroska splitter
- || (pBF = FindFilter(L"{564FD788-86C9-4444-971E-CC4A243DA150}", pGraph)) // Haali's matroska splitter (AR)
- || (pBF = FindFilter(L"{171252A0-8820-4AFE-9DF8-5C92B2D66B04}", pGraph)) // LAV Splitter
- || (pBF = FindFilter(L"{B98D13E7-55DB-4385-A33D-09FD1BA26338}", pGraph)) // LAV Splitter Source
- || (pBF = FindFilter(L"{E436EBB5-524F-11CE-9F53-0020AF0BA770}", pGraph)) // Solveig matroska splitter
- || (pBF = FindFilter(L"{52B63861-DC93-11CE-A099-00AA00479A58}", pGraph)) // 3ivx splitter
- || (pBF = FindFilter(L"{6D3688CE-3E9D-42F4-92CA-8A11119D25CD}", pGraph)) // our ogg source
- || (pBF = FindFilter(L"{9FF48807-E133-40AA-826F-9B2959E5232D}", pGraph)) // our ogg splitter
- || (pBF = FindFilter(L"{803E8280-F3CE-4201-982C-8CD8FB512004}", pGraph)) // dsm source
- || (pBF = FindFilter(L"{0912B4DD-A30A-4568-B590-7179EBB420EC}", pGraph)) // dsm splitter
- || (pBF = FindFilter(L"{3CCC052E-BDEE-408a-BEA7-90914EF2964B}", pGraph)) // mp4 source
- || (pBF = FindFilter(L"{61F47056-E400-43d3-AF1E-AB7DFFD4C4AD}", pGraph))) { // mp4 splitter
- BeginEnumPins(pBF, pEP, pPin) {
- BeginEnumMediaTypes(pPin, pEM, pmt) {
- if (pmt->majortype == MEDIATYPE_Text || pmt->majortype == MEDIATYPE_Subtitle) {
- fRet = true;
- break;
- }
- }
- EndEnumMediaTypes(pmt)
- if (fRet) {
- break;
- }
- }
- EndEnumFilters
- }
- }
-
- // find file name
-
- CStringW fn;
-
- BeginEnumFilters(pGraph, pEF, pBF) {
- if (CComQIPtr<IFileSourceFilter> pFSF = pBF) {
- LPOLESTR fnw = NULL;
- if (!pFSF || FAILED(pFSF->GetCurFile(&fnw, NULL)) || !fnw) {
- continue;
- }
- fn = CString(fnw);
- CoTaskMemFree(fnw);
- break;
- }
- }
- EndEnumFilters
-
- if ((m_fExternalLoad || m_fWebLoad) && (m_fWebLoad || !(wcsstr(fn, L"http://") || wcsstr(fn, L"mms://")))) {
- bool fTemp = m_fHideSubtitles;
- fRet = !fn.IsEmpty() && SUCCEEDED(put_FileName((LPWSTR)(LPCWSTR)fn))
- || SUCCEEDED(put_FileName(L"c:\\tmp.srt"))
- || fRet;
- if (fTemp) {
- m_fHideSubtitles = true;
- }
- }
-
- return fRet;
+ TCHAR blacklistedapps[][32] = {
+ _T("WM8EUTIL."), // wmp8 encoder's dummy renderer releases the outputted media sample after calling Receive on its input pin (yes, even when dvobsub isn't registered at all)
+ _T("explorer."), // as some users reported thumbnail preview loads dvobsub, I've never experienced this yet...
+ _T("producer."), // this is real's producer
+ _T("GoogleDesktopIndex."), // Google Desktop
+ _T("GoogleDesktopDisplay."), // Google Desktop
+ _T("GoogleDesktopCrawl."), // Google Desktop
+ };
+
+ for (ptrdiff_t i = 0; i < _countof(blacklistedapps); i++) {
+ if (theApp.m_AppName.Find(blacklistedapps[i]) >= 0) {
+ return false;
+ }
+ }
+
+ int level;
+ bool m_fExternalLoad, m_fWebLoad, m_fEmbeddedLoad;
+ get_LoadSettings(&level, &m_fExternalLoad, &m_fWebLoad, &m_fEmbeddedLoad);
+
+ if (level < 0 || level >= 2) {
+ return false;
+ }
+
+ bool fRet = false;
+
+ if (level == 1) {
+ fRet = m_fExternalLoad = m_fWebLoad = m_fEmbeddedLoad = true;
+ }
+
+ // find text stream on known splitters
+
+ if (!fRet && m_fEmbeddedLoad) {
+ CComPtr<IBaseFilter> pBF;
+ if ((pBF = FindFilter(CLSID_OggSplitter, pGraph)) || (pBF = FindFilter(CLSID_AviSplitter, pGraph))
+ || (pBF = FindFilter(L"{34293064-02F2-41D5-9D75-CC5967ACA1AB}", pGraph)) // matroska demux
+ || (pBF = FindFilter(L"{0A68C3B5-9164-4a54-AFAF-995B2FF0E0D4}", pGraph)) // matroska source
+ || (pBF = FindFilter(L"{149D2E01-C32E-4939-80F6-C07B81015A7A}", pGraph)) // matroska splitter
+ || (pBF = FindFilter(L"{55DA30FC-F16B-49fc-BAA5-AE59FC65F82D}", pGraph)) // Haali's matroska splitter
+ || (pBF = FindFilter(L"{564FD788-86C9-4444-971E-CC4A243DA150}", pGraph)) // Haali's matroska splitter (AR)
+ || (pBF = FindFilter(L"{171252A0-8820-4AFE-9DF8-5C92B2D66B04}", pGraph)) // LAV Splitter
+ || (pBF = FindFilter(L"{B98D13E7-55DB-4385-A33D-09FD1BA26338}", pGraph)) // LAV Splitter Source
+ || (pBF = FindFilter(L"{E436EBB5-524F-11CE-9F53-0020AF0BA770}", pGraph)) // Solveig matroska splitter
+ || (pBF = FindFilter(L"{52B63861-DC93-11CE-A099-00AA00479A58}", pGraph)) // 3ivx splitter
+ || (pBF = FindFilter(L"{6D3688CE-3E9D-42F4-92CA-8A11119D25CD}", pGraph)) // our ogg source
+ || (pBF = FindFilter(L"{9FF48807-E133-40AA-826F-9B2959E5232D}", pGraph)) // our ogg splitter
+ || (pBF = FindFilter(L"{803E8280-F3CE-4201-982C-8CD8FB512004}", pGraph)) // dsm source
+ || (pBF = FindFilter(L"{0912B4DD-A30A-4568-B590-7179EBB420EC}", pGraph)) // dsm splitter
+ || (pBF = FindFilter(L"{3CCC052E-BDEE-408a-BEA7-90914EF2964B}", pGraph)) // mp4 source
+ || (pBF = FindFilter(L"{61F47056-E400-43d3-AF1E-AB7DFFD4C4AD}", pGraph))) { // mp4 splitter
+ BeginEnumPins(pBF, pEP, pPin) {
+ BeginEnumMediaTypes(pPin, pEM, pmt) {
+ if (pmt->majortype == MEDIATYPE_Text || pmt->majortype == MEDIATYPE_Subtitle) {
+ fRet = true;
+ break;
+ }
+ }
+ EndEnumMediaTypes(pmt)
+ if (fRet) {
+ break;
+ }
+ }
+ EndEnumFilters
+ }
+ }
+
+ // find file name
+
+ CStringW fn;
+
+ BeginEnumFilters(pGraph, pEF, pBF) {
+ if (CComQIPtr<IFileSourceFilter> pFSF = pBF) {
+ LPOLESTR fnw = NULL;
+ if (!pFSF || FAILED(pFSF->GetCurFile(&fnw, NULL)) || !fnw) {
+ continue;
+ }
+ fn = CString(fnw);
+ CoTaskMemFree(fnw);
+ break;
+ }
+ }
+ EndEnumFilters
+
+ if ((m_fExternalLoad || m_fWebLoad) && (m_fWebLoad || !(wcsstr(fn, L"http://") || wcsstr(fn, L"mms://")))) {
+ bool fTemp = m_fHideSubtitles;
+ fRet = !fn.IsEmpty() && SUCCEEDED(put_FileName((LPWSTR)(LPCWSTR)fn))
+ || SUCCEEDED(put_FileName(L"c:\\tmp.srt"))
+ || fRet;
+ if (fTemp) {
+ m_fHideSubtitles = true;
+ }
+ }
+
+ return fRet;
}
void CDirectVobSubFilter2::GetRidOfInternalScriptRenderer()
{
- while (CComPtr<IBaseFilter> pBF = FindFilter(L"{48025243-2D39-11CE-875D-00608CB78066}", m_pGraph)) {
- BeginEnumPins(pBF, pEP, pPin) {
- PIN_DIRECTION dir;
- CComPtr<IPin> pPinTo;
-
- if (SUCCEEDED(pPin->QueryDirection(&dir)) && dir == PINDIR_INPUT
- && SUCCEEDED(pPin->ConnectedTo(&pPinTo))) {
- m_pGraph->Disconnect(pPinTo);
- m_pGraph->Disconnect(pPin);
- m_pGraph->ConnectDirect(pPinTo, GetPin(2 + m_pTextInput.GetCount()-1), NULL);
- }
- }
- EndEnumPins
-
- if (FAILED(m_pGraph->RemoveFilter(pBF))) {
- break;
- }
- }
+ while (CComPtr<IBaseFilter> pBF = FindFilter(L"{48025243-2D39-11CE-875D-00608CB78066}", m_pGraph)) {
+ BeginEnumPins(pBF, pEP, pPin) {
+ PIN_DIRECTION dir;
+ CComPtr<IPin> pPinTo;
+
+ if (SUCCEEDED(pPin->QueryDirection(&dir)) && dir == PINDIR_INPUT
+ && SUCCEEDED(pPin->ConnectedTo(&pPinTo))) {
+ m_pGraph->Disconnect(pPinTo);
+ m_pGraph->Disconnect(pPin);
+ m_pGraph->ConnectDirect(pPinTo, GetPin(2 + m_pTextInput.GetCount() - 1), NULL);
+ }
+ }
+ EndEnumPins
+
+ if (FAILED(m_pGraph->RemoveFilter(pBF))) {
+ break;
+ }
+ }
}
///////////////////////////////////////////////////////////////////////////////
bool CDirectVobSubFilter::Open()
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- CAutoLock cAutolock(&m_csQueueLock);
-
- m_pSubStreams.RemoveAll();
-
- m_frd.files.RemoveAll();
-
- CAtlArray<CString> paths;
-
- for (ptrdiff_t i = 0; i < 10; i++) {
- CString tmp;
- tmp.Format(IDS_RP_PATH, i);
- CString path = theApp.GetProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp);
- if (!path.IsEmpty()) {
- paths.Add(path);
- }
- }
-
- CAtlArray<SubFile> ret;
- GetSubFileNames(m_FileName, paths, ret);
-
- for (size_t i = 0; i < ret.GetCount(); i++) {
- if (m_frd.files.Find(ret[i].fn)) {
- continue;
- }
-
- CComPtr<ISubStream> pSubStream;
-
- if (!pSubStream) {
- CAutoPtr<CVobSubFile> pVSF(DNew CVobSubFile(&m_csSubLock));
- if (pVSF && pVSF->Open(ret[i].fn) && pVSF->GetStreamCount() > 0) {
- pSubStream = pVSF.Detach();
- m_frd.files.AddTail(ret[i].fn.Left(ret[i].fn.GetLength()-4) + _T(".sub"));
- }
- }
-
- if (!pSubStream) {
- CAutoPtr<CRenderedTextSubtitle> pRTS(DNew CRenderedTextSubtitle(&m_csSubLock));
- if (pRTS && pRTS->Open(ret[i].fn, DEFAULT_CHARSET) && pRTS->GetStreamCount() > 0) {
- pSubStream = pRTS.Detach();
- m_frd.files.AddTail(ret[i].fn + _T(".style"));
- }
- }
-
- if (pSubStream) {
- m_pSubStreams.AddTail(pSubStream);
- m_frd.files.AddTail(ret[i].fn);
- }
- }
-
- for (size_t i = 0; i < m_pTextInput.GetCount(); i++) {
- if (m_pTextInput[i]->IsConnected()) {
- m_pSubStreams.AddTail(m_pTextInput[i]->GetSubStream());
- }
- }
-
- if (S_FALSE == put_SelectedLanguage(FindPreferedLanguage())) {
- UpdateSubtitle(false); // make sure pSubPicProvider of our queue gets updated even if the stream number hasn't changed
- }
-
- m_frd.RefreshEvent.Set();
-
- return (m_pSubStreams.GetCount() > 0);
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ CAutoLock cAutolock(&m_csQueueLock);
+
+ m_pSubStreams.RemoveAll();
+
+ m_frd.files.RemoveAll();
+
+ CAtlArray<CString> paths;
+
+ for (ptrdiff_t i = 0; i < 10; i++) {
+ CString tmp;
+ tmp.Format(IDS_RP_PATH, i);
+ CString path = theApp.GetProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp);
+ if (!path.IsEmpty()) {
+ paths.Add(path);
+ }
+ }
+
+ CAtlArray<SubFile> ret;
+ GetSubFileNames(m_FileName, paths, ret);
+
+ for (size_t i = 0; i < ret.GetCount(); i++) {
+ if (m_frd.files.Find(ret[i].fn)) {
+ continue;
+ }
+
+ CComPtr<ISubStream> pSubStream;
+
+ if (!pSubStream) {
+ CAutoPtr<CVobSubFile> pVSF(DNew CVobSubFile(&m_csSubLock));
+ if (pVSF && pVSF->Open(ret[i].fn) && pVSF->GetStreamCount() > 0) {
+ pSubStream = pVSF.Detach();
+ m_frd.files.AddTail(ret[i].fn.Left(ret[i].fn.GetLength() - 4) + _T(".sub"));
+ }
+ }
+
+ if (!pSubStream) {
+ CAutoPtr<CRenderedTextSubtitle> pRTS(DNew CRenderedTextSubtitle(&m_csSubLock));
+ if (pRTS && pRTS->Open(ret[i].fn, DEFAULT_CHARSET) && pRTS->GetStreamCount() > 0) {
+ pSubStream = pRTS.Detach();
+ m_frd.files.AddTail(ret[i].fn + _T(".style"));
+ }
+ }
+
+ if (pSubStream) {
+ m_pSubStreams.AddTail(pSubStream);
+ m_frd.files.AddTail(ret[i].fn);
+ }
+ }
+
+ for (size_t i = 0; i < m_pTextInput.GetCount(); i++) {
+ if (m_pTextInput[i]->IsConnected()) {
+ m_pSubStreams.AddTail(m_pTextInput[i]->GetSubStream());
+ }
+ }
+
+ if (S_FALSE == put_SelectedLanguage(FindPreferedLanguage())) {
+ UpdateSubtitle(false); // make sure pSubPicProvider of our queue gets updated even if the stream number hasn't changed
+ }
+
+ m_frd.RefreshEvent.Set();
+
+ return (m_pSubStreams.GetCount() > 0);
}
void CDirectVobSubFilter::UpdateSubtitle(bool fApplyDefStyle)
{
- CAutoLock cAutolock(&m_csQueueLock);
+ CAutoLock cAutolock(&m_csQueueLock);
- if (!m_pSubPicQueue) {
- return;
- }
+ if (!m_pSubPicQueue) {
+ return;
+ }
- InvalidateSubtitle();
+ InvalidateSubtitle();
- CComPtr<ISubStream> pSubStream;
+ CComPtr<ISubStream> pSubStream;
- if (!m_fHideSubtitles) {
- int i = m_iSelectedLanguage;
+ if (!m_fHideSubtitles) {
+ int i = m_iSelectedLanguage;
- for (POSITION pos = m_pSubStreams.GetHeadPosition(); i >= 0 && pos; pSubStream = NULL) {
- pSubStream = m_pSubStreams.GetNext(pos);
+ for (POSITION pos = m_pSubStreams.GetHeadPosition(); i >= 0 && pos; pSubStream = NULL) {
+ pSubStream = m_pSubStreams.GetNext(pos);
- if (i < pSubStream->GetStreamCount()) {
- CAutoLock cAutoLock(&m_csSubLock);
- pSubStream->SetStream(i);
- break;
- }
+ if (i < pSubStream->GetStreamCount()) {
+ CAutoLock cAutoLock(&m_csSubLock);
+ pSubStream->SetStream(i);
+ break;
+ }
- i -= pSubStream->GetStreamCount();
- }
- }
+ i -= pSubStream->GetStreamCount();
+ }
+ }
- SetSubtitle(pSubStream, fApplyDefStyle);
+ SetSubtitle(pSubStream, fApplyDefStyle);
}
void CDirectVobSubFilter::SetSubtitle(ISubStream* pSubStream, bool fApplyDefStyle)
{
- CAutoLock cAutolock(&m_csQueueLock);
-
- if (pSubStream) {
- CAutoLock cAutolock(&m_csSubLock);
-
- CLSID clsid;
- pSubStream->GetClassID(&clsid);
-
- if (clsid == __uuidof(CVobSubFile)) {
- CVobSubSettings* pVSS = (CVobSubFile*)(ISubStream*)pSubStream;
-
- if (fApplyDefStyle) {
- pVSS->SetAlignment(m_fOverridePlacement, m_PlacementXperc, m_PlacementYperc, 1, 1);
- pVSS->m_fOnlyShowForcedSubs = m_fOnlyShowForcedVobSubs;
- }
- } else if (clsid == __uuidof(CVobSubStream)) {
- CVobSubSettings* pVSS = (CVobSubStream*)(ISubStream*)pSubStream;
-
- if (fApplyDefStyle) {
- pVSS->SetAlignment(m_fOverridePlacement, m_PlacementXperc, m_PlacementYperc, 1, 1);
- pVSS->m_fOnlyShowForcedSubs = m_fOnlyShowForcedVobSubs;
- }
- } else if (clsid == __uuidof(CRenderedTextSubtitle)) {
- CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)pSubStream;
-
- if (fApplyDefStyle || pRTS->m_fUsingAutoGeneratedDefaultStyle) {
- STSStyle s = m_defStyle;
-
- if (m_fOverridePlacement) {
- s.scrAlignment = 2;
- int w = pRTS->m_dstScreenSize.cx;
- int h = pRTS->m_dstScreenSize.cy;
- int mw = w - s.marginRect.left - s.marginRect.right;
- s.marginRect.bottom = h - MulDiv(h, m_PlacementYperc, 100);
- s.marginRect.left = MulDiv(w, m_PlacementXperc, 100) - mw/2;
- s.marginRect.right = w - (s.marginRect.left + mw);
- }
-
- pRTS->SetDefaultStyle(s);
- }
-
- pRTS->m_ePARCompensationType = m_ePARCompensationType;
- if (m_CurrentVIH2.dwPictAspectRatioX != 0 && m_CurrentVIH2.dwPictAspectRatioY != 0&& m_CurrentVIH2.bmiHeader.biWidth != 0 && m_CurrentVIH2.bmiHeader.biHeight != 0) {
- pRTS->m_dPARCompensation = ((double)abs(m_CurrentVIH2.bmiHeader.biWidth) / (double)abs(m_CurrentVIH2.bmiHeader.biHeight)) /
- ((double)abs((long)m_CurrentVIH2.dwPictAspectRatioX) / (double)abs((long)m_CurrentVIH2.dwPictAspectRatioY));
-
- } else {
- pRTS->m_dPARCompensation = 1.00;
- }
-
- pRTS->Deinit();
- }
- }
-
- if (!fApplyDefStyle) {
- int i = 0;
-
- POSITION pos = m_pSubStreams.GetHeadPosition();
- while (pos) {
- CComPtr<ISubStream> pSubStream2 = m_pSubStreams.GetNext(pos);
-
- if (pSubStream == pSubStream2) {
- m_iSelectedLanguage = i + pSubStream2->GetStream();
- break;
- }
-
- i += pSubStream2->GetStreamCount();
- }
- }
-
- m_nSubtitleId = (DWORD_PTR)pSubStream;
-
- if (m_pSubPicQueue) {
- m_pSubPicQueue->SetSubPicProvider(CComQIPtr<ISubPicProvider>(pSubStream));
- }
+ CAutoLock cAutolock(&m_csQueueLock);
+
+ if (pSubStream) {
+ CAutoLock cAutolock(&m_csSubLock);
+
+ CLSID clsid;
+ pSubStream->GetClassID(&clsid);
+
+ if (clsid == __uuidof(CVobSubFile)) {
+ CVobSubSettings* pVSS = (CVobSubFile*)(ISubStream*)pSubStream;
+
+ if (fApplyDefStyle) {
+ pVSS->SetAlignment(m_fOverridePlacement, m_PlacementXperc, m_PlacementYperc, 1, 1);
+ pVSS->m_fOnlyShowForcedSubs = m_fOnlyShowForcedVobSubs;
+ }
+ } else if (clsid == __uuidof(CVobSubStream)) {
+ CVobSubSettings* pVSS = (CVobSubStream*)(ISubStream*)pSubStream;
+
+ if (fApplyDefStyle) {
+ pVSS->SetAlignment(m_fOverridePlacement, m_PlacementXperc, m_PlacementYperc, 1, 1);
+ pVSS->m_fOnlyShowForcedSubs = m_fOnlyShowForcedVobSubs;
+ }
+ } else if (clsid == __uuidof(CRenderedTextSubtitle)) {
+ CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)pSubStream;
+
+ if (fApplyDefStyle || pRTS->m_fUsingAutoGeneratedDefaultStyle) {
+ STSStyle s = m_defStyle;
+
+ if (m_fOverridePlacement) {
+ s.scrAlignment = 2;
+ int w = pRTS->m_dstScreenSize.cx;
+ int h = pRTS->m_dstScreenSize.cy;
+ int mw = w - s.marginRect.left - s.marginRect.right;
+ s.marginRect.bottom = h - MulDiv(h, m_PlacementYperc, 100);
+ s.marginRect.left = MulDiv(w, m_PlacementXperc, 100) - mw / 2;
+ s.marginRect.right = w - (s.marginRect.left + mw);
+ }
+
+ pRTS->SetDefaultStyle(s);
+ }
+
+ pRTS->m_ePARCompensationType = m_ePARCompensationType;
+ if (m_CurrentVIH2.dwPictAspectRatioX != 0 && m_CurrentVIH2.dwPictAspectRatioY != 0 && m_CurrentVIH2.bmiHeader.biWidth != 0 && m_CurrentVIH2.bmiHeader.biHeight != 0) {
+ pRTS->m_dPARCompensation = ((double)abs(m_CurrentVIH2.bmiHeader.biWidth) / (double)abs(m_CurrentVIH2.bmiHeader.biHeight)) /
+ ((double)abs((long)m_CurrentVIH2.dwPictAspectRatioX) / (double)abs((long)m_CurrentVIH2.dwPictAspectRatioY));
+
+ } else {
+ pRTS->m_dPARCompensation = 1.00;
+ }
+
+ pRTS->Deinit();
+ }
+ }
+
+ if (!fApplyDefStyle) {
+ int i = 0;
+
+ POSITION pos = m_pSubStreams.GetHeadPosition();
+ while (pos) {
+ CComPtr<ISubStream> pSubStream2 = m_pSubStreams.GetNext(pos);
+
+ if (pSubStream == pSubStream2) {
+ m_iSelectedLanguage = i + pSubStream2->GetStream();
+ break;
+ }
+
+ i += pSubStream2->GetStreamCount();
+ }
+ }
+
+ m_nSubtitleId = (DWORD_PTR)pSubStream;
+
+ if (m_pSubPicQueue) {
+ m_pSubPicQueue->SetSubPicProvider(CComQIPtr<ISubPicProvider>(pSubStream));
+ }
}
void CDirectVobSubFilter::InvalidateSubtitle(REFERENCE_TIME rtInvalidate, DWORD_PTR nSubtitleId)
{
- CAutoLock cAutolock(&m_csQueueLock);
+ CAutoLock cAutolock(&m_csQueueLock);
- if (m_pSubPicQueue) {
- if (nSubtitleId == -1 || nSubtitleId == m_nSubtitleId) {
- m_pSubPicQueue->Invalidate(rtInvalidate);
- }
- }
+ if (m_pSubPicQueue) {
+ if (nSubtitleId == -1 || nSubtitleId == m_nSubtitleId) {
+ m_pSubPicQueue->Invalidate(rtInvalidate);
+ }
+ }
}
//////////////////////////////////////////////////////////////////////////////////////////
void CDirectVobSubFilter::AddSubStream(ISubStream* pSubStream)
{
- CAutoLock cAutoLock(&m_csQueueLock);
-
- POSITION pos = m_pSubStreams.Find(pSubStream);
- if (!pos) {
- m_pSubStreams.AddTail(pSubStream);
- }
-
- size_t len = m_pTextInput.GetCount();
- for (size_t i = 0; i < m_pTextInput.GetCount(); i++)
- if (m_pTextInput[i]->IsConnected()) {
- len--;
- }
-
- if (len == 0) {
- HRESULT hr = S_OK;
- m_pTextInput.Add(DNew CTextInputPin(this, m_pLock, &m_csSubLock, &hr));
- }
+ CAutoLock cAutoLock(&m_csQueueLock);
+
+ POSITION pos = m_pSubStreams.Find(pSubStream);
+ if (!pos) {
+ m_pSubStreams.AddTail(pSubStream);
+ }
+
+ size_t len = m_pTextInput.GetCount();
+ for (size_t i = 0; i < m_pTextInput.GetCount(); i++)
+ if (m_pTextInput[i]->IsConnected()) {
+ len--;
+ }
+
+ if (len == 0) {
+ HRESULT hr = S_OK;
+ m_pTextInput.Add(DNew CTextInputPin(this, m_pLock, &m_csSubLock, &hr));
+ }
}
void CDirectVobSubFilter::RemoveSubStream(ISubStream* pSubStream)
{
- CAutoLock cAutoLock(&m_csQueueLock);
+ CAutoLock cAutoLock(&m_csQueueLock);
- POSITION pos = m_pSubStreams.Find(pSubStream);
- if (pos) {
- m_pSubStreams.RemoveAt(pos);
- }
+ POSITION pos = m_pSubStreams.Find(pSubStream);
+ if (pos) {
+ m_pSubStreams.RemoveAt(pos);
+ }
}
void CDirectVobSubFilter::Post_EC_OLE_EVENT(CString str, DWORD_PTR nSubtitleId)
{
- if (nSubtitleId != -1 && nSubtitleId != m_nSubtitleId) {
- return;
- }
+ if (nSubtitleId != -1 && nSubtitleId != m_nSubtitleId) {
+ return;
+ }
- CComQIPtr<IMediaEventSink> pMES = m_pGraph;
- if (!pMES) {
- return;
- }
+ CComQIPtr<IMediaEventSink> pMES = m_pGraph;
+ if (!pMES) {
+ return;
+ }
- CComBSTR bstr1("Text"), bstr2(" ");
+ CComBSTR bstr1("Text"), bstr2(" ");
- str.Trim();
- if (!str.IsEmpty()) {
- bstr2 = CStringA(str);
- }
+ str.Trim();
+ if (!str.IsEmpty()) {
+ bstr2 = CStringA(str);
+ }
- pMES->Notify(EC_OLE_EVENT, (LONG_PTR)bstr1.Detach(), (LONG_PTR)bstr2.Detach());
+ pMES->Notify(EC_OLE_EVENT, (LONG_PTR)bstr1.Detach(), (LONG_PTR)bstr2.Detach());
}
////////////////////////////////////////////////////////////////
void CDirectVobSubFilter::SetupFRD(CStringArray& paths, CAtlArray<HANDLE>& handles)
{
- CAutoLock cAutolock(&m_csSubLock);
+ CAutoLock cAutolock(&m_csSubLock);
- for (size_t i = 2; i < handles.GetCount(); i++) {
- FindCloseChangeNotification(handles[i]);
- }
+ for (size_t i = 2; i < handles.GetCount(); i++) {
+ FindCloseChangeNotification(handles[i]);
+ }
- paths.RemoveAll();
- handles.RemoveAll();
+ paths.RemoveAll();
+ handles.RemoveAll();
- handles.Add(m_frd.EndThreadEvent);
- handles.Add(m_frd.RefreshEvent);
+ handles.Add(m_frd.EndThreadEvent);
+ handles.Add(m_frd.RefreshEvent);
- m_frd.mtime.SetCount(m_frd.files.GetCount());
+ m_frd.mtime.SetCount(m_frd.files.GetCount());
- POSITION pos = m_frd.files.GetHeadPosition();
- for (ptrdiff_t i = 0; pos; i++) {
- CString fn = m_frd.files.GetNext(pos);
+ POSITION pos = m_frd.files.GetHeadPosition();
+ for (ptrdiff_t i = 0; pos; i++) {
+ CString fn = m_frd.files.GetNext(pos);
- CFileStatus status;
- if (CFileGetStatus(fn, status)) {
- m_frd.mtime[i] = status.m_mtime;
- }
+ CFileStatus status;
+ if (CFileGetStatus(fn, status)) {
+ m_frd.mtime[i] = status.m_mtime;
+ }
- fn.Replace('\\', '/');
- fn = fn.Left(fn.ReverseFind('/')+1);
+ fn.Replace('\\', '/');
+ fn = fn.Left(fn.ReverseFind('/') + 1);
- bool fFound = false;
+ bool fFound = false;
- for (ptrdiff_t j = 0; !fFound && j < paths.GetCount(); j++) {
- if (paths[j] == fn) {
- fFound = true;
- }
- }
+ for (ptrdiff_t j = 0; !fFound && j < paths.GetCount(); j++) {
+ if (paths[j] == fn) {
+ fFound = true;
+ }
+ }
- if (!fFound) {
- paths.Add(fn);
+ if (!fFound) {
+ paths.Add(fn);
- HANDLE h = FindFirstChangeNotification(fn, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE);
- if (h != INVALID_HANDLE_VALUE) {
- handles.Add(h);
- }
- }
- }
+ HANDLE h = FindFirstChangeNotification(fn, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE);
+ if (h != INVALID_HANDLE_VALUE) {
+ handles.Add(h);
+ }
+ }
+ }
}
DWORD CDirectVobSubFilter::ThreadProc()
{
- SetThreadPriority(m_hThread, THREAD_PRIORITY_LOWEST/*THREAD_PRIORITY_BELOW_NORMAL*/);
-
- CStringArray paths;
- CAtlArray<HANDLE> handles;
-
- SetupFRD(paths, handles);
-
- for (;;) {
- DWORD idx = WaitForMultipleObjects(handles.GetCount(), handles.GetData(), FALSE, INFINITE);
-
- if (idx == (WAIT_OBJECT_0 + 0)) { // m_frd.hEndThreadEvent
- break;
- }
- if (idx == (WAIT_OBJECT_0 + 1)) { // m_frd.hRefreshEvent
- SetupFRD(paths, handles);
- } else if (idx >= (WAIT_OBJECT_0 + 2) && idx < (WAIT_OBJECT_0 + handles.GetCount())) {
- bool fLocked = true;
- IsSubtitleReloaderLocked(&fLocked);
- if (fLocked) {
- continue;
- }
-
- if (FindNextChangeNotification(handles[idx - WAIT_OBJECT_0]) == FALSE) {
- break;
- }
-
- int j = 0;
-
- POSITION pos = m_frd.files.GetHeadPosition();
- for (ptrdiff_t i = 0; pos && j == 0; i++) {
- CString fn = m_frd.files.GetNext(pos);
-
- CFileStatus status;
- if (CFileGetStatus(fn, status) && m_frd.mtime[i] != status.m_mtime) {
- for (j = 0; j < 10; j++) {
- FILE* f = NULL;
- if (!_tfopen_s(&f, fn, _T("rb+"))) {
- fclose(f);
- j = 0;
- break;
- } else {
- Sleep(100);
- j++;
- }
- }
- }
- }
-
- if (j > 0) {
- SetupFRD(paths, handles);
- } else {
- Sleep(500);
-
- POSITION pos = m_frd.files.GetHeadPosition();
- for (ptrdiff_t i = 0; pos; i++) {
- CFileStatus status;
- if (CFileGetStatus(m_frd.files.GetNext(pos), status)
- && m_frd.mtime[i] != status.m_mtime) {
- Open();
- SetupFRD(paths, handles);
- break;
- }
- }
- }
- } else {
- break;
- }
- }
-
- for (size_t i = 2; i < handles.GetCount(); i++) {
- FindCloseChangeNotification(handles[i]);
- }
-
- return 0;
+ SetThreadPriority(m_hThread, THREAD_PRIORITY_LOWEST/*THREAD_PRIORITY_BELOW_NORMAL*/);
+
+ CStringArray paths;
+ CAtlArray<HANDLE> handles;
+
+ SetupFRD(paths, handles);
+
+ for (;;) {
+ DWORD idx = WaitForMultipleObjects(handles.GetCount(), handles.GetData(), FALSE, INFINITE);
+
+ if (idx == (WAIT_OBJECT_0 + 0)) { // m_frd.hEndThreadEvent
+ break;
+ }
+ if (idx == (WAIT_OBJECT_0 + 1)) { // m_frd.hRefreshEvent
+ SetupFRD(paths, handles);
+ } else if (idx >= (WAIT_OBJECT_0 + 2) && idx < (WAIT_OBJECT_0 + handles.GetCount())) {
+ bool fLocked = true;
+ IsSubtitleReloaderLocked(&fLocked);
+ if (fLocked) {
+ continue;
+ }
+
+ if (FindNextChangeNotification(handles[idx - WAIT_OBJECT_0]) == FALSE) {
+ break;
+ }
+
+ int j = 0;
+
+ POSITION pos = m_frd.files.GetHeadPosition();
+ for (ptrdiff_t i = 0; pos && j == 0; i++) {
+ CString fn = m_frd.files.GetNext(pos);
+
+ CFileStatus status;
+ if (CFileGetStatus(fn, status) && m_frd.mtime[i] != status.m_mtime) {
+ for (j = 0; j < 10; j++) {
+ FILE* f = NULL;
+ if (!_tfopen_s(&f, fn, _T("rb+"))) {
+ fclose(f);
+ j = 0;
+ break;
+ } else {
+ Sleep(100);
+ j++;
+ }
+ }
+ }
+ }
+
+ if (j > 0) {
+ SetupFRD(paths, handles);
+ } else {
+ Sleep(500);
+
+ POSITION pos = m_frd.files.GetHeadPosition();
+ for (ptrdiff_t i = 0; pos; i++) {
+ CFileStatus status;
+ if (CFileGetStatus(m_frd.files.GetNext(pos), status)
+ && m_frd.mtime[i] != status.m_mtime) {
+ Open();
+ SetupFRD(paths, handles);
+ break;
+ }
+ }
+ }
+ } else {
+ break;
+ }
+ }
+
+ for (size_t i = 2; i < handles.GetCount(); i++) {
+ FindCloseChangeNotification(handles[i]);
+ }
+
+ return 0;
}
diff --git a/src/filters/transform/VSFilter/DirectVobSubFilter.h b/src/filters/transform/VSFilter/DirectVobSubFilter.h
index bdff3d9ef..1772ecb99 100644
--- a/src/filters/transform/VSFilter/DirectVobSubFilter.h
+++ b/src/filters/transform/VSFilter/DirectVobSubFilter.h
@@ -30,168 +30,168 @@
#include "../../../Subtitles/RTS.h"
typedef struct {
- HWND hSystrayWnd;
- IFilterGraph* graph;
- IDirectVobSub* dvs;
- bool fRunOnce, fShowIcon;
+ HWND hSystrayWnd;
+ IFilterGraph* graph;
+ IDirectVobSub* dvs;
+ bool fRunOnce, fShowIcon;
} SystrayIconData;
/* This is for graphedit */
class __declspec(uuid("93A22E7A-5091-45ef-BA61-6DA26156A5D0"))
- CDirectVobSubFilter
- : public CBaseVideoFilter
- , public CDirectVobSub
- , public ISpecifyPropertyPages
- , public IAMStreamSelect
- , public CAMThread
+ CDirectVobSubFilter
+ : public CBaseVideoFilter
+ , public CDirectVobSub
+ , public ISpecifyPropertyPages
+ , public IAMStreamSelect
+ , public CAMThread
{
- friend class CTextInputPin;
+ friend class CTextInputPin;
- CCritSec m_csQueueLock;
- CComPtr<ISubPicQueue> m_pSubPicQueue;
- void InitSubPicQueue();
- SubPicDesc m_spd;
+ CCritSec m_csQueueLock;
+ CComPtr<ISubPicQueue> m_pSubPicQueue;
+ void InitSubPicQueue();
+ SubPicDesc m_spd;
- bool AdjustFrameSize(CSize& s);
+ bool AdjustFrameSize(CSize& s);
protected:
- void GetOutputSize(int& w, int& h, int& arx, int& ary, int& RealWidth, int& RealHeight, int& vsfilter);
- HRESULT Transform(IMediaSample* pIn);
+ void GetOutputSize(int& w, int& h, int& arx, int& ary, int& RealWidth, int& RealHeight, int& vsfilter);
+ HRESULT Transform(IMediaSample* pIn);
public:
- CDirectVobSubFilter(LPUNKNOWN punk, HRESULT* phr, const GUID& clsid = __uuidof(CDirectVobSubFilter));
- virtual ~CDirectVobSubFilter();
-
- DECLARE_IUNKNOWN;
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
-
- // CBaseFilter
-
- CBasePin* GetPin(int n);
- int GetPinCount();
-
- STDMETHODIMP JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName);
- STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
-
- // CTransformFilter
- HRESULT SetMediaType(PIN_DIRECTION dir, const CMediaType* pMediaType),
- CheckConnect(PIN_DIRECTION dir, IPin* pPin),
- CompleteConnect(PIN_DIRECTION dir, IPin* pReceivePin),
- BreakConnect(PIN_DIRECTION dir),
- StartStreaming(),
- StopStreaming(),
- NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
-
- CAtlArray<CTextInputPin*> m_pTextInput;
-
- // IDirectVobSub
- STDMETHODIMP put_FileName(WCHAR* fn);
- STDMETHODIMP get_LanguageCount(int* nLangs);
- STDMETHODIMP get_LanguageName(int iLanguage, WCHAR** ppName);
- STDMETHODIMP put_SelectedLanguage(int iSelected);
- STDMETHODIMP put_HideSubtitles(bool fHideSubtitles);
- STDMETHODIMP put_PreBuffering(bool fDoPreBuffering); // deprecated
- STDMETHODIMP put_SubPictToBuffer(unsigned int uSubPictToBuffer);
- STDMETHODIMP put_AnimWhenBuffering(bool fAnimWhenBuffering);
- STDMETHODIMP put_Placement(bool fOverridePlacement, int xperc, int yperc);
- STDMETHODIMP put_VobSubSettings(bool fBuffer, bool fOnlyShowForcedSubs, bool fPolygonize);
- STDMETHODIMP put_TextSettings(void* lf, int lflen, COLORREF color, bool fShadow, bool fOutline, bool fAdvancedRenderer);
- STDMETHODIMP put_SubtitleTiming(int delay, int speedmul, int speeddiv);
- STDMETHODIMP get_MediaFPS(bool* fEnabled, double* fps);
- STDMETHODIMP put_MediaFPS(bool fEnabled, double fps);
- STDMETHODIMP get_ZoomRect(NORMALIZEDRECT* rect);
- STDMETHODIMP put_ZoomRect(NORMALIZEDRECT* rect);
- STDMETHODIMP HasConfigDialog(int iSelected);
- STDMETHODIMP ShowConfigDialog(int iSelected, HWND hWndParent);
-
- // IDirectVobSub2
- STDMETHODIMP put_TextSettings(STSStyle* pDefStyle);
- STDMETHODIMP put_AspectRatioSettings(CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType);
-
- // ISpecifyPropertyPages
- STDMETHODIMP GetPages(CAUUID* pPages);
-
- // IAMStreamSelect
- STDMETHODIMP Count(DWORD* pcStreams);
- STDMETHODIMP Enable(long lIndex, DWORD dwFlags);
- STDMETHODIMP Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD* pdwFlags, LCID* plcid, DWORD* pdwGroup, WCHAR** ppszName, IUnknown** ppObject, IUnknown** ppUnk);
-
- // CPersistStream
- STDMETHODIMP GetClassID(CLSID* pClsid);
+ CDirectVobSubFilter(LPUNKNOWN punk, HRESULT* phr, const GUID& clsid = __uuidof(CDirectVobSubFilter));
+ virtual ~CDirectVobSubFilter();
+
+ DECLARE_IUNKNOWN;
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ // CBaseFilter
+
+ CBasePin* GetPin(int n);
+ int GetPinCount();
+
+ STDMETHODIMP JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName);
+ STDMETHODIMP QueryFilterInfo(FILTER_INFO* pInfo);
+
+ // CTransformFilter
+ HRESULT SetMediaType(PIN_DIRECTION dir, const CMediaType* pMediaType),
+ CheckConnect(PIN_DIRECTION dir, IPin* pPin),
+ CompleteConnect(PIN_DIRECTION dir, IPin* pReceivePin),
+ BreakConnect(PIN_DIRECTION dir),
+ StartStreaming(),
+ StopStreaming(),
+ NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
+
+ CAtlArray<CTextInputPin*> m_pTextInput;
+
+ // IDirectVobSub
+ STDMETHODIMP put_FileName(WCHAR* fn);
+ STDMETHODIMP get_LanguageCount(int* nLangs);
+ STDMETHODIMP get_LanguageName(int iLanguage, WCHAR** ppName);
+ STDMETHODIMP put_SelectedLanguage(int iSelected);
+ STDMETHODIMP put_HideSubtitles(bool fHideSubtitles);
+ STDMETHODIMP put_PreBuffering(bool fDoPreBuffering); // deprecated
+ STDMETHODIMP put_SubPictToBuffer(unsigned int uSubPictToBuffer);
+ STDMETHODIMP put_AnimWhenBuffering(bool fAnimWhenBuffering);
+ STDMETHODIMP put_Placement(bool fOverridePlacement, int xperc, int yperc);
+ STDMETHODIMP put_VobSubSettings(bool fBuffer, bool fOnlyShowForcedSubs, bool fPolygonize);
+ STDMETHODIMP put_TextSettings(void* lf, int lflen, COLORREF color, bool fShadow, bool fOutline, bool fAdvancedRenderer);
+ STDMETHODIMP put_SubtitleTiming(int delay, int speedmul, int speeddiv);
+ STDMETHODIMP get_MediaFPS(bool* fEnabled, double* fps);
+ STDMETHODIMP put_MediaFPS(bool fEnabled, double fps);
+ STDMETHODIMP get_ZoomRect(NORMALIZEDRECT* rect);
+ STDMETHODIMP put_ZoomRect(NORMALIZEDRECT* rect);
+ STDMETHODIMP HasConfigDialog(int iSelected);
+ STDMETHODIMP ShowConfigDialog(int iSelected, HWND hWndParent);
+
+ // IDirectVobSub2
+ STDMETHODIMP put_TextSettings(STSStyle* pDefStyle);
+ STDMETHODIMP put_AspectRatioSettings(CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType);
+
+ // ISpecifyPropertyPages
+ STDMETHODIMP GetPages(CAUUID* pPages);
+
+ // IAMStreamSelect
+ STDMETHODIMP Count(DWORD* pcStreams);
+ STDMETHODIMP Enable(long lIndex, DWORD dwFlags);
+ STDMETHODIMP Info(long lIndex, AM_MEDIA_TYPE** ppmt, DWORD* pdwFlags, LCID* plcid, DWORD* pdwGroup, WCHAR** ppszName, IUnknown** ppObject, IUnknown** ppUnk);
+
+ // CPersistStream
+ STDMETHODIMP GetClassID(CLSID* pClsid);
protected:
- HRESULT ChangeMediaType(int iPosition);
+ HRESULT ChangeMediaType(int iPosition);
- HDC m_hdc;
- HBITMAP m_hbm;
- HFONT m_hfont;
- void PrintMessages(BYTE* pOut);
+ HDC m_hdc;
+ HBITMAP m_hbm;
+ HFONT m_hfont;
+ void PrintMessages(BYTE* pOut);
- /* ResX2 */
- CAutoVectorPtr<BYTE> m_pTempPicBuff;
- HRESULT Copy(BYTE* pSub, BYTE* pIn, CSize sub, CSize in, int bpp, const GUID& subtype, DWORD black);
+ /* ResX2 */
+ CAutoVectorPtr<BYTE> m_pTempPicBuff;
+ HRESULT Copy(BYTE* pSub, BYTE* pIn, CSize sub, CSize in, int bpp, const GUID& subtype, DWORD black);
- // segment start time, absolute time
- CRefTime m_tPrev;
- REFERENCE_TIME CalcCurrentTime();
+ // segment start time, absolute time
+ CRefTime m_tPrev;
+ REFERENCE_TIME CalcCurrentTime();
- double m_fps;
+ double m_fps;
- // 3.x- versions of microsoft's mpeg4 codec output flipped image
- bool m_fMSMpeg4Fix;
+ // 3.x- versions of microsoft's mpeg4 codec output flipped image
+ bool m_fMSMpeg4Fix;
- // don't set the "hide subtitles" stream until we are finished with loading
- bool m_fLoading;
+ // don't set the "hide subtitles" stream until we are finished with loading
+ bool m_fLoading;
- bool Open();
+ bool Open();
- int FindPreferedLanguage(bool fHideToo = true);
- void UpdatePreferedLanguages(CString lang);
+ int FindPreferedLanguage(bool fHideToo = true);
+ void UpdatePreferedLanguages(CString lang);
- CCritSec m_csSubLock;
- CInterfaceList<ISubStream> m_pSubStreams;
- DWORD_PTR m_nSubtitleId;
- void UpdateSubtitle(bool fApplyDefStyle = true);
- void SetSubtitle(ISubStream* pSubStream, bool fApplyDefStyle = true);
- void InvalidateSubtitle(REFERENCE_TIME rtInvalidate = -1, DWORD_PTR nSubtitleId = -1);
+ CCritSec m_csSubLock;
+ CInterfaceList<ISubStream> m_pSubStreams;
+ DWORD_PTR m_nSubtitleId;
+ void UpdateSubtitle(bool fApplyDefStyle = true);
+ void SetSubtitle(ISubStream* pSubStream, bool fApplyDefStyle = true);
+ void InvalidateSubtitle(REFERENCE_TIME rtInvalidate = -1, DWORD_PTR nSubtitleId = -1);
- // the text input pin is using these
- void AddSubStream(ISubStream* pSubStream);
- void RemoveSubStream(ISubStream* pSubStream);
- void Post_EC_OLE_EVENT(CString str, DWORD_PTR nSubtitleId = -1);
+ // the text input pin is using these
+ void AddSubStream(ISubStream* pSubStream);
+ void RemoveSubStream(ISubStream* pSubStream);
+ void Post_EC_OLE_EVENT(CString str, DWORD_PTR nSubtitleId = -1);
private:
- class CFileReloaderData
- {
- public:
- ATL::CEvent EndThreadEvent, RefreshEvent;
- CAtlList<CString> files;
- CAtlArray<CTime> mtime;
- } m_frd;
+ class CFileReloaderData
+ {
+ public:
+ ATL::CEvent EndThreadEvent, RefreshEvent;
+ CAtlList<CString> files;
+ CAtlArray<CTime> mtime;
+ } m_frd;
- void SetupFRD(CStringArray& paths, CAtlArray<HANDLE>& handles);
- DWORD ThreadProc();
+ void SetupFRD(CStringArray& paths, CAtlArray<HANDLE>& handles);
+ DWORD ThreadProc();
private:
- HANDLE m_hSystrayThread;
- SystrayIconData m_tbid;
+ HANDLE m_hSystrayThread;
+ SystrayIconData m_tbid;
- VIDEOINFOHEADER2 m_CurrentVIH2;
+ VIDEOINFOHEADER2 m_CurrentVIH2;
};
/* The "auto-loading" version */
class __declspec(uuid("9852A670-F845-491b-9BE6-EBD841B8A613"))
- CDirectVobSubFilter2 : public CDirectVobSubFilter
+ CDirectVobSubFilter2 : public CDirectVobSubFilter
{
- bool ShouldWeAutoload(IFilterGraph* pGraph);
- void GetRidOfInternalScriptRenderer();
+ bool ShouldWeAutoload(IFilterGraph* pGraph);
+ void GetRidOfInternalScriptRenderer();
public:
- CDirectVobSubFilter2(LPUNKNOWN punk, HRESULT* phr, const GUID& clsid = __uuidof(CDirectVobSubFilter2));
+ CDirectVobSubFilter2(LPUNKNOWN punk, HRESULT* phr, const GUID& clsid = __uuidof(CDirectVobSubFilter2));
- HRESULT CheckConnect(PIN_DIRECTION dir, IPin* pPin);
- STDMETHODIMP JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName);
- HRESULT CheckInputType(const CMediaType* mtIn);
+ HRESULT CheckConnect(PIN_DIRECTION dir, IPin* pPin);
+ STDMETHODIMP JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName);
+ HRESULT CheckInputType(const CMediaType* mtIn);
};
diff --git a/src/filters/transform/VSFilter/DirectVobSubPropPage.cpp b/src/filters/transform/VSFilter/DirectVobSubPropPage.cpp
index 0175e26fd..405fd3e86 100644
--- a/src/filters/transform/VSFilter/DirectVobSubPropPage.cpp
+++ b/src/filters/transform/VSFilter/DirectVobSubPropPage.cpp
@@ -37,817 +37,817 @@
BOOL WINAPI MyGetDialogSize(int iResourceID, DLGPROC pDlgProc, LPARAM lParam, SIZE* pResult)
{
- HWND hwnd = CreateDialogParam(AfxGetResourceHandle(),
- MAKEINTRESOURCE(iResourceID),
- GetDesktopWindow(),
- pDlgProc,
- lParam);
+ HWND hwnd = CreateDialogParam(AfxGetResourceHandle(),
+ MAKEINTRESOURCE(iResourceID),
+ GetDesktopWindow(),
+ pDlgProc,
+ lParam);
- if (hwnd == NULL) {
- return FALSE;
- }
+ if (hwnd == NULL) {
+ return FALSE;
+ }
- RECT rc;
- GetWindowRect(hwnd, &rc);
- pResult->cx = rc.right - rc.left;
- pResult->cy = rc.bottom - rc.top;
+ RECT rc;
+ GetWindowRect(hwnd, &rc);
+ pResult->cx = rc.right - rc.left;
+ pResult->cy = rc.bottom - rc.top;
- DestroyWindow(hwnd);
+ DestroyWindow(hwnd);
- return TRUE;
+ return TRUE;
}
STDMETHODIMP CDVSBasePPage::GetPageInfo(LPPROPPAGEINFO pPageInfo)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CString str;
- if (!str.LoadString(m_TitleId)) {
- return E_FAIL;
- }
+ CString str;
+ if (!str.LoadString(m_TitleId)) {
+ return E_FAIL;
+ }
- WCHAR wszTitle[STR_MAX_LENGTH];
- wcscpy_s(wszTitle, str);
+ WCHAR wszTitle[STR_MAX_LENGTH];
+ wcscpy_s(wszTitle, str);
- CheckPointer(pPageInfo, E_POINTER);
+ CheckPointer(pPageInfo, E_POINTER);
- // Allocate dynamic memory for the property page title
+ // Allocate dynamic memory for the property page title
- LPOLESTR pszTitle;
- HRESULT hr = AMGetWideString(wszTitle, &pszTitle);
- if (FAILED(hr)) {
- NOTE("No caption memory");
- return hr;
- }
+ LPOLESTR pszTitle;
+ HRESULT hr = AMGetWideString(wszTitle, &pszTitle);
+ if (FAILED(hr)) {
+ NOTE("No caption memory");
+ return hr;
+ }
- pPageInfo->cb = sizeof(PROPPAGEINFO);
- pPageInfo->pszTitle = pszTitle;
- pPageInfo->pszDocString = NULL;
- pPageInfo->pszHelpFile = NULL;
- pPageInfo->dwHelpContext = 0;
- // Set defaults in case GetDialogSize fails
- pPageInfo->size.cx = 340;
- pPageInfo->size.cy = 150;
+ pPageInfo->cb = sizeof(PROPPAGEINFO);
+ pPageInfo->pszTitle = pszTitle;
+ pPageInfo->pszDocString = NULL;
+ pPageInfo->pszHelpFile = NULL;
+ pPageInfo->dwHelpContext = 0;
+ // Set defaults in case GetDialogSize fails
+ pPageInfo->size.cx = 340;
+ pPageInfo->size.cy = 150;
- MyGetDialogSize(m_DialogId, DialogProc, 0L, &pPageInfo->size);
+ MyGetDialogSize(m_DialogId, DialogProc, 0L, &pPageInfo->size);
- return NOERROR;
+ return NOERROR;
}
STDMETHODIMP CDVSBasePPage::Activate(HWND hwndParent, LPCRECT pRect, BOOL fModal)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- CheckPointer(pRect,E_POINTER);
- /*
- // Return failure if SetObject has not been called.
- if (m_bObjectSet == FALSE) {
- return E_UNEXPECTED;
- }
- */
- if (m_hwnd) {
- return E_UNEXPECTED;
- }
-
- m_hwnd = CreateDialogParam(AfxGetResourceHandle(), MAKEINTRESOURCE(m_DialogId), hwndParent, DialogProc, (LPARAM)this);
- if (m_hwnd == NULL) {
- return E_OUTOFMEMORY;
- }
-
- OnActivate();
- Move(pRect);
- return Show(SW_SHOWNORMAL);
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ CheckPointer(pRect, E_POINTER);
+ /*
+ // Return failure if SetObject has not been called.
+ if (m_bObjectSet == FALSE) {
+ return E_UNEXPECTED;
+ }
+ */
+ if (m_hwnd) {
+ return E_UNEXPECTED;
+ }
+
+ m_hwnd = CreateDialogParam(AfxGetResourceHandle(), MAKEINTRESOURCE(m_DialogId), hwndParent, DialogProc, (LPARAM)this);
+ if (m_hwnd == NULL) {
+ return E_OUTOFMEMORY;
+ }
+
+ OnActivate();
+ Move(pRect);
+ return Show(SW_SHOWNORMAL);
}
/* CDVSBasePPage */
CDVSBasePPage::CDVSBasePPage(TCHAR* pName, LPUNKNOWN lpunk, int DialogId, int TitleId) :
- CBasePropertyPage(pName, lpunk, DialogId, TitleId),
- m_bIsInitialized(FALSE),
- m_fAttached(false),
- m_fDisableInstantUpdate(false)
+ CBasePropertyPage(pName, lpunk, DialogId, TitleId),
+ m_bIsInitialized(FALSE),
+ m_fAttached(false),
+ m_fDisableInstantUpdate(false)
{
}
INT_PTR CDVSBasePPage::OnReceiveMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (uMsg) {
- case WM_COMMAND: {
- if (m_bIsInitialized) {
- m_bDirty = TRUE;
- if (m_pPageSite) {
- m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY);
- }
-
- switch (HIWORD(wParam)) {
- case BN_CLICKED:
- case CBN_SELCHANGE:
- case EN_CHANGE: {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- if (!m_fDisableInstantUpdate
- && !(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_INSTANTUPDATE)
- && LOWORD(wParam) != IDC_EDIT1 && LOWORD(wParam) != IDC_ANIMWHENBUFFERING
- && !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_INSTANTUPDATE), 1)) {
- OnApplyChanges();
- }
- }
- }
- }
- }
- break;
-
- case WM_NCDESTROY:
- DetachControls();
- break;
- }
-
- return OnMessage(uMsg, wParam, lParam)
- ? 0
- : CBasePropertyPage::OnReceiveMessage(hwnd,uMsg,wParam,lParam);
+ switch (uMsg) {
+ case WM_COMMAND: {
+ if (m_bIsInitialized) {
+ m_bDirty = TRUE;
+ if (m_pPageSite) {
+ m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY);
+ }
+
+ switch (HIWORD(wParam)) {
+ case BN_CLICKED:
+ case CBN_SELCHANGE:
+ case EN_CHANGE: {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ if (!m_fDisableInstantUpdate
+ && !(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_INSTANTUPDATE)
+ && LOWORD(wParam) != IDC_EDIT1 && LOWORD(wParam) != IDC_ANIMWHENBUFFERING
+ && !!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_INSTANTUPDATE), 1)) {
+ OnApplyChanges();
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ case WM_NCDESTROY:
+ DetachControls();
+ break;
+ }
+
+ return OnMessage(uMsg, wParam, lParam)
+ ? 0
+ : CBasePropertyPage::OnReceiveMessage(hwnd, uMsg, wParam, lParam);
}
HRESULT CDVSBasePPage::OnConnect(IUnknown* pUnknown)
{
- if (!(m_pDirectVobSub = pUnknown)) {
- return E_NOINTERFACE;
- }
+ if (!(m_pDirectVobSub = pUnknown)) {
+ return E_NOINTERFACE;
+ }
- m_pDirectVobSub->LockSubtitleReloader(true); // *
+ m_pDirectVobSub->LockSubtitleReloader(true); // *
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- UpdateObjectData(false);
+ UpdateObjectData(false);
- m_bIsInitialized = FALSE;
+ m_bIsInitialized = FALSE;
- return NOERROR;
+ return NOERROR;
}
HRESULT CDVSBasePPage::OnDisconnect()
{
- if (m_pDirectVobSub == NULL) {
- return E_UNEXPECTED;
- }
+ if (m_pDirectVobSub == NULL) {
+ return E_UNEXPECTED;
+ }
- m_pDirectVobSub->LockSubtitleReloader(false); // *
+ m_pDirectVobSub->LockSubtitleReloader(false); // *
- // for some reason OnDisconnect() will be called twice, that's why we
- // need to release m_pDirectVobSub manually on the first call to avoid
- // a second "m_pDirectVobSub->LockSubtitleReloader(false);"
+ // for some reason OnDisconnect() will be called twice, that's why we
+ // need to release m_pDirectVobSub manually on the first call to avoid
+ // a second "m_pDirectVobSub->LockSubtitleReloader(false);"
- m_pDirectVobSub.Release();
+ m_pDirectVobSub.Release();
- return NOERROR;
+ return NOERROR;
}
HRESULT CDVSBasePPage::OnActivate()
{
- ASSERT(m_pDirectVobSub);
+ ASSERT(m_pDirectVobSub);
- AttachControls();
+ AttachControls();
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- UpdateControlData(false);
+ UpdateControlData(false);
- m_bIsInitialized = TRUE;
+ m_bIsInitialized = TRUE;
- return NOERROR;
+ return NOERROR;
}
HRESULT CDVSBasePPage::OnDeactivate()
{
- ASSERT(m_pDirectVobSub);
+ ASSERT(m_pDirectVobSub);
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- UpdateControlData(true);
+ UpdateControlData(true);
- m_bIsInitialized = FALSE;
+ m_bIsInitialized = FALSE;
- return NOERROR;
+ return NOERROR;
}
HRESULT CDVSBasePPage::OnApplyChanges()
{
- ASSERT(m_pDirectVobSub);
+ ASSERT(m_pDirectVobSub);
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- if (m_bIsInitialized) {
- OnDeactivate();
- UpdateObjectData(true);
- m_pDirectVobSub->UpdateRegistry(); // *
- OnActivate();
- }
+ if (m_bIsInitialized) {
+ OnDeactivate();
+ UpdateObjectData(true);
+ m_pDirectVobSub->UpdateRegistry(); // *
+ OnActivate();
+ }
- return NOERROR;
+ return NOERROR;
}
void CDVSBasePPage::AttachControls()
{
- DetachControls();
-
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- POSITION pos = m_controls.GetStartPosition();
- while (pos) {
- UINT id;
- CWnd* pControl;
- m_controls.GetNextAssoc(pos, id, pControl);
- if (pControl) {
- BOOL fRet = pControl->Attach(GetDlgItem(m_Dlg, id));
- ASSERT(fRet);
- }
- }
-
- m_fAttached = true;
+ DetachControls();
+
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ POSITION pos = m_controls.GetStartPosition();
+ while (pos) {
+ UINT id;
+ CWnd* pControl;
+ m_controls.GetNextAssoc(pos, id, pControl);
+ if (pControl) {
+ BOOL fRet = pControl->Attach(GetDlgItem(m_Dlg, id));
+ ASSERT(fRet);
+ }
+ }
+
+ m_fAttached = true;
}
void CDVSBasePPage::DetachControls()
{
- if (!m_fAttached) {
- return;
- }
-
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- POSITION pos = m_controls.GetStartPosition();
- while (pos) {
- UINT id;
- CWnd* pControl;
- m_controls.GetNextAssoc(pos, id, pControl);
- if (pControl) {
- pControl->Detach();
- }
- }
-
- m_fAttached = false;
+ if (!m_fAttached) {
+ return;
+ }
+
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ POSITION pos = m_controls.GetStartPosition();
+ while (pos) {
+ UINT id;
+ CWnd* pControl;
+ m_controls.GetNextAssoc(pos, id, pControl);
+ if (pControl) {
+ pControl->Detach();
+ }
+ }
+
+ m_fAttached = false;
}
void CDVSBasePPage::BindControl(UINT id, CWnd& control)
{
- m_controls[id] = &control;
+ m_controls[id] = &control;
}
/* CDVSMainPPage */
CDVSMainPPage::CDVSMainPPage(LPUNKNOWN pUnk, HRESULT* phr) :
- CDVSBasePPage(NAME("DirectVobSub Property Page (main)"), pUnk, IDD_DVSMAINPAGE, IDD_DVSMAINPAGE),
- m_nLangs(0),
- m_ppLangs(NULL)
+ CDVSBasePPage(NAME("DirectVobSub Property Page (main)"), pUnk, IDD_DVSMAINPAGE, IDD_DVSMAINPAGE),
+ m_nLangs(0),
+ m_ppLangs(NULL)
{
- BindControl(IDC_FILENAME, m_fnedit);
- BindControl(IDC_LANGCOMBO, m_langs);
- BindControl(IDC_OVERRIDEPLACEMENT, m_oplacement);
- BindControl(IDC_SPIN1, m_subposx);
- BindControl(IDC_SPIN2, m_subposy);
- BindControl(IDC_FONT, m_font);
- BindControl(IDC_ONLYSHOWFORCEDSUBS, m_forcedsubs);
- BindControl(IDC_PARCOMBO, m_PARCombo);
+ BindControl(IDC_FILENAME, m_fnedit);
+ BindControl(IDC_LANGCOMBO, m_langs);
+ BindControl(IDC_OVERRIDEPLACEMENT, m_oplacement);
+ BindControl(IDC_SPIN1, m_subposx);
+ BindControl(IDC_SPIN2, m_subposy);
+ BindControl(IDC_FONT, m_font);
+ BindControl(IDC_ONLYSHOWFORCEDSUBS, m_forcedsubs);
+ BindControl(IDC_PARCOMBO, m_PARCombo);
}
CDVSMainPPage::~CDVSMainPPage()
{
- FreeLangs();
+ FreeLangs();
}
void CDVSMainPPage::FreeLangs()
{
- if (m_nLangs > 0 && m_ppLangs) {
- for (ptrdiff_t i = 0; i < m_nLangs; i++) {
- CoTaskMemFree(m_ppLangs[i]);
- }
- CoTaskMemFree(m_ppLangs);
- m_nLangs = 0;
- m_ppLangs = NULL;
- }
+ if (m_nLangs > 0 && m_ppLangs) {
+ for (ptrdiff_t i = 0; i < m_nLangs; i++) {
+ CoTaskMemFree(m_ppLangs[i]);
+ }
+ CoTaskMemFree(m_ppLangs);
+ m_nLangs = 0;
+ m_ppLangs = NULL;
+ }
}
void CDVSMainPPage::AllocLangs(int nLangs)
{
- m_ppLangs = (WCHAR**)CoTaskMemRealloc(m_ppLangs, sizeof(WCHAR*)*nLangs);
- m_nLangs = nLangs;
+ m_ppLangs = (WCHAR**)CoTaskMemRealloc(m_ppLangs, sizeof(WCHAR*)*nLangs);
+ m_nLangs = nLangs;
}
bool CDVSMainPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (uMsg) {
- case WM_COMMAND: {
- switch (HIWORD(wParam)) {
- case BN_CLICKED: {
- if (LOWORD(wParam) == IDC_OPEN) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- CFileDialog fd(TRUE, NULL, NULL,
- OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST,
- _T(".idx .smi .sub .srt .psb .ssa .ass .usf|*.idx;*.smi;*.sub;*.srt;*.psb;*.ssa;*.ass;*.usf|")
- _T("All files (*.*)|*.*||"),
- CDialog::FromHandle(m_Dlg), 0);
-
- if (fd.DoModal() == IDOK) {
- m_fnedit.SetWindowText(fd.GetPathName());
- }
-
- return true;
- } else if (LOWORD(wParam) == IDC_FONT) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- CStyleEditorDialog dlg(_T("Default"), &m_defStyle, CWnd::FromHandle(m_hwnd));
-
- if (dlg.DoModal() == IDOK) {
- m_defStyle = dlg.m_stss;
- CString str = m_defStyle.fontName;
- if (str.GetLength() > 18) {
- str = str.Left(16).TrimRight() + _T("...");
- }
- m_font.SetWindowText(str);
- }
-
- return true;
- }
- }
- break;
- }
- }
- break;
- }
-
- return false;
+ switch (uMsg) {
+ case WM_COMMAND: {
+ switch (HIWORD(wParam)) {
+ case BN_CLICKED: {
+ if (LOWORD(wParam) == IDC_OPEN) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ CFileDialog fd(TRUE, NULL, NULL,
+ OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
+ _T(".idx .smi .sub .srt .psb .ssa .ass .usf|*.idx;*.smi;*.sub;*.srt;*.psb;*.ssa;*.ass;*.usf|")
+ _T("All files (*.*)|*.*||"),
+ CDialog::FromHandle(m_Dlg), 0);
+
+ if (fd.DoModal() == IDOK) {
+ m_fnedit.SetWindowText(fd.GetPathName());
+ }
+
+ return true;
+ } else if (LOWORD(wParam) == IDC_FONT) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ CStyleEditorDialog dlg(_T("Default"), &m_defStyle, CWnd::FromHandle(m_hwnd));
+
+ if (dlg.DoModal() == IDOK) {
+ m_defStyle = dlg.m_stss;
+ CString str = m_defStyle.fontName;
+ if (str.GetLength() > 18) {
+ str = str.Left(16).TrimRight() + _T("...");
+ }
+ m_font.SetWindowText(str);
+ }
+
+ return true;
+ }
+ }
+ break;
+ }
+ }
+ break;
+ }
+
+ return false;
}
void CDVSMainPPage::UpdateObjectData(bool fSave)
{
- if (fSave) {
- if (m_pDirectVobSub->put_FileName(m_fn) == S_OK) {
- int nLangs;
- m_pDirectVobSub->get_LanguageCount(&nLangs);
- AllocLangs(nLangs);
- for (ptrdiff_t i = 0; i < m_nLangs; i++) {
- m_pDirectVobSub->get_LanguageName(i, &m_ppLangs[i]);
- }
- m_pDirectVobSub->get_SelectedLanguage(&m_iSelectedLanguage);
- }
-
- m_pDirectVobSub->put_SelectedLanguage(m_iSelectedLanguage);
- m_pDirectVobSub->put_Placement(m_fOverridePlacement, m_PlacementXperc, m_PlacementYperc);
- m_pDirectVobSub->put_VobSubSettings(true, m_fOnlyShowForcedVobSubs, false);
- m_pDirectVobSub->put_TextSettings(&m_defStyle);
- m_pDirectVobSub->put_AspectRatioSettings(&m_ePARCompensationType);
- } else {
- m_pDirectVobSub->get_FileName(m_fn);
- int nLangs;
- m_pDirectVobSub->get_LanguageCount(&nLangs);
- AllocLangs(nLangs);
- for (ptrdiff_t i = 0; i < m_nLangs; i++) {
- m_pDirectVobSub->get_LanguageName(i, &m_ppLangs[i]);
- }
- m_pDirectVobSub->get_SelectedLanguage(&m_iSelectedLanguage);
- m_pDirectVobSub->get_Placement(&m_fOverridePlacement, &m_PlacementXperc, &m_PlacementYperc);
- m_pDirectVobSub->get_VobSubSettings(NULL, &m_fOnlyShowForcedVobSubs, NULL);
- m_pDirectVobSub->get_TextSettings(&m_defStyle);
- m_pDirectVobSub->get_AspectRatioSettings(&m_ePARCompensationType);
- }
+ if (fSave) {
+ if (m_pDirectVobSub->put_FileName(m_fn) == S_OK) {
+ int nLangs;
+ m_pDirectVobSub->get_LanguageCount(&nLangs);
+ AllocLangs(nLangs);
+ for (ptrdiff_t i = 0; i < m_nLangs; i++) {
+ m_pDirectVobSub->get_LanguageName(i, &m_ppLangs[i]);
+ }
+ m_pDirectVobSub->get_SelectedLanguage(&m_iSelectedLanguage);
+ }
+
+ m_pDirectVobSub->put_SelectedLanguage(m_iSelectedLanguage);
+ m_pDirectVobSub->put_Placement(m_fOverridePlacement, m_PlacementXperc, m_PlacementYperc);
+ m_pDirectVobSub->put_VobSubSettings(true, m_fOnlyShowForcedVobSubs, false);
+ m_pDirectVobSub->put_TextSettings(&m_defStyle);
+ m_pDirectVobSub->put_AspectRatioSettings(&m_ePARCompensationType);
+ } else {
+ m_pDirectVobSub->get_FileName(m_fn);
+ int nLangs;
+ m_pDirectVobSub->get_LanguageCount(&nLangs);
+ AllocLangs(nLangs);
+ for (ptrdiff_t i = 0; i < m_nLangs; i++) {
+ m_pDirectVobSub->get_LanguageName(i, &m_ppLangs[i]);
+ }
+ m_pDirectVobSub->get_SelectedLanguage(&m_iSelectedLanguage);
+ m_pDirectVobSub->get_Placement(&m_fOverridePlacement, &m_PlacementXperc, &m_PlacementYperc);
+ m_pDirectVobSub->get_VobSubSettings(NULL, &m_fOnlyShowForcedVobSubs, NULL);
+ m_pDirectVobSub->get_TextSettings(&m_defStyle);
+ m_pDirectVobSub->get_AspectRatioSettings(&m_ePARCompensationType);
+ }
}
void CDVSMainPPage::UpdateControlData(bool fSave)
{
- if (fSave) {
- CString fn;
- m_fnedit.GetWindowText(fn);
- wcscpy_s(m_fn, fn);
-
- m_iSelectedLanguage = m_langs.GetCurSel();
- m_fOverridePlacement = !!m_oplacement.GetCheck();
- m_PlacementXperc = m_subposx.GetPos();
- m_PlacementYperc = m_subposy.GetPos();
- m_fOnlyShowForcedVobSubs = !!m_forcedsubs.GetCheck();
- if (m_PARCombo.GetCurSel() != CB_ERR) {
- m_ePARCompensationType = static_cast<CSimpleTextSubtitle::EPARCompensationType>(m_PARCombo.GetItemData(m_PARCombo.GetCurSel()));
- } else {
- m_ePARCompensationType = CSimpleTextSubtitle::EPCTDisabled;
- }
- } else {
- m_fnedit.SetWindowText(CString(m_fn));
- m_oplacement.SetCheck(m_fOverridePlacement);
- m_subposx.SetRange(-20, 120);
- m_subposx.SetPos(m_PlacementXperc);
- m_subposx.EnableWindow(m_fOverridePlacement);
- m_subposy.SetRange(-20, 120);
- m_subposy.SetPos(m_PlacementYperc);
- m_subposy.EnableWindow(m_fOverridePlacement);
- m_font.SetWindowText(m_defStyle.fontName);
- m_forcedsubs.SetCheck(m_fOnlyShowForcedVobSubs);
- m_langs.ResetContent();
- m_langs.EnableWindow(m_nLangs > 0);
- for (ptrdiff_t i = 0; i < m_nLangs; i++) {
- m_langs.AddString(CString(m_ppLangs[i]));
- }
- m_langs.SetCurSel(m_iSelectedLanguage);
-
- m_PARCombo.ResetContent();
- m_PARCombo.InsertString(0, ResStr(IDS_RT_PAR_DISABLED));
- m_PARCombo.SetItemData(0, CSimpleTextSubtitle::EPCTDisabled);
- if (m_ePARCompensationType == CSimpleTextSubtitle::EPCTDisabled) {
- m_PARCombo.SetCurSel(0);
- }
-
- m_PARCombo.InsertString(1, ResStr(IDS_RT_PAR_DOWNSCALE));
- m_PARCombo.SetItemData(1, CSimpleTextSubtitle::EPCTDownscale);
- if (m_ePARCompensationType == CSimpleTextSubtitle::EPCTDownscale) {
- m_PARCombo.SetCurSel(1);
- }
-
- m_PARCombo.InsertString(2, ResStr(IDS_RT_PAR_UPSCALE));
- m_PARCombo.SetItemData(2, CSimpleTextSubtitle::EPCTUpscale);
- if (m_ePARCompensationType == CSimpleTextSubtitle::EPCTUpscale) {
- m_PARCombo.SetCurSel(2);
- }
-
- m_PARCombo.InsertString(3, ResStr(IDS_RT_PAR_ACCURATE_SIZE));
- m_PARCombo.SetItemData(3, CSimpleTextSubtitle::EPCTAccurateSize);
- if (m_ePARCompensationType == CSimpleTextSubtitle::EPCTAccurateSize) {
- m_PARCombo.SetCurSel(3);
- }
- }
+ if (fSave) {
+ CString fn;
+ m_fnedit.GetWindowText(fn);
+ wcscpy_s(m_fn, fn);
+
+ m_iSelectedLanguage = m_langs.GetCurSel();
+ m_fOverridePlacement = !!m_oplacement.GetCheck();
+ m_PlacementXperc = m_subposx.GetPos();
+ m_PlacementYperc = m_subposy.GetPos();
+ m_fOnlyShowForcedVobSubs = !!m_forcedsubs.GetCheck();
+ if (m_PARCombo.GetCurSel() != CB_ERR) {
+ m_ePARCompensationType = static_cast<CSimpleTextSubtitle::EPARCompensationType>(m_PARCombo.GetItemData(m_PARCombo.GetCurSel()));
+ } else {
+ m_ePARCompensationType = CSimpleTextSubtitle::EPCTDisabled;
+ }
+ } else {
+ m_fnedit.SetWindowText(CString(m_fn));
+ m_oplacement.SetCheck(m_fOverridePlacement);
+ m_subposx.SetRange(-20, 120);
+ m_subposx.SetPos(m_PlacementXperc);
+ m_subposx.EnableWindow(m_fOverridePlacement);
+ m_subposy.SetRange(-20, 120);
+ m_subposy.SetPos(m_PlacementYperc);
+ m_subposy.EnableWindow(m_fOverridePlacement);
+ m_font.SetWindowText(m_defStyle.fontName);
+ m_forcedsubs.SetCheck(m_fOnlyShowForcedVobSubs);
+ m_langs.ResetContent();
+ m_langs.EnableWindow(m_nLangs > 0);
+ for (ptrdiff_t i = 0; i < m_nLangs; i++) {
+ m_langs.AddString(CString(m_ppLangs[i]));
+ }
+ m_langs.SetCurSel(m_iSelectedLanguage);
+
+ m_PARCombo.ResetContent();
+ m_PARCombo.InsertString(0, ResStr(IDS_RT_PAR_DISABLED));
+ m_PARCombo.SetItemData(0, CSimpleTextSubtitle::EPCTDisabled);
+ if (m_ePARCompensationType == CSimpleTextSubtitle::EPCTDisabled) {
+ m_PARCombo.SetCurSel(0);
+ }
+
+ m_PARCombo.InsertString(1, ResStr(IDS_RT_PAR_DOWNSCALE));
+ m_PARCombo.SetItemData(1, CSimpleTextSubtitle::EPCTDownscale);
+ if (m_ePARCompensationType == CSimpleTextSubtitle::EPCTDownscale) {
+ m_PARCombo.SetCurSel(1);
+ }
+
+ m_PARCombo.InsertString(2, ResStr(IDS_RT_PAR_UPSCALE));
+ m_PARCombo.SetItemData(2, CSimpleTextSubtitle::EPCTUpscale);
+ if (m_ePARCompensationType == CSimpleTextSubtitle::EPCTUpscale) {
+ m_PARCombo.SetCurSel(2);
+ }
+
+ m_PARCombo.InsertString(3, ResStr(IDS_RT_PAR_ACCURATE_SIZE));
+ m_PARCombo.SetItemData(3, CSimpleTextSubtitle::EPCTAccurateSize);
+ if (m_ePARCompensationType == CSimpleTextSubtitle::EPCTAccurateSize) {
+ m_PARCombo.SetCurSel(3);
+ }
+ }
}
/* CDVSGeneralPPage */
CDVSGeneralPPage::CDVSGeneralPPage(LPUNKNOWN pUnk, HRESULT* phr) :
- CDVSBasePPage(NAME("DirectVobSub Property Page (global settings)"), pUnk, IDD_DVSGENERALPAGE, IDD_DVSGENERALPAGE)
+ CDVSBasePPage(NAME("DirectVobSub Property Page (global settings)"), pUnk, IDD_DVSGENERALPAGE, IDD_DVSGENERALPAGE)
{
- BindControl(IDC_VEREXTCOMBO, m_verext);
- BindControl(IDC_MOD32FIX, m_mod32fix);
- BindControl(IDC_RESX2COMBO, m_resx2);
- BindControl(IDC_SPIN3, m_resx2w);
- BindControl(IDC_SPIN4, m_resx2h);
- BindControl(IDC_LOADCOMBO, m_load);
- BindControl(IDC_EXTLOAD, m_extload);
- BindControl(IDC_WEBLOAD, m_webload);
- BindControl(IDC_EMBLOAD, m_embload);
+ BindControl(IDC_VEREXTCOMBO, m_verext);
+ BindControl(IDC_MOD32FIX, m_mod32fix);
+ BindControl(IDC_RESX2COMBO, m_resx2);
+ BindControl(IDC_SPIN3, m_resx2w);
+ BindControl(IDC_SPIN4, m_resx2h);
+ BindControl(IDC_LOADCOMBO, m_load);
+ BindControl(IDC_EXTLOAD, m_extload);
+ BindControl(IDC_WEBLOAD, m_webload);
+ BindControl(IDC_EMBLOAD, m_embload);
}
bool CDVSGeneralPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (uMsg) {
- case WM_COMMAND: {
- switch (HIWORD(wParam)) {
- case CBN_SELCHANGE: {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- if (LOWORD(wParam) == IDC_RESX2COMBO) {
- m_resx2w.EnableWindow(m_resx2.GetCurSel() == 2);
- m_resx2h.EnableWindow(m_resx2.GetCurSel() == 2);
- return true;
- } else if (LOWORD(wParam) == IDC_LOADCOMBO) {
- m_extload.EnableWindow(m_load.GetCurSel() == 1);
- m_webload.EnableWindow(m_load.GetCurSel() == 1);
- m_embload.EnableWindow(m_load.GetCurSel() == 1);
- return true;
- }
- }
- break;
- }
- }
- break;
- }
-
- return false;
+ switch (uMsg) {
+ case WM_COMMAND: {
+ switch (HIWORD(wParam)) {
+ case CBN_SELCHANGE: {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ if (LOWORD(wParam) == IDC_RESX2COMBO) {
+ m_resx2w.EnableWindow(m_resx2.GetCurSel() == 2);
+ m_resx2h.EnableWindow(m_resx2.GetCurSel() == 2);
+ return true;
+ } else if (LOWORD(wParam) == IDC_LOADCOMBO) {
+ m_extload.EnableWindow(m_load.GetCurSel() == 1);
+ m_webload.EnableWindow(m_load.GetCurSel() == 1);
+ m_embload.EnableWindow(m_load.GetCurSel() == 1);
+ return true;
+ }
+ }
+ break;
+ }
+ }
+ break;
+ }
+
+ return false;
}
void CDVSGeneralPPage::UpdateObjectData(bool fSave)
{
- if (fSave) {
- m_pDirectVobSub->put_ExtendPicture(m_HorExt, m_VerExt, m_ResX2, m_ResX2minw, m_ResX2minh);
- m_pDirectVobSub->put_LoadSettings(m_LoadLevel, m_fExternalLoad, m_fWebLoad, m_fEmbeddedLoad);
- } else {
- m_pDirectVobSub->get_ExtendPicture(&m_HorExt, &m_VerExt, &m_ResX2, &m_ResX2minw, &m_ResX2minh);
- m_pDirectVobSub->get_LoadSettings(&m_LoadLevel, &m_fExternalLoad, &m_fWebLoad, &m_fEmbeddedLoad);
- }
+ if (fSave) {
+ m_pDirectVobSub->put_ExtendPicture(m_HorExt, m_VerExt, m_ResX2, m_ResX2minw, m_ResX2minh);
+ m_pDirectVobSub->put_LoadSettings(m_LoadLevel, m_fExternalLoad, m_fWebLoad, m_fEmbeddedLoad);
+ } else {
+ m_pDirectVobSub->get_ExtendPicture(&m_HorExt, &m_VerExt, &m_ResX2, &m_ResX2minw, &m_ResX2minh);
+ m_pDirectVobSub->get_LoadSettings(&m_LoadLevel, &m_fExternalLoad, &m_fWebLoad, &m_fEmbeddedLoad);
+ }
}
void CDVSGeneralPPage::UpdateControlData(bool fSave)
{
- if (fSave) {
- if (m_verext.GetCurSel() >= 0) {
- m_VerExt = m_verext.GetItemData(m_verext.GetCurSel());
- }
- m_HorExt = !!m_mod32fix.GetCheck();
- if (m_resx2.GetCurSel() >= 0) {
- m_ResX2 = m_resx2.GetItemData(m_resx2.GetCurSel());
- }
- m_ResX2minw = m_resx2w.GetPos();
- m_ResX2minh = m_resx2h.GetPos();
- if (m_load.GetCurSel() >= 0) {
- m_LoadLevel = m_load.GetItemData(m_load.GetCurSel());
- }
- m_fExternalLoad = !!m_extload.GetCheck();
- m_fWebLoad = !!m_webload.GetCheck();
- m_fEmbeddedLoad = !!m_embload.GetCheck();
- } else {
- m_verext.ResetContent();
- m_verext.AddString(ResStr(IDS_ORGHEIGHT));
- m_verext.SetItemData(0, 0);
- m_verext.AddString(ResStr(IDS_EXTTO169));
- m_verext.SetItemData(1, 1);
- m_verext.AddString(ResStr(IDS_EXTTO43));
- m_verext.SetItemData(2, 2);
- m_verext.AddString(ResStr(IDS_EXTTO480));
- m_verext.SetItemData(3, 3);
- m_verext.AddString(ResStr(IDS_EXTTO576));
- m_verext.SetItemData(4, 4);
- m_verext.AddString(ResStr(IDS_CROPTO169));
- m_verext.SetItemData(5, 0x81);
- m_verext.AddString(ResStr(IDS_CROPTO43));
- m_verext.SetItemData(6, 0x82);
- m_verext.SetCurSel((m_VerExt&0x7f) + ((m_VerExt&0x80)?4:0));
- m_mod32fix.SetCheck(m_HorExt&1);
- m_resx2.ResetContent();
- m_resx2.AddString(ResStr(IDS_ORGRES));
- m_resx2.SetItemData(0, 0);
- m_resx2.AddString(ResStr(IDS_DBLRES));
- m_resx2.SetItemData(1, 1);
- m_resx2.AddString(ResStr(IDS_DBLRESIF));
- m_resx2.SetItemData(2, 2);
- m_resx2.SetCurSel(m_ResX2);
- m_resx2w.SetRange(0, 2048);
- m_resx2w.SetPos(m_ResX2minw);
- m_resx2w.EnableWindow(m_ResX2 == 2);
- m_resx2h.SetRange(0, 2048);
- m_resx2h.SetPos(m_ResX2minh);
- m_resx2h.EnableWindow(m_ResX2 == 2);
- m_load.ResetContent();
- m_load.AddString(ResStr(IDS_DONOTLOAD));
- m_load.SetItemData(0, 2);
- m_load.AddString(ResStr(IDS_LOADWHENNEEDED));
- m_load.SetItemData(1, 0);
- m_load.AddString(ResStr(IDS_ALWAYSLOAD));
- m_load.SetItemData(2, 1);
- m_load.SetCurSel(!m_LoadLevel?1:m_LoadLevel==1?2:0);
- m_extload.SetCheck(m_fExternalLoad);
- m_webload.SetCheck(m_fWebLoad);
- m_embload.SetCheck(m_fEmbeddedLoad);
- m_extload.EnableWindow(m_load.GetCurSel() == 1);
- m_webload.EnableWindow(m_load.GetCurSel() == 1);
- m_embload.EnableWindow(m_load.GetCurSel() == 1);
- }
+ if (fSave) {
+ if (m_verext.GetCurSel() >= 0) {
+ m_VerExt = m_verext.GetItemData(m_verext.GetCurSel());
+ }
+ m_HorExt = !!m_mod32fix.GetCheck();
+ if (m_resx2.GetCurSel() >= 0) {
+ m_ResX2 = m_resx2.GetItemData(m_resx2.GetCurSel());
+ }
+ m_ResX2minw = m_resx2w.GetPos();
+ m_ResX2minh = m_resx2h.GetPos();
+ if (m_load.GetCurSel() >= 0) {
+ m_LoadLevel = m_load.GetItemData(m_load.GetCurSel());
+ }
+ m_fExternalLoad = !!m_extload.GetCheck();
+ m_fWebLoad = !!m_webload.GetCheck();
+ m_fEmbeddedLoad = !!m_embload.GetCheck();
+ } else {
+ m_verext.ResetContent();
+ m_verext.AddString(ResStr(IDS_ORGHEIGHT));
+ m_verext.SetItemData(0, 0);
+ m_verext.AddString(ResStr(IDS_EXTTO169));
+ m_verext.SetItemData(1, 1);
+ m_verext.AddString(ResStr(IDS_EXTTO43));
+ m_verext.SetItemData(2, 2);
+ m_verext.AddString(ResStr(IDS_EXTTO480));
+ m_verext.SetItemData(3, 3);
+ m_verext.AddString(ResStr(IDS_EXTTO576));
+ m_verext.SetItemData(4, 4);
+ m_verext.AddString(ResStr(IDS_CROPTO169));
+ m_verext.SetItemData(5, 0x81);
+ m_verext.AddString(ResStr(IDS_CROPTO43));
+ m_verext.SetItemData(6, 0x82);
+ m_verext.SetCurSel((m_VerExt & 0x7f) + ((m_VerExt & 0x80) ? 4 : 0));
+ m_mod32fix.SetCheck(m_HorExt & 1);
+ m_resx2.ResetContent();
+ m_resx2.AddString(ResStr(IDS_ORGRES));
+ m_resx2.SetItemData(0, 0);
+ m_resx2.AddString(ResStr(IDS_DBLRES));
+ m_resx2.SetItemData(1, 1);
+ m_resx2.AddString(ResStr(IDS_DBLRESIF));
+ m_resx2.SetItemData(2, 2);
+ m_resx2.SetCurSel(m_ResX2);
+ m_resx2w.SetRange(0, 2048);
+ m_resx2w.SetPos(m_ResX2minw);
+ m_resx2w.EnableWindow(m_ResX2 == 2);
+ m_resx2h.SetRange(0, 2048);
+ m_resx2h.SetPos(m_ResX2minh);
+ m_resx2h.EnableWindow(m_ResX2 == 2);
+ m_load.ResetContent();
+ m_load.AddString(ResStr(IDS_DONOTLOAD));
+ m_load.SetItemData(0, 2);
+ m_load.AddString(ResStr(IDS_LOADWHENNEEDED));
+ m_load.SetItemData(1, 0);
+ m_load.AddString(ResStr(IDS_ALWAYSLOAD));
+ m_load.SetItemData(2, 1);
+ m_load.SetCurSel(!m_LoadLevel ? 1 : m_LoadLevel == 1 ? 2 : 0);
+ m_extload.SetCheck(m_fExternalLoad);
+ m_webload.SetCheck(m_fWebLoad);
+ m_embload.SetCheck(m_fEmbeddedLoad);
+ m_extload.EnableWindow(m_load.GetCurSel() == 1);
+ m_webload.EnableWindow(m_load.GetCurSel() == 1);
+ m_embload.EnableWindow(m_load.GetCurSel() == 1);
+ }
}
/* CDVSMiscPPage */
CDVSMiscPPage::CDVSMiscPPage(LPUNKNOWN pUnk, HRESULT* phr) :
- CDVSBasePPage(NAME("DirectVobSub Property Page (misc settings)"), pUnk, IDD_DVSMISCPAGE, IDD_DVSMISCPAGE)
+ CDVSBasePPage(NAME("DirectVobSub Property Page (misc settings)"), pUnk, IDD_DVSMISCPAGE, IDD_DVSMISCPAGE)
{
- BindControl(IDC_FLIP, m_flippic);
- BindControl(IDC_FLIPSUB, m_flipsub);
- BindControl(IDC_HIDE, m_hidesub);
- BindControl(IDC_SHOWOSDSTATS, m_showosd);
- BindControl(IDC_PREBUFFERING, m_subpicttobuff);
- BindControl(IDC_ANIMWHENBUFFERING, m_animwhenbuff);
- BindControl(IDC_AUTORELOAD, m_autoreload);
- BindControl(IDC_SAVEFULLPATH, m_savefullpath);
- BindControl(IDC_INSTANTUPDATE, m_instupd);
+ BindControl(IDC_FLIP, m_flippic);
+ BindControl(IDC_FLIPSUB, m_flipsub);
+ BindControl(IDC_HIDE, m_hidesub);
+ BindControl(IDC_SHOWOSDSTATS, m_showosd);
+ BindControl(IDC_PREBUFFERING, m_subpicttobuff);
+ BindControl(IDC_ANIMWHENBUFFERING, m_animwhenbuff);
+ BindControl(IDC_AUTORELOAD, m_autoreload);
+ BindControl(IDC_SAVEFULLPATH, m_savefullpath);
+ BindControl(IDC_INSTANTUPDATE, m_instupd);
}
bool CDVSMiscPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (uMsg) {
- case WM_COMMAND: {
- switch (HIWORD(wParam)) {
- case BN_CLICKED: {
- if (LOWORD(wParam) == IDC_INSTANTUPDATE) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_INSTANTUPDATE), !!m_instupd.GetCheck());
- return true;
- }
- }
- break;
- }
- }
- break;
- }
-
- return false;
+ switch (uMsg) {
+ case WM_COMMAND: {
+ switch (HIWORD(wParam)) {
+ case BN_CLICKED: {
+ if (LOWORD(wParam) == IDC_INSTANTUPDATE) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_INSTANTUPDATE), !!m_instupd.GetCheck());
+ return true;
+ }
+ }
+ break;
+ }
+ }
+ break;
+ }
+
+ return false;
}
void CDVSMiscPPage::UpdateObjectData(bool fSave)
{
- if (fSave) {
- m_pDirectVobSub->put_Flip(m_fFlipPicture, m_fFlipSubtitles);
- m_pDirectVobSub->put_HideSubtitles(m_fHideSubtitles);
- m_pDirectVobSub->put_OSD(m_fOSD);
- m_pDirectVobSub->put_SubPictToBuffer(m_uSubPictToBuffer);
- m_pDirectVobSub->put_AnimWhenBuffering(m_fAnimWhenBuffering);
- m_pDirectVobSub->put_SubtitleReloader(m_fReloaderDisabled);
- m_pDirectVobSub->put_SaveFullPath(m_fSaveFullPath);
- } else {
- m_pDirectVobSub->get_Flip(&m_fFlipPicture, &m_fFlipSubtitles);
- m_pDirectVobSub->get_HideSubtitles(&m_fHideSubtitles);
- m_pDirectVobSub->get_OSD(&m_fOSD);
- m_pDirectVobSub->get_SubPictToBuffer(&m_uSubPictToBuffer);
- m_pDirectVobSub->get_AnimWhenBuffering(&m_fAnimWhenBuffering);
- m_pDirectVobSub->get_SubtitleReloader(&m_fReloaderDisabled);
- m_pDirectVobSub->get_SaveFullPath(&m_fSaveFullPath);
- }
+ if (fSave) {
+ m_pDirectVobSub->put_Flip(m_fFlipPicture, m_fFlipSubtitles);
+ m_pDirectVobSub->put_HideSubtitles(m_fHideSubtitles);
+ m_pDirectVobSub->put_OSD(m_fOSD);
+ m_pDirectVobSub->put_SubPictToBuffer(m_uSubPictToBuffer);
+ m_pDirectVobSub->put_AnimWhenBuffering(m_fAnimWhenBuffering);
+ m_pDirectVobSub->put_SubtitleReloader(m_fReloaderDisabled);
+ m_pDirectVobSub->put_SaveFullPath(m_fSaveFullPath);
+ } else {
+ m_pDirectVobSub->get_Flip(&m_fFlipPicture, &m_fFlipSubtitles);
+ m_pDirectVobSub->get_HideSubtitles(&m_fHideSubtitles);
+ m_pDirectVobSub->get_OSD(&m_fOSD);
+ m_pDirectVobSub->get_SubPictToBuffer(&m_uSubPictToBuffer);
+ m_pDirectVobSub->get_AnimWhenBuffering(&m_fAnimWhenBuffering);
+ m_pDirectVobSub->get_SubtitleReloader(&m_fReloaderDisabled);
+ m_pDirectVobSub->get_SaveFullPath(&m_fSaveFullPath);
+ }
}
void CDVSMiscPPage::UpdateControlData(bool fSave)
{
- if (fSave) {
- m_fFlipPicture = !!m_flippic.GetCheck();
- m_fFlipSubtitles = !!m_flipsub.GetCheck();
- m_fHideSubtitles = !!m_hidesub.GetCheck();
- m_fSaveFullPath = !!m_savefullpath.GetCheck();
- m_uSubPictToBuffer = m_subpicttobuff.GetPos();
- m_fAnimWhenBuffering = !!m_animwhenbuff.GetCheck();
- m_fOSD = !!m_showosd.GetCheck();
- m_fReloaderDisabled = !m_autoreload.GetCheck();
- } else {
- m_flippic.SetCheck(m_fFlipPicture);
- m_flipsub.SetCheck(m_fFlipSubtitles);
- m_hidesub.SetCheck(m_fHideSubtitles);
- m_savefullpath.SetCheck(m_fSaveFullPath);
- m_subpicttobuff.SetPos(m_uSubPictToBuffer);
- m_subpicttobuff.SetRange(0, 60);
- m_animwhenbuff.SetCheck(m_fAnimWhenBuffering);
- m_showosd.SetCheck(m_fOSD);
- m_autoreload.SetCheck(!m_fReloaderDisabled);
- m_instupd.SetCheck(!!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_INSTANTUPDATE), 1));
- }
+ if (fSave) {
+ m_fFlipPicture = !!m_flippic.GetCheck();
+ m_fFlipSubtitles = !!m_flipsub.GetCheck();
+ m_fHideSubtitles = !!m_hidesub.GetCheck();
+ m_fSaveFullPath = !!m_savefullpath.GetCheck();
+ m_uSubPictToBuffer = m_subpicttobuff.GetPos();
+ m_fAnimWhenBuffering = !!m_animwhenbuff.GetCheck();
+ m_fOSD = !!m_showosd.GetCheck();
+ m_fReloaderDisabled = !m_autoreload.GetCheck();
+ } else {
+ m_flippic.SetCheck(m_fFlipPicture);
+ m_flipsub.SetCheck(m_fFlipSubtitles);
+ m_hidesub.SetCheck(m_fHideSubtitles);
+ m_savefullpath.SetCheck(m_fSaveFullPath);
+ m_subpicttobuff.SetPos(m_uSubPictToBuffer);
+ m_subpicttobuff.SetRange(0, 60);
+ m_animwhenbuff.SetCheck(m_fAnimWhenBuffering);
+ m_showosd.SetCheck(m_fOSD);
+ m_autoreload.SetCheck(!m_fReloaderDisabled);
+ m_instupd.SetCheck(!!theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_INSTANTUPDATE), 1));
+ }
}
/* CDVSTimingPPage */
CDVSTimingPPage::CDVSTimingPPage(LPUNKNOWN pUnk, HRESULT* phr) :
- CDVSBasePPage(NAME("DirectVobSub Timing Property Page"), pUnk, IDD_DVSTIMINGPAGE, IDD_DVSTIMINGPAGE)
+ CDVSBasePPage(NAME("DirectVobSub Timing Property Page"), pUnk, IDD_DVSTIMINGPAGE, IDD_DVSTIMINGPAGE)
{
- BindControl(IDC_MODFPS, m_modfps);
- BindControl(IDC_FPS, m_fps);
- BindControl(IDC_SPIN5, m_subdelay);
- BindControl(IDC_SPIN6, m_subspeedmul);
- BindControl(IDC_SPIN9, m_subspeeddiv);
+ BindControl(IDC_MODFPS, m_modfps);
+ BindControl(IDC_FPS, m_fps);
+ BindControl(IDC_SPIN5, m_subdelay);
+ BindControl(IDC_SPIN6, m_subspeedmul);
+ BindControl(IDC_SPIN9, m_subspeeddiv);
}
bool CDVSTimingPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (uMsg) {
- case WM_COMMAND: {
- switch (HIWORD(wParam)) {
- case BN_CLICKED: {
- if (LOWORD(wParam) == IDC_MODFPS) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
- m_fps.EnableWindow(!!m_modfps.GetCheck());
- return true;
- }
- }
- break;
- }
- }
- break;
- }
-
- return false;
+ switch (uMsg) {
+ case WM_COMMAND: {
+ switch (HIWORD(wParam)) {
+ case BN_CLICKED: {
+ if (LOWORD(wParam) == IDC_MODFPS) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ m_fps.EnableWindow(!!m_modfps.GetCheck());
+ return true;
+ }
+ }
+ break;
+ }
+ }
+ break;
+ }
+
+ return false;
}
void CDVSTimingPPage::UpdateObjectData(bool fSave)
{
- if (fSave) {
- m_pDirectVobSub->put_SubtitleTiming(m_SubtitleDelay, m_SubtitleSpeedMul, m_SubtitleSpeedDiv);
- m_pDirectVobSub->put_MediaFPS(m_fMediaFPSEnabled, m_MediaFPS);
- } else {
- m_pDirectVobSub->get_SubtitleTiming(&m_SubtitleDelay, &m_SubtitleSpeedMul, &m_SubtitleSpeedDiv);
- m_pDirectVobSub->get_MediaFPS(&m_fMediaFPSEnabled, &m_MediaFPS);
- }
+ if (fSave) {
+ m_pDirectVobSub->put_SubtitleTiming(m_SubtitleDelay, m_SubtitleSpeedMul, m_SubtitleSpeedDiv);
+ m_pDirectVobSub->put_MediaFPS(m_fMediaFPSEnabled, m_MediaFPS);
+ } else {
+ m_pDirectVobSub->get_SubtitleTiming(&m_SubtitleDelay, &m_SubtitleSpeedMul, &m_SubtitleSpeedDiv);
+ m_pDirectVobSub->get_MediaFPS(&m_fMediaFPSEnabled, &m_MediaFPS);
+ }
}
void CDVSTimingPPage::UpdateControlData(bool fSave)
{
- if (fSave) {
- m_fMediaFPSEnabled = !!m_modfps.GetCheck();
- CString fpsstr;
- m_fps.GetWindowText(fpsstr);
- float fps;
- if (_stscanf_s(fpsstr, _T("%f"), &fps) == 1) {
- m_MediaFPS = fps;
- }
- m_SubtitleDelay = m_subdelay.GetPos32();
- m_SubtitleSpeedMul = m_subspeedmul.GetPos32();
- m_SubtitleSpeedDiv = m_subspeeddiv.GetPos32();
- } else {
- m_modfps.SetCheck(m_fMediaFPSEnabled);
- CString fpsstr;
- fpsstr.Format(_T("%.4f"), m_MediaFPS);
- m_fps.SetWindowText(fpsstr);
- m_fps.EnableWindow(m_fMediaFPSEnabled);
- m_subdelay.SetRange32(-180*60*1000, 180*60*1000);
- m_subspeedmul.SetRange32(0, 1000000);
- m_subspeeddiv.SetRange32(1, 1000000);
- m_subdelay.SetPos32(m_SubtitleDelay);
- m_subspeedmul.SetPos32(m_SubtitleSpeedMul);
- m_subspeeddiv.SetPos32(m_SubtitleSpeedDiv);
- }
+ if (fSave) {
+ m_fMediaFPSEnabled = !!m_modfps.GetCheck();
+ CString fpsstr;
+ m_fps.GetWindowText(fpsstr);
+ float fps;
+ if (_stscanf_s(fpsstr, _T("%f"), &fps) == 1) {
+ m_MediaFPS = fps;
+ }
+ m_SubtitleDelay = m_subdelay.GetPos32();
+ m_SubtitleSpeedMul = m_subspeedmul.GetPos32();
+ m_SubtitleSpeedDiv = m_subspeeddiv.GetPos32();
+ } else {
+ m_modfps.SetCheck(m_fMediaFPSEnabled);
+ CString fpsstr;
+ fpsstr.Format(_T("%.4f"), m_MediaFPS);
+ m_fps.SetWindowText(fpsstr);
+ m_fps.EnableWindow(m_fMediaFPSEnabled);
+ m_subdelay.SetRange32(-180 * 60 * 1000, 180 * 60 * 1000);
+ m_subspeedmul.SetRange32(0, 1000000);
+ m_subspeeddiv.SetRange32(1, 1000000);
+ m_subdelay.SetPos32(m_SubtitleDelay);
+ m_subspeedmul.SetPos32(m_SubtitleSpeedMul);
+ m_subspeeddiv.SetPos32(m_SubtitleSpeedDiv);
+ }
}
/* CDVSAboutPPage */
CDVSAboutPPage::CDVSAboutPPage(LPUNKNOWN lpunk, HRESULT* phr) :
- CDVSBasePPage(NAME("About Property Page"), lpunk, IDD_DVSABOUTPAGE, IDD_DVSABOUTPAGE)
+ CDVSBasePPage(NAME("About Property Page"), lpunk, IDD_DVSABOUTPAGE, IDD_DVSABOUTPAGE)
{
}
bool CDVSAboutPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (uMsg) {
- case WM_INITDIALOG: {
- SetDlgItemTextA(m_Dlg, IDC_VERSION, "DirectVobSub 2.41."MAKE_STR(MPC_VERSION_REV)" "MPC_VERSION_ARCH"\nCopyright 2001-2012 MPC-HC Team");
- }
- break;
- case WM_COMMAND: {
- switch (HIWORD(wParam)) {
- case BN_CLICKED: {
- if (LOWORD(wParam) == IDC_HOMEPAGEBTN) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
- ShellExecute(m_Dlg, _T("open"), ResStr(IDS_URL_HOMEPAGE), NULL, NULL, SW_SHOWNORMAL);
- return true;
- } else if (LOWORD(wParam) == IDC_BUGREPORTBTN) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
- ShellExecute(m_Dlg, _T("open"), ResStr(IDS_URL_EMAIL), NULL, NULL, SW_SHOWNORMAL);
- return true;
- }
- }
- break;
- }
- }
- break;
- }
-
- return false;
+ switch (uMsg) {
+ case WM_INITDIALOG: {
+ SetDlgItemTextA(m_Dlg, IDC_VERSION, "DirectVobSub 2.41."MAKE_STR(MPC_VERSION_REV)" "MPC_VERSION_ARCH"\nCopyright 2001-2012 MPC-HC Team");
+ }
+ break;
+ case WM_COMMAND: {
+ switch (HIWORD(wParam)) {
+ case BN_CLICKED: {
+ if (LOWORD(wParam) == IDC_HOMEPAGEBTN) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ ShellExecute(m_Dlg, _T("open"), ResStr(IDS_URL_HOMEPAGE), NULL, NULL, SW_SHOWNORMAL);
+ return true;
+ } else if (LOWORD(wParam) == IDC_BUGREPORTBTN) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ ShellExecute(m_Dlg, _T("open"), ResStr(IDS_URL_EMAIL), NULL, NULL, SW_SHOWNORMAL);
+ return true;
+ }
+ }
+ break;
+ }
+ }
+ break;
+ }
+
+ return false;
}
/* CDVSZoomPPage */
CDVSZoomPPage::CDVSZoomPPage(LPUNKNOWN pUnk, HRESULT* phr) :
- CDVSBasePPage(NAME("DirectVobSub Zoom Property Page"), pUnk, IDD_DVSZOOMPAGE, IDD_DVSZOOMPAGE)
+ CDVSBasePPage(NAME("DirectVobSub Zoom Property Page"), pUnk, IDD_DVSZOOMPAGE, IDD_DVSZOOMPAGE)
{
- BindControl(IDC_SPIN1, m_posx);
- BindControl(IDC_SPIN2, m_posy);
- BindControl(IDC_SPIN7, m_scalex);
- BindControl(IDC_SPIN8, m_scaley);
+ BindControl(IDC_SPIN1, m_posx);
+ BindControl(IDC_SPIN2, m_posy);
+ BindControl(IDC_SPIN7, m_scalex);
+ BindControl(IDC_SPIN8, m_scaley);
}
bool CDVSZoomPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (uMsg) {
- case WM_COMMAND: {
- switch (HIWORD(wParam)) {
- case EN_CHANGE: {
- if (LOWORD(wParam) == IDC_EDIT1 || LOWORD(wParam) == IDC_EDIT2
- || LOWORD(wParam) == IDC_EDIT7 || LOWORD(wParam) == IDC_EDIT8) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
- UpdateControlData(true);
- UpdateObjectData(true);
- return true;
- }
- }
-
- break;
- }
- }
- break;
- }
-
- return false;
+ switch (uMsg) {
+ case WM_COMMAND: {
+ switch (HIWORD(wParam)) {
+ case EN_CHANGE: {
+ if (LOWORD(wParam) == IDC_EDIT1 || LOWORD(wParam) == IDC_EDIT2
+ || LOWORD(wParam) == IDC_EDIT7 || LOWORD(wParam) == IDC_EDIT8) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ UpdateControlData(true);
+ UpdateObjectData(true);
+ return true;
+ }
+ }
+
+ break;
+ }
+ }
+ break;
+ }
+
+ return false;
}
void CDVSZoomPPage::UpdateControlData(bool fSave)
{
- if (fSave) {
- m_rect.left = 1.0f * (short)m_posx.GetPos() / 100;
- m_rect.top = 1.0f * (short)m_posy.GetPos() / 100;
- m_rect.right = m_rect.left + 1.0f * (short)m_scalex.GetPos() / 100;
- m_rect.bottom = m_rect.top + 1.0f * (short)m_scaley.GetPos() / 100;
- } else {
- m_posx.SetRange(-100, 100);
- m_posx.SetPos((int)(m_rect.left*100));
- m_posy.SetRange(-100, 100);
- m_posy.SetPos((int)(m_rect.top*100));
- m_scalex.SetRange(-300, 300);
- m_scalex.SetPos((int)((m_rect.right-m_rect.left)*100));
- m_scaley.SetRange(-300, 300);
- m_scaley.SetPos((int)((m_rect.bottom-m_rect.top)*100));
- }
+ if (fSave) {
+ m_rect.left = 1.0f * (short)m_posx.GetPos() / 100;
+ m_rect.top = 1.0f * (short)m_posy.GetPos() / 100;
+ m_rect.right = m_rect.left + 1.0f * (short)m_scalex.GetPos() / 100;
+ m_rect.bottom = m_rect.top + 1.0f * (short)m_scaley.GetPos() / 100;
+ } else {
+ m_posx.SetRange(-100, 100);
+ m_posx.SetPos((int)(m_rect.left * 100));
+ m_posy.SetRange(-100, 100);
+ m_posy.SetPos((int)(m_rect.top * 100));
+ m_scalex.SetRange(-300, 300);
+ m_scalex.SetPos((int)((m_rect.right - m_rect.left) * 100));
+ m_scaley.SetRange(-300, 300);
+ m_scaley.SetPos((int)((m_rect.bottom - m_rect.top) * 100));
+ }
}
void CDVSZoomPPage::UpdateObjectData(bool fSave)
{
- if (fSave) {
- m_pDirectVobSub->put_ZoomRect(&m_rect);
- } else {
- m_pDirectVobSub->get_ZoomRect(&m_rect);
- }
+ if (fSave) {
+ m_pDirectVobSub->put_ZoomRect(&m_rect);
+ } else {
+ m_pDirectVobSub->get_ZoomRect(&m_rect);
+ }
}
// TODO: Make CDVSColorPPage and CDVSPathsPPage use an interface on DirectVobSub instead of the registry to communicate
@@ -855,294 +855,294 @@ void CDVSZoomPPage::UpdateObjectData(bool fSave)
/* CDVSColorPPage */
CDVSColorPPage::CDVSColorPPage(LPUNKNOWN pUnk, HRESULT* phr) :
- CDVSBasePPage(NAME("DirectVobSub Color Property Page"), pUnk, IDD_DVSCOLORPAGE, IDD_DVSCOLORPAGE)
+ CDVSBasePPage(NAME("DirectVobSub Color Property Page"), pUnk, IDD_DVSCOLORPAGE, IDD_DVSCOLORPAGE)
{
- BindControl(IDC_PREFLIST, m_preflist);
- BindControl(IDC_DYNCHGLIST, m_dynchglist);
- BindControl(IDC_FORCERGBCHK, m_forcergb);
+ BindControl(IDC_PREFLIST, m_preflist);
+ BindControl(IDC_DYNCHGLIST, m_dynchglist);
+ BindControl(IDC_FORCERGBCHK, m_forcergb);
- m_fDisableInstantUpdate = true;
+ m_fDisableInstantUpdate = true;
}
bool CDVSColorPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (uMsg) {
- case WM_COMMAND: {
- switch (HIWORD(wParam)) {
- case LBN_DBLCLK:
- if ((HWND)lParam == m_dynchglist.m_hWnd) {
- int old = -1;
- m_pDirectVobSub->get_ColorFormat(&old);
- if (FAILED(m_pDirectVobSub->put_ColorFormat(m_dynchglist.GetCurSel()))) {
- m_dynchglist.SetCurSel(old);
- }
-
- return true;
- }
- break;
-
- case BN_CLICKED: {
- switch (LOWORD(wParam)) {
- case IDC_COLORCHANGE: {
- int old = -1;
- m_pDirectVobSub->get_ColorFormat(&old);
- if (FAILED(m_pDirectVobSub->put_ColorFormat(m_dynchglist.GetCurSel()))) {
- m_dynchglist.SetCurSel(old);
- }
-
- return true;
- }
- case IDC_COLORUP: {
- int sel = m_preflist.GetCurSel();
- if (sel > 0) {
- CString str;
- m_preflist.GetText(sel, str);
- int iPos = (int)m_preflist.GetItemData(sel);
- m_preflist.DeleteString(sel);
- sel--;
- m_preflist.InsertString(sel, str);
- m_preflist.SetItemData(sel, iPos);
- m_preflist.SetCurSel(sel);
- }
-
- return true;
- }
- case IDC_COLORDOWN: {
- int sel = m_preflist.GetCurSel();
- if (sel >= 0 && sel < m_preflist.GetCount()-1) {
- CString str;
- m_preflist.GetText(sel, str);
- int iPos = (int)m_preflist.GetItemData(sel);
- m_preflist.DeleteString(sel);
- sel++;
- m_preflist.InsertString(sel, str);
- m_preflist.SetItemData(sel, iPos);
- m_preflist.SetCurSel(sel);
- }
-
- return true;
- }
- }
- }
- break;
- }
- }
- break;
- }
-
- return false;
+ switch (uMsg) {
+ case WM_COMMAND: {
+ switch (HIWORD(wParam)) {
+ case LBN_DBLCLK:
+ if ((HWND)lParam == m_dynchglist.m_hWnd) {
+ int old = -1;
+ m_pDirectVobSub->get_ColorFormat(&old);
+ if (FAILED(m_pDirectVobSub->put_ColorFormat(m_dynchglist.GetCurSel()))) {
+ m_dynchglist.SetCurSel(old);
+ }
+
+ return true;
+ }
+ break;
+
+ case BN_CLICKED: {
+ switch (LOWORD(wParam)) {
+ case IDC_COLORCHANGE: {
+ int old = -1;
+ m_pDirectVobSub->get_ColorFormat(&old);
+ if (FAILED(m_pDirectVobSub->put_ColorFormat(m_dynchglist.GetCurSel()))) {
+ m_dynchglist.SetCurSel(old);
+ }
+
+ return true;
+ }
+ case IDC_COLORUP: {
+ int sel = m_preflist.GetCurSel();
+ if (sel > 0) {
+ CString str;
+ m_preflist.GetText(sel, str);
+ int iPos = (int)m_preflist.GetItemData(sel);
+ m_preflist.DeleteString(sel);
+ sel--;
+ m_preflist.InsertString(sel, str);
+ m_preflist.SetItemData(sel, iPos);
+ m_preflist.SetCurSel(sel);
+ }
+
+ return true;
+ }
+ case IDC_COLORDOWN: {
+ int sel = m_preflist.GetCurSel();
+ if (sel >= 0 && sel < m_preflist.GetCount() - 1) {
+ CString str;
+ m_preflist.GetText(sel, str);
+ int iPos = (int)m_preflist.GetItemData(sel);
+ m_preflist.DeleteString(sel);
+ sel++;
+ m_preflist.InsertString(sel, str);
+ m_preflist.SetItemData(sel, iPos);
+ m_preflist.SetCurSel(sel);
+ }
+
+ return true;
+ }
+ }
+ }
+ break;
+ }
+ }
+ break;
+ }
+
+ return false;
}
void CDVSColorPPage::UpdateObjectData(bool fSave)
{
- if (fSave) {
- } else {
- }
+ if (fSave) {
+ } else {
+ }
}
void CDVSColorPPage::UpdateControlData(bool fSave)
{
- if (fSave) {
- if ((UINT)m_preflist.GetCount() == VIHSIZE) {
- BYTE* pData = DNew BYTE[VIHSIZE];
-
- for (ptrdiff_t i = 0; i < m_preflist.GetCount(); i++) {
- pData[i] = (BYTE)m_preflist.GetItemData(i);
- }
-
- theApp.WriteProfileBinary(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_COLORFORMATS), pData, VIHSIZE);
-
- delete [] pData;
- } else {
- ASSERT(0);
- }
-
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FORCERGB), !!m_forcergb.GetCheck());
- } else {
- m_preflist.ResetContent();
- m_dynchglist.ResetContent();
-
- BYTE* pData = NULL;
- UINT nSize;
-
- if (!theApp.GetProfileBinary(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_COLORFORMATS), &pData, &nSize)
- || !pData || nSize != VIHSIZE) {
- if (pData) {
- delete [] pData, pData = NULL;
- }
-
- nSize = VIHSIZE;
- pData = DNew BYTE[VIHSIZE];
- for (size_t i = 0; i < VIHSIZE; i++) {
- pData[i] = i;
- }
- }
-
- if (pData) {
- for (ptrdiff_t i = 0; i < (int)nSize; i++) {
- m_dynchglist.AddString(VIH2String(pData[i]));
- m_dynchglist.SetItemData(i, pData[i]);
- m_preflist.AddString(VIH2String(pData[i]));
- m_preflist.SetItemData(i, pData[i]);
- }
-
- int iPosition = -1;
- m_pDirectVobSub->get_ColorFormat(&iPosition);
- m_dynchglist.SetCurSel(iPosition);
-
- delete [] pData;
- }
-
- m_forcergb.SetCheck(theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FORCERGB), 0)?BST_CHECKED:BST_UNCHECKED);
- }
+ if (fSave) {
+ if ((UINT)m_preflist.GetCount() == VIHSIZE) {
+ BYTE* pData = DNew BYTE[VIHSIZE];
+
+ for (ptrdiff_t i = 0; i < m_preflist.GetCount(); i++) {
+ pData[i] = (BYTE)m_preflist.GetItemData(i);
+ }
+
+ theApp.WriteProfileBinary(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_COLORFORMATS), pData, VIHSIZE);
+
+ delete [] pData;
+ } else {
+ ASSERT(0);
+ }
+
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FORCERGB), !!m_forcergb.GetCheck());
+ } else {
+ m_preflist.ResetContent();
+ m_dynchglist.ResetContent();
+
+ BYTE* pData = NULL;
+ UINT nSize;
+
+ if (!theApp.GetProfileBinary(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_COLORFORMATS), &pData, &nSize)
+ || !pData || nSize != VIHSIZE) {
+ if (pData) {
+ delete [] pData, pData = NULL;
+ }
+
+ nSize = VIHSIZE;
+ pData = DNew BYTE[VIHSIZE];
+ for (size_t i = 0; i < VIHSIZE; i++) {
+ pData[i] = i;
+ }
+ }
+
+ if (pData) {
+ for (ptrdiff_t i = 0; i < (int)nSize; i++) {
+ m_dynchglist.AddString(VIH2String(pData[i]));
+ m_dynchglist.SetItemData(i, pData[i]);
+ m_preflist.AddString(VIH2String(pData[i]));
+ m_preflist.SetItemData(i, pData[i]);
+ }
+
+ int iPosition = -1;
+ m_pDirectVobSub->get_ColorFormat(&iPosition);
+ m_dynchglist.SetCurSel(iPosition);
+
+ delete [] pData;
+ }
+
+ m_forcergb.SetCheck(theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_FORCERGB), 0) ? BST_CHECKED : BST_UNCHECKED);
+ }
}
/* CDVSPathsPPage */
CDVSPathsPPage::CDVSPathsPPage(LPUNKNOWN pUnk, HRESULT* phr) :
- CDVSBasePPage(NAME("DirectVobSub Paths Property Page"), pUnk, IDD_DVSPATHSPAGE, IDD_DVSPATHSPAGE)
+ CDVSBasePPage(NAME("DirectVobSub Paths Property Page"), pUnk, IDD_DVSPATHSPAGE, IDD_DVSPATHSPAGE)
{
- BindControl(IDC_PATHLIST, m_pathlist);
- BindControl(IDC_PATHEDIT, m_path);
- BindControl(IDC_BROWSE, m_browse);
- BindControl(IDC_REMOVE, m_remove);
- BindControl(IDC_ADD, m_add);
+ BindControl(IDC_PATHLIST, m_pathlist);
+ BindControl(IDC_PATHEDIT, m_path);
+ BindControl(IDC_BROWSE, m_browse);
+ BindControl(IDC_REMOVE, m_remove);
+ BindControl(IDC_ADD, m_add);
- m_fDisableInstantUpdate = true;
+ m_fDisableInstantUpdate = true;
}
bool CDVSPathsPPage::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- switch (uMsg) {
- case WM_COMMAND: {
- switch (HIWORD(wParam)) {
- case LBN_SELCHANGE:
- if ((HWND)lParam == m_pathlist.m_hWnd) {
- int i = m_pathlist.GetCurSel();
- m_remove.EnableWindow(i >= 3 ? TRUE : FALSE);
- if (i >= 0) {
- CString path;
- m_pathlist.GetText(i, path);
- m_path.SetWindowText(path);
- }
- return true;
- }
- break;
-
- case LBN_SELCANCEL:
- if ((HWND)lParam == m_pathlist.m_hWnd) {
- m_remove.EnableWindow(FALSE);
- return true;
- }
- break;
-
- case BN_CLICKED: {
- switch (LOWORD(wParam)) {
- case IDC_BROWSE: {
- TCHAR pathbuff[_MAX_PATH];
-
- BROWSEINFO bi;
- bi.hwndOwner = m_Dlg;
- bi.pidlRoot = NULL;
- bi.pszDisplayName = pathbuff;
- bi.lpszTitle = _T("");
- bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_EDITBOX | BIF_VALIDATE | BIF_USENEWUI;
- bi.lpfn = NULL;
- bi.lParam = 0;
- bi.iImage = 0;
-
- LPITEMIDLIST iil = SHBrowseForFolder(&bi);
- if (iil) {
- SHGetPathFromIDList(iil, pathbuff);
- m_path.SetWindowText(pathbuff);
- }
-
- return true;
- }
- break;
-
- case IDC_REMOVE: {
- int i = m_pathlist.GetCurSel();
- if (i >= 0) {
- m_pathlist.DeleteString(i);
- i = min(i, m_pathlist.GetCount()-1);
- if (i >= 0 && m_pathlist.GetCount() > 0) {
- m_pathlist.SetCurSel(i);
- m_remove.EnableWindow(i >= 3 ? TRUE : FALSE);
- }
- }
-
- return true;
- }
- break;
-
- case IDC_ADD: {
- CString path;
- m_path.GetWindowText(path);
- if (!path.IsEmpty() && m_pathlist.FindString(-1, path) < 0) {
- m_pathlist.AddString(path);
- }
-
- return true;
- }
- break;
- }
- }
- break;
- }
- }
- break;
- }
-
- return false;
+ switch (uMsg) {
+ case WM_COMMAND: {
+ switch (HIWORD(wParam)) {
+ case LBN_SELCHANGE:
+ if ((HWND)lParam == m_pathlist.m_hWnd) {
+ int i = m_pathlist.GetCurSel();
+ m_remove.EnableWindow(i >= 3 ? TRUE : FALSE);
+ if (i >= 0) {
+ CString path;
+ m_pathlist.GetText(i, path);
+ m_path.SetWindowText(path);
+ }
+ return true;
+ }
+ break;
+
+ case LBN_SELCANCEL:
+ if ((HWND)lParam == m_pathlist.m_hWnd) {
+ m_remove.EnableWindow(FALSE);
+ return true;
+ }
+ break;
+
+ case BN_CLICKED: {
+ switch (LOWORD(wParam)) {
+ case IDC_BROWSE: {
+ TCHAR pathbuff[_MAX_PATH];
+
+ BROWSEINFO bi;
+ bi.hwndOwner = m_Dlg;
+ bi.pidlRoot = NULL;
+ bi.pszDisplayName = pathbuff;
+ bi.lpszTitle = _T("");
+ bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_EDITBOX | BIF_VALIDATE | BIF_USENEWUI;
+ bi.lpfn = NULL;
+ bi.lParam = 0;
+ bi.iImage = 0;
+
+ LPITEMIDLIST iil = SHBrowseForFolder(&bi);
+ if (iil) {
+ SHGetPathFromIDList(iil, pathbuff);
+ m_path.SetWindowText(pathbuff);
+ }
+
+ return true;
+ }
+ break;
+
+ case IDC_REMOVE: {
+ int i = m_pathlist.GetCurSel();
+ if (i >= 0) {
+ m_pathlist.DeleteString(i);
+ i = min(i, m_pathlist.GetCount() - 1);
+ if (i >= 0 && m_pathlist.GetCount() > 0) {
+ m_pathlist.SetCurSel(i);
+ m_remove.EnableWindow(i >= 3 ? TRUE : FALSE);
+ }
+ }
+
+ return true;
+ }
+ break;
+
+ case IDC_ADD: {
+ CString path;
+ m_path.GetWindowText(path);
+ if (!path.IsEmpty() && m_pathlist.FindString(-1, path) < 0) {
+ m_pathlist.AddString(path);
+ }
+
+ return true;
+ }
+ break;
+ }
+ }
+ break;
+ }
+ }
+ break;
+ }
+
+ return false;
}
void CDVSPathsPPage::UpdateObjectData(bool fSave)
{
- if (fSave) {
- CString chk(_T("123456789")), path, tmp;
- int i = 0;
- do {
- tmp.Format(IDS_RP_PATH, i++);
- path = theApp.GetProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp, chk);
- if (path != chk) {
- theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp, _T(""));
- }
- } while (path != chk);
-
- for (i = 0; i < m_paths.GetSize(); i++) {
- tmp.Format(IDS_RP_PATH, i);
- theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp, m_paths[i]);
- }
- } else {
- CString chk(_T("123456789")), path, tmp;
- int i = 0;
- do {
- if (!path.IsEmpty()) {
- m_paths.Add(path);
- }
- tmp.Format(IDS_RP_PATH, i++);
- path = theApp.GetProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp, chk);
- } while (path != chk);
- }
+ if (fSave) {
+ CString chk(_T("123456789")), path, tmp;
+ int i = 0;
+ do {
+ tmp.Format(IDS_RP_PATH, i++);
+ path = theApp.GetProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp, chk);
+ if (path != chk) {
+ theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp, _T(""));
+ }
+ } while (path != chk);
+
+ for (i = 0; i < m_paths.GetSize(); i++) {
+ tmp.Format(IDS_RP_PATH, i);
+ theApp.WriteProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp, m_paths[i]);
+ }
+ } else {
+ CString chk(_T("123456789")), path, tmp;
+ int i = 0;
+ do {
+ if (!path.IsEmpty()) {
+ m_paths.Add(path);
+ }
+ tmp.Format(IDS_RP_PATH, i++);
+ path = theApp.GetProfileString(ResStr(IDS_R_DEFTEXTPATHES), tmp, chk);
+ } while (path != chk);
+ }
}
void CDVSPathsPPage::UpdateControlData(bool fSave)
{
- if (fSave) {
- m_paths.RemoveAll();
- for (int i = 0; i < m_pathlist.GetCount(); i++) {
- CString path;
- m_pathlist.GetText(i, path);
- m_paths.Add(path);
- }
- } else {
- m_pathlist.ResetContent();
- for (ptrdiff_t i = 0; i < m_paths.GetSize(); i++) {
- m_pathlist.AddString(m_paths[i]);
- }
-
- m_remove.EnableWindow(FALSE);
- m_add.EnableWindow(TRUE);
- }
+ if (fSave) {
+ m_paths.RemoveAll();
+ for (int i = 0; i < m_pathlist.GetCount(); i++) {
+ CString path;
+ m_pathlist.GetText(i, path);
+ m_paths.Add(path);
+ }
+ } else {
+ m_pathlist.ResetContent();
+ for (ptrdiff_t i = 0; i < m_paths.GetSize(); i++) {
+ m_pathlist.AddString(m_paths[i]);
+ }
+
+ m_remove.EnableWindow(FALSE);
+ m_add.EnableWindow(TRUE);
+ }
}
diff --git a/src/filters/transform/VSFilter/DirectVobSubPropPage.h b/src/filters/transform/VSFilter/DirectVobSubPropPage.h
index cb67f71cd..64a735954 100644
--- a/src/filters/transform/VSFilter/DirectVobSubPropPage.h
+++ b/src/filters/transform/VSFilter/DirectVobSubPropPage.h
@@ -29,188 +29,188 @@
class CDVSBasePPage : public CBasePropertyPage
{
public:
- // we have to override these to use external, resource-only dlls
- STDMETHODIMP GetPageInfo(LPPROPPAGEINFO pPageInfo);
- STDMETHODIMP Activate(HWND hwndParent, LPCRECT pRect, BOOL fModal);
+ // we have to override these to use external, resource-only dlls
+ STDMETHODIMP GetPageInfo(LPPROPPAGEINFO pPageInfo);
+ STDMETHODIMP Activate(HWND hwndParent, LPCRECT pRect, BOOL fModal);
protected:
- CComQIPtr<IDirectVobSub2> m_pDirectVobSub;
+ CComQIPtr<IDirectVobSub2> m_pDirectVobSub;
- virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) {
- return false;
- }
- virtual void UpdateObjectData(bool fSave) {}
- virtual void UpdateControlData(bool fSave) {}
+ virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) {
+ return false;
+ }
+ virtual void UpdateObjectData(bool fSave) {}
+ virtual void UpdateControlData(bool fSave) {}
protected:
- CDVSBasePPage(TCHAR* pName, LPUNKNOWN lpunk, int DialogId, int TitleId);
+ CDVSBasePPage(TCHAR* pName, LPUNKNOWN lpunk, int DialogId, int TitleId);
- bool m_fDisableInstantUpdate;
+ bool m_fDisableInstantUpdate;
private:
- BOOL m_bIsInitialized;
+ BOOL m_bIsInitialized;
- HRESULT OnConnect(IUnknown* pUnknown), OnDisconnect(), OnActivate(), OnDeactivate(), OnApplyChanges();
- INT_PTR OnReceiveMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+ HRESULT OnConnect(IUnknown* pUnknown), OnDisconnect(), OnActivate(), OnDeactivate(), OnApplyChanges();
+ INT_PTR OnReceiveMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
private:
- bool m_fAttached;
- void AttachControls(), DetachControls();
+ bool m_fAttached;
+ void AttachControls(), DetachControls();
- CMap<UINT, UINT&, CWnd*, CWnd*> m_controls;
+ CMap<UINT, UINT&, CWnd*, CWnd*> m_controls;
protected:
- void BindControl(UINT id, CWnd& control);
+ void BindControl(UINT id, CWnd& control);
};
class __declspec(uuid("60765CF5-01C2-4ee7-A44B-C791CF25FEA0"))
- CDVSMainPPage : public CDVSBasePPage
+ CDVSMainPPage : public CDVSBasePPage
{
- void FreeLangs(), AllocLangs(int nLangs);
-
- WCHAR m_fn[_MAX_PATH];
- int m_iSelectedLanguage, m_nLangs;
- WCHAR** m_ppLangs;
- bool m_fOverridePlacement;
- int m_PlacementXperc, m_PlacementYperc;
- STSStyle m_defStyle;
- bool m_fOnlyShowForcedVobSubs;
- CSimpleTextSubtitle::EPARCompensationType m_ePARCompensationType;
-
- CEdit m_fnedit;
- CComboBox m_langs;
- CButton m_oplacement;
- CSpinButtonCtrl m_subposx, m_subposy;
- CButton m_font, m_forcedsubs;
- CButton m_AutoPARCompensation;
- CComboBox m_PARCombo;
+ void FreeLangs(), AllocLangs(int nLangs);
+
+ WCHAR m_fn[_MAX_PATH];
+ int m_iSelectedLanguage, m_nLangs;
+ WCHAR** m_ppLangs;
+ bool m_fOverridePlacement;
+ int m_PlacementXperc, m_PlacementYperc;
+ STSStyle m_defStyle;
+ bool m_fOnlyShowForcedVobSubs;
+ CSimpleTextSubtitle::EPARCompensationType m_ePARCompensationType;
+
+ CEdit m_fnedit;
+ CComboBox m_langs;
+ CButton m_oplacement;
+ CSpinButtonCtrl m_subposx, m_subposy;
+ CButton m_font, m_forcedsubs;
+ CButton m_AutoPARCompensation;
+ CComboBox m_PARCombo;
protected:
- virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
- virtual void UpdateControlData(bool fSave);
- virtual void UpdateObjectData(bool fSave);
+ virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+ virtual void UpdateControlData(bool fSave);
+ virtual void UpdateObjectData(bool fSave);
public:
- CDVSMainPPage(LPUNKNOWN lpunk, HRESULT* phr);
- virtual ~CDVSMainPPage();
+ CDVSMainPPage(LPUNKNOWN lpunk, HRESULT* phr);
+ virtual ~CDVSMainPPage();
};
class __declspec(uuid("0180E49C-13BF-46db-9AFD-9F52292E1C22"))
- CDVSGeneralPPage : public CDVSBasePPage
+ CDVSGeneralPPage : public CDVSBasePPage
{
- int m_HorExt, m_VerExt, m_ResX2, m_ResX2minw, m_ResX2minh;
- int m_LoadLevel;
- bool m_fExternalLoad, m_fWebLoad, m_fEmbeddedLoad;
+ int m_HorExt, m_VerExt, m_ResX2, m_ResX2minw, m_ResX2minh;
+ int m_LoadLevel;
+ bool m_fExternalLoad, m_fWebLoad, m_fEmbeddedLoad;
- CComboBox m_verext;
- CButton m_mod32fix;
- CComboBox m_resx2;
- CSpinButtonCtrl m_resx2w, m_resx2h;
- CComboBox m_load;
- CButton m_extload, m_webload, m_embload;
+ CComboBox m_verext;
+ CButton m_mod32fix;
+ CComboBox m_resx2;
+ CSpinButtonCtrl m_resx2w, m_resx2h;
+ CComboBox m_load;
+ CButton m_extload, m_webload, m_embload;
protected:
- virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
- virtual void UpdateControlData(bool fSave);
- virtual void UpdateObjectData(bool fSave);
+ virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+ virtual void UpdateControlData(bool fSave);
+ virtual void UpdateObjectData(bool fSave);
public:
- CDVSGeneralPPage(LPUNKNOWN lpunk, HRESULT* phr);
+ CDVSGeneralPPage(LPUNKNOWN lpunk, HRESULT* phr);
};
class __declspec(uuid("A8B25C0E-0894-4531-B668-AB1599FAF7F6"))
- CDVSMiscPPage : public CDVSBasePPage
+ CDVSMiscPPage : public CDVSBasePPage
{
- bool m_fFlipPicture, m_fFlipSubtitles, m_fHideSubtitles, m_fOSD, m_fAnimWhenBuffering, m_fReloaderDisabled, m_fSaveFullPath;
- unsigned int m_uSubPictToBuffer;
+ bool m_fFlipPicture, m_fFlipSubtitles, m_fHideSubtitles, m_fOSD, m_fAnimWhenBuffering, m_fReloaderDisabled, m_fSaveFullPath;
+ unsigned int m_uSubPictToBuffer;
- CButton m_flippic, m_flipsub, m_hidesub, m_showosd, m_animwhenbuff, m_autoreload, m_savefullpath, m_instupd;
- CSpinButtonCtrl m_subpicttobuff;
+ CButton m_flippic, m_flipsub, m_hidesub, m_showosd, m_animwhenbuff, m_autoreload, m_savefullpath, m_instupd;
+ CSpinButtonCtrl m_subpicttobuff;
protected:
- virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
- virtual void UpdateControlData(bool fSave);
- virtual void UpdateObjectData(bool fSave);
+ virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+ virtual void UpdateControlData(bool fSave);
+ virtual void UpdateObjectData(bool fSave);
public:
- CDVSMiscPPage(LPUNKNOWN lpunk, HRESULT* phr);
+ CDVSMiscPPage(LPUNKNOWN lpunk, HRESULT* phr);
};
class __declspec(uuid("ACE4747B-35BD-4e97-9DD7-1D4245B0695C"))
- CDVSTimingPPage : public CDVSBasePPage
+ CDVSTimingPPage : public CDVSBasePPage
{
- int m_SubtitleSpeedMul, m_SubtitleSpeedDiv, m_SubtitleDelay;
- bool m_fMediaFPSEnabled;
- double m_MediaFPS;
+ int m_SubtitleSpeedMul, m_SubtitleSpeedDiv, m_SubtitleDelay;
+ bool m_fMediaFPSEnabled;
+ double m_MediaFPS;
- CButton m_modfps;
- CEdit m_fps;
- CSpinButtonCtrl m_subdelay, m_subspeedmul, m_subspeeddiv;
+ CButton m_modfps;
+ CEdit m_fps;
+ CSpinButtonCtrl m_subdelay, m_subspeedmul, m_subspeeddiv;
protected:
- virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
- virtual void UpdateControlData(bool fSave);
- virtual void UpdateObjectData(bool fSave);
+ virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+ virtual void UpdateControlData(bool fSave);
+ virtual void UpdateObjectData(bool fSave);
public:
- CDVSTimingPPage(LPUNKNOWN lpunk, HRESULT* phr);
+ CDVSTimingPPage(LPUNKNOWN lpunk, HRESULT* phr);
};
class __declspec(uuid("F544E0F5-CA3C-47ea-A64D-35FCF1602396"))
- CDVSAboutPPage : public CDVSBasePPage
+ CDVSAboutPPage : public CDVSBasePPage
{
protected:
- virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+ virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
public:
- CDVSAboutPPage(LPUNKNOWN lpunk, HRESULT* phr);
+ CDVSAboutPPage(LPUNKNOWN lpunk, HRESULT* phr);
};
class __declspec(uuid("525F116F-04AD-40a2-AE2F-A0C4E1AFEF98"))
- CDVSZoomPPage : public CDVSBasePPage
+ CDVSZoomPPage : public CDVSBasePPage
{
- NORMALIZEDRECT m_rect;
+ NORMALIZEDRECT m_rect;
- CSpinButtonCtrl m_posx, m_posy, m_scalex, m_scaley;
+ CSpinButtonCtrl m_posx, m_posy, m_scalex, m_scaley;
protected:
- virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
- virtual void UpdateControlData(bool fSave);
- virtual void UpdateObjectData(bool fSave);
+ virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+ virtual void UpdateControlData(bool fSave);
+ virtual void UpdateObjectData(bool fSave);
public:
- CDVSZoomPPage(LPUNKNOWN lpunk, HRESULT* phr);
+ CDVSZoomPPage(LPUNKNOWN lpunk, HRESULT* phr);
};
class __declspec(uuid("C2D6D98F-09CA-4524-AF64-1049B5665C9C"))
- CDVSColorPPage : public CDVSBasePPage
+ CDVSColorPPage : public CDVSBasePPage
{
- CListBox m_preflist, m_dynchglist;
- CButton m_forcergb;
+ CListBox m_preflist, m_dynchglist;
+ CButton m_forcergb;
protected:
- virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
- virtual void UpdateControlData(bool fSave);
- virtual void UpdateObjectData(bool fSave);
+ virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+ virtual void UpdateControlData(bool fSave);
+ virtual void UpdateObjectData(bool fSave);
public:
- CDVSColorPPage(LPUNKNOWN lpunk, HRESULT* phr);
+ CDVSColorPPage(LPUNKNOWN lpunk, HRESULT* phr);
};
class __declspec(uuid("CE77C59C-CFD2-429f-868C-8B04D23F94CA"))
- CDVSPathsPPage : public CDVSBasePPage
+ CDVSPathsPPage : public CDVSBasePPage
{
- CStringArray m_paths;
+ CStringArray m_paths;
- CListBox m_pathlist;
- CEdit m_path;
- CButton m_browse, m_remove, m_add;
+ CListBox m_pathlist;
+ CEdit m_path;
+ CButton m_browse, m_remove, m_add;
protected:
- virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
- virtual void UpdateControlData(bool fSave);
- virtual void UpdateObjectData(bool fSave);
+ virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
+ virtual void UpdateControlData(bool fSave);
+ virtual void UpdateObjectData(bool fSave);
public:
- CDVSPathsPPage(LPUNKNOWN lpunk, HRESULT* phr);
+ CDVSPathsPPage(LPUNKNOWN lpunk, HRESULT* phr);
};
diff --git a/src/filters/transform/VSFilter/IDirectVobSub.h b/src/filters/transform/VSFilter/IDirectVobSub.h
index e8dbc46e3..4a5589398 100644
--- a/src/filters/transform/VSFilter/IDirectVobSub.h
+++ b/src/filters/transform/VSFilter/IDirectVobSub.h
@@ -29,290 +29,290 @@
extern "C" {
#endif
- interface __declspec(uuid("EBE1FB08-3957-47ca-AF13-5827E5442E56"))
+ interface __declspec(uuid("EBE1FB08-3957-47ca-AF13-5827E5442E56"))
IDirectVobSub :
- public IUnknown
- {
- STDMETHOD(get_FileName) (THIS_
- WCHAR* fn // fn should point to a buffer allocated to at least the length of _MAX_PATH (=260)
- ) PURE;
-
- STDMETHOD(put_FileName) (THIS_
- WCHAR* fn
- ) PURE;
-
- STDMETHOD(get_LanguageCount) (THIS_
- int* nLangs
- ) PURE;
-
- STDMETHOD(get_LanguageName) (THIS_
- int iLanguage,
- WCHAR** ppName // the returned *ppName is allocated with CoTaskMemAlloc
- ) PURE;
-
- STDMETHOD(get_SelectedLanguage) (THIS_
- int* iSelected
- ) PURE;
-
- STDMETHOD(put_SelectedLanguage) (THIS_
- int iSelected
- ) PURE;
-
- STDMETHOD(get_HideSubtitles) (THIS_
- bool* fHideSubtitles
- ) PURE;
-
- STDMETHOD(put_HideSubtitles) (THIS_
- bool fHideSubtitles
- ) PURE;
-
- // deprecated
- STDMETHOD(get_PreBuffering) (THIS_
- bool* fDoPreBuffering
- ) PURE;
-
- // deprecated
- STDMETHOD(put_PreBuffering) (THIS_
- bool fDoPreBuffering
- ) PURE;
-
- STDMETHOD(get_Placement) (THIS_
- bool* fOverridePlacement,
- int* xperc,
- int* yperc
- ) PURE;
-
- STDMETHOD(put_Placement) (THIS_
- bool fOverridePlacement,
- int xperc,
- int yperc
- ) PURE;
-
- STDMETHOD(get_VobSubSettings) (THIS_
- bool* fBuffer,
- bool* fOnlyShowForcedSubs,
- bool* fPolygonize
- ) PURE;
-
- STDMETHOD(put_VobSubSettings) (THIS_
- bool fBuffer,
- bool fOnlyShowForcedSubs,
- bool fPolygonize
- ) PURE;
-
- STDMETHOD(get_TextSettings) (THIS_
- void* lf,
- int lflen, // depending on lflen, lf must point to LOGFONTA or LOGFONTW
- COLORREF* color,
- bool* fShadow,
- bool* fOutline,
- bool* fAdvancedRenderer
- ) PURE;
-
- STDMETHOD(put_TextSettings) (THIS_
- void* lf,
- int lflen,
- COLORREF color,
- bool fShadow,
- bool fOutline,
- bool fAdvancedRenderer
- ) PURE;
-
- STDMETHOD(get_Flip) (THIS_
- bool* fPicture,
- bool* fSubtitles
- ) PURE;
-
- STDMETHOD(put_Flip) (THIS_
- bool fPicture,
- bool fSubtitles
- ) PURE;
-
- STDMETHOD(get_OSD) (THIS_
- bool* fOSD
- ) PURE;
-
- STDMETHOD(put_OSD) (THIS_
- bool fOSD
- ) PURE;
-
- STDMETHOD(get_SaveFullPath) (THIS_
- bool* fSaveFullPath
- ) PURE;
-
- STDMETHOD(put_SaveFullPath) (THIS_
- bool fSaveFullPath
- ) PURE;
-
- STDMETHOD(get_SubtitleTiming) (THIS_
- int* delay,
- int* speedmul,
- int* speeddiv
- ) PURE;
-
- STDMETHOD(put_SubtitleTiming) (THIS_
- int delay,
- int speedmul,
- int speeddiv
- ) PURE;
-
- STDMETHOD(get_MediaFPS) (THIS_
- bool* fEnabled,
- double* fps
- ) PURE;
-
- STDMETHOD(put_MediaFPS) (THIS_
- bool fEnabled,
- double fps
- ) PURE;
-
- // no longer supported
-
- STDMETHOD(get_ColorFormat) (THIS_
- int* iPosition
- ) PURE;
-
- STDMETHOD(put_ColorFormat) (THIS_
- int iPosition
- ) PURE;
-
- //
-
- STDMETHOD(get_ZoomRect) (THIS_
- NORMALIZEDRECT* rect
- ) PURE;
-
- STDMETHOD(put_ZoomRect) (THIS_
- NORMALIZEDRECT* rect
- ) PURE;
-
- //
-
- STDMETHOD(UpdateRegistry) (THIS_
- ) PURE;
-
- //
-
- STDMETHOD(HasConfigDialog) (THIS_
- int iSelected
- ) PURE;
-
- STDMETHOD(ShowConfigDialog) (THIS_ // if available, this will popup a child dialog allowing the user to edit the style options
- int iSelected,
- HWND hWndParent
- ) PURE;
-
- //
-
- STDMETHOD(IsSubtitleReloaderLocked) (THIS_
- bool* fLocked
- ) PURE;
-
- STDMETHOD(LockSubtitleReloader) (THIS_
- bool fLock
- ) PURE;
-
- STDMETHOD(get_SubtitleReloader) (THIS_
- bool* fDisabled
- ) PURE;
-
- STDMETHOD(put_SubtitleReloader) (THIS_
- bool fDisable
- ) PURE;
-
- //
-
- STDMETHOD(get_ExtendPicture) (THIS_
- int* horizontal, // 0 - disabled, 1 - mod32 extension (width = (width+31)&~31)
- int* vertical, // 0 - disabled, 1 - 16:9, 2 - 4:3, 0x80 - crop (use crop together with 16:9 or 4:3, eg 0x81 will crop to 16:9 if the picture was taller)
- int* resx2, // 0 - disabled, 1 - enabled, 2 - depends on the original resolution
- int* resx2minw, // resolution doubler will be used if width*height <= resx2minw*resx2minh (resx2minw*resx2minh equals to 384*288 by default)
- int* resx2minh
- ) PURE;
-
- STDMETHOD(put_ExtendPicture) (THIS_
- int horizontal,
- int vertical,
- int resx2,
- int resx2minw,
- int resx2minh
- ) PURE;
-
- STDMETHOD(get_LoadSettings) (THIS_
- int* level, // 0 - when needed, 1 - always, 2 - disabled
- bool* fExternalLoad,
- bool* fWebLoad,
- bool* fEmbeddedLoad
- ) PURE;
-
- STDMETHOD(put_LoadSettings) (THIS_
- int level,
- bool fExternalLoad,
- bool fWebLoad,
- bool fEmbeddedLoad
- ) PURE;
-
- STDMETHOD(get_SubPictToBuffer) (THIS_
- unsigned int* uSubPictToBuffer
- ) PURE;
+ public IUnknown
+ {
+ STDMETHOD(get_FileName)(THIS_
+ WCHAR* fn // fn should point to a buffer allocated to at least the length of _MAX_PATH (=260)
+ ) PURE;
+
+ STDMETHOD(put_FileName)(THIS_
+ WCHAR* fn
+ ) PURE;
+
+ STDMETHOD(get_LanguageCount)(THIS_
+ int* nLangs
+ ) PURE;
+
+ STDMETHOD(get_LanguageName)(THIS_
+ int iLanguage,
+ WCHAR** ppName // the returned *ppName is allocated with CoTaskMemAlloc
+ ) PURE;
+
+ STDMETHOD(get_SelectedLanguage)(THIS_
+ int* iSelected
+ ) PURE;
+
+ STDMETHOD(put_SelectedLanguage)(THIS_
+ int iSelected
+ ) PURE;
+
+ STDMETHOD(get_HideSubtitles)(THIS_
+ bool* fHideSubtitles
+ ) PURE;
+
+ STDMETHOD(put_HideSubtitles)(THIS_
+ bool fHideSubtitles
+ ) PURE;
+
+ // deprecated
+ STDMETHOD(get_PreBuffering)(THIS_
+ bool* fDoPreBuffering
+ ) PURE;
+
+ // deprecated
+ STDMETHOD(put_PreBuffering)(THIS_
+ bool fDoPreBuffering
+ ) PURE;
+
+ STDMETHOD(get_Placement)(THIS_
+ bool* fOverridePlacement,
+ int* xperc,
+ int* yperc
+ ) PURE;
+
+ STDMETHOD(put_Placement)(THIS_
+ bool fOverridePlacement,
+ int xperc,
+ int yperc
+ ) PURE;
+
+ STDMETHOD(get_VobSubSettings)(THIS_
+ bool* fBuffer,
+ bool* fOnlyShowForcedSubs,
+ bool* fPolygonize
+ ) PURE;
+
+ STDMETHOD(put_VobSubSettings)(THIS_
+ bool fBuffer,
+ bool fOnlyShowForcedSubs,
+ bool fPolygonize
+ ) PURE;
+
+ STDMETHOD(get_TextSettings)(THIS_
+ void* lf,
+ int lflen, // depending on lflen, lf must point to LOGFONTA or LOGFONTW
+ COLORREF* color,
+ bool* fShadow,
+ bool* fOutline,
+ bool* fAdvancedRenderer
+ ) PURE;
+
+ STDMETHOD(put_TextSettings)(THIS_
+ void* lf,
+ int lflen,
+ COLORREF color,
+ bool fShadow,
+ bool fOutline,
+ bool fAdvancedRenderer
+ ) PURE;
+
+ STDMETHOD(get_Flip)(THIS_
+ bool* fPicture,
+ bool* fSubtitles
+ ) PURE;
+
+ STDMETHOD(put_Flip)(THIS_
+ bool fPicture,
+ bool fSubtitles
+ ) PURE;
+
+ STDMETHOD(get_OSD)(THIS_
+ bool* fOSD
+ ) PURE;
+
+ STDMETHOD(put_OSD)(THIS_
+ bool fOSD
+ ) PURE;
+
+ STDMETHOD(get_SaveFullPath)(THIS_
+ bool* fSaveFullPath
+ ) PURE;
+
+ STDMETHOD(put_SaveFullPath)(THIS_
+ bool fSaveFullPath
+ ) PURE;
+
+ STDMETHOD(get_SubtitleTiming)(THIS_
+ int* delay,
+ int* speedmul,
+ int* speeddiv
+ ) PURE;
+
+ STDMETHOD(put_SubtitleTiming)(THIS_
+ int delay,
+ int speedmul,
+ int speeddiv
+ ) PURE;
+
+ STDMETHOD(get_MediaFPS)(THIS_
+ bool* fEnabled,
+ double* fps
+ ) PURE;
+
+ STDMETHOD(put_MediaFPS)(THIS_
+ bool fEnabled,
+ double fps
+ ) PURE;
+
+ // no longer supported
+
+ STDMETHOD(get_ColorFormat)(THIS_
+ int* iPosition
+ ) PURE;
+
+ STDMETHOD(put_ColorFormat)(THIS_
+ int iPosition
+ ) PURE;
+
+ //
+
+ STDMETHOD(get_ZoomRect)(THIS_
+ NORMALIZEDRECT* rect
+ ) PURE;
+
+ STDMETHOD(put_ZoomRect)(THIS_
+ NORMALIZEDRECT* rect
+ ) PURE;
+
+ //
+
+ STDMETHOD(UpdateRegistry)(THIS_
+ ) PURE;
+
+ //
+
+ STDMETHOD(HasConfigDialog)(THIS_
+ int iSelected
+ ) PURE;
+
+ STDMETHOD(ShowConfigDialog)(THIS_ // if available, this will popup a child dialog allowing the user to edit the style options
+ int iSelected,
+ HWND hWndParent
+ ) PURE;
+
+ //
+
+ STDMETHOD(IsSubtitleReloaderLocked)(THIS_
+ bool* fLocked
+ ) PURE;
+
+ STDMETHOD(LockSubtitleReloader)(THIS_
+ bool fLock
+ ) PURE;
+
+ STDMETHOD(get_SubtitleReloader)(THIS_
+ bool* fDisabled
+ ) PURE;
+
+ STDMETHOD(put_SubtitleReloader)(THIS_
+ bool fDisable
+ ) PURE;
+
+ //
+
+ STDMETHOD(get_ExtendPicture)(THIS_
+ int* horizontal, // 0 - disabled, 1 - mod32 extension (width = (width+31)&~31)
+ int* vertical, // 0 - disabled, 1 - 16:9, 2 - 4:3, 0x80 - crop (use crop together with 16:9 or 4:3, eg 0x81 will crop to 16:9 if the picture was taller)
+ int* resx2, // 0 - disabled, 1 - enabled, 2 - depends on the original resolution
+ int* resx2minw, // resolution doubler will be used if width*height <= resx2minw*resx2minh (resx2minw*resx2minh equals to 384*288 by default)
+ int* resx2minh
+ ) PURE;
+
+ STDMETHOD(put_ExtendPicture)(THIS_
+ int horizontal,
+ int vertical,
+ int resx2,
+ int resx2minw,
+ int resx2minh
+ ) PURE;
+
+ STDMETHOD(get_LoadSettings)(THIS_
+ int* level, // 0 - when needed, 1 - always, 2 - disabled
+ bool* fExternalLoad,
+ bool* fWebLoad,
+ bool* fEmbeddedLoad
+ ) PURE;
+
+ STDMETHOD(put_LoadSettings)(THIS_
+ int level,
+ bool fExternalLoad,
+ bool fWebLoad,
+ bool fEmbeddedLoad
+ ) PURE;
+
+ STDMETHOD(get_SubPictToBuffer)(THIS_
+ unsigned int* uSubPictToBuffer
+ ) PURE;
- STDMETHOD(put_SubPictToBuffer) (THIS_
- unsigned int uSubPictToBuffer
- ) PURE;
+ STDMETHOD(put_SubPictToBuffer)(THIS_
+ unsigned int uSubPictToBuffer
+ ) PURE;
- STDMETHOD(get_AnimWhenBuffering) (THIS_
- bool* fAnimWhenBuffering
- ) PURE;
+ STDMETHOD(get_AnimWhenBuffering)(THIS_
+ bool* fAnimWhenBuffering
+ ) PURE;
- STDMETHOD(put_AnimWhenBuffering) (THIS_
- bool fAnimWhenBuffering
- ) PURE;
- };
-
- interface __declspec(uuid("FE6EC6A0-21CA-4970-9EF0-B296F7F38AF0"))
+ STDMETHOD(put_AnimWhenBuffering)(THIS_
+ bool fAnimWhenBuffering
+ ) PURE;
+ };
+
+ interface __declspec(uuid("FE6EC6A0-21CA-4970-9EF0-B296F7F38AF0"))
ISubClock :
- public IUnknown {
- STDMETHOD(SetTime)(REFERENCE_TIME rt) PURE;
- STDMETHOD_(REFERENCE_TIME, GetTime)() PURE;
- };
+ public IUnknown {
+ STDMETHOD(SetTime)(REFERENCE_TIME rt) PURE;
+ STDMETHOD_(REFERENCE_TIME, GetTime)() PURE;
+ };
- interface __declspec(uuid("0665B760-FBC1-46C3-A35F-E471527C96A4"))
+ interface __declspec(uuid("0665B760-FBC1-46C3-A35F-E471527C96A4"))
ISubClock2 :
- public ISubClock {
- STDMETHOD(SetAvgTimePerFrame)(REFERENCE_TIME rt) PURE;
- STDMETHOD(GetAvgTimePerFrame)(REFERENCE_TIME* prt) PURE; // return S_OK only if *prt was set and is valid
- };
+ public ISubClock {
+ STDMETHOD(SetAvgTimePerFrame)(REFERENCE_TIME rt) PURE;
+ STDMETHOD(GetAvgTimePerFrame)(REFERENCE_TIME * prt) PURE; // return S_OK only if *prt was set and is valid
+ };
- interface __declspec(uuid("AB52FC9C-2415-4dca-BC1C-8DCC2EAE8150"))
+ interface __declspec(uuid("AB52FC9C-2415-4dca-BC1C-8DCC2EAE8150"))
IDirectVobSub2 :
- public IDirectVobSub {
- STDMETHOD(AdviseSubClock) (THIS_
- ISubClock* pSubClock
- ) PURE;
-
- STDMETHOD_(bool, get_Forced) (THIS_
- ) PURE;
-
- STDMETHOD(put_Forced) (THIS_
- bool fForced
- ) PURE;
-
- STDMETHOD(get_TextSettings) (THIS_
- STSStyle* pDefStyle
- ) PURE;
-
- STDMETHOD(put_TextSettings) (THIS_
- STSStyle* pDefStyle
- ) PURE;
-
- STDMETHOD(get_AspectRatioSettings) (THIS_
- CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType
- ) PURE;
-
- STDMETHOD(put_AspectRatioSettings) (THIS_
- CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType
- ) PURE;
- };
+ public IDirectVobSub {
+ STDMETHOD(AdviseSubClock)(THIS_
+ ISubClock* pSubClock
+ ) PURE;
+
+ STDMETHOD_(bool, get_Forced)(THIS_
+ ) PURE;
+
+ STDMETHOD(put_Forced)(THIS_
+ bool fForced
+ ) PURE;
+
+ STDMETHOD(get_TextSettings)(THIS_
+ STSStyle* pDefStyle
+ ) PURE;
+
+ STDMETHOD(put_TextSettings)(THIS_
+ STSStyle* pDefStyle
+ ) PURE;
+
+ STDMETHOD(get_AspectRatioSettings)(THIS_
+ CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType
+ ) PURE;
+
+ STDMETHOD(put_AspectRatioSettings)(THIS_
+ CSimpleTextSubtitle::EPARCompensationType* ePARCompensationType
+ ) PURE;
+ };
#ifdef __cplusplus
diff --git a/src/filters/transform/VSFilter/Scale2x.cpp b/src/filters/transform/VSFilter/Scale2x.cpp
index 9df7d0a8b..5607d5876 100644
--- a/src/filters/transform/VSFilter/Scale2x.cpp
+++ b/src/filters/transform/VSFilter/Scale2x.cpp
@@ -31,444 +31,444 @@
#pragma warning(disable : 4799) // no emms... blahblahblah
-void Scale2x_YV( int w, int h, BYTE* d, int dpitch, BYTE* s, int spitch )
+void Scale2x_YV(int w, int h, BYTE* d, int dpitch, BYTE* s, int spitch)
{
- BYTE* s1;
- BYTE* s2;
- BYTE* d1;
+ BYTE* s1;
+ BYTE* s2;
+ BYTE* d1;
- for (s1 = s, s2 = s + h*spitch, d1 = d; s1 < s2; d1 += dpitch) { // TODO: replace this mess with mmx code
- BYTE* stmp = s1 + spitch;
- BYTE* dtmp = d1 + dpitch;
+ for (s1 = s, s2 = s + h * spitch, d1 = d; s1 < s2; d1 += dpitch) { // TODO: replace this mess with mmx code
+ BYTE* stmp = s1 + spitch;
+ BYTE* dtmp = d1 + dpitch;
- for (BYTE* s3 = s1 + (w-1); s1 < s3; s1 += 1, d1 += 2) {
- d1[0] = s1[0];
- d1[1] = (s1[0]+s1[1])>>1;
- }
+ for (BYTE* s3 = s1 + (w - 1); s1 < s3; s1 += 1, d1 += 2) {
+ d1[0] = s1[0];
+ d1[1] = (s1[0] + s1[1]) >> 1;
+ }
- d1[0] = d1[1] = s1[0];
+ d1[0] = d1[1] = s1[0];
- s1 += 1;
- d1 += 2;
+ s1 += 1;
+ d1 += 2;
- s1 = stmp;
- d1 = dtmp;
- }
+ s1 = stmp;
+ d1 = dtmp;
+ }
- AvgLines8(d, h*2, dpitch);
+ AvgLines8(d, h * 2, dpitch);
}
#ifdef _WIN64
-void Scale2x_YUY2_SSE2( BYTE* s1, BYTE* d1, int w )
+void Scale2x_YUY2_SSE2(BYTE* s1, BYTE* d1, int w)
{
- unsigned __int64 __0xffffffff00000000 = 0xffffffff00000000;
- unsigned __int64 __0x00000000ffffffff = 0x00000000ffffffff;
- unsigned __int64 __0x00ff00ff00ff00ff = 0x00ff00ff00ff00ff;
-
- __m128i mm4 = _mm_cvtsi64_si128(__0x00ff00ff00ff00ff);
- __m128i mm5 = _mm_cvtsi64_si128(__0x00000000ffffffff);
- __m128i mm6 = _mm_cvtsi64_si128(__0xffffffff00000000);
- for (BYTE* s3 = s1 + ((w>>1)-1)*4; s1 < s3; s1 += 4, d1 += 8) {
- __m128i mm0 = _mm_cvtsi64_si128(*(size_t*)s1); //movq mm0, [esi]
- __m128i mm2 = _mm_move_epi64(mm0); //movq mm2, mm0
- mm0 = _mm_and_si128(mm0, mm4); //pand mm0, mm4 // mm0 = 00y400y300y200y1
- mm2 = _mm_srli_epi16(mm2, 8); //psrlw mm2, 8 // mm2 = 00u200v200u100v1
- __m128i mm1 = _mm_move_epi64(mm0); //movq mm1, mm0
- mm0 = _mm_and_si128(mm0, mm5); //pand mm0, mm5 // mm0 = 0000000000y200y1
- mm1 = _mm_slli_epi64(mm1, 16); //psllq mm1, 16
- mm1 = _mm_and_si128(mm1, mm6); //pand mm1, mm6 // mm1 = 00y300y200000000
- mm1 = _mm_or_si128(mm1, mm0); //por mm1, mm0 // mm1 = 00y300y200y200y1
- mm0 = _mm_unpacklo_epi8(mm0, mm0); //punpcklwd mm0, mm0 // mm0 = 00y200y200y100y1
- mm0 = _mm_adds_epi16(mm0,mm1); //paddw mm0, mm1
- mm0 = _mm_srli_epi16(mm0, 1); //psrlw mm0, 1 // mm0 = (mm0 + mm1) / 2
- mm1 = _mm_move_epi64(mm2); //movq mm1, mm2
- mm1 = _mm_unpacklo_epi32(mm1, mm1); //punpckldq mm1, mm1 // mm1 = 00u100v100u100v1
- mm1 = _mm_adds_epi16(mm1,mm2); //paddw mm1, mm2
- mm1 = _mm_srli_epi16(mm1, 1); //psrlw mm1, 1 // mm1 = (mm1 + mm2) / 2
- mm1 = _mm_slli_epi64(mm1, 8); //psllw mm1, 8
- mm1 = _mm_or_si128(mm0, mm1); //por mm0, mm1 // mm0 = (v1+v2)/2|(y2+y3)/2|(u1+u2)/2|y2|v1|(y1+y2)/2|u1|y1
- *(size_t*)d1 = (size_t)_mm_cvtsi128_si64(mm0); //movq [edi], mm0
- }
-
- *d1++ = s1[0];
- *d1++ = s1[1];
- *d1++ =(s1[0]+s1[2])>>1;
- *d1++ = s1[3];
-
- *d1++ = s1[2];
- *d1++ = s1[1];
- *d1++ = s1[2];
- *d1++ = s1[3];
-
- s1 += 4;
+ unsigned __int64 __0xffffffff00000000 = 0xffffffff00000000;
+ unsigned __int64 __0x00000000ffffffff = 0x00000000ffffffff;
+ unsigned __int64 __0x00ff00ff00ff00ff = 0x00ff00ff00ff00ff;
+
+ __m128i mm4 = _mm_cvtsi64_si128(__0x00ff00ff00ff00ff);
+ __m128i mm5 = _mm_cvtsi64_si128(__0x00000000ffffffff);
+ __m128i mm6 = _mm_cvtsi64_si128(__0xffffffff00000000);
+ for (BYTE* s3 = s1 + ((w >> 1) - 1) * 4; s1 < s3; s1 += 4, d1 += 8) {
+ __m128i mm0 = _mm_cvtsi64_si128(*(size_t*)s1); //movq mm0, [esi]
+ __m128i mm2 = _mm_move_epi64(mm0); //movq mm2, mm0
+ mm0 = _mm_and_si128(mm0, mm4); //pand mm0, mm4 // mm0 = 00y400y300y200y1
+ mm2 = _mm_srli_epi16(mm2, 8); //psrlw mm2, 8 // mm2 = 00u200v200u100v1
+ __m128i mm1 = _mm_move_epi64(mm0); //movq mm1, mm0
+ mm0 = _mm_and_si128(mm0, mm5); //pand mm0, mm5 // mm0 = 0000000000y200y1
+ mm1 = _mm_slli_epi64(mm1, 16); //psllq mm1, 16
+ mm1 = _mm_and_si128(mm1, mm6); //pand mm1, mm6 // mm1 = 00y300y200000000
+ mm1 = _mm_or_si128(mm1, mm0); //por mm1, mm0 // mm1 = 00y300y200y200y1
+ mm0 = _mm_unpacklo_epi8(mm0, mm0); //punpcklwd mm0, mm0 // mm0 = 00y200y200y100y1
+ mm0 = _mm_adds_epi16(mm0, mm1); //paddw mm0, mm1
+ mm0 = _mm_srli_epi16(mm0, 1); //psrlw mm0, 1 // mm0 = (mm0 + mm1) / 2
+ mm1 = _mm_move_epi64(mm2); //movq mm1, mm2
+ mm1 = _mm_unpacklo_epi32(mm1, mm1); //punpckldq mm1, mm1 // mm1 = 00u100v100u100v1
+ mm1 = _mm_adds_epi16(mm1, mm2); //paddw mm1, mm2
+ mm1 = _mm_srli_epi16(mm1, 1); //psrlw mm1, 1 // mm1 = (mm1 + mm2) / 2
+ mm1 = _mm_slli_epi64(mm1, 8); //psllw mm1, 8
+ mm1 = _mm_or_si128(mm0, mm1); //por mm0, mm1 // mm0 = (v1+v2)/2|(y2+y3)/2|(u1+u2)/2|y2|v1|(y1+y2)/2|u1|y1
+ *(size_t*)d1 = (size_t)_mm_cvtsi128_si64(mm0); //movq [edi], mm0
+ }
+
+ *d1++ = s1[0];
+ *d1++ = s1[1];
+ *d1++ = (s1[0] + s1[2]) >> 1;
+ *d1++ = s1[3];
+
+ *d1++ = s1[2];
+ *d1++ = s1[1];
+ *d1++ = s1[2];
+ *d1++ = s1[3];
+
+ s1 += 4;
}
#else
-void Scale2x_YUY2_MMX( BYTE* s1, BYTE* d1, int w )
+void Scale2x_YUY2_MMX(BYTE* s1, BYTE* d1, int w)
{
- unsigned __int64 __0xffffffff00000000 = 0xffffffff00000000;
- unsigned __int64 __0x00000000ffffffff = 0x00000000ffffffff;
- unsigned __int64 __0x00ff00ff00ff00ff = 0x00ff00ff00ff00ff;
+ unsigned __int64 __0xffffffff00000000 = 0xffffffff00000000;
+ unsigned __int64 __0x00000000ffffffff = 0x00000000ffffffff;
+ unsigned __int64 __0x00ff00ff00ff00ff = 0x00ff00ff00ff00ff;
- __asm {
- mov esi, s1
- mov edi, d1
+ __asm {
+ mov esi, s1
+ mov edi, d1
- mov ecx, w
- shr ecx, 1
- dec ecx
+ mov ecx, w
+ shr ecx, 1
+ dec ecx
- movq mm4, __0x00ff00ff00ff00ff
- movq mm5, __0x00000000ffffffff
- movq mm6, __0xffffffff00000000
- row_loop1:
- movq mm0, [esi]
- movq mm2, mm0
+ movq mm4, __0x00ff00ff00ff00ff
+ movq mm5, __0x00000000ffffffff
+ movq mm6, __0xffffffff00000000
+ row_loop1:
+ movq mm0, [esi]
+ movq mm2, mm0
- pand mm0, mm4 // mm0 = 00y400y300y200y1
- psrlw mm2, 8 // mm2 = 00u200v200u100v1
+ pand mm0, mm4 // mm0 = 00y400y300y200y1
+ psrlw mm2, 8 // mm2 = 00u200v200u100v1
- movq mm1, mm0
+ movq mm1, mm0
- pand mm0, mm5 // mm0 = 0000000000y200y1
+ pand mm0, mm5 // mm0 = 0000000000y200y1
- psllq mm1, 16
- pand mm1, mm6 // mm1 = 00y300y200000000
+ psllq mm1, 16
+ pand mm1, mm6 // mm1 = 00y300y200000000
- por mm1, mm0 // mm1 = 00y300y200y200y1
+ por mm1, mm0 // mm1 = 00y300y200y200y1
- punpcklwd mm0, mm0 // mm0 = 00y200y200y100y1
+ punpcklwd mm0, mm0 // mm0 = 00y200y200y100y1
- paddw mm0, mm1
- psrlw mm0, 1 // mm0 = (mm0 + mm1) / 2
+ paddw mm0, mm1
+ psrlw mm0, 1 // mm0 = (mm0 + mm1) / 2
- movq mm1, mm2
- punpckldq mm1, mm1 // mm1 = 00u100v100u100v1
+ movq mm1, mm2
+ punpckldq mm1, mm1 // mm1 = 00u100v100u100v1
- paddw mm1, mm2
- psrlw mm1, 1 // mm1 = (mm1 + mm2) / 2
+ paddw mm1, mm2
+ psrlw mm1, 1 // mm1 = (mm1 + mm2) / 2
- psllw mm1, 8
- por mm0, mm1 // mm0 = (v1+v2)/2|(y2+y3)/2|(u1+u2)/2|y2|v1|(y1+y2)/2|u1|y1
+ psllw mm1, 8
+ por mm0, mm1 // mm0 = (v1+v2)/2|(y2+y3)/2|(u1+u2)/2|y2|v1|(y1+y2)/2|u1|y1
- movq [edi], mm0
+ movq [edi], mm0
- lea esi, [esi+4]
- lea edi, [edi+8]
+ lea esi, [esi+4]
+ lea edi, [edi+8]
- dec ecx
- jnz row_loop1
+ dec ecx
+ jnz row_loop1
- mov s1, esi
- mov d1, edi
- };
+ mov s1, esi
+ mov d1, edi
+ };
- *d1++ = s1[0];
- *d1++ = s1[1];
- *d1++ =(s1[0]+s1[2])>>1;
- *d1++ = s1[3];
+ *d1++ = s1[0];
+ *d1++ = s1[1];
+ *d1++ = (s1[0] + s1[2]) >> 1;
+ *d1++ = s1[3];
- *d1++ = s1[2];
- *d1++ = s1[1];
- *d1++ = s1[2];
- *d1++ = s1[3];
+ *d1++ = s1[2];
+ *d1++ = s1[1];
+ *d1++ = s1[2];
+ *d1++ = s1[3];
- s1 += 4;
+ s1 += 4;
}
#endif
-void Scale2x_YUY2_c( BYTE* s1, BYTE* d1, int w )
+void Scale2x_YUY2_c(BYTE* s1, BYTE* d1, int w)
{
- for (BYTE* s3 = s1 + ((w>>1)-1)*4; s1 < s3; s1 += 4, d1 += 8) {
- d1[0] = s1[0];
- d1[1] = s1[1];
- d1[2] = (s1[0]+s1[2])>>1;
- d1[3] = s1[3];
-
- d1[4] = s1[2];
- d1[5] = (s1[1]+s1[5])>>1;
- d1[6] = (s1[2]+s1[4])>>1;
- d1[7] = (s1[3]+s1[7])>>1;
- }
-
- *d1++ = s1[0];
- *d1++ = s1[1];
- *d1++ =(s1[0]+s1[2])>>1;
- *d1++ = s1[3];
-
- *d1++ = s1[2];
- *d1++ = s1[1];
- *d1++ = s1[2];
- *d1++ = s1[3];
-
- s1 += 4;
+ for (BYTE* s3 = s1 + ((w >> 1) - 1) * 4; s1 < s3; s1 += 4, d1 += 8) {
+ d1[0] = s1[0];
+ d1[1] = s1[1];
+ d1[2] = (s1[0] + s1[2]) >> 1;
+ d1[3] = s1[3];
+
+ d1[4] = s1[2];
+ d1[5] = (s1[1] + s1[5]) >> 1;
+ d1[6] = (s1[2] + s1[4]) >> 1;
+ d1[7] = (s1[3] + s1[7]) >> 1;
+ }
+
+ *d1++ = s1[0];
+ *d1++ = s1[1];
+ *d1++ = (s1[0] + s1[2]) >> 1;
+ *d1++ = s1[3];
+
+ *d1++ = s1[2];
+ *d1++ = s1[1];
+ *d1++ = s1[2];
+ *d1++ = s1[3];
+
+ s1 += 4;
}
-void Scale2x_YUY2( int w, int h, BYTE* d, int dpitch, BYTE* s, int spitch )
+void Scale2x_YUY2(int w, int h, BYTE* d, int dpitch, BYTE* s, int spitch)
{
- void (*scale_func)(BYTE* s1, BYTE* d1, int w);
+ void (*scale_func)(BYTE * s1, BYTE * d1, int w);
#ifdef _WIN64
- scale_func = Scale2x_YUY2_SSE2;
+ scale_func = Scale2x_YUY2_SSE2;
#else
- scale_func = Scale2x_YUY2_MMX;
+ scale_func = Scale2x_YUY2_MMX;
#endif
- //scale_func = Scale2x_YUY2_c;
+ //scale_func = Scale2x_YUY2_c;
- //unsigned __int64 __0xffffffff00000000 = 0xffffffff00000000;
- //unsigned __int64 __0x00000000ffffffff = 0x00000000ffffffff;
- //unsigned __int64 __0x00ff00ff00ff00ff = 0x00ff00ff00ff00ff;
+ //unsigned __int64 __0xffffffff00000000 = 0xffffffff00000000;
+ //unsigned __int64 __0x00000000ffffffff = 0x00000000ffffffff;
+ //unsigned __int64 __0x00ff00ff00ff00ff = 0x00ff00ff00ff00ff;
- BYTE* s1;
- BYTE* s2;
- BYTE* d1;
+ BYTE* s1;
+ BYTE* s2;
+ BYTE* d1;
- for (s1 = s, s2 = s + h*spitch, d1 = d; s1 < s2; d1 += dpitch) {
- // row0, 4 pixels: y1|u1|y2|v1|y3|u2|y4|v2
- // ->
- // row0, 8 pixels: y1|u1|(y1+y2)/2|v1|y2|(u1+u2)/2|(y2+y3)/2|(v1+v2)/2
+ for (s1 = s, s2 = s + h * spitch, d1 = d; s1 < s2; d1 += dpitch) {
+ // row0, 4 pixels: y1|u1|y2|v1|y3|u2|y4|v2
+ // ->
+ // row0, 8 pixels: y1|u1|(y1+y2)/2|v1|y2|(u1+u2)/2|(y2+y3)/2|(v1+v2)/2
- scale_func(s1, d1, w);
+ scale_func(s1, d1, w);
- s1 += spitch;
- d1 += dpitch;
- }
+ s1 += spitch;
+ d1 += dpitch;
+ }
#ifndef _WIN64
- __asm emms;
+ __asm emms;
#endif
- AvgLines8(d, h*2, dpitch);
+ AvgLines8(d, h * 2, dpitch);
}
-void Scale2x_RGB555( int w, int h, BYTE* d, int dpitch, BYTE* s, int spitch )
+void Scale2x_RGB555(int w, int h, BYTE* d, int dpitch, BYTE* s, int spitch)
{
- BYTE* s1;
- BYTE* s2;
- BYTE* d1;
+ BYTE* s1;
+ BYTE* s2;
+ BYTE* d1;
- for (s1 = s, s2 = s + h*spitch, d1 = d; s1 < s2; d1 += dpitch) { // TODO: replace this mess with mmx code
- BYTE* stmp = s1 + spitch;
- BYTE* dtmp = d1 + dpitch;
+ for (s1 = s, s2 = s + h * spitch, d1 = d; s1 < s2; d1 += dpitch) { // TODO: replace this mess with mmx code
+ BYTE* stmp = s1 + spitch;
+ BYTE* dtmp = d1 + dpitch;
- for (BYTE* s3 = s1 + (w-1)*2; s1 < s3; s1 += 2, d1 += 4) {
- *((WORD*)d1) = *((WORD*)s1);
- *((WORD*)d1+1) =
- ((((*((WORD*)s1)&0x7c00) + (*((WORD*)s1+1)&0x7c00)) >> 1)&0x7c00)|
- ((((*((WORD*)s1)&0x03e0) + (*((WORD*)s1+1)&0x03e0)) >> 1)&0x03e0)|
- ((((*((WORD*)s1)&0x001f) + (*((WORD*)s1+1)&0x001f)) >> 1)&0x001f);
- }
+ for (BYTE* s3 = s1 + (w - 1) * 2; s1 < s3; s1 += 2, d1 += 4) {
+ *((WORD*)d1) = *((WORD*)s1);
+ *((WORD*)d1 + 1) =
+ ((((*((WORD*)s1) & 0x7c00) + (*((WORD*)s1 + 1) & 0x7c00)) >> 1) & 0x7c00) |
+ ((((*((WORD*)s1) & 0x03e0) + (*((WORD*)s1 + 1) & 0x03e0)) >> 1) & 0x03e0) |
+ ((((*((WORD*)s1) & 0x001f) + (*((WORD*)s1 + 1) & 0x001f)) >> 1) & 0x001f);
+ }
- *((WORD*)d1) = *((WORD*)s1);
- *((WORD*)d1+1) = *((WORD*)s1);
+ *((WORD*)d1) = *((WORD*)s1);
+ *((WORD*)d1 + 1) = *((WORD*)s1);
- s1 += 2;
- d1 += 4;
+ s1 += 2;
+ d1 += 4;
- s1 = stmp;
- d1 = dtmp;
- }
+ s1 = stmp;
+ d1 = dtmp;
+ }
- AvgLines555(d, h*2, dpitch);
+ AvgLines555(d, h * 2, dpitch);
}
-void Scale2x_RGB565( int w, int h, BYTE* d, int dpitch, BYTE* s, int spitch )
+void Scale2x_RGB565(int w, int h, BYTE* d, int dpitch, BYTE* s, int spitch)
{
- BYTE* s1;
- BYTE* s2;
- BYTE* d1;
+ BYTE* s1;
+ BYTE* s2;
+ BYTE* d1;
- for (s1 = s, s2 = s + h*spitch, d1 = d; s1 < s2; d1 += dpitch) { // TODO: replace this mess with mmx code
- BYTE* stmp = s1 + spitch;
- BYTE* dtmp = d1 + dpitch;
+ for (s1 = s, s2 = s + h * spitch, d1 = d; s1 < s2; d1 += dpitch) { // TODO: replace this mess with mmx code
+ BYTE* stmp = s1 + spitch;
+ BYTE* dtmp = d1 + dpitch;
- for (BYTE* s3 = s1 + (w-1)*2; s1 < s3; s1 += 2, d1 += 4) {
- *((WORD*)d1) = *((WORD*)s1);
- *((WORD*)d1+1) =
- ((((*((WORD*)s1)&0xf800) + (*((WORD*)s1+1)&0xf800)) >> 1)&0xf800)|
- ((((*((WORD*)s1)&0x07e0) + (*((WORD*)s1+1)&0x07e0)) >> 1)&0x07e0)|
- ((((*((WORD*)s1)&0x001f) + (*((WORD*)s1+1)&0x001f)) >> 1)&0x001f);
- }
+ for (BYTE* s3 = s1 + (w - 1) * 2; s1 < s3; s1 += 2, d1 += 4) {
+ *((WORD*)d1) = *((WORD*)s1);
+ *((WORD*)d1 + 1) =
+ ((((*((WORD*)s1) & 0xf800) + (*((WORD*)s1 + 1) & 0xf800)) >> 1) & 0xf800) |
+ ((((*((WORD*)s1) & 0x07e0) + (*((WORD*)s1 + 1) & 0x07e0)) >> 1) & 0x07e0) |
+ ((((*((WORD*)s1) & 0x001f) + (*((WORD*)s1 + 1) & 0x001f)) >> 1) & 0x001f);
+ }
- *((WORD*)d1) = *((WORD*)s1);
- *((WORD*)d1+1) = *((WORD*)s1);
+ *((WORD*)d1) = *((WORD*)s1);
+ *((WORD*)d1 + 1) = *((WORD*)s1);
- s1 += 2;
- d1 += 4;
+ s1 += 2;
+ d1 += 4;
- s1 = stmp;
- d1 = dtmp;
- }
+ s1 = stmp;
+ d1 = dtmp;
+ }
- AvgLines565(d, h*2, dpitch);
+ AvgLines565(d, h * 2, dpitch);
}
-void Scale2x_RGB24( int w, int h, BYTE* d, int dpitch, BYTE* s, int spitch )
+void Scale2x_RGB24(int w, int h, BYTE* d, int dpitch, BYTE* s, int spitch)
{
- BYTE* s1;
- BYTE* s2;
- BYTE* d1;
-
- for (s1 = s, s2 = s + h*spitch, d1 = d; s1 < s2; d1 += dpitch) { // TODO: replace this mess with mmx code
- BYTE* stmp = s1 + spitch;
- BYTE* dtmp = d1 + dpitch;
-
- for (BYTE* s3 = s1 + (w-1)*3; s1 < s3; s1 += 3, d1 += 6) {
- d1[0] = s1[0];
- d1[1] = s1[1];
- d1[2] = s1[2];
- d1[3] = (s1[0]+s1[3])>>1;
- d1[4] = (s1[1]+s1[4])>>1;
- d1[5] = (s1[2]+s1[5])>>1;
- }
-
- d1[0] = d1[3] = s1[0];
- d1[1] = d1[4] = s1[1];
- d1[2] = d1[5] = s1[2];
-
- s1 += 3;
- d1 += 6;
-
- s1 = stmp;
- d1 = dtmp;
- }
-
- AvgLines8(d, h*2, dpitch);
+ BYTE* s1;
+ BYTE* s2;
+ BYTE* d1;
+
+ for (s1 = s, s2 = s + h * spitch, d1 = d; s1 < s2; d1 += dpitch) { // TODO: replace this mess with mmx code
+ BYTE* stmp = s1 + spitch;
+ BYTE* dtmp = d1 + dpitch;
+
+ for (BYTE* s3 = s1 + (w - 1) * 3; s1 < s3; s1 += 3, d1 += 6) {
+ d1[0] = s1[0];
+ d1[1] = s1[1];
+ d1[2] = s1[2];
+ d1[3] = (s1[0] + s1[3]) >> 1;
+ d1[4] = (s1[1] + s1[4]) >> 1;
+ d1[5] = (s1[2] + s1[5]) >> 1;
+ }
+
+ d1[0] = d1[3] = s1[0];
+ d1[1] = d1[4] = s1[1];
+ d1[2] = d1[5] = s1[2];
+
+ s1 += 3;
+ d1 += 6;
+
+ s1 = stmp;
+ d1 = dtmp;
+ }
+
+ AvgLines8(d, h * 2, dpitch);
}
#ifdef _WIN64
-void Scale2x_XRGB32_SSE2( BYTE* s1, BYTE* d1, int w )
+void Scale2x_XRGB32_SSE2(BYTE* s1, BYTE* d1, int w)
{
- __m128i mm_zero = _mm_setzero_si128();//pxor mm0, mm0
- for (BYTE* s3 = s1 + (w-1)*4; s1 < s3; s1 += 4, d1 += 8) {
+ __m128i mm_zero = _mm_setzero_si128();//pxor mm0, mm0
+ for (BYTE* s3 = s1 + (w - 1) * 4; s1 < s3; s1 += 4, d1 += 8) {
- __m128i mm1 = _mm_cvtsi64_si128(*(size_t*)s1); //movq mm1, [esi]
- __m128i mm2 = _mm_move_epi64(mm1); //movq mm2, mm1
+ __m128i mm1 = _mm_cvtsi64_si128(*(size_t*)s1); //movq mm1, [esi]
+ __m128i mm2 = _mm_move_epi64(mm1); //movq mm2, mm1
- mm1 = _mm_unpacklo_epi8(mm1,mm_zero);//punpcklbw mm1, mm0 // mm1 = 00xx00r100g100b1
- mm2 = _mm_unpacklo_epi8(mm2,mm_zero);//punpckhbw mm2, mm0 // mm2 = 00xx00r200g200b2
+ mm1 = _mm_unpacklo_epi8(mm1, mm_zero); //punpcklbw mm1, mm0 // mm1 = 00xx00r100g100b1
+ mm2 = _mm_unpacklo_epi8(mm2, mm_zero); //punpckhbw mm2, mm0 // mm2 = 00xx00r200g200b2
- mm2 = _mm_adds_epi16(mm2,mm1); //paddw mm2, mm1
- mm2 = _mm_srli_epi16(mm2, 1); //psrlw mm2, 1 // mm2 = (mm1 + mm2) / 2
+ mm2 = _mm_adds_epi16(mm2, mm1); //paddw mm2, mm1
+ mm2 = _mm_srli_epi16(mm2, 1); //psrlw mm2, 1 // mm2 = (mm1 + mm2) / 2
- mm1 = _mm_packus_epi16(mm1,mm2); //packuswb mm1, mm2
+ mm1 = _mm_packus_epi16(mm1, mm2); //packuswb mm1, mm2
- *(size_t*)d1=(size_t)_mm_cvtsi128_si64(mm1);//movq [edi], mm1
- }
+ *(size_t*)d1 = (size_t)_mm_cvtsi128_si64(mm1); //movq [edi], mm1
+ }
- *((DWORD*)d1) = *((DWORD*)s1);
- *((DWORD*)d1+1) = *((DWORD*)s1);
+ *((DWORD*)d1) = *((DWORD*)s1);
+ *((DWORD*)d1 + 1) = *((DWORD*)s1);
- s1 += 4;
- d1 += 8;
+ s1 += 4;
+ d1 += 8;
}
#else
-void Scale2x_XRGB32_MMX( BYTE* s1, BYTE* d1, int w )
+void Scale2x_XRGB32_MMX(BYTE* s1, BYTE* d1, int w)
{
- __asm {
- mov esi, s1
- mov edi, d1
+ __asm {
+ mov esi, s1
+ mov edi, d1
- mov ecx, w
- dec ecx
+ mov ecx, w
+ dec ecx
- pxor mm0, mm0
- row_loop3:
- movq mm1, [esi]
- movq mm2, mm1
+ pxor mm0, mm0
+ row_loop3:
+ movq mm1, [esi]
+ movq mm2, mm1
- punpcklbw mm1, mm0 // mm1 = 00xx00r100g100b1
- punpckhbw mm2, mm0 // mm2 = 00xx00r200g200b2
+ punpcklbw mm1, mm0 // mm1 = 00xx00r100g100b1
+ punpckhbw mm2, mm0 // mm2 = 00xx00r200g200b2
- paddw mm2, mm1
- psrlw mm2, 1 // mm2 = (mm1 + mm2) / 2
+ paddw mm2, mm1
+ psrlw mm2, 1 // mm2 = (mm1 + mm2) / 2
- packuswb mm1, mm2
+ packuswb mm1, mm2
- movq [edi], mm1
+ movq [edi], mm1
- lea esi, [esi+4]
- lea edi, [edi+8]
+ lea esi, [esi+4]
+ lea edi, [edi+8]
- dec ecx
- jnz row_loop3
+ dec ecx
+ jnz row_loop3
- mov s1, esi
- mov d1, edi
- };
+ mov s1, esi
+ mov d1, edi
+ };
- *((DWORD*)d1) = *((DWORD*)s1);
- *((DWORD*)d1+1) = *((DWORD*)s1);
+ *((DWORD*)d1) = *((DWORD*)s1);
+ *((DWORD*)d1 + 1) = *((DWORD*)s1);
- s1 += 4;
- d1 += 8;
+ s1 += 4;
+ d1 += 8;
}
#endif
-void Scale2x_XRGB32_c( BYTE* s1, BYTE* d1, int w )
+void Scale2x_XRGB32_c(BYTE* s1, BYTE* d1, int w)
{
- for (BYTE* s3 = s1 + (w-1)*4; s1 < s3; s1 += 3, d1 += 6) {
- d1[0] = s1[0];
- d1[1] = s1[1];
- d1[2] = s1[2];
- d1[3] = s1[3];
-
- d1[4] = (s1[0]+s1[4])>>1;
- d1[5] = (s1[1]+s1[5])>>1;
- d1[6] = (s1[2]+s1[6])>>1;
- d1[7] = (s1[4]+s1[7])>>1;
- }
-
- *((DWORD*)d1) = *((DWORD*)s1);
- *((DWORD*)d1+1) = *((DWORD*)s1);
-
- s1 += 4;
- d1 += 8;
+ for (BYTE* s3 = s1 + (w - 1) * 4; s1 < s3; s1 += 3, d1 += 6) {
+ d1[0] = s1[0];
+ d1[1] = s1[1];
+ d1[2] = s1[2];
+ d1[3] = s1[3];
+
+ d1[4] = (s1[0] + s1[4]) >> 1;
+ d1[5] = (s1[1] + s1[5]) >> 1;
+ d1[6] = (s1[2] + s1[6]) >> 1;
+ d1[7] = (s1[4] + s1[7]) >> 1;
+ }
+
+ *((DWORD*)d1) = *((DWORD*)s1);
+ *((DWORD*)d1 + 1) = *((DWORD*)s1);
+
+ s1 += 4;
+ d1 += 8;
}
-void Scale2x_XRGB32( int w, int h, BYTE* d, int dpitch, BYTE* s, int spitch )
+void Scale2x_XRGB32(int w, int h, BYTE* d, int dpitch, BYTE* s, int spitch)
{
- void (*scale_func)(BYTE* s1, BYTE* d1, int w);
+ void (*scale_func)(BYTE * s1, BYTE * d1, int w);
#ifdef _WIN64
- scale_func = Scale2x_XRGB32_SSE2;
+ scale_func = Scale2x_XRGB32_SSE2;
#else
- scale_func = Scale2x_XRGB32_MMX;
+ scale_func = Scale2x_XRGB32_MMX;
#endif
- //scale_func = Scale2x_XRGB32_c;
+ //scale_func = Scale2x_XRGB32_c;
- BYTE* s1;
- BYTE* s2;
- BYTE* d1;
+ BYTE* s1;
+ BYTE* s2;
+ BYTE* d1;
- for (s1 = s, s2 = s + h*spitch, d1 = d; s1 < s2; d1 += dpitch) {
- scale_func(s1, d1, w);
+ for (s1 = s, s2 = s + h * spitch, d1 = d; s1 < s2; d1 += dpitch) {
+ scale_func(s1, d1, w);
- s1 += spitch;
- d1 += dpitch;
- }
+ s1 += spitch;
+ d1 += dpitch;
+ }
#ifndef _WIN64
- __asm emms;
+ __asm emms;
#endif
- AvgLines8(d, h*2, dpitch);
+ AvgLines8(d, h * 2, dpitch);
}
/* ResX2 */
void Scale2x(const GUID& subtype, BYTE* d, int dpitch, BYTE* s, int spitch, int w, int h)
{
- if (subtype == MEDIASUBTYPE_YV12 || subtype == MEDIASUBTYPE_I420 || subtype == MEDIASUBTYPE_IYUV) {
- Scale2x_YV(w, h, d, dpitch, s, spitch);
- } else if (subtype == MEDIASUBTYPE_YUY2) {
- Scale2x_YUY2(w, h, d, dpitch, s, spitch);
- } else if (subtype == MEDIASUBTYPE_RGB555) {
- Scale2x_RGB555(w, h, d, dpitch, s, spitch);
- } else if (subtype == MEDIASUBTYPE_RGB565) {
- Scale2x_RGB565(w, h, d, dpitch, s, spitch);
- } else if (subtype == MEDIASUBTYPE_RGB24) {
- Scale2x_RGB24(w, h, d, dpitch, s, spitch);
- } else if (subtype == MEDIASUBTYPE_RGB32 || subtype == MEDIASUBTYPE_ARGB32) {
- Scale2x_XRGB32(w, h, d, dpitch, s, spitch);
- }
+ if (subtype == MEDIASUBTYPE_YV12 || subtype == MEDIASUBTYPE_I420 || subtype == MEDIASUBTYPE_IYUV) {
+ Scale2x_YV(w, h, d, dpitch, s, spitch);
+ } else if (subtype == MEDIASUBTYPE_YUY2) {
+ Scale2x_YUY2(w, h, d, dpitch, s, spitch);
+ } else if (subtype == MEDIASUBTYPE_RGB555) {
+ Scale2x_RGB555(w, h, d, dpitch, s, spitch);
+ } else if (subtype == MEDIASUBTYPE_RGB565) {
+ Scale2x_RGB565(w, h, d, dpitch, s, spitch);
+ } else if (subtype == MEDIASUBTYPE_RGB24) {
+ Scale2x_RGB24(w, h, d, dpitch, s, spitch);
+ } else if (subtype == MEDIASUBTYPE_RGB32 || subtype == MEDIASUBTYPE_ARGB32) {
+ Scale2x_XRGB32(w, h, d, dpitch, s, spitch);
+ }
}
diff --git a/src/filters/transform/VSFilter/StyleEditorDialog.cpp b/src/filters/transform/VSFilter/StyleEditorDialog.cpp
index 8f7d8617b..f401d5ace 100644
--- a/src/filters/transform/VSFilter/StyleEditorDialog.cpp
+++ b/src/filters/transform/VSFilter/StyleEditorDialog.cpp
@@ -39,21 +39,21 @@ END_MESSAGE_MAP()
IMPLEMENT_DYNAMIC(CStyleEditorDialog, CDialog)
CStyleEditorDialog::CStyleEditorDialog(CString title, STSStyle* pstss, CWnd* pParent /*=NULL*/)
- : CDialog(CStyleEditorDialog::IDD, pParent)
- , m_title(title)
- , m_stss(*pstss)
- , m_pParent(pParent)
- , m_iCharset(0)
- , m_spacing(0)
- , m_angle(0)
- , m_scalex(0)
- , m_scaley(0)
- , m_borderstyle(0)
- , m_borderwidth(0)
- , m_shadowdepth(0)
- , m_screenalignment(0)
- , m_margin(0,0,0,0)
- , m_linkalphasliders(FALSE)
+ : CDialog(CStyleEditorDialog::IDD, pParent)
+ , m_title(title)
+ , m_stss(*pstss)
+ , m_pParent(pParent)
+ , m_iCharset(0)
+ , m_spacing(0)
+ , m_angle(0)
+ , m_scalex(0)
+ , m_scaley(0)
+ , m_borderstyle(0)
+ , m_borderwidth(0)
+ , m_shadowdepth(0)
+ , m_screenalignment(0)
+ , m_margin(0, 0, 0, 0)
+ , m_linkalphasliders(FALSE)
{
}
@@ -63,138 +63,138 @@ CStyleEditorDialog::~CStyleEditorDialog()
void CStyleEditorDialog::DoDataExchange(CDataExchange* pDX)
{
- CDialog::DoDataExchange(pDX);
- DDX_Control(pDX, IDC_BUTTON1, m_font);
- DDX_CBIndex(pDX, IDC_COMBO1, m_iCharset);
- DDX_Control(pDX, IDC_COMBO1, m_charset);
- DDX_Text(pDX, IDC_EDIT3, m_spacing);
- DDX_Control(pDX, IDC_SPIN3, m_spacingspin);
- DDX_Text(pDX, IDC_EDIT11, m_angle);
- DDX_Control(pDX, IDC_SPIN10, m_anglespin);
- DDX_Text(pDX, IDC_EDIT5, m_scalex);
- DDX_Control(pDX, IDC_SPIN4, m_scalexspin);
- DDX_Text(pDX, IDC_EDIT6, m_scaley);
- DDX_Control(pDX, IDC_SPIN5, m_scaleyspin);
- DDX_Radio(pDX, IDC_RADIO1, m_borderstyle);
- DDX_Text(pDX, IDC_EDIT1, m_borderwidth);
- DDX_Control(pDX, IDC_SPIN1, m_borderwidthspin);
- DDX_Text(pDX, IDC_EDIT2, m_shadowdepth);
- DDX_Control(pDX, IDC_SPIN2, m_shadowdepthspin);
- DDX_Radio(pDX, IDC_RADIO3, m_screenalignment);
- DDX_Text(pDX, IDC_EDIT7, m_margin.left);
- DDX_Control(pDX, IDC_SPIN6, m_marginleftspin);
- DDX_Text(pDX, IDC_EDIT8, m_margin.right);
- DDX_Control(pDX, IDC_SPIN7, m_marginrightspin);
- DDX_Text(pDX, IDC_EDIT9, m_margin.top);
- DDX_Control(pDX, IDC_SPIN8, m_margintopspin);
- DDX_Text(pDX, IDC_EDIT10, m_margin.bottom);
- DDX_Control(pDX, IDC_SPIN9, m_marginbottomspin);
- DDX_Control(pDX, IDC_COLORPRI, m_color[0]);
- DDX_Control(pDX, IDC_COLORSEC, m_color[1]);
- DDX_Control(pDX, IDC_COLOROUTL, m_color[2]);
- DDX_Control(pDX, IDC_COLORSHAD, m_color[3]);
- DDX_Slider(pDX, IDC_SLIDER2, m_alpha[0]);
- DDX_Slider(pDX, IDC_SLIDER3, m_alpha[1]);
- DDX_Slider(pDX, IDC_SLIDER5, m_alpha[2]);
- DDX_Slider(pDX, IDC_SLIDER6, m_alpha[3]);
- DDX_Control(pDX, IDC_SLIDER2, m_alphasliders[0]);
- DDX_Control(pDX, IDC_SLIDER3, m_alphasliders[1]);
- DDX_Control(pDX, IDC_SLIDER5, m_alphasliders[2]);
- DDX_Control(pDX, IDC_SLIDER6, m_alphasliders[3]);
- DDX_Check(pDX, IDC_CHECK1, m_linkalphasliders);
+ CDialog::DoDataExchange(pDX);
+ DDX_Control(pDX, IDC_BUTTON1, m_font);
+ DDX_CBIndex(pDX, IDC_COMBO1, m_iCharset);
+ DDX_Control(pDX, IDC_COMBO1, m_charset);
+ DDX_Text(pDX, IDC_EDIT3, m_spacing);
+ DDX_Control(pDX, IDC_SPIN3, m_spacingspin);
+ DDX_Text(pDX, IDC_EDIT11, m_angle);
+ DDX_Control(pDX, IDC_SPIN10, m_anglespin);
+ DDX_Text(pDX, IDC_EDIT5, m_scalex);
+ DDX_Control(pDX, IDC_SPIN4, m_scalexspin);
+ DDX_Text(pDX, IDC_EDIT6, m_scaley);
+ DDX_Control(pDX, IDC_SPIN5, m_scaleyspin);
+ DDX_Radio(pDX, IDC_RADIO1, m_borderstyle);
+ DDX_Text(pDX, IDC_EDIT1, m_borderwidth);
+ DDX_Control(pDX, IDC_SPIN1, m_borderwidthspin);
+ DDX_Text(pDX, IDC_EDIT2, m_shadowdepth);
+ DDX_Control(pDX, IDC_SPIN2, m_shadowdepthspin);
+ DDX_Radio(pDX, IDC_RADIO3, m_screenalignment);
+ DDX_Text(pDX, IDC_EDIT7, m_margin.left);
+ DDX_Control(pDX, IDC_SPIN6, m_marginleftspin);
+ DDX_Text(pDX, IDC_EDIT8, m_margin.right);
+ DDX_Control(pDX, IDC_SPIN7, m_marginrightspin);
+ DDX_Text(pDX, IDC_EDIT9, m_margin.top);
+ DDX_Control(pDX, IDC_SPIN8, m_margintopspin);
+ DDX_Text(pDX, IDC_EDIT10, m_margin.bottom);
+ DDX_Control(pDX, IDC_SPIN9, m_marginbottomspin);
+ DDX_Control(pDX, IDC_COLORPRI, m_color[0]);
+ DDX_Control(pDX, IDC_COLORSEC, m_color[1]);
+ DDX_Control(pDX, IDC_COLOROUTL, m_color[2]);
+ DDX_Control(pDX, IDC_COLORSHAD, m_color[3]);
+ DDX_Slider(pDX, IDC_SLIDER2, m_alpha[0]);
+ DDX_Slider(pDX, IDC_SLIDER3, m_alpha[1]);
+ DDX_Slider(pDX, IDC_SLIDER5, m_alpha[2]);
+ DDX_Slider(pDX, IDC_SLIDER6, m_alpha[3]);
+ DDX_Control(pDX, IDC_SLIDER2, m_alphasliders[0]);
+ DDX_Control(pDX, IDC_SLIDER3, m_alphasliders[1]);
+ DDX_Control(pDX, IDC_SLIDER5, m_alphasliders[2]);
+ DDX_Control(pDX, IDC_SLIDER6, m_alphasliders[3]);
+ DDX_Check(pDX, IDC_CHECK1, m_linkalphasliders);
}
void CStyleEditorDialog::UpdateControlData(bool fSave)
{
- if (fSave) {
- UpdateData();
-
- if (m_iCharset >= 0) {
- m_stss.charSet = m_charset.GetItemData(m_iCharset);
- }
- m_stss.fontSpacing = m_spacing;
- m_stss.fontAngleZ = m_angle;
- m_stss.fontScaleX = m_scalex;
- m_stss.fontScaleY = m_scaley;
-
- m_stss.borderStyle = m_borderstyle;
- m_stss.outlineWidthX = m_stss.outlineWidthY = m_borderwidth;
- m_stss.shadowDepthX = m_stss.shadowDepthY = m_shadowdepth;
-
- m_stss.scrAlignment = m_screenalignment+1;
- m_stss.marginRect = m_margin;
-
- for (ptrdiff_t i = 0; i < 4; i++) {
- m_stss.alpha[i] = 255-m_alpha[i];
- }
- } else {
- m_font.SetWindowText(m_stss.fontName);
- m_iCharset = -1;
- for (ptrdiff_t i = 0; i < CharSetLen; i++) {
- CString str;
- str.Format(_T("%s (%d)"), CharSetNames[i], CharSetList[i]);
- m_charset.AddString(str);
- m_charset.SetItemData(i, CharSetList[i]);
- if (m_stss.charSet == CharSetList[i]) {
- m_iCharset = i;
- }
- }
- // TODO: allow floats in these edit boxes
- m_spacing = (int)m_stss.fontSpacing;
- m_spacingspin.SetRange32(-10000, 10000);
- while (m_stss.fontAngleZ < 0) {
- m_stss.fontAngleZ += 360;
- }
- m_angle = (int)fmod(m_stss.fontAngleZ, 360);
- m_anglespin.SetRange32(0, 359);
- m_scalex = (int)m_stss.fontScaleX;
- m_scalexspin.SetRange32(-10000, 10000);
- m_scaley = (int)m_stss.fontScaleY;
- m_scaleyspin.SetRange32(-10000, 10000);
-
- m_borderstyle = m_stss.borderStyle;
- m_borderwidth = (int)min(m_stss.outlineWidthX, m_stss.outlineWidthY);
- m_borderwidthspin.SetRange32(0, 10000);
- m_shadowdepth = (int)min(m_stss.shadowDepthX, m_stss.shadowDepthY);
- m_shadowdepthspin.SetRange32(0, 10000);
-
- m_screenalignment = m_stss.scrAlignment-1;
- m_margin = m_stss.marginRect;
- m_marginleftspin.SetRange32(-10000, 10000);
- m_marginrightspin.SetRange32(-10000, 10000);
- m_margintopspin.SetRange32(-10000, 10000);
- m_marginbottomspin.SetRange32(-10000, 10000);
-
- for (ptrdiff_t i = 0; i < 4; i++) {
- m_color[i].SetColorPtr(&m_stss.colors[i]);
- m_alpha[i] = 255-m_stss.alpha[i];
- m_alphasliders[i].SetRange(0, 255);
- }
-
- m_linkalphasliders = FALSE;
-
- UpdateData(FALSE);
- }
+ if (fSave) {
+ UpdateData();
+
+ if (m_iCharset >= 0) {
+ m_stss.charSet = m_charset.GetItemData(m_iCharset);
+ }
+ m_stss.fontSpacing = m_spacing;
+ m_stss.fontAngleZ = m_angle;
+ m_stss.fontScaleX = m_scalex;
+ m_stss.fontScaleY = m_scaley;
+
+ m_stss.borderStyle = m_borderstyle;
+ m_stss.outlineWidthX = m_stss.outlineWidthY = m_borderwidth;
+ m_stss.shadowDepthX = m_stss.shadowDepthY = m_shadowdepth;
+
+ m_stss.scrAlignment = m_screenalignment + 1;
+ m_stss.marginRect = m_margin;
+
+ for (ptrdiff_t i = 0; i < 4; i++) {
+ m_stss.alpha[i] = 255 - m_alpha[i];
+ }
+ } else {
+ m_font.SetWindowText(m_stss.fontName);
+ m_iCharset = -1;
+ for (ptrdiff_t i = 0; i < CharSetLen; i++) {
+ CString str;
+ str.Format(_T("%s (%d)"), CharSetNames[i], CharSetList[i]);
+ m_charset.AddString(str);
+ m_charset.SetItemData(i, CharSetList[i]);
+ if (m_stss.charSet == CharSetList[i]) {
+ m_iCharset = i;
+ }
+ }
+ // TODO: allow floats in these edit boxes
+ m_spacing = (int)m_stss.fontSpacing;
+ m_spacingspin.SetRange32(-10000, 10000);
+ while (m_stss.fontAngleZ < 0) {
+ m_stss.fontAngleZ += 360;
+ }
+ m_angle = (int)fmod(m_stss.fontAngleZ, 360);
+ m_anglespin.SetRange32(0, 359);
+ m_scalex = (int)m_stss.fontScaleX;
+ m_scalexspin.SetRange32(-10000, 10000);
+ m_scaley = (int)m_stss.fontScaleY;
+ m_scaleyspin.SetRange32(-10000, 10000);
+
+ m_borderstyle = m_stss.borderStyle;
+ m_borderwidth = (int)min(m_stss.outlineWidthX, m_stss.outlineWidthY);
+ m_borderwidthspin.SetRange32(0, 10000);
+ m_shadowdepth = (int)min(m_stss.shadowDepthX, m_stss.shadowDepthY);
+ m_shadowdepthspin.SetRange32(0, 10000);
+
+ m_screenalignment = m_stss.scrAlignment - 1;
+ m_margin = m_stss.marginRect;
+ m_marginleftspin.SetRange32(-10000, 10000);
+ m_marginrightspin.SetRange32(-10000, 10000);
+ m_margintopspin.SetRange32(-10000, 10000);
+ m_marginbottomspin.SetRange32(-10000, 10000);
+
+ for (ptrdiff_t i = 0; i < 4; i++) {
+ m_color[i].SetColorPtr(&m_stss.colors[i]);
+ m_alpha[i] = 255 - m_stss.alpha[i];
+ m_alphasliders[i].SetRange(0, 255);
+ }
+
+ m_linkalphasliders = FALSE;
+
+ UpdateData(FALSE);
+ }
}
void CStyleEditorDialog::AskColor(int i)
{
- CColorDialog dlg(m_stss.colors[i]);
- dlg.m_cc.Flags |= CC_FULLOPEN;
- if (dlg.DoModal() == IDOK) {
- m_stss.colors[i] = dlg.m_cc.rgbResult;
- m_color[i].Invalidate();
- }
+ CColorDialog dlg(m_stss.colors[i]);
+ dlg.m_cc.Flags |= CC_FULLOPEN;
+ if (dlg.DoModal() == IDOK) {
+ m_stss.colors[i] = dlg.m_cc.rgbResult;
+ m_color[i].Invalidate();
+ }
}
BEGIN_MESSAGE_MAP(CStyleEditorDialog, CDialog)
- ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
- ON_STN_CLICKED(IDC_COLORPRI, OnStnClickedColorpri)
- ON_STN_CLICKED(IDC_COLORSEC, OnStnClickedColorsec)
- ON_STN_CLICKED(IDC_COLOROUTL, OnStnClickedColoroutl)
- ON_STN_CLICKED(IDC_COLORSHAD, OnStnClickedColorshad)
- ON_BN_CLICKED(IDC_CHECK1, OnBnClickedCheck1)
- ON_WM_HSCROLL()
+ ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
+ ON_STN_CLICKED(IDC_COLORPRI, OnStnClickedColorpri)
+ ON_STN_CLICKED(IDC_COLORSEC, OnStnClickedColorsec)
+ ON_STN_CLICKED(IDC_COLOROUTL, OnStnClickedColoroutl)
+ ON_STN_CLICKED(IDC_COLORSHAD, OnStnClickedColorshad)
+ ON_BN_CLICKED(IDC_CHECK1, OnBnClickedCheck1)
+ ON_WM_HSCROLL()
END_MESSAGE_MAP()
@@ -202,89 +202,89 @@ END_MESSAGE_MAP()
BOOL CStyleEditorDialog::OnInitDialog()
{
- CDialog::OnInitDialog();
+ CDialog::OnInitDialog();
- SetWindowText(_T("Style Editor - \"") + m_title + _T("\""));
+ SetWindowText(_T("Style Editor - \"") + m_title + _T("\""));
- UpdateControlData(false);
+ UpdateControlData(false);
- return TRUE; // return TRUE unless you set the focus to a control
- // EXCEPTION: OCX Property Pages should return FALSE
+ return TRUE; // return TRUE unless you set the focus to a control
+ // EXCEPTION: OCX Property Pages should return FALSE
}
void CStyleEditorDialog::OnOK()
{
- UpdateControlData(true);
+ UpdateControlData(true);
- CDialog::OnOK();
+ CDialog::OnOK();
}
void CStyleEditorDialog::OnBnClickedButton1()
{
- LOGFONT lf;
- lf <<= m_stss;
-
- CFontDialog dlg(&lf, CF_SCREENFONTS|CF_INITTOLOGFONTSTRUCT|CF_FORCEFONTEXIST|CF_SCALABLEONLY|CF_EFFECTS);
- if (dlg.DoModal() == IDOK) {
- CString str(lf.lfFaceName);
- if (str.GetLength() > 16) {
- str = str.Left(14) + _T("...");
- }
- m_font.SetWindowText(str);
-
- for (int i = 0, j = m_charset.GetCount(); i < j; i++) {
- if (m_charset.GetItemData(i) == lf.lfCharSet) {
- m_charset.SetCurSel(i);
- break;
- }
- }
-
- m_stss = lf;
- }
+ LOGFONT lf;
+ lf <<= m_stss;
+
+ CFontDialog dlg(&lf, CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT | CF_FORCEFONTEXIST | CF_SCALABLEONLY | CF_EFFECTS);
+ if (dlg.DoModal() == IDOK) {
+ CString str(lf.lfFaceName);
+ if (str.GetLength() > 16) {
+ str = str.Left(14) + _T("...");
+ }
+ m_font.SetWindowText(str);
+
+ for (int i = 0, j = m_charset.GetCount(); i < j; i++) {
+ if (m_charset.GetItemData(i) == lf.lfCharSet) {
+ m_charset.SetCurSel(i);
+ break;
+ }
+ }
+
+ m_stss = lf;
+ }
}
void CStyleEditorDialog::OnStnClickedColorpri()
{
- AskColor(0);
+ AskColor(0);
}
void CStyleEditorDialog::OnStnClickedColorsec()
{
- AskColor(1);
+ AskColor(1);
}
void CStyleEditorDialog::OnStnClickedColoroutl()
{
- AskColor(2);
+ AskColor(2);
}
void CStyleEditorDialog::OnStnClickedColorshad()
{
- AskColor(3);
+ AskColor(3);
}
void CStyleEditorDialog::OnBnClickedCheck1()
{
- UpdateData();
-
- int avg = 0;
- for (ptrdiff_t i = 0; i < 4; i++) {
- avg += m_alphasliders[i].GetPos();
- }
- avg /= 4;
- for (ptrdiff_t i = 0; i < 4; i++) {
- m_alphasliders[i].SetPos(avg);
- }
+ UpdateData();
+
+ int avg = 0;
+ for (ptrdiff_t i = 0; i < 4; i++) {
+ avg += m_alphasliders[i].GetPos();
+ }
+ avg /= 4;
+ for (ptrdiff_t i = 0; i < 4; i++) {
+ m_alphasliders[i].SetPos(avg);
+ }
}
void CStyleEditorDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
- if (m_linkalphasliders && pScrollBar) {
- int pos = ((CSliderCtrl*)pScrollBar)->GetPos();
- for (ptrdiff_t i = 0; i < 4; i++) {
- m_alphasliders[i].SetPos(pos);
- }
- }
-
- CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
+ if (m_linkalphasliders && pScrollBar) {
+ int pos = ((CSliderCtrl*)pScrollBar)->GetPos();
+ for (ptrdiff_t i = 0; i < 4; i++) {
+ m_alphasliders[i].SetPos(pos);
+ }
+ }
+
+ CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
diff --git a/src/filters/transform/VSFilter/StyleEditorDialog.h b/src/filters/transform/VSFilter/StyleEditorDialog.h
index 7c7823594..a4867476a 100644
--- a/src/filters/transform/VSFilter/StyleEditorDialog.h
+++ b/src/filters/transform/VSFilter/StyleEditorDialog.h
@@ -31,89 +31,89 @@
class CColorStatic : public CStatic
{
- DECLARE_DYNAMIC(CColorStatic)
+ DECLARE_DYNAMIC(CColorStatic)
- COLORREF* m_pColor;
+ COLORREF* m_pColor;
public:
- CColorStatic(CWnd* pParent = NULL) : m_pColor(NULL) {}
- virtual ~CColorStatic() {}
+ CColorStatic(CWnd* pParent = NULL) : m_pColor(NULL) {}
+ virtual ~CColorStatic() {}
- void SetColorPtr(COLORREF* pColor) {
- m_pColor = pColor;
- }
+ void SetColorPtr(COLORREF* pColor) {
+ m_pColor = pColor;
+ }
- DECLARE_MESSAGE_MAP()
+ DECLARE_MESSAGE_MAP()
protected:
- virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {
- CRect r;
- GetClientRect(r);
- CDC::FromHandle(lpDrawItemStruct->hDC)->FillSolidRect(r, m_pColor ? *m_pColor : ::GetSysColor(COLOR_BTNFACE));
- }
+ virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {
+ CRect r;
+ GetClientRect(r);
+ CDC::FromHandle(lpDrawItemStruct->hDC)->FillSolidRect(r, m_pColor ? *m_pColor : ::GetSysColor(COLOR_BTNFACE));
+ }
};
// CStyleEditorDialog dialog
class CStyleEditorDialog : public CDialog
{
- DECLARE_DYNAMIC(CStyleEditorDialog)
+ DECLARE_DYNAMIC(CStyleEditorDialog)
- CString m_title;
- CWnd* m_pParent;
+ CString m_title;
+ CWnd* m_pParent;
- void UpdateControlData(bool fSave);
- void AskColor(int i);
+ void UpdateControlData(bool fSave);
+ void AskColor(int i);
public:
- CStyleEditorDialog(CString title, STSStyle* pstss, CWnd* pParent = NULL); // standard constructor
- virtual ~CStyleEditorDialog();
+ CStyleEditorDialog(CString title, STSStyle* pstss, CWnd* pParent = NULL); // standard constructor
+ virtual ~CStyleEditorDialog();
- // Dialog Data
- enum { IDD = IDD_STYLEDIALOG };
+ // Dialog Data
+ enum { IDD = IDD_STYLEDIALOG };
- STSStyle m_stss;
+ STSStyle m_stss;
protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
- virtual BOOL OnInitDialog();
- virtual void OnOK();
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
+ virtual BOOL OnInitDialog();
+ virtual void OnOK();
- DECLARE_MESSAGE_MAP()
+ DECLARE_MESSAGE_MAP()
public:
- CButton m_font;
- int m_iCharset;
- CComboBox m_charset;
- int m_spacing;
- CSpinButtonCtrl m_spacingspin;
- int m_angle;
- CSpinButtonCtrl m_anglespin;
- int m_scalex;
- CSpinButtonCtrl m_scalexspin;
- int m_scaley;
- CSpinButtonCtrl m_scaleyspin;
- int m_borderstyle;
- int m_borderwidth;
- CSpinButtonCtrl m_borderwidthspin;
- int m_shadowdepth;
- CSpinButtonCtrl m_shadowdepthspin;
- int m_screenalignment;
- CRect m_margin;
- CSpinButtonCtrl m_marginleftspin;
- CSpinButtonCtrl m_marginrightspin;
- CSpinButtonCtrl m_margintopspin;
- CSpinButtonCtrl m_marginbottomspin;
- CColorStatic m_color[4];
- int m_alpha[4];
- CSliderCtrl m_alphasliders[4];
- BOOL m_linkalphasliders;
-
- afx_msg void OnBnClickedButton1();
- afx_msg void OnStnClickedColorpri();
- afx_msg void OnStnClickedColorsec();
- afx_msg void OnStnClickedColoroutl();
- afx_msg void OnStnClickedColorshad();
- afx_msg void OnBnClickedCheck1();
- afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
+ CButton m_font;
+ int m_iCharset;
+ CComboBox m_charset;
+ int m_spacing;
+ CSpinButtonCtrl m_spacingspin;
+ int m_angle;
+ CSpinButtonCtrl m_anglespin;
+ int m_scalex;
+ CSpinButtonCtrl m_scalexspin;
+ int m_scaley;
+ CSpinButtonCtrl m_scaleyspin;
+ int m_borderstyle;
+ int m_borderwidth;
+ CSpinButtonCtrl m_borderwidthspin;
+ int m_shadowdepth;
+ CSpinButtonCtrl m_shadowdepthspin;
+ int m_screenalignment;
+ CRect m_margin;
+ CSpinButtonCtrl m_marginleftspin;
+ CSpinButtonCtrl m_marginrightspin;
+ CSpinButtonCtrl m_margintopspin;
+ CSpinButtonCtrl m_marginbottomspin;
+ CColorStatic m_color[4];
+ int m_alpha[4];
+ CSliderCtrl m_alphasliders[4];
+ BOOL m_linkalphasliders;
+
+ afx_msg void OnBnClickedButton1();
+ afx_msg void OnStnClickedColorpri();
+ afx_msg void OnStnClickedColorsec();
+ afx_msg void OnStnClickedColoroutl();
+ afx_msg void OnStnClickedColorshad();
+ afx_msg void OnBnClickedCheck1();
+ afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
};
diff --git a/src/filters/transform/VSFilter/Systray.cpp b/src/filters/transform/VSFilter/Systray.cpp
index 6b7d48bd3..a4aeb6e5b 100644
--- a/src/filters/transform/VSFilter/Systray.cpp
+++ b/src/filters/transform/VSFilter/Systray.cpp
@@ -42,303 +42,303 @@ static UINT WM_NOTIFYICON = RegisterWindowMessage(_T("MYWM_NOTIFYICON"));
LRESULT CALLBACK HookProc(UINT code, WPARAM wParam, LPARAM lParam)
{
- MSG* msg = (MSG*)lParam;
-
- if (msg->message == WM_KEYDOWN) {
- switch (msg->wParam) {
- case VK_F13:
- PostMessage(HWND_BROADCAST, WM_DVSPREVSUB, 0, 0);
- break;
- case VK_F14:
- PostMessage(HWND_BROADCAST, WM_DVSNEXTSUB, 0, 0);
- break;
- case VK_F15:
- PostMessage(HWND_BROADCAST, WM_DVSHIDESUB, 0, 0);
- break;
- case VK_F16:
- PostMessage(HWND_BROADCAST, WM_DVSSHOWSUB, 0, 0);
- break;
- case VK_F17:
- PostMessage(HWND_BROADCAST, WM_DVSSHOWHIDESUB, 0, 0);
- break;
- default:
- break;
- }
- }
-
- // Always call next hook in chain
- return CallNextHookEx(g_hHook, code, wParam, lParam);
+ MSG* msg = (MSG*)lParam;
+
+ if (msg->message == WM_KEYDOWN) {
+ switch (msg->wParam) {
+ case VK_F13:
+ PostMessage(HWND_BROADCAST, WM_DVSPREVSUB, 0, 0);
+ break;
+ case VK_F14:
+ PostMessage(HWND_BROADCAST, WM_DVSNEXTSUB, 0, 0);
+ break;
+ case VK_F15:
+ PostMessage(HWND_BROADCAST, WM_DVSHIDESUB, 0, 0);
+ break;
+ case VK_F16:
+ PostMessage(HWND_BROADCAST, WM_DVSSHOWSUB, 0, 0);
+ break;
+ case VK_F17:
+ PostMessage(HWND_BROADCAST, WM_DVSSHOWHIDESUB, 0, 0);
+ break;
+ default:
+ break;
+ }
+ }
+
+ // Always call next hook in chain
+ return CallNextHookEx(g_hHook, code, wParam, lParam);
}
BEGIN_MESSAGE_MAP(CSystrayWindow, CWnd)
- ON_WM_CREATE()
- ON_WM_CLOSE()
- ON_WM_DESTROY()
- ON_WM_TIMER()
- ON_REGISTERED_MESSAGE(WM_DVSPREVSUB, OnDVSPrevSub)
- ON_REGISTERED_MESSAGE(WM_DVSNEXTSUB, OnDVSNextSub)
- ON_REGISTERED_MESSAGE(WM_DVSHIDESUB, OnDVSHideSub)
- ON_REGISTERED_MESSAGE(WM_DVSSHOWSUB, OnDVSShowSub)
- ON_REGISTERED_MESSAGE(WM_DVSSHOWHIDESUB, OnDVSShowHideSub)
- ON_REGISTERED_MESSAGE(s_uTaskbarRestart, OnTaskBarRestart)
- ON_REGISTERED_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)
+ ON_WM_CREATE()
+ ON_WM_CLOSE()
+ ON_WM_DESTROY()
+ ON_WM_TIMER()
+ ON_REGISTERED_MESSAGE(WM_DVSPREVSUB, OnDVSPrevSub)
+ ON_REGISTERED_MESSAGE(WM_DVSNEXTSUB, OnDVSNextSub)
+ ON_REGISTERED_MESSAGE(WM_DVSHIDESUB, OnDVSHideSub)
+ ON_REGISTERED_MESSAGE(WM_DVSSHOWSUB, OnDVSShowSub)
+ ON_REGISTERED_MESSAGE(WM_DVSSHOWHIDESUB, OnDVSShowHideSub)
+ ON_REGISTERED_MESSAGE(s_uTaskbarRestart, OnTaskBarRestart)
+ ON_REGISTERED_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)
END_MESSAGE_MAP()
int CSystrayWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
- if (CWnd::OnCreate(lpCreateStruct) == -1) {
- return -1;
- }
+ if (CWnd::OnCreate(lpCreateStruct) == -1) {
+ return -1;
+ }
- if (g_hHook == INVALID_HANDLE_VALUE) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
- // g_hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)HookProc, AfxGetInstanceHandle(), 0);
- }
+ if (g_hHook == INVALID_HANDLE_VALUE) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ // g_hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)HookProc, AfxGetInstanceHandle(), 0);
+ }
- PostMessage(s_uTaskbarRestart);
+ PostMessage(s_uTaskbarRestart);
- return 0;
+ return 0;
}
void CSystrayWindow::OnClose()
{
- DestroyWindow();
+ DestroyWindow();
}
void CSystrayWindow::OnDestroy()
{
- NOTIFYICONDATA tnid;
- ZeroMemory(&tnid, sizeof(NOTIFYICONDATA));
- tnid.cbSize = sizeof(NOTIFYICONDATA);
- tnid.hWnd = m_hWnd;
- tnid.uID = IDI_ICON1;
- Shell_NotifyIcon(NIM_DELETE, &tnid);
-
- if (g_hHook != INVALID_HANDLE_VALUE) {
- UnhookWindowsHookEx(g_hHook);
- g_hHook = (HHOOK)INVALID_HANDLE_VALUE;
- }
-
- PostQuitMessage(0);
+ NOTIFYICONDATA tnid;
+ ZeroMemory(&tnid, sizeof(NOTIFYICONDATA));
+ tnid.cbSize = sizeof(NOTIFYICONDATA);
+ tnid.hWnd = m_hWnd;
+ tnid.uID = IDI_ICON1;
+ Shell_NotifyIcon(NIM_DELETE, &tnid);
+
+ if (g_hHook != INVALID_HANDLE_VALUE) {
+ UnhookWindowsHookEx(g_hHook);
+ g_hHook = (HHOOK)INVALID_HANDLE_VALUE;
+ }
+
+ PostQuitMessage(0);
}
LRESULT CSystrayWindow::OnDVSPrevSub(WPARAM, LPARAM)
{
- StepSub(-1);
- return 0;
+ StepSub(-1);
+ return 0;
}
LRESULT CSystrayWindow::OnDVSNextSub(WPARAM, LPARAM)
{
- StepSub(+1);
- return 0;
+ StepSub(+1);
+ return 0;
}
LRESULT CSystrayWindow::OnDVSHideSub(WPARAM, LPARAM)
{
- ShowSub(false);
- return 0;
+ ShowSub(false);
+ return 0;
}
LRESULT CSystrayWindow::OnDVSShowSub(WPARAM, LPARAM)
{
- ShowSub(true);
- return 0;
+ ShowSub(true);
+ return 0;
}
LRESULT CSystrayWindow::OnDVSShowHideSub(WPARAM, LPARAM)
{
- ToggleSub();
- return 0;
+ ToggleSub();
+ return 0;
}
LRESULT CSystrayWindow::OnTaskBarRestart(WPARAM, LPARAM)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- if (m_tbid->fShowIcon) {
- NOTIFYICONDATA tnid;
- ZeroMemory(&tnid, sizeof(NOTIFYICONDATA));
- tnid.cbSize = sizeof(NOTIFYICONDATA);
- tnid.hWnd = m_hWnd;
- tnid.uID = IDI_ICON1;
- tnid.hIcon = (HICON)LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1));
- //tnid.hIcon = (HICON)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 0, 0, LR_LOADTRANSPARENT);
- tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
- tnid.uCallbackMessage = WM_NOTIFYICON;
- _tcscpy_s(tnid.szTip, _T("DirectVobSub"));
-
- BOOL res = Shell_NotifyIcon(NIM_ADD, &tnid);
-
- if (tnid.hIcon) {
- DestroyIcon(tnid.hIcon);
- }
-
- return res ? 0 : -1;
- }
-
- return 0;
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ if (m_tbid->fShowIcon) {
+ NOTIFYICONDATA tnid;
+ ZeroMemory(&tnid, sizeof(NOTIFYICONDATA));
+ tnid.cbSize = sizeof(NOTIFYICONDATA);
+ tnid.hWnd = m_hWnd;
+ tnid.uID = IDI_ICON1;
+ tnid.hIcon = (HICON)LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1));
+ //tnid.hIcon = (HICON)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 0, 0, LR_LOADTRANSPARENT);
+ tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
+ tnid.uCallbackMessage = WM_NOTIFYICON;
+ _tcscpy_s(tnid.szTip, _T("DirectVobSub"));
+
+ BOOL res = Shell_NotifyIcon(NIM_ADD, &tnid);
+
+ if (tnid.hIcon) {
+ DestroyIcon(tnid.hIcon);
+ }
+
+ return res ? 0 : -1;
+ }
+
+ return 0;
}
LRESULT CSystrayWindow::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
- if ((UINT)wParam != IDI_ICON1) {
- return -1;
- }
-
- HWND hWnd = m_hWnd;
-
- switch ((UINT)lParam) {
- case WM_LBUTTONDBLCLK: {
- // IMPORTANT: we must not hold the graph at the same time as showing the property page
- // or else when closing the app the graph doesn't get released and dvobsub's JoinFilterGraph
- // is never called to close us down.
-
- CComPtr<IBaseFilter> pBF2;
-
- BeginEnumFilters(m_tbid->graph, pEF, pBF) {
- if (!CComQIPtr<IDirectVobSub>(pBF)) {
- continue;
- }
-
- if (CComQIPtr<IVideoWindow> pVW = m_tbid->graph) {
- HWND hwnd;
- if (SUCCEEDED(pVW->get_Owner((OAHWND*)&hwnd))
- || SUCCEEDED(pVW->get_MessageDrain((OAHWND*)&hwnd))) {
- hWnd = hwnd;
- }
- }
-
- pBF2 = pBF;
-
- break;
- }
- EndEnumFilters
-
- if (pBF2) {
- ShowPPage(pBF2, hWnd);
- }
- }
- break;
-
- case WM_RBUTTONDOWN: {
- POINT p;
- GetCursorPos(&p);
-
- CInterfaceArray<IAMStreamSelect> pStreams;
- CStringArray names;
-
- BeginEnumFilters(m_tbid->graph, pEF, pBF) {
- CString name = GetFilterName(pBF);
- if (name.IsEmpty()) {
- continue;
- }
-
- if (CComQIPtr<IAMStreamSelect> pSS = pBF) {
- pStreams.Add(pSS);
- names.Add(name);
- }
- }
- EndEnumFilters
-
- CMenu popup;
- popup.CreatePopupMenu();
-
- for (size_t j = 0; j < pStreams.GetCount(); j++) {
- bool fMMSwitcher = !names[j].Compare(_T("Morgan Stream Switcher"));
-
- DWORD cStreams = 0;
- pStreams[j]->Count(&cStreams);
-
- DWORD flags, group, prevgroup = (DWORD)-1;
-
- for (UINT i = 0; i < cStreams; i++) {
- WCHAR* pName = NULL;
-
- if (S_OK == pStreams[j]->Info(i, 0, &flags, 0, &group, &pName, 0, 0)) {
- if (prevgroup != group && i > 1) {
- if (fMMSwitcher) {
- cStreams = i;
- break;
- }
- popup.AppendMenu(MF_SEPARATOR);
- }
- prevgroup = group;
-
- if (pName) {
- popup.AppendMenu(MF_ENABLED|MF_STRING|(flags?MF_CHECKED:MF_UNCHECKED), (1<<15)|(j<<8)|(i), CString(pName));
- CoTaskMemFree(pName);
- }
- }
- }
-
- if (cStreams > 0) {
- popup.AppendMenu(MF_SEPARATOR);
- }
- }
-
- int i = 0;
-
- TCHAR* str;
- str = CallPPage(m_tbid->graph, i, (HWND)INVALID_HANDLE_VALUE);
- while (str) {
- if (_tcsncmp(str, _T("DivX MPEG"), 9) || m_tbid->fRunOnce) { // divx3's ppage will crash if the graph hasn't been run at least once yet
- popup.AppendMenu(MF_ENABLED|MF_STRING|MF_UNCHECKED, (1<<14)|(i), str);
- }
-
- delete [] str;
-
- i++;
- str = CallPPage(m_tbid->graph, i, (HWND)INVALID_HANDLE_VALUE);
- }
-
- SetForegroundWindow();
- UINT id = popup.TrackPopupMenu(TPM_LEFTBUTTON|TPM_RETURNCMD, p.x, p.y, CWnd::FromHandle(hWnd), 0);
- PostMessage(WM_NULL);
-
- if (id & (1<<15)) {
- pStreams[(id>>8)&0x3f]->Enable(id&0xff, AMSTREAMSELECTENABLE_ENABLE);
- } else if (id & (1<<14)) {
- if (CComQIPtr<IVideoWindow> pVW = m_tbid->graph) {
- HWND hwnd;
- if (SUCCEEDED(pVW->get_Owner((OAHWND*)&hwnd))
- || SUCCEEDED(pVW->get_MessageDrain((OAHWND*)&hwnd))) {
- hWnd = hwnd;
- }
- }
-
- CallPPage(m_tbid->graph, id&0xff, hWnd);
- }
- }
- break;
-
- default:
- break;
- }
-
- return 0;
+ if ((UINT)wParam != IDI_ICON1) {
+ return -1;
+ }
+
+ HWND hWnd = m_hWnd;
+
+ switch ((UINT)lParam) {
+ case WM_LBUTTONDBLCLK: {
+ // IMPORTANT: we must not hold the graph at the same time as showing the property page
+ // or else when closing the app the graph doesn't get released and dvobsub's JoinFilterGraph
+ // is never called to close us down.
+
+ CComPtr<IBaseFilter> pBF2;
+
+ BeginEnumFilters(m_tbid->graph, pEF, pBF) {
+ if (!CComQIPtr<IDirectVobSub>(pBF)) {
+ continue;
+ }
+
+ if (CComQIPtr<IVideoWindow> pVW = m_tbid->graph) {
+ HWND hwnd;
+ if (SUCCEEDED(pVW->get_Owner((OAHWND*)&hwnd))
+ || SUCCEEDED(pVW->get_MessageDrain((OAHWND*)&hwnd))) {
+ hWnd = hwnd;
+ }
+ }
+
+ pBF2 = pBF;
+
+ break;
+ }
+ EndEnumFilters
+
+ if (pBF2) {
+ ShowPPage(pBF2, hWnd);
+ }
+ }
+ break;
+
+ case WM_RBUTTONDOWN: {
+ POINT p;
+ GetCursorPos(&p);
+
+ CInterfaceArray<IAMStreamSelect> pStreams;
+ CStringArray names;
+
+ BeginEnumFilters(m_tbid->graph, pEF, pBF) {
+ CString name = GetFilterName(pBF);
+ if (name.IsEmpty()) {
+ continue;
+ }
+
+ if (CComQIPtr<IAMStreamSelect> pSS = pBF) {
+ pStreams.Add(pSS);
+ names.Add(name);
+ }
+ }
+ EndEnumFilters
+
+ CMenu popup;
+ popup.CreatePopupMenu();
+
+ for (size_t j = 0; j < pStreams.GetCount(); j++) {
+ bool fMMSwitcher = !names[j].Compare(_T("Morgan Stream Switcher"));
+
+ DWORD cStreams = 0;
+ pStreams[j]->Count(&cStreams);
+
+ DWORD flags, group, prevgroup = (DWORD) - 1;
+
+ for (UINT i = 0; i < cStreams; i++) {
+ WCHAR* pName = NULL;
+
+ if (S_OK == pStreams[j]->Info(i, 0, &flags, 0, &group, &pName, 0, 0)) {
+ if (prevgroup != group && i > 1) {
+ if (fMMSwitcher) {
+ cStreams = i;
+ break;
+ }
+ popup.AppendMenu(MF_SEPARATOR);
+ }
+ prevgroup = group;
+
+ if (pName) {
+ popup.AppendMenu(MF_ENABLED | MF_STRING | (flags ? MF_CHECKED : MF_UNCHECKED), (1 << 15) | (j << 8) | (i), CString(pName));
+ CoTaskMemFree(pName);
+ }
+ }
+ }
+
+ if (cStreams > 0) {
+ popup.AppendMenu(MF_SEPARATOR);
+ }
+ }
+
+ int i = 0;
+
+ TCHAR* str;
+ str = CallPPage(m_tbid->graph, i, (HWND)INVALID_HANDLE_VALUE);
+ while (str) {
+ if (_tcsncmp(str, _T("DivX MPEG"), 9) || m_tbid->fRunOnce) { // divx3's ppage will crash if the graph hasn't been run at least once yet
+ popup.AppendMenu(MF_ENABLED | MF_STRING | MF_UNCHECKED, (1 << 14) | (i), str);
+ }
+
+ delete [] str;
+
+ i++;
+ str = CallPPage(m_tbid->graph, i, (HWND)INVALID_HANDLE_VALUE);
+ }
+
+ SetForegroundWindow();
+ UINT id = popup.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RETURNCMD, p.x, p.y, CWnd::FromHandle(hWnd), 0);
+ PostMessage(WM_NULL);
+
+ if (id & (1 << 15)) {
+ pStreams[(id >> 8) & 0x3f]->Enable(id & 0xff, AMSTREAMSELECTENABLE_ENABLE);
+ } else if (id & (1 << 14)) {
+ if (CComQIPtr<IVideoWindow> pVW = m_tbid->graph) {
+ HWND hwnd;
+ if (SUCCEEDED(pVW->get_Owner((OAHWND*)&hwnd))
+ || SUCCEEDED(pVW->get_MessageDrain((OAHWND*)&hwnd))) {
+ hWnd = hwnd;
+ }
+ }
+
+ CallPPage(m_tbid->graph, id & 0xff, hWnd);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return 0;
}
//
DWORD CALLBACK SystrayThreadProc(void* pParam)
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- CSystrayWindow wnd((SystrayIconData*)pParam);
- if (!wnd.CreateEx(0, AfxRegisterWndClass(0), _T("DVSWND"), WS_OVERLAPPED, CRect(0, 0, 0, 0), NULL, 0, NULL)) {
- return (DWORD)-1;
- }
+ CSystrayWindow wnd((SystrayIconData*)pParam);
+ if (!wnd.CreateEx(0, AfxRegisterWndClass(0), _T("DVSWND"), WS_OVERLAPPED, CRect(0, 0, 0, 0), NULL, 0, NULL)) {
+ return (DWORD) - 1;
+ }
- ((SystrayIconData*)pParam)->hSystrayWnd = wnd.m_hWnd;
+ ((SystrayIconData*)pParam)->hSystrayWnd = wnd.m_hWnd;
- MSG msg;
- while (GetMessage(&msg, NULL/*wnd.m_hWnd*/, 0, 0)) {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
+ MSG msg;
+ while (GetMessage(&msg, NULL/*wnd.m_hWnd*/, 0, 0)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
- return 0;
+ return 0;
}
// TODO: replace this function
@@ -346,51 +346,51 @@ DWORD CALLBACK SystrayThreadProc(void* pParam)
// hWnd == INVALID_HANDLE_VALUE - get name, hWnd != INVALID_HANDLE_VALUE - show ppage
static TCHAR* CallPPage(IFilterGraph* pGraph, int idx, HWND hWnd)
{
- int i = 0;
- //bool fFound = false;
-
- WCHAR* wstr = NULL;
- CComPtr<IBaseFilter> pFilter;
- CAUUID caGUID;
- caGUID.pElems = NULL;
-
- BeginEnumFilters(pGraph, pEF, pBF) {
- CComQIPtr<ISpecifyPropertyPages> pSPS = pBF;
-
- if (!pSPS) {
- continue;
- }
-
- if (i == idx) {
- pFilter = pBF;
- pSPS->GetPages(&caGUID);
- wstr = _wcsdup(CStringW(GetFilterName(pBF))); // double char-wchar conversion happens in the non-unicode build, but anyway... :)
- break;
- }
-
- i++;
- }
- EndEnumFilters
-
- TCHAR* ret = NULL;
-
- if (pFilter) {
- if (hWnd != INVALID_HANDLE_VALUE) {
- ShowPPage(pFilter, hWnd);
- } else {
- ret = DNew TCHAR[wcslen(wstr)+1];
- if (ret) {
- _tcscpy_s(ret, wcslen(wstr) + 1, CString(wstr));
- }
- }
- }
-
- if (caGUID.pElems) {
- CoTaskMemFree(caGUID.pElems);
- }
- if (wstr) {
- free(wstr);
- }
-
- return ret;
+ int i = 0;
+ //bool fFound = false;
+
+ WCHAR* wstr = NULL;
+ CComPtr<IBaseFilter> pFilter;
+ CAUUID caGUID;
+ caGUID.pElems = NULL;
+
+ BeginEnumFilters(pGraph, pEF, pBF) {
+ CComQIPtr<ISpecifyPropertyPages> pSPS = pBF;
+
+ if (!pSPS) {
+ continue;
+ }
+
+ if (i == idx) {
+ pFilter = pBF;
+ pSPS->GetPages(&caGUID);
+ wstr = _wcsdup(CStringW(GetFilterName(pBF))); // double char-wchar conversion happens in the non-unicode build, but anyway... :)
+ break;
+ }
+
+ i++;
+ }
+ EndEnumFilters
+
+ TCHAR* ret = NULL;
+
+ if (pFilter) {
+ if (hWnd != INVALID_HANDLE_VALUE) {
+ ShowPPage(pFilter, hWnd);
+ } else {
+ ret = DNew TCHAR[wcslen(wstr) + 1];
+ if (ret) {
+ _tcscpy_s(ret, wcslen(wstr) + 1, CString(wstr));
+ }
+ }
+ }
+
+ if (caGUID.pElems) {
+ CoTaskMemFree(caGUID.pElems);
+ }
+ if (wstr) {
+ free(wstr);
+ }
+
+ return ret;
}
diff --git a/src/filters/transform/VSFilter/Systray.h b/src/filters/transform/VSFilter/Systray.h
index 00b4dc985..f7d823c5a 100644
--- a/src/filters/transform/VSFilter/Systray.h
+++ b/src/filters/transform/VSFilter/Systray.h
@@ -25,50 +25,50 @@
class CSystrayWindow : public CWnd
{
- SystrayIconData* m_tbid;
+ SystrayIconData* m_tbid;
- void StepSub(int dir) {
- int iSelected, nLangs;
- if (FAILED(m_tbid->dvs->get_LanguageCount(&nLangs))) {
- return;
- }
- if (FAILED(m_tbid->dvs->get_SelectedLanguage(&iSelected))) {
- return;
- }
- if (nLangs > 0) {
- m_tbid->dvs->put_SelectedLanguage((iSelected+dir+nLangs)%nLangs);
- }
- }
+ void StepSub(int dir) {
+ int iSelected, nLangs;
+ if (FAILED(m_tbid->dvs->get_LanguageCount(&nLangs))) {
+ return;
+ }
+ if (FAILED(m_tbid->dvs->get_SelectedLanguage(&iSelected))) {
+ return;
+ }
+ if (nLangs > 0) {
+ m_tbid->dvs->put_SelectedLanguage((iSelected + dir + nLangs) % nLangs);
+ }
+ }
- void ShowSub(bool fShow) {
- m_tbid->dvs->put_HideSubtitles(!fShow);
- }
+ void ShowSub(bool fShow) {
+ m_tbid->dvs->put_HideSubtitles(!fShow);
+ }
- void ToggleSub() {
- bool fShow;
- if (FAILED(m_tbid->dvs->get_HideSubtitles(&fShow))) {
- return;
- }
- m_tbid->dvs->put_HideSubtitles(!fShow);
- }
+ void ToggleSub() {
+ bool fShow;
+ if (FAILED(m_tbid->dvs->get_HideSubtitles(&fShow))) {
+ return;
+ }
+ m_tbid->dvs->put_HideSubtitles(!fShow);
+ }
public:
- CSystrayWindow(SystrayIconData* tbid) : m_tbid(tbid) {}
+ CSystrayWindow(SystrayIconData* tbid) : m_tbid(tbid) {}
protected:
- DECLARE_MESSAGE_MAP()
+ DECLARE_MESSAGE_MAP()
public:
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
- afx_msg void OnClose();
- afx_msg void OnDestroy();
- afx_msg LRESULT OnDVSPrevSub(WPARAM, LPARAM);
- afx_msg LRESULT OnDVSNextSub(WPARAM, LPARAM);
- afx_msg LRESULT OnDVSHideSub(WPARAM, LPARAM);
- afx_msg LRESULT OnDVSShowSub(WPARAM, LPARAM);
- afx_msg LRESULT OnDVSShowHideSub(WPARAM, LPARAM);
- afx_msg LRESULT OnTaskBarRestart(WPARAM, LPARAM);
- afx_msg LRESULT OnNotifyIcon(WPARAM, LPARAM);
+ afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+ afx_msg void OnClose();
+ afx_msg void OnDestroy();
+ afx_msg LRESULT OnDVSPrevSub(WPARAM, LPARAM);
+ afx_msg LRESULT OnDVSNextSub(WPARAM, LPARAM);
+ afx_msg LRESULT OnDVSHideSub(WPARAM, LPARAM);
+ afx_msg LRESULT OnDVSShowSub(WPARAM, LPARAM);
+ afx_msg LRESULT OnDVSShowHideSub(WPARAM, LPARAM);
+ afx_msg LRESULT OnTaskBarRestart(WPARAM, LPARAM);
+ afx_msg LRESULT OnNotifyIcon(WPARAM, LPARAM);
};
extern DWORD CALLBACK SystrayThreadProc(void* pParam);
diff --git a/src/filters/transform/VSFilter/TextInputPin.cpp b/src/filters/transform/VSFilter/TextInputPin.cpp
index 5fecb70e0..0fdba3289 100644
--- a/src/filters/transform/VSFilter/TextInputPin.cpp
+++ b/src/filters/transform/VSFilter/TextInputPin.cpp
@@ -27,22 +27,22 @@
#include "../../../DSUtil/DSUtil.h"
CTextInputPin::CTextInputPin(CDirectVobSubFilter* pFilter, CCritSec* pLock, CCritSec* pSubLock, HRESULT* phr)
- : CSubtitleInputPin(pFilter, pLock, pSubLock, phr)
- , m_pDVS(pFilter)
+ : CSubtitleInputPin(pFilter, pLock, pSubLock, phr)
+ , m_pDVS(pFilter)
{
}
void CTextInputPin::AddSubStream(ISubStream* pSubStream)
{
- m_pDVS->AddSubStream(pSubStream);
+ m_pDVS->AddSubStream(pSubStream);
}
void CTextInputPin::RemoveSubStream(ISubStream* pSubStream)
{
- m_pDVS->RemoveSubStream(pSubStream);
+ m_pDVS->RemoveSubStream(pSubStream);
}
void CTextInputPin::InvalidateSubtitle(REFERENCE_TIME rtStart, ISubStream* pSubStream)
{
- m_pDVS->InvalidateSubtitle(rtStart, (DWORD_PTR)(ISubStream*)pSubStream);
+ m_pDVS->InvalidateSubtitle(rtStart, (DWORD_PTR)(ISubStream*)pSubStream);
}
diff --git a/src/filters/transform/VSFilter/TextInputPin.h b/src/filters/transform/VSFilter/TextInputPin.h
index 3038b9f51..9a5078fd1 100644
--- a/src/filters/transform/VSFilter/TextInputPin.h
+++ b/src/filters/transform/VSFilter/TextInputPin.h
@@ -29,13 +29,13 @@ class CDirectVobSubFilter;
class CTextInputPin : public CSubtitleInputPin
{
- CDirectVobSubFilter* m_pDVS;
+ CDirectVobSubFilter* m_pDVS;
protected:
- void AddSubStream(ISubStream* pSubStream);
- void RemoveSubStream(ISubStream* pSubStream);
- void InvalidateSubtitle(REFERENCE_TIME rtStart, ISubStream* pSubStream);
+ void AddSubStream(ISubStream* pSubStream);
+ void RemoveSubStream(ISubStream* pSubStream);
+ void InvalidateSubtitle(REFERENCE_TIME rtStart, ISubStream* pSubStream);
public:
- CTextInputPin(CDirectVobSubFilter* pFilter, CCritSec* pLock, CCritSec* pSubLock, HRESULT* phr);
+ CTextInputPin(CDirectVobSubFilter* pFilter, CCritSec* pLock, CCritSec* pSubLock, HRESULT* phr);
};
diff --git a/src/filters/transform/VSFilter/VSFilter.cpp b/src/filters/transform/VSFilter/VSFilter.cpp
index c6b82a502..96a4c18d6 100644
--- a/src/filters/transform/VSFilter/VSFilter.cpp
+++ b/src/filters/transform/VSFilter/VSFilter.cpp
@@ -44,39 +44,39 @@ extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
BOOL CVSFilterApp::InitInstance()
{
- if (!CWinApp::InitInstance()) {
- return FALSE;
- }
+ if (!CWinApp::InitInstance()) {
+ return FALSE;
+ }
- SetRegistryKey(_T("Gabest"));
+ SetRegistryKey(_T("Gabest"));
- DllEntryPoint(AfxGetInstanceHandle(), DLL_PROCESS_ATTACH, 0); // "DllMain" of the dshow baseclasses
+ DllEntryPoint(AfxGetInstanceHandle(), DLL_PROCESS_ATTACH, 0); // "DllMain" of the dshow baseclasses
- STARTUPINFO si;
- GetStartupInfo(&si);
- m_AppName = CString(si.lpTitle);
- m_AppName.Replace('\\', '/');
- m_AppName = m_AppName.Mid(m_AppName.ReverseFind('/')+1);
- m_AppName.MakeLower();
+ STARTUPINFO si;
+ GetStartupInfo(&si);
+ m_AppName = CString(si.lpTitle);
+ m_AppName.Replace('\\', '/');
+ m_AppName = m_AppName.Mid(m_AppName.ReverseFind('/') + 1);
+ m_AppName.MakeLower();
- return TRUE;
+ return TRUE;
}
int CVSFilterApp::ExitInstance()
{
- DllEntryPoint(AfxGetInstanceHandle(), DLL_PROCESS_DETACH, 0); // "DllMain" of the dshow baseclasses
+ DllEntryPoint(AfxGetInstanceHandle(), DLL_PROCESS_DETACH, 0); // "DllMain" of the dshow baseclasses
- return CWinApp::ExitInstance();
+ return CWinApp::ExitInstance();
}
HINSTANCE CVSFilterApp::LoadAppLangResourceDLL()
{
- CString fn;
- fn.ReleaseBufferSetLength(::GetModuleFileName(m_hInstance, fn.GetBuffer(_MAX_PATH), _MAX_PATH));
- fn = fn.Mid(fn.ReverseFind('\\')+1);
- fn = fn.Left(fn.ReverseFind('.')+1);
- fn = fn + _T("lang");
- return ::LoadLibrary(fn);
+ CString fn;
+ fn.ReleaseBufferSetLength(::GetModuleFileName(m_hInstance, fn.GetBuffer(_MAX_PATH), _MAX_PATH));
+ fn = fn.Mid(fn.ReverseFind('\\') + 1);
+ fn = fn.Left(fn.ReverseFind('.') + 1);
+ fn = fn + _T("lang");
+ return ::LoadLibrary(fn);
}
CVSFilterApp theApp;
@@ -84,49 +84,49 @@ CVSFilterApp theApp;
//////////////////////////////////////////////////////////////////////////
const AMOVIESETUP_MEDIATYPE sudPinTypesIn[] = {
- {&MEDIATYPE_NULL, &MEDIASUBTYPE_NULL},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_YUY2},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_YV12},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_I420},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_IYUV},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_RGB32},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_RGB565},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_RGB555},
- {&MEDIATYPE_Video, &MEDIASUBTYPE_RGB24},
+ {&MEDIATYPE_NULL, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_YUY2},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_YV12},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_I420},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_IYUV},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_RGB32},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_RGB565},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_RGB555},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_RGB24},
};
const AMOVIESETUP_MEDIATYPE sudPinTypesIn2[] = {
- {&MEDIATYPE_Text, &MEDIASUBTYPE_NULL},
- {&MEDIATYPE_Subtitle, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Text, &MEDIASUBTYPE_NULL},
+ {&MEDIATYPE_Subtitle, &MEDIASUBTYPE_NULL},
};
const AMOVIESETUP_MEDIATYPE sudPinTypesOut[] = {
- {&MEDIATYPE_Video, &MEDIASUBTYPE_None},
+ {&MEDIATYPE_Video, &MEDIASUBTYPE_None},
};
const AMOVIESETUP_PIN sudpPins[] = {
- {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
- {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut},
- {L"Input2", TRUE, FALSE, FALSE, TRUE, &CLSID_NULL, NULL, _countof(sudPinTypesIn2), sudPinTypesIn2}
+ {L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesIn), sudPinTypesIn},
+ {L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, NULL, _countof(sudPinTypesOut), sudPinTypesOut},
+ {L"Input2", TRUE, FALSE, FALSE, TRUE, &CLSID_NULL, NULL, _countof(sudPinTypesIn2), sudPinTypesIn2}
};
/*const*/
AMOVIESETUP_FILTER sudFilter[] = {
- {&__uuidof(CDirectVobSubFilter), L"DirectVobSub", MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
- {&__uuidof(CDirectVobSubFilter2), L"DirectVobSub (auto-loading version)", MERIT_PREFERRED+2, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CDirectVobSubFilter), L"DirectVobSub", MERIT_DO_NOT_USE, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
+ {&__uuidof(CDirectVobSubFilter2), L"DirectVobSub (auto-loading version)", MERIT_PREFERRED + 2, _countof(sudpPins), sudpPins, CLSID_LegacyAmFilterCategory},
};
CFactoryTemplate g_Templates[] = {
- {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CDirectVobSubFilter>, NULL, &sudFilter[0]},
- {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CDirectVobSubFilter2>, NULL, &sudFilter[1]},
- {L"DVSMainPPage", &__uuidof(CDVSMainPPage), CreateInstance<CDVSMainPPage>},
- {L"DVSGeneralPPage", &__uuidof(CDVSGeneralPPage), CreateInstance<CDVSGeneralPPage>},
- {L"DVSMiscPPage", &__uuidof(CDVSMiscPPage), CreateInstance<CDVSMiscPPage>},
- {L"DVSTimingPPage", &__uuidof(CDVSTimingPPage), CreateInstance<CDVSTimingPPage>},
- {L"DVSZoomPPage", &__uuidof(CDVSZoomPPage), CreateInstance<CDVSZoomPPage>},
- {L"DVSColorPPage", &__uuidof(CDVSColorPPage), CreateInstance<CDVSColorPPage>},
- {L"DVSPathsPPage", &__uuidof(CDVSPathsPPage), CreateInstance<CDVSPathsPPage>},
- {L"DVSAboutPPage", &__uuidof(CDVSAboutPPage), CreateInstance<CDVSAboutPPage>},
+ {sudFilter[0].strName, sudFilter[0].clsID, CreateInstance<CDirectVobSubFilter>, NULL, &sudFilter[0]},
+ {sudFilter[1].strName, sudFilter[1].clsID, CreateInstance<CDirectVobSubFilter2>, NULL, &sudFilter[1]},
+ {L"DVSMainPPage", &__uuidof(CDVSMainPPage), CreateInstance<CDVSMainPPage>},
+ {L"DVSGeneralPPage", &__uuidof(CDVSGeneralPPage), CreateInstance<CDVSGeneralPPage>},
+ {L"DVSMiscPPage", &__uuidof(CDVSMiscPPage), CreateInstance<CDVSMiscPPage>},
+ {L"DVSTimingPPage", &__uuidof(CDVSTimingPPage), CreateInstance<CDVSTimingPPage>},
+ {L"DVSZoomPPage", &__uuidof(CDVSZoomPPage), CreateInstance<CDVSZoomPPage>},
+ {L"DVSColorPPage", &__uuidof(CDVSColorPPage), CreateInstance<CDVSColorPPage>},
+ {L"DVSPathsPPage", &__uuidof(CDVSPathsPPage), CreateInstance<CDVSPathsPPage>},
+ {L"DVSAboutPPage", &__uuidof(CDVSAboutPPage), CreateInstance<CDVSAboutPPage>},
};
int g_cTemplates = _countof(g_Templates);
@@ -135,42 +135,42 @@ int g_cTemplates = _countof(g_Templates);
STDAPI DllRegisterServer()
{
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
- if (theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SEENDIVXWARNING), 0) != 1) {
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SEENDIVXWARNING), 0);
- }
+ if (theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SEENDIVXWARNING), 0) != 1) {
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_SEENDIVXWARNING), 0);
+ }
- if (theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_VMRZOOMENABLED), -1) == -1) {
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_VMRZOOMENABLED), 0);
- }
+ if (theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_VMRZOOMENABLED), -1) == -1) {
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_VMRZOOMENABLED), 0);
+ }
- if (theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_ENABLEZPICON), -1) == -1) {
- theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_ENABLEZPICON), 0);
- }
+ if (theApp.GetProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_ENABLEZPICON), -1) == -1) {
+ theApp.WriteProfileInt(ResStr(IDS_R_GENERAL), ResStr(IDS_RG_ENABLEZPICON), 0);
+ }
- return AMovieDllRegisterServer2(TRUE);
+ return AMovieDllRegisterServer2(TRUE);
}
STDAPI DllUnregisterServer()
{
- // DVS_WriteProfileInt2(IDS_R_GENERAL, IDS_RG_SEENDIVXWARNING, 0);
+ // DVS_WriteProfileInt2(IDS_R_GENERAL, IDS_RG_SEENDIVXWARNING, 0);
- return AMovieDllRegisterServer2(FALSE);
+ return AMovieDllRegisterServer2(FALSE);
}
void CALLBACK DirectVobSub(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
{
- if (FAILED(::CoInitialize(0))) {
- return;
- }
+ if (FAILED(::CoInitialize(0))) {
+ return;
+ }
- CComPtr<IBaseFilter> pFilter;
- CComQIPtr<ISpecifyPropertyPages> pSpecify;
+ CComPtr<IBaseFilter> pFilter;
+ CComQIPtr<ISpecifyPropertyPages> pSpecify;
- if (SUCCEEDED(pFilter.CoCreateInstance(__uuidof(CDirectVobSubFilter))) && (pSpecify = pFilter)) {
- ShowPPage(pFilter, hwnd);
- }
+ if (SUCCEEDED(pFilter.CoCreateInstance(__uuidof(CDirectVobSubFilter))) && (pSpecify = pFilter)) {
+ ShowPPage(pFilter, hwnd);
+ }
- ::CoUninitialize();
+ ::CoUninitialize();
}
diff --git a/src/filters/transform/VSFilter/VSFilter.h b/src/filters/transform/VSFilter/VSFilter.h
index c4e71a50a..ec235390c 100644
--- a/src/filters/transform/VSFilter/VSFilter.h
+++ b/src/filters/transform/VSFilter/VSFilter.h
@@ -28,18 +28,18 @@
class CVSFilterApp : public CWinApp
{
public:
- CVSFilterApp();
+ CVSFilterApp();
- CString m_AppName;
+ CString m_AppName;
protected:
- HINSTANCE LoadAppLangResourceDLL();
+ HINSTANCE LoadAppLangResourceDLL();
public:
- BOOL InitInstance();
- BOOL ExitInstance();
+ BOOL InitInstance();
+ BOOL ExitInstance();
- DECLARE_MESSAGE_MAP()
+ DECLARE_MESSAGE_MAP()
};
extern CVSFilterApp theApp;
diff --git a/src/filters/transform/VSFilter/csri.h b/src/filters/transform/VSFilter/csri.h
index 7d67bae96..2ed9fc869 100644
--- a/src/filters/transform/VSFilter/csri.h
+++ b/src/filters/transform/VSFilter/csri.h
@@ -36,46 +36,46 @@
#define _CSRI_H 20070119
/** \endcond */
-#include <stddef.h> /* ptrdiff_t */
+#include <stddef.h> /* ptrdiff_t */
#ifdef __cplusplus
extern "C" {
#endif
#ifndef CSRIAPI
- /** CSRI API attributes.
- * defaults to \c extern.
- */
+ /** CSRI API attributes.
+ * defaults to \c extern.
+ */
#define CSRIAPI extern
#endif
- /** \defgroup base CSRI base API. */
- /*@{*/
+ /** \defgroup base CSRI base API. */
+ /*@{*/
- /** pixel format specification for frames */
- enum csri_pixfmt {
- CSRI_F_RGBA = 0,
- CSRI_F_ARGB,
- CSRI_F_BGRA,
- CSRI_F_ABGR,
+ /** pixel format specification for frames */
+ enum csri_pixfmt {
+ CSRI_F_RGBA = 0,
+ CSRI_F_ARGB,
+ CSRI_F_BGRA,
+ CSRI_F_ABGR,
- CSRI_F_RGB_ = 0x100,
- CSRI_F__RGB,
- CSRI_F_BGR_, /**< Windows "RGB32" */
- CSRI_F__BGR,
+ CSRI_F_RGB_ = 0x100,
+ CSRI_F__RGB,
+ CSRI_F_BGR_, /**< Windows "RGB32" */
+ CSRI_F__BGR,
- CSRI_F_RGB = 0x200,
- CSRI_F_BGR, /**< Windows "RGB24" */
+ CSRI_F_RGB = 0x200,
+ CSRI_F_BGR, /**< Windows "RGB24" */
- CSRI_F_AYUV = 0x1000,
- CSRI_F_YUVA,
- CSRI_F_YVUA,
+ CSRI_F_AYUV = 0x1000,
+ CSRI_F_YUVA,
+ CSRI_F_YVUA,
- CSRI_F_YUY2 = 0x1100,
+ CSRI_F_YUY2 = 0x1100,
- CSRI_F_YV12A = 0x2011, /**< planar YUV 2x2 + alpha plane */
- CSRI_F_YV12 = 0x2111 /**< planar YUV 2x2 */
- };
+ CSRI_F_YV12A = 0x2011, /**< planar YUV 2x2 + alpha plane */
+ CSRI_F_YV12 = 0x2111 /**< planar YUV 2x2 */
+ };
#define csri_is_rgb(x) ((x) < 0x1000)
#define csri_is_yuv(x) ((x) >= 0x1000)
@@ -85,261 +85,261 @@ extern "C" {
#define csri_is_yuv_packed(x) ((x) >= 0x1000 && (x) < 0x2000)
#define csri_has_alpha(x) (((x) & 0xfff) < 0x100)
- /** frame/image format specification pre-fed to the renderer */
- struct csri_fmt {
- /** format to be used */
- enum csri_pixfmt pixfmt;
- /** image width, full frame.
- *
- * This should specify the full size of the frame.
- * Specifying the video sub-size (in case of added black
- * borders) is left to an extension.
- */
- unsigned width;
- /** image height */
- unsigned height;
- };
-
- /** single frame to be fed to the renderer. */
- struct csri_frame {
- /** frame format.
- * It is an application bug if this differs from the one
- * passed in struct #csri_fmt to csri_query_fmt()
- */
- enum csri_pixfmt pixfmt;
- /** the frame's data.
- * Packed formats only use planes[0]; planar formats
- * have the data ordered as Y, U, V[, A].
- *
- * Also note that the topmost line always comes first.
- * The Windows biHeight strange-ity is \a NOT duplicated.
- */
- unsigned char *planes[4];
- /** strides for the individual planes.
- * Stride means full byte offset, i.e. do \a not add
- * frame width
- */
- ptrdiff_t strides[4];
- };
+ /** frame/image format specification pre-fed to the renderer */
+ struct csri_fmt {
+ /** format to be used */
+ enum csri_pixfmt pixfmt;
+ /** image width, full frame.
+ *
+ * This should specify the full size of the frame.
+ * Specifying the video sub-size (in case of added black
+ * borders) is left to an extension.
+ */
+ unsigned width;
+ /** image height */
+ unsigned height;
+ };
+
+ /** single frame to be fed to the renderer. */
+ struct csri_frame {
+ /** frame format.
+ * It is an application bug if this differs from the one
+ * passed in struct #csri_fmt to csri_query_fmt()
+ */
+ enum csri_pixfmt pixfmt;
+ /** the frame's data.
+ * Packed formats only use planes[0]; planar formats
+ * have the data ordered as Y, U, V[, A].
+ *
+ * Also note that the topmost line always comes first.
+ * The Windows biHeight strange-ity is \a NOT duplicated.
+ */
+ unsigned char* planes[4];
+ /** strides for the individual planes.
+ * Stride means full byte offset, i.e. do \a not add
+ * frame width
+ */
+ ptrdiff_t strides[4];
+ };
#ifndef CSRI_OWN_HANDLES
- /** opaque renderer data */
- typedef void csri_rend;
- /** opaque instance data */
- typedef void csri_inst;
+ /** opaque renderer data */
+ typedef void csri_rend;
+ /** opaque instance data */
+ typedef void csri_inst;
#endif
#ifdef DOXYGEN
- /** disable the emission of the csri_rend and csri_inst typedefs.
- * define this if you are in a renderer and are typedef'ing
- * csri_rend and csri_inst to your own structs.
- */
+ /** disable the emission of the csri_rend and csri_inst typedefs.
+ * define this if you are in a renderer and are typedef'ing
+ * csri_rend and csri_inst to your own structs.
+ */
#define CSRI_OWN_HANDLES
#endif
- /** renderer description.
- * \ingroup loader
- */
- struct csri_info {
- /** an identifier for the renderer.
- * - MUST match the regular expression
- * \code ^[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])? \endcode
- * i.e. consists only of letters, numbers and underscores;
- * must start with a letter and doesnt have an underscore
- * as the last character.
- */
- const char *name;
- /** an identifier to the exact version of the renderer.
- * most likely a version number or revision identifier.
- *
- * The helper library does a strcmp over this field in order
- * to order multiple instances of the same renderer. Use
- * higher-byte-value strings for newer renderers.
- */
- const char *specific;
-
- /** a nice name to be presented to the user */
- const char *longname;
- /** the renderer's author */
- const char *author;
- /** a copyright string. Copyright (c) 2042 by Mr. Nice Guy */
- const char *copyright;
- };
-
- /** data of extension-dependent type.
- * The field to be used MUST be specified in the extension where it is used.
- */
- union csri_vardata {
- long lval;
- double dval;
- const char *utf8val;
- void *otherval;
- };
-
- /** extension identifier.
- * This follows reverse DNS syntax, i.e.:
- * \code root.branch.leaf \endcode
- * you can either reverse a registered domain name, e.g.
- * \code com.microsoft.csri.usegdiplus \endcode
- * or ask the CSRI maintainers to assign a namespace to you.
- *
- * currently registered namespaces are:
- *
- * \code
- * csri.* - official extensions
- * asa.* - custom extensions of the asa renderer
- * \endcode
- */
- typedef const char *csri_ext_id;
-
- /** script loading parameters.
- * each flag MUST have an associated extension, which can be queried
- * with csri_query_ext(). If the open flag constitutes an extension on its
- * sole own, csri_query_ext() can return a meaningless non-NULL value for
- * it.
- *
- * The data field used must be specified.
- *
- * An extension can have multiple flags. In that case, the flags should have
- * the extension name as common prefix, separated with a dot.
- *
- * A renderer MUST ignore unknown open flags. It MUST NOT return an error
- * just because it does not support a particular flag.
- */
- struct csri_openflag {
- /** flag name */
- csri_ext_id name;
- /** flag data argument */
- union csri_vardata data;
- /** link to next flag */
- struct csri_openflag *next;
- };
-
- /** load a script from a file.
- * \param renderer the handle to the renderer
- * \param filename the path to the file to be loaded. \n
- * The filename should be encoded as UTF-8. Windows renderers are
- * expected to convert it to UTF-16 and use the Unicode Windows API
- * functions.
- * \param flags a linked list of open flags. \n
- * The caller manages memory allocation, i.e. static allocation is OK.
- * \return the renderer instance handle, or NULL on error.
- */
- CSRIAPI csri_inst *csri_open_file(csri_rend *renderer,
- const char *filename, struct csri_openflag *flags);
-
- /** load a script from memory.
- * \param renderer the handle to the renderer
- * \param data pointer to the first data byte. \n
- * The caller manages memory allocation and should free the data after
- * calling csri_open_mem(). If the renderer needs to keep the data, it
- * must copy it. \n
- * The renderer is not allowed to write to the data.
- * \param length length, in bytes, of the data
- * \param flags see csri_open_file()
- * \return the render instance handle, or NULL on error.
- */
-
- CSRIAPI csri_inst *csri_open_mem(csri_rend *renderer,
- const void *data, size_t length, struct csri_openflag *flags);
-
- /** close a renderer instance.
- * \param inst the instance handle.
- */
- CSRIAPI void csri_close(csri_inst *inst);
-
-
- /** query / set the image format and size.
- * \param inst the renderer instance handle
- * \param fmt the format and image size to be used
- * \return 0 if the format was successfully set,
- * any other value in case of error.
- */
- CSRIAPI int csri_request_fmt(csri_inst *inst, const struct csri_fmt *fmt);
-
- /** render a single frame
- * \param inst the renderer instance handle
- * \param frame frame data to render to
- * \param time associated timestamp of the frame
- */
- CSRIAPI void csri_render(csri_inst *inst, struct csri_frame *frame,
- double time);
-
-
- /** query for an extension.
- * \param rend the renderer handle
- * \param extname the extension's identifier
- * \return NULL if the extension is not supported,
- * a pointer to extension-specific data otherwise
- *
- * The data pointed to by the return value does not neccessarily need to
- * have any meaning; An extension that does not need to return data
- * can return a pointer to whatever it wants, as long as that pointer is
- * not NULL.
- *
- * In the usual case, the pointer is supposed to point to a struct with
- * function pointers and other information as needed.
- */
- CSRIAPI void *csri_query_ext(csri_rend *rend, csri_ext_id extname);
-
- /*@}*/
-
- /** \defgroup loader CSRI loader API.
- *
- * These functions locate renderers based on given parameters.
- *
- * <b>Renderers must implement these functions as well.</b>
- *
- * They are used by the library to grab renderer information
- * from a shared object; and also this way a single renderer
- * can be linked directly into an appliaction.
- */
- /*@{*/
-
- /** get renderer information
- * \param rend the renderer handle
- * \return information about the renderer, or NULL in case the renderer
- * encountered an internal error.
- */
- CSRIAPI struct csri_info *csri_renderer_info(csri_rend *rend);
-
- /** try to load a given renderer
- * \param name the name of the renderer, as in csri_info.name
- * \param specific the specific version of the renderer,
- * as in csri_info.specific;\n
- * alternatively NULL if any version of the renderer is ok.
- * \return a handle to the renderer if it was successfully loaded,
- * NULL otherwise.
- */
- CSRIAPI csri_rend *csri_renderer_byname(const char *name,
- const char *specific);
-
- /** try to find an implementation of the given extensions.
- * \param next number of extensions pointed to by ext
- * \param ext array of extensions to search for
- * \return a handle to a renderer supporting ALL of the
- * extensions, NULL if none was found.
- */
- CSRIAPI csri_rend *csri_renderer_byext(unsigned n_ext, csri_ext_id *ext);
-
- /** get the default (highest priority) renderer
- * \return a handle to the default renderer, or NULL if
- * no renderer is installed.
- *
- * Together with csri_renderer_next(), this can be used
- * to enumerate all installed renderers.
- */
- CSRIAPI csri_rend *csri_renderer_default();
-
- /** get the next lower priority renderer
- * \param prev the current renderer
- * \return the renderer with the next lower priority than
- * the one named in prev, or NULL if prev is the last
- * renderer installed.
- */
- CSRIAPI csri_rend *csri_renderer_next(csri_rend *prev);
-
- /*@}*/
+ /** renderer description.
+ * \ingroup loader
+ */
+ struct csri_info {
+ /** an identifier for the renderer.
+ * - MUST match the regular expression
+ * \code ^[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])? \endcode
+ * i.e. consists only of letters, numbers and underscores;
+ * must start with a letter and doesnt have an underscore
+ * as the last character.
+ */
+ const char* name;
+ /** an identifier to the exact version of the renderer.
+ * most likely a version number or revision identifier.
+ *
+ * The helper library does a strcmp over this field in order
+ * to order multiple instances of the same renderer. Use
+ * higher-byte-value strings for newer renderers.
+ */
+ const char* specific;
+
+ /** a nice name to be presented to the user */
+ const char* longname;
+ /** the renderer's author */
+ const char* author;
+ /** a copyright string. Copyright (c) 2042 by Mr. Nice Guy */
+ const char* copyright;
+ };
+
+ /** data of extension-dependent type.
+ * The field to be used MUST be specified in the extension where it is used.
+ */
+ union csri_vardata {
+ long lval;
+ double dval;
+ const char* utf8val;
+ void* otherval;
+ };
+
+ /** extension identifier.
+ * This follows reverse DNS syntax, i.e.:
+ * \code root.branch.leaf \endcode
+ * you can either reverse a registered domain name, e.g.
+ * \code com.microsoft.csri.usegdiplus \endcode
+ * or ask the CSRI maintainers to assign a namespace to you.
+ *
+ * currently registered namespaces are:
+ *
+ * \code
+ * csri.* - official extensions
+ * asa.* - custom extensions of the asa renderer
+ * \endcode
+ */
+ typedef const char* csri_ext_id;
+
+ /** script loading parameters.
+ * each flag MUST have an associated extension, which can be queried
+ * with csri_query_ext(). If the open flag constitutes an extension on its
+ * sole own, csri_query_ext() can return a meaningless non-NULL value for
+ * it.
+ *
+ * The data field used must be specified.
+ *
+ * An extension can have multiple flags. In that case, the flags should have
+ * the extension name as common prefix, separated with a dot.
+ *
+ * A renderer MUST ignore unknown open flags. It MUST NOT return an error
+ * just because it does not support a particular flag.
+ */
+ struct csri_openflag {
+ /** flag name */
+ csri_ext_id name;
+ /** flag data argument */
+ union csri_vardata data;
+ /** link to next flag */
+ struct csri_openflag* next;
+ };
+
+ /** load a script from a file.
+ * \param renderer the handle to the renderer
+ * \param filename the path to the file to be loaded. \n
+ * The filename should be encoded as UTF-8. Windows renderers are
+ * expected to convert it to UTF-16 and use the Unicode Windows API
+ * functions.
+ * \param flags a linked list of open flags. \n
+ * The caller manages memory allocation, i.e. static allocation is OK.
+ * \return the renderer instance handle, or NULL on error.
+ */
+ CSRIAPI csri_inst* csri_open_file(csri_rend* renderer,
+ const char* filename, struct csri_openflag* flags);
+
+ /** load a script from memory.
+ * \param renderer the handle to the renderer
+ * \param data pointer to the first data byte. \n
+ * The caller manages memory allocation and should free the data after
+ * calling csri_open_mem(). If the renderer needs to keep the data, it
+ * must copy it. \n
+ * The renderer is not allowed to write to the data.
+ * \param length length, in bytes, of the data
+ * \param flags see csri_open_file()
+ * \return the render instance handle, or NULL on error.
+ */
+
+ CSRIAPI csri_inst* csri_open_mem(csri_rend* renderer,
+ const void* data, size_t length, struct csri_openflag* flags);
+
+ /** close a renderer instance.
+ * \param inst the instance handle.
+ */
+ CSRIAPI void csri_close(csri_inst* inst);
+
+
+ /** query / set the image format and size.
+ * \param inst the renderer instance handle
+ * \param fmt the format and image size to be used
+ * \return 0 if the format was successfully set,
+ * any other value in case of error.
+ */
+ CSRIAPI int csri_request_fmt(csri_inst* inst, const struct csri_fmt* fmt);
+
+ /** render a single frame
+ * \param inst the renderer instance handle
+ * \param frame frame data to render to
+ * \param time associated timestamp of the frame
+ */
+ CSRIAPI void csri_render(csri_inst* inst, struct csri_frame* frame,
+ double time);
+
+
+ /** query for an extension.
+ * \param rend the renderer handle
+ * \param extname the extension's identifier
+ * \return NULL if the extension is not supported,
+ * a pointer to extension-specific data otherwise
+ *
+ * The data pointed to by the return value does not neccessarily need to
+ * have any meaning; An extension that does not need to return data
+ * can return a pointer to whatever it wants, as long as that pointer is
+ * not NULL.
+ *
+ * In the usual case, the pointer is supposed to point to a struct with
+ * function pointers and other information as needed.
+ */
+ CSRIAPI void* csri_query_ext(csri_rend* rend, csri_ext_id extname);
+
+ /*@}*/
+
+ /** \defgroup loader CSRI loader API.
+ *
+ * These functions locate renderers based on given parameters.
+ *
+ * <b>Renderers must implement these functions as well.</b>
+ *
+ * They are used by the library to grab renderer information
+ * from a shared object; and also this way a single renderer
+ * can be linked directly into an appliaction.
+ */
+ /*@{*/
+
+ /** get renderer information
+ * \param rend the renderer handle
+ * \return information about the renderer, or NULL in case the renderer
+ * encountered an internal error.
+ */
+ CSRIAPI struct csri_info* csri_renderer_info(csri_rend* rend);
+
+ /** try to load a given renderer
+ * \param name the name of the renderer, as in csri_info.name
+ * \param specific the specific version of the renderer,
+ * as in csri_info.specific;\n
+ * alternatively NULL if any version of the renderer is ok.
+ * \return a handle to the renderer if it was successfully loaded,
+ * NULL otherwise.
+ */
+ CSRIAPI csri_rend* csri_renderer_byname(const char* name,
+ const char* specific);
+
+ /** try to find an implementation of the given extensions.
+ * \param next number of extensions pointed to by ext
+ * \param ext array of extensions to search for
+ * \return a handle to a renderer supporting ALL of the
+ * extensions, NULL if none was found.
+ */
+ CSRIAPI csri_rend* csri_renderer_byext(unsigned n_ext, csri_ext_id* ext);
+
+ /** get the default (highest priority) renderer
+ * \return a handle to the default renderer, or NULL if
+ * no renderer is installed.
+ *
+ * Together with csri_renderer_next(), this can be used
+ * to enumerate all installed renderers.
+ */
+ CSRIAPI csri_rend* csri_renderer_default();
+
+ /** get the next lower priority renderer
+ * \param prev the current renderer
+ * \return the renderer with the next lower priority than
+ * the one named in prev, or NULL if prev is the last
+ * renderer installed.
+ */
+ CSRIAPI csri_rend* csri_renderer_next(csri_rend* prev);
+
+ /*@}*/
#ifdef __cplusplus
}
diff --git a/src/filters/transform/VSFilter/csriapi.cpp b/src/filters/transform/VSFilter/csriapi.cpp
index 42865c1d1..9b710813e 100644
--- a/src/filters/transform/VSFilter/csriapi.cpp
+++ b/src/filters/transform/VSFilter/csriapi.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2007 Niels Martin Hansen
- * http://aegisub.net/
+ * Copyright (C) 2007 Niels Martin Hansen
+ * http://aegisub.net/
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -29,15 +29,15 @@
#define CSRIAPI extern "C" __declspec(dllexport)
#define CSRI_OWN_HANDLES
-typedef const char *csri_rend;
+typedef const char* csri_rend;
extern "C" struct csri_vsfilter_inst {
- CRenderedTextSubtitle *rts;
- CCritSec *cs;
- CSize script_res;
- CSize screen_res;
- CRect video_rect;
- enum csri_pixfmt pixfmt;
- size_t readorder;
+ CRenderedTextSubtitle* rts;
+ CCritSec* cs;
+ CSize script_res;
+ CSize screen_res;
+ CRect video_rect;
+ enum csri_pixfmt pixfmt;
+ size_t readorder;
};
typedef struct csri_vsfilter_inst csri_inst;
@@ -45,189 +45,189 @@ typedef struct csri_vsfilter_inst csri_inst;
static csri_rend csri_vsfilter = "vsfilter";
-CSRIAPI csri_inst *csri_open_file(csri_rend *renderer, const char *filename, struct csri_openflag *flags)
+CSRIAPI csri_inst* csri_open_file(csri_rend* renderer, const char* filename, struct csri_openflag* flags)
{
- int namesize;
- wchar_t *namebuf;
-
- namesize = MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0);
- if (!namesize) {
- return 0;
- }
- namesize++;
- namebuf = new wchar_t[namesize];
- MultiByteToWideChar(CP_UTF8, 0, filename, -1, namebuf, namesize);
-
- csri_inst *inst = new csri_inst();
- inst->cs = new CCritSec();
- inst->rts = new CRenderedTextSubtitle(inst->cs);
- if (inst->rts->Open(CString(namebuf), DEFAULT_CHARSET)) {
- delete[] namebuf;
- inst->readorder = 0;
- return inst;
- } else {
- delete[] namebuf;
- delete inst->rts;
- delete inst->cs;
- delete inst;
- return 0;
- }
+ int namesize;
+ wchar_t* namebuf;
+
+ namesize = MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0);
+ if (!namesize) {
+ return 0;
+ }
+ namesize++;
+ namebuf = new wchar_t[namesize];
+ MultiByteToWideChar(CP_UTF8, 0, filename, -1, namebuf, namesize);
+
+ csri_inst* inst = new csri_inst();
+ inst->cs = new CCritSec();
+ inst->rts = new CRenderedTextSubtitle(inst->cs);
+ if (inst->rts->Open(CString(namebuf), DEFAULT_CHARSET)) {
+ delete[] namebuf;
+ inst->readorder = 0;
+ return inst;
+ } else {
+ delete[] namebuf;
+ delete inst->rts;
+ delete inst->cs;
+ delete inst;
+ return 0;
+ }
}
-CSRIAPI csri_inst *csri_open_mem(csri_rend *renderer, const void *data, size_t length, struct csri_openflag *flags)
+CSRIAPI csri_inst* csri_open_mem(csri_rend* renderer, const void* data, size_t length, struct csri_openflag* flags)
{
- // This is actually less effecient than opening a file, since this first writes the memory data to a temp file,
- // then opens that file and parses from that.
- csri_inst *inst = new csri_inst();
- inst->cs = new CCritSec();
- inst->rts = new CRenderedTextSubtitle(inst->cs);
- if (inst->rts->Open((BYTE*)data, (int)length, DEFAULT_CHARSET, _T("CSRI memory subtitles"))) {
- inst->readorder = 0;
- return inst;
- } else {
- delete inst->rts;
- delete inst->cs;
- delete inst;
- return 0;
- }
+ // This is actually less effecient than opening a file, since this first writes the memory data to a temp file,
+ // then opens that file and parses from that.
+ csri_inst* inst = new csri_inst();
+ inst->cs = new CCritSec();
+ inst->rts = new CRenderedTextSubtitle(inst->cs);
+ if (inst->rts->Open((BYTE*)data, (int)length, DEFAULT_CHARSET, _T("CSRI memory subtitles"))) {
+ inst->readorder = 0;
+ return inst;
+ } else {
+ delete inst->rts;
+ delete inst->cs;
+ delete inst;
+ return 0;
+ }
}
-CSRIAPI void csri_close(csri_inst *inst)
+CSRIAPI void csri_close(csri_inst* inst)
{
- if (!inst) {
- return;
- }
+ if (!inst) {
+ return;
+ }
- delete inst->rts;
- delete inst->cs;
- delete inst;
+ delete inst->rts;
+ delete inst->cs;
+ delete inst;
}
-CSRIAPI int csri_request_fmt(csri_inst *inst, const struct csri_fmt *fmt)
+CSRIAPI int csri_request_fmt(csri_inst* inst, const struct csri_fmt* fmt)
{
- if (!inst) {
- return -1;
- }
-
- if (!fmt->width || !fmt->height) {
- return -1;
- }
-
- // Check if pixel format is supported
- switch (fmt->pixfmt) {
- case CSRI_F_BGR_:
- case CSRI_F_BGR:
- case CSRI_F_YUY2:
- case CSRI_F_YV12:
- inst->pixfmt = fmt->pixfmt;
- break;
-
- default:
- return -1;
- }
- inst->screen_res = CSize(fmt->width, fmt->height);
- inst->video_rect = CRect(0, 0, fmt->width, fmt->height);
- return 0;
+ if (!inst) {
+ return -1;
+ }
+
+ if (!fmt->width || !fmt->height) {
+ return -1;
+ }
+
+ // Check if pixel format is supported
+ switch (fmt->pixfmt) {
+ case CSRI_F_BGR_:
+ case CSRI_F_BGR:
+ case CSRI_F_YUY2:
+ case CSRI_F_YV12:
+ inst->pixfmt = fmt->pixfmt;
+ break;
+
+ default:
+ return -1;
+ }
+ inst->screen_res = CSize(fmt->width, fmt->height);
+ inst->video_rect = CRect(0, 0, fmt->width, fmt->height);
+ return 0;
}
-CSRIAPI void csri_render(csri_inst *inst, struct csri_frame *frame, double time)
+CSRIAPI void csri_render(csri_inst* inst, struct csri_frame* frame, double time)
{
- const double arbitrary_framerate = 25.0;
- SubPicDesc spd;
- spd.w = inst->screen_res.cx;
- spd.h = inst->screen_res.cy;
- switch (inst->pixfmt) {
- case CSRI_F_BGR_:
- spd.type = MSP_RGB32;
- spd.bpp = 32;
- spd.bits = frame->planes[0];
- spd.pitch = frame->strides[0];
- break;
-
- case CSRI_F_BGR:
- spd.type = MSP_RGB24;
- spd.bpp = 24;
- spd.bits = frame->planes[0];
- spd.pitch = frame->strides[0];
- break;
-
- case CSRI_F_YUY2:
- spd.type = MSP_YUY2;
- spd.bpp = 16;
- spd.bits = frame->planes[0];
- spd.pitch = frame->strides[0];
- break;
-
- case CSRI_F_YV12:
- spd.type = MSP_YV12;
- spd.bpp = 12;
- spd.bits = frame->planes[0];
- spd.bitsU = frame->planes[1];
- spd.bitsV = frame->planes[2];
- spd.pitch = frame->strides[0];
- spd.pitchUV = frame->strides[1];
- break;
-
- default:
- // eh?
- return;
- }
- spd.vidrect = inst->video_rect;
-
- inst->rts->Render(spd, (REFERENCE_TIME)(time*10000000), arbitrary_framerate, inst->video_rect);
+ const double arbitrary_framerate = 25.0;
+ SubPicDesc spd;
+ spd.w = inst->screen_res.cx;
+ spd.h = inst->screen_res.cy;
+ switch (inst->pixfmt) {
+ case CSRI_F_BGR_:
+ spd.type = MSP_RGB32;
+ spd.bpp = 32;
+ spd.bits = frame->planes[0];
+ spd.pitch = frame->strides[0];
+ break;
+
+ case CSRI_F_BGR:
+ spd.type = MSP_RGB24;
+ spd.bpp = 24;
+ spd.bits = frame->planes[0];
+ spd.pitch = frame->strides[0];
+ break;
+
+ case CSRI_F_YUY2:
+ spd.type = MSP_YUY2;
+ spd.bpp = 16;
+ spd.bits = frame->planes[0];
+ spd.pitch = frame->strides[0];
+ break;
+
+ case CSRI_F_YV12:
+ spd.type = MSP_YV12;
+ spd.bpp = 12;
+ spd.bits = frame->planes[0];
+ spd.bitsU = frame->planes[1];
+ spd.bitsV = frame->planes[2];
+ spd.pitch = frame->strides[0];
+ spd.pitchUV = frame->strides[1];
+ break;
+
+ default:
+ // eh?
+ return;
+ }
+ spd.vidrect = inst->video_rect;
+
+ inst->rts->Render(spd, (REFERENCE_TIME)(time * 10000000), arbitrary_framerate, inst->video_rect);
}
// No extensions supported
-CSRIAPI void *csri_query_ext(csri_rend *rend, csri_ext_id extname)
+CSRIAPI void* csri_query_ext(csri_rend* rend, csri_ext_id extname)
{
- return 0;
+ return 0;
}
// Get info for renderer
static struct csri_info csri_vsfilter_info = {
#ifdef _DEBUG
- "vsfilter_textsub_debug", // name
- "2.41", // version (assumed version number, svn revision, patchlevel)
+ "vsfilter_textsub_debug", // name
+ "2.41", // version (assumed version number, svn revision, patchlevel)
#else
- "vsfilter_textsub", // name
- "2.41", // version (assumed version number, svn revision, patchlevel)
+ "vsfilter_textsub", // name
+ "2.41", // version (assumed version number, svn revision, patchlevel)
#endif
- // 2.38-0611 is base svn 611
- // 2.38-0611-1 is with clipfix and fax/fay patch
- // 2.38-0611-2 adds CSRI
- // 2.38-0611-3 fixes a bug in CSRI and adds fontcrash-fix and float-pos
- // 2.38-0611-4 fixes be1-dots and ugly-fade bugs and adds xbord/ybord/xshad/yshad/blur tags and extends be
- // 2.39 merges with guliverkli2 fork
- // 2.41 removes SSF support
- "VSFilter/TextSub (MPC-HC)", // longname
- "Gabest", // author
- "Copyright (c) 2003-2012 by Gabest et al." // copyright
+ // 2.38-0611 is base svn 611
+ // 2.38-0611-1 is with clipfix and fax/fay patch
+ // 2.38-0611-2 adds CSRI
+ // 2.38-0611-3 fixes a bug in CSRI and adds fontcrash-fix and float-pos
+ // 2.38-0611-4 fixes be1-dots and ugly-fade bugs and adds xbord/ybord/xshad/yshad/blur tags and extends be
+ // 2.39 merges with guliverkli2 fork
+ // 2.41 removes SSF support
+ "VSFilter/TextSub (MPC-HC)", // longname
+ "Gabest", // author
+ "Copyright (c) 2003-2012 by Gabest et al." // copyright
};
-CSRIAPI struct csri_info *csri_renderer_info(csri_rend *rend) {
- return &csri_vsfilter_info;
+CSRIAPI struct csri_info* csri_renderer_info(csri_rend* rend) {
+ return &csri_vsfilter_info;
}
// Only one supported, obviously
-CSRIAPI csri_rend *csri_renderer_byname(const char *name, const char *specific)
+CSRIAPI csri_rend* csri_renderer_byname(const char* name, const char* specific)
{
- if (strcmp(name, csri_vsfilter_info.name)) {
- return 0;
- }
- if (specific && strcmp(specific, csri_vsfilter_info.specific)) {
- return 0;
- }
- return &csri_vsfilter;
+ if (strcmp(name, csri_vsfilter_info.name)) {
+ return 0;
+ }
+ if (specific && strcmp(specific, csri_vsfilter_info.specific)) {
+ return 0;
+ }
+ return &csri_vsfilter;
}
// Still just one
-CSRIAPI csri_rend *csri_renderer_default()
+CSRIAPI csri_rend* csri_renderer_default()
{
- return &csri_vsfilter;
+ return &csri_vsfilter;
}
// And no further
-CSRIAPI csri_rend *csri_renderer_next(csri_rend *prev)
+CSRIAPI csri_rend* csri_renderer_next(csri_rend* prev)
{
- return 0;
+ return 0;
}
diff --git a/src/filters/transform/VSFilter/plugins.cpp b/src/filters/transform/VSFilter/plugins.cpp
index 926dad714..fc80c0074 100644
--- a/src/filters/transform/VSFilter/plugins.cpp
+++ b/src/filters/transform/VSFilter/plugins.cpp
@@ -38,1043 +38,1048 @@
namespace Plugin
{
- class CFilter : public CAMThread, public CCritSec
- {
- private:
- CString m_fn;
-
- protected:
- float m_fps;
- CCritSec m_csSubLock;
- CComPtr<ISubPicQueue> m_pSubPicQueue;
- CComPtr<ISubPicProvider> m_pSubPicProvider;
- DWORD_PTR m_SubPicProviderId;
-
- public:
- CFilter() : m_fps(-1), m_SubPicProviderId(0) {
- CAMThread::Create();
- }
- virtual ~CFilter() {
- CAMThread::CallWorker(0);
- }
-
- CString GetFileName() {
- CAutoLock cAutoLock(this);
- return m_fn;
- }
- void SetFileName(CString fn) {
- CAutoLock cAutoLock(this);
- m_fn = fn;
- }
-
- bool Render(SubPicDesc& dst, REFERENCE_TIME rt, float fps) {
- if (!m_pSubPicProvider) {
- return false;
- }
-
- CSize size(dst.w, dst.h);
-
- if (!m_pSubPicQueue) {
- CComPtr<ISubPicAllocator> pAllocator = DNew CMemSubPicAllocator(dst.type, size);
-
- HRESULT hr;
- if (!(m_pSubPicQueue = DNew CSubPicQueueNoThread(pAllocator, &hr)) || FAILED(hr)) {
- m_pSubPicQueue = NULL;
- return false;
- }
- }
-
- if (m_SubPicProviderId != (DWORD_PTR)(ISubPicProvider*)m_pSubPicProvider) {
- m_pSubPicQueue->SetSubPicProvider(m_pSubPicProvider);
- m_SubPicProviderId = (DWORD_PTR)(ISubPicProvider*)m_pSubPicProvider;
- }
-
- CComPtr<ISubPic> pSubPic;
- if (!m_pSubPicQueue->LookupSubPic(rt, pSubPic)) {
- return false;
- }
-
- CRect r;
- pSubPic->GetDirtyRect(r);
-
- if (dst.type == MSP_RGB32 || dst.type == MSP_RGB24 || dst.type == MSP_RGB16 || dst.type == MSP_RGB15) {
- dst.h = -dst.h;
- }
-
- pSubPic->AlphaBlt(r, r, &dst);
-
- return true;
- }
-
- DWORD ThreadProc() {
- SetThreadPriority(m_hThread, THREAD_PRIORITY_LOWEST);
-
- CAtlArray<HANDLE> handles;
- handles.Add(GetRequestHandle());
-
- CString fn = GetFileName();
- CFileStatus fs;
- fs.m_mtime = 0;
- CFileGetStatus(fn, fs);
-
- for (;;) {
- DWORD i = WaitForMultipleObjects(handles.GetCount(), handles.GetData(), FALSE, 1000);
-
- if (WAIT_OBJECT_0 == i) {
- Reply(S_OK);
- break;
- } else if (WAIT_OBJECT_0 + 1 >= i && i <= WAIT_OBJECT_0 + handles.GetCount()) {
- if (FindNextChangeNotification(handles[i - WAIT_OBJECT_0])) {
- CFileStatus fs2;
- fs2.m_mtime = 0;
- CFileGetStatus(fn, fs2);
-
- if (fs.m_mtime < fs2.m_mtime) {
- fs.m_mtime = fs2.m_mtime;
-
- if (CComQIPtr<ISubStream> pSubStream = m_pSubPicProvider) {
- CAutoLock cAutoLock(&m_csSubLock);
- pSubStream->Reload();
- }
- }
- }
- } else if (WAIT_TIMEOUT == i) {
- CString fn2 = GetFileName();
-
- if (fn != fn2) {
- CPath p(fn2);
- p.RemoveFileSpec();
- HANDLE h = FindFirstChangeNotification(p, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE);
- if (h != INVALID_HANDLE_VALUE) {
- fn = fn2;
- handles.SetCount(1);
- handles.Add(h);
- }
- }
- } else { // if (WAIT_ABANDONED_0 == i || WAIT_FAILED == i)
- break;
- }
- }
-
- m_hThread = 0;
-
- for (size_t i = 1; i < handles.GetCount(); i++) {
- FindCloseChangeNotification(handles[i]);
- }
-
- return 0;
- }
- };
-
- class CVobSubFilter : virtual public CFilter
- {
- public:
- CVobSubFilter(CString fn = _T("")) {
- if (!fn.IsEmpty()) {
- Open(fn);
- }
- }
-
- bool Open(CString fn) {
- SetFileName(_T(""));
- m_pSubPicProvider = NULL;
-
- if (CVobSubFile* vsf = DNew CVobSubFile(&m_csSubLock)) {
- m_pSubPicProvider = (ISubPicProvider*)vsf;
- if (vsf->Open(CString(fn))) {
- SetFileName(fn);
- } else {
- m_pSubPicProvider = NULL;
- }
- }
-
- return !!m_pSubPicProvider;
- }
- };
-
- class CTextSubFilter : virtual public CFilter
- {
- int m_CharSet;
-
- public:
- CTextSubFilter(CString fn = _T(""), int CharSet = DEFAULT_CHARSET, float fps = -1)
- : m_CharSet(CharSet) {
- m_fps = fps;
- if (!fn.IsEmpty()) {
- Open(fn, CharSet);
- }
- }
-
- int GetCharSet() {
- return m_CharSet;
- }
-
- bool Open(CString fn, int CharSet = DEFAULT_CHARSET) {
- SetFileName(_T(""));
- m_pSubPicProvider = NULL;
-
- if (!m_pSubPicProvider) {
- if (CRenderedTextSubtitle* rts = DNew CRenderedTextSubtitle(&m_csSubLock)) {
- m_pSubPicProvider = (ISubPicProvider*)rts;
- if (rts->Open(CString(fn), CharSet)) {
- SetFileName(fn);
- } else {
- m_pSubPicProvider = NULL;
- }
- }
- }
-
- return !!m_pSubPicProvider;
- }
- };
+ class CFilter : public CAMThread, public CCritSec
+ {
+ private:
+ CString m_fn;
+
+ protected:
+ float m_fps;
+ CCritSec m_csSubLock;
+ CComPtr<ISubPicQueue> m_pSubPicQueue;
+ CComPtr<ISubPicProvider> m_pSubPicProvider;
+ DWORD_PTR m_SubPicProviderId;
+
+ public:
+ CFilter() : m_fps(-1), m_SubPicProviderId(0) {
+ CAMThread::Create();
+ }
+ virtual ~CFilter() {
+ CAMThread::CallWorker(0);
+ }
+
+ CString GetFileName() {
+ CAutoLock cAutoLock(this);
+ return m_fn;
+ }
+ void SetFileName(CString fn) {
+ CAutoLock cAutoLock(this);
+ m_fn = fn;
+ }
+
+ bool Render(SubPicDesc& dst, REFERENCE_TIME rt, float fps) {
+ if (!m_pSubPicProvider) {
+ return false;
+ }
+
+ CSize size(dst.w, dst.h);
+
+ if (!m_pSubPicQueue) {
+ CComPtr<ISubPicAllocator> pAllocator = DNew CMemSubPicAllocator(dst.type, size);
+
+ HRESULT hr;
+ if (!(m_pSubPicQueue = DNew CSubPicQueueNoThread(pAllocator, &hr)) || FAILED(hr)) {
+ m_pSubPicQueue = NULL;
+ return false;
+ }
+ }
+
+ if (m_SubPicProviderId != (DWORD_PTR)(ISubPicProvider*)m_pSubPicProvider) {
+ m_pSubPicQueue->SetSubPicProvider(m_pSubPicProvider);
+ m_SubPicProviderId = (DWORD_PTR)(ISubPicProvider*)m_pSubPicProvider;
+ }
+
+ CComPtr<ISubPic> pSubPic;
+ if (!m_pSubPicQueue->LookupSubPic(rt, pSubPic)) {
+ return false;
+ }
+
+ CRect r;
+ pSubPic->GetDirtyRect(r);
+
+ if (dst.type == MSP_RGB32 || dst.type == MSP_RGB24 || dst.type == MSP_RGB16 || dst.type == MSP_RGB15) {
+ dst.h = -dst.h;
+ }
+
+ pSubPic->AlphaBlt(r, r, &dst);
+
+ return true;
+ }
+
+ DWORD ThreadProc() {
+ SetThreadPriority(m_hThread, THREAD_PRIORITY_LOWEST);
+
+ CAtlArray<HANDLE> handles;
+ handles.Add(GetRequestHandle());
+
+ CString fn = GetFileName();
+ CFileStatus fs;
+ fs.m_mtime = 0;
+ CFileGetStatus(fn, fs);
+
+ for (;;) {
+ DWORD i = WaitForMultipleObjects(handles.GetCount(), handles.GetData(), FALSE, 1000);
+
+ if (WAIT_OBJECT_0 == i) {
+ Reply(S_OK);
+ break;
+ } else if (WAIT_OBJECT_0 + 1 >= i && i <= WAIT_OBJECT_0 + handles.GetCount()) {
+ if (FindNextChangeNotification(handles[i - WAIT_OBJECT_0])) {
+ CFileStatus fs2;
+ fs2.m_mtime = 0;
+ CFileGetStatus(fn, fs2);
+
+ if (fs.m_mtime < fs2.m_mtime) {
+ fs.m_mtime = fs2.m_mtime;
+
+ if (CComQIPtr<ISubStream> pSubStream = m_pSubPicProvider) {
+ CAutoLock cAutoLock(&m_csSubLock);
+ pSubStream->Reload();
+ }
+ }
+ }
+ } else if (WAIT_TIMEOUT == i) {
+ CString fn2 = GetFileName();
+
+ if (fn != fn2) {
+ CPath p(fn2);
+ p.RemoveFileSpec();
+ HANDLE h = FindFirstChangeNotification(p, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE);
+ if (h != INVALID_HANDLE_VALUE) {
+ fn = fn2;
+ handles.SetCount(1);
+ handles.Add(h);
+ }
+ }
+ } else { // if (WAIT_ABANDONED_0 == i || WAIT_FAILED == i)
+ break;
+ }
+ }
+
+ m_hThread = 0;
+
+ for (size_t i = 1; i < handles.GetCount(); i++) {
+ FindCloseChangeNotification(handles[i]);
+ }
+
+ return 0;
+ }
+ };
+
+ class CVobSubFilter : virtual public CFilter
+ {
+ public:
+ CVobSubFilter(CString fn = _T("")) {
+ if (!fn.IsEmpty()) {
+ Open(fn);
+ }
+ }
+
+ bool Open(CString fn) {
+ SetFileName(_T(""));
+ m_pSubPicProvider = NULL;
+
+ if (CVobSubFile* vsf = DNew CVobSubFile(&m_csSubLock)) {
+ m_pSubPicProvider = (ISubPicProvider*)vsf;
+ if (vsf->Open(CString(fn))) {
+ SetFileName(fn);
+ } else {
+ m_pSubPicProvider = NULL;
+ }
+ }
+
+ return !!m_pSubPicProvider;
+ }
+ };
+
+ class CTextSubFilter : virtual public CFilter
+ {
+ int m_CharSet;
+
+ public:
+ CTextSubFilter(CString fn = _T(""), int CharSet = DEFAULT_CHARSET, float fps = -1)
+ : m_CharSet(CharSet) {
+ m_fps = fps;
+ if (!fn.IsEmpty()) {
+ Open(fn, CharSet);
+ }
+ }
+
+ int GetCharSet() {
+ return m_CharSet;
+ }
+
+ bool Open(CString fn, int CharSet = DEFAULT_CHARSET) {
+ SetFileName(_T(""));
+ m_pSubPicProvider = NULL;
+
+ if (!m_pSubPicProvider) {
+ if (CRenderedTextSubtitle* rts = DNew CRenderedTextSubtitle(&m_csSubLock)) {
+ m_pSubPicProvider = (ISubPicProvider*)rts;
+ if (rts->Open(CString(fn), CharSet)) {
+ SetFileName(fn);
+ } else {
+ m_pSubPicProvider = NULL;
+ }
+ }
+ }
+
+ return !!m_pSubPicProvider;
+ }
+ };
#ifndef _WIN64
- //
- // old VirtualDub interface
- //
+ //
+ // old VirtualDub interface
+ //
- namespace VirtualDub
- {
+ namespace VirtualDub
+ {
#include <vd2/extras/FilterSDK/VirtualDub.h>
- class CVirtualDubFilter : virtual public CFilter
- {
- public:
- CVirtualDubFilter() {}
- virtual ~CVirtualDubFilter() {}
-
- virtual int RunProc(const FilterActivation* fa, const FilterFunctions* ff) {
- SubPicDesc dst;
- dst.type = MSP_RGB32;
- dst.w = fa->src.w;
- dst.h = fa->src.h;
- dst.bpp = 32;
- dst.pitch = fa->src.pitch;
- dst.bits = (LPVOID)fa->src.data;
-
- Render(dst, 10000i64*fa->pfsi->lSourceFrameMS, (float)1000 / fa->pfsi->lMicrosecsPerFrame);
-
- return 0;
- }
-
- virtual long ParamProc(FilterActivation* fa, const FilterFunctions* ff) {
- fa->dst.offset = fa->src.offset;
- fa->dst.modulo = fa->src.modulo;
- fa->dst.pitch = fa->src.pitch;
-
- return 0;
- }
-
- virtual int ConfigProc(FilterActivation* fa, const FilterFunctions* ff, HWND hwnd) = 0;
- virtual void StringProc(const FilterActivation* fa, const FilterFunctions* ff, char* str) = 0;
- virtual bool FssProc(FilterActivation* fa, const FilterFunctions* ff, char* buf, int buflen) = 0;
- };
-
- class CVobSubVirtualDubFilter : public CVobSubFilter, public CVirtualDubFilter
- {
- public:
- CVobSubVirtualDubFilter(CString fn = _T(""))
- : CVobSubFilter(fn) {}
-
- int ConfigProc(FilterActivation* fa, const FilterFunctions* ff, HWND hwnd) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- CFileDialog fd(TRUE, NULL, GetFileName(), OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY,
- _T("VobSub files (*.idx;*.sub)|*.idx;*.sub||"), CWnd::FromHandle(hwnd), 0);
-
- if (fd.DoModal() != IDOK) {
- return 1;
- }
-
- return Open(fd.GetPathName()) ? 0 : 1;
- }
-
- void StringProc(const FilterActivation* fa, const FilterFunctions* ff, char* str) {
- sprintf(str, " (%s)", !GetFileName().IsEmpty() ? CStringA(GetFileName()) : " (empty)");
- }
-
- bool FssProc(FilterActivation* fa, const FilterFunctions* ff, char* buf, int buflen) {
- CStringA fn(GetFileName());
- fn.Replace("\\", "\\\\");
- _snprintf_s(buf, buflen, buflen, "Config(\"%s\")", fn);
- return true;
- }
- };
-
- class CTextSubVirtualDubFilter : public CTextSubFilter, public CVirtualDubFilter
- {
- public:
- CTextSubVirtualDubFilter(CString fn = _T(""), int CharSet = DEFAULT_CHARSET)
- : CTextSubFilter(fn, CharSet) {}
-
- int ConfigProc(FilterActivation* fa, const FilterFunctions* ff, HWND hwnd) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- const TCHAR formats[] = _T("TextSub files (*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt)|*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt||");
- CFileDialog fd(TRUE, NULL, GetFileName(), OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_ENABLETEMPLATE|OFN_ENABLEHOOK,
- formats, CWnd::FromHandle(hwnd), sizeof(OPENFILENAME));
- UINT_PTR CALLBACK OpenHookProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam);
-
- fd.m_pOFN->hInstance = AfxGetResourceHandle();
- fd.m_pOFN->lpTemplateName = MAKEINTRESOURCE(IDD_TEXTSUBOPENTEMPLATE);
- fd.m_pOFN->lpfnHook = (LPOFNHOOKPROC)OpenHookProc;
- fd.m_pOFN->lCustData = (LPARAM)DEFAULT_CHARSET;
-
- if (fd.DoModal() != IDOK) {
- return 1;
- }
-
- return Open(fd.GetPathName(), fd.m_pOFN->lCustData) ? 0 : 1;
- }
-
- void StringProc(const FilterActivation* fa, const FilterFunctions* ff, char* str) {
- if (!GetFileName().IsEmpty()) {
- sprintf(str, " (%s, %d)", CStringA(GetFileName()), GetCharSet());
- } else {
- sprintf(str, " (empty)");
- }
- }
-
- bool FssProc(FilterActivation* fa, const FilterFunctions* ff, char* buf, int buflen) {
- CStringA fn(GetFileName());
- fn.Replace("\\", "\\\\");
- _snprintf_s(buf, buflen, buflen, "Config(\"%s\", %d)", fn, GetCharSet());
- return true;
- }
- };
-
- int vobsubInitProc(FilterActivation* fa, const FilterFunctions* ff)
- {
- *(CVirtualDubFilter**)fa->filter_data = DNew CVobSubVirtualDubFilter();
- return !(*(CVirtualDubFilter**)fa->filter_data);
- }
-
- int textsubInitProc(FilterActivation* fa, const FilterFunctions* ff)
- {
- *(CVirtualDubFilter**)fa->filter_data = DNew CTextSubVirtualDubFilter();
- return !(*(CVirtualDubFilter**)fa->filter_data);
- }
-
- void baseDeinitProc(FilterActivation* fa, const FilterFunctions* ff)
- {
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- if (f) {
- delete f, f = NULL;
- }
- }
-
- int baseRunProc(const FilterActivation* fa, const FilterFunctions* ff)
- {
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- return f ? f->RunProc(fa, ff) : 1;
- }
-
- long baseParamProc(FilterActivation* fa, const FilterFunctions* ff)
- {
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- return f ? f->ParamProc(fa, ff) : 1;
- }
-
- int baseConfigProc(FilterActivation* fa, const FilterFunctions* ff, HWND hwnd)
- {
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- return f ? f->ConfigProc(fa, ff, hwnd) : 1;
- }
-
- void baseStringProc(const FilterActivation* fa, const FilterFunctions* ff, char* str)
- {
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- if (f) {
- f->StringProc(fa, ff, str);
- }
- }
-
- bool baseFssProc(FilterActivation* fa, const FilterFunctions* ff, char* buf, int buflen)
- {
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- return f ? f->FssProc(fa, ff, buf, buflen) : false;
- }
-
- void vobsubScriptConfig(IScriptInterpreter* isi, void* lpVoid, CScriptValue* argv, int argc)
- {
- FilterActivation* fa = (FilterActivation*)lpVoid;
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- if (f) {
- delete f;
- }
- f = DNew CVobSubVirtualDubFilter(CString(*argv[0].asString()));
- *(CVirtualDubFilter**)fa->filter_data = f;
- }
-
- void textsubScriptConfig(IScriptInterpreter* isi, void* lpVoid, CScriptValue* argv, int argc)
- {
- FilterActivation* fa = (FilterActivation*)lpVoid;
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- if (f) {
- delete f;
- }
- f = DNew CTextSubVirtualDubFilter(CString(*argv[0].asString()), argv[1].asInt());
- *(CVirtualDubFilter**)fa->filter_data = f;
- }
-
- ScriptFunctionDef vobsub_func_defs[]= {
- { (ScriptFunctionPtr)vobsubScriptConfig, "Config", "0s" },
- { NULL },
- };
-
- CScriptObject vobsub_obj= {
- NULL, vobsub_func_defs
- };
-
- struct FilterDefinition filterDef_vobsub = {
- NULL, NULL, NULL, // next, prev, module
- "VobSub", // name
- "Adds subtitles from a vob sequence.", // desc
- "Gabest", // maker
- NULL, // private_data
- sizeof(CVirtualDubFilter**), // inst_data_size
- vobsubInitProc, // initProc
- baseDeinitProc, // deinitProc
- baseRunProc, // runProc
- baseParamProc, // paramProc
- baseConfigProc, // configProc
- baseStringProc, // stringProc
- NULL, // startProc
- NULL, // endProc
- &vobsub_obj, // script_obj
- baseFssProc, // fssProc
- };
-
- ScriptFunctionDef textsub_func_defs[]= {
- { (ScriptFunctionPtr)textsubScriptConfig, "Config", "0si" },
- { NULL },
- };
-
- CScriptObject textsub_obj= {
- NULL, textsub_func_defs
- };
-
- struct FilterDefinition filterDef_textsub = {
- NULL, NULL, NULL, // next, prev, module
- "TextSub", // name
- "Adds subtitles from srt, sub, psb, smi, ssa, ass file formats.", // desc
- "Gabest", // maker
- NULL, // private_data
- sizeof(CVirtualDubFilter**), // inst_data_size
- textsubInitProc, // initProc
- baseDeinitProc, // deinitProc
- baseRunProc, // runProc
- baseParamProc, // paramProc
- baseConfigProc, // configProc
- baseStringProc, // stringProc
- NULL, // startProc
- NULL, // endProc
- &textsub_obj, // script_obj
- baseFssProc, // fssProc
- };
-
- static FilterDefinition* fd_vobsub;
- static FilterDefinition* fd_textsub;
-
- extern "C" __declspec(dllexport) int __cdecl VirtualdubFilterModuleInit2(FilterModule *fm, const FilterFunctions *ff, int& vdfd_ver, int& vdfd_compat)
- {
- fd_vobsub = ff->addFilter(fm, &filterDef_vobsub, sizeof(FilterDefinition));
- if (!fd_vobsub) {
- return 1;
- }
- fd_textsub = ff->addFilter(fm, &filterDef_textsub, sizeof(FilterDefinition));
- if (!fd_textsub) {
- return 1;
- }
-
- vdfd_ver = VIRTUALDUB_FILTERDEF_VERSION;
- vdfd_compat = VIRTUALDUB_FILTERDEF_COMPATIBLE;
-
- return 0;
- }
-
- extern "C" __declspec(dllexport) void __cdecl VirtualdubFilterModuleDeinit(FilterModule *fm, const FilterFunctions *ff)
- {
- ff->removeFilter(fd_textsub);
- ff->removeFilter(fd_vobsub);
- }
- }/**/
+ class CVirtualDubFilter : virtual public CFilter
+ {
+ public:
+ CVirtualDubFilter() {}
+ virtual ~CVirtualDubFilter() {}
+
+ virtual int RunProc(const FilterActivation* fa, const FilterFunctions* ff) {
+ SubPicDesc dst;
+ dst.type = MSP_RGB32;
+ dst.w = fa->src.w;
+ dst.h = fa->src.h;
+ dst.bpp = 32;
+ dst.pitch = fa->src.pitch;
+ dst.bits = (LPVOID)fa->src.data;
+
+ Render(dst, 10000i64 * fa->pfsi->lSourceFrameMS, (float)1000 / fa->pfsi->lMicrosecsPerFrame);
+
+ return 0;
+ }
+
+ virtual long ParamProc(FilterActivation* fa, const FilterFunctions* ff) {
+ fa->dst.offset = fa->src.offset;
+ fa->dst.modulo = fa->src.modulo;
+ fa->dst.pitch = fa->src.pitch;
+
+ return 0;
+ }
+
+ virtual int ConfigProc(FilterActivation* fa, const FilterFunctions* ff, HWND hwnd) = 0;
+ virtual void StringProc(const FilterActivation* fa, const FilterFunctions* ff, char* str) = 0;
+ virtual bool FssProc(FilterActivation* fa, const FilterFunctions* ff, char* buf, int buflen) = 0;
+ };
+
+ class CVobSubVirtualDubFilter : public CVobSubFilter, public CVirtualDubFilter
+ {
+ public:
+ CVobSubVirtualDubFilter(CString fn = _T(""))
+ : CVobSubFilter(fn) {}
+
+ int ConfigProc(FilterActivation* fa, const FilterFunctions* ff, HWND hwnd) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ CFileDialog fd(TRUE, NULL, GetFileName(), OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY,
+ _T("VobSub files (*.idx;*.sub)|*.idx;*.sub||"), CWnd::FromHandle(hwnd), 0);
+
+ if (fd.DoModal() != IDOK) {
+ return 1;
+ }
+
+ return Open(fd.GetPathName()) ? 0 : 1;
+ }
+
+ void StringProc(const FilterActivation* fa, const FilterFunctions* ff, char* str) {
+ sprintf(str, " (%s)", !GetFileName().IsEmpty() ? CStringA(GetFileName()) : " (empty)");
+ }
+
+ bool FssProc(FilterActivation* fa, const FilterFunctions* ff, char* buf, int buflen) {
+ CStringA fn(GetFileName());
+ fn.Replace("\\", "\\\\");
+ _snprintf_s(buf, buflen, buflen, "Config(\"%s\")", fn);
+ return true;
+ }
+ };
+
+ class CTextSubVirtualDubFilter : public CTextSubFilter, public CVirtualDubFilter
+ {
+ public:
+ CTextSubVirtualDubFilter(CString fn = _T(""), int CharSet = DEFAULT_CHARSET)
+ : CTextSubFilter(fn, CharSet) {}
+
+ int ConfigProc(FilterActivation* fa, const FilterFunctions* ff, HWND hwnd) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ const TCHAR formats[] = _T("TextSub files (*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt)|*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt||");
+ CFileDialog fd(TRUE, NULL, GetFileName(), OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK,
+ formats, CWnd::FromHandle(hwnd), sizeof(OPENFILENAME));
+ UINT_PTR CALLBACK OpenHookProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam);
+
+ fd.m_pOFN->hInstance = AfxGetResourceHandle();
+ fd.m_pOFN->lpTemplateName = MAKEINTRESOURCE(IDD_TEXTSUBOPENTEMPLATE);
+ fd.m_pOFN->lpfnHook = (LPOFNHOOKPROC)OpenHookProc;
+ fd.m_pOFN->lCustData = (LPARAM)DEFAULT_CHARSET;
+
+ if (fd.DoModal() != IDOK) {
+ return 1;
+ }
+
+ return Open(fd.GetPathName(), fd.m_pOFN->lCustData) ? 0 : 1;
+ }
+
+ void StringProc(const FilterActivation* fa, const FilterFunctions* ff, char* str) {
+ if (!GetFileName().IsEmpty()) {
+ sprintf(str, " (%s, %d)", CStringA(GetFileName()), GetCharSet());
+ } else {
+ sprintf(str, " (empty)");
+ }
+ }
+
+ bool FssProc(FilterActivation* fa, const FilterFunctions* ff, char* buf, int buflen) {
+ CStringA fn(GetFileName());
+ fn.Replace("\\", "\\\\");
+ _snprintf_s(buf, buflen, buflen, "Config(\"%s\", %d)", fn, GetCharSet());
+ return true;
+ }
+ };
+
+ int vobsubInitProc(FilterActivation* fa, const FilterFunctions* ff)
+ {
+ *(CVirtualDubFilter**)fa->filter_data = DNew CVobSubVirtualDubFilter();
+ return !(*(CVirtualDubFilter**)fa->filter_data);
+ }
+
+ int textsubInitProc(FilterActivation* fa, const FilterFunctions* ff)
+ {
+ *(CVirtualDubFilter**)fa->filter_data = DNew CTextSubVirtualDubFilter();
+ return !(*(CVirtualDubFilter**)fa->filter_data);
+ }
+
+ void baseDeinitProc(FilterActivation* fa, const FilterFunctions* ff)
+ {
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ if (f) {
+ delete f, f = NULL;
+ }
+ }
+
+ int baseRunProc(const FilterActivation* fa, const FilterFunctions* ff)
+ {
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ return f ? f->RunProc(fa, ff) : 1;
+ }
+
+ long baseParamProc(FilterActivation* fa, const FilterFunctions* ff)
+ {
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ return f ? f->ParamProc(fa, ff) : 1;
+ }
+
+ int baseConfigProc(FilterActivation* fa, const FilterFunctions* ff, HWND hwnd)
+ {
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ return f ? f->ConfigProc(fa, ff, hwnd) : 1;
+ }
+
+ void baseStringProc(const FilterActivation* fa, const FilterFunctions* ff, char* str)
+ {
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ if (f) {
+ f->StringProc(fa, ff, str);
+ }
+ }
+
+ bool baseFssProc(FilterActivation* fa, const FilterFunctions* ff, char* buf, int buflen)
+ {
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ return f ? f->FssProc(fa, ff, buf, buflen) : false;
+ }
+
+ void vobsubScriptConfig(IScriptInterpreter* isi, void* lpVoid, CScriptValue* argv, int argc)
+ {
+ FilterActivation* fa = (FilterActivation*)lpVoid;
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ if (f) {
+ delete f;
+ }
+ f = DNew CVobSubVirtualDubFilter(CString(*argv[0].asString()));
+ *(CVirtualDubFilter**)fa->filter_data = f;
+ }
+
+ void textsubScriptConfig(IScriptInterpreter* isi, void* lpVoid, CScriptValue* argv, int argc)
+ {
+ FilterActivation* fa = (FilterActivation*)lpVoid;
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ if (f) {
+ delete f;
+ }
+ f = DNew CTextSubVirtualDubFilter(CString(*argv[0].asString()), argv[1].asInt());
+ *(CVirtualDubFilter**)fa->filter_data = f;
+ }
+
+ ScriptFunctionDef vobsub_func_defs[] = {
+ { (ScriptFunctionPtr)vobsubScriptConfig, "Config", "0s" },
+ { NULL },
+ };
+
+ CScriptObject vobsub_obj = {
+ NULL, vobsub_func_defs
+ };
+
+ struct FilterDefinition filterDef_vobsub = {
+ NULL, NULL, NULL, // next, prev, module
+ "VobSub", // name
+ "Adds subtitles from a vob sequence.", // desc
+ "Gabest", // maker
+ NULL, // private_data
+ sizeof(CVirtualDubFilter**), // inst_data_size
+ vobsubInitProc, // initProc
+ baseDeinitProc, // deinitProc
+ baseRunProc, // runProc
+ baseParamProc, // paramProc
+ baseConfigProc, // configProc
+ baseStringProc, // stringProc
+ NULL, // startProc
+ NULL, // endProc
+ &vobsub_obj, // script_obj
+ baseFssProc, // fssProc
+ };
+
+ ScriptFunctionDef textsub_func_defs[] = {
+ { (ScriptFunctionPtr)textsubScriptConfig, "Config", "0si" },
+ { NULL },
+ };
+
+ CScriptObject textsub_obj = {
+ NULL, textsub_func_defs
+ };
+
+ struct FilterDefinition filterDef_textsub = {
+ NULL, NULL, NULL, // next, prev, module
+ "TextSub", // name
+ "Adds subtitles from srt, sub, psb, smi, ssa, ass file formats.", // desc
+ "Gabest", // maker
+ NULL, // private_data
+ sizeof(CVirtualDubFilter**), // inst_data_size
+ textsubInitProc, // initProc
+ baseDeinitProc, // deinitProc
+ baseRunProc, // runProc
+ baseParamProc, // paramProc
+ baseConfigProc, // configProc
+ baseStringProc, // stringProc
+ NULL, // startProc
+ NULL, // endProc
+ &textsub_obj, // script_obj
+ baseFssProc, // fssProc
+ };
+
+ static FilterDefinition* fd_vobsub;
+ static FilterDefinition* fd_textsub;
+
+ extern "C" __declspec(dllexport) int __cdecl VirtualdubFilterModuleInit2(FilterModule* fm, const FilterFunctions* ff, int& vdfd_ver, int& vdfd_compat)
+ {
+ fd_vobsub = ff->addFilter(fm, &filterDef_vobsub, sizeof(FilterDefinition));
+ if (!fd_vobsub) {
+ return 1;
+ }
+ fd_textsub = ff->addFilter(fm, &filterDef_textsub, sizeof(FilterDefinition));
+ if (!fd_textsub) {
+ return 1;
+ }
+
+ vdfd_ver = VIRTUALDUB_FILTERDEF_VERSION;
+ vdfd_compat = VIRTUALDUB_FILTERDEF_COMPATIBLE;
+
+ return 0;
+ }
+
+ extern "C" __declspec(dllexport) void __cdecl VirtualdubFilterModuleDeinit(FilterModule* fm, const FilterFunctions* ff)
+ {
+ ff->removeFilter(fd_textsub);
+ ff->removeFilter(fd_vobsub);
+ }
+ }/**/
#else
- //
- // VirtualDub new plugin interface sdk 1.1
- //
- namespace VirtualDubNew
- {
+ //
+ // VirtualDub new plugin interface sdk 1.1
+ //
+ namespace VirtualDubNew
+ {
#include <vd2/plugin/vdplugin.h>
#include <vd2/plugin/vdvideofilt.h>
- class CVirtualDubFilter : virtual public CFilter
- {
- public:
- CVirtualDubFilter() {}
- virtual ~CVirtualDubFilter() {}
-
- virtual int RunProc(const VDXFilterActivation* fa, const VDXFilterFunctions* ff) {
- SubPicDesc dst;
- dst.type = MSP_RGB32;
- dst.w = fa->src.w;
- dst.h = fa->src.h;
- dst.bpp = 32;
- dst.pitch = fa->src.pitch;
- dst.bits = (LPVOID)fa->src.data;
-
- Render(dst, 10000i64*fa->pfsi->lSourceFrameMS, (float)1000 / fa->pfsi->lMicrosecsPerFrame);
-
- return 0;
- }
-
- virtual long ParamProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff) {
- fa->dst.offset = fa->src.offset;
- fa->dst.modulo = fa->src.modulo;
- fa->dst.pitch = fa->src.pitch;
-
- return 0;
- }
-
- virtual int ConfigProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, VDXHWND hwnd) = 0;
- virtual void StringProc(const VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* str) = 0;
- virtual bool FssProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* buf, int buflen) = 0;
- };
-
- class CVobSubVirtualDubFilter : public CVobSubFilter, public CVirtualDubFilter
- {
- public:
- CVobSubVirtualDubFilter(CString fn = _T(""))
- : CVobSubFilter(fn) {}
-
- int ConfigProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, VDXHWND hwnd) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- CFileDialog fd(TRUE, NULL, GetFileName(), OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY,
- _T("VobSub files (*.idx;*.sub)|*.idx;*.sub||"), CWnd::FromHandle((HWND)hwnd), 0);
-
- if (fd.DoModal() != IDOK) {
- return 1;
- }
-
- return Open(fd.GetPathName()) ? 0 : 1;
- }
-
- void StringProc(const VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* str) {
- sprintf(str, " (%s)", !GetFileName().IsEmpty() ? CStringA(GetFileName()) : " (empty)");
- }
-
- bool FssProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* buf, int buflen) {
- CStringA fn(GetFileName());
- fn.Replace("\\", "\\\\");
- _snprintf_s(buf, buflen, buflen, "Config(\"%s\")", fn);
- return true;
- }
- };
-
- class CTextSubVirtualDubFilter : public CTextSubFilter, public CVirtualDubFilter
- {
- public:
- CTextSubVirtualDubFilter(CString fn = _T(""), int CharSet = DEFAULT_CHARSET)
- : CTextSubFilter(fn, CharSet) {}
-
- int ConfigProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, VDXHWND hwnd) {
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
-
- /* off encoding changing */
+ class CVirtualDubFilter : virtual public CFilter
+ {
+ public:
+ CVirtualDubFilter() {}
+ virtual ~CVirtualDubFilter() {}
+
+ virtual int RunProc(const VDXFilterActivation* fa, const VDXFilterFunctions* ff) {
+ SubPicDesc dst;
+ dst.type = MSP_RGB32;
+ dst.w = fa->src.w;
+ dst.h = fa->src.h;
+ dst.bpp = 32;
+ dst.pitch = fa->src.pitch;
+ dst.bits = (LPVOID)fa->src.data;
+
+ Render(dst, 10000i64 * fa->pfsi->lSourceFrameMS, (float)1000 / fa->pfsi->lMicrosecsPerFrame);
+
+ return 0;
+ }
+
+ virtual long ParamProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff) {
+ fa->dst.offset = fa->src.offset;
+ fa->dst.modulo = fa->src.modulo;
+ fa->dst.pitch = fa->src.pitch;
+
+ return 0;
+ }
+
+ virtual int ConfigProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, VDXHWND hwnd) = 0;
+ virtual void StringProc(const VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* str) = 0;
+ virtual bool FssProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* buf, int buflen) = 0;
+ };
+
+ class CVobSubVirtualDubFilter : public CVobSubFilter, public CVirtualDubFilter
+ {
+ public:
+ CVobSubVirtualDubFilter(CString fn = _T(""))
+ : CVobSubFilter(fn) {}
+
+ int ConfigProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, VDXHWND hwnd) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ CFileDialog fd(TRUE, NULL, GetFileName(), OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY,
+ _T("VobSub files (*.idx;*.sub)|*.idx;*.sub||"), CWnd::FromHandle((HWND)hwnd), 0);
+
+ if (fd.DoModal() != IDOK) {
+ return 1;
+ }
+
+ return Open(fd.GetPathName()) ? 0 : 1;
+ }
+
+ void StringProc(const VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* str) {
+ sprintf(str, " (%s)", !GetFileName().IsEmpty() ? CStringA(GetFileName()) : " (empty)");
+ }
+
+ bool FssProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* buf, int buflen) {
+ CStringA fn(GetFileName());
+ fn.Replace("\\", "\\\\");
+ _snprintf_s(buf, buflen, buflen, "Config(\"%s\")", fn);
+ return true;
+ }
+ };
+
+ class CTextSubVirtualDubFilter : public CTextSubFilter, public CVirtualDubFilter
+ {
+ public:
+ CTextSubVirtualDubFilter(CString fn = _T(""), int CharSet = DEFAULT_CHARSET)
+ : CTextSubFilter(fn, CharSet) {}
+
+ int ConfigProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, VDXHWND hwnd) {
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
+ /* off encoding changing */
#ifndef _DEBUG
- const TCHAR formats[] = _T("TextSub files (*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt)|*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt||");
- CFileDialog fd(TRUE, NULL, GetFileName(), OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_ENABLETEMPLATE|OFN_ENABLEHOOK,
- formats, CWnd::FromHandle((HWND)hwnd), sizeof(OPENFILENAME));
- UINT_PTR CALLBACK OpenHookProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam);
-
- fd.m_pOFN->hInstance = AfxGetResourceHandle();
- fd.m_pOFN->lpTemplateName = MAKEINTRESOURCE(IDD_TEXTSUBOPENTEMPLATE);
- fd.m_pOFN->lpfnHook = (LPOFNHOOKPROC)OpenHookProc;
- fd.m_pOFN->lCustData = (LPARAM)DEFAULT_CHARSET;
+ const TCHAR formats[] = _T("TextSub files (*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt)|*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt||");
+ CFileDialog fd(TRUE, NULL, GetFileName(), OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK,
+ formats, CWnd::FromHandle((HWND)hwnd), sizeof(OPENFILENAME));
+ UINT_PTR CALLBACK OpenHookProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam);
+
+ fd.m_pOFN->hInstance = AfxGetResourceHandle();
+ fd.m_pOFN->lpTemplateName = MAKEINTRESOURCE(IDD_TEXTSUBOPENTEMPLATE);
+ fd.m_pOFN->lpfnHook = (LPOFNHOOKPROC)OpenHookProc;
+ fd.m_pOFN->lCustData = (LPARAM)DEFAULT_CHARSET;
#else
- const TCHAR formats[] = _T("TextSub files (*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt)|*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt||");
- CFileDialog fd(TRUE, NULL, GetFileName(), OFN_ENABLESIZING|OFN_HIDEREADONLY,
- formats, CWnd::FromHandle((HWND)hwnd), sizeof(OPENFILENAME));
+ const TCHAR formats[] = _T("TextSub files (*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt)|*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt||");
+ CFileDialog fd(TRUE, NULL, GetFileName(), OFN_ENABLESIZING | OFN_HIDEREADONLY,
+ formats, CWnd::FromHandle((HWND)hwnd), sizeof(OPENFILENAME));
#endif
- if (fd.DoModal() != IDOK) {
- return 1;
- }
-
- return Open(fd.GetPathName(), fd.m_pOFN->lCustData) ? 0 : 1;
- }
-
- void StringProc(const VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* str) {
- if (!GetFileName().IsEmpty()) {
- sprintf(str, " (%s, %d)", CStringA(GetFileName()), GetCharSet());
- } else {
- sprintf(str, " (empty)");
- }
- }
-
- bool FssProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* buf, int buflen) {
- CStringA fn(GetFileName());
- fn.Replace("\\", "\\\\");
- _snprintf_s(buf, buflen, buflen, "Config(\"%s\", %d)", fn, GetCharSet());
- return true;
- }
- };
-
- int vobsubInitProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff)
- {
- return ((*(CVirtualDubFilter**)fa->filter_data = DNew CVobSubVirtualDubFilter()) == NULL);
- }
-
- int textsubInitProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff)
- {
- return ((*(CVirtualDubFilter**)fa->filter_data = DNew CTextSubVirtualDubFilter()) == NULL);
- }
-
- void baseDeinitProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff)
- {
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- if (f) {
- delete f, f = NULL;
- }
- }
-
- int baseRunProc(const VDXFilterActivation* fa, const VDXFilterFunctions* ff)
- {
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- return f ? f->RunProc(fa, ff) : 1;
- }
-
- long baseParamProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff)
- {
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- return f ? f->ParamProc(fa, ff) : 1;
- }
-
- int baseConfigProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, VDXHWND hwnd)
- {
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- return f ? f->ConfigProc(fa, ff, hwnd) : 1;
- }
-
- void baseStringProc(const VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* str)
- {
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- if (f) {
- f->StringProc(fa, ff, str);
- }
- }
-
- bool baseFssProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* buf, int buflen)
- {
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- return f ? f->FssProc(fa, ff, buf, buflen) : false;
- }
-
- void vobsubScriptConfig(IVDXScriptInterpreter* isi, void* lpVoid, VDXScriptValue* argv, int argc)
- {
- VDXFilterActivation* fa = (VDXFilterActivation*)lpVoid;
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- if (f) {
- delete f;
- }
- f = DNew CVobSubVirtualDubFilter(CString(*argv[0].asString()));
- *(CVirtualDubFilter**)fa->filter_data = f;
- }
-
- void textsubScriptConfig(IVDXScriptInterpreter* isi, void* lpVoid, VDXScriptValue* argv, int argc)
- {
- VDXFilterActivation* fa = (VDXFilterActivation*)lpVoid;
- CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
- if (f) {
- delete f;
- }
- f = DNew CTextSubVirtualDubFilter(CString(*argv[0].asString()), argv[1].asInt());
- *(CVirtualDubFilter**)fa->filter_data = f;
- }
-
- VDXScriptFunctionDef vobsub_func_defs[]= {
- { (VDXScriptFunctionPtr)vobsubScriptConfig, "Config", "0s" },
- { NULL },
- };
-
- VDXScriptObject vobsub_obj= {
- NULL, vobsub_func_defs
- };
-
- struct VDXFilterDefinition filterDef_vobsub = {
- NULL, NULL, NULL, // next, prev, module
- "VobSub", // name
- "Adds subtitles from a vob sequence.", // desc
- "Gabest", // maker
- NULL, // private_data
- sizeof(CVirtualDubFilter**), // inst_data_size
- vobsubInitProc, // initProc
- baseDeinitProc, // deinitProc
- baseRunProc, // runProc
- baseParamProc, // paramProc
- baseConfigProc, // configProc
- baseStringProc, // stringProc
- NULL, // startProc
- NULL, // endProc
- &vobsub_obj, // script_obj
- baseFssProc, // fssProc
- };
-
- VDXScriptFunctionDef textsub_func_defs[]= {
- { (VDXScriptFunctionPtr)textsubScriptConfig, "Config", "0si" },
- { NULL },
- };
-
- VDXScriptObject textsub_obj= {
- NULL, textsub_func_defs
- };
-
- struct VDXFilterDefinition filterDef_textsub = {
- NULL, NULL, NULL, // next, prev, module
- "TextSub", // name
- "Adds subtitles from srt, sub, psb, smi, ssa, ass file formats.", // desc
- "Gabest", // maker
- NULL, // private_data
- sizeof(CVirtualDubFilter**), // inst_data_size
- textsubInitProc, // initProc
- baseDeinitProc, // deinitProc
- baseRunProc, // runProc
- baseParamProc, // paramProc
- baseConfigProc, // configProc
- baseStringProc, // stringProc
- NULL, // startProc
- NULL, // endProc
- &textsub_obj, // script_obj
- baseFssProc, // fssProc
- };
-
- static VDXFilterDefinition* fd_vobsub;
- static VDXFilterDefinition* fd_textsub;
-
- extern "C" __declspec(dllexport) int __cdecl VirtualdubFilterModuleInit2(VDXFilterModule *fm, const VDXFilterFunctions *ff, int& vdfd_ver, int& vdfd_compat)
- {
- if (((fd_vobsub = ff->addFilter(fm, &filterDef_vobsub, sizeof(VDXFilterDefinition))) == NULL)
- || ((fd_textsub = ff->addFilter(fm, &filterDef_textsub, sizeof(VDXFilterDefinition))) == NULL)) {
- return 1;
- }
-
- vdfd_ver = VIRTUALDUB_FILTERDEF_VERSION;
- vdfd_compat = VIRTUALDUB_FILTERDEF_COMPATIBLE;
-
- return 0;
- }
-
- extern "C" __declspec(dllexport) void __cdecl VirtualdubFilterModuleDeinit(VDXFilterModule *fm, const VDXFilterFunctions *ff)
- {
- ff->removeFilter(fd_textsub);
- ff->removeFilter(fd_vobsub);
- }
- }
+ if (fd.DoModal() != IDOK) {
+ return 1;
+ }
+
+ return Open(fd.GetPathName(), fd.m_pOFN->lCustData) ? 0 : 1;
+ }
+
+ void StringProc(const VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* str) {
+ if (!GetFileName().IsEmpty()) {
+ sprintf(str, " (%s, %d)", CStringA(GetFileName()), GetCharSet());
+ } else {
+ sprintf(str, " (empty)");
+ }
+ }
+
+ bool FssProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* buf, int buflen) {
+ CStringA fn(GetFileName());
+ fn.Replace("\\", "\\\\");
+ _snprintf_s(buf, buflen, buflen, "Config(\"%s\", %d)", fn, GetCharSet());
+ return true;
+ }
+ };
+
+ int vobsubInitProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff)
+ {
+ return ((*(CVirtualDubFilter**)fa->filter_data = DNew CVobSubVirtualDubFilter()) == NULL);
+ }
+
+ int textsubInitProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff)
+ {
+ return ((*(CVirtualDubFilter**)fa->filter_data = DNew CTextSubVirtualDubFilter()) == NULL);
+ }
+
+ void baseDeinitProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff)
+ {
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ if (f) {
+ delete f, f = NULL;
+ }
+ }
+
+ int baseRunProc(const VDXFilterActivation* fa, const VDXFilterFunctions* ff)
+ {
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ return f ? f->RunProc(fa, ff) : 1;
+ }
+
+ long baseParamProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff)
+ {
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ return f ? f->ParamProc(fa, ff) : 1;
+ }
+
+ int baseConfigProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, VDXHWND hwnd)
+ {
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ return f ? f->ConfigProc(fa, ff, hwnd) : 1;
+ }
+
+ void baseStringProc(const VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* str)
+ {
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ if (f) {
+ f->StringProc(fa, ff, str);
+ }
+ }
+
+ bool baseFssProc(VDXFilterActivation* fa, const VDXFilterFunctions* ff, char* buf, int buflen)
+ {
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ return f ? f->FssProc(fa, ff, buf, buflen) : false;
+ }
+
+ void vobsubScriptConfig(IVDXScriptInterpreter* isi, void* lpVoid, VDXScriptValue* argv, int argc)
+ {
+ VDXFilterActivation* fa = (VDXFilterActivation*)lpVoid;
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ if (f) {
+ delete f;
+ }
+ f = DNew CVobSubVirtualDubFilter(CString(*argv[0].asString()));
+ *(CVirtualDubFilter**)fa->filter_data = f;
+ }
+
+ void textsubScriptConfig(IVDXScriptInterpreter* isi, void* lpVoid, VDXScriptValue* argv, int argc)
+ {
+ VDXFilterActivation* fa = (VDXFilterActivation*)lpVoid;
+ CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
+ if (f) {
+ delete f;
+ }
+ f = DNew CTextSubVirtualDubFilter(CString(*argv[0].asString()), argv[1].asInt());
+ *(CVirtualDubFilter**)fa->filter_data = f;
+ }
+
+ VDXScriptFunctionDef vobsub_func_defs[] = {
+ { (VDXScriptFunctionPtr)vobsubScriptConfig, "Config", "0s" },
+ { NULL },
+ };
+
+ VDXScriptObject vobsub_obj = {
+ NULL, vobsub_func_defs
+ };
+
+ struct VDXFilterDefinition filterDef_vobsub = {
+ NULL, NULL, NULL, // next, prev, module
+ "VobSub", // name
+ "Adds subtitles from a vob sequence.", // desc
+ "Gabest", // maker
+ NULL, // private_data
+ sizeof(CVirtualDubFilter**), // inst_data_size
+ vobsubInitProc, // initProc
+ baseDeinitProc, // deinitProc
+ baseRunProc, // runProc
+ baseParamProc, // paramProc
+ baseConfigProc, // configProc
+ baseStringProc, // stringProc
+ NULL, // startProc
+ NULL, // endProc
+ &vobsub_obj, // script_obj
+ baseFssProc, // fssProc
+ };
+
+ VDXScriptFunctionDef textsub_func_defs[] = {
+ { (VDXScriptFunctionPtr)textsubScriptConfig, "Config", "0si" },
+ { NULL },
+ };
+
+ VDXScriptObject textsub_obj = {
+ NULL, textsub_func_defs
+ };
+
+ struct VDXFilterDefinition filterDef_textsub = {
+ NULL, NULL, NULL, // next, prev, module
+ "TextSub", // name
+ "Adds subtitles from srt, sub, psb, smi, ssa, ass file formats.", // desc
+ "Gabest", // maker
+ NULL, // private_data
+ sizeof(CVirtualDubFilter**), // inst_data_size
+ textsubInitProc, // initProc
+ baseDeinitProc, // deinitProc
+ baseRunProc, // runProc
+ baseParamProc, // paramProc
+ baseConfigProc, // configProc
+ baseStringProc, // stringProc
+ NULL, // startProc
+ NULL, // endProc
+ &textsub_obj, // script_obj
+ baseFssProc, // fssProc
+ };
+
+ static VDXFilterDefinition* fd_vobsub;
+ static VDXFilterDefinition* fd_textsub;
+
+ extern "C" __declspec(dllexport) int __cdecl VirtualdubFilterModuleInit2(VDXFilterModule* fm, const VDXFilterFunctions* ff, int& vdfd_ver, int& vdfd_compat)
+ {
+ if (((fd_vobsub = ff->addFilter(fm, &filterDef_vobsub, sizeof(VDXFilterDefinition))) == NULL)
+ || ((fd_textsub = ff->addFilter(fm, &filterDef_textsub, sizeof(VDXFilterDefinition))) == NULL)) {
+ return 1;
+ }
+
+ vdfd_ver = VIRTUALDUB_FILTERDEF_VERSION;
+ vdfd_compat = VIRTUALDUB_FILTERDEF_COMPATIBLE;
+
+ return 0;
+ }
+
+ extern "C" __declspec(dllexport) void __cdecl VirtualdubFilterModuleDeinit(VDXFilterModule* fm, const VDXFilterFunctions* ff)
+ {
+ ff->removeFilter(fd_textsub);
+ ff->removeFilter(fd_vobsub);
+ }
+ }
#endif
- //
- // Avisynth interface
- //
+ //
+ // Avisynth interface
+ //
- namespace AviSynth1
- {
+ namespace AviSynth1
+ {
#include <avisynth/avisynth1.h>
- class CAvisynthFilter : public GenericVideoFilter, virtual public CFilter
- {
- public:
- CAvisynthFilter(PClip c, IScriptEnvironment* env) : GenericVideoFilter(c) {}
-
- PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) {
- PVideoFrame frame = child->GetFrame(n, env);
-
- env->MakeWritable(&frame);
-
- SubPicDesc dst;
- dst.w = vi.width;
- dst.h = vi.height;
- dst.pitch = frame->GetPitch();
- dst.bits = (void**)frame->GetWritePtr();
- dst.bpp = vi.BitsPerPixel();
- dst.type =
- vi.IsRGB32() ? ( env->GetVar("RGBA").AsBool() ? MSP_RGBA :MSP_RGB32) :
- vi.IsRGB24() ? MSP_RGB24 :
- vi.IsYUY2() ? MSP_YUY2 :
- -1;
-
- float fps = m_fps > 0 ? m_fps : (float)vi.fps_numerator / vi.fps_denominator;
-
- Render(dst, (REFERENCE_TIME)(10000000i64 * n / fps), fps);
-
- return frame;
- }
- };
-
- class CVobSubAvisynthFilter : public CVobSubFilter, public CAvisynthFilter
- {
- public:
- CVobSubAvisynthFilter(PClip c, const char* fn, IScriptEnvironment* env)
- : CVobSubFilter(CString(fn))
- , CAvisynthFilter(c, env) {
- if (!m_pSubPicProvider) {
- env->ThrowError("VobSub: Can't open \"%s\"", fn);
- }
- }
- };
-
- AVSValue __cdecl VobSubCreateS(AVSValue args, void* user_data, IScriptEnvironment* env)
- {
- return (DNew CVobSubAvisynthFilter(args[0].AsClip(), args[1].AsString(), env));
- }
-
- class CTextSubAvisynthFilter : public CTextSubFilter, public CAvisynthFilter
- {
- public:
- CTextSubAvisynthFilter(PClip c, IScriptEnvironment* env, const char* fn, int CharSet = DEFAULT_CHARSET, float fps = -1)
- : CTextSubFilter(CString(fn), CharSet, fps)
- , CAvisynthFilter(c, env) {
- if (!m_pSubPicProvider)
- env->ThrowError("TextSub: Can't open \"%s\"", fn);
- }
- };
-
- AVSValue __cdecl TextSubCreateS(AVSValue args, void* user_data, IScriptEnvironment* env)
- {
- return (DNew CTextSubAvisynthFilter(args[0].AsClip(), env, args[1].AsString()));
- }
-
- AVSValue __cdecl TextSubCreateSI(AVSValue args, void* user_data, IScriptEnvironment* env)
- {
- return (DNew CTextSubAvisynthFilter(args[0].AsClip(), env, args[1].AsString(), args[2].AsInt()));
- }
-
- AVSValue __cdecl TextSubCreateSIF(AVSValue args, void* user_data, IScriptEnvironment* env)
- {
- return (DNew CTextSubAvisynthFilter(args[0].AsClip(), env, args[1].AsString(), args[2].AsInt(), (float)args[3].AsFloat()));
- }
-
- AVSValue __cdecl MaskSubCreateSIIFI(AVSValue args, void* user_data, IScriptEnvironment* env)
- {
- AVSValue rgb32("RGB32");
- AVSValue tab[5] = {
- args[1],
- args[2],
- args[3],
- args[4],
- rgb32
- };
- AVSValue value(tab,5);
- const char * nom[5]= {
- "width",
- "height",
- "fps",
- "length",
- "pixel_type"
- };
- AVSValue clip(env->Invoke("Blackness",value,nom));
- env->SetVar(env->SaveString("RGBA"),true);
- return (DNew CTextSubAvisynthFilter(clip.AsClip(), env, args[0].AsString()));
- }
-
- extern "C" __declspec(dllexport) const char* __stdcall AvisynthPluginInit(IScriptEnvironment* env)
- {
- env->AddFunction("VobSub", "cs", VobSubCreateS, 0);
- env->AddFunction("TextSub", "cs", TextSubCreateS, 0);
- env->AddFunction("TextSub", "csi", TextSubCreateSI, 0);
- env->AddFunction("TextSub", "csif", TextSubCreateSIF, 0);
- env->AddFunction("MaskSub", "siifi", MaskSubCreateSIIFI, 0);
- env->SetVar(env->SaveString("RGBA"),false);
- return NULL;
- }
- }
-
- namespace AviSynth25
- {
+ class CAvisynthFilter : public GenericVideoFilter, virtual public CFilter
+ {
+ public:
+ CAvisynthFilter(PClip c, IScriptEnvironment* env) : GenericVideoFilter(c) {}
+
+ PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) {
+ PVideoFrame frame = child->GetFrame(n, env);
+
+ env->MakeWritable(&frame);
+
+ SubPicDesc dst;
+ dst.w = vi.width;
+ dst.h = vi.height;
+ dst.pitch = frame->GetPitch();
+ dst.bits = (void**)frame->GetWritePtr();
+ dst.bpp = vi.BitsPerPixel();
+ dst.type =
+ vi.IsRGB32() ? (env->GetVar("RGBA").AsBool() ? MSP_RGBA : MSP_RGB32) :
+ vi.IsRGB24() ? MSP_RGB24 :
+ vi.IsYUY2() ? MSP_YUY2 :
+ -1;
+
+ float fps = m_fps > 0 ? m_fps : (float)vi.fps_numerator / vi.fps_denominator;
+
+ Render(dst, (REFERENCE_TIME)(10000000i64 * n / fps), fps);
+
+ return frame;
+ }
+ };
+
+ class CVobSubAvisynthFilter : public CVobSubFilter, public CAvisynthFilter
+ {
+ public:
+ CVobSubAvisynthFilter(PClip c, const char* fn, IScriptEnvironment* env)
+ : CVobSubFilter(CString(fn))
+ , CAvisynthFilter(c, env) {
+ if (!m_pSubPicProvider) {
+ env->ThrowError("VobSub: Can't open \"%s\"", fn);
+ }
+ }
+ };
+
+ AVSValue __cdecl VobSubCreateS(AVSValue args, void* user_data, IScriptEnvironment* env)
+ {
+ return (DNew CVobSubAvisynthFilter(args[0].AsClip(), args[1].AsString(), env));
+ }
+
+ class CTextSubAvisynthFilter : public CTextSubFilter, public CAvisynthFilter
+ {
+ public:
+ CTextSubAvisynthFilter(PClip c, IScriptEnvironment* env, const char* fn, int CharSet = DEFAULT_CHARSET, float fps = -1)
+ : CTextSubFilter(CString(fn), CharSet, fps)
+ , CAvisynthFilter(c, env) {
+ if (!m_pSubPicProvider) {
+ env->ThrowError("TextSub: Can't open \"%s\"", fn);
+ }
+ }
+ };
+
+ AVSValue __cdecl TextSubCreateS(AVSValue args, void* user_data, IScriptEnvironment* env)
+ {
+ return (DNew CTextSubAvisynthFilter(args[0].AsClip(), env, args[1].AsString()));
+ }
+
+ AVSValue __cdecl TextSubCreateSI(AVSValue args, void* user_data, IScriptEnvironment* env)
+ {
+ return (DNew CTextSubAvisynthFilter(args[0].AsClip(), env, args[1].AsString(), args[2].AsInt()));
+ }
+
+ AVSValue __cdecl TextSubCreateSIF(AVSValue args, void* user_data, IScriptEnvironment* env)
+ {
+ return (DNew CTextSubAvisynthFilter(args[0].AsClip(), env, args[1].AsString(), args[2].AsInt(), (float)args[3].AsFloat()));
+ }
+
+ AVSValue __cdecl MaskSubCreateSIIFI(AVSValue args, void* user_data, IScriptEnvironment* env)
+ {
+ AVSValue rgb32("RGB32");
+ AVSValue tab[5] = {
+ args[1],
+ args[2],
+ args[3],
+ args[4],
+ rgb32
+ };
+ AVSValue value(tab, 5);
+ const char* nom[5] = {
+ "width",
+ "height",
+ "fps",
+ "length",
+ "pixel_type"
+ };
+ AVSValue clip(env->Invoke("Blackness", value, nom));
+ env->SetVar(env->SaveString("RGBA"), true);
+ return (DNew CTextSubAvisynthFilter(clip.AsClip(), env, args[0].AsString()));
+ }
+
+ extern "C" __declspec(dllexport) const char* __stdcall AvisynthPluginInit(IScriptEnvironment* env)
+ {
+ env->AddFunction("VobSub", "cs", VobSubCreateS, 0);
+ env->AddFunction("TextSub", "cs", TextSubCreateS, 0);
+ env->AddFunction("TextSub", "csi", TextSubCreateSI, 0);
+ env->AddFunction("TextSub", "csif", TextSubCreateSIF, 0);
+ env->AddFunction("MaskSub", "siifi", MaskSubCreateSIIFI, 0);
+ env->SetVar(env->SaveString("RGBA"), false);
+ return NULL;
+ }
+ }
+
+ namespace AviSynth25
+ {
#include <avisynth/avisynth25.h>
- static bool s_fSwapUV = false;
-
- class CAvisynthFilter : public GenericVideoFilter, virtual public CFilter
- {
- public:
- VFRTranslator *vfr;
-
- CAvisynthFilter(PClip c, IScriptEnvironment* env, VFRTranslator *_vfr=0) : GenericVideoFilter(c), vfr(_vfr) {}
-
- PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) {
- PVideoFrame frame = child->GetFrame(n, env);
-
- env->MakeWritable(&frame);
-
- SubPicDesc dst;
- dst.w = vi.width;
- dst.h = vi.height;
- dst.pitch = frame->GetPitch();
- dst.pitchUV = frame->GetPitch(PLANAR_U);
- dst.bits = (void**)frame->GetWritePtr();
- dst.bitsU = frame->GetWritePtr(PLANAR_U);
- dst.bitsV = frame->GetWritePtr(PLANAR_V);
- dst.bpp = dst.pitch/dst.w*8; //vi.BitsPerPixel();
- dst.type =
- vi.IsRGB32() ?( env->GetVar("RGBA").AsBool() ? MSP_RGBA : MSP_RGB32) :
- vi.IsRGB24() ? MSP_RGB24 :
- vi.IsYUY2() ? MSP_YUY2 :
- /*vi.IsYV12()*/ vi.pixel_type == VideoInfo::CS_YV12 ? (s_fSwapUV?MSP_IYUV:MSP_YV12) :
- /*vi.IsIYUV()*/ vi.pixel_type == VideoInfo::CS_IYUV ? (s_fSwapUV?MSP_YV12:MSP_IYUV) :
- -1;
-
- float fps = m_fps > 0 ? m_fps : (float)vi.fps_numerator / vi.fps_denominator;
-
- REFERENCE_TIME timestamp;
-
- if (!vfr) {
- timestamp = (REFERENCE_TIME)(10000000i64 * n / fps);
- } else {
- timestamp = (REFERENCE_TIME)(10000000 * vfr->TimeStampFromFrameNumber(n));
- }
-
- Render(dst, timestamp, fps);
-
- return frame;
- }
- };
-
- class CVobSubAvisynthFilter : public CVobSubFilter, public CAvisynthFilter
- {
- public:
- CVobSubAvisynthFilter(PClip c, const char* fn, IScriptEnvironment* env)
- : CVobSubFilter(CString(fn))
- , CAvisynthFilter(c, env) {
- if (!m_pSubPicProvider) {
- env->ThrowError("VobSub: Can't open \"%s\"", fn);
- }
- }
- };
-
- AVSValue __cdecl VobSubCreateS(AVSValue args, void* user_data, IScriptEnvironment* env)
- {
- return (DNew CVobSubAvisynthFilter(args[0].AsClip(), args[1].AsString(), env));
- }
-
- class CTextSubAvisynthFilter : public CTextSubFilter, public CAvisynthFilter
- {
- public:
- CTextSubAvisynthFilter(PClip c, IScriptEnvironment* env, const char* fn, int CharSet = DEFAULT_CHARSET, float fps = -1, VFRTranslator *vfr = 0) //vfr patch
- : CTextSubFilter(CString(fn), CharSet, fps)
- , CAvisynthFilter(c, env, vfr) {
- if (!m_pSubPicProvider)
- env->ThrowError("TextSub: Can't open \"%s\"", fn);
- }
- };
-
- AVSValue __cdecl TextSubCreateGeneral(AVSValue args, void* user_data, IScriptEnvironment* env)
- {
- if (!args[1].Defined())
- env->ThrowError("TextSub: You must specify a subtitle file to use");
- VFRTranslator *vfr = 0;
- if (args[4].Defined()) {
- vfr = GetVFRTranslator(args[4].AsString());
- }
-
- return (DNew CTextSubAvisynthFilter(
- args[0].AsClip(),
- env,
- args[1].AsString(),
- args[2].AsInt(DEFAULT_CHARSET),
- (float)args[3].AsFloat(-1),
- vfr));
- }
-
- AVSValue __cdecl TextSubSwapUV(AVSValue args, void* user_data, IScriptEnvironment* env)
- {
- s_fSwapUV = args[0].AsBool(false);
- return AVSValue();
- }
-
- AVSValue __cdecl MaskSubCreate(AVSValue args, void* user_data, IScriptEnvironment* env)/*SIIFI*/
- {
- if (!args[0].Defined())
- env->ThrowError("MaskSub: You must specify a subtitle file to use");
- if (!args[3].Defined() && !args[6].Defined())
- env->ThrowError("MaskSub: You must specify either FPS or a VFR timecodes file");
- VFRTranslator *vfr = 0;
- if (args[6].Defined()) {
- vfr = GetVFRTranslator(args[6].AsString());
- }
-
- AVSValue rgb32("RGB32");
- AVSValue fps(args[3].AsFloat(25));
- AVSValue tab[6] = {
- args[1],
- args[2],
- args[3],
- args[4],
- rgb32
- };
- AVSValue value(tab,5);
- const char * nom[5]= {
- "width",
- "height",
- "fps",
- "length",
- "pixel_type"
- };
- AVSValue clip(env->Invoke("Blackness",value,nom));
- env->SetVar(env->SaveString("RGBA"),true);
- //return (DNew CTextSubAvisynthFilter(clip.AsClip(), env, args[0].AsString()));
- return (DNew CTextSubAvisynthFilter(
- clip.AsClip(),
- env,
- args[0].AsString(),
- args[5].AsInt(DEFAULT_CHARSET),
- (float)args[3].AsFloat(-1),
- vfr));
- }
-
- extern "C" __declspec(dllexport) const char* __stdcall AvisynthPluginInit2(IScriptEnvironment* env)
- {
- env->AddFunction("VobSub", "cs", VobSubCreateS, 0);
- env->AddFunction("TextSub", "c[file]s[charset]i[fps]f[vfr]s", TextSubCreateGeneral, 0);
- env->AddFunction("TextSubSwapUV", "b", TextSubSwapUV, 0);
- env->AddFunction("MaskSub", "[file]s[width]i[height]i[fps]f[length]i[charset]i[vfr]s", MaskSubCreate, 0);
- env->SetVar(env->SaveString("RGBA"),false);
- return NULL;
- }
- }
+ static bool s_fSwapUV = false;
+
+ class CAvisynthFilter : public GenericVideoFilter, virtual public CFilter
+ {
+ public:
+ VFRTranslator* vfr;
+
+ CAvisynthFilter(PClip c, IScriptEnvironment* env, VFRTranslator* _vfr = 0) : GenericVideoFilter(c), vfr(_vfr) {}
+
+ PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env) {
+ PVideoFrame frame = child->GetFrame(n, env);
+
+ env->MakeWritable(&frame);
+
+ SubPicDesc dst;
+ dst.w = vi.width;
+ dst.h = vi.height;
+ dst.pitch = frame->GetPitch();
+ dst.pitchUV = frame->GetPitch(PLANAR_U);
+ dst.bits = (void**)frame->GetWritePtr();
+ dst.bitsU = frame->GetWritePtr(PLANAR_U);
+ dst.bitsV = frame->GetWritePtr(PLANAR_V);
+ dst.bpp = dst.pitch / dst.w * 8; //vi.BitsPerPixel();
+ dst.type =
+ vi.IsRGB32() ? (env->GetVar("RGBA").AsBool() ? MSP_RGBA : MSP_RGB32) :
+ vi.IsRGB24() ? MSP_RGB24 :
+ vi.IsYUY2() ? MSP_YUY2 :
+ /*vi.IsYV12()*/ vi.pixel_type == VideoInfo::CS_YV12 ? (s_fSwapUV ? MSP_IYUV : MSP_YV12) :
+ /*vi.IsIYUV()*/ vi.pixel_type == VideoInfo::CS_IYUV ? (s_fSwapUV ? MSP_YV12 : MSP_IYUV) :
+ -1;
+
+ float fps = m_fps > 0 ? m_fps : (float)vi.fps_numerator / vi.fps_denominator;
+
+ REFERENCE_TIME timestamp;
+
+ if (!vfr) {
+ timestamp = (REFERENCE_TIME)(10000000i64 * n / fps);
+ } else {
+ timestamp = (REFERENCE_TIME)(10000000 * vfr->TimeStampFromFrameNumber(n));
+ }
+
+ Render(dst, timestamp, fps);
+
+ return frame;
+ }
+ };
+
+ class CVobSubAvisynthFilter : public CVobSubFilter, public CAvisynthFilter
+ {
+ public:
+ CVobSubAvisynthFilter(PClip c, const char* fn, IScriptEnvironment* env)
+ : CVobSubFilter(CString(fn))
+ , CAvisynthFilter(c, env) {
+ if (!m_pSubPicProvider) {
+ env->ThrowError("VobSub: Can't open \"%s\"", fn);
+ }
+ }
+ };
+
+ AVSValue __cdecl VobSubCreateS(AVSValue args, void* user_data, IScriptEnvironment* env)
+ {
+ return (DNew CVobSubAvisynthFilter(args[0].AsClip(), args[1].AsString(), env));
+ }
+
+ class CTextSubAvisynthFilter : public CTextSubFilter, public CAvisynthFilter
+ {
+ public:
+ CTextSubAvisynthFilter(PClip c, IScriptEnvironment* env, const char* fn, int CharSet = DEFAULT_CHARSET, float fps = -1, VFRTranslator* vfr = 0) //vfr patch
+ : CTextSubFilter(CString(fn), CharSet, fps)
+ , CAvisynthFilter(c, env, vfr) {
+ if (!m_pSubPicProvider) {
+ env->ThrowError("TextSub: Can't open \"%s\"", fn);
+ }
+ }
+ };
+
+ AVSValue __cdecl TextSubCreateGeneral(AVSValue args, void* user_data, IScriptEnvironment* env)
+ {
+ if (!args[1].Defined()) {
+ env->ThrowError("TextSub: You must specify a subtitle file to use");
+ }
+ VFRTranslator* vfr = 0;
+ if (args[4].Defined()) {
+ vfr = GetVFRTranslator(args[4].AsString());
+ }
+
+ return (DNew CTextSubAvisynthFilter(
+ args[0].AsClip(),
+ env,
+ args[1].AsString(),
+ args[2].AsInt(DEFAULT_CHARSET),
+ (float)args[3].AsFloat(-1),
+ vfr));
+ }
+
+ AVSValue __cdecl TextSubSwapUV(AVSValue args, void* user_data, IScriptEnvironment* env)
+ {
+ s_fSwapUV = args[0].AsBool(false);
+ return AVSValue();
+ }
+
+ AVSValue __cdecl MaskSubCreate(AVSValue args, void* user_data, IScriptEnvironment* env)/*SIIFI*/
+ {
+ if (!args[0].Defined()) {
+ env->ThrowError("MaskSub: You must specify a subtitle file to use");
+ }
+ if (!args[3].Defined() && !args[6].Defined()) {
+ env->ThrowError("MaskSub: You must specify either FPS or a VFR timecodes file");
+ }
+ VFRTranslator* vfr = 0;
+ if (args[6].Defined()) {
+ vfr = GetVFRTranslator(args[6].AsString());
+ }
+
+ AVSValue rgb32("RGB32");
+ AVSValue fps(args[3].AsFloat(25));
+ AVSValue tab[6] = {
+ args[1],
+ args[2],
+ args[3],
+ args[4],
+ rgb32
+ };
+ AVSValue value(tab, 5);
+ const char* nom[5] = {
+ "width",
+ "height",
+ "fps",
+ "length",
+ "pixel_type"
+ };
+ AVSValue clip(env->Invoke("Blackness", value, nom));
+ env->SetVar(env->SaveString("RGBA"), true);
+ //return (DNew CTextSubAvisynthFilter(clip.AsClip(), env, args[0].AsString()));
+ return (DNew CTextSubAvisynthFilter(
+ clip.AsClip(),
+ env,
+ args[0].AsString(),
+ args[5].AsInt(DEFAULT_CHARSET),
+ (float)args[3].AsFloat(-1),
+ vfr));
+ }
+
+ extern "C" __declspec(dllexport) const char* __stdcall AvisynthPluginInit2(IScriptEnvironment* env)
+ {
+ env->AddFunction("VobSub", "cs", VobSubCreateS, 0);
+ env->AddFunction("TextSub", "c[file]s[charset]i[fps]f[vfr]s", TextSubCreateGeneral, 0);
+ env->AddFunction("TextSubSwapUV", "b", TextSubSwapUV, 0);
+ env->AddFunction("MaskSub", "[file]s[width]i[height]i[fps]f[length]i[charset]i[vfr]s", MaskSubCreate, 0);
+ env->SetVar(env->SaveString("RGBA"), false);
+ return NULL;
+ }
+ }
}
UINT_PTR CALLBACK OpenHookProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
- switch (uiMsg) {
- case WM_NOTIFY: {
- OPENFILENAME* ofn = ((OFNOTIFY *)lParam)->lpOFN;
+ switch (uiMsg) {
+ case WM_NOTIFY: {
+ OPENFILENAME* ofn = ((OFNOTIFY*)lParam)->lpOFN;
- if (((NMHDR *)lParam)->code == CDN_FILEOK) {
- ofn->lCustData = (LPARAM)CharSetList[SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_GETCURSEL, 0, 0)];
- }
+ if (((NMHDR*)lParam)->code == CDN_FILEOK) {
+ ofn->lCustData = (LPARAM)CharSetList[SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_GETCURSEL, 0, 0)];
+ }
- break;
- }
+ break;
+ }
- case WM_INITDIALOG: {
- SetWindowLongPtr(hDlg, GWLP_USERDATA, lParam);
+ case WM_INITDIALOG: {
+ SetWindowLongPtr(hDlg, GWLP_USERDATA, lParam);
- for (ptrdiff_t i = 0; i < CharSetLen; i++) {
- CString s;
- s.Format(_T("%s (%d)"), CharSetNames[i], CharSetList[i]);
- SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)s);
- if (CharSetList[i] == (int)((OPENFILENAME*)lParam)->lCustData) {
- SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_SETCURSEL, i, 0);
- }
- }
+ for (ptrdiff_t i = 0; i < CharSetLen; i++) {
+ CString s;
+ s.Format(_T("%s (%d)"), CharSetNames[i], CharSetList[i]);
+ SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)s);
+ if (CharSetList[i] == (int)((OPENFILENAME*)lParam)->lCustData) {
+ SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_SETCURSEL, i, 0);
+ }
+ }
- break;
- }
+ break;
+ }
- default:
- break;
- }
+ default:
+ break;
+ }
- return FALSE;
+ return FALSE;
}
diff --git a/src/filters/transform/VSFilter/vfr.cpp b/src/filters/transform/VSFilter/vfr.cpp
index 10d68237e..000bd8dee 100644
--- a/src/filters/transform/VSFilter/vfr.cpp
+++ b/src/filters/transform/VSFilter/vfr.cpp
@@ -35,154 +35,154 @@
class TimecodesV1 : public VFRTranslator
{
private:
- // Used when sections run out
- double default_spf;
- double first_non_section_timestamp;
- int first_non_section_frame;
-
- // Also generate sections for unspecified ones
- // (use the default framerate then)
- struct FrameRateSection {
- double start_time;
- double spf;
- int start_frame;
- int end_frame;
- };
- std::vector<FrameRateSection> sections;
+ // Used when sections run out
+ double default_spf;
+ double first_non_section_timestamp;
+ int first_non_section_frame;
+
+ // Also generate sections for unspecified ones
+ // (use the default framerate then)
+ struct FrameRateSection {
+ double start_time;
+ double spf;
+ int start_frame;
+ int end_frame;
+ };
+ std::vector<FrameRateSection> sections;
public:
- virtual double TimeStampFromFrameNumber(int n) {
- // Find correct section
- for (size_t i = 0; i < sections.size(); i++) {
- FrameRateSection &sect = sections[i];
- if (n >= sect.start_frame && n <= sect.end_frame) {
- return sect.start_time + (n - sect.start_frame) * sect.spf;
- }
- }
- // Not in a section
- if (n < 0) {
- return 0.0;
- }
- return first_non_section_timestamp + (n - first_non_section_frame) * default_spf;
- }
-
- TimecodesV1(FILE *vfrfile) {
- char buf[100];
-
- default_spf = -1;
- double cur_time = 0.0;
-
- FrameRateSection temp_section;
- temp_section.start_time = 0.0;
- temp_section.spf = -1;
- temp_section.start_frame = 0;
- temp_section.end_frame = 0;
-
- while (fgets(buf, 100, vfrfile)) {
- // Comment?
- if (buf[0] == '#') {
- continue;
- }
-
- if (_strnicmp(buf, "Assume ", 7) == 0 && default_spf < 0) {
- char *num = buf+7;
- default_spf = atof(num);
- if (default_spf > 0) {
- default_spf = 1 / default_spf;
- } else {
- default_spf = -1;
- }
- temp_section.spf = default_spf;
- continue;
- }
-
- int start_frame, end_frame;
- float fps;
- if (sscanf_s(buf, "%d,%d,%f", &start_frame, &end_frame, &fps) == 3) {
- // Finish the current temp section
- temp_section.end_frame = start_frame - 1;
- if (temp_section.end_frame >= temp_section.start_frame) {
- cur_time += (temp_section.end_frame - temp_section.start_frame + 1) * temp_section.spf;
- sections.push_back(temp_section);
- }
- // Insert the section corresponding to this line
- temp_section.spf = 1/fps;
- temp_section.start_frame = start_frame;
- temp_section.end_frame = end_frame;
- temp_section.start_time = cur_time;
- cur_time += (end_frame - start_frame + 1) / fps;
- sections.push_back(temp_section);
- // Begin new temp section
- temp_section.spf = default_spf;
- temp_section.start_frame = end_frame + 1;
- temp_section.end_frame = end_frame; // yes, negative duration
- temp_section.start_time = cur_time;
- }
- }
-
- first_non_section_timestamp = cur_time;
- first_non_section_frame = temp_section.start_frame;
- }
+ virtual double TimeStampFromFrameNumber(int n) {
+ // Find correct section
+ for (size_t i = 0; i < sections.size(); i++) {
+ FrameRateSection& sect = sections[i];
+ if (n >= sect.start_frame && n <= sect.end_frame) {
+ return sect.start_time + (n - sect.start_frame) * sect.spf;
+ }
+ }
+ // Not in a section
+ if (n < 0) {
+ return 0.0;
+ }
+ return first_non_section_timestamp + (n - first_non_section_frame) * default_spf;
+ }
+
+ TimecodesV1(FILE* vfrfile) {
+ char buf[100];
+
+ default_spf = -1;
+ double cur_time = 0.0;
+
+ FrameRateSection temp_section;
+ temp_section.start_time = 0.0;
+ temp_section.spf = -1;
+ temp_section.start_frame = 0;
+ temp_section.end_frame = 0;
+
+ while (fgets(buf, 100, vfrfile)) {
+ // Comment?
+ if (buf[0] == '#') {
+ continue;
+ }
+
+ if (_strnicmp(buf, "Assume ", 7) == 0 && default_spf < 0) {
+ char* num = buf + 7;
+ default_spf = atof(num);
+ if (default_spf > 0) {
+ default_spf = 1 / default_spf;
+ } else {
+ default_spf = -1;
+ }
+ temp_section.spf = default_spf;
+ continue;
+ }
+
+ int start_frame, end_frame;
+ float fps;
+ if (sscanf_s(buf, "%d,%d,%f", &start_frame, &end_frame, &fps) == 3) {
+ // Finish the current temp section
+ temp_section.end_frame = start_frame - 1;
+ if (temp_section.end_frame >= temp_section.start_frame) {
+ cur_time += (temp_section.end_frame - temp_section.start_frame + 1) * temp_section.spf;
+ sections.push_back(temp_section);
+ }
+ // Insert the section corresponding to this line
+ temp_section.spf = 1 / fps;
+ temp_section.start_frame = start_frame;
+ temp_section.end_frame = end_frame;
+ temp_section.start_time = cur_time;
+ cur_time += (end_frame - start_frame + 1) / fps;
+ sections.push_back(temp_section);
+ // Begin new temp section
+ temp_section.spf = default_spf;
+ temp_section.start_frame = end_frame + 1;
+ temp_section.end_frame = end_frame; // yes, negative duration
+ temp_section.start_time = cur_time;
+ }
+ }
+
+ first_non_section_timestamp = cur_time;
+ first_non_section_frame = temp_section.start_frame;
+ }
};
class TimecodesV2 : public VFRTranslator
{
private:
- // Main data
- std::vector<double> timestamps;
- // For when data are exhausted (well, they shouldn't, then the vfr file is bad)
- int last_known_frame;
- double last_known_timestamp;
- double assumed_spf;
+ // Main data
+ std::vector<double> timestamps;
+ // For when data are exhausted (well, they shouldn't, then the vfr file is bad)
+ int last_known_frame;
+ double last_known_timestamp;
+ double assumed_spf;
public:
- virtual double TimeStampFromFrameNumber(int n) {
- if (n < (int)timestamps.size() && n >= 0) {
- return timestamps[n];
- }
- if (n < 0) {
- return 0.0;
- }
- return last_known_timestamp + (n - last_known_frame) * assumed_spf;
- }
-
- TimecodesV2(FILE *vfrfile) {
- char buf[50];
-
- timestamps.reserve(8192); // should be enough for most cases
-
- while (fgets(buf, 50, vfrfile)) {
- // Comment?
- if (buf[0] == '#') {
- continue;
- }
- // Otherwise assume it's a good timestamp
- timestamps.push_back(atof(buf)/1000);
- }
-
- last_known_frame = (int)timestamps.size()-1;
- last_known_timestamp = timestamps[last_known_frame];
- assumed_spf = last_known_timestamp - timestamps[last_known_frame - 1];
- }
+ virtual double TimeStampFromFrameNumber(int n) {
+ if (n < (int)timestamps.size() && n >= 0) {
+ return timestamps[n];
+ }
+ if (n < 0) {
+ return 0.0;
+ }
+ return last_known_timestamp + (n - last_known_frame) * assumed_spf;
+ }
+
+ TimecodesV2(FILE* vfrfile) {
+ char buf[50];
+
+ timestamps.reserve(8192); // should be enough for most cases
+
+ while (fgets(buf, 50, vfrfile)) {
+ // Comment?
+ if (buf[0] == '#') {
+ continue;
+ }
+ // Otherwise assume it's a good timestamp
+ timestamps.push_back(atof(buf) / 1000);
+ }
+
+ last_known_frame = (int)timestamps.size() - 1;
+ last_known_timestamp = timestamps[last_known_frame];
+ assumed_spf = last_known_timestamp - timestamps[last_known_frame - 1];
+ }
};
-VFRTranslator *GetVFRTranslator(const char *vfrfile)
+VFRTranslator* GetVFRTranslator(const char* vfrfile)
{
- char buf[32];
- buf[19] = 0; // In "# timecode format v1" the version number is character index 19
- FILE *f;
- fopen_s(&f, vfrfile, "r"); // errno_t err = <-- TODO: Check if fopen_s fails
- VFRTranslator *res = 0;
- if (fgets(buf, 32, f) && buf[0] == '#') {
- // So do some really shoddy parsing here, assume the file is good
- if (buf[19] == '1') {
- res = DNew TimecodesV1(f);
- } else if (buf[19] == '2') {
- res = DNew TimecodesV2(f);
- }
- }
- fclose(f);
- return res;
+ char buf[32];
+ buf[19] = 0; // In "# timecode format v1" the version number is character index 19
+ FILE* f;
+ fopen_s(&f, vfrfile, "r"); // errno_t err = <-- TODO: Check if fopen_s fails
+ VFRTranslator* res = 0;
+ if (fgets(buf, 32, f) && buf[0] == '#') {
+ // So do some really shoddy parsing here, assume the file is good
+ if (buf[19] == '1') {
+ res = DNew TimecodesV1(f);
+ } else if (buf[19] == '2') {
+ res = DNew TimecodesV2(f);
+ }
+ }
+ fclose(f);
+ return res;
}
diff --git a/src/filters/transform/VSFilter/vfr.h b/src/filters/transform/VSFilter/vfr.h
index 84c0a4ef7..4de46e30d 100644
--- a/src/filters/transform/VSFilter/vfr.h
+++ b/src/filters/transform/VSFilter/vfr.h
@@ -29,9 +29,9 @@
class VFRTranslator
{
public:
- virtual double TimeStampFromFrameNumber(int n) = 0;
+ virtual double TimeStampFromFrameNumber(int n) = 0;
};
-VFRTranslator *GetVFRTranslator(const char *vfrfile);
+VFRTranslator* GetVFRTranslator(const char* vfrfile);
#endif