shithub: rtmp

Download patch

ref: 55fd4285c635d6e55c6fa440cd523c264be5bf4a
parent: c5cb931f107d750192ca2c0a2b9d270acec68905
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Sun Aug 8 12:28:00 EDT 2021

put audio reading into a separate proc

--- a/README.md
+++ b/README.md
@@ -17,3 +17,5 @@
 this (change according to your preferences):
 
 	video/hj264 -f 10 /dev/screen | video/rtmp -a <{audio/aacenc </dev/audio} rtmp://....
+
+Audio loopback isn't ready yet.
--- a/main.c
+++ b/main.c
@@ -10,6 +10,9 @@
 int mainstacksize = 65536;
 int debug = 0;
 
+static RTMP *r;
+static ulong sid;
+
 static void
 usage(void)
 {
@@ -17,16 +20,39 @@
 	threadexitsall("usage");
 }
 
+static void
+audio(void *aux)
+{
+	ADTSFrame af;
+	Biobuf *a;
+	u64int ms;
+
+	a = aux;
+	memset(&af, 0, sizeof(af));
+	for(;;){
+		if(adtsread(a, &af) != 0)
+			sysfatal("%r");
+		if(af.sz == 0)
+			break;
+		ms = af.ns/1000000ULL;
+		if(rtmpdata(r, sid, ms, Taudio, af.buf, af.sz) != 0){
+			fprint(2, "%r\n");
+			break;
+		}
+	}
+
+	/* FIXME properly close RTMP connection */
+
+	threadexitsall(nil);
+}
+
 void
 threadmain(int argc, char **argv)
 {
-	u64int ms, until;
 	Biobuf *a, v;
-	ADTSFrame af;
 	IVFrame vf;
-	ulong sid;
+	u64int ms;
 	IVF ivf;
-	RTMP *r;
 
 	a = nil;
 	ARGBEGIN{
@@ -58,7 +84,9 @@
 		sysfatal("%r");
 	}
 
-	memset(&af, 0, sizeof(af));
+	if(a != nil)
+		proccreate(audio, a, mainstacksize);
+
 	memset(&vf, 0, sizeof(vf));
 	for(;;){
 		if(ivfread(&v, &vf) != 0)
@@ -70,27 +98,9 @@
 			fprint(2, "%r\n");
 			break;
 		}
-
-		/* FIXME obviously this has to run in a separate frame (same for video, actually) */
-		if(a == nil)
-			continue;
-		until = ms + 250; /* provide audio enough to cover + 250 ms over video */
-		do{
-			if(adtsread(a, &af) != 0)
-				sysfatal("%r");
-			if(af.sz == 0)
-				break;
-			ms = af.ns/1000000ULL;
-			if(rtmpdata(r, sid, ms, Taudio, af.buf, af.sz) != 0){
-				fprint(2, "%r\n");
-				break;
-			}
-		}while(ms < until);
 	}
 
-	if(a != nil)
-		Bterm(a);
-	rtmpclose(r);
+	/* FIXME properly close RTMP connection */
 
 	threadexitsall(nil);
 }