ref: 17578ac2a4ded4303459881acd0d149188692292
parent: cad6611cd489fd7214576800cd5e461a51a7e60a
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Sat Jul 30 18:49:26 EDT 2022
exit cleanly; print average fps when debug is enabled
--- a/hj264.c
+++ b/hj264.c
@@ -137,12 +137,10 @@
{
int e;
- if((e = H264E_encode(h->persist, h->scratch, &h->rp, &h->ioyuv, data, sz)) != 0){
+ if((e = H264E_encode(h->persist, h->scratch, &h->rp, &h->ioyuv, data, sz)) != 0)
werrstr("H264E_encode: %ℏ", e);
- return -1;
- }
- return 0;
+ return e;
}
static Hj264 *
@@ -205,7 +203,7 @@
t->id = i;
t->job = chancreate(sizeof(void*), 0);
t->done = chancreate(sizeof(void*), 0);
- procrfork(threadf, t, mainstacksize, RFCFDG|RFCENVG);
+ proccreate(threadf, t, mainstacksize);
recvp(t->done);
}
@@ -213,7 +211,7 @@
}
static void
-hj264free(Hj264 *h)
+hj264close(Hj264 *h)
{
int i;
@@ -222,9 +220,20 @@
chanclose(h->threads[i].job);
}
- free(h);
+ Bflush(&h->out);
}
+static int
+done(void*, char*)
+{
+ Hj264 *h;
+
+ h = *threaddata();
+ Bflush(&h->out);
+
+ return 1;
+}
+
static void
encthread(void *p)
{
@@ -234,12 +243,15 @@
Hj264 *h;
int sz;
- threadsetname("hj264/encthread");
-
h = p;
prev = nil;
+
+ threadsetname("hj264/encthread");
+ threadnotify(done, 1);
+ *threaddata() = h;
+
for(;;){
- if((img = recvp(h->frame)) == nil)
+ if(recv(h->frame, &img) < 0)
break;
if(opt && prev != nil && memcmp(img->bgrx, prev->bgrx, img->w*img->h*4) == 0){
free(img);
@@ -316,25 +328,12 @@
threadexitsall("usage");
}
-static int
-done(void *, char *)
-{
- Hj264 *h;
-
- if((h = *procdata()) != nil){
- chanclose(h->frame);
- recvp(h->done);
- }
-
- return 1;
-}
-
int
main(int argc, char **argv)
{
int nthreads, fps, kbps, denoise, quality, qp, gop;
char *s, tmp[61], *f[5];
- uvlong fstart, fend;
+ uvlong fstart, fend, f₀;
int ww, hh, in, fmt;
u8int v[20];
Img *img;
@@ -428,9 +427,7 @@
h->rp.qp_max = 50;
h->rp.desired_frame_bytes = kbps*1000/8/fps;
}
- *procdata() = h;
- atnotify(done, 1);
- procrfork(encthread, h, mainstacksize, RFCENVG);
+ proccreate(encthread, h, mainstacksize);
if(h->fmt == FmtIVF){
Bwrite(&h->out, "DKIF\x00\x00\x20\x00AVC1", 12);
@@ -452,7 +449,8 @@
return -1;
}
- tstart = nsec() - npe_nanosec();
+ f₀ = npe_nanosec();
+ tstart = nsec() - f₀;
for(nframes = 0;; nframes++){
fstart = npe_nanosec();
if((img = imgread(in, ww, hh)) == nil)
@@ -461,13 +459,14 @@
break;
fend = npe_nanosec();
+ if(debug && nframes > 0 && (nframes % fps) == 0)
+ fprint(2, "avg fps: %llud\n", nframes/((fend - f₀)/Nsec));
+
if(Nsec/fps > (fend - fstart))
npe_nsleep(Nsec/fps - (fend - fstart));
}
chanclose(h->frame);
- recvp(h->done);
- hj264free(h);
- return done(nil, nil);
+ return 0;
}