private void ReadBlocks(BinaryReader reader, StringBuilder builder, long stopAddress) { while (reader.BaseStream.Position < stopAddress) { Mp4Block block = new Mp4Block(); block.Address = reader.BaseStream.Position; block.Size = ReadUInt32(reader); if (block.Size == 0) { break; } reader.Read(_buffer, 0, 4); if (_buffer[0] < 'A' || (_buffer[0] > 'z' && _buffer[0] != 0xA9) || _buffer[1] < 'A' || _buffer[1] > 'z' || _buffer[2] < 'A' || _buffer[2] > 'z' || _buffer[3] < 'A' || _buffer[3] > 'z') { return; } if (builder.Length > 0) { builder.Append('.'); } builder.Append((char)_buffer[0]); builder.Append((char)_buffer[1]); builder.Append((char)_buffer[2]); builder.Append((char)_buffer[3]); block.Tag = builder.ToString(); _blocks.Add(block); if (block.Tag == "moov.udta.meta") { reader.BaseStream.Seek(4, SeekOrigin.Current); } ReadBlocks(reader, builder, block.Address + block.Size); builder.Length -= 4; if (builder.Length > 0) { builder.Length--; } reader.BaseStream.Seek(block.Address + block.Size, SeekOrigin.Begin); } }
private void MoveMetaBlock(Mp4Block block, long newAddress) { var adjustment = newAddress - block.Address; using (var stream = File.Open(_path, FileMode.Open, FileAccess.ReadWrite)) { var reader = new BinaryReader(stream); var writer = new BinaryWriter(stream); var buffer = new byte[block.Size]; stream.Position = block.Address; reader.Read(buffer, 0, (int)block.Size); stream.Position = newAddress; writer.Write(buffer, 0, (int)block.Size); var nextBlockAddress = block.Address + block.Size; for (int i = 0; i < _blocks.Count; i++) { if (_blocks[i].Address == nextBlockAddress) { if (_blocks[i].Tag == "free") { var block2 = _blocks[i]; block2.Address += adjustment; block2.Size -= adjustment; _blocks[i] = block2; stream.Position = block2.Address; WriteUInt32(writer, (uint)block2.Size); } break; } } } for (int i = 0; i < _blocks.Count; i++) { if (_blocks[i].Address >= block.Address && _blocks[i].Address < block.Address + block.Size + adjustment) { var block2 = _blocks[i]; block2.Address += adjustment; _blocks[i] = block2; } } }