private void TryEvent(EventParams ep)
        {
            int    hr;
            int    i  = 0;
            IntPtr ip = IntPtr.Zero;

            if (!m_bWorked)
            {
                DVRStreamDesc sd = new DVRStreamDesc();

                ip = IntPtr.Zero;
                i  = 0;

                try
                {
                    hr = m_se.GetEvent(ep.EventID, ep.Param3, ref i, ip);

                    Debug.WriteLine(string.Format("{0} {1}", hr, i));

                    if (hr >= 0)
                    {
                        ip = Marshal.AllocCoTaskMem(i);
                        hr = m_se.GetEvent(ep.EventID, ep.Param3, ref i, ip);

                        Marshal.PtrToStructure(ip, sd);

                        m_bWorked = hr >= 0 && sd.guidFormatType == sd.MediaType.formatType && sd.guidFormatType != Guid.Empty;
                    }
                }
                finally
                {
                    Marshal.FreeCoTaskMem(ip);
                }
            }
        }
        private void ProcEvents()
        {
            bool   bDone = false;
            int    hr;
            bool   sp;
            int    i  = 0;
            IntPtr ip = IntPtr.Zero;

            while (!bDone)
            {
                while (m_Q.Count == 0)
                {
                    Thread.Sleep(1);
                }

                EventParams ep = (EventParams)m_Q.Dequeue();

                switch (ep.ec)
                {
                case EventCmd.Init:
                    Config2();
                    break;

                case EventCmd.Run:
                    m_mc.Run();
                    break;

                case EventCmd.Event:

                    Debug.WriteLine(ep.EventID);

                    if (ep.EventID == SBEEvent.StreamDescEvent)
                    {
                        if (!m_bWorked)
                        {
                            DVRStreamDesc sd = new DVRStreamDesc();

                            ip = IntPtr.Zero;
                            sp = false;
                            i  = 0;

                            hr = m_ge.GetEvent(ep.EventID, ep.Param1, ep.Param2, ep.Param3, ep.Param4, out sp, ref i, ip);
                            Thread.Sleep(1);
                            ip = Marshal.AllocCoTaskMem(i);
                            try
                            {
                                sp = false;
                                hr = m_ge.GetEvent(ep.EventID, ep.Param1, ep.Param2, ep.Param3, ep.Param4, out sp, ref i, ip);
                                Marshal.PtrToStructure(ip, sd);

                                m_bWorked = hr == 0 && sd.guidFormatType == sd.MediaType.formatType && sd.guidFormatType != Guid.Empty;
                            }
                            finally
                            {
                                Marshal.FreeCoTaskMem(ip);
                            }
                        }

                        break;
                    }
                    break;

                case EventCmd.Exit:
                    bDone = true;
                    break;
                }
                m_re.Set();
            }
        }