1 #include <arcan_shmif.h>
2 
main(int argc,char ** argv)3 int main(int argc, char** argv)
4 {
5 	if (argc != 3){
6 		printf("usage: encfwd cp1(input:encode) cp2(forward:media)\n");
7 		return EXIT_FAILURE;
8 	}
9 
10 	setenv("ARCAN_CONNPATH", argv[1], 1);
11 	struct arcan_shmif_cont enc =
12 		arcan_shmif_open(SEGID_ENCODER, SHMIF_ACQUIRE_FATALFAIL, NULL);
13 	printf("encoder connected: %zu, %zu\n", enc.w, enc.h);
14 
15 	setenv("ARCAN_CONNPATH", argv[2], 1);
16 	struct arcan_shmif_cont fwd =
17 		arcan_shmif_open(SEGID_APPLICATION, SHMIF_ACQUIRE_FATALFAIL, NULL);
18 
19 	for (;;){
20 		struct arcan_event ev;
21 
22 /* check the main segment for the encoder reply */
23 		if (fwd.w != enc.w || fwd.h != enc.h){
24 			if (!arcan_shmif_resize(&fwd, enc.w, enc.h)){
25 				fprintf(stderr, "couldn't synch src-dst size(%zu*%zu)\n", enc.w, enc.h);
26 				break;
27 			}
28 		}
29 
30 		int rv = arcan_shmif_poll(&enc, &ev);
31 		if (rv < 0){
32 			fprintf(stderr, "poll failed on enc (source)\n");
33 			break;
34 		}
35 
36 /* naively assume same forward and pitch, just memcpy */
37 		if (ev.category == EVENT_TARGET &&
38 			ev.tgt.kind == TARGET_COMMAND_STEPFRAME)
39 		{
40 			memcpy(fwd.vidp, enc.vidp, enc.w * enc.h * sizeof(shmif_pixel));
41 			arcan_shmif_signal(&enc, SHMIF_SIGVID);
42 			arcan_shmif_signal(&fwd, SHMIF_SIGVID);
43 		}
44 
45 /* just flush */
46 		while ((rv = arcan_shmif_poll(&fwd, &ev) > 0)){}
47 		if (rv < 0){
48 			fprintf(stderr, "poll failed on fwd\n");
49 			break;
50 		}
51 	}
52 
53 	arcan_shmif_drop(&enc);
54 	arcan_shmif_drop(&fwd);
55 	return EXIT_SUCCESS;
56 }
57