private async Task getElementLibraryThumbnailAsync(CitpPeer peer, GetElementLibraryThumbnailMessagePacket requestPacket) { var msexIds = requestPacket.Version == MsexVersion.Version1_0 ? requestPacket.LibraryNumbers.Select(n => new MsexId(n)).ToList() : requestPacket.LibraryIds.Select(i => new MsexId(i)).ToList(); var imageRequest = new CitpImageRequest(requestPacket.ThumbnailWidth, requestPacket.ThumbnailHeight, requestPacket.ThumbnailFormat, requestPacket.ThumbnailFlags.HasFlag(MsexThumbnailFlags.PreserveAspectRatio), requestPacket.ThumbnailFormat == MsexImageFormat.Rgb8 && requestPacket.Version == MsexVersion.Version1_0); var thumbs = _device.GetElementLibraryThumbnails(imageRequest, requestPacket.LibraryType, msexIds); var packets = thumbs.Select(t => new ElementLibraryThumbnailMessagePacket { LibraryType = requestPacket.LibraryType, LibraryNumber = t.Item1.LibraryNumber.GetValueOrDefault(), LibraryId = t.Item1.LibraryId.GetValueOrDefault(), ThumbnailFormat = requestPacket.ThumbnailFormat, ThumbnailWidth = (ushort)t.Item2.ActualWidth, ThumbnailHeight = (ushort)t.Item2.ActualHeight, ThumbnailBuffer = t.Item2.Data, }); foreach (var packet in packets) { await _networkService.SendPacketAsync(packet, peer, requestPacket).ConfigureAwait(false); } }
public static CitpPacket FromByteArray(byte[] data, IpEndpoint?remoteEndpoint = null) { CitpPacket packet; var layerType = getLayerType(data); if (layerType == null) { var layerTypeArray = new byte[4]; Buffer.BlockCopy(data, CitpContentTypePosition, layerTypeArray, 0, 4); throw new InvalidOperationException( $"Unrecognised CITP content type: {Encoding.UTF8.GetString(layerTypeArray, 0, layerTypeArray.Length)}"); } switch (layerType) { case CitpLayerType.PeerInformationLayer: { var messageType = PinfPacket.GetMessageType(data); if (messageType == null) { var messageTypeArray = new byte[4]; Buffer.BlockCopy(data, PinfPacket.CitpMessageTypePosition, messageTypeArray, 0, 4); throw new InvalidOperationException( $"Unrecognised PING message type: {Encoding.UTF8.GetString(messageTypeArray, 0, messageTypeArray.Length)}"); } switch (messageType) { case PinfMessageType.PeerLocationMessage: packet = new PeerLocationMessagePacket(); break; case PinfMessageType.PeerNameMessage: packet = new PeerNameMessagePacket(); break; default: throw new NotImplementedException("Unimplemented PINF message type"); } break; } case CitpLayerType.MediaServerExtensionsLayer: { var messageType = MsexPacket.GetMessageType(data); if (messageType == null) { var messageTypeArray = new byte[4]; Buffer.BlockCopy(data, MsexPacket.CitpMessageTypePosition, messageTypeArray, 0, 4); throw new InvalidOperationException( $"Unrecognised MSEX message type: {Encoding.UTF8.GetString(messageTypeArray, 0, messageTypeArray.Length)}"); } switch (messageType) { case MsexMessageType.ClientInformationMessage: packet = new ClientInformationMessagePacket(); break; case MsexMessageType.ServerInformationMessage: packet = new ServerInformationMessagePacket(); break; case MsexMessageType.NegativeAcknowledgeMessage: packet = new NegativeAcknowledgeMessagePacket(); break; case MsexMessageType.LayerStatusMessage: packet = new LayerStatusMessagePacket(); break; case MsexMessageType.GetElementLibraryInformationMessage: packet = new GetElementLibraryInformationMessagePacket(); break; case MsexMessageType.ElementLibraryInformationMessage: packet = new ElementLibraryInformationMessagePacket(); break; case MsexMessageType.ElementLibraryUpdatedMessage: packet = new ElementLibraryUpdatedMessagePacket(); break; case MsexMessageType.GetElementInformationMessage: packet = new GetElementInformationMessagePacket(); break; case MsexMessageType.MediaElementInformationMessage: packet = new MediaElementInformationMessagePacket(); break; case MsexMessageType.EffectElementInformationMessage: packet = new EffectElementInformationMessagePacket(); break; case MsexMessageType.GenericElementInformationMessage: packet = new GenericElementInformationMessagePacket(); break; case MsexMessageType.GetElementLibraryThumbnailMessage: packet = new GetElementLibraryThumbnailMessagePacket(); break; case MsexMessageType.ElementLibraryThumbnailMessage: packet = new ElementLibraryThumbnailMessagePacket(); break; case MsexMessageType.GetElementThumbnailMessage: packet = new GetElementThumbnailMessagePacket(); break; case MsexMessageType.ElementThumbnailMessage: packet = new ElementThumbnailMessagePacket(); break; case MsexMessageType.GetVideoSourcesMessage: packet = new GetVideoSourcesMessagePacket(); break; case MsexMessageType.RequestStreamMessage: packet = new RequestStreamMessagePacket(); break; case MsexMessageType.StreamFrameMessage: packet = new StreamFrameMessagePacket(); break; default: throw new NotImplementedException("Unimplemented MSEX message type"); } break; } default: throw new NotImplementedException("Unimplemented CITP content type"); } using (var reader = new CitpBinaryReader(new MemoryStream(data))) packet.DeserializeFromStream(reader); packet.RemoteEndpoint = remoteEndpoint; return(packet); }