Sigrid Solveig Haflínudóttirextra: add video/adtsdump utilitya930f635 years agoHistory
141 lines · 2.1 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <bio.h> static char *objtype[] = {	"aac main",	"aac lc  ",	"aac ssr ",	"aac ltp ",}; static char *rate[] = {	"96000",	"88200",	"64000",	"48000",	"44100",	"32000",	"24000",	"22050",	"16000",	"12000",	"11025",	"8000 ",	"7350 ",	"???  ",	"???  ",	"expl ",}; static char *chan[] = {	"AOT",	"1  ",	"2  ",	"3  ",	"4  ",	"5  ",	"6  ",	"8  ",	"???",	"???",	"???",	"???",	"???",	"???",	"???",	"???",}; static voidusage(void){	fprint(2, "usage: %s [-h hxsz] [file.aac]\n", argv0);	exits("usage");} voidmain(int argc, char **argv){	int hxsz, fd, d, n, sz;	Biobuf in, out;	u8int b[7], *h; 	hxsz = 0;	ARGBEGIN{	case 'h':		if((hxsz = atoi(EARGF(usage()))) > 0){			fmtinstall('H', encodefmt);			break;		}	default:		usage();	}ARGEND 	fd = 0;	if(argc == 1){		if((fd = open(*argv, OREAD)) < 0)			sysfatal("%r");	}else if(argc != 0)		usage(); 	if((h = malloc(hxsz)) == nil)		sysfatal("memory"); 	Binit(&in, fd, OREAD);	Binit(&out, 1, OWRITE);	fmtinstall('H', encodefmt); 	for(;;){		if((n = Bread(&in, b, 7)) == 0)			break;		if(n < 0)			goto err;		if(n != 7){			werrstr("short ADTS: %d != 7", n);			goto err;		} 		if(b[0] != 0xff || (b[0]&0xf0) != 0xf0){			werrstr("invalid syncword %2x%02x", b[0], b[1]);			goto err;		}		sz = (b[3]&3)<<11 | b[4]<<3 | b[5]>>5;		sz -= 7;		Bprint(&out, "%s %s %s %s %d %d",			(b[1]&8) ? "mpeg2" : "mpeg4",			objtype[b[2]>>6],			rate[(b[2]>>2)&0xf],			chan[(b[2]&3)<<2 | b[3]>>6],			sz - ((b[1]&1) == 0 ? 2 : 0),			(b[6]&3)+1		);		if((b[1]&1) == 0){ /* skip crc */			if((n = Bread(&in, b, 2)) != 2){ 				werrstr("short ADTS.crc: %d != 2", n);				goto err;			}			sz -= 2;		}		d = sz < hxsz ? sz : hxsz;		sz -= d;		if(d > 0){			if((n = Bread(&in, h, d)) != d){				werrstr("short read: %d != %d", n, d);				goto err;			}			Bprint(&out, " [%.*H]", d, h);		}		Bprint(&out, "\n");		if(Bseek(&in, sz, 1) < 0)			goto err;	} 	Bterm(&out);	Bterm(&in); 	exits(nil);err:	fprint(2, "%s: %r (at %#llx)\n", fd == 0 ? "stdin" : *argv, Boffset(&in));	exits("error");}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t