~ft/mcfs

f8e5a16a06c337bafb54921804a90fe4229ea3e9 — Sigrid Haflínudóttir 2 months ago 7c5bc84
wip
1 files changed, 65 insertions(+), 15 deletions(-)

M iso.c
M iso.c => iso.c +65 -15
@@ 45,6 45,13 @@ struct Box {
			u64int modification;
			u64int duration;
			u32int timescale;
		}mdhd;

		struct {
			u64int creation;
			u64int modification;
			u64int duration;
			u32int timescale;
			u32int rate;
			u32int matrix[9];
			u32int nexttrack;


@@ 191,6 198,7 @@ enum {
					BoxStbl = 0x7374626cu,
						BoxCtts = 0x63747473u,
					BoxStsd = 0x73747364u,
						BoxEsds = 0x65736473u,
					BoxStts = 0x73747473u,
					BoxStsc = 0x73747363u,
					BoxStco = 0x7374636fu,


@@ 217,7 225,7 @@ enum {
	b->type == BoxMfhd || b->type == BoxTfhd || b->type == BoxTfdt || b->type == BoxTrun || \
	b->type == BoxStsd || b->type == BoxStts || b->type == BoxStss || b->type == BoxTkhd || \
	b->type == BoxElst || b->type == BoxStsc || b->type == BoxStco || b->type == BoxCo64 || \
	b->type == BoxStsz || b->type == BoxCtts \
	b->type == BoxStsz || b->type == BoxCtts || b->type == BoxEsds \
)

#define eBread(sz, e) if(Bread(f, d, (sz)) != (sz)){ werrstr(e); goto err; }


@@ 279,6 287,11 @@ printbox(Box *b)
		for(i = 0; i < b->ftyp.ncompat; i++)
			fprint(2, "\t%.*s%T", dind, ind, b->ftyp.compat[i]);
		fprint(2, "\n");
	}else if(b->type == BoxMdhd){
		fprint(2, "\t%.*screation\t%zd\n", dind, ind, b->mdhd.creation);
		fprint(2, "\t%.*smodification\t%zd\n", dind, ind, b->mdhd.modification);
		fprint(2, "\t%.*stimescale\t%ud\n", dind, ind, b->mdhd.timescale);
		fprint(2, "\t%.*sduration\t%zd\n", dind, ind, b->mdhd.duration);
	}else if(b->type == BoxMvhd){
		fprint(2, "\t%.*screation\t%zd\n", dind, ind, b->mvhd.creation);
		fprint(2, "\t%.*smodification\t%zd\n", dind, ind, b->mvhd.modification);


@@ 459,8 472,8 @@ dumptrack(Biobuf *f, int id)
	}
	if(t->video.format != 0){
		fprint(2, "video: format=%T resolution=%dx%d\n", t->video.format, t->video.width, t->video.height);
		werrstr("video: unknown format %T", t->video.format);
		return -1;
		//werrstr("video: unknown format %T", t->video.format);
		//return -1;
	}

	Binit(&out, 1, OWRITE);


@@ 537,15 550,17 @@ sampleentry(Biobuf *f, Box *b, u32int fmt, int n)
		eBread(2+2+4*3 + 2+2 + 4+4 + 4 + 2 + 32, "SampleEntry: video");
		b->stsd.video.width = bu16(d+16);
		b->stsd.video.height = bu16(d+18);
		n -= 2+2+4*3 + 2+2 + 4+4 + 4 + 2 + 32;

		memmove(&track.video, &b->stsd.video, sizeof(Video));
	}else if(track.handlertype == HandlerAudio){
		b->stsd.audio.format = fmt;

		/* reserved+id, ver+rev+vendor, channels+bps, ?+?, sample rate */
		/* ver+rev+vendor, channels+bps, ?+?, sample rate */
		eBread(2+4+2 + 2+2 + 2+2 + 4, "SampleEntry: audio");
		b->stsd.audio.channels = bu16(d+8);
		b->stsd.audio.samplerate = bu32(d+16)>>16;
		n -= 2+4+2 + 2+2 + 2+2 + 4;

		memmove(&track.audio, &b->stsd.audio, sizeof(Audio));
		/* FIXME do we care about the rest? */


@@ 553,7 568,7 @@ sampleentry(Biobuf *f, Box *b, u32int fmt, int n)
		fprint(2, "SampleEntry: unknown handler type %T\n", track.handlertype);
	}

	return n - sizeof(d);
	return n;
err:
	return -1;
}


@@ 584,7 599,8 @@ parseboxdata(Biobuf *f, Box *b)
		printbox(b);
	}else if(b->type == BoxMoov || b->type == BoxMvex || b->type == BoxTrak ||
		b->type == BoxMdia || b->type == BoxMinf || b->type == BoxStbl ||
		b->type == BoxMoof || b->type == BoxTraf || b->type == BoxEdts){
		b->type == BoxMoof || b->type == BoxTraf || b->type == BoxEdts ||
		b->type == BoxDinf){
		printbox(b);
		dind++;
		for(;;){


@@ 600,6 616,28 @@ parseboxdata(Biobuf *f, Box *b)
			memset(&track, 0, sizeof(track));
		}
		dind--;
	}else if(b->type == BoxMdhd){
		n = b->version == 0 ? 16 : 28;
		eBread(n, "short read");
		p = d;

		b->mdhd.creation = bu32(p); p += 4;
		if(b->version == 1){
			b->mdhd.creation = b->mdhd.creation<<32 | bu32(p); p += 4;
		}

		b->mdhd.modification = bu32(p); p += 4;
		if(b->version == 1){
			b->mdhd.modification = b->mdhd.modification<<32 | bu32(p); p += 4;
		}

		b->mdhd.timescale = bu32(p); p += 4;

		b->mdhd.duration = bu32(p); p += 4;
		if(b->version == 1){
			b->mdhd.duration = b->mdhd.duration<<32 | bu32(p);
		}
		printbox(b);
	}else if(b->type == BoxMvhd){
		n = b->version == 0 ? 96 : 108;
		eBread(n, "short read");


@@ 716,19 754,31 @@ parseboxdata(Biobuf *f, Box *b)
			}
		}
		printbox(b);
	}else if(b->type == BoxEsds){
		eBread(3, "es id");
		fprint(2, "# es id: %ud\n# es flags: 0x%02x\n", bu16(d+1), d[3]);
		printbox(b);
	}else if(b->type == BoxStsd){
		eBread(4, "entry_count");
		b->stsd.entrycount = bu32(d);
		for(u = 0; u < b->stsd.entrycount; u++){
			eBread(4, "size");
			n = bu32(d);
			eBread(4, "format");
			Bseek(f, 6+2, 1); /* skip reserved+id */
			n -= 8 + 6+2;
			n = sampleentry(f, b, bu32(d), n);
			Bseek(f, n, 1);
		}
		eBread(4, "size");
		n = bu32(d);
		eBread(4, "format");
		Bseek(f, 6+2, 1); /* skip reserved+id */
		n -= 8 + 6+2;
		n = sampleentry(f, b, bu32(d), n);
		printbox(b);

		dind += 2;
		for(; n > 0;){
			memset(&inner, 0, sizeof(inner));
			if(parsebox(f, &inner, &eof) != 0)
				goto err;
			Bseek(f, inner.dstart+inner.dsz, 0);
			if(inner.dstart+inner.dsz >= b->dstart+b->dsz)
				break;
		}
		dind -= 2;
	}else if(b->type == BoxStts){
		eBread(4, "entry_count");
		b->stts.entrycount = bu32(d);