Exemple #1
0
        unsafe int FrameAcceptedCallback(S2Frame *frm)
        {
            if (frm->Error != 0 || frm->Width == 0 || frm->Height == 0)
            {
                return(0);
            }

            if (FrameAccepted == null)
            {
                SnvBackend.FreeFrame(frm);
                return(0);
            }

            AppTools.TryInvoke(() =>
            {
                bool changed = false;
                if (bitmap == null || bitmap.Width != frm->Width || bitmap.Height != frm->Height)
                {
                    bitmap  = new WriteableBitmap(frm->Width, frm->Height, 96, 96, PixelFormats.Bgr24, null);
                    changed = true;
                }

                unsafe
                {
                    bitmap.Lock();
                    UnmanagedTools.CopyMemory(bitmap.BackBuffer, frm->Pixels, (uint)(frm->Height * bitmap.BackBufferStride));
                    bitmap.AddDirtyRect(new Int32Rect(0, 0, frm->Width, frm->Height));
                    bitmap.Unlock();

                    SnvBackend.FreeFrame(frm);
                }

                FrameAccepted?.Invoke(this, new FrameAcceptedEventArgs(bitmap, changed));
            });

            return(0);
        }
        void RecorderThread()
        {
            Dictionary <int, IntPtr> contexts = new Dictionary <int, IntPtr>();

            while (running && IsApplicationRunning)
            {
                unsafe
                {
                    try
                    {
                        var displays = SnvBackend.ScrCountDisplays();
                        if (displays < 0)
                        {
                            throw new Exception("Cannot count the displays available");
                        }

                        for (int i = 0; i < displays; i++)
                        {
                            var ptr = Marshal.AllocHGlobal(sizeof(RecorderContext));
                            UnmanagedTools.SetMemory(ptr, 0, sizeof(RecorderContext));
                            contexts.Add(i, ptr);
                        }

                        while (running && IsApplicationRunning)
                        {
                            foreach (var k in contexts.Keys)
                            {
                                S2Frame frmRaw;
                                if (SnvBackend.ScrCapture(&frmRaw, k, 1) != 0)
                                {
                                    break;
                                }

                                SnvBackend.RecCommitFrame((RecorderContext *)contexts[k], &frmRaw, k);
                                SnvBackend.FreeFrame(&frmRaw);
                            }

                            Thread.Sleep(25);
                        }
                    }

                    catch { }

                    try
                    {
                        SnvBackend.RecStop();
                        foreach (var k in contexts.Keys)
                        {
                            SnvBackend.RecCommitFrame((RecorderContext *)contexts[k], null, k);
                            Marshal.FreeHGlobal(contexts[k]);
                        }

                        contexts.Clear();
                    }

                    catch { }
                }

                Thread.Sleep(250);
            }
        }