Inheritance: IPlaylistElement
        public void TestPropertiesProxy()
        {
            TimelineEvent evt = new TimelineEvent ();
            evt.Start = new Time (1000);
            evt.Stop = new Time (2000);
            evt.CamerasLayout = 1;
            evt.CamerasConfig = new List<CameraConfig> { new CameraConfig (2), new CameraConfig (4) };

            PlaylistPlayElement element = new PlaylistPlayElement (evt);

            Assert.AreEqual (evt.Duration, element.Duration);
            Assert.AreEqual (evt.CamerasLayout, element.CamerasLayout);
            Assert.AreEqual (evt.CamerasConfig, element.CamerasConfig);
            Assert.AreEqual (evt.Rate, element.Rate);
            Assert.AreEqual (evt.Name, element.Title);
        }
        public void TestSerialization()
        {
            TimelineEvent evt = new TimelineEvent ();
            evt.Start = new Time (1000);
            evt.Stop = new Time (2000);
            evt.CamerasLayout = 1;
            evt.CamerasConfig.Add (new CameraConfig (0));

            PlaylistPlayElement element = new PlaylistPlayElement (evt);
            Utils.CheckSerialization (element);

            PlaylistPlayElement element2 = Utils.SerializeDeserialize (element);
            Assert.AreEqual (element.Description, element2.Description);
            Assert.AreEqual (element.Duration, element2.Duration);
            Assert.AreEqual (element.Rate, element2.Rate);
            Assert.AreEqual (element.RateString, element2.RateString);
            Assert.AreEqual (element.Title, element2.Title);
            Assert.AreEqual (new List<CameraConfig> { new CameraConfig (0) }, element2.CamerasConfig);
            Assert.AreEqual (element.CamerasLayout, element2.CamerasLayout);
        }
        protected virtual void OnNewRenderingJob(object sender, EventArgs args)
        {
            Playlist playlist;
            TreePath[] paths;

            playlist = new Playlist ();
            paths = treeview.Selection.GetSelectedRows ();

            foreach (var path in paths) {
                TreeIter iter;
                PlaylistPlayElement element;

                treeview.Model.GetIter (out iter, path);
                element = new PlaylistPlayElement (treeview.Model.GetValue (iter, 0) as TimelineEvent,
                    project.Description.FileSet);
                playlist.Elements.Add (element);
            }

            Config.EventsBroker.EmitRenderPlaylist (playlist);
        }
        public void TestMultiplayerCamerasConfig()
        {
            TimelineEvent evt1;
            List<CameraConfig> cams1, cams2;
            Mock<IMultiPlayer> multiplayerMock = new Mock<IMultiPlayer> ();

            mtkMock.Setup (m => m.GetMultiPlayer ()).Returns (multiplayerMock.Object);
            player = new PlayerController (true);
            PreparePlayer ();

            /* Only called internally in the openning */
            cams1 = new List<CameraConfig> { new CameraConfig (0), new CameraConfig (1) };
            cams2 = new List<CameraConfig> { new CameraConfig (1), new CameraConfig (0) };
            multiplayerMock.Verify (p => p.ApplyCamerasConfig (), Times.Never ());
            Assert.AreEqual (cams1, player.CamerasConfig);

            player.CamerasConfig = cams2;
            multiplayerMock.Verify (p => p.ApplyCamerasConfig (), Times.Once ());
            Assert.AreEqual (cams2, player.CamerasConfig);
            multiplayerMock.ResetCalls ();

            /* Now load an event */
            evt1 = new TimelineEvent { Start = new Time (100), Stop = new Time (200),
                CamerasConfig = new List<CameraConfig> { new CameraConfig (1), new CameraConfig (1) }
            };
            player.LoadEvent (mfs, evt1, evt1.Start, true);
            multiplayerMock.Verify (p => p.ApplyCamerasConfig (), Times.Once ());
            Assert.AreEqual (evt1.CamerasConfig, player.CamerasConfig);
            multiplayerMock.ResetCalls ();

            /* Change event cams config */
            player.CamerasConfig = new List<CameraConfig> { new CameraConfig (0), new CameraConfig (0) };
            multiplayerMock.Verify (p => p.ApplyCamerasConfig (), Times.Once ());
            Assert.AreEqual (new List<CameraConfig> { new CameraConfig (0), new CameraConfig (0) }, evt1.CamerasConfig);
            Assert.AreEqual (player.CamerasConfig, evt1.CamerasConfig);
            multiplayerMock.ResetCalls ();

            /* Unload and check the original cams config is set back*/
            player.UnloadCurrentEvent ();
            multiplayerMock.Verify (p => p.ApplyCamerasConfig (), Times.Once ());
            Assert.AreEqual (cams2, player.CamerasConfig);
            Assert.AreEqual (new List<CameraConfig> { new CameraConfig (0), new CameraConfig (0) }, evt1.CamerasConfig);
            multiplayerMock.ResetCalls ();

            /* And changing the config does not affects the unloaded event */
            player.CamerasConfig = cams1;
            multiplayerMock.Verify (p => p.ApplyCamerasConfig (), Times.Once ());
            Assert.AreEqual (new List<CameraConfig> { new CameraConfig (0), new CameraConfig (0) }, evt1.CamerasConfig);
            multiplayerMock.ResetCalls ();

            /* Now load a playlist video */
            PlaylistVideo plv = new PlaylistVideo (mfs [0]);
            player.LoadPlaylistEvent (playlist, plv);
            multiplayerMock.Verify (p => p.ApplyCamerasConfig (), Times.Never ());
            Assert.AreEqual (new List<CameraConfig> { new CameraConfig (0) }, player.CamerasConfig);
            multiplayerMock.ResetCalls ();
            player.UnloadCurrentEvent ();
            /* Called by Open internally () */
            multiplayerMock.Verify (p => p.ApplyCamerasConfig (), Times.Never ());
            Assert.AreEqual (cams2, player.CamerasConfig);
            multiplayerMock.ResetCalls ();

            /* Now load a playlist event and make sure its config is loaded
             * and not the event's one */
            PlaylistPlayElement ple = new PlaylistPlayElement (evt, mfs);
            ple.CamerasConfig = cams2;
            player.LoadPlaylistEvent (playlist, ple);
            multiplayerMock.Verify (p => p.ApplyCamerasConfig (), Times.Once ());
            Assert.AreEqual (cams2, player.CamerasConfig);
            multiplayerMock.ResetCalls ();
        }
        bool ProcessPlay(PlaylistPlayElement element)
        {
            Time lastTS;
            TimelineEvent play;
            MediaFile file;
            IEnumerable<FrameDrawing> drawings;
            int cameraIndex;
            Area roi;

            play = element.Play;
            Log.Debug (String.Format ("Adding segment {0}", element));

            lastTS = play.Start;
            if (element.CamerasConfig.Count == 0) {
                cameraIndex = 0;
                roi = new Area ();
            } else {
                cameraIndex = element.CamerasConfig [0].Index;
                roi = element.CamerasConfig [0].RegionOfInterest;
            }
            if (cameraIndex >= element.FileSet.Count) {
                Log.Error (string.Format ("Camera index={0} not matching for current fileset count={1}",
                    cameraIndex, element.FileSet.Count));
                file = element.FileSet [0];
            } else {
                file = element.FileSet [cameraIndex];
            }
            drawings = play.Drawings.Where (d => d.CameraConfig.Index == cameraIndex);

            if (file == null || drawings == null) {
                return false;
            }
            if (!file.Exists ()) {
                return false;
            }
            foreach (FrameDrawing fd in drawings) {
                if (fd.Render < play.Start || fd.Render > play.Stop) {
                    Log.Warning ("Drawing is not in the segments boundaries " +
                    fd.Render.ToMSecondsString ());
                    continue;
                }
                string image_path = CreateStillImage (file.FilePath, fd);
                if (image_path == null) {
                    continue;
                }
                videoEditor.AddSegment (file.FilePath, lastTS.MSeconds,
                    fd.Render.MSeconds - lastTS.MSeconds,
                    element.Rate, play.Name, file.HasAudio, roi);
                // Drawings have already been cropped to ROI by the canvas, we pass an empty area
                videoEditor.AddImageSegment (image_path, 0, fd.Pause.MSeconds, play.Name, new Area ());
                lastTS = fd.Render;
            }
            videoEditor.AddSegment (file.FilePath, lastTS.MSeconds,
                play.Stop.MSeconds - lastTS.MSeconds,
                element.Rate, play.Name, file.HasAudio, roi);
            return true;
        }
Beispiel #6
0
        void RenderPlay(Project project, TimelineEvent play)
        {
            Playlist playlist;
            EncodingSettings settings;
            EditionJob job;
            string outputDir, outputProjectDir, outputFile;

            if (Config.AutoRenderDir == null ||
                !Directory.Exists (Config.AutoRenderDir)) {
                outputDir = Config.VideosDir;
            } else {
                outputDir = Config.AutoRenderDir;
            }

            outputProjectDir = Path.Combine (outputDir,
                Utils.SanitizePath (project.Description.DateTitle));
            outputFile = String.Format ("{0}-{1}.mp4", play.EventType.Name, play.Name);
            outputFile = Utils.SanitizePath (outputFile, ' ');
            outputFile = Path.Combine (outputProjectDir, outputFile);
            try {
                PlaylistPlayElement element;

                Directory.CreateDirectory (outputProjectDir);
                settings = EncodingSettings.DefaultRenderingSettings (outputFile);
                playlist = new Playlist ();
                element = new PlaylistPlayElement (play, project.Description.FileSet);
                playlist.Elements.Add (element);
                job = new EditionJob (playlist, settings);
                renderer.AddJob (job);
            } catch (Exception ex) {
                Log.Exception (ex);
            }
        }
        public void TestRenderedCamera()
        {
            Project p = Utils.CreateProject ();

            try {
                TimelineEvent evt = p.Timeline [0];
                evt.CamerasConfig = new List<CameraConfig> { new CameraConfig (0) };
                PlaylistPlayElement element = new PlaylistPlayElement (evt, p.Description.FileSet);

                // Playlist with one event
                var playlist = new Playlist ();
                playlist.Elements.Add (element);

                // Create a job
                const string outputFile = "path";
                EncodingSettings settings = new EncodingSettings (VideoStandards.P720, EncodingProfiles.MP4, EncodingQualities.Medium,
                                                25, 1, outputFile, true, true, 20);
                EditionJob job = new EditionJob (playlist, settings);

                // Mock IMultimediaToolkit and video editor
                var mtk = Mock.Of<IMultimediaToolkit> (m => m.GetVideoEditor () == Mock.Of<IVideoEditor> ());
                // and guitoolkit
                var gtk = Mock.Of<IGUIToolkit> (g => g.RenderingStateBar == Mock.Of<IRenderingStateBar> ());
                // and a video editor
                Mock<IVideoEditor> mock = Mock.Get<IVideoEditor> (mtk.GetVideoEditor ());
                // And eventbroker
                Config.EventsBroker = Mock.Of<EventsBroker> ();

                // Create a rendering object with mocked interfaces
                RenderingJobsManager renderer = new RenderingJobsManager (mtk, gtk);
                // Start service
                renderer.Start ();

                renderer.AddJob (job);

                // Check that AddSegment is called with the right video file.
                mock.Verify (m => m.AddSegment (p.Description.FileSet [0].FilePath,
                    evt.Start.MSeconds, evt.Stop.MSeconds, evt.Rate, evt.Name, true, new Area ()), Times.Once ());

                /* Test with a camera index bigger than the total cameras */
                renderer.CancelAllJobs ();
                mock.ResetCalls ();
                evt = p.Timeline [1];
                evt.CamerasConfig = new List<CameraConfig> { new CameraConfig (1) };
                element = new PlaylistPlayElement (evt, p.Description.FileSet);
                playlist.Elements [0] = element;
                job = new EditionJob (playlist, settings);
                renderer.AddJob (job);
                mock.Verify (m => m.AddSegment (p.Description.FileSet [1].FilePath,
                    evt.Start.MSeconds, evt.Stop.MSeconds, evt.Rate, evt.Name, true, new Area ()), Times.Once ());

                /* Test with the secondary camera */
                renderer.CancelAllJobs ();
                mock.ResetCalls ();
                evt = p.Timeline [1];
                evt.CamerasConfig = new List<CameraConfig> { new CameraConfig (2) };
                element = new PlaylistPlayElement (evt, p.Description.FileSet);
                playlist.Elements [0] = element;
                job = new EditionJob (playlist, settings);
                renderer.AddJob (job);
                mock.Verify (m => m.AddSegment (p.Description.FileSet [0].FilePath,
                    evt.Start.MSeconds, evt.Stop.MSeconds, evt.Rate, evt.Name, true, new Area ()), Times.Once ());
            } finally {
                Utils.DeleteProject (p);
            }
        }