/*
* Copyright 2002-2016 Drew Noakes
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* More information about this project is available at:
*
* https://drewnoakes.com/code/exif/
* https://github.com/drewnoakes/metadata-extractor
*/
package com.drew.imaging.jpeg;
import com.drew.lang.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* An enumeration of the known segment types found in JPEG files.
*
* <ul>
* <li>http://www.ozhiker.com/electronics/pjmt/jpeg_info/app_segments.html</li>
* <li>http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html</li>
* </ul>
*
* @author Drew Noakes https://drewnoakes.com
*/
public enum JpegSegmentType
{
/** APP0 JPEG segment identifier. Commonly contains JFIF, JFXX. */
APP0((byte)0xE0, true),
/** APP1 JPEG segment identifier. Commonly contains Exif. XMP data is also kept in here, though usually in a second instance. */
APP1((byte)0xE1, true),
/** APP2 JPEG segment identifier. Commonly contains ICC. */
APP2((byte)0xE2, true),
/** APP3 JPEG segment identifier. */
APP3((byte)0xE3, true),
/** APP4 JPEG segment identifier. */
APP4((byte)0xE4, true),
/** APP5 JPEG segment identifier. */
APP5((byte)0xE5, true),
/** APP6 JPEG segment identifier. */
APP6((byte)0xE6, true),
/** APP7 JPEG segment identifier. */
APP7((byte)0xE7, true),
/** APP8 JPEG segment identifier. */
APP8((byte)0xE8, true),
/** APP9 JPEG segment identifier. */
APP9((byte)0xE9, true),
/** APPA (App10) JPEG segment identifier. Can contain Unicode comments, though {@link JpegSegmentType#COM} is more commonly used for comments. */
APPA((byte)0xEA, true),
/** APPB (App11) JPEG segment identifier. */
APPB((byte)0xEB, true),
/** APPC (App12) JPEG segment identifier. */
APPC((byte)0xEC, true),
/** APPD (App13) JPEG segment identifier. Commonly contains IPTC, Photoshop data. */
APPD((byte)0xED, true),
/** APPE (App14) JPEG segment identifier. Commonly contains Adobe data. */
APPE((byte)0xEE, true),
/** APPF (App15) JPEG segment identifier. */
APPF((byte)0xEF, true),
/** Start Of Image segment identifier. */
SOI((byte)0xD8, false),
/** Define Quantization Table segment identifier. */
DQT((byte)0xDB, false),
/** Define Huffman Table segment identifier. */
DHT((byte)0xC4, false),
/** Start-of-Frame (0) segment identifier. */
SOF0((byte)0xC0, true),
/** Start-of-Frame (1) segment identifier. */
SOF1((byte)0xC1, true),
/** Start-of-Frame (2) segment identifier. */
SOF2((byte)0xC2, true),
/** Start-of-Frame (3) segment identifier. */
SOF3((byte)0xC3, true),
// /** Start-of-Frame (4) segment identifier. */
// SOF4((byte)0xC4, true),
/** Start-of-Frame (5) segment identifier. */
SOF5((byte)0xC5, true),
/** Start-of-Frame (6) segment identifier. */
SOF6((byte)0xC6, true),
/** Start-of-Frame (7) segment identifier. */
SOF7((byte)0xC7, true),
/** Start-of-Frame (8) segment identifier. */
SOF8((byte)0xC8, true),
/** Start-of-Frame (9) segment identifier. */
SOF9((byte)0xC9, true),
/** Start-of-Frame (10) segment identifier. */
SOF10((byte)0xCA, true),
/** Start-of-Frame (11) segment identifier. */
SOF11((byte)0xCB, true),
// /** Start-of-Frame (12) segment identifier. */
// SOF12((byte)0xCC, true),
/** Start-of-Frame (13) segment identifier. */
SOF13((byte)0xCD, true),
/** Start-of-Frame (14) segment identifier. */
SOF14((byte)0xCE, true),
/** Start-of-Frame (15) segment identifier. */
SOF15((byte)0xCF, true),
/** JPEG comment segment identifier. */
COM((byte)0xFE, true);
public static final Collection<JpegSegmentType> canContainMetadataTypes;
static {
List<JpegSegmentType> segmentTypes = new ArrayList<JpegSegmentType>();
for (JpegSegmentType segmentType : JpegSegmentType.class.getEnumConstants()) {
if (segmentType.canContainMetadata) {
segmentTypes.add(segmentType);
}
}
canContainMetadataTypes = segmentTypes;
}
public final byte byteValue;
public final boolean canContainMetadata;
JpegSegmentType(byte byteValue, boolean canContainMetadata)
{
this.byteValue = byteValue;
this.canContainMetadata = canContainMetadata;
}
@Nullable
public static JpegSegmentType fromByte(byte segmentTypeByte)
{
for (JpegSegmentType segmentType : JpegSegmentType.class.getEnumConstants()) {
if (segmentType.byteValue == segmentTypeByte)
return segmentType;
}
return null;
}
}