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