public override void AtomCreated(BaseAtom atom) { switch (atom.Type) { case SMHD: _atomSMHD = (AtomSMHD)atom; return; case DINF: _atomDINF = (AtomDINF)atom; return; case STBL: _atomSTBL = (AtomSTBL)atom; return; case VMHD: _atomVMHD = (AtomVMHD)atom; return; case HDLR: _atomHDLR = (AtomHdlr)atom; return; } }
public override void AtomCreated(BaseAtom atom) { switch (atom.Type) { case TKHD: _atomTkhd = (AtomTKHD)atom; break; case MDIA: _atomMdia = (AtomMDIA)atom; break; case HDLR: _atomHdlr = (AtomHdlr)atom; break; case MINF: _atomMinf = (AtomMINF)atom; break; case DINF: _atomDinf = (AtomDINF)atom; break; case STBL: _atomStbl = (AtomSTBL)atom; break; case UDTA: _atomUdta = (AtomUDTA)atom; break; case META: _atomMeta = (AtomMETA)atom; break; } }
public override void AtomCreated(BaseAtom atom) { switch (atom.Type) { case MDHD: _atomMDHD = (AtomMdhd) atom; return; case HDLR: _atomHDLR = (AtomHdlr) atom; return; case MINF: _atomMINF = (AtomMINF) atom; return; case DINF: _atomDINF = (AtomDINF) atom; return; case STBL: _atomSTBL = (AtomSTBL) atom; return; } }
public BaseAtom ReadAtom(IBoxContainer parentAtom) { BaseAtom atom = null; uint type = 0; var currentPos = MediaFile.Position; long size = MediaFile.Br.ReadUInt32(); if (size == 0) { atom = new AtomNULL(this, type, size, currentPos) { Parent = parentAtom }; return(atom); } type = MediaFile.Br.ReadUInt32(); if (size == 1) { size = MediaFile.Br.ReadInt64(); if (size == 0) { atom = new AtomNULL(this, type, size, currentPos) { Parent = parentAtom }; return(atom); } } switch (type) { case FTYP: atom = new AtomFTYP(this, size, currentPos); break; case MOOV: atom = new AtomMOOV(this, type, size, currentPos); break; case MOOF: atom = new AtomMOOF(this, type, size, currentPos); break; case MVEX: atom = new AtomMVEX(this, type, size, currentPos); break; case MVHD: atom = new AtomMVHD(this, type, size, currentPos); break; case MFHD: atom = new AtomMFHD(this, type, size, currentPos); break; case TRAK: atom = new AtomTRAK(this, type, size, currentPos); break; case TRAF: atom = new AtomTRAF(this, type, size, currentPos); break; case TREX: atom = new AtomTREX(this, type, size, currentPos); break; case TRUN: atom = new AtomTRUN(this, type, size, currentPos); break; case TKHD: atom = new AtomTKHD(this, type, size, currentPos); break; case TFHD: atom = new AtomTFHD(this, type, size, currentPos); break; case MDIA: atom = new AtomMDIA(this, type, size, currentPos); break; case MDHD: atom = new AtomMdhd(this, type, size, currentPos); break; case HDLR: atom = new AtomHdlr(this, type, size, currentPos); break; case MINF: atom = new AtomMINF(this, type, size, currentPos); break; case SMHD: atom = new AtomSMHD(this, type, size, currentPos); break; case DINF: atom = new AtomDINF(this, type, size, currentPos); break; case STBL: atom = new AtomSTBL(this, type, size, currentPos); break; case VMHD: atom = new AtomVMHD(this, type, size, currentPos); break; case DREF: atom = new AtomDREF(this, type, size, currentPos); break; case STSD: atom = new AtomSTSD(this, type, size, currentPos); break; case STTS: atom = new AtomSTTS(this, type, size, currentPos); break; case STSC: atom = new AtomSTSC(this, type, size, currentPos); break; case STSZ: atom = new AtomSTSZ(this, type, size, currentPos); break; case STCO: atom = new AtomSTCO(this, type, size, currentPos); break; case CTTS: atom = new AtomCTTS(this, type, size, currentPos); break; case STSS: atom = new AtomSTSS(this, type, size, currentPos); break; case URL: atom = new AtomURL(this, type, size, currentPos); break; case MP4A: atom = new AtomMP4A(this, type, size, currentPos); break; case AVC1: atom = new AtomAVC1(this, type, size, currentPos); break; case ESDS: atom = new AtomESDS(this, type, size, currentPos); break; case AVCC: atom = new AtomAVCC(this, type, size, currentPos); break; case UDTA: atom = new AtomUDTA(this, type, size, currentPos); break; case WAVE: atom = new AtomWAVE(this, type, size, currentPos); break; case META: atom = new AtomMETA(this, type, size, currentPos); break; case NULL: atom = new AtomNULL(this, type, size, currentPos); break; case ILST: atom = new AtomILST(this, type, size, currentPos); break; case DATA: atom = new AtomDATA(this, type, size, currentPos); break; case CO64: atom = new AtomCO64(this, type, size, currentPos); break; case _COM: case NAME: case COVR: case AART: case _WRT: case _GRP: case _LYR: case _NAM: case _ART1: case _ART2: case _PRT: case _TOO: case _DAY: case _CMT: case _CPY: case _DES: case _ALB: case TRKN: case CPIL: case PGAP: case TMPO: case GNRE: case DISK: case _GEN: case DESC: case TVSH: case TVEN: case TVSN: case TVES: atom = new AtomMetaField(this, type, size, currentPos); break; default: { atom = new IgnoredAtom(this, type, size, currentPos); break; } } atom.Parent = parentAtom; atom.Read(); if (currentPos + atom.Size != MediaFile.Position) { FATAL("atom start:{0};Atom Size:{1};currentPostion:{2}", currentPos, atom.Size, MediaFile.Position); } return(atom); }
private AtomTRAK CreateTrackBox(ITrack track, Movie movie, Dictionary <ITrack, int[]> chunks) { AtomTRAK trackBox = new AtomTRAK(); var tkhd = new AtomTKHD { IsEnabled = true, IsInMovie = true, IsInPoster = true, IsInPreview = true, Matrix = track.TrackMetaData.Matrix, AlternateGroup = track.TrackMetaData.Group, CreationTime = track.CreationTime, Duration = track.Edits?.Count > 0 ? (uint)(track.Edits.Sum(x => x.SegmentDuration) * track.TrackMetaData.Timescale) : track.Duration * GetTimescale(movie) / track.TrackMetaData.Timescale, Width = (uint)track.TrackMetaData.Width, Height = (uint)track.TrackMetaData.Height, Layer = track.TrackMetaData.Layer, ModificationTime = DateTime.Now.SecondsFrom1904(), TrackId = track.TrackMetaData.TrackId, Volume = track.TrackMetaData.Volume }; trackBox.AddAtom(tkhd); trackBox.AddAtom(CreateEdts(track, movie)); AtomMDIA mdia = new AtomMDIA(); trackBox.AddAtom(mdia); AtomMdhd mdhd = new AtomMdhd { CreationTime = track.TrackMetaData.CreationTime.SecondsFrom1904(), Duration = track.Duration, TimeScale = track.TrackMetaData.Timescale, Language = track.TrackMetaData.Language }; mdia.AddAtom(mdhd); AtomHdlr hdlr = new AtomHdlr(); mdia.AddAtom(hdlr); hdlr.ComonentType = track.Handler; AtomMINF minf = new AtomMINF(); switch (track.Handler) { case "vide": minf.AddAtom(new AtomVMHD()); break; case "soun": minf.AddAtom(new AtomSMHD()); break; case "text": case "sbtl": minf.AddAtom(new AtomNMHD()); break; case "subt": minf.AddAtom(new AtomSTHD()); break; case "hint": minf.AddAtom(new AtomHMHD()); break; } // dinf: all these three boxes tell us is that the actual // data is in the current file and not somewhere external AtomDINF dinf = new AtomDINF(); AtomDREF dref = new AtomDREF(); AtomURL url = new AtomURL { Flags = 1 }; dref.AddAtom(url); minf.AddAtom(dinf); // var stbl = CreateStbl(track, movie, chunks); minf.AddAtom(stbl); mdia.AddAtom(minf); return(trackBox); }