ref: ab497acde3c65099cedd199cf49602c743d7e669
parent: d5b4ab2f6f4446795242254fbb4e0a33966c9bf8
author: Sigrid Haflínudóttir <ftrvxmtrx@gmail.com>
date: Mon Mar 16 21:36:44 EDT 2020
stss and stsc
--- a/iso.c
+++ b/iso.c
@@ -82,6 +82,20 @@
}stts;
struct {+ u32int entrycount;
+ /* FIXME entries */
+ }stss;
+
+ struct {+ u32int entrycount;
+ struct {+ u32int firstchunk;
+ u32int samplesperchunk;
+ u32int sdt;
+ }*entry;
+ }stsc;
+
+ struct {u64int creattime;
u64int modtime;
u32int trackid;
@@ -112,6 +126,8 @@
BoxMvex = 0x6d766578u,
BoxTrex = 0x74726578u,
BoxTrak = 0x7472616bu,
+ BoxEdts = 0x65647473u,
+ BoxElst = 0x656c7374u,
BoxTkhd = 0x746b6864u,
BoxMdia = 0x6d646961u,
BoxMdhd = 0x6d646864u,
@@ -143,7 +159,8 @@
#define isfullbox(b) ( \
b->type == BoxMvhd || b->type == BoxTrex || b->type == BoxMdhd || b->type == BoxHdlr || \
b->type == BoxMfhd || b->type == BoxTfhd || b->type == BoxTfdt || b->type == BoxTrun || \
- b->type == BoxStsd || b->type == BoxStts || b->type == BoxTkhd \
+ b->type == BoxStsd || b->type == BoxStts || b->type == BoxStss || b->type == BoxTkhd || \
+ b->type == BoxElst || b->type == BoxStsc \
)
#define eBread(sz, e) if(Bread(f, d, sz) != sz){ werrstr(e); goto err; }@@ -265,6 +282,16 @@
print("\t%.*sentry_count\t%ud\n", dind, ind, b->stsd.entrycount); }else if(b->type == BoxStts){ print("\t%.*sentry_count\t%ud\n", dind, ind, b->stts.entrycount);+ }else if(b->type == BoxStss){+ print("\t%.*sentry_count\t%ud\n", dind, ind, b->stss.entrycount);+ }else if(b->type == BoxStsc){+ print("\t%.*sentry_count\t%ud\n", dind, ind, b->stss.entrycount);+ for(u = 0; u < b->stsc.entrycount; u++){+ print("\t%.*sentry[%zd]\n", dind, ind, u);+ print("\t\t%.*sfirst_chunk\t%ud\n", dind, ind, b->stsc.entry[u].firstchunk);+ print("\t\t%.*ssamples_per_chunk\t%ud\n", dind, ind, b->stsc.entry[u].samplesperchunk);+ print("\t\t%.*ssample_description_table\t%ud\n", dind, ind, b->stsc.entry[u].sdt);+ }
}else if(b->type == BoxTkhd){ print("\t%.*screation_time\t%zd\n", dind, ind, b->tkhd.creattime); print("\t%.*smodification_timetime\t%zd\n", dind, ind, b->tkhd.modtime);@@ -307,7 +334,7 @@
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 == BoxMoof || b->type == BoxTraf || b->type == BoxEdts){printbox(b);
dind++;
for(;;){@@ -446,6 +473,24 @@
eBread(4, "entry_count");
b->stts.entrycount = bu32(d);
/* FIXME not reading actual entries here */
+ printbox(b);
+ }else if(b->type == BoxStss){+ eBread(4, "entry_count");
+ b->stss.entrycount = bu32(d);
+ /* FIXME not reading actual entries here */
+ printbox(b);
+ }else if(b->type == BoxStsc){+ eBread(4, "entry_count");
+ b->stsc.entrycount = bu32(d);
+ b->stsc.entry = calloc(b->stsc.entrycount, sizeof(*b->stsc.entry));
+ for(u = 0; u < b->stsc.entrycount; u++){+ eBread(4, "first_chunk");
+ b->stsc.entry[u].firstchunk = bu32(d);
+ eBread(4, "samples_per_chunk");
+ b->stsc.entry[u].samplesperchunk = bu32(d);
+ eBread(4, "sample_description_table");
+ b->stsc.entry[u].sdt = bu32(d);
+ }
printbox(b);
}else if(b->type == BoxTkhd){ if(b->version == 1){--
⑨