private static JpegHeader HeaderForMarker(ushort startCode, JpegHeader previousHeader) { switch (startCode) { case 0xFFD8: return(new JpegHeader(previousHeader, JpegHeaderName.StartOfImage)); case 0xFFD9: return(new JpegHeader(previousHeader, JpegHeaderName.EndOfImage)); case 0xFFDA: return(new JpegHeader(previousHeader, JpegHeaderName.StartOfScan)); case 0xFFE0: return(new ApplicationSegment0(previousHeader)); default: return(null); } }
/// <summary> /// Search for headers in the data and store the results. /// </summary> /// <param name="dataReader">the data to read the bytes and bits from</param> public IResultNode DetectData(IDataReader dataReader, IDetectionProperties properties) { JpegHeader root = new JpegHeader(this); using (JpegParser parser = new JpegParser(dataReader)) { JpegHeader previousHeader = root; ushort marker; while ((marker = parser.NextMarker()) != 0) { JpegHeader header = HeaderForMarker(marker, previousHeader); if (header != null && header.HeaderName == JpegHeaderName.StartOfImage && root.Children.Count > 0) { root.Children.Clear(); } if (header != null && parser.Parse(header)) { previousHeader = header; if (IsFullFile(root)) { break; } } else { parser.DataReader.Position++; } } } if (dataReader.State == DataReaderState.Cancelled || !IsFullFile(root)) { root = null; } else { properties.DataFormat = CodecID.Jpeg; properties.IsFullFile = true; } return(root); }
public ApplicationSegment0(JpegHeader previousHeader) : base(previousHeader, JpegHeaderName.ApplicationSegment0) { }
private static bool IsFullFile(JpegHeader root) { return(root.FirstChild.HeaderName == JpegHeaderName.StartOfImage && root.LastChild.HeaderName == JpegHeaderName.EndOfImage && root.FindChild(JpegHeaderName.StartOfScan, true) != null); }