public IEnumerator SetupTextureGroup(VideoInitSenderPacketData initPacketData) { if (state != PrepareState.Unprepared) { throw new Exception("State has to be Unprepared to prepare TextureGroupUpdater."); } state = PrepareState.Preparing; textureGroup.SetWidth(initPacketData.depthWidth); textureGroup.SetHeight(initPacketData.depthHeight); PluginHelper.InitTextureGroup(textureGroup.GetId()); depthDecoder = new TrvlDecoder(initPacketData.depthWidth * initPacketData.depthHeight); state = PrepareState.Prepared; while (!textureGroup.IsInitialized()) { yield return(null); } // TextureGroup includes Y, U, V, and a depth texture. azureKinectScreenMaterial.SetTexture("_YTex", textureGroup.GetYTexture()); azureKinectScreenMaterial.SetTexture("_UvTex", textureGroup.GetUvTexture()); azureKinectScreenMaterial.SetTexture("_DepthTex", textureGroup.GetDepthTexture()); state = PrepareState.Prepared; }
public TextureGroupUpdater(Material azureKinectScreenMaterial, InitSenderPacketData initPacketData, int sessionId, IPEndPoint endPoint) { this.azureKinectScreenMaterial = azureKinectScreenMaterial; textureGroup = new TextureGroup(Plugin.texture_group_create()); UnityEngine.Debug.Log($"textureGroup id: {textureGroup.GetId()}"); lastVideoFrameId = -1; prepared = false; videoMessages = new Dictionary <int, VideoSenderMessageData>(); frameStopWatch = Stopwatch.StartNew(); textureGroup.SetWidth(initPacketData.depthWidth); textureGroup.SetHeight(initPacketData.depthHeight); PluginHelper.InitTextureGroup(textureGroup.GetId()); colorDecoder = new Vp8Decoder(); depthDecoder = new TrvlDecoder(initPacketData.depthWidth * initPacketData.depthHeight); this.sessionId = sessionId; this.endPoint = endPoint; }
public void Ping(UdpSocket udpSocket) { int senderSessionId = -1; int pingCount = 0; while (true) { bool initialized = false; udpSocket.Send(PacketHelper.createPingReceiverPacketBytes()); ++pingCount; UnityEngine.Debug.Log("Sent ping"); //Thread.Sleep(100); Thread.Sleep(300); SocketError error = SocketError.WouldBlock; while (true) { var packet = udpSocket.Receive(out error); if (packet == null) { break; } int cursor = 0; int sessionId = BitConverter.ToInt32(packet, cursor); cursor += 4; var packetType = (SenderPacketType)packet[cursor]; cursor += 1; if (packetType != SenderPacketType.Init) { UnityEngine.Debug.Log($"A different kind of a packet received before an init packet: {packetType}"); continue; } senderSessionId = sessionId; var initSenderPacketData = InitSenderPacketData.Parse(packet); textureGroup.SetWidth(initSenderPacketData.depthWidth); textureGroup.SetHeight(initSenderPacketData.depthHeight); PluginHelper.InitTextureGroup(); colorDecoder = new Vp8Decoder(); depthDecoder = new TrvlDecoder(initSenderPacketData.depthWidth * initSenderPacketData.depthHeight); azureKinectScreen.Setup(initSenderPacketData); initialized = true; break; } if (initialized) { break; } if (pingCount == 10) { UnityEngine.Debug.Log("Tried pinging 10 times and failed to received an init packet...\n"); return; } } this.udpSocket = udpSocket; var videoPacketDataQueue = new ConcurrentQueue <VideoSenderPacketData>(); var fecPacketDataQueue = new ConcurrentQueue <FecSenderPacketData>(); var audioPacketDataQueue = new ConcurrentQueue <AudioSenderPacketData>(); var taskThread = new Thread(() => { var receiveSenderPacketTask = new ReceiveSenderPacketTask(); var reassembleVideoMessageTask = new ReassembleVideoMessageTask(); var consumeAudioPacketTask = new ConsumeAudioPacketTask(); while (!receiverStopped) { receiveSenderPacketTask.Run(this, senderSessionId, videoPacketDataQueue, fecPacketDataQueue, audioPacketDataQueue); reassembleVideoMessageTask.Run(this, videoPacketDataQueue, fecPacketDataQueue); consumeAudioPacketTask.Run(this, audioPacketDataQueue); } receiverStopped = true; }); taskThread.Start(); }