public static void MatroskaHash(string inpath, string outpath) { FileInfo f = new FileInfo(inpath); Stream i = File.OpenRead(inpath); BinaryReader reader = new BinaryReader(i); Container c = new Container(); c.Read(reader, (ulong)f.Length); FixUIDS(c); EbmlBinary segmentuid = NormalizeHeader(c); MoveTagInfoToTracks(c); Shrink(c); FixPositions(c); Stream o = File.Open(outpath, FileMode.Create, FileAccess.Write); BinaryWriter writer = new BinaryWriter(o); MD5 md5 = MD5.Create(); c.Write(writer, md5); //Using Cluster Data MD5 as segment UID byte[] b = new byte[0]; md5.TransformFinalBlock(b, 0, 0); byte[] hash = md5.Hash; segmentuid.Value = hash; writer.BaseStream.Seek((long)segmentuid.OutputValueOffset, SeekOrigin.Begin); writer.Write(hash); writer.Close(); reader.Close(); i.Close(); o.Close(); }
internal static EbmlBinary NormalizeHeader(Container c) { //Remove DATEUTC EbmlMaster info = (EbmlMaster)c.FindFirst(Ids.MATROSKA_ID_INFO); EbmlBinary date = (EbmlBinary)info.FindFirst(Ids.MATROSKA_ID_DATEUTC); if (date != null) { info.Value.Remove(date); } //Changing Muxing and Writting App to a Constant. EbmlUtf8 muxapp = (EbmlUtf8)info.FindFirst(Ids.MATROSKA_ID_MUXINGAPP); if (muxapp == null) { muxapp = new EbmlUtf8 { Id = Ids.MATROSKA_ID_MUXINGAPP }; info.Value.Add(muxapp); } EbmlUtf8 wrtapp = (EbmlUtf8)info.FindFirst(Ids.MATROSKA_ID_WRITINGAPP); if (wrtapp == null) { wrtapp = new EbmlUtf8 { Id = Ids.MATROSKA_ID_WRITINGAPP }; info.Value.Add(wrtapp); } muxapp.Value = wrtapp.Value = "AOD"; EbmlBinary seguid = (EbmlBinary)info.FindFirst(Ids.MATROSKA_ID_SEGMENTUID); if (seguid == null) { seguid = new EbmlBinary { Id = Ids.MATROSKA_ID_SEGMENTUID, Value = new byte[16] }; info.Value.Add(seguid); } info.Value.Sort(); return(seguid); }