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);
        }