summaryrefslogtreecommitdiff
path: root/src/test/checkcamera.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/checkcamera.py')
-rwxr-xr-xsrc/test/checkcamera.py225
1 files changed, 225 insertions, 0 deletions
diff --git a/src/test/checkcamera.py b/src/test/checkcamera.py
new file mode 100755
index 0000000..1146679
--- /dev/null
+++ b/src/test/checkcamera.py
@@ -0,0 +1,225 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# libavg - Media Playback Engine.
+# Copyright (C) 2003-2014 Ulrich von Zadow
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Current versions can be found at www.libavg.de
+#
+# Original author of this file is Robert Parcus <betoparcus@gmail.com>
+#
+
+from libavg import *
+import camcfgs
+import optparse
+
+from testcase import *
+
+def parseCmdLine():
+ global g_TestParams
+
+ validCameras = ('Dragonfly', 'FireflyMV', 'Firei', 'DFx31BF03', 'QuickCamProLinux',
+ 'QuickCamProBGRWin', 'QuickCamPro9Win')
+ parser = optparse.OptionParser(usage=
+"""%prog cameraname [option].
+A test to check camera features support by libavg. Supported cameras are """
++ str(validCameras))
+# parser.add_argument(dest='camera', action='store', type=str,
+# choices=validCameras, help = 'Select which camera model to test.')
+ parser.add_option('--test-params', '-p', dest='testParams', action='store_true',
+ default=False,
+ help='Execute optional tests for camera params like gain, shutter, etc.')
+ (options, args) = parser.parse_args()
+ g_TestParams = options.testParams
+ if len(args) != 1:
+ parser.error("Must be invoked with camera name as argument")
+ cameraName = args[0]
+ if cameraName == 'Dragonfly':
+ return camcfgs.Dragonfly2
+ elif cameraName == 'FireflyMV':
+ return camcfgs.FireflyMV
+ elif cameraName == 'Firei':
+ return camcfgs.Firei
+ elif cameraName == 'DFx31BF03':
+ return camcfgs.DFx31BF03Cfg
+ elif cameraName == 'QuickCamProLinux':
+ return camcfgs.QuickCamProLinux
+ elif cameraName == 'QuickCamPro9Win':
+ return camcfgs.QuickCamPro9Win
+ elif cameraName == 'QuickCamProBGRWin':
+ return camcfgs.QuickCamProBGRWin
+ else:
+ parser.error("Unknown camera name '" + cameraName + "'.")
+
+class CameraTestCase(AVGTestCase):
+ def __init__(self, cameraCfg, fmt, testFuncName, *testFuncArgs):
+ self.cameraCfg = cameraCfg
+ self.fmt = fmt
+ self.testFuncArgs = testFuncArgs
+ AVGTestCase.__init__(self, testFuncName)
+
+ def testFormat(self):
+ self.__dumpFormat()
+ self.loadEmptyScene()
+ self.__openCamera()
+ self.actions = [None, None]
+ avg.player.setOnFrameHandler(self.__onFrame)
+ avg.player.play()
+ self.assertEqual(self.cam.framenum, 2)
+ self.cam = None
+
+ def testIllegalFormat(self):
+ self.loadEmptyScene()
+ self.assertException(lambda: self.__openCamera())
+
+ def testCreateDelete(self):
+ # Create and delete without ever calling play.
+ self.__openCamera()
+ self.cam.unlink(True)
+
+ def testParams(self):
+ def buildParamActionList(testCfg):
+ actions = []
+ actions.append(setDefaultParams)
+ actions.append(None)
+ for val in testCfg.testValues:
+ actions.append(lambda paramName=testCfg.name, val=val:
+ setCamParam(paramName, val))
+ actions.append(None)
+ actions.append(None)
+ actions.append(None)
+ actions.append(lambda name=testCfg.name: calcCamImgAverage(name))
+ actions.append(lambda testCfg=testCfg: checkCamImageChange(testCfg))
+ return actions
+
+ def setDefaultParams():
+ for (paramName, val) in cameraCfg.defaultParams.iteritems():
+ if paramName == "setWhitebalance":
+ self.cam.setWhitebalance(*val)
+ else:
+ setattr(self.cam, paramName, val)
+
+ def setCamParam(paramName, val):
+ if paramName == 'setwhitebalance':
+ self.cam.setWhitebalance(*val)
+ else:
+ setattr(self.cam, paramName, val)
+
+ def calcCamImgAverage(param):
+ bmp = self.cam.getBitmap()
+ self.camBmps.append(bmp)
+ if isColorParam(param):
+ colour = []
+ colour.append(bmp.getChannelAvg(0))
+ colour.append(bmp.getChannelAvg(1))
+ colour.append(bmp.getChannelAvg(2))
+ self.averages.append(colour)
+ else:
+ self.averages.append(bmp.getAvg())
+
+ def checkCamImageChange(testCfg):
+
+ def saveCamImages():
+# print
+# print "Average image brightnesses: ",minAverages, medAverages, maxAverages
+ dir = AVGTestCase.getImageResultDir()
+ for (i, category) in enumerate(("min", "med", "max")):
+ self.camBmps[i].save(dir+"/cam"+testCfg.name+category+".png")
+
+ minAverages = self.averages[0]
+ medAverages = self.averages[1]
+ maxAverages = self.averages[2]
+ ok = False
+ if isColorParam(testCfg.name):
+ pass
+ else:
+ if minAverages+testCfg.minMedDiff > medAverages:
+ saveCamImages()
+ self.fail()
+ if medAverages+testCfg.medMaxDiff > maxAverages:
+ saveCamImages()
+ self.fail()
+ self.averages = []
+ self.camBmps = []
+
+ def isColorParam(paramName):
+ return paramName in ['saturation', 'setwhitebalance']
+
+ testCfg = self.testFuncArgs[0]
+ print >>sys.stderr, testCfg.name, " ",
+ self.loadEmptyScene()
+ self.__openCamera()
+ self.actions = buildParamActionList(testCfg)
+ avg.player.setOnFrameHandler(self.__onFrame)
+ self.averages = []
+ self.camBmps = []
+ avg.player.play()
+ self.cam = None
+
+ def __openCamera(self):
+ self.cam = avg.CameraNode(driver=self.cameraCfg.driver,
+ device=self.cameraCfg.device, unit=self.cameraCfg.unit,
+ fw800=self.cameraCfg.fw800, framerate=self.fmt.framerate,
+ capturewidth=self.fmt.size[0], captureheight=self.fmt.size[1],
+ pixelformat=self.fmt.pixelformat,
+ parent=avg.player.getRootNode())
+ self.cam.play()
+ self.lastCameraFrame = -1
+ self.assert_(self.cam.isAvailable())
+
+ def __onFrame(self):
+ # We execute one action per camera frame.
+# print self.cam.framenum
+ if self.cam.framenum != self.lastCameraFrame:
+ self.lastCameraFrame += 1
+ if len(self.actions) == self.lastCameraFrame:
+ avg.player.stop()
+ else:
+ action = self.actions[self.lastCameraFrame]
+ if action != None:
+ action()
+
+ def __dumpFormat(self):
+ print >>sys.stderr, str(self.fmt.size)+", "+str(self.fmt.pixelformat)+ \
+ ", "+str(self.fmt.framerate)+" ",
+
+def dumpCameraCfg(cfg):
+ print >>sys.stderr, "Camera config: driver="+cfg.driver+", device="+cfg.device+ \
+ ", unit="+str(cfg.unit)
+
+
+cameraCfg = parseCmdLine()
+AVGTestCase.cleanResultDir()
+suite = unittest.TestSuite()
+dumpCameraCfg(cameraCfg)
+for fmt in cameraCfg.formats:
+ suite.addTest(CameraTestCase(cameraCfg, fmt, "testFormat"))
+suite.addTest(CameraTestCase(cameraCfg, cameraCfg.illegalFormat, "testIllegalFormat"))
+suite.addTest(CameraTestCase(cameraCfg, cameraCfg.formats[0], "testCreateDelete"))
+if g_TestParams:
+ for testCfg in cameraCfg.paramTests:
+ suite.addTest(CameraTestCase(cameraCfg, cameraCfg.formats[0], "testParams",
+ testCfg))
+testRunner = unittest.TextTestRunner(verbosity = 2)
+testResult = testRunner.run(suite)
+
+if testResult.wasSuccessful():
+ exitCode = 0
+else:
+ exitCode = 1
+sys.exit(exitCode)
+
+