Process([NotNull] Stream stream, [CanBeNull] IEnumerable <IJpegSegmentMetadataReader> readers = null)
        {
            if (readers == null)
            {
                readers = _allReaders;
            }

            var segmentTypes = new HashSet <JpegSegmentType>(readers.SelectMany(reader => reader.GetSegmentTypes()));
            var segmentData  = JpegSegmentReader.ReadSegments(new SequentialStreamReader(stream), segmentTypes);

            return(ProcessJpegSegmentData(readers, segmentData));
        }
        /// <exception cref="JpegProcessingException"/>
        /// <exception cref="IOException"/>
        public static DirectoryList Process(Stream stream, ICollection <IJpegSegmentMetadataReader>?readers = null)
        {
            readers ??= _allReaders;

            // Build the union of segment types desired by all readers
            var segmentTypes = new HashSet <JpegSegmentType>(readers.SelectMany(reader => reader.SegmentTypes));

            // Read out those segments
            var segments = JpegSegmentReader.ReadSegments(new SequentialStreamReader(stream), segmentTypes);

            // Process them
            return(ProcessJpegSegments(readers, segments.ToList()));
        }
        Process([NotNull] Stream stream, [CanBeNull] ICollection <IJpegSegmentMetadataReader> readers = null)
        {
            if (readers == null)
            {
                readers = _allReaders;
            }

            // Build the union of segment types desired by all readers
            var segmentTypes = new HashSet <JpegSegmentType>(readers.SelectMany(reader => reader.SegmentTypes));

            // Read out those segments
            var segments = JpegSegmentReader.ReadSegments(new SequentialStreamReader(stream), segmentTypes);

            // Process them
            return(ProcessJpegSegments(readers, segments.ToList()));
        }