public async Task TakeMultiplePicturesFromSplitterComponent() { // This test relies on an ISP component being connected between a splitter component output port // and an image encoder input port. If the ISP component is not used as a go-between, the splitter // component appears to only accept 1 of its output ports being connected to an image encoder. I believe // this may be a firmware restriction. TestHelper.BeginTest("TakeMultiplePicturesFromSplitterComponent"); TestHelper.SetConfigurationDefaults(); TestHelper.CleanDirectory("/home/pi/images/tests"); using (var imgCaptureHandler = new ImageStreamCaptureHandler("/home/pi/images/tests", "jpg")) using (var imgCaptureHandler2 = new ImageStreamCaptureHandler("/home/pi/images/tests", "jpg")) using (var imgCaptureHandler3 = new ImageStreamCaptureHandler("/home/pi/images/tests", "jpg")) using (var imgCaptureHandler4 = new ImageStreamCaptureHandler("/home/pi/images/tests", "jpg")) using (var imgEncoder = new MMALImageEncoder()) using (var imgEncoder2 = new MMALImageEncoder()) using (var imgEncoder3 = new MMALImageEncoder()) using (var imgEncoder4 = new MMALImageEncoder()) using (var splitter = new MMALSplitterComponent()) using (var isp1 = new MMALIspComponent()) using (var isp2 = new MMALIspComponent()) using (var isp3 = new MMALIspComponent()) using (var isp4 = new MMALIspComponent()) using (var nullSink = new MMALNullSinkComponent()) { Fixture.MMALCamera.ConfigureCameraSettings(); var portConfig = new MMALPortConfig(MMALEncoding.JPEG, MMALEncoding.I420, quality: 90); var portConfig2 = new MMALPortConfig(MMALEncoding.JPEG, MMALEncoding.I420, quality: 90); var portConfig3 = new MMALPortConfig(MMALEncoding.JPEG, MMALEncoding.I420, quality: 90); var portConfig4 = new MMALPortConfig(MMALEncoding.JPEG, MMALEncoding.I420, quality: 90); var splitterConfig = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420); var resizeConfig = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420, width: 1280, height: 720); var resizeConfig2 = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420, width: 1024, height: 720); var resizeConfig3 = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420, width: 640, height: 480); var resizeConfig4 = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420, width: 620, height: 310); // Create our component pipeline. splitter.ConfigureOutputPort <SplitterStillPort>(0, splitterConfig, null); splitter.ConfigureOutputPort <SplitterStillPort>(1, splitterConfig, null); splitter.ConfigureOutputPort <SplitterStillPort>(2, splitterConfig, null); splitter.ConfigureOutputPort <SplitterStillPort>(3, splitterConfig, null); isp1.ConfigureOutputPort(resizeConfig, null); isp2.ConfigureOutputPort(resizeConfig2, null); isp3.ConfigureOutputPort(resizeConfig3, null); isp4.ConfigureOutputPort(resizeConfig4, null); imgEncoder.ConfigureOutputPort(portConfig, imgCaptureHandler); imgEncoder2.ConfigureOutputPort(portConfig2, imgCaptureHandler2); imgEncoder3.ConfigureOutputPort(portConfig3, imgCaptureHandler3); imgEncoder4.ConfigureOutputPort(portConfig4, imgCaptureHandler4); Fixture.MMALCamera.Camera.StillPort.ConnectTo(splitter); Fixture.MMALCamera.Camera.PreviewPort.ConnectTo(nullSink); splitter.Outputs[0].ConnectTo(isp1); splitter.Outputs[1].ConnectTo(isp2); splitter.Outputs[2].ConnectTo(isp3); splitter.Outputs[3].ConnectTo(isp4); isp1.Outputs[0].ConnectTo(imgEncoder); isp2.Outputs[0].ConnectTo(imgEncoder2); isp3.Outputs[0].ConnectTo(imgEncoder3); isp4.Outputs[0].ConnectTo(imgEncoder4); // Camera warm up time await Task.Delay(2000); await Fixture.MMALCamera.ProcessAsync(Fixture.MMALCamera.Camera.StillPort); Fixture.CheckAndAssertFilepath(imgCaptureHandler.GetFilepath()); Fixture.CheckAndAssertFilepath(imgCaptureHandler2.GetFilepath()); Fixture.CheckAndAssertFilepath(imgCaptureHandler3.GetFilepath()); Fixture.CheckAndAssertFilepath(imgCaptureHandler4.GetFilepath()); } }
public async Task UserProvidedPortName() { TestHelper.BeginTest("UserProvidedPortName"); TestHelper.SetConfigurationDefaults(); TestHelper.CleanDirectory("/home/pi/images/tests"); using (var imgCaptureHandler = new ImageStreamCaptureHandler("/home/pi/images/tests", "jpg")) using (var imgCaptureHandler2 = new ImageStreamCaptureHandler("/home/pi/images/tests", "jpg")) using (var imgCaptureHandler3 = new ImageStreamCaptureHandler("/home/pi/images/tests", "jpg")) using (var imgCaptureHandler4 = new ImageStreamCaptureHandler("/home/pi/images/tests", "jpg")) using (var imgEncoder = new MMALImageEncoder()) using (var imgEncoder2 = new MMALImageEncoder()) using (var imgEncoder3 = new MMALImageEncoder()) using (var imgEncoder4 = new MMALImageEncoder()) using (var splitter = new MMALSplitterComponent()) using (var isp1 = new MMALIspComponent()) using (var isp2 = new MMALIspComponent()) using (var isp3 = new MMALIspComponent()) using (var isp4 = new MMALIspComponent()) using (var nullSink = new MMALNullSinkComponent()) { Fixture.MMALCamera.ConfigureCameraSettings(); var portConfig = new MMALPortConfig(MMALEncoding.JPEG, MMALEncoding.I420, quality: 90, userPortName: "Image encoder 1"); var portConfig2 = new MMALPortConfig(MMALEncoding.JPEG, MMALEncoding.I420, quality: 90, userPortName: "Image encoder 2"); var portConfig3 = new MMALPortConfig(MMALEncoding.JPEG, MMALEncoding.I420, quality: 90, userPortName: "Image encoder 3"); var portConfig4 = new MMALPortConfig(MMALEncoding.JPEG, MMALEncoding.I420, quality: 90, userPortName: "Image encoder 4"); var splitterConfig = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420); var resizeConfig = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420, width: 1280, height: 720); var resizeConfig2 = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420, width: 1024, height: 720); var resizeConfig3 = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420, width: 640, height: 480); var resizeConfig4 = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420, width: 620, height: 310); // Create our component pipeline. splitter.ConfigureOutputPort <SplitterStillPort>(0, splitterConfig, null); splitter.ConfigureOutputPort <SplitterStillPort>(1, splitterConfig, null); splitter.ConfigureOutputPort <SplitterStillPort>(2, splitterConfig, null); splitter.ConfigureOutputPort <SplitterStillPort>(3, splitterConfig, null); isp1.ConfigureOutputPort(resizeConfig, null); isp2.ConfigureOutputPort(resizeConfig2, null); isp3.ConfigureOutputPort(resizeConfig3, null); isp4.ConfigureOutputPort(resizeConfig4, null); imgEncoder.ConfigureOutputPort(portConfig, imgCaptureHandler); imgEncoder2.ConfigureOutputPort(portConfig2, imgCaptureHandler2); imgEncoder3.ConfigureOutputPort(portConfig3, imgCaptureHandler3); imgEncoder4.ConfigureOutputPort(portConfig4, imgCaptureHandler4); Fixture.MMALCamera.Camera.StillPort.ConnectTo(splitter); Fixture.MMALCamera.Camera.PreviewPort.ConnectTo(nullSink); splitter.Outputs[0].ConnectTo(isp1); splitter.Outputs[1].ConnectTo(isp2); splitter.Outputs[2].ConnectTo(isp3); splitter.Outputs[3].ConnectTo(isp4); isp1.Outputs[0].ConnectTo(imgEncoder); isp2.Outputs[0].ConnectTo(imgEncoder2); isp3.Outputs[0].ConnectTo(imgEncoder3); isp4.Outputs[0].ConnectTo(imgEncoder4); // Camera warm up time await Task.Delay(2000); await Fixture.MMALCamera.ProcessAsync(Fixture.MMALCamera.Camera.StillPort); Fixture.CheckAndAssertFilepath(imgCaptureHandler.GetFilepath()); Fixture.CheckAndAssertFilepath(imgCaptureHandler2.GetFilepath()); Fixture.CheckAndAssertFilepath(imgCaptureHandler3.GetFilepath()); Fixture.CheckAndAssertFilepath(imgCaptureHandler4.GetFilepath()); } }
public async Task StaticOverlay() { TestHelper.BeginTest("StaticOverlay"); TestHelper.SetConfigurationDefaults(); TestHelper.CleanDirectory("/home/pi/images/tests"); TestHelper.CleanDirectory("/home/pi/images/tests/staticoverlay"); MMALCameraConfig.Resolution = Resolution.As03MPixel; MMALCameraConfig.Encoding = MMALEncoding.I420; MMALCameraConfig.EncodingSubFormat = MMALEncoding.I420; var filename = string.Empty; using (var imgCaptureHandler = new ImageStreamCaptureHandler("/home/pi/images/tests/staticoverlay", "raw")) { await Fixture.MMALCamera.TakeRawPicture(imgCaptureHandler); filename = imgCaptureHandler.GetFilepath(); } PreviewConfiguration previewConfig = new PreviewConfiguration { FullScreen = false, PreviewWindow = new Rectangle(160, 0, 640, 480), Layer = 2, Opacity = 1 }; MMALCameraConfig.Resolution = Resolution.As1080p; MMALCameraConfig.Encoding = MMALEncoding.OPAQUE; using (var imgCaptureHandler = new ImageStreamCaptureHandler("/home/pi/images/tests", "jpg")) using (var imgEncoder = new MMALImageEncoder()) using (var video = new MMALVideoRenderer(previewConfig)) { Fixture.MMALCamera.ConfigureCameraSettings(); video.ConfigureRenderer(); PreviewOverlayConfiguration overlayConfig = new PreviewOverlayConfiguration { FullScreen = true, PreviewWindow = new Rectangle(50, 0, 640, 480), Layer = 1, Resolution = new Resolution(640, 480), Encoding = MMALEncoding.I420, Opacity = 255 }; var overlay = Fixture.MMALCamera.AddOverlay(video, overlayConfig, File.ReadAllBytes(filename)); overlay.ConfigureRenderer(); overlay.UpdateOverlay(); // Create our component pipeline. var portConfig = new MMALPortConfig(MMALEncoding.JPEG, MMALEncoding.I420, quality: 90); imgEncoder.ConfigureOutputPort(portConfig, imgCaptureHandler); Fixture.MMALCamera.Camera.StillPort.ConnectTo(imgEncoder); Fixture.MMALCamera.Camera.PreviewPort.ConnectTo(video); Fixture.MMALCamera.PrintPipeline(); await Fixture.MMALCamera.ProcessAsync(Fixture.MMALCamera.Camera.StillPort); if (File.Exists(imgCaptureHandler.GetFilepath())) { var length = new FileInfo(imgCaptureHandler.GetFilepath()).Length; Assert.True(length > 0); } else { Assert.True(false, $"File {imgCaptureHandler.GetFilepath()} was not created"); } } }