public async Task VideoSplitterComponent() { TestHelper.BeginTest("VideoSplitterComponent"); TestHelper.SetConfigurationDefaults(); TestHelper.CleanDirectory("/home/pi/videos/tests"); using (var handler = new VideoStreamCaptureHandler("/home/pi/videos/tests", "h264")) using (var handler2 = new VideoStreamCaptureHandler("/home/pi/videos/tests", "h264")) using (var handler3 = new VideoStreamCaptureHandler("/home/pi/videos/tests", "h264")) using (var handler4 = new VideoStreamCaptureHandler("/home/pi/videos/tests", "h264")) using (var splitter = new MMALSplitterComponent(null)) using (var vidEncoder = new MMALVideoEncoder(handler)) using (var vidEncoder2 = new MMALVideoEncoder(handler2)) using (var vidEncoder3 = new MMALVideoEncoder(handler3)) using (var vidEncoder4 = new MMALVideoEncoder(handler4)) using (var renderer = new MMALNullSinkComponent()) { Fixture.MMALCamera.ConfigureCameraSettings(); var splitterPortConfig = new MMALPortConfig(MMALEncoding.OPAQUE, MMALEncoding.I420, 10, 0, 13000000, null); var portConfig1 = new MMALPortConfig(MMALEncoding.H264, MMALEncoding.I420, 10, 10, 13000000, DateTime.Now.AddSeconds(20)); var portConfig2 = new MMALPortConfig(MMALEncoding.H264, MMALEncoding.I420, 10, 20, 13000000, DateTime.Now.AddSeconds(15)); var portConfig3 = new MMALPortConfig(MMALEncoding.H264, MMALEncoding.I420, 25, 30, 13000000, DateTime.Now.AddSeconds(10)); var portConfig4 = new MMALPortConfig(MMALEncoding.H264, MMALEncoding.I420, 25, 40, 13000000, DateTime.Now.AddSeconds(10)); // Create our component pipeline. splitter.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, Fixture.MMALCamera.Camera.VideoPort); splitter.ConfigureOutputPort(0, splitterPortConfig); splitter.ConfigureOutputPort(1, splitterPortConfig); splitter.ConfigureOutputPort(2, splitterPortConfig); splitter.ConfigureOutputPort(3, splitterPortConfig); vidEncoder.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, splitter.Outputs[0]); vidEncoder.ConfigureOutputPort(0, portConfig1); vidEncoder2.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, splitter.Outputs[1]); vidEncoder2.ConfigureOutputPort(0, portConfig2); vidEncoder3.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, splitter.Outputs[2]); vidEncoder3.ConfigureOutputPort(0, portConfig3); vidEncoder4.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, splitter.Outputs[3]); vidEncoder4.ConfigureOutputPort(0, portConfig4); Fixture.MMALCamera.Camera.VideoPort.ConnectTo(splitter); splitter.Outputs[0].ConnectTo(vidEncoder); splitter.Outputs[1].ConnectTo(vidEncoder2); splitter.Outputs[2].ConnectTo(vidEncoder3); splitter.Outputs[3].ConnectTo(vidEncoder4); Fixture.MMALCamera.Camera.PreviewPort.ConnectTo(renderer); // Camera warm up time await Task.Delay(2000); await Fixture.MMALCamera.ProcessAsync(Fixture.MMALCamera.Camera.VideoPort); Fixture.CheckAndAssertFilepath(handler.GetFilepath()); Fixture.CheckAndAssertFilepath(handler2.GetFilepath()); Fixture.CheckAndAssertFilepath(handler3.GetFilepath()); Fixture.CheckAndAssertFilepath(handler4.GetFilepath()); } }
public void ChangeColorSpace() { TestHelper.BeginTest("ChangeColorSpace"); TestHelper.SetConfigurationDefaults(); TestHelper.CleanDirectory("/home/pi/videos/tests"); MMALCameraConfig.VideoColorSpace = MMALEncoding.MMAL_COLOR_SPACE_ITUR_BT601; using (var handler = new VideoStreamCaptureHandler("/home/pi/videos/tests", "h264")) using (var handler2 = new VideoStreamCaptureHandler("/home/pi/video/tests", "h264")) using (var handler3 = new VideoStreamCaptureHandler("/home/pi/video/tests", "h264")) using (var handler4 = new VideoStreamCaptureHandler("/home/pi/video/tests", "h264")) using (var splitter = new MMALSplitterComponent(null)) using (var vidEncoder = new MMALVideoEncoder(handler)) using (var vidEncoder2 = new MMALVideoEncoder(handler2)) using (var vidEncoder3 = new MMALVideoEncoder(handler3)) using (var vidEncoder4 = new MMALVideoEncoder(handler4)) using (var renderer = new MMALVideoRenderer()) { Fixture.MMALCamera.ConfigureCameraSettings(); var splitterPortConfig = new MMALPortConfig(MMALEncoding.OPAQUE, MMALEncoding.I420, 10, 0, 13000000, null); var portConfig1 = new MMALPortConfig(MMALEncoding.H264, MMALEncoding.I420, 10, 10, 13000000, DateTime.Now.AddSeconds(20)); var portConfig2 = new MMALPortConfig(MMALEncoding.H264, MMALEncoding.I420, 10, 20, 13000000, DateTime.Now.AddSeconds(15)); var portConfig3 = new MMALPortConfig(MMALEncoding.H264, MMALEncoding.I420, 25, 30, 13000000, DateTime.Now.AddSeconds(10)); var portConfig4 = new MMALPortConfig(MMALEncoding.H264, MMALEncoding.I420, 25, 40, 13000000, DateTime.Now.AddSeconds(10)); // Create our component pipeline. splitter.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, Fixture.MMALCamera.Camera.VideoPort); splitter.ConfigureOutputPort(0, splitterPortConfig); splitter.ConfigureOutputPort(1, splitterPortConfig); splitter.ConfigureOutputPort(2, splitterPortConfig); splitter.ConfigureOutputPort(3, splitterPortConfig); vidEncoder.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, splitter.Outputs[0]); vidEncoder.ConfigureOutputPort(0, portConfig1); vidEncoder2.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, splitter.Outputs[1]); vidEncoder2.ConfigureOutputPort(0, portConfig2); vidEncoder3.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, splitter.Outputs[2]); vidEncoder3.ConfigureOutputPort(0, portConfig3); vidEncoder4.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, splitter.Outputs[3]); vidEncoder4.ConfigureOutputPort(0, portConfig4); Fixture.MMALCamera.Camera.VideoPort.ConnectTo(splitter); splitter.Outputs[0].ConnectTo(vidEncoder); splitter.Outputs[1].ConnectTo(vidEncoder2); splitter.Outputs[2].ConnectTo(vidEncoder3); splitter.Outputs[3].ConnectTo(vidEncoder4); Fixture.MMALCamera.Camera.PreviewPort.ConnectTo(renderer); // Assert that all output ports have the same video color space. Assert.True(Fixture.MMALCamera.Camera.VideoPort.VideoColorSpace.EncodingVal == MMALEncoding.MMAL_COLOR_SPACE_ITUR_BT601.EncodingVal); Assert.True(splitter.Outputs[0].VideoColorSpace.EncodingVal == MMALEncoding.MMAL_COLOR_SPACE_ITUR_BT601.EncodingVal); Assert.True(splitter.Outputs[1].VideoColorSpace.EncodingVal == MMALEncoding.MMAL_COLOR_SPACE_ITUR_BT601.EncodingVal); Assert.True(splitter.Outputs[2].VideoColorSpace.EncodingVal == MMALEncoding.MMAL_COLOR_SPACE_ITUR_BT601.EncodingVal); Assert.True(splitter.Outputs[3].VideoColorSpace.EncodingVal == MMALEncoding.MMAL_COLOR_SPACE_ITUR_BT601.EncodingVal); Assert.True(vidEncoder.Outputs[0].VideoColorSpace.EncodingVal == MMALEncoding.MMAL_COLOR_SPACE_ITUR_BT601.EncodingVal); Assert.True(vidEncoder2.Outputs[0].VideoColorSpace.EncodingVal == MMALEncoding.MMAL_COLOR_SPACE_ITUR_BT601.EncodingVal); Assert.True(vidEncoder3.Outputs[0].VideoColorSpace.EncodingVal == MMALEncoding.MMAL_COLOR_SPACE_ITUR_BT601.EncodingVal); Assert.True(vidEncoder4.Outputs[0].VideoColorSpace.EncodingVal == MMALEncoding.MMAL_COLOR_SPACE_ITUR_BT601.EncodingVal); } }
public async Task Start(CancellationToken ct) { LogUtil.Write("Starting Camera..."); MMALCameraConfig.VideoStabilisation = false; var sensorMode = MMALSensorMode.Mode0; switch (camMode) { case 1: sensorMode = MMALSensorMode.Mode1; break; case 2: sensorMode = MMALSensorMode.Mode2; break; case 3: sensorMode = MMALSensorMode.Mode3; break; case 4: sensorMode = MMALSensorMode.Mode4; break; case 5: sensorMode = MMALSensorMode.Mode5; break; case 6: sensorMode = MMALSensorMode.Mode6; break; case 7: sensorMode = MMALSensorMode.Mode7; break; } MMALCameraConfig.SensorMode = sensorMode; MMALCameraConfig.ExposureMode = MMAL_PARAM_EXPOSUREMODE_T.MMAL_PARAM_EXPOSUREMODE_BACKLIGHT; MMALCameraConfig.VideoResolution = new Resolution(capWidth, capHeight); MMALCameraConfig.VideoFramerate = new MMAL_RATIONAL_T(60, 1); using var vidCaptureHandler = new EmguInMemoryCaptureHandler(); using var splitter = new MMALSplitterComponent(); using var renderer = new MMALNullSinkComponent(); cam.ConfigureCameraSettings(); LogUtil.Write("Cam mode is " + MMALCameraConfig.SensorMode); // Register to the event. vidCaptureHandler.MyEmguEvent += OnEmguEventCallback; // We are instructing the splitter to do a format conversion to BGR24. var splitterPortConfig = new MMALPortConfig(MMALEncoding.BGR24, MMALEncoding.BGR24, capWidth, capHeight, null); // By default in MMALSharp, the Video port outputs using proprietary communication (Opaque) with a YUV420 pixel format. // Changes to this are done via MMALCameraConfig.VideoEncoding and MMALCameraConfig.VideoSub format. splitter.ConfigureInputPort(new MMALPortConfig(MMALEncoding.OPAQUE, MMALEncoding.I420, capWidth, capHeight, null), cam.Camera.VideoPort, null); // We then use the splitter config object we constructed earlier. We then tell this output port to use our capture handler to record data. splitter.ConfigureOutputPort <SplitterVideoPort>(0, splitterPortConfig, vidCaptureHandler); cam.Camera.PreviewPort.ConnectTo(renderer); cam.Camera.VideoPort.ConnectTo(splitter); // Camera warm up time LogUtil.Write("Camera is warming up..."); await Task.Delay(2000).ConfigureAwait(false); LogUtil.WriteInc("Camera initialized."); await cam.ProcessAsync(cam.Camera.VideoPort, ct).ConfigureAwait(false); LogUtil.WriteDec("Camera closed."); }
public async Task RecordVideoDirectlyFromResizerWithSplitterComponent() { TestHelper.BeginTest("RecordVideoDirectlyFromResizerWithSplitterComponent"); TestHelper.SetConfigurationDefaults(); TestHelper.CleanDirectory("/home/pi/videos/tests"); using (var vidCaptureHandler = new VideoStreamCaptureHandler("/home/pi/videos/tests", "raw")) using (var vidCaptureHandler2 = new VideoStreamCaptureHandler("/home/pi/videos/tests", "raw")) using (var vidCaptureHandler3 = new VideoStreamCaptureHandler("/home/pi/videos/tests", "raw")) using (var vidCaptureHandler4 = new VideoStreamCaptureHandler("/home/pi/videos/tests", "raw")) using (var preview = new MMALVideoRenderer()) using (var splitter = new MMALSplitterComponent()) using (var resizer = new MMALResizerComponent()) using (var resizer2 = new MMALResizerComponent()) using (var resizer3 = new MMALResizerComponent()) using (var resizer4 = new MMALResizerComponent()) { Fixture.MMALCamera.ConfigureCameraSettings(); var splitterPortConfig = new MMALPortConfig(MMALEncoding.OPAQUE, MMALEncoding.I420, 0, 0, null); // Create our component pipeline. splitter.ConfigureInputPort(new MMALPortConfig(MMALEncoding.OPAQUE, MMALEncoding.I420, 0), Fixture.MMALCamera.Camera.VideoPort, null); splitter.ConfigureOutputPort(0, splitterPortConfig, null); splitter.ConfigureOutputPort(1, splitterPortConfig, null); splitter.ConfigureOutputPort(2, splitterPortConfig, null); splitter.ConfigureOutputPort(3, splitterPortConfig, null); var portConfig = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420, 1024, 768, 0, 0, 0, false, DateTime.Now.AddSeconds(20)); var portConfig2 = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420, 800, 600, 0, 0, 0, false, DateTime.Now.AddSeconds(20)); var portConfig3 = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420, 640, 480, 0, 0, 0, false, DateTime.Now.AddSeconds(15)); var portConfig4 = new MMALPortConfig(MMALEncoding.I420, MMALEncoding.I420, 320, 240, 0, 0, 0, false, DateTime.Now.AddSeconds(20)); resizer.ConfigureOutputPort <VideoPort>(0, portConfig, vidCaptureHandler); resizer2.ConfigureOutputPort <VideoPort>(0, portConfig2, vidCaptureHandler2); resizer3.ConfigureOutputPort <VideoPort>(0, portConfig3, vidCaptureHandler3); resizer4.ConfigureOutputPort <VideoPort>(0, portConfig4, vidCaptureHandler4); // Create our component pipeline. Fixture.MMALCamera.Camera.VideoPort .ConnectTo(splitter); splitter.Outputs[0].ConnectTo(resizer); splitter.Outputs[1].ConnectTo(resizer2); splitter.Outputs[2].ConnectTo(resizer3); splitter.Outputs[3].ConnectTo(resizer4); Fixture.MMALCamera.Camera.PreviewPort .ConnectTo(preview); // Camera warm up time await Task.Delay(2000); // Record video for 20 seconds await Fixture.MMALCamera.ProcessAsync(Fixture.MMALCamera.Camera.VideoPort); Fixture.CheckAndAssertFilepath(vidCaptureHandler.GetFilepath()); Fixture.CheckAndAssertFilepath(vidCaptureHandler2.GetFilepath()); Fixture.CheckAndAssertFilepath(vidCaptureHandler3.GetFilepath()); Fixture.CheckAndAssertFilepath(vidCaptureHandler4.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 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 void VideoSplitterComponent() { TestHelper.BeginTest("VideoSplitterComponent"); TestHelper.SetConfigurationDefaults(); AsyncContext.Run(async() => { TestHelper.CleanDirectory("/home/pi/videos/tests"); using (var handler = new VideoStreamCaptureHandler("/home/pi/videos/tests", "avi")) using (var handler2 = new VideoStreamCaptureHandler("/home/pi/video/tests", "avi")) using (var handler3 = new VideoStreamCaptureHandler("/home/pi/video/tests", "avi")) using (var handler4 = new VideoStreamCaptureHandler("/home/pi/video/tests", "avi")) using (var splitter = new MMALSplitterComponent(null)) using (var vidEncoder = new MMALVideoEncoder(handler, DateTime.Now.AddSeconds(10))) using (var vidEncoder2 = new MMALVideoEncoder(handler2, DateTime.Now.AddSeconds(15))) using (var vidEncoder3 = new MMALVideoEncoder(handler3, DateTime.Now.AddSeconds(10))) using (var vidEncoder4 = new MMALVideoEncoder(handler4, DateTime.Now.AddSeconds(10))) using (var renderer = new MMALVideoRenderer()) { _fixture.MMALCamera.ConfigureCameraSettings(); // Create our component pipeline. splitter.ConfigureInputPort(MMALEncoding.I420, MMALEncoding.I420, _fixture.MMALCamera.Camera.VideoPort); splitter.ConfigureOutputPort(0, MMALEncoding.OPAQUE, MMALEncoding.I420, 0); splitter.ConfigureOutputPort(1, MMALEncoding.OPAQUE, MMALEncoding.I420, 0); splitter.ConfigureOutputPort(2, MMALEncoding.OPAQUE, MMALEncoding.I420, 0); splitter.ConfigureOutputPort(3, MMALEncoding.OPAQUE, MMALEncoding.I420, 0); vidEncoder.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, splitter.Outputs[0]); vidEncoder.ConfigureOutputPort(0, MMALEncoding.H264, MMALEncoding.I420, 10, 25000000); vidEncoder2.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, splitter.Outputs[1]); vidEncoder2.ConfigureOutputPort(0, MMALEncoding.H264, MMALEncoding.I420, 20, 25000000); vidEncoder3.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, splitter.Outputs[2]); vidEncoder3.ConfigureOutputPort(0, MMALEncoding.H264, MMALEncoding.I420, 30, 25000000); vidEncoder4.ConfigureInputPort(MMALEncoding.OPAQUE, MMALEncoding.I420, splitter.Outputs[3]); vidEncoder4.ConfigureOutputPort(0, MMALEncoding.H264, MMALEncoding.I420, 40, 25000000); _fixture.MMALCamera.Camera.VideoPort.ConnectTo(splitter); splitter.Outputs[0].ConnectTo(vidEncoder); splitter.Outputs[1].ConnectTo(vidEncoder2); splitter.Outputs[2].ConnectTo(vidEncoder3); splitter.Outputs[3].ConnectTo(vidEncoder4); _fixture.MMALCamera.Camera.PreviewPort.ConnectTo(renderer); // Camera warm up time await Task.Delay(2000); await _fixture.MMALCamera.ProcessAsync(_fixture.MMALCamera.Camera.VideoPort); _fixture.CheckAndAssertFilepath(handler.GetFilepath()); _fixture.CheckAndAssertFilepath(handler2.GetFilepath()); _fixture.CheckAndAssertFilepath(handler3.GetFilepath()); _fixture.CheckAndAssertFilepath(handler4.GetFilepath()); } }); }