]> git.vomp.tv Git - vompclient.git/commitdiff
Windows updates
authorChris Tallon <chris@vomp.tv>
Sat, 25 Nov 2006 01:02:47 +0000 (01:02 +0000)
committerChris Tallon <chris@vomp.tv>
Sat, 25 Nov 2006 01:02:47 +0000 (01:02 +0000)
videowin.cc
videowin.h

index e8b014a109f01885872af4bf4fbdf01b403459a7..ad0390f6a3294e2299d4d6f9b151874ccb10f6b1 100644 (file)
@@ -211,9 +211,11 @@ int VideoWin::dsplay()
 \r
   //Build filter graph\r
   HRESULT hres;\r
-\r
+//So this is the real code, this prevents the feeder from calling noexisting objects!\r
+   WaitForSingleObject(filtermutex,INFINITE);\r
   if (hres=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,\r
     IID_IGraphBuilder,(void**)&dsgraphbuilder)!=S_OK) {\r
+         ReleaseMutex(filtermutex);\r
       return 0;\r
    }\r
    #ifdef DS_DEBUG\r
@@ -221,22 +223,22 @@ int VideoWin::dsplay()
    #endif\r
    //This is just a try to see if building the graph works\r
 //   dsgraphbuilder->RenderFile(L"D:\\Projekte\\VTP Client\\test.mpa" ,NULL);\r
-   //So this is the real code, this prevents the feeder from calling noexisting objects!\r
-   WaitForSingleObject(filtermutex,INFINITE);\r
+   \r
    firstsynched=false;\r
    sourcefilter=new DsSourceFilter(); //Creating our Source filter for pushing Data\r
    // to DirectShow\r
+   sourcefilter->AddRef();\r
    if (hres=dsgraphbuilder->AddFilter(sourcefilter,L"Vomp Win Source Filter")!=S_OK) {\r
    Log::getInstance()->log("VideoWin", Log::WARN , "Failed adding Vomp Source Filter!");\r
+        ReleaseMutex(filtermutex);\r
      CleanupDS();\r
-     ReleaseMutex(filtermutex);\r
      return 0;\r
    }\r
    //if (audioon) {\r
-     if (hres=dsgraphbuilder->Render(sourcefilter->GetPin(0)/*audio*/)!=S_OK) {\r
+     if (hres=dsgraphbuilder->Render((IPin*)sourcefilter->GetAudioPin()/*audio*/)!=S_OK) {\r
      Log::getInstance()->log("VideoWin", Log::WARN , "Failed rendering audio!");\r
+          ReleaseMutex(filtermutex);\r
        CleanupDS();\r
-       ReleaseMutex(filtermutex);\r
        return 0;\r
      }\r
    //}\r
@@ -246,30 +248,33 @@ int VideoWin::dsplay()
     if (hres=CoCreateInstance(CLSID_VideoMixingRenderer9,0,\r
       CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**) &dsvmrrenderer)!=S_OK) {\r
       Log::getInstance()->log("VideoWin", Log::WARN ,"Failed creating VMR9 renderer!");\r
+         ReleaseMutex(filtermutex);\r
       CleanupDS();\r
-      ReleaseMutex(filtermutex);\r
+      \r
     }\r
       /*VMR 9 stuff**/\r
     if (hres=dsgraphbuilder->AddFilter(dsvmrrenderer,L"VMR9")!=S_OK) {\r
+         ReleaseMutex(filtermutex);\r
       CleanupDS();\r
       Log::getInstance()->log("VideoWin", Log::WARN ,"Failed adding VMR9 renderer!");\r
-      ReleaseMutex(filtermutex);\r
+      \r
       return 0;\r
     }\r
     IVMRFilterConfig9* vmrfilconfig;\r
     if (dsvmrrenderer->QueryInterface(IID_IVMRFilterConfig9,(void**)&vmrfilconfig)!=S_OK) {\r
-      CleanupDS();\r
-      Log::getInstance()->log("VideoWin", Log::WARN ,"Failed getting VMR9 Filterconfig interface!");\r
       ReleaseMutex(filtermutex);\r
+         CleanupDS();\r
+      Log::getInstance()->log("VideoWin", Log::WARN ,"Failed getting VMR9 Filterconfig interface!");\r
       return 0;\r
     }\r
     vmrfilconfig->SetRenderingMode(VMR9Mode_Renderless);\r
     vmrfilconfig->Release();\r
 \r
     if (dsvmrrenderer->QueryInterface(IID_IVMRSurfaceAllocatorNotify9,(void**)& dsvmrsurfnotify)!=S_OK) {\r
-      CleanupDS();\r
-      Log::getInstance()->log("VideoWin", Log::WARN ,"Failed getting VMR9 Surface Allocator interface!");\r
       ReleaseMutex(filtermutex);\r
+         CleanupDS();\r
+      Log::getInstance()->log("VideoWin", Log::WARN ,"Failed getting VMR9 Surface Allocator interface!");\r
+      \r
       return 0;\r
     }\r
     allocatorvmr=new DsAllocator();\r
@@ -283,16 +288,16 @@ int VideoWin::dsplay()
     IFilterGraph2*fg2=NULL;\r
     if (dsgraphbuilder->QueryInterface(IID_IFilterGraph2,(void**)&fg2)!=S_OK) {\r
       Log::getInstance()->log("VideoWin", Log::WARN , "Failed querying for FilterGraph2 Interface!");\r
-      CleanupDS();\r
       ReleaseMutex(filtermutex);\r
+         CleanupDS();\r
       return 0;\r
     }\r
-    if (hres=fg2->RenderEx(sourcefilter->GetPin(1)/*video*/,\r
+    if (hres=fg2->RenderEx((IPin*)sourcefilter->GetVideoPin()/*video*/,\r
         AM_RENDEREX_RENDERTOEXISTINGRENDERERS,NULL)!=S_OK) {\r
       Log::getInstance()->log("VideoWin", Log::WARN , "Failed rendering Video!");\r
          fg2->Release();\r
-      CleanupDS();\r
-      ReleaseMutex(filtermutex);\r
+         ReleaseMutex(filtermutex);\r
+         CleanupDS();\r
       return 0;\r
     }\r
        fg2->Release();\r
@@ -304,12 +309,12 @@ int VideoWin::dsplay()
    }\r
 \r
    dsgraphbuilder->QueryInterface(IID_IMediaFilter,(void **) &dsmediafilter);\r
-   dsmediafilter->SetSyncSource(dsrefclock);\r
+   HRESULT hresdeb=dsmediafilter->SetSyncSource(dsrefclock);\r
 \r
    dsgraphbuilder->QueryInterface(IID_IMediaControl,(void **) &dsmediacontrol);\r
    dsgraphbuilder->QueryInterface(IID_IBasicAudio,(void **) &dsbasicaudio);    \r
 \r
-   dsmediacontrol->Run();\r
+   hresdeb=dsmediacontrol->Run();\r
    iframemode=false;//exit iframe mode\r
    ReleaseMutex(filtermutex);\r
   return 1;\r
@@ -319,25 +324,28 @@ int VideoWin::EnterIframePlayback()
 {\r
        if (!initted) return 0;\r
        CleanupDS();\r
+       //So this is the real code, this prevents the feeder from calling noexisting objects!\r
+   WaitForSingleObject(filtermutex,INFINITE);\r
        iframemode=true;//enter iframe mode\r
        //Build filter graph\r
        HRESULT hres;\r
        if (hres=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,\r
                 IID_IGraphBuilder,(void**)&dsgraphbuilder)!=S_OK) {\r
+                        ReleaseMutex(filtermutex);\r
                         return 0;\r
        }\r
 #ifdef DS_DEBUG\r
        AddToRot(dsgraphbuilder,&graphidentifier);\r
 #endif\r
-   //So this is the real code, this prevents the feeder from calling noexisting objects!\r
-   WaitForSingleObject(filtermutex,INFINITE);\r
+   \r
    //firstsynched=false;\r
    sourcefilter=new DsSourceFilter(); //Creating our Source filter for pushing Data\r
    // to DirectShow\r
+   sourcefilter->AddRef();\r
    if (hres=dsgraphbuilder->AddFilter(sourcefilter,L"Vomp Win Source Filter")!=S_OK) {\r
    Log::getInstance()->log("VideoWin", Log::WARN , "Failed adding Vomp Source Filter!");\r
+     ReleaseMutex(filtermutex);  \r
      CleanupDS();\r
-     ReleaseMutex(filtermutex);\r
      return 0;\r
    }\r
 #ifdef DO_VIDEO\r
@@ -346,31 +354,32 @@ int VideoWin::EnterIframePlayback()
     if (hres=CoCreateInstance(CLSID_VideoMixingRenderer9,0,\r
       CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**) &dsvmrrenderer)!=S_OK) {\r
       Log::getInstance()->log("VideoWin", Log::WARN ,"Failed creating VMR9 renderer!");\r
-      CleanupDS();\r
       ReleaseMutex(filtermutex);\r
+         CleanupDS();\r
          return 0;\r
     }\r
       /*VMR 9 stuff**/\r
     if (hres=dsgraphbuilder->AddFilter(dsvmrrenderer,L"VMR9")!=S_OK) {\r
-      CleanupDS();\r
       Log::getInstance()->log("VideoWin", Log::WARN ,"Failed adding VMR9 renderer!");\r
       ReleaseMutex(filtermutex);\r
+         CleanupDS();\r
       return 0;\r
     }\r
     IVMRFilterConfig9* vmrfilconfig;\r
     if (dsvmrrenderer->QueryInterface(IID_IVMRFilterConfig9,(void**)&vmrfilconfig)!=S_OK) {\r
-      CleanupDS();\r
-      Log::getInstance()->log("VideoWin", Log::WARN ,"Failed getting VMR9 Filterconfig interface!");\r
       ReleaseMutex(filtermutex);\r
+         CleanupDS();\r
+      Log::getInstance()->log("VideoWin", Log::WARN ,"Failed getting VMR9 Filterconfig interface!");\r
+      \r
       return 0;\r
     }\r
     vmrfilconfig->SetRenderingMode(VMR9Mode_Renderless);\r
     vmrfilconfig->Release();\r
 \r
-    if (dsvmrrenderer->QueryInterface(IID_IVMRSurfaceAllocatorNotify9,(void**)& dsvmrsurfnotify)!=S_OK) {\r
-      CleanupDS();\r
+    if (dsvmrrenderer->QueryInterface(IID_IVMRSurfaceAllocatorNotify9,(void**)& dsvmrsurfnotify)!=S_OK) { \r
       Log::getInstance()->log("VideoWin", Log::WARN ,"Failed getting VMR9 Surface Allocator interface!");\r
       ReleaseMutex(filtermutex);\r
+         CleanupDS();\r
       return 0;\r
     }\r
     allocatorvmr=new DsAllocator();\r
@@ -381,16 +390,16 @@ int VideoWin::EnterIframePlayback()
     IFilterGraph2*fg2=NULL;\r
     if (dsgraphbuilder->QueryInterface(IID_IFilterGraph2,(void**)&fg2)!=S_OK) {\r
       Log::getInstance()->log("VideoWin", Log::WARN , "Failed querying for FilterGraph2 Interface!");\r
-      CleanupDS();\r
       ReleaseMutex(filtermutex);\r
+         CleanupDS();\r
       return 0;\r
     }\r
-    if (hres=fg2->RenderEx(sourcefilter->GetPin(1)/*video*/,\r
+    if (hres=fg2->RenderEx((IPin*)sourcefilter->GetVideoPin()/*video*/,\r
         AM_RENDEREX_RENDERTOEXISTINGRENDERERS,NULL)!=S_OK) {\r
       Log::getInstance()->log("VideoWin", Log::WARN , "Failed rendering Video!");\r
          fg2->Release();\r
+         ReleaseMutex(filtermutex);\r
       CleanupDS();\r
-      ReleaseMutex(filtermutex);\r
       return 0;\r
     }\r
        fg2->Release();\r
@@ -453,7 +462,9 @@ int VideoWin::dsreset()
 int VideoWin::dspause()\r
 {\r
   if (!initted) return 0;\r
+  WaitForSingleObject(filtermutex,INFINITE);\r
   if (dsmediacontrol) dsmediacontrol->Pause();\r
+  ReleaseMutex(filtermutex);\r
   return 1;\r
 }\r
 \r
@@ -473,7 +484,10 @@ int VideoWin::unPause() // FIXME get rid - same as play!!
 int VideoWin::dsunPause() // FIXME get rid - same as play!!\r
 {//No on windows this is not the same, I don't get rid of!\r
   if (!initted) return 0;\r
+  WaitForSingleObject(filtermutex,INFINITE);\r
   if (dsmediacontrol) dsmediacontrol->Run();\r
+  ReleaseMutex(filtermutex);\r
+\r
   return 1;\r
 }\r
 \r
@@ -589,6 +603,7 @@ void VideoWin::CleanupDS()
 #endif\r
     dsgraphbuilder->Release();\r
     dsgraphbuilder=NULL;\r
+       sourcefilter->Release();\r
     sourcefilter=NULL; //The Graph Builder destroys our SourceFilter\r
   }\r
   ReleaseMutex(filtermutex);\r
@@ -617,6 +632,11 @@ UINT VideoWin::DeliverMediaPacket(MediaPacket packet,
 {\r
   /*First Check, if we have an audio sample*/\r
 #ifdef DO_VIDEO\r
+       if (!videoon) {\r
+         *samplepos+=packet.length;\r
+       MILLISLEEP(0); //yet not implemented//bad idea\r
+       return packet.length;\r
+       }\r
   /*First Check, if we have an audio sample*/\r
   if (iframemode) {\r
                samplepos=0;\r
@@ -661,6 +681,7 @@ UINT VideoWin::DeliverMediaPacket(MediaPacket packet,
   UINT ms_length;\r
   UINT ms_pos;\r
   UINT haveToCopy;\r
+  \r
   if (!getCurrentVideoMediaSample(&ms) || ms==NULL) {// get the current sample\r
     samplepos=0;\r
     MILLISLEEP(10);\r
@@ -871,6 +892,8 @@ void VideoWin::displayIFrame(const UCHAR* buffer, UINT length)
   IMediaSample* ms=NULL;\r
   REFERENCE_TIME reftime1=0;\r
   REFERENCE_TIME reftime2=0;\r
+  if (!videoon) return;\r
+\r
   if (!getCurrentVideoMediaSample(&ms) || ms==NULL) {// get the current sample\r
     MILLISLEEP(10);\r
     return ;\r
@@ -879,7 +902,7 @@ void VideoWin::displayIFrame(const UCHAR* buffer, UINT length)
   DWORD ms_length;\r
   ms->GetPointer(&ms_buf);\r
   ms_length=ms->GetSize();\r
-\r
+  \r
   /*First Check, if we have an video sample*/\r
   DWORD read_pos = 0, write_pos = 0;\r
   DWORD pattern, packet_length;\r
@@ -938,9 +961,9 @@ void VideoWin::displayIFrame(const UCHAR* buffer, UINT length)
 \r
 #else\r
 \r
-       *samplepos+=packet.length;\r
+    //   *samplepos+=packet.length;\r
       MILLISLEEP(0); //yet not implemented//bad idea\r
-       return packet.length;\r
+       return ;\r
 #endif\r
 }\r
 \r
index e4e8603cc16ed76a034181cf79457f4df21d0125..7b9dd4b1858fe7209c240d32724cef1aeaabf427 100644 (file)
@@ -31,7 +31,7 @@
 #include "defines.h"\r
 #include "video.h"\r
 \r
-//#define DS_DEBUG\r
+#define DS_DEBUG\r
 \r
 class DsSourceFilter;\r
 class DsAllocator;\r