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