Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DataView.prototype.getString=function(bi,L){
- var s="";
- while(bi!=L){
- s+=String.fromCharCode(this.getUint8(bi));
- bi++;
- }
- return s;
- };
- //mp4 file to arraybuffer (byteArray), then to dataview
- self.parse_mp4=function parse_mp4(dv,ind,L){
- var rez=[],clen,cuc=0,bL=dv.byteLength; ind=ind||0,L=L||bL;
- if(ind>bL||L>bL||L<8||ind<0){ return "input atom indexes are invalid"; }
- while(ind<L){
- clen=dv.getUint32(ind); if((clen+ind)>L) console.log("error atom length overflow @ "+ind);
- else if(clen<8){ console.log("atom length underflow: "+clen+", skipped 4 bits @ "+ind); clen=4; }
- else rez.push([dv.getString(ind+4,ind+8),ind,clen]);
- ind+=clen;
- cuc++; if(cuc>65535){ console.log("infinite loop error @ "+ind); break; }
- }
- return rez;
- };
- //not use?
- self.parse_atoms=function parse_atoms(ay,dv){
- var i2=ay.length,c;
- if(i2>0)while(i2--){ c=ay[i2]; c.push(parse_mp4(dv,c[1]+8,c[2]+c[1])); }
- };
- self.parse_mp4_iter=function parse_mp4_iter(dv,ind,L,L0,Pi){ if(L0>165){ return "somthin ain't right..."; }
- var rez=[],clen,cuc=0,ye,bL=dv.byteLength; ind=ind||0,L=L||bL; L0=L0||0; Pi=Pi||0;
- if(ind>bL||L>bL||L<8||ind<0){ return "input atom indexes are invalid"; }
- while(ind<L){
- clen=dv.getUint32(ind); if((clen+ind)>L) console.log("error atom length overflow @ "+ind);
- else if(clen<8){clen=4; console.log("atom length underflow: "+clen+", skipped 4 bits @ "+ind);}
- else{ rez.push([dv.getString(ind+4,ind+8),ind,clen,Pi,L0]); rez=rez.concat(parse_mp4_iter(dv,ind+8,ind+clen,(L0)+1,ind)); }
- ind+=clen;
- cuc++; if(cuc>65535){ console.log("infinite loop error @ "+ind); break; }
- }
- return rez;
- };
- self.rMap=function reverseMap(parsa){ //input rez (output of parse_mp4_iter)
- var map={},i=parsa.length;
- while(i--){ map[parsa[i][1]]=i; }
- parsa.pm=map; //parent map;
- return map;
- };
- self.parse_stco=function parse_stco(stco,mp4Dv){ //input stco entry array from parse_mp4_iter
- var si=stco[1],lim=si+stco[2], st=si+16,ne=mp4Dv.getUint32(si+12),i=st,
- ent=[]; //chunck index entries;
- while(i<lim){ ent.push(mp4Dv.getUint32(i)); i+=4; }
- if(ent.length!=ne)console.error("error, chunk entry count is wrong?");
- return ent;
- };
- //ex:
- //rez[i]=[name,RealIndex,RealLength] //don't forget to add 8 to RealIndex (the length of the length store plus the type store)
- //will need? https://web.archive.org/web/20201111155659im_/https://sole.github.io/Animated_GIF/dist/Animated_GIF.js
- /*
- finp=document.querySelector("input[type=file]");
- fi=finp.files[0];
- fi.arrayBuffer().then(function(a){ self.mp4Dv=new DataView(a);
- self.rez2=parse_mp4(mp4Dv);
- });
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement