00001
00002
00003
00004
00005 #include "fsPartMediaPlayer.h"
00006 #include "../common.h"
00007
00008 fsPartMediaPlayer::fsPartMediaPlayer() :
00009 m_reader (&m_stream, &m_hr)
00010 {
00011 m_pGB = NULL;
00012 m_pMC = NULL;
00013 m_pME = NULL;
00014 m_pMS = NULL;
00015 m_pVW = NULL;
00016 m_pBA = NULL;
00017 m_hOutWnd = NULL;
00018
00019 m_reader.AddRef ();
00020
00021 m_state = VFPS_CLOSED;
00022
00023 m_fVideoRatio = 1;
00024 }
00025
00026 fsPartMediaPlayer::~fsPartMediaPlayer()
00027 {
00028 Close ();
00029 }
00030
00031 HRESULT fsPartMediaPlayer::Open(HANDLE hFile, UINT64 uMaxAvail)
00032 {
00033 HRESULT hr;
00034
00035 Close ();
00036
00037
00038 m_stream.Attach (hFile, uMaxAvail);
00039
00040
00041 if (m_stream.Get_MediaType () == NULL)
00042 return E_FAIL;
00043
00044 m_reader.Set_MediaType (m_stream.Get_MediaType ());
00045
00046
00047
00048 RIF (CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
00049 IID_IGraphBuilder, (void**) &m_pGB));
00050
00051 IFilterGraph* pFG = NULL;
00052 RIF (m_pGB->QueryInterface (IID_IFilterGraph, (void**)&pFG));
00053
00054 RIF (pFG->AddFilter (&m_reader, NULL));
00055 pFG->Release ();
00056
00057 RIF (m_pGB->Render (m_reader.GetPin (0)));
00058
00059 RIF (m_pGB->QueryInterface (IID_IMediaControl, (void**)&m_pMC));
00060 RIF (m_pGB->QueryInterface (IID_IMediaEventEx, (void**)&m_pME));
00061 RIF (m_pGB->QueryInterface (IID_IMediaSeeking, (void**)&m_pMS));
00062
00063 m_pGB->QueryInterface (IID_IVideoWindow, (void**)&m_pVW);
00064 m_pGB->QueryInterface (IID_IBasicAudio, (void**)&m_pBA);
00065
00066 IBasicVideo* pBV = NULL;
00067 m_pGB->QueryInterface (IID_IBasicVideo, (void**) &pBV);
00068 if (pBV != NULL)
00069 {
00070 long nW, nH;
00071 pBV->get_VideoWidth (&nW);
00072 pBV->get_VideoHeight (&nH);
00073 m_fVideoRatio = (double)nW / nH;
00074 pBV->Release ();
00075 }
00076 else
00077 {
00078 m_fVideoRatio = 1;
00079 }
00080
00081 if (m_pVW)
00082 {
00083 if (FAILED (m_pVW->put_MessageDrain ((OAHWND)m_hOutWnd)))
00084 {
00085 SAFE_RELEASE (m_pVW);
00086 }
00087 }
00088
00089 RIF (m_pME->SetNotifyWindow ((OAHWND)m_hOutWnd, WM_VIDEONOTIFY, LONG(this)));
00090
00091 if (m_pVW)
00092 {
00093 m_pVW->put_Visible (OAFALSE);
00094 m_pVW->put_WindowStyle (WS_CHILD);
00095 m_pVW->put_Owner ((OAHWND)m_hOutWnd);
00096
00097 AutoSize ();
00098
00099 m_pVW->put_Visible (OATRUE);
00100
00101 m_pVW->SetWindowForeground (-1);
00102 }
00103
00104 m_state = VFPS_STOPPED;
00105
00106 return S_OK;
00107 }
00108
00109 HRESULT fsPartMediaPlayer::Run()
00110 {
00111 m_state = VFPS_RUNNING;
00112 return m_pMC->Run ();
00113 }
00114
00115 HRESULT fsPartMediaPlayer::Pause()
00116 {
00117 m_state = VFPS_PAUSED;
00118 return m_pMC->Pause ();
00119 }
00120
00121 HRESULT fsPartMediaPlayer::Stop()
00122 {
00123 HRESULT hr;
00124
00125 m_state = VFPS_STOPPED;
00126
00127 hr = m_pMC->Stop ();
00128 if (FAILED (hr))
00129 return hr;
00130
00131
00132 OAFilterState fs;
00133 hr = m_pMC->GetState(500, &fs);
00134
00135 if (m_pMS)
00136 {
00137 LONGLONG pos = 0;
00138 m_pMS->SetPositions (&pos, AM_SEEKING_AbsolutePositioning,
00139 NULL, AM_SEEKING_NoPositioning);
00140 }
00141
00142 hr = m_pMC->StopWhenReady ();
00143 if (FAILED (hr))
00144 return hr;
00145
00146 return S_OK;
00147 }
00148
00149 void fsPartMediaPlayer::Initialize(HWND hVideoOutWindow)
00150 {
00151 m_hOutWnd = hVideoOutWindow;
00152 }
00153
00154 HRESULT fsPartMediaPlayer::Close()
00155 {
00156 HRESULT hr = S_OK;
00157
00158 if (m_pMC)
00159 hr = m_pMC->Stop ();
00160
00161 if (m_pVW)
00162 {
00163 m_pVW->put_Visible (OAFALSE);
00164 m_pVW->put_Owner (NULL);
00165 }
00166
00167 SAFE_RELEASE (m_pVW);
00168 SAFE_RELEASE (m_pBA);
00169 SAFE_RELEASE (m_pMS);
00170 SAFE_RELEASE (m_pME);
00171 SAFE_RELEASE (m_pMC);
00172 SAFE_RELEASE (m_pGB);
00173
00174 m_state = VFPS_CLOSED;
00175
00176 m_stream.Detach ();
00177
00178 return hr;
00179 }
00180
00181 void fsPartMediaPlayer::AutoSize()
00182 {
00183 if (m_pVW && m_hOutWnd)
00184 {
00185 RECT rc;
00186 GetClientRect (m_hOutWnd, &rc);
00187 if (rc.right && rc.bottom)
00188 {
00189 int w, h;
00190
00191 if ((double)rc.right / rc.bottom > m_fVideoRatio)
00192 {
00193
00194 h = rc.bottom;
00195 w = (int) (h * m_fVideoRatio);
00196 }
00197 else
00198 {
00199
00200 w = rc.right;
00201 h = (int) (w / m_fVideoRatio);
00202 }
00203
00204 m_pVW->SetWindowPosition ((rc.right - w) / 2, (rc.bottom - h) / 2, w, h);
00205 UpdateWindow (m_hOutWnd);
00206 }
00207 }
00208 }
00209
00210 HRESULT fsPartMediaPlayer::NotifyOwnerMessage(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
00211 {
00212 if (m_pVW)
00213 return m_pVW->NotifyOwnerMessage (long (hWnd), msg, wp, lp);
00214
00215 return S_FALSE;
00216 }
00217
00218 fsPartMediaPlayerState fsPartMediaPlayer::Get_State()
00219 {
00220 return m_state;
00221 }
00222
00223 IMediaSeeking* fsPartMediaPlayer::Get_MediaSeeking()
00224 {
00225 if (m_pMS)
00226 m_pMS->AddRef ();
00227
00228 return m_pMS;
00229 }
00230
00231 HRESULT fsPartMediaPlayer::HandleGraphEvent()
00232 {
00233 LONG evCode, evParam1, evParam2;
00234 HRESULT hr=S_OK;
00235
00236 if (!m_pME)
00237 return S_OK;
00238
00239 while (SUCCEEDED (m_pME->GetEvent (&evCode, &evParam1, &evParam2, 0)))
00240 {
00241 if(EC_COMPLETE == evCode)
00242 {
00243 Stop ();
00244 }
00245 }
00246
00247 return S_OK;
00248 }
00249
00250 HRESULT fsPartMediaPlayer::Set_Volume(long lVolume)
00251 {
00252 if (m_pBA)
00253 return m_pBA->put_Volume (lVolume);
00254
00255 return S_OK;
00256 }
00257
00258 HRESULT fsPartMediaPlayer::Open2(LPCSTR pszFile)
00259 {
00260 HRESULT hr;
00261
00262 Close ();
00263
00264 RIF (CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**) &m_pGB));
00265
00266 WCHAR wszFile [MAX_PATH];
00267 MultiByteToWideChar (CP_ACP, 0, pszFile, -1, wszFile, MAX_PATH);
00268
00269 RIF (m_pGB->RenderFile (wszFile, NULL));
00270
00271 RIF (m_pGB->QueryInterface (IID_IMediaControl, (void**) &m_pMC));
00272 RIF (m_pGB->QueryInterface (IID_IMediaEventEx, (void**) &m_pME));
00273 RIF (m_pGB->QueryInterface (IID_IMediaSeeking, (void**) &m_pMS));
00274
00275 m_pGB->QueryInterface (IID_IVideoWindow, (void**) &m_pVW);
00276
00277 IBasicVideo* pBV = NULL;
00278 m_pGB->QueryInterface (IID_IBasicVideo, (void**) &pBV);
00279 if (pBV != NULL)
00280 {
00281 long nW, nH;
00282 pBV->get_VideoWidth (&nW);
00283 pBV->get_VideoHeight (&nH);
00284 m_fVideoRatio = (double)nW / nH;
00285 }
00286 else
00287 {
00288 m_fVideoRatio = 1;
00289 }
00290
00291
00292 RIF (m_pGB->QueryInterface (IID_IBasicAudio, (void**) &m_pBA));
00293
00294 BOOL bAudioOnly = m_pVW == NULL || pBV == NULL;
00295
00296 if (pBV)
00297 pBV->Release ();
00298
00299 if (bAudioOnly == FALSE)
00300 {
00301 long l;
00302 if (FAILED (m_pVW->get_Visible (&l)))
00303 bAudioOnly = TRUE;
00304 }
00305
00306
00307
00308 if (m_pVW)
00309 {
00310 if (FAILED (m_pVW->put_MessageDrain ((OAHWND)m_hOutWnd)))
00311 {
00312 SAFE_RELEASE (m_pVW);
00313 }
00314 }
00315
00316 RIF (m_pME->SetNotifyWindow ((OAHWND)m_hOutWnd, WM_VIDEONOTIFY, LONG(this)));
00317
00318 if (m_pVW)
00319 {
00320 m_pVW->put_Visible (OAFALSE);
00321 m_pVW->put_WindowStyle (WS_CHILD);
00322 m_pVW->put_Owner ((OAHWND)m_hOutWnd);
00323
00324 AutoSize ();
00325
00326 m_pVW->put_Visible (OATRUE);
00327
00328 m_pVW->SetWindowForeground (-1);
00329 }
00330
00331 m_state = VFPS_STOPPED;
00332
00333 return S_OK;
00334 }