├── .dockerignore ├── .gitignore ├── rust_rtsp_server.png ├── Cargo.toml ├── readme.md ├── src ├── rtsp_session.rs ├── video_server.rs ├── main.rs └── rtsp_msg_handler.rs ├── license ├── Dockerfile └── Cargo.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | target 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | **/*.rs.bk 3 | 4 | # CLion 5 | .idea/ 6 | 7 | -------------------------------------------------------------------------------- /rust_rtsp_server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sean-halpin/rust_rtsp_server/HEAD/rust_rtsp_server.png -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rust-rtsp-server" 3 | version = "0.1.0" 4 | authors = ["Sean "] 5 | edition = "2018" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [dependencies] 10 | chrono = "0.4.10" 11 | uuid = { version = "0.8.1", features = ["serde", "v4"] } 12 | gstreamer = "0.15.0" 13 | failure = "0.1.6" 14 | futures = "0.3.1" 15 | clap = "2.31" 16 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | #### Rust Rtsp Server 2 | 3 | A simple RTSP server implementation using rust to parse & respond to requests. 4 | Then GStreamer to serve the video for the negotiated session. 5 | 6 | #### Sample server output & session streamed using ffplay 7 | 8 | ![Alt text](rust_rtsp_server.png "Rust Rtsp Server") 9 | 10 | #### Docker 11 | 12 | Build 13 | ``` 14 | docker build -t rust_rtsp . 15 | ``` 16 | 17 | Run built image 18 | ``` 19 | docker run --rm -d --network host rust_rtsp 20 | ``` 21 | 22 | Build & run in Docker while developing on local host 23 | ``` 24 | docker build -t rust_rtsp . 25 | docker run -it --rm -d -v $(pwd):/src --network host rust_rtsp /bin/bash 26 | cd /src 27 | cargo build 28 | RUST_BACKTRACE=1 ./target/debug/rust-rtsp-server 29 | ``` -------------------------------------------------------------------------------- /src/rtsp_session.rs: -------------------------------------------------------------------------------- 1 | use crate::rtsp_msg_handler::RtspMessage; 2 | use std::net::TcpListener; 3 | 4 | #[derive(Clone)] 5 | pub struct RtspSession { 6 | pub client_rtp: String, 7 | pub client_rtcp: String, 8 | pub server_rtcp: String, 9 | } 10 | 11 | pub trait ClientPorts { 12 | fn setup(msg: RtspMessage) -> RtspSession; 13 | } 14 | 15 | fn port_is_available(port: u16) -> bool { 16 | match TcpListener::bind(("127.0.0.1", port)) { 17 | Ok(_) => true, 18 | Err(_) => false, 19 | } 20 | } 21 | 22 | impl ClientPorts for RtspSession { 23 | fn setup(msg: RtspMessage) -> RtspSession { 24 | let server_rtcp_port = (12000..50000).find(|port| port_is_available(*port)); 25 | return RtspSession { 26 | client_rtp: msg.client_rtp.unwrap_or_default(), 27 | client_rtcp: msg.client_rtcp.unwrap_or_default(), 28 | server_rtcp: server_rtcp_port.unwrap_or_default().to_string(), 29 | }; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Sean Halpin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:18.04 2 | 3 | LABEL author=sean.halpin 4 | RUN apt-get update && apt-get install --no-install-recommends -y \ 5 | apt-utils \ 6 | build-essential \ 7 | curl 8 | 9 | RUN apt-get install --no-install-recommends -y \ 10 | gstreamer1.0-plugins-ugly \ 11 | gstreamer1.0-plugins-base \ 12 | gstreamer1.0-plugins-bad \ 13 | gstreamer1.0-plugins-good \ 14 | gstreamer1.0-x \ 15 | gstreamer1.0-libav \ 16 | gstreamer1.0-tools 17 | 18 | RUN apt-get install --no-install-recommends -y \ 19 | libgstreamer1.0-dev \ 20 | libgstreamer-plugins-base1.0-dev \ 21 | libglib2.0-dev 22 | 23 | RUN apt-get install --no-install-recommends -y wget ca-certificates 24 | 25 | ENV RUSTUP_HOME=/usr/local/rustup \ 26 | CARGO_HOME=/usr/local/cargo \ 27 | PATH=/usr/local/cargo/bin:$PATH \ 28 | RUST_VERSION=1.58.1 29 | 30 | RUN set -eux; \ 31 | dpkgArch="$(dpkg --print-architecture)"; \ 32 | case "${dpkgArch##*-}" in \ 33 | amd64) rustArch='x86_64-unknown-linux-gnu'; rustupSha256='e68f193542c68ce83c449809d2cad262cc2bbb99640eb47c58fc1dc58cc30add' ;; \ 34 | armhf) rustArch='armv7-unknown-linux-gnueabihf'; rustupSha256='7c1c329a676e50c287d8183b88f30cd6afd0be140826a9fbbc0e3d717fab34d7' ;; \ 35 | arm64) rustArch='aarch64-unknown-linux-gnu'; rustupSha256='d861cc86594776414de001b96964be645c4bfa27024052704f0976dc3aed1b18' ;; \ 36 | i386) rustArch='i686-unknown-linux-gnu'; rustupSha256='89f1f797dca2e5c1d75790c3c6b7be0ee473a7f4eca9663e623a41272a358da0' ;; \ 37 | *) echo >&2 "unsupported architecture: ${dpkgArch}"; exit 1 ;; \ 38 | esac; \ 39 | url="https://static.rust-lang.org/rustup/archive/1.20.2/${rustArch}/rustup-init"; \ 40 | wget --no-check-certificate "$url"; \ 41 | echo "${rustupSha256} *rustup-init" | sha256sum -c -; \ 42 | chmod +x rustup-init; \ 43 | RUSTUP_USE_CURL=1 ./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION; \ 44 | rm rustup-init; \ 45 | chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \ 46 | rustup --version; \ 47 | cargo --version; \ 48 | rustc --version; 49 | 50 | WORKDIR /usr/src/app 51 | COPY . . 52 | 53 | RUN cargo install --path . 54 | 55 | CMD ["rust-rtsp-server"] -------------------------------------------------------------------------------- /src/video_server.rs: -------------------------------------------------------------------------------- 1 | extern crate gstreamer; 2 | use gstreamer::prelude::*; 3 | extern crate futures; 4 | use futures::executor::LocalPool; 5 | use futures::prelude::*; 6 | 7 | async fn message_loop(bus: gstreamer::Bus) { 8 | let mut messages = gstreamer::BusStream::new(&bus); 9 | while let Some(msg) = messages.next().await { 10 | use gstreamer::MessageView; 11 | match msg.view() { 12 | MessageView::Eos(..) => { 13 | println!("Eos!"); 14 | break; 15 | }, 16 | MessageView::Error(err) => { 17 | println!( 18 | "Error from {:?}: {} ({:?})", 19 | err.get_src().map(|s| s.get_path_string()), 20 | err.get_error(), 21 | err.get_debug() 22 | ); 23 | break; 24 | }, 25 | MessageView::StreamStatus(_) => (), 26 | _ => () 27 | }; 28 | } 29 | } 30 | 31 | pub fn serve_rtp( 32 | remote_host: String, 33 | client_rtp_port: String, 34 | client_rtcp_port: String, 35 | server_rtcp_port: String, 36 | ) { 37 | gstreamer::init().unwrap(); 38 | let video_pattern = "smpte"; 39 | let _pipeline_string = format!("rtpbin name=rtpman autoremove=true 40 | videotestsrc pattern={} ! videoconvert ! x264enc ! rtph264pay ! rtpman.send_rtp_sink_0 41 | rtpman.send_rtp_src_0 ! udpsink name=rtpudpsink host={} port={} 42 | rtpman.send_rtcp_src_0 ! udpsink name=rtcpudpsink host={} port={} sync=false async=false 43 | udpsrc name=rtcpudpsrc port={} ! rtpman.recv_rtcp_sink_0", 44 | video_pattern, 45 | remote_host, 46 | client_rtp_port, 47 | remote_host, 48 | client_rtcp_port, 49 | server_rtcp_port); 50 | 51 | let pipeline = gstreamer::parse_launch(&_pipeline_string).unwrap(); 52 | let bus = pipeline.get_bus().unwrap(); 53 | 54 | pipeline 55 | .set_state(gstreamer::State::Playing) 56 | .expect("Unable to set the pipeline to the `Playing` state"); 57 | 58 | let mut pool = LocalPool::new(); 59 | pool.run_until(message_loop(bus)); 60 | 61 | pipeline 62 | .set_state(gstreamer::State::Null) 63 | .expect("Unable to set the pipeline to the `Null` state"); 64 | } 65 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | extern crate clap; 2 | 3 | mod rtsp_msg_handler; 4 | mod rtsp_session; 5 | mod video_server; 6 | use rtsp_msg_handler::{RtspCommand, RtspMessage, RtspParsable, RtspResponse}; 7 | use rtsp_session::{ClientPorts, RtspSession}; 8 | use std::io::{BufRead, BufReader, BufWriter, Write}; 9 | use std::net::{TcpListener, TcpStream}; 10 | use std::str; 11 | use std::thread; 12 | use clap::{Arg, App}; 13 | 14 | fn respond_to_client(req: RtspMessage, stream: &TcpStream, session: Option) { 15 | match req.response(session) { 16 | Some(resp) => { 17 | println!("Response {:?}\n", resp); 18 | let mut writer = BufWriter::new(stream); 19 | match writer.write_all(resp.as_bytes()) { 20 | Ok(_) => (), 21 | Err(e) => (println!("Error writing bytes: {}", e)), 22 | } 23 | } 24 | None => { 25 | println!("No response found!"); 26 | } 27 | } 28 | } 29 | 30 | fn handle_client(stream: TcpStream) { 31 | let client_ip = stream.peer_addr().unwrap().ip().to_string(); 32 | println!("Client connected: {}", client_ip.to_owned()); 33 | let mut reader = BufReader::new(&stream); 34 | let mut tcp_msg_buf = String::new(); 35 | let mut session: Option = None; 36 | 37 | loop { 38 | match reader.read_line(&mut tcp_msg_buf) { 39 | Ok(size) => { 40 | if size <= 0 { 41 | break; 42 | } 43 | if tcp_msg_buf.contains("\r\n\r\n") { 44 | let _string = str::from_utf8(&tcp_msg_buf.as_bytes()).unwrap(); 45 | println!("Request {:?}", _string); 46 | 47 | match RtspMessage::parse_as_rtsp(tcp_msg_buf.to_owned()) { 48 | Some(req) => match req.command { 49 | Some(RtspCommand::Setup) => { 50 | session = Some(RtspSession::setup(req.clone())); 51 | respond_to_client(req.clone(), &stream, session.clone()); 52 | } 53 | Some(RtspCommand::Play) => match session.clone() { 54 | Some(_sess) => { 55 | let serve = |sess: RtspSession, client_ip: String| { 56 | video_server::serve_rtp( 57 | client_ip.clone(), 58 | sess.clone().client_rtp, 59 | sess.clone().client_rtcp, 60 | sess.clone().server_rtcp, 61 | ) 62 | }; 63 | let c_ip = client_ip.clone(); 64 | thread::spawn(move || serve(_sess, c_ip)); 65 | respond_to_client(req.clone(), &stream, session.clone()); 66 | println!("Playing!"); 67 | } 68 | None => { 69 | println!("No Session Found!"); 70 | break; 71 | } 72 | }, 73 | Some(_) => { 74 | respond_to_client(req.clone(), &stream, session.clone()); 75 | } 76 | None => { 77 | println!("Could not determine the Rtsp Command!"); 78 | break; 79 | } 80 | }, 81 | None => { 82 | println!("Could not parse RtspMessage!"); 83 | break; 84 | } 85 | } 86 | tcp_msg_buf.clear(); 87 | } 88 | } 89 | Err(e) => { 90 | println!("Error reading TcpStream: {:?}", e); 91 | break; 92 | } 93 | } 94 | } 95 | println!("Client handled"); 96 | } 97 | 98 | fn main() { 99 | let matches = App::new("Rust RTSP server") 100 | .version("0.1.0") 101 | .author("sean.halpin") 102 | .about("Rust RTSP server implementation") 103 | .arg(Arg::with_name("port") 104 | .short("p") 105 | .long("port") 106 | .value_name("PORT") 107 | .help("Port on which to listen") 108 | .takes_value(true)) 109 | .get_matches(); 110 | 111 | let port = matches.value_of("port").unwrap_or("554"); 112 | 113 | let bind_str = format!("0.0.0.0:{}", port); 114 | let listener = TcpListener::bind(&bind_str).unwrap(); 115 | println!("Server listening on port {}", &bind_str); 116 | for stream in listener.incoming() { 117 | match stream { 118 | Ok(stream) => { 119 | thread::spawn(move || handle_client(stream)); 120 | } 121 | Err(e) => { 122 | println!("Error: {}", e); 123 | } 124 | } 125 | } 126 | drop(listener); 127 | } 128 | -------------------------------------------------------------------------------- /src/rtsp_msg_handler.rs: -------------------------------------------------------------------------------- 1 | extern crate chrono; 2 | use crate::rtsp_session::RtspSession; 3 | use chrono::Utc; 4 | 5 | #[derive(Clone, Debug)] 6 | pub enum RtspCommand { 7 | Options, 8 | Describe, 9 | Setup, 10 | Play, 11 | Teardown, 12 | } 13 | 14 | pub trait RtspParsable { 15 | fn parse_as_rtsp(raw: String) -> Option 16 | where 17 | Self: std::marker::Sized; 18 | } 19 | 20 | pub trait RtspResponse { 21 | fn response(&self, session: Option) -> Option; 22 | } 23 | 24 | #[derive(Clone, Debug)] 25 | pub struct RtspMessage { 26 | pub command: Option, 27 | pub content_base: Option, 28 | pub cseq: Option, 29 | pub session_id: Option, 30 | pub client_rtp: Option, 31 | pub client_rtcp: Option, 32 | } 33 | 34 | fn rtsp_date_time() -> String { 35 | return "Date: ".to_owned() + &Utc::now().to_rfc2822(); 36 | } 37 | 38 | impl RtspResponse for RtspMessage { 39 | fn response(&self, session: Option) -> Option { 40 | let _header_ok = "RTSP/1.0 200 OK".to_owned(); 41 | let _server_id = "Server: Rust RTSP server".to_owned(); 42 | let mut _response_lines: Vec = Vec::new(); 43 | 44 | match self.command { 45 | Some(RtspCommand::Options) => { 46 | let _server_functions = 47 | "Public: OPTIONS, DESCRIBE, PLAY, SETUP, TEARDOWN".to_owned(); 48 | _response_lines.push(_header_ok); 49 | _response_lines 50 | .push("CSeq: ".to_owned() + &(self.cseq.as_ref().unwrap()).to_string()); 51 | _response_lines.push(_server_functions); 52 | _response_lines.push(_server_id); 53 | _response_lines.push(rtsp_date_time()); 54 | _response_lines.push("\r\n".to_owned()); 55 | } 56 | Some(RtspCommand::Describe) => { 57 | let _sdp = "v=0\r\ns=Rust RTSP server\r\nt=0 0\r\nm=video 0 RTP/AVP 96\r\na=rtpmap:96 H264/90000".to_owned(); 58 | let _sdp_byte_count: i32 = _sdp.len() as i32; 59 | _response_lines.push(_header_ok); 60 | _response_lines 61 | .push("CSeq: ".to_owned() + &(self.cseq.as_ref().unwrap()).to_string()); 62 | _response_lines.push("Content-Type: ".to_owned() + "application/sdp"); 63 | _response_lines.push( 64 | "Content-Base: ".to_owned() + &self.content_base.as_ref().unwrap().to_string(), 65 | ); 66 | _response_lines.push(_server_id); 67 | _response_lines.push(rtsp_date_time()); 68 | _response_lines 69 | .push("Content-Length: ".to_owned() + &(_sdp_byte_count).to_string() + "\r\n"); 70 | _response_lines.push(_sdp); 71 | } 72 | Some(RtspCommand::Setup) => { 73 | let session_id = 1; 74 | _response_lines.push(_header_ok); 75 | _response_lines 76 | .push("CSeq: ".to_owned() + &(self.cseq.as_ref().unwrap()).to_string()); 77 | let rtcp_port: i32 = session.unwrap().server_rtcp.clone().parse().unwrap(); 78 | _response_lines.push(format!( 79 | "Transport: RTP/AVP;unicast;client_port={}-{};server_port={}-{};mode=\"PLAY\"", 80 | &self.client_rtp.as_ref().unwrap(), 81 | &self.client_rtcp.as_ref().unwrap(), 82 | rtcp_port, 83 | rtcp_port + 1 84 | )); 85 | _response_lines.push(_server_id); 86 | _response_lines.push("Session: ".to_owned() + &session_id.to_string()); 87 | _response_lines.push(rtsp_date_time()); 88 | _response_lines.push("\r\n".to_owned()); 89 | } 90 | Some(RtspCommand::Play) => { 91 | let session_id = 1; 92 | _response_lines.push(_header_ok); 93 | _response_lines 94 | .push("CSeq: ".to_owned() + &(self.cseq.as_ref().unwrap()).to_string()); 95 | _response_lines.push( 96 | "RTP-Info: url=:".to_owned() 97 | + &self.content_base.as_ref().unwrap().to_string() 98 | + "/stream=0;seq=1;rtptime=0", 99 | ); 100 | _response_lines.push("Range: npt=0-".to_owned()); 101 | _response_lines.push(_server_id); 102 | _response_lines.push("Session: ".to_owned() + &session_id.to_string()); 103 | _response_lines.push(rtsp_date_time()); 104 | _response_lines.push("\r\n".to_owned()); 105 | } 106 | Some(RtspCommand::Teardown) => (), 107 | _ => return None, 108 | }; 109 | return Some(_response_lines.join("\r\n")); 110 | } 111 | } 112 | 113 | impl RtspParsable for RtspMessage { 114 | fn parse_as_rtsp(_raw: String) -> Option { 115 | let raw_split = _raw.split("\r\n"); 116 | let lines: Vec<&str> = raw_split.collect(); 117 | let header: Vec<&str> = lines[0].split(" ").collect(); 118 | let _cmd = match header[0] { 119 | "OPTIONS" => Some(RtspCommand::Options), 120 | "DESCRIBE" => Some(RtspCommand::Describe), 121 | "SETUP" => Some(RtspCommand::Setup), 122 | "PLAY" => Some(RtspCommand::Play), 123 | "TEARDOWN" => Some(RtspCommand::Teardown), 124 | _ => { 125 | println!("Unknown Message Type"); 126 | None 127 | } 128 | }; 129 | 130 | let _content_base = if header[1].contains("rtsp://") { 131 | Some(header[1].to_owned()) 132 | } else { 133 | None 134 | }; 135 | 136 | let mut _cseq: Option = None; 137 | let mut _rtp: Option = None; 138 | let mut _rtcp: Option = None; 139 | let mut _session: Option = None; 140 | for line in lines { 141 | let key_val: Vec<&str> = line.split(": ").collect(); 142 | match key_val[0] { 143 | "CSeq" => { 144 | _cseq = Some(key_val[1].to_owned()); 145 | } 146 | "Transport" => { 147 | let _transport = key_val[1].to_owned(); 148 | let _transport_split: Vec<&str> = key_val[1].split(";").collect(); 149 | for _item in _transport_split { 150 | if _item.contains("client_port") { 151 | let _key_val: Vec<&str> = _item.split("=").collect(); 152 | let transport: Vec<&str> = _key_val[1].split("-").collect(); 153 | _rtp = Some(transport[0].to_owned()); 154 | _rtcp = Some(transport[1].to_owned()); 155 | } 156 | } 157 | } 158 | "Session" => _session = Some(key_val[1].to_owned()), 159 | _ => (), 160 | }; 161 | } 162 | 163 | return Some(RtspMessage { 164 | command: _cmd, 165 | content_base: _content_base, 166 | cseq: _cseq, 167 | session_id: _session, 168 | client_rtp: _rtp, 169 | client_rtcp: _rtcp, 170 | }); 171 | } 172 | } 173 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "ansi_term" 5 | version = "0.11.0" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | dependencies = [ 8 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 9 | ] 10 | 11 | [[package]] 12 | name = "atty" 13 | version = "0.2.14" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | dependencies = [ 16 | "hermit-abi 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", 17 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 18 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 19 | ] 20 | 21 | [[package]] 22 | name = "autocfg" 23 | version = "0.1.7" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | 26 | [[package]] 27 | name = "backtrace" 28 | version = "0.3.40" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | dependencies = [ 31 | "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", 32 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 33 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 34 | "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 35 | ] 36 | 37 | [[package]] 38 | name = "backtrace-sys" 39 | version = "0.1.32" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | dependencies = [ 42 | "cc 1.0.49 (registry+https://github.com/rust-lang/crates.io-index)", 43 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 44 | ] 45 | 46 | [[package]] 47 | name = "bitflags" 48 | version = "1.2.1" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | 51 | [[package]] 52 | name = "c2-chacha" 53 | version = "0.2.3" 54 | source = "registry+https://github.com/rust-lang/crates.io-index" 55 | dependencies = [ 56 | "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 57 | ] 58 | 59 | [[package]] 60 | name = "cc" 61 | version = "1.0.49" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | 64 | [[package]] 65 | name = "cfg-if" 66 | version = "0.1.10" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | 69 | [[package]] 70 | name = "chrono" 71 | version = "0.4.10" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | dependencies = [ 74 | "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 75 | "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 76 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 77 | ] 78 | 79 | [[package]] 80 | name = "clap" 81 | version = "2.33.2" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | dependencies = [ 84 | "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 85 | "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", 86 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 87 | "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 88 | "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 89 | "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 90 | "vec_map 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 91 | ] 92 | 93 | [[package]] 94 | name = "failure" 95 | version = "0.1.6" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | dependencies = [ 98 | "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)", 99 | "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 100 | ] 101 | 102 | [[package]] 103 | name = "failure_derive" 104 | version = "0.1.6" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | dependencies = [ 107 | "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 108 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 109 | "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", 110 | "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 111 | ] 112 | 113 | [[package]] 114 | name = "futures" 115 | version = "0.3.1" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | dependencies = [ 118 | "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 119 | "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 120 | "futures-executor 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 121 | "futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 122 | "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 123 | "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 124 | "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 125 | ] 126 | 127 | [[package]] 128 | name = "futures-channel" 129 | version = "0.3.1" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | dependencies = [ 132 | "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 133 | "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 134 | ] 135 | 136 | [[package]] 137 | name = "futures-core" 138 | version = "0.3.1" 139 | source = "registry+https://github.com/rust-lang/crates.io-index" 140 | 141 | [[package]] 142 | name = "futures-executor" 143 | version = "0.3.1" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | dependencies = [ 146 | "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 147 | "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 148 | "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 149 | ] 150 | 151 | [[package]] 152 | name = "futures-io" 153 | version = "0.3.1" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | 156 | [[package]] 157 | name = "futures-macro" 158 | version = "0.3.1" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | dependencies = [ 161 | "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", 162 | "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 163 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 164 | "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", 165 | ] 166 | 167 | [[package]] 168 | name = "futures-sink" 169 | version = "0.3.1" 170 | source = "registry+https://github.com/rust-lang/crates.io-index" 171 | 172 | [[package]] 173 | name = "futures-task" 174 | version = "0.3.1" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | 177 | [[package]] 178 | name = "futures-util" 179 | version = "0.3.1" 180 | source = "registry+https://github.com/rust-lang/crates.io-index" 181 | dependencies = [ 182 | "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 183 | "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 184 | "futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 185 | "futures-macro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 186 | "futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 187 | "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 188 | "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 189 | "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", 190 | "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", 191 | "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 192 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 193 | ] 194 | 195 | [[package]] 196 | name = "getrandom" 197 | version = "0.1.13" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | dependencies = [ 200 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 201 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 202 | "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 203 | ] 204 | 205 | [[package]] 206 | name = "glib" 207 | version = "0.9.0" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | dependencies = [ 210 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 211 | "futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 212 | "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 213 | "futures-executor 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 214 | "futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 215 | "futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 216 | "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 217 | "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 218 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 219 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 220 | ] 221 | 222 | [[package]] 223 | name = "glib-sys" 224 | version = "0.9.1" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | dependencies = [ 227 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 228 | "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", 229 | ] 230 | 231 | [[package]] 232 | name = "gobject-sys" 233 | version = "0.9.1" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | dependencies = [ 236 | "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 237 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 238 | "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", 239 | ] 240 | 241 | [[package]] 242 | name = "gstreamer" 243 | version = "0.15.0" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | dependencies = [ 246 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 247 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 248 | "futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 249 | "glib 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 250 | "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 251 | "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 252 | "gstreamer-sys 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 253 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 254 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 255 | "muldiv 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 256 | "num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 257 | "paste 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 258 | ] 259 | 260 | [[package]] 261 | name = "gstreamer-sys" 262 | version = "0.8.1" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | dependencies = [ 265 | "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 266 | "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 267 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 268 | "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", 269 | ] 270 | 271 | [[package]] 272 | name = "hermit-abi" 273 | version = "0.1.15" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | dependencies = [ 276 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 277 | ] 278 | 279 | [[package]] 280 | name = "lazy_static" 281 | version = "1.4.0" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | 284 | [[package]] 285 | name = "libc" 286 | version = "0.2.66" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | 289 | [[package]] 290 | name = "memchr" 291 | version = "2.2.1" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | 294 | [[package]] 295 | name = "muldiv" 296 | version = "0.2.1" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | 299 | [[package]] 300 | name = "num-integer" 301 | version = "0.1.41" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | dependencies = [ 304 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 305 | "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 306 | ] 307 | 308 | [[package]] 309 | name = "num-rational" 310 | version = "0.2.2" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | dependencies = [ 313 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 314 | "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 315 | "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", 316 | ] 317 | 318 | [[package]] 319 | name = "num-traits" 320 | version = "0.2.10" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | dependencies = [ 323 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 324 | ] 325 | 326 | [[package]] 327 | name = "paste" 328 | version = "0.1.6" 329 | source = "registry+https://github.com/rust-lang/crates.io-index" 330 | dependencies = [ 331 | "paste-impl 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 332 | "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", 333 | ] 334 | 335 | [[package]] 336 | name = "paste-impl" 337 | version = "0.1.6" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | dependencies = [ 340 | "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", 341 | "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 342 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 343 | "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", 344 | ] 345 | 346 | [[package]] 347 | name = "pin-utils" 348 | version = "0.1.0-alpha.4" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | 351 | [[package]] 352 | name = "pkg-config" 353 | version = "0.3.17" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | 356 | [[package]] 357 | name = "ppv-lite86" 358 | version = "0.2.6" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | 361 | [[package]] 362 | name = "proc-macro-hack" 363 | version = "0.5.11" 364 | source = "registry+https://github.com/rust-lang/crates.io-index" 365 | dependencies = [ 366 | "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 367 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 368 | "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", 369 | ] 370 | 371 | [[package]] 372 | name = "proc-macro-nested" 373 | version = "0.1.3" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | 376 | [[package]] 377 | name = "proc-macro2" 378 | version = "1.0.7" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | dependencies = [ 381 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 382 | ] 383 | 384 | [[package]] 385 | name = "quote" 386 | version = "1.0.2" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | dependencies = [ 389 | "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 390 | ] 391 | 392 | [[package]] 393 | name = "rand" 394 | version = "0.7.2" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | dependencies = [ 397 | "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 398 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 399 | "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 400 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 401 | "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 402 | ] 403 | 404 | [[package]] 405 | name = "rand_chacha" 406 | version = "0.2.1" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | dependencies = [ 409 | "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 410 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 411 | ] 412 | 413 | [[package]] 414 | name = "rand_core" 415 | version = "0.5.1" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | dependencies = [ 418 | "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 419 | ] 420 | 421 | [[package]] 422 | name = "rand_hc" 423 | version = "0.2.0" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | dependencies = [ 426 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 427 | ] 428 | 429 | [[package]] 430 | name = "redox_syscall" 431 | version = "0.1.56" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | 434 | [[package]] 435 | name = "rust-rtsp-server" 436 | version = "0.1.0" 437 | dependencies = [ 438 | "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", 439 | "clap 2.33.2 (registry+https://github.com/rust-lang/crates.io-index)", 440 | "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 441 | "futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 442 | "gstreamer 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", 443 | "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 444 | ] 445 | 446 | [[package]] 447 | name = "rustc-demangle" 448 | version = "0.1.16" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | 451 | [[package]] 452 | name = "serde" 453 | version = "1.0.104" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | dependencies = [ 456 | "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 457 | ] 458 | 459 | [[package]] 460 | name = "serde_derive" 461 | version = "1.0.104" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | dependencies = [ 464 | "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 465 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 466 | "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", 467 | ] 468 | 469 | [[package]] 470 | name = "slab" 471 | version = "0.4.2" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | 474 | [[package]] 475 | name = "strsim" 476 | version = "0.8.0" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | 479 | [[package]] 480 | name = "syn" 481 | version = "1.0.13" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | dependencies = [ 484 | "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 485 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 486 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 487 | ] 488 | 489 | [[package]] 490 | name = "synstructure" 491 | version = "0.12.3" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | dependencies = [ 494 | "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", 495 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 496 | "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", 497 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 498 | ] 499 | 500 | [[package]] 501 | name = "textwrap" 502 | version = "0.11.0" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | dependencies = [ 505 | "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 506 | ] 507 | 508 | [[package]] 509 | name = "time" 510 | version = "0.1.42" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | dependencies = [ 513 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 514 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 515 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 516 | ] 517 | 518 | [[package]] 519 | name = "unicode-width" 520 | version = "0.1.8" 521 | source = "registry+https://github.com/rust-lang/crates.io-index" 522 | 523 | [[package]] 524 | name = "unicode-xid" 525 | version = "0.2.0" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | 528 | [[package]] 529 | name = "uuid" 530 | version = "0.8.1" 531 | source = "registry+https://github.com/rust-lang/crates.io-index" 532 | dependencies = [ 533 | "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 534 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 535 | ] 536 | 537 | [[package]] 538 | name = "vec_map" 539 | version = "0.8.2" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | 542 | [[package]] 543 | name = "wasi" 544 | version = "0.7.0" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | 547 | [[package]] 548 | name = "winapi" 549 | version = "0.3.8" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | dependencies = [ 552 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 553 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 554 | ] 555 | 556 | [[package]] 557 | name = "winapi-i686-pc-windows-gnu" 558 | version = "0.4.0" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | 561 | [[package]] 562 | name = "winapi-x86_64-pc-windows-gnu" 563 | version = "0.4.0" 564 | source = "registry+https://github.com/rust-lang/crates.io-index" 565 | 566 | [metadata] 567 | "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" 568 | "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 569 | "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" 570 | "checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea" 571 | "checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" 572 | "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 573 | "checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" 574 | "checksum cc 1.0.49 (registry+https://github.com/rust-lang/crates.io-index)" = "e450b8da92aa6f274e7c6437692f9f2ce6d701fb73bacfcf87897b3f89a4c20e" 575 | "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 576 | "checksum chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" 577 | "checksum clap 2.33.2 (registry+https://github.com/rust-lang/crates.io-index)" = "10040cdf04294b565d9e0319955430099ec3813a64c952b86a41200ad714ae48" 578 | "checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" 579 | "checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" 580 | "checksum futures 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b6f16056ecbb57525ff698bb955162d0cd03bee84e6241c27ff75c08d8ca5987" 581 | "checksum futures-channel 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fcae98ca17d102fd8a3603727b9259fcf7fa4239b603d2142926189bc8999b86" 582 | "checksum futures-core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "79564c427afefab1dfb3298535b21eda083ef7935b4f0ecbfcb121f0aec10866" 583 | "checksum futures-executor 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e274736563f686a837a0568b478bdabfeaec2dca794b5649b04e2fe1627c231" 584 | "checksum futures-io 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e676577d229e70952ab25f3945795ba5b16d63ca794ca9d2c860e5595d20b5ff" 585 | "checksum futures-macro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "52e7c56c15537adb4f76d0b7a76ad131cb4d2f4f32d3b0bcabcbe1c7c5e87764" 586 | "checksum futures-sink 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "171be33efae63c2d59e6dbba34186fe0d6394fb378069a76dfd80fdcffd43c16" 587 | "checksum futures-task 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0bae52d6b29cf440e298856fec3965ee6fa71b06aa7495178615953fd669e5f9" 588 | "checksum futures-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c0d66274fb76985d3c62c886d1da7ac4c0903a8c9f754e8fe0f35a6a6cc39e76" 589 | "checksum getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407" 590 | "checksum glib 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "121c502fc6895e62d2ce084e677d3289ccbdd7f56edd4ac9a5ab8bd95d4a8670" 591 | "checksum glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "95856f3802f446c05feffa5e24859fe6a183a7cb849c8449afc35c86b1e316e2" 592 | "checksum gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31d1a804f62034eccf370006ccaef3708a71c31d561fee88564abe71177553d9" 593 | "checksum gstreamer 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08d9ea04f6e746e90d979eaf5b55a9125fd159e58959f203a2f3fbc4b2a93b77" 594 | "checksum gstreamer-sys 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d18da01b97d0ab5896acd5151e4c155acefd0e6c03c3dd24dd133ba054053db" 595 | "checksum hermit-abi 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9" 596 | "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 597 | "checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" 598 | "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" 599 | "checksum muldiv 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0419348c027fa7be448d2ae7ea0e4e04c2334c31dc4e74ab29f00a2a7ca69204" 600 | "checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" 601 | "checksum num-rational 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2885278d5fe2adc2f75ced642d52d879bffaceb5a2e0b1d4309ffdfb239b454" 602 | "checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4" 603 | "checksum paste 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "423a519e1c6e828f1e73b720f9d9ed2fa643dce8a7737fb43235ce0b41eeaa49" 604 | "checksum paste-impl 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4214c9e912ef61bf42b81ba9a47e8aad1b2ffaf739ab162bf96d1e011f54e6c5" 605 | "checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" 606 | "checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" 607 | "checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" 608 | "checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" 609 | "checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" 610 | "checksum proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0319972dcae462681daf4da1adeeaa066e3ebd29c69be96c6abb1259d2ee2bcc" 611 | "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" 612 | "checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412" 613 | "checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" 614 | "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 615 | "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 616 | "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" 617 | "checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" 618 | "checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" 619 | "checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" 620 | "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" 621 | "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 622 | "checksum syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1e4ff033220a41d1a57d8125eab57bf5263783dfdcc18688b1dacc6ce9651ef8" 623 | "checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" 624 | "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 625 | "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" 626 | "checksum unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" 627 | "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" 628 | "checksum uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11" 629 | "checksum vec_map 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 630 | "checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" 631 | "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" 632 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 633 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 634 | --------------------------------------------------------------------------------