Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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;
                }
            }
        }