Example #1
0
 public TCPBridgeThread(StreamKind kind, IOutTarget target, string ip, int port, CancellationToken Token)
 {
     this.Kind  = kind;
     this.Token = Token;
     Ip         = ip;
     Port       = port;
     Target     = target;
 }
Example #2
0
        static IMutliStreamManager ParseLegacyArgs(string[] args)
        {
            IOutTarget VTarget = null, ATarget = null;

            void ParseTargetArgs(int baseIndex, ref IOutTarget t)
            {
                switch (args[baseIndex + 1])
                {
                case "mpv":
                case "stdin":
                {
                    string fargs = "";
                    if (args[baseIndex + 1] == "mpv")
                    {
                        fargs = args[baseIndex] == "video" ? "- --no-correct-pts --fps=30 " : "- --no-video --demuxer=rawaudio --demuxer-rawaudio-rate=48000 ";
                    }

                    if (args.Length > baseIndex + 4 && args[baseIndex + 3] == "args")
                    {
                        fargs += args[baseIndex + 4];
                    }

                    t = new StdInTarget(args[baseIndex + 2], fargs);

                    break;
                }

                case "tcp":
                {
                    int port = int.Parse(args[baseIndex + 2]);
                    Console.WriteLine($"Waiting for a client to connect on {port} ...");
                    t = new TCPTarget(System.Net.IPAddress.Any, port);
                    break;
                }

                case "file":
                    t = new OutFileTarget(args[baseIndex + 2]);
                    break;

                default:
                    throw new Exception($"{args[baseIndex + 1]} is not a valid video mode");
                }
            }

            int index = Array.IndexOf(args, "video");

            if (index >= 0)
            {
                ParseTargetArgs(index, ref VTarget);
            }
            index = Array.IndexOf(args, "audio");
            if (index >= 0)
            {
                ParseTargetArgs(index, ref ATarget);
            }

            return(new SimpleStreamManager(VTarget, ATarget));
        }
Example #3
0
 protected StreamThread(CancellationToken token, StreamKind kind, UsbDevStream dev, IOutTarget target, byte[] magic, int BufMax)
 {
     Token       = token;
     Kind        = kind;
     Device      = dev;
     Target      = target;
     MagicPacket = magic;
     MaxBufSize  = BufMax;
 }
Example #4
0
        public SysDvrRTSPServer(bool videoSupport, bool audioSupport, bool localOnly, int port)
        {
            SysDVRVideoRTSPTarget v = null;
            SysDVRAudioRTSPTarget a = null;

            if (videoSupport)
            {
                v = new SysDVRVideoRTSPTarget();
            }
            if (audioSupport)
            {
                a = new SysDVRAudioRTSPTarget();
            }

            Video  = v;
            Audio  = a;
            server = new RtspServer(port, v, a, localOnly);
        }
Example #5
0
 public StreamingThread(StreamKind kind, IOutTarget target)
 {
     Kind   = kind;
     Target = target;
 }
Example #6
0
 public AudioStreamThread(CancellationToken token, IOutTarget StreamTarget, UsbDevStream InputDevice, bool PrintStatsArg = false) :
     base(token, StreamKind.Audio, InputDevice, StreamTarget, REQMagic_AUDIO, AbufMaxSz)
 {
     PrintStats = PrintStatsArg;
 }
Example #7
0
 public VideoStreamThread(CancellationToken token, IOutTarget StreamTarget, UsbDevStream InputDevice, bool PrintStatsArg = false) :
     base(token, StreamKind.Video, InputDevice, StreamTarget, REQMagic_VIDEO, VbufMaxSz)
 {
     PrintStats = PrintStatsArg;
 }
Example #8
0
        static void Main(string[] args)
        {
            Console.WriteLine("UsbStream - 2.0 by exelix");
            Console.WriteLine("https://github.com/exelix11/SysDVR \r\n");
            if (args.Length < 3)
            {
                PrintGuide();
                return;
            }

            IOutTarget VTarget     = null;
            IOutTarget ATarget     = null;
            bool       PrintStats  = false;
            bool       DesyncFix   = false;
            LogLevel   UsbLogLevel = LogLevel.Error;

            void ParseTargetArgs(int baseIndex, ref IOutTarget t)
            {
                switch (args[baseIndex + 1])
                {
                case "mpv":
                case "stdin":
                {
                    string fargs = "";
                    if (args[baseIndex + 1] == "mpv")
                    {
                        fargs = args[baseIndex] == "video" ? "- --no-correct-pts --fps=30 " : "- --no-video --demuxer=rawaudio --demuxer-rawaudio-rate=48000 ";
                    }

                    if (args.Length > baseIndex + 4 && args[baseIndex + 3] == "args")
                    {
                        fargs += args[baseIndex + 4];
                    }

                    t = new StdInTarget(args[baseIndex + 2], fargs);

                    break;
                }

                case "tcp":
                {
                    int port = int.Parse(args[baseIndex + 2]);
                    Console.WriteLine($"Waiting for a client to connect on {port} ...");
                    t = new TCPTarget(System.Net.IPAddress.Any, port);
                    break;
                }

                case "file":
                    t = new OutFileTarget(args[baseIndex + 2]);
                    break;

                default:
                    throw new Exception($"{args[baseIndex + 1]} is not a valid video mode");
                }
            }

            bool HasArg(string arg) => Array.IndexOf(args, arg) != -1;

            {
                int index = Array.IndexOf(args, "video");
                if (index >= 0)
                {
                    ParseTargetArgs(index, ref VTarget);
                }
                index = Array.IndexOf(args, "audio");
                if (index >= 0)
                {
                    ParseTargetArgs(index, ref ATarget);
                }

                DesyncFix  = HasArg("--desync-fix");
                PrintStats = HasArg("--print-stats");
                if (HasArg("--usb-warn"))
                {
                    UsbLogLevel = LogLevel.Info;
                }
                if (HasArg("--usb-debug"))
                {
                    UsbLogLevel = LogLevel.Debug;
                }
            }

            if (VTarget == null && ATarget == null)
            {
                Console.WriteLine("Specify at least a video or audio target");
                return;
            }

            var stream = GetDevice(UsbLogLevel);

            if (stream == null)
            {
                Console.WriteLine("Device not found, did you configure the drivers properly ?");
                return;
            }

            CancellationTokenSource StopThreads = new CancellationTokenSource();

            VideoStreamThread Video = null;

            if (VTarget != null)
            {
                Video = new VideoStreamThread(StopThreads.Token, VTarget, stream.OpenStreamDefault(), PrintStats, DesyncFix);
            }

            AudioStreamThread Audio = null;

            if (ATarget != null)
            {
                Audio = new AudioStreamThread(StopThreads.Token, ATarget, stream.OpenStreamAlt(), PrintStats);
            }

            Video?.StartThread();
            Audio?.StartThread();

            Console.WriteLine("Starting stream, press return to stop");
            Console.ReadLine();
            Console.WriteLine("Terminating threads...");
            StopThreads.Cancel();

            Video?.JoinThread();
            Audio?.JoinThread();

            Video?.Dispose();
            Audio?.Dispose();

            LibUsbCtx.Dispose();
        }