ref: aad9511a85b15ced2fde315c693ce12a05f1f315
dir: /main.c/
#include <u.h>
#include <libc.h>
#include <bio.h>
#include "common.h"
enum
{
Outbufsz = 256*1024,
Inbufsz = 256*1024,
};
Biobuf stderr, out;
int dflag, trackdump;
static void
usage(void)
{
fprint(2, "usage: %s [-t INDEX|audio|video] [FILE]\n", argv0);
exits("usage");
}
void
main(int argc, char **argv)
{
u8int d[4], *outbuf, *inbuf;
char *s, *status;
Biobuf f;
int fd;
fmtinstall('H', encodefmt);
fmtinstall('T', isotypefmt);
fmtinstall('P', srttsfmt);
dflag = 0;
trackdump = Nodump;
ARGBEGIN{
case 'd':
dflag++;
break;
case 't':
s = EARGF(usage());
if(strcmp(s, "audio") == 0)
trackdump = Dumpaudio;
else if(strcmp(s, "video") == 0)
trackdump = Dumpvideo;
else
trackdump = atoi(s);
break;
default:
usage();
}ARGEND
if((outbuf = malloc(Outbufsz)) == nil)
sysfatal("memory");
if((inbuf = malloc(Inbufsz)) == nil)
sysfatal("memory");
fd = 0;
if(argc == 1)
fd = open(*argv, OREAD);
else if(argc != 0)
usage();
if(Binits(&f, fd, OREAD, inbuf, Inbufsz) != 0)
sysfatal("%r");
if(Binits(&out, 1, OWRITE, outbuf, Outbufsz) != 0)
sysfatal("%r");
if(Binit(&stderr, 2, OWRITE) != 0)
sysfatal("%r");
status = nil;
if(Bread(&f, d, 4) != 4){
Bprint(&stderr, "unknown format\n");
status = "unknown format";
}else if(Bungetc(&f) < 0 || Bungetc(&f) < 0 || Bungetc(&f) < 0 || Bungetc(&f) < 0){
Bprint(&stderr, "seek back failed: %r\n");
status = "seek failed";
}else if(memcmp(d, "\x1a\x45\xdf\xa3", 4) == 0){
if(ebmlrun(&f) != 0){
Bprint(&stderr, "embl: %r\n");
status = "ebml failed";
}
}else if(isorun(&f) != 0){
Bprint(&stderr, "iso: %r\n");
status = "iso failed";
}
Bterm(&f);
Bterm(&out);
Bterm(&stderr);
exits(status);
}