ref: 19cbe98daef0d058a0387f03cc36e44f9169e04b
parent: 89924ce1822fa32494ad66fa2bbd4d6553c8669a
author: Sigrid Haflínudóttir <ftrvxmtrx@gmail.com>
date: Fri Sep 11 06:22:25 EDT 2020
rename mp4* to mc* (multimedia container)
--- a/mkfile
+++ b/mkfile
@@ -17,7 +17,7 @@
misc.$O\
stream.$O\
stream_ivf.$O\
- stream_mp4.$O\
+ stream_mc.$O\
yuv.$O\
default:V: all
--- a/stream.c
+++ b/stream.c
@@ -3,13 +3,13 @@
#include "stream.h"
extern Streamops ivfops;
-extern Streamops mp4ops;
+extern Streamops mcops;
static struct {
char *name;
Streamops *o;
}ops[] = {
- {"mp4", &mp4ops},
+ {"mc", &mcops},
{"ivf", &ivfops},
};
--- /dev/null
+++ b/stream_mc.c
@@ -1,0 +1,111 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "stream.h"
+#include "misc.h"
+
+enum {
+ Maxstreams = 2,
+};
+
+static int
+mcfs(char **argv, int *pipefd)
+{
+ int p[2], pid, fd;
+
+ pipe(p);
+ if((pid = rfork(RFFDG|RFPROC|RFNOMNT)) == 0){
+ close(0);
+ close(p[0]);
+ dup(p[1], 1); close(p[1]);
+ if(!debug){
+ dup(fd = open("/dev/null", OWRITE), 2);
+ close(fd);
+ }
+ exec("/bin/mcfs", argv);
+ sysfatal("exec: %r");
+ }
+ close(p[1]);
+ if(pid < 0)
+ close(p[0]);
+ *pipefd = p[0];
+
+ return pid;
+}
+
+static Stream *
+mcopen(char *filename, int *num, int *failed)
+{
+ Waitmsg *w;
+ char *line;
+ int p, pid, n, ns;
+ Biobuf b;
+ char *argv[] = {
+ "mcfs",
+ "-i",
+ filename,
+ nil,
+ nil,
+ };
+ Stream *s, *streams;
+ int nvideo, naudio, sp;
+ char *v[8];
+
+ if((pid = mcfs(argv, &p)) < 0)
+ return nil;
+ if((streams = calloc(Maxstreams, sizeof(Stream))) == nil)
+ return nil;
+
+ Binit(&b, p, OREAD);
+ for(ns = naudio = nvideo = 0; ns < Maxstreams && (line = Brdstr(&b, '\n', 1)) != nil;){
+ n = tokenize(line, v, nelem(v));
+ if(n > 4 && str2fmt(v[2]) >= 0){
+ argv[1] = "-t";
+ argv[2] = v[0]; /* stream id */
+ argv[3] = filename;
+ s = streams+ns;
+
+ if(nvideo < 1 && strcmp(v[1], "video") == 0){
+ if(mcfs(argv, &sp) > 0 && ivfopenb(Bfdopen(sp, OREAD), s, failed) == 0){
+ nvideo++;
+ ns++;
+ }
+ }else if(naudio < 1 && strcmp(v[1], "audio") == 0){
+ /* FIXME add audio streams */
+ }
+ }
+ free(line);
+ }
+ Bterm(&b);
+
+ *num = ns;
+ if(ns < 1){
+ werrstr("no streams");
+ *failed = 1;
+
+ free(streams);
+ streams = nil;
+
+ while((w = wait()) != nil){
+ if(w->pid == pid){
+ if(w->msg[0] != 0){
+ werrstr("%s", w->msg);
+ goto err;
+ }
+ free(w);
+ break;
+ }
+ free(w);
+ }
+ }
+
+ return streams;
+err:
+ free(w);
+ free(streams);
+ return nil;
+}
+
+Streamops mcops = {
+ .open = mcopen,
+};
--- a/stream_mp4.c
+++ /dev/null
@@ -1,111 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include "stream.h"
-#include "misc.h"
-
-enum {
- Maxstreams = 2,
-};
-
-static int
-mcfs(char **argv, int *pipefd)
-{
- int p[2], pid, fd;
-
- pipe(p);
- if((pid = rfork(RFFDG|RFPROC|RFNOMNT)) == 0){
- close(0);
- close(p[0]);
- dup(p[1], 1); close(p[1]);
- if(!debug){
- dup(fd = open("/dev/null", OWRITE), 2);
- close(fd);
- }
- exec("/bin/mcfs", argv);
- sysfatal("exec: %r");
- }
- close(p[1]);
- if(pid < 0)
- close(p[0]);
- *pipefd = p[0];
-
- return pid;
-}
-
-static Stream *
-mp4open(char *filename, int *num, int *failed)
-{
- Waitmsg *w;
- char *line;
- int p, pid, n, ns;
- Biobuf b;
- char *argv[] = {
- "mcfs",
- "-i",
- filename,
- nil,
- nil,
- };
- Stream *s, *streams;
- int nvideo, naudio, sp;
- char *v[8];
-
- if((pid = mcfs(argv, &p)) < 0)
- return nil;
- if((streams = calloc(Maxstreams, sizeof(Stream))) == nil)
- return nil;
-
- Binit(&b, p, OREAD);
- for(ns = naudio = nvideo = 0; ns < Maxstreams && (line = Brdstr(&b, '\n', 1)) != nil;){
- n = tokenize(line, v, nelem(v));
- if(n > 4 && str2fmt(v[2]) >= 0){
- argv[1] = "-t";
- argv[2] = v[0]; /* stream id */
- argv[3] = filename;
- s = streams+ns;
-
- if(nvideo < 1 && strcmp(v[1], "video") == 0){
- if(mcfs(argv, &sp) > 0 && ivfopenb(Bfdopen(sp, OREAD), s, failed) == 0){
- nvideo++;
- ns++;
- }
- }else if(naudio < 1 && strcmp(v[1], "audio") == 0){
- /* FIXME add audio streams */
- }
- }
- free(line);
- }
- Bterm(&b);
-
- *num = ns;
- if(ns < 1){
- werrstr("no streams");
- *failed = 1;
-
- free(streams);
- streams = nil;
-
- while((w = wait()) != nil){
- if(w->pid == pid){
- if(w->msg[0] != 0){
- werrstr("%s", w->msg);
- goto err;
- }
- free(w);
- break;
- }
- free(w);
- }
- }
-
- return streams;
-err:
- free(w);
- free(streams);
- return nil;
-}
-
-Streamops mp4ops = {
- .open = mp4open,
-};