[Sumover-dev] [svn commit] r4892 - in vic/branches/mpeg4: video

sumover-dev at cs.ucl.ac.uk sumover-dev at cs.ucl.ac.uk
Sun Dec 12 14:12:32 GMT 2010


Author: douglask
Date: Sun Dec 12 14:12:32 2010
New Revision: 4892

Modified:
   vic/branches/mpeg4/tcl/ui-ctrlmenu.tcl
   vic/branches/mpeg4/tcl/ui-grabber.tcl
   vic/branches/mpeg4/tcl/ui-resource.tcl
   vic/branches/mpeg4/tcl/ui-util.tcl
   vic/branches/mpeg4/video/device-input.h
   vic/branches/mpeg4/video/device-output.h
   vic/branches/mpeg4/video/device.cpp
   vic/branches/mpeg4/video/grabber-decklink.cpp
   vic/branches/mpeg4/video/grabber-win32DS.cpp
   vic/branches/mpeg4/video/grabber-win32DS.h

Log:
Initial check-in for new DirectShow grabber controls panel support.

The DirectShow grabber controls panel includes a properties button and a capture resolution drop-down menu to select the resolution for Large captures. The properties button brings up a DirectShow filter properties dialog box.

Work still needs to be done to correctly handle capture devices that use different pixelformats at different resolutions.

Modified: vic/branches/mpeg4/tcl/ui-ctrlmenu.tcl
==============================================================================
--- vic/branches/mpeg4/tcl/ui-ctrlmenu.tcl	(original)
+++ vic/branches/mpeg4/tcl/ui-ctrlmenu.tcl	Sun Dec 12 14:12:32 2010
@@ -730,7 +730,8 @@
 proc select_device device {
 	global transmitButton logoButton sizeButtons portButton formatButtons \
 		videoFormat defaultFormat lastDevice defaultPort inputPort \
-		defaultType inputType transmitButtonState logoButtonState typeButton
+		defaultType inputType transmitButtonState logoButtonState typeButton \
+		capResolutionButton
 
 	#
 	# Remember settings of various controls for previous device
@@ -765,7 +766,7 @@
 	} else {
 		$sizeButtons.b0 configure -state disabled
 	}
-        if { [device_supports $device size normal] || [device_supports $device size cif] } {
+	if { [device_supports $device size normal] || [device_supports $device size cif] } {
 		$sizeButtons.b1 configure -state normal
 	} else {
 		$sizeButtons.b1 configure -state disabled
@@ -787,8 +788,17 @@
 	} else {
 		$typeButton configure -state disabled
 	}
-	insert_grabber_panel [$device nickname]
-
+	if {[$device api] != ""} {
+		insert_grabber_panel [$device api]
+	} else {
+		insert_grabber_panel [$device nickname]
+	}
+	if [device_supports $device capture_resolution *] {
+		$capResolutionButton configure -state normal
+		attach_capture_resolutions $device
+	} else {
+		$capResolutionButton configure -state disabled
+	}
 	#set videoFormat $defaultFormat($device)
 	select_format $videoFormat
 	if $wasOverlaying {
@@ -801,7 +811,7 @@
 
 proc compare {a b} {
 
-	return [string compare [$a nickname] [$b nickname]]
+    return [string compare [$a nickname] [$b nickname]]
 
     set a0 [$a nickname]
 
@@ -857,8 +867,8 @@
 		$w configure -state disabled
 		return
 	}
-	
-    set inputDeviceListSorted [lsort -command compare $inputDeviceList]
+
+	set inputDeviceListSorted [lsort -command compare $inputDeviceList]
 	foreach d $inputDeviceListSorted {
 		if { [$d nickname] == "still" && ![yesno stillGrabber] } {
 			set defaultFormat($d) $videoFormat
@@ -1183,6 +1193,41 @@
 	set inputType $defaultType($device)
 }
 
+proc attach_capture_resolutions device {
+	global capResolutionButton capResolution defaultCapResolution
+	catch "destroy $capResolutionButton.menu"
+	set resolutions [attribute_class [$device attributes] capture_resolution]
+	set f [smallfont]
+	set m $capResolutionButton.menu
+	menu $m
+
+	foreach resolution $resolutions {
+		$m add radiobutton -label $resolution \
+			-command "restart" \
+			-value $resolution -variable capResolution -font $f
+	}
+	if ![info exists defaultCapResolution($device)] {
+		set nn [$device nickname]
+		if [info exists defaultCapResolution($nn)] {
+			set defaultCapResolution($device) $defaultCapResolution($nn)
+		} else {
+			set s [resource defaultCapResolution($nn)]
+			if { $s != "" } {
+				set defaultCapResolution($device) $s
+			} else {
+				# use current resolution setting
+				set s [string trim [attribute_class [$device attributes] selected_resolution]]
+				if { $s != "" } {
+					set defaultCapResolution($device) $s
+				} else {
+					set defaultCapResolution($device) [lindex $resolutions 0]
+				}
+			}
+		}
+	}
+	set capResolution $defaultCapResolution($device)
+}
+
 proc build.encoder_buttons w {
 	set f [smallfont]
 	build.encoder_options $w.options
@@ -1654,6 +1699,7 @@
 		}
 	}
 	set_scaler_buttons_state
+	set_capture_resolution_button_state
 }
 
 proc disable_large_button { } {
@@ -1672,6 +1718,17 @@
 	}
 }
 
+proc set_capture_resolution_button_state { } {
+	global inputSize capResolutionButton
+	if { [info exists capResolutionButton] } {
+		if { $inputSize == 1 } {
+			$capResolutionButton configure -state normal
+		} else {
+			$capResolutionButton configure -state disabled
+		}
+	}
+}
+
 proc set_scaler_buttons_state { } {
 	global inputSize scalerButtons
 	if { [info exists scalerButtons] } {
@@ -1711,6 +1768,7 @@
 	} else {
 		enable_large_button
 	}
+	set_capture_resolution_button_state
 
 	if { $fmt == "pvh"} {
 		set w .menu.encoder.f.encoderLayer

Modified: vic/branches/mpeg4/tcl/ui-grabber.tcl
==============================================================================
--- vic/branches/mpeg4/tcl/ui-grabber.tcl	(original)
+++ vic/branches/mpeg4/tcl/ui-grabber.tcl	Sun Dec 12 14:12:32 2010
@@ -31,6 +31,39 @@
 proc init_grabber_panel {} {
 }
 
+proc build.directshow w {
+    global capResolutionButton capResolution videoDevice
+
+    label $w.title -text "DirectShow grabber controls"
+    frame $w.f -relief sunken -borderwidth 2
+
+    set f [smallfont]
+    # create the menubutton but don't defer the menu creation until later
+    if {$::tk_version > 8.4 } {
+        ttk::menubutton $w.f.resolution -text "Capture Resolution" \
+            -menu $w.f.resolution.menu -width 18
+    } else {
+        menubutton $w.f.resolution -text "Capture Resolution" \
+            -menu $w.f.resolution.menu -relief raised -width 20 \
+            -font $f -indicatoron 1
+    }
+
+    if {$::tk_version > 8.4 } {
+        ttk::button $w.f.properties -text "Properties" -width 18 \
+            -command "$videoDevice properties"
+    } else {
+        menubutton $w.f.properties -text "Properties" -width 20 \
+            -relief raised -command "$videoDevice properties"
+    }
+
+    pack $w.f.resolution -fill x -side left
+    pack $w.f.properties -fill x -side right
+    pack $w.title $w.f -fill x -expand 1
+    set capResolutionButton $w.f.resolution
+    set capResolution undefined
+    set_capture_resolution_button_state
+}
+
 proc build.dc10 w {
     build.v4l $w
 }
@@ -194,7 +227,7 @@
 }
 
 proc build.blackmagic w {
-    global scalerCompResolution scalerButtons
+    global scalerCapResolution scalerButtons
 
     label $w.title -text "Blackmagic DeckLink-Grabber"
     frame $w.f -relief sunken -borderwidth 2
@@ -203,38 +236,38 @@
 
     if {$::tk_version > 8.4 && [windowingsystem] != "x11"} {
         ttk::radiobutton $w.f.b0 -text "none" -command "restart" \
-           -variable scalerCompResolution -value "none"
+           -variable scalerCapResolution -value "none"
         ttk::radiobutton $w.f.b1 -text "960p" -command "restart" \
-            -variable scalerCompResolution -value "960p"
+            -variable scalerCapResolution -value "960p"
         ttk::radiobutton $w.f.b2 -text "720p" -command "restart" \
-            -variable scalerCompResolution -value "720p"
+            -variable scalerCapResolution -value "720p"
         ttk::radiobutton $w.f.b3 -text "576p" -command "restart" \
-            -variable scalerCompResolution -value "576p"
+            -variable scalerCapResolution -value "576p"
         ttk::radiobutton $w.f.b4 -text "480p" -command "restart" \
-            -variable scalerCompResolution -value "480p"
+            -variable scalerCapResolution -value "480p"
     } else {
         set f [smallfont]
         radiobutton $w.f.b0 -text "none" -command "restart" \
             -padx 0 -pady 0 \
-            -anchor w -variable scalerCompResolution -font $f -relief flat -value "none"
+            -anchor w -variable scalerCapResolution -font $f -relief flat -value "none"
         radiobutton $w.f.b1 -text "960p" -command "restart" \
             -padx 0 -pady 0 \
-            -anchor w -variable scalerCompResolution -font $f -relief flat -value "960p"
+            -anchor w -variable scalerCapResolution -font $f -relief flat -value "960p"
         radiobutton $w.f.b2 -text "720p" -command "restart" \
             -padx 0 -pady 0 \
-            -anchor w -variable scalerCompResolution -font $f -relief flat -value "720p"
+            -anchor w -variable scalerCapResolution -font $f -relief flat -value "720p"
         radiobutton $w.f.b3 -text "576p" -command "restart" \
             -padx 0 -pady 0 \
-            -anchor w -variable scalerCompResolution -font $f -relief flat -value "576p"
+            -anchor w -variable scalerCapResolution -font $f -relief flat -value "576p"
         radiobutton $w.f.b4 -text "480p" -command "restart" \
             -padx 0 -pady 0 \
-            -anchor w -variable scalerCompResolution -font $f -relief flat -value "480p"
+            -anchor w -variable scalerCapResolution -font $f -relief flat -value "480p"
     }
     pack $w.f.scaling $w.f.b0 $w.f.b1 $w.f.b2 $w.f.b3 $w.f.b4 -fill x -side left
 
     pack $w.title $w.f -fill x -expand 1
 
-    set scalerCompResolution [resource scalerCompResolution]
+    set scalerCapResolution [resource scalerCapResolution]
     set scalerButtons $w.f
     set_scaler_buttons_state
 }

Modified: vic/branches/mpeg4/tcl/ui-resource.tcl
==============================================================================
--- vic/branches/mpeg4/tcl/ui-resource.tcl	(original)
+++ vic/branches/mpeg4/tcl/ui-resource.tcl	Sun Dec 12 14:12:32 2010
@@ -185,7 +185,7 @@
 	option add Vic.siteDropTime "300" startupFile
 	option add Vic.quality "0" startupFile
 	option add Vic.inputType "ntsc" startupFile
-	option add Vic.scalerCompResolution "none" startupFile
+	option add Vic.scalerCapResolution "none" startupFile
 
 	option add Vic.brightness "128" startupFile
 	option add Vic.contrast "128" startupFile

Modified: vic/branches/mpeg4/tcl/ui-util.tcl
==============================================================================
--- vic/branches/mpeg4/tcl/ui-util.tcl	(original)
+++ vic/branches/mpeg4/tcl/ui-util.tcl	Sun Dec 12 14:12:32 2010
@@ -368,6 +368,22 @@
 					puts "			</sizes>"
 				}
 
+				if [device_supports $v capture_resolution *] {
+					set resolutionList [attribute_class [$v attributes] capture_resolution]
+					if {[llength $resolutionList] == 0} {
+						puts "			<capture_resolutions />"
+					} else {
+						puts "			<capture_resolutions>"
+						foreach resolution $resolutionList {
+							set resolution [string map {"<" "&lt;"  ">" "&gt;"  "&" "&amp;"  "\"" "&quot;"  "'" "&apos;"} $resolution]
+							puts "				<capture_resolution>$resolution</capture_resolution>"
+						}
+						puts "			</capture_resolutions>"
+					}
+				} else {
+						puts "			<capture_resolutions />"
+				}
+
 				# for the moment only the Blackmagick DeckLink grabber has a scaler
 				if { [string first "Blackmagic-" "[$v nickname]"] == -1 } {
 					puts "			<scaler />"

Modified: vic/branches/mpeg4/video/device-input.h
==============================================================================
--- vic/branches/mpeg4/video/device-input.h	(original)
+++ vic/branches/mpeg4/video/device-input.h	Sun Dec 12 14:12:32 2010
@@ -48,11 +48,12 @@
  */
 class InputDevice : public TclObject {
  public:
-	InputDevice(const char* name);
+	InputDevice(const char* name, const char* api="");
 	virtual int command(int argc, const char*const* argv);
  protected:
 	void inception();
 	const char* nickname_;
+	const char* api_;
 	const char* attributes_;
 };
 

Modified: vic/branches/mpeg4/video/device-output.h
==============================================================================
--- vic/branches/mpeg4/video/device-output.h	(original)
+++ vic/branches/mpeg4/video/device-output.h	Sun Dec 12 14:12:32 2010
@@ -38,11 +38,12 @@
  */
 class OutputDevice : public TclObject {
  public:
-	OutputDevice(const char* nickname);
+	OutputDevice(const char* nickname, const char *api="");
 	virtual int command(int argc, const char*const* argv);
  protected:
 	void inception();
 	const char* nickname_;
+	const char* api_;
 	const char* attributes_;
 };
 

Modified: vic/branches/mpeg4/video/device.cpp
==============================================================================
--- vic/branches/mpeg4/video/device.cpp	(original)
+++ vic/branches/mpeg4/video/device.cpp	Sun Dec 12 14:12:32 2010
@@ -36,8 +36,8 @@
 #include "device-input.h"
 #include "device-output.h"
 
-InputDevice::InputDevice(const char* nickname) 
-	: nickname_(nickname), attributes_("")
+InputDevice::InputDevice(const char* nickname, const char* api) 
+	: nickname_(nickname), api_(api), attributes_("")
 {
 }
 
@@ -54,6 +54,10 @@
 			tcl.result(nickname_);
 			return (TCL_OK);
 		}
+		if (strcmp(argv[1], "api") == 0) {
+			tcl.result(api_);
+			return (TCL_OK);
+		}
 		if (strcmp(argv[1], "attributes") == 0) {
 			tcl.result(attributes_);
 			return (TCL_OK);
@@ -62,8 +66,8 @@
 	return (TclObject::command(argc, argv));
 }
 
-OutputDevice::OutputDevice(const char* nickname)
-	: nickname_(nickname), attributes_("")
+OutputDevice::OutputDevice(const char* nickname, const char* api)
+	: nickname_(nickname), api_(api), attributes_("")
 {
 }
 
@@ -80,6 +84,10 @@
 			tcl.result(nickname_);
 			return (TCL_OK);
 		}
+		if (strcmp(argv[1], "api") == 0) {
+			tcl.result(api_);
+			return (TCL_OK);
+		}
 		if (strcmp(argv[1], "attributes") == 0) {
 			tcl.result(attributes_);
 			return (TCL_OK);

Modified: vic/branches/mpeg4/video/grabber-decklink.cpp
==============================================================================
--- vic/branches/mpeg4/video/grabber-decklink.cpp	(original)
+++ vic/branches/mpeg4/video/grabber-decklink.cpp	Sun Dec 12 14:12:32 2010
@@ -759,21 +759,21 @@
     HRESULT result;
     int flags = TCL_GLOBAL_ONLY;
     Tcl& tcl = Tcl::instance();
-    const char* scalerCompResolution = Tcl_GetVar(tcl.interp(), "scalerCompResolution", flags);
+    const char* scalerCapResolution = Tcl_GetVar(tcl.interp(), "scalerCapResolution", flags);
 
     // Set the image size.
     switch (decimate_) {
     case 1: // large-size
-        if (strcmp(scalerCompResolution, "960p") == 0) {
+        if (strcmp(scalerCapResolution, "960p") == 0) {
             width_ = int(960 * displayModeWidth_ / displayModeHeight_);
             height_ = 960;
-        } else if (strcmp(scalerCompResolution, "720p") == 0) {
+        } else if (strcmp(scalerCapResolution, "720p") == 0) {
             width_ = int(720 * displayModeWidth_ / displayModeHeight_);
             height_ = 720;
-        } else if (strcmp(scalerCompResolution, "576p") == 0) {
+        } else if (strcmp(scalerCapResolution, "576p") == 0) {
           width_ = int(576 * displayModeWidth_ / displayModeHeight_);
           height_ = 576;
-        } else if (strcmp(scalerCompResolution, "480p") == 0) {
+        } else if (strcmp(scalerCapResolution, "480p") == 0) {
           width_ = int(480 * displayModeWidth_ / displayModeHeight_);
           height_ = 480;
         } else {

Modified: vic/branches/mpeg4/video/grabber-win32DS.cpp
==============================================================================
--- vic/branches/mpeg4/video/grabber-win32DS.cpp	(original)
+++ vic/branches/mpeg4/video/grabber-win32DS.cpp	Sun Dec 12 14:12:32 2010
@@ -124,6 +124,8 @@
 #include <stdlib.h>
 #include "config.h"
 #include <windows.h>
+#include <set>
+using namespace std;
 
 #include "debug.h"
 #include "grabber.h"
@@ -218,6 +220,7 @@
    capturing_=0;
    max_fps_ = 30;
    memset(inputPorts, 0, NUM_PORTS);
+   memset(captureResolutions, 0, NUM_CAPTURE_RESOLUTIONS * sizeof(SIZE));
        
    numInputPorts = 0;
    initializedPorts = 0;
@@ -714,8 +717,15 @@
 void DirectShowGrabber::setsize() {
 
    if (decimate_ == 1 && !have_DVSD_){  //i.e. Large
-       width_ = max_width_;
-       height_ = max_height_;
+	   int flags = TCL_GLOBAL_ONLY;
+	   Tcl& tcl = Tcl::instance();
+	   const char* capResolution = Tcl_GetVar(tcl.interp(), "capResolution", flags);
+	   if (capResolution) {
+		   sscanf(capResolution, "%ix%i", &width_, &height_);
+	   } else {
+		   width_  = 640;
+		   height_ = 480;
+	   }
    } else {
        width_ = basewidth_  / decimate_;
        height_ = baseheight_ / decimate_;
@@ -866,7 +876,9 @@
 }
 //--------------------------------
 
-int DirectShowGrabber::getCaptureCapabilities(int preferred_max_height) {
+static bool sizeComp(SIZE lhs, SIZE rhs) {return ((lhs.cy << 16) + lhs.cx) < ((rhs.cy << 16) + rhs.cx);}
+
+int DirectShowGrabber::getCaptureCapabilities() {
    IAMStreamConfig          *pConfig;
    AM_MEDIA_TYPE            *pmtConfig;
    int                      iCount;
@@ -875,6 +887,9 @@
    HRESULT                  hr;
    VIDEOINFOHEADER          *pVih;
 
+   bool(*fn_pt)(SIZE, SIZE) = sizeComp;
+   set<SIZE,bool(*)(SIZE, SIZE)> resolutionSet(fn_pt);
+
    pConfig   = NULL;
    hr        = pBuild_->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
                                      pCaptureFilter_, IID_IAMStreamConfig, (void**)&pConfig);
@@ -900,7 +915,8 @@
                    (pmtConfig->formattype == FORMAT_VideoInfo)         &&
                    (pmtConfig->cbFormat   >= sizeof (VIDEOINFOHEADER)) &&
                    (pmtConfig->pbFormat   != NULL)) {
-                       if(scc.MaxOutputSize.cy > max_height_ && scc.MaxOutputSize.cy <= preferred_max_height){
+					   resolutionSet.insert(scc.InputSize);
+                       if(scc.MaxOutputSize.cy > max_height_){
                            max_width_  = scc.MaxOutputSize.cx;
                            max_height_ =  scc.MaxOutputSize.cy;
                        }
@@ -938,11 +954,16 @@
            }
        }
    }
+   int i=0;
+   set<SIZE, bool(*)(SIZE, SIZE)>::iterator it;
+   for (it=resolutionSet.begin() ; it != resolutionSet.end() && i < NUM_CAPTURE_RESOLUTIONS; it++) {
+	  if (it->cy < NTSC_BASE_HEIGHT) continue; // ignore resolutions < 640p for Large capture
+	  captureResolutions[i].cx = it->cx;
+	  captureResolutions[i].cy = it->cy;
+	  i++;
+   }
    pConfig->Release();
 
-   if (min_height_>=NTSC_BASE_HEIGHT && preferred_max_height != 1080)
-       getCaptureCapabilities(1080);
-
    if (max_width_>0)
        return TRUE;
 
@@ -1092,6 +1113,17 @@
       if ( (curr_w != width_) || (curr_h != height_ )) {
            width_  = curr_w;
            height_ = curr_h;
+		   switch (cformat_) {
+		   case CF_CIF:
+			   set_size_cif(width_, height_);
+			   break;
+		   case CF_420:
+			   set_size_420(width_, height_);
+			   break;
+		   case CF_422:
+			   set_size_422(width_, height_);
+			   break;
+		   }
            debug_msg("DirectShowGrabber::setCaptureOutputFormat:  format set to near res: %dx%d\n",width_,height_);
       } else
            debug_msg("DirectShowGrabber::setCaptureOutputFormat:  format set\n");
@@ -1174,7 +1206,7 @@
 //#########################################################################
 // DirectShowDevice class
 
-DirectShowDevice::DirectShowDevice(char *friendlyName, IBaseFilter *pCapFilt) : InputDevice(friendlyName) {
+DirectShowDevice::DirectShowDevice(char *friendlyName, IBaseFilter *pCapFilt) : InputDevice(friendlyName, "directshow") {
 
     attri_ = new char[255];
     attri_[0] = 0;
@@ -1206,13 +1238,24 @@
     }else{
         StringCbCatA(attri_, 255, "external-in ");
     }
+	StringCbCatA(attri_, 255, "} ");
     debug_msg("new DirectShowDevice():  after appending ports\n");
 
-    StringCbCatA(attri_, 255, "} ");
+	SIZE *captureResolutions = o.getCaptureResolutions();
+    if(captureResolutions[0].cx != 0) {
+		StringCbCatA(attri_, 255, "capture_resolution {");
+        int i=0;
+        while( i <  NUM_CAPTURE_RESOLUTIONS && captureResolutions[i].cx != 0 ) {
+			StringCbPrintfA(attri_, 255, "%s %ix%i", attri_, captureResolutions[i].cx, captureResolutions[i].cy);
+            i++;
+        }
+		StringCbCatA(attri_, 255, "} ");
+    }
 
     char *inport = o.getInputPort();
     StringCbPrintfA(attri_, 255, "%s selected_port { %s }", attri_, inport );
     free(inport);
+
     attributes_ = attri_;
     debug_msg("attributes: %s", attributes_);
 }
@@ -1233,10 +1276,52 @@
         if (o != 0)
             Tcl::instance().result(o->name());
         return (TCL_OK);
-    }
+    } else if (argc == 2) {
+		if (strcmp(argv[1], "api") == 0) {
+			tcl.result(api_);
+			return (TCL_OK);
+		} else if (strcmp(argv[1], "properties") == 0) {
+			DisplayPropertyPage();
+            return TCL_OK;
+		}
+	}
     return (InputDevice::command(argc, argv));
 }
 
+// This fn displays the custom Property page to set something
+bool DirectShowDevice::DisplayPropertyPage() {
+	bool Done = false;
+
+	ISpecifyPropertyPages *pProp;
+	HRESULT hr = pDirectShowFilter_->QueryInterface(IID_ISpecifyPropertyPages, (void **)&pProp);
+	if (SUCCEEDED(hr))  {
+		IUnknown *pFilterUnk;
+		pDirectShowFilter_->QueryInterface(IID_IUnknown, (void **)&pFilterUnk);
+
+		// Show the page.
+		CAUUID caGUID;
+		pProp->GetPages(&caGUID);
+		pProp->Release();
+		OleCreatePropertyFrame(
+			NULL,                   // Parent window
+			0, 0,                   // Reserved
+			NULL,                   // Caption for the dialog box
+			1,                      // Number of objects (just the filter)
+			&pFilterUnk,            // Array of object pointers.
+			caGUID.cElems,          // Number of property pages
+			caGUID.pElems,          // Array of property page CLSIDs
+			0,                      // Locale identifier
+			0, NULL                 // Reserved
+		);
+
+		// Clean up.
+		pFilterUnk->Release();
+		CoTaskMemFree(caGUID.pElems);
+		Done = true;
+	}
+	return Done;
+}
+
 //#########################################################################
 // DirectShowScanner class
 

Modified: vic/branches/mpeg4/video/grabber-win32DS.h
==============================================================================
--- vic/branches/mpeg4/video/grabber-win32DS.h	(original)
+++ vic/branches/mpeg4/video/grabber-win32DS.h	Sun Dec 12 14:12:32 2010
@@ -76,6 +76,7 @@
 
 #define NUM_DEVS 20   // max number of capture devices we'll support
 #define NUM_PORTS 20  // max number of ports on a capture device
+#define NUM_CAPTURE_RESOLUTIONS 20 // max number of capture resolutions of a capture device
 
 //#define showErrorMessage(x)   ShowErrorMessage(x, __LINE__, __FILE__)
 
@@ -148,6 +149,12 @@
 		  return min_height_;
 	  }
 
+	  SIZE *	   getCaptureResolutions(){
+		  return captureResolutions;
+	  }
+	  char *		getInputResolution(){
+		  return strdup(capture_resolution_);
+	  }
 	  Port **	   getInputPorts(){
 		  return inputPorts;
 	  }
@@ -163,7 +170,7 @@
       virtual void setsize();
       virtual int  grab();
       void         setport(const char *port);
-      int          getCaptureCapabilities(int preferred_max_height=720);
+      int          getCaptureCapabilities();
       virtual void setCaptureOutputFormat();
 
       int          useconfig_;
@@ -178,6 +185,9 @@
       int          height_;
       int          cformat_;
 
+      SIZE         captureResolutions[NUM_CAPTURE_RESOLUTIONS];
+      int          numCaptureResolutions;
+
       Port *       inputPorts[NUM_PORTS];
       int          numInputPorts;
       int          initializedPorts;
@@ -214,6 +224,7 @@
       IAMCrossbar            *pXBar_;
       Crossbar               *crossbar_;
       Crossbar               *crossbarCursor_;
+      char                   capture_resolution_[20];
       char                   input_port_[20];
       bool                   findCrossbar(IBaseFilter *);
       void                   addCrossbar(IAMCrossbar *);
@@ -262,6 +273,8 @@
       virtual int command(int argc, const char* const* argv);     
 
    protected:
+      bool DisplayPropertyPage();
+
       IBaseFilter*           pDirectShowFilter_;
 
       //IBaseFilter       *directShowFilter_;



More information about the Sumover-dev mailing list