diff --git a/src/ssdv.rs b/src/ssdv.rs
index 63784d3fc4026b94d2a7f54a3175f9a6245fec53..f8e75907b1620032d9e4a5980bbe5e5ddce3de0a 100644
--- a/src/ssdv.rs
+++ b/src/ssdv.rs
@@ -1,12 +1,14 @@
 use anyhow::{bail, Context};
+use subprocess::{Popen, PopenConfig, Redirection};
 
 use crate::packet::RawPacket;
 
 // TODO eventually rewrite Ssdv in Rust?
 // Don't want to use FFI because then segfaults can hurt us
 pub fn ssdv_encode(callsign: &str, img: &[u8], img_idx: u8) -> anyhow::Result<Vec<RawPacket>> {
-    let (stdout, stderr) = subprocess::Exec::cmd("ssdv")
-        .args(&[
+    let mut p = Popen::create(
+        &[
+            "ssdv",
             "-e",
             "-c",
             callsign,
@@ -15,10 +17,16 @@ pub fn ssdv_encode(callsign: &str, img: &[u8], img_idx: u8) -> anyhow::Result<Ve
             "6",
             "-i",
             &format!("{}", img_idx),
-        ])
-        .stdin(img.to_vec())
-        .communicate()?
-        .read()?;
+        ],
+        PopenConfig {
+            stdin: Redirection::Pipe,
+            stdout: Redirection::Pipe,
+            stderr: Redirection::Pipe,
+            ..Default::default()
+        },
+    )?;
+
+    let (stdout, stderr) = p.communicate_bytes(Some(img))?;
 
     if let Some(stderr) = stderr {
         if !stderr.is_empty() {