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);
        }
Esempio n. 3
0
 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);
 }