shithub: hj264

Download patch

ref: 15ebc8dd890b8e843ef20bb54736215c6e0e4925
parent: a3dc6a1a11abd625563c2caa0303c8dde6fcf2f7
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Tue Jul 13 11:03:45 EDT 2021

limit fps (in a dumb way)

--- a/hj264.c
+++ b/hj264.c
@@ -7,6 +7,8 @@
 #include <memdraw.h>
 #include <tos.h>
 
+void npe_nsleep(uvlong ns);
+
 #define max(a,b) ((a)>(b)?(a):(b))
 #define min(a,b) ((a)<(b)?(a):(b))
 #define clp(v,a,b) min((b), max((v),(a)))
@@ -303,8 +305,8 @@
 main(int argc, char **argv)
 {
 	int nthreads, fps, kbps, denoise, quality, qp;
+	uvlong start, end, fstart, fend;
 	int ww, hh, in, nframes;
-	uvlong start, end;
 	Memimage *im;
 	Hj264 *h;
 	char *s;
@@ -355,6 +357,7 @@
 	h = nil;
 	start = nanosec();
 	for(nframes = 0;; nframes++){
+		fstart = nanosec();
 		seek(in, 0, 0);
 		if((im = readmemimage(in)) == nil)
 			break;
@@ -367,6 +370,8 @@
 			if(Binit(&h->out, 1, OWRITE) < 0)
 				sysfatal("Binit failed: %r");
 			h->frame = chancreate(sizeof(void*), fps);
+
+			/* FIXME how about changing these on the fly? */
 			h->rp.encode_speed = Maxquality - quality;
 			h->rp.qp_min = h->rp.qp_max = qp;
 			if(kbps > 0){
@@ -377,8 +382,12 @@
 			proccreate(encthread, h, mainstacksize);
 		}
 
-		sendp(h->frame, im);
+		if(sendp(h->frame, im) != 1)
+			break;
+		fend = nanosec();
 
+		if(1000000000ULL/fps > (fend - fstart))
+			npe_nsleep(1000000000ULL/fps - (fend - fstart));
 		if(nanosec() - start > 4000000000ULL)
 			break;
 	}