Esempio n. 1
0
        /// <inheritdoc />
        /// <exception cref="NotSupportedException">The volume has no compressed data</exception>
        public override VolumeSlice GetSlice(VolumeSliceDefinition slice, IProgress <VolumeSliceDefinition> progress = null, CancellationToken ct = default(CancellationToken))
        {
            //Videos with a very small number of frames appearantly have issues with av_seek, so we do a full scan instead
            if (_CompressedData[slice.Direction] != null)
            {
                using (var input = new MemoryStream(_CompressedData[slice.Direction]))
                {
                    var inputWrapper  = new StreamWrapper(input);
                    var outputWrapper = new VolumeSliceRangeCollector(Metadata, slice.Direction, new[] { new VolumeSliceRangeDefinition(slice.Direction, slice.Index, slice.Index) }, progress, ct);

                    var error = ( VolumeError )DecompressSlices(inputWrapper.Interop, outputWrapper.Interop, slice.Index, 1);
                    if (error != VolumeError.Success)
                    {
                        throw new VolumeException(error, Resources.FormatResource <Volume>("Decompression_ErrorText", error));
                    }

                    return(outputWrapper.GetSlice(slice.Direction, slice.Index));
                }
            }

            if (_CompressedData[Direction.Z] == null)
            {
                throw new NotSupportedException(Resources.GetResource <Volume>("CompressedDataMissing_ErrorText"));
            }

            using (var input = new MemoryStream(_CompressedData[Direction.Z]))
            {
                var inputWrapper = new StreamWrapper(input);

                var rangeReader = new VolumeSliceRangeCollector(Metadata, Direction.Z, new[] { new VolumeSliceRangeDefinition(slice.Direction, slice.Index, slice.Index) }, progress, ct);
                var error       = ( VolumeError )DecompressVolume(inputWrapper.Interop, rangeReader.Interop);
                if (error != VolumeError.Success)
                {
                    throw new VolumeException(error, Resources.FormatResource <Volume>("Decompression_ErrorText", error));
                }

                return(rangeReader.GetSlice(slice.Direction, slice.Index));
            }
        }
Esempio n. 2
0
 /// <summary>
 /// Gets the specified slice. This is the most memory friendly and usually the fastest approach to get a single slice.
 /// </summary>
 /// <param name="slice">The requested slice.</param>
 /// <param name="progress">A progress indicator, which reports the current slice number.</param>
 /// <param name="ct"></param>
 /// <returns></returns>
 /// <exception cref="VolumeException">Error during decoding</exception>
 public abstract VolumeSlice GetSlice(VolumeSliceDefinition slice, IProgress <VolumeSliceDefinition> progress = null, CancellationToken ct = default(CancellationToken));
 /// <inheritdoc />
 public override VolumeSlice GetSlice(VolumeSliceDefinition slice, IProgress <VolumeSliceDefinition> progress = null, CancellationToken ct = default(CancellationToken))
 {
     return(VolumeSlice.Extract(slice.Direction, slice.Index, Metadata, Data));
 }