| @@ -6,6 +6,15 @@ · 5 unmodified lines |
| 6 | 6 | |
| 7 | 7 | enum { |
| 8 | 8 | Maxstreams = 2, |
| 9 | + Bufsz = 64*1024, |
| 10 | +}; |
| 11 | + |
| 12 | +typedef struct MCaux MCaux; |
| 13 | + |
| 14 | +struct MCaux { |
| 15 | + int fd; |
| 16 | + Biobuf bio; |
| 17 | + u8int buf[Bufsz]; |
| 9 | 18 | }; |
| 10 | 19 | |
| 11 | 20 | static int |
| @@ -47,6 +56,16 @@ audfmt(char *fmt) · 35 unmodified lines |
| 47 | 56 | return -1; |
| 48 | 57 | } |
| 49 | 58 | |
| 59 | +static void |
| 60 | +freeaux(void *aux) |
| 61 | +{ |
| 62 | + MCaux *a; |
| 63 | + |
| 64 | + a = aux; |
| 65 | + close(a->fd); |
| 66 | + free(a); |
| 67 | +} |
| 68 | + |
| 50 | 69 | static Stream * |
| 51 | 70 | mcopen(char *filename, int *num, int *failed) |
| 52 | 71 | { |
| @@ -54,6 +73,7 @@ mcopen(char *filename, int *num, int *failed) · 1 unmodified line |
| 54 | 73 | char *line; |
| 55 | 74 | int p, pid, n, ns; |
| 56 | 75 | Biobuf b; |
| 76 | + MCaux *a; |
| 57 | 77 | char *argv[] = { |
| 58 | 78 | "mcfs", |
| 59 | 79 | filename, |
| @@ -82,9 +102,16 @@ mcopen(char *filename, int *num, int *failed) · 22 unmodified lines |
| 82 | 102 | if(nvideo < 1 && strcmp(v[1], "video") == 0){ |
| 83 | 103 | s->video.w = atoi(v[3]); |
| 84 | 104 | s->video.h = atoi(v[4]); |
| 85 | | − if(mcfs(argv, &sp) > 0 && ivfopenb(Bfdopen(sp, OREAD), s, failed) == 0){ |
| 86 | | − nvideo++; |
| 87 | | − ns++; |
| 105 | + if(mcfs(argv, &sp) > 0){ |
| 106 | + if((a = malloc(sizeof(*a))) == nil) |
| 107 | + sysfatal("memory"); |
| 108 | + a->fd = sp; |
| 109 | + s->aux = a; |
| 110 | + s->freeaux = freeaux; |
| 111 | + if(Binits(&a->bio, sp, OREAD, a->buf, Bufsz) == 0 && ivfopenb(&a->bio, s, failed) == 0){ |
| 112 | + nvideo++; |
| 113 | + ns++; |
| 114 | + } |
| 88 | 115 | } |
| 89 | 116 | }else if(naudio < 1 && strcmp(v[1], "audio") == 0 && (s->fmt = audfmt(v[2])) >= 0){ |
| 90 | 117 | s->audio.nchan = atoi(v[3]); |