3 |
* XVID MPEG-4 VIDEO CODEC |
* XVID MPEG-4 VIDEO CODEC |
4 |
* - XviD Decoder part of the DShow Filter - |
* - XviD Decoder part of the DShow Filter - |
5 |
* |
* |
6 |
* Copyright(C) 2002-2003 Peter Ross <pross@xvid.org> |
* Copyright(C) 2002-2010 Peter Ross <pross@xvid.org> |
7 |
* |
* |
8 |
* This program is free software ; you can redistribute it and/or modify |
* This program is free software ; you can redistribute it and/or modify |
9 |
* it under the terms of the GNU General Public License as published by |
* it under the terms of the GNU General Public License as published by |
19 |
* along with this program ; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
20 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
21 |
* |
* |
22 |
* $Id: CXvidDecoder.h,v 1.6 2005-10-08 00:58:02 suxen_drol Exp $ |
* $Id: CXvidDecoder.h,v 1.11 2011-03-17 15:11:32 Isibaar Exp $ |
23 |
* |
* |
24 |
****************************************************************************/ |
****************************************************************************/ |
25 |
|
|
29 |
#include <xvid.h> |
#include <xvid.h> |
30 |
#include "IXvidDecoder.h" |
#include "IXvidDecoder.h" |
31 |
|
|
32 |
|
#define XVID_NAME_L L"Xvid MPEG-4 Video Decoder" |
|
#define XVID_NAME_L L"XviD MPEG-4 Video Decoder" |
|
33 |
|
|
34 |
/* --- fourcc --- */ |
/* --- fourcc --- */ |
35 |
|
|
36 |
#define FOURCC_XVID mmioFOURCC('X','V','I','D') |
#define FOURCC_XVID mmioFOURCC('X','V','I','D') |
37 |
|
#define FOURCC_xvid mmioFOURCC('x','v','i','d') |
38 |
#define FOURCC_DIVX mmioFOURCC('D','I','V','X') |
#define FOURCC_DIVX mmioFOURCC('D','I','V','X') |
39 |
|
#define FOURCC_divx mmioFOURCC('d','i','v','x') |
40 |
#define FOURCC_DX50 mmioFOURCC('D','X','5','0') |
#define FOURCC_DX50 mmioFOURCC('D','X','5','0') |
41 |
|
#define FOURCC_dx50 mmioFOURCC('d','x','5','0') |
42 |
#define FOURCC_MP4V mmioFOURCC('M','P','4','V') |
#define FOURCC_MP4V mmioFOURCC('M','P','4','V') |
43 |
#define FOURCC_mp4v mmioFOURCC('m','p','4','v') |
#define FOURCC_mp4v mmioFOURCC('m','p','4','v') |
44 |
|
#define FOURCC_3IVX mmioFOURCC('3','I','V','X') |
45 |
|
#define FOURCC_3ivx mmioFOURCC('3','i','v','x') |
46 |
|
#define FOURCC_3IV0 mmioFOURCC('3','I','V','0') |
47 |
|
#define FOURCC_3iv0 mmioFOURCC('3','i','v','0') |
48 |
|
#define FOURCC_3IV1 mmioFOURCC('3','I','V','1') |
49 |
|
#define FOURCC_3iv1 mmioFOURCC('3','i','v','1') |
50 |
|
#define FOURCC_3IV2 mmioFOURCC('3','I','V','2') |
51 |
|
#define FOURCC_3iv2 mmioFOURCC('3','i','v','2') |
52 |
|
#define FOURCC_LMP4 mmioFOURCC('L','M','P','4') |
53 |
|
#define FOURCC_lmp4 mmioFOURCC('l','m','p','4') |
54 |
|
#define FOURCC_RMP4 mmioFOURCC('R','M','P','4') |
55 |
|
#define FOURCC_rmp4 mmioFOURCC('r','m','p','4') |
56 |
|
#define FOURCC_SMP4 mmioFOURCC('S','M','P','4') |
57 |
|
#define FOURCC_smp4 mmioFOURCC('s','m','p','4') |
58 |
|
#define FOURCC_HDX4 mmioFOURCC('H','D','X','4') |
59 |
|
#define FOURCC_hdx4 mmioFOURCC('h','d','x','4') |
60 |
|
|
61 |
/* --- media uids --- */ |
/* --- media uids --- */ |
62 |
|
|
66 |
DEFINE_GUID(CLSID_DIVX_UC, mmioFOURCC('D','I','V','X'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
DEFINE_GUID(CLSID_DIVX_UC, mmioFOURCC('D','I','V','X'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
67 |
DEFINE_GUID(CLSID_DX50, mmioFOURCC('d','x','5','0'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
DEFINE_GUID(CLSID_DX50, mmioFOURCC('d','x','5','0'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
68 |
DEFINE_GUID(CLSID_DX50_UC, mmioFOURCC('D','X','5','0'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
DEFINE_GUID(CLSID_DX50_UC, mmioFOURCC('D','X','5','0'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
69 |
|
DEFINE_GUID(CLSID_3IVX, mmioFOURCC('3','i','v','x'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
70 |
|
DEFINE_GUID(CLSID_3IVX_UC, mmioFOURCC('3','I','V','X'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
71 |
|
DEFINE_GUID(CLSID_3IV0, mmioFOURCC('3','i','v','0'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
72 |
|
DEFINE_GUID(CLSID_3IV0_UC, mmioFOURCC('3','I','V','0'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
73 |
|
DEFINE_GUID(CLSID_3IV1, mmioFOURCC('3','i','v','1'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
74 |
|
DEFINE_GUID(CLSID_3IV1_UC, mmioFOURCC('3','I','V','1'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
75 |
|
DEFINE_GUID(CLSID_3IV2, mmioFOURCC('3','i','v','2'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
76 |
|
DEFINE_GUID(CLSID_3IV2_UC, mmioFOURCC('3','I','V','2'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
77 |
|
DEFINE_GUID(CLSID_LMP4, mmioFOURCC('l','m','p','4'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
78 |
|
DEFINE_GUID(CLSID_LMP4_UC, mmioFOURCC('L','M','P','4'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
79 |
|
DEFINE_GUID(CLSID_RMP4, mmioFOURCC('r','m','p','4'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
80 |
|
DEFINE_GUID(CLSID_RMP4_UC, mmioFOURCC('R','M','P','4'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
81 |
|
DEFINE_GUID(CLSID_SMP4, mmioFOURCC('s','m','p','4'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
82 |
|
DEFINE_GUID(CLSID_SMP4_UC, mmioFOURCC('S','M','P','4'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
83 |
|
DEFINE_GUID(CLSID_HDX4, mmioFOURCC('h','d','x','4'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
84 |
|
DEFINE_GUID(CLSID_HDX4_UC, mmioFOURCC('H','D','X','4'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
85 |
DEFINE_GUID(CLSID_MP4V, mmioFOURCC('m','p','4','v'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
DEFINE_GUID(CLSID_MP4V, mmioFOURCC('m','p','4','v'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
86 |
DEFINE_GUID(CLSID_MP4V_UC, mmioFOURCC('M','P','4','V'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
DEFINE_GUID(CLSID_MP4V_UC, mmioFOURCC('M','P','4','V'), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
87 |
|
|
90 |
DEFINE_GUID(CLSID_MEDIASUBTYPE_IYUV, 0x56555949, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
DEFINE_GUID(CLSID_MEDIASUBTYPE_IYUV, 0x56555949, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); |
91 |
|
|
92 |
|
|
93 |
class CXvidDecoder : public CVideoTransformFilter, public IXvidDecoder, public ISpecifyPropertyPages |
class CXvidDecoder : |
94 |
|
public CVideoTransformFilter, |
95 |
|
public IXvidDecoder, |
96 |
|
public ISpecifyPropertyPages |
97 |
|
#if defined(XVID_USE_MFT) |
98 |
|
,public IMFTransform |
99 |
|
#endif |
100 |
{ |
{ |
101 |
|
|
102 |
public : |
public : |
108 |
CXvidDecoder(LPUNKNOWN punk, HRESULT *phr); |
CXvidDecoder(LPUNKNOWN punk, HRESULT *phr); |
109 |
~CXvidDecoder(); |
~CXvidDecoder(); |
110 |
|
|
111 |
|
HRESULT CompleteConnect(PIN_DIRECTION direction, IPin *pReceivePin); |
112 |
|
HRESULT BreakConnect(PIN_DIRECTION dir); |
113 |
|
|
114 |
HRESULT CheckInputType(const CMediaType * mtIn); |
HRESULT CheckInputType(const CMediaType * mtIn); |
115 |
HRESULT GetMediaType(int iPos, CMediaType * pmt); |
HRESULT GetMediaType(int iPos, CMediaType * pmt); |
116 |
HRESULT SetMediaType(PIN_DIRECTION direction, const CMediaType *pmt); |
HRESULT SetMediaType(PIN_DIRECTION direction, const CMediaType *pmt); |
123 |
STDMETHODIMP GetPages(CAUUID * pPages); |
STDMETHODIMP GetPages(CAUUID * pPages); |
124 |
STDMETHODIMP FreePages(CAUUID * pPages); |
STDMETHODIMP FreePages(CAUUID * pPages); |
125 |
|
|
126 |
|
/* IMFTransform */ |
127 |
|
#if defined(XVID_USE_MFT) |
128 |
|
STDMETHODIMP MFTGetStreamLimits(DWORD *pdwInputMinimum, DWORD *pdwInputMaximum, DWORD *pdwOutputMinimum, DWORD *pdwOutputMaximum); |
129 |
|
STDMETHODIMP MFTGetStreamCount(DWORD *pcInputStreams, DWORD *pcOutputStreams); |
130 |
|
STDMETHODIMP MFTGetStreamIDs(DWORD dwInputIDArraySize, DWORD *pdwInputIDs, DWORD dwOutputIDArraySize, DWORD *pdwOutputIDs); |
131 |
|
STDMETHODIMP MFTGetInputStreamInfo(DWORD dwInputStreamID, MFT_INPUT_STREAM_INFO *pStreamInfo); |
132 |
|
STDMETHODIMP MFTGetOutputStreamInfo(DWORD dwOutputStreamID, MFT_OUTPUT_STREAM_INFO *pStreamInfo); |
133 |
|
STDMETHODIMP GetAttributes(IMFAttributes** pAttributes); |
134 |
|
STDMETHODIMP GetInputStreamAttributes(DWORD dwInputStreamID, IMFAttributes **ppAttributes); |
135 |
|
STDMETHODIMP GetOutputStreamAttributes(DWORD dwOutputStreamID, IMFAttributes **ppAttributes); |
136 |
|
STDMETHODIMP MFTDeleteInputStream(DWORD dwStreamID); |
137 |
|
STDMETHODIMP MFTAddInputStreams(DWORD cStreams, DWORD *adwStreamIDs); |
138 |
|
STDMETHODIMP MFTGetInputAvailableType(DWORD dwInputStreamID, DWORD dwTypeIndex, IMFMediaType **ppType); |
139 |
|
STDMETHODIMP MFTGetOutputAvailableType(DWORD dwOutputStreamID, DWORD dwTypeIndex, IMFMediaType **ppType); |
140 |
|
STDMETHODIMP MFTSetInputType(DWORD dwInputStreamID, IMFMediaType *pType, DWORD dwFlags); |
141 |
|
STDMETHODIMP MFTSetOutputType(DWORD dwOutputStreamID, IMFMediaType *pType, DWORD dwFlags); |
142 |
|
STDMETHODIMP MFTGetInputCurrentType(DWORD dwInputStreamID, IMFMediaType **ppType); |
143 |
|
STDMETHODIMP MFTGetOutputCurrentType(DWORD dwOutputStreamID, IMFMediaType **ppType); |
144 |
|
STDMETHODIMP MFTGetInputStatus(DWORD dwInputStreamID, DWORD *pdwFlags); |
145 |
|
STDMETHODIMP MFTGetOutputStatus(DWORD *pdwFlags); |
146 |
|
STDMETHODIMP MFTSetOutputBounds(LONGLONG hnsLowerBound, LONGLONG hnsUpperBound); |
147 |
|
STDMETHODIMP MFTProcessEvent(DWORD dwInputStreamID, IMFMediaEvent *pEvent); |
148 |
|
STDMETHODIMP MFTProcessMessage(MFT_MESSAGE_TYPE eMessage, ULONG_PTR ulParam); |
149 |
|
|
150 |
|
STDMETHODIMP MFTProcessInput(DWORD dwInputStreamID, IMFSample *pSample, DWORD dwFlags); |
151 |
|
STDMETHODIMP MFTProcessOutput(DWORD dwFlags, DWORD cOutputBufferCount, MFT_OUTPUT_DATA_BUFFER *pOutputSamples, DWORD *pdwStatus); |
152 |
|
#endif /* XVID_USE_MFT */ |
153 |
|
|
154 |
private : |
private : |
155 |
|
|
156 |
HRESULT ChangeColorspace(GUID subtype, GUID formattype, void * format); |
HRESULT ChangeColorspace(GUID subtype, GUID formattype, void * format, int noflip); |
157 |
HRESULT OpenLib(); |
HRESULT OpenLib(); |
158 |
void CloseLib(); |
void CloseLib(); |
159 |
|
|
167 |
bool forced_ar; |
bool forced_ar; |
168 |
|
|
169 |
int rgb_flip; |
int rgb_flip; |
170 |
|
int out_stride; |
171 |
|
|
172 |
|
/* mft stuff */ |
173 |
|
#if defined(XVID_USE_MFT) |
174 |
|
BOOL HasPendingOutput() const { return m_frame.output.plane[1] != NULL; } |
175 |
|
|
176 |
|
HRESULT OnSetInputType(IMFMediaType *pmt); |
177 |
|
HRESULT OnCheckInputType(IMFMediaType *pmt); |
178 |
|
|
179 |
|
HRESULT OnSetOutputType(IMFMediaType *pmt); |
180 |
|
|
181 |
|
IMFMediaType *m_pInputType; |
182 |
|
IMFMediaType *m_pOutputType; |
183 |
|
|
184 |
|
CRITICAL_SECTION m_mft_lock; |
185 |
|
REFERENCE_TIME m_timestamp; |
186 |
|
REFERENCE_TIME m_timelength; |
187 |
|
|
188 |
|
int m_discont; |
189 |
|
|
190 |
|
/* Used to construct or interpolate missing timestamps */ |
191 |
|
REFERENCE_TIME m_rtFrame; |
192 |
|
MFRatio m_frameRate; |
193 |
|
UINT64 m_duration; |
194 |
|
#endif |
195 |
|
|
196 |
|
#ifdef XVID_USE_TRAYICON |
197 |
|
HWND MSG_hwnd; /* message handler window */ |
198 |
|
}; |
199 |
|
#define WM_ICONMESSAGE (WM_USER + 1) |
200 |
|
#else |
201 |
}; |
}; |
202 |
|
#endif |
203 |
|
|
204 |
static const int PARS[][2] = { |
static const int PARS[][2] = { |
205 |
{1, 1}, |
{1, 1}, |
210 |
{0, 0}, |
{0, 0}, |
211 |
}; |
}; |
212 |
|
|
|
|
|
213 |
#endif /* _FILTER_H_ */ |
#endif /* _FILTER_H_ */ |