Index: trunk/src/com/drew/metadata/jpeg/HuffmanTablesDescriptor.java
===================================================================
--- trunk/src/com/drew/metadata/jpeg/HuffmanTablesDescriptor.java	(revision 15217)
+++ 	(revision )
@@ -1,67 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    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.metadata.jpeg;
-
-import com.drew.lang.annotations.NotNull;
-import com.drew.lang.annotations.Nullable;
-import com.drew.metadata.TagDescriptor;
-
-import static com.drew.metadata.jpeg.HuffmanTablesDirectory.*;
-
-/**
- * Provides a human-readable string version of the tag stored in a {@link HuffmanTablesDirectory}.
- *
- * <ul>
- *   <li>https://en.wikipedia.org/wiki/Huffman_coding</li>
- *   <li>http://stackoverflow.com/a/4954117</li>
- * </ul>
- *
- * @author Nadahar
- */
-@SuppressWarnings("WeakerAccess")
-public class HuffmanTablesDescriptor extends TagDescriptor<HuffmanTablesDirectory>
-{
-    public HuffmanTablesDescriptor(@NotNull HuffmanTablesDirectory directory)
-    {
-        super(directory);
-    }
-
-    @Override
-    @Nullable
-    public String getDescription(int tagType)
-    {
-        switch (tagType) {
-            case TAG_NUMBER_OF_TABLES:
-                return getNumberOfTablesDescription();
-            default:
-                return super.getDescription(tagType);
-        }
-    }
-
-    @Nullable
-    public String getNumberOfTablesDescription()
-    {
-        Integer value = _directory.getInteger(TAG_NUMBER_OF_TABLES);
-        if (value == null)
-            return null;
-        return value + (value == 1 ? " Huffman table" : " Huffman tables");
-    }
-}
Index: trunk/src/com/drew/metadata/jpeg/HuffmanTablesDirectory.java
===================================================================
--- trunk/src/com/drew/metadata/jpeg/HuffmanTablesDirectory.java	(revision 15217)
+++ 	(revision )
@@ -1,363 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    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.metadata.jpeg;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-
-import com.drew.lang.annotations.NotNull;
-import com.drew.metadata.Directory;
-import com.drew.metadata.MetadataException;
-
-/**
- * Directory of tables for the DHT (Define Huffman Table(s)) segment.
- *
- * @author Nadahar
- */
-@SuppressWarnings("WeakerAccess")
-public class HuffmanTablesDirectory extends Directory {
-
-    public static final int TAG_NUMBER_OF_TABLES = 1;
-
-    protected static final byte[] TYPICAL_LUMINANCE_DC_LENGTHS = {
-        (byte) 0x00, (byte) 0x01, (byte) 0x05, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
-        (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
-    };
-
-    protected static final byte[] TYPICAL_LUMINANCE_DC_VALUES = {
-        (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07,
-        (byte) 0x08, (byte) 0x09, (byte) 0x0A, (byte) 0x0B
-    };
-
-    protected static final byte[] TYPICAL_CHROMINANCE_DC_LENGTHS = {
-        (byte) 0x00, (byte) 0x03, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01,
-        (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
-    };
-
-    protected static final byte[] TYPICAL_CHROMINANCE_DC_VALUES = {
-        (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07,
-        (byte) 0x08, (byte) 0x09, (byte) 0x0A, (byte) 0x0B
-    };
-
-    protected static final byte[] TYPICAL_LUMINANCE_AC_LENGTHS = {
-        (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x03, (byte) 0x03, (byte) 0x02, (byte) 0x04, (byte) 0x03,
-        (byte) 0x05, (byte) 0x05, (byte) 0x04, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x7D
-    };
-
-    protected static final byte[] TYPICAL_LUMINANCE_AC_VALUES = {
-        (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x00, (byte) 0x04, (byte) 0x11, (byte) 0x05, (byte) 0x12,
-        (byte) 0x21, (byte) 0x31, (byte) 0x41, (byte) 0x06, (byte) 0x13, (byte) 0x51, (byte) 0x61, (byte) 0x07,
-        (byte) 0x22, (byte) 0x71, (byte) 0x14, (byte) 0x32, (byte) 0x81, (byte) 0x91, (byte) 0xA1, (byte) 0x08,
-        (byte) 0x23, (byte) 0x42, (byte) 0xB1, (byte) 0xC1, (byte) 0x15, (byte) 0x52, (byte) 0xD1, (byte) 0xF0,
-        (byte) 0x24, (byte) 0x33, (byte) 0x62, (byte) 0x72, (byte) 0x82, (byte) 0x09, (byte) 0x0A, (byte) 0x16,
-        (byte) 0x17, (byte) 0x18, (byte) 0x19, (byte) 0x1A, (byte) 0x25, (byte) 0x26, (byte) 0x27, (byte) 0x28,
-        (byte) 0x29, (byte) 0x2A, (byte) 0x34, (byte) 0x35, (byte) 0x36, (byte) 0x37, (byte) 0x38, (byte) 0x39,
-        (byte) 0x3A, (byte) 0x43, (byte) 0x44, (byte) 0x45, (byte) 0x46, (byte) 0x47, (byte) 0x48, (byte) 0x49,
-        (byte) 0x4A, (byte) 0x53, (byte) 0x54, (byte) 0x55, (byte) 0x56, (byte) 0x57, (byte) 0x58, (byte) 0x59,
-        (byte) 0x5A, (byte) 0x63, (byte) 0x64, (byte) 0x65, (byte) 0x66, (byte) 0x67, (byte) 0x68, (byte) 0x69,
-        (byte) 0x6A, (byte) 0x73, (byte) 0x74, (byte) 0x75, (byte) 0x76, (byte) 0x77, (byte) 0x78, (byte) 0x79,
-        (byte) 0x7A, (byte) 0x83, (byte) 0x84, (byte) 0x85, (byte) 0x86, (byte) 0x87, (byte) 0x88, (byte) 0x89,
-        (byte) 0x8A, (byte) 0x92, (byte) 0x93, (byte) 0x94, (byte) 0x95, (byte) 0x96, (byte) 0x97, (byte) 0x98,
-        (byte) 0x99, (byte) 0x9A, (byte) 0xA2, (byte) 0xA3, (byte) 0xA4, (byte) 0xA5, (byte) 0xA6, (byte) 0xA7,
-        (byte) 0xA8, (byte) 0xA9, (byte) 0xAA, (byte) 0xB2, (byte) 0xB3, (byte) 0xB4, (byte) 0xB5, (byte) 0xB6,
-        (byte) 0xB7, (byte) 0xB8, (byte) 0xB9, (byte) 0xBA, (byte) 0xC2, (byte) 0xC3, (byte) 0xC4, (byte) 0xC5,
-        (byte) 0xC6, (byte) 0xC7, (byte) 0xC8, (byte) 0xC9, (byte) 0xCA, (byte) 0xD2, (byte) 0xD3, (byte) 0xD4,
-        (byte) 0xD5, (byte) 0xD6, (byte) 0xD7, (byte) 0xD8, (byte) 0xD9, (byte) 0xDA, (byte) 0xE1, (byte) 0xE2,
-        (byte) 0xE3, (byte) 0xE4, (byte) 0xE5, (byte) 0xE6, (byte) 0xE7, (byte) 0xE8, (byte) 0xE9, (byte) 0xEA,
-        (byte) 0xF1, (byte) 0xF2, (byte) 0xF3, (byte) 0xF4, (byte) 0xF5, (byte) 0xF6, (byte) 0xF7, (byte) 0xF8,
-        (byte) 0xF9, (byte) 0xFA
-    };
-
-    protected static final byte[] TYPICAL_CHROMINANCE_AC_LENGTHS = {
-        (byte) 0x00, (byte) 0x02, (byte) 0x01, (byte) 0x02, (byte) 0x04, (byte) 0x04, (byte) 0x03, (byte) 0x04,
-        (byte) 0x07, (byte) 0x05, (byte) 0x04, (byte) 0x04, (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x77
-    };
-
-    protected static final byte[] TYPICAL_CHROMINANCE_AC_VALUES = {
-        (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x11, (byte) 0x04, (byte) 0x05, (byte) 0x21,
-        (byte) 0x31, (byte) 0x06, (byte) 0x12, (byte) 0x41, (byte) 0x51, (byte) 0x07, (byte) 0x61, (byte) 0x71,
-        (byte) 0x13, (byte) 0x22, (byte) 0x32, (byte) 0x81, (byte) 0x08, (byte) 0x14, (byte) 0x42, (byte) 0x91,
-        (byte) 0xA1, (byte) 0xB1, (byte) 0xC1, (byte) 0x09, (byte) 0x23, (byte) 0x33, (byte) 0x52, (byte) 0xF0,
-        (byte) 0x15, (byte) 0x62, (byte) 0x72, (byte) 0xD1, (byte) 0x0A, (byte) 0x16, (byte) 0x24, (byte) 0x34,
-        (byte) 0xE1, (byte) 0x25, (byte) 0xF1, (byte) 0x17, (byte) 0x18, (byte) 0x19, (byte) 0x1A, (byte) 0x26,
-        (byte) 0x27, (byte) 0x28, (byte) 0x29, (byte) 0x2A, (byte) 0x35, (byte) 0x36, (byte) 0x37, (byte) 0x38,
-        (byte) 0x39, (byte) 0x3A, (byte) 0x43, (byte) 0x44, (byte) 0x45, (byte) 0x46, (byte) 0x47, (byte) 0x48,
-        (byte) 0x49, (byte) 0x4A, (byte) 0x53, (byte) 0x54, (byte) 0x55, (byte) 0x56, (byte) 0x57, (byte) 0x58,
-        (byte) 0x59, (byte) 0x5A, (byte) 0x63, (byte) 0x64, (byte) 0x65, (byte) 0x66, (byte) 0x67, (byte) 0x68,
-        (byte) 0x69, (byte) 0x6A, (byte) 0x73, (byte) 0x74, (byte) 0x75, (byte) 0x76, (byte) 0x77, (byte) 0x78,
-        (byte) 0x79, (byte) 0x7A, (byte) 0x82, (byte) 0x83, (byte) 0x84, (byte) 0x85, (byte) 0x86, (byte) 0x87,
-        (byte) 0x88, (byte) 0x89, (byte) 0x8A, (byte) 0x92, (byte) 0x93, (byte) 0x94, (byte) 0x95, (byte) 0x96,
-        (byte) 0x97, (byte) 0x98, (byte) 0x99, (byte) 0x9A, (byte) 0xA2, (byte) 0xA3, (byte) 0xA4, (byte) 0xA5,
-        (byte) 0xA6, (byte) 0xA7, (byte) 0xA8, (byte) 0xA9, (byte) 0xAA, (byte) 0xB2, (byte) 0xB3, (byte) 0xB4,
-        (byte) 0xB5, (byte) 0xB6, (byte) 0xB7, (byte) 0xB8, (byte) 0xB9, (byte) 0xBA, (byte) 0xC2, (byte) 0xC3,
-        (byte) 0xC4, (byte) 0xC5, (byte) 0xC6, (byte) 0xC7, (byte) 0xC8, (byte) 0xC9, (byte) 0xCA, (byte) 0xD2,
-        (byte) 0xD3, (byte) 0xD4, (byte) 0xD5, (byte) 0xD6, (byte) 0xD7, (byte) 0xD8, (byte) 0xD9, (byte) 0xDA,
-        (byte) 0xE2, (byte) 0xE3, (byte) 0xE4, (byte) 0xE5, (byte) 0xE6, (byte) 0xE7, (byte) 0xE8, (byte) 0xE9,
-        (byte) 0xEA, (byte) 0xF2, (byte) 0xF3, (byte) 0xF4, (byte) 0xF5, (byte) 0xF6, (byte) 0xF7, (byte) 0xF8,
-        (byte) 0xF9, (byte) 0xFA
-    };
-
-    @NotNull
-    protected final List<HuffmanTable> tables = new ArrayList<HuffmanTable>(4);
-
-    @NotNull
-    protected static final HashMap<Integer, String> _tagNameMap = new HashMap<Integer, String>();
-
-    static
-    {
-        _tagNameMap.put(TAG_NUMBER_OF_TABLES, "Number of Tables");
-    }
-
-    public HuffmanTablesDirectory()
-    {
-        this.setDescriptor(new HuffmanTablesDescriptor(this));
-    }
-
-    @Override
-    @NotNull
-    public String getName()
-    {
-        return "Huffman";
-    }
-
-    @Override
-    @NotNull
-    protected HashMap<Integer, String> getTagNameMap()
-    {
-        return _tagNameMap;
-    }
-
-    /**
-     * @param tableNumber The zero-based index of the table. This number is normally between 0 and 3.
-     *                    Use {@link #getNumberOfTables} for bounds-checking.
-     * @return The {@link HuffmanTable} having the specified number.
-     */
-    @NotNull
-    public HuffmanTable getTable(int tableNumber)
-    {
-        return tables.get(tableNumber);
-    }
-
-    /**
-     * @return The number of Huffman tables held by this {@link HuffmanTablesDirectory} instance.
-     */
-    public int getNumberOfTables() throws MetadataException
-    {
-        return getInt(HuffmanTablesDirectory.TAG_NUMBER_OF_TABLES);
-    }
-
-    /**
-     * @return The {@link List} of {@link HuffmanTable}s in this
-     * {@link Directory}.
-     */
-    @NotNull
-    protected List<HuffmanTable> getTables() {
-        return tables;
-    }
-
-    /**
-     * Evaluates whether all the tables in this {@link HuffmanTablesDirectory}
-     * are "typical" Huffman tables.
-     * <p>
-     * "Typical" has a special meaning in this context as the JPEG standard
-     * (ISO/IEC 10918 or ITU-T T.81) defines 4 Huffman tables that has been
-     * developed from the average statistics of a large set of images with 8-bit
-     * precision. Using these instead of calculating the optimal Huffman tables
-     * for a given image is faster, and is preferred by many hardware encoders
-     * and some hardware decoders.
-     * <p>
-     * Even though the JPEG standard doesn't define these as "standard tables"
-     * and requires a decoder to be able to read any valid Huffman tables, some
-     * are in reality limited decoding images using these "typical" tables.
-     * Standards like DCF (Design rule for Camera File system) and DLNA (Digital
-     * Living Network Alliance) actually requires any compliant JPEG to use only
-     * the "typical" Huffman tables.
-     * <p>
-     * This is also related to the term "optimized" JPEG. An "optimized" JPEG is
-     * a JPEG that doesn't use the "typical" Huffman tables.
-     *
-     * @return Whether or not all the tables in this
-     *         {@link HuffmanTablesDirectory} are the predefined "typical"
-     *         Huffman tables.
-     */
-    public boolean isTypical() {
-        if (tables.size() == 0) {
-            return false;
-        }
-        for (HuffmanTable table : tables) {
-            if (!table.isTypical()) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * The opposite of {@link #isTypical()}.
-     *
-     * @return Whether or not the tables in this {@link HuffmanTablesDirectory}
-     *         are "optimized" - which means that at least one of them aren't
-     *         one of the "typical" Huffman tables.
-     */
-    public boolean isOptimized() {
-        return !isTypical();
-    }
-
-    /**
-     * An instance of this class holds a JPEG Huffman table.
-     */
-    public static class HuffmanTable {
-        private final int _tableLength;
-        private final HuffmanTableClass _tableClass;
-        private final int _tableDestinationId;
-        private final byte[] _lengthBytes;
-        private final byte[] _valueBytes;
-
-        @SuppressWarnings("ConstantConditions")
-        public HuffmanTable(
-            @NotNull HuffmanTableClass tableClass,
-            int tableDestinationId,
-            @NotNull byte[] lengthBytes,
-            @NotNull byte[] valueBytes)
-        {
-            if (lengthBytes == null)
-                throw new IllegalArgumentException("lengthBytes cannot be null.");
-            if (valueBytes == null)
-                throw new IllegalArgumentException("valueBytes cannot be null.");
-
-            _tableClass = tableClass;
-            _tableDestinationId = tableDestinationId;
-            _lengthBytes = lengthBytes;
-            _valueBytes = valueBytes;
-            _tableLength = _valueBytes.length + 17;
-        }
-
-        /**
-         * @return The table length in bytes.
-         */
-        public int getTableLength() {
-            return _tableLength;
-        }
-
-        /**
-         * @return The {@link HuffmanTableClass} of this table.
-         */
-        public HuffmanTableClass getTableClass() {
-            return _tableClass;
-        }
-
-        /**
-         * @return the the destination identifier for this table.
-         */
-        public int getTableDestinationId() {
-            return _tableDestinationId;
-        }
-
-        /**
-         * @return A byte array with the L values for this table.
-         */
-        @NotNull
-        public byte[] getLengthBytes() {
-            byte[] result = new byte[_lengthBytes.length];
-            System.arraycopy(_lengthBytes, 0, result, 0, _lengthBytes.length);
-            return result;
-        }
-
-        /**
-         * @return A byte array with the V values for this table.
-         */
-        @NotNull
-        public byte[] getValueBytes() {
-            byte[] result = new byte[_valueBytes.length];
-            System.arraycopy(_valueBytes, 0, result, 0, _valueBytes.length);
-            return result;
-        }
-
-        /**
-         * Evaluates whether this table is a "typical" Huffman table.
-         * <p>
-         * "Typical" has a special meaning in this context as the JPEG standard
-         * (ISO/IEC 10918 or ITU-T T.81) defines 4 Huffman tables that has been
-         * developed from the average statistics of a large set of images with
-         * 8-bit precision. Using these instead of calculating the optimal
-         * Huffman tables for a given image is faster, and is preferred by many
-         * hardware encoders and some hardware decoders.
-         * <p>
-         * Even though the JPEG standard doesn't define these as
-         * "standard tables" and requires a decoder to be able to read any valid
-         * Huffman tables, some are in reality limited decoding images using
-         * these "typical" tables. Standards like DCF (Design rule for Camera
-         * File system) and DLNA (Digital Living Network Alliance) actually
-         * requires any compliant JPEG to use only the "typical" Huffman tables.
-         * <p>
-         * This is also related to the term "optimized" JPEG. An "optimized"
-         * JPEG is a JPEG that doesn't use the "typical" Huffman tables.
-         *
-         * @return Whether or not this table is one of the predefined "typical"
-         *         Huffman tables.
-         */
-        public boolean isTypical() {
-            if (_tableClass == HuffmanTableClass.DC) {
-                return
-                    Arrays.equals(_lengthBytes, TYPICAL_LUMINANCE_DC_LENGTHS) &&
-                    Arrays.equals(_valueBytes, TYPICAL_LUMINANCE_DC_VALUES) ||
-                    Arrays.equals(_lengthBytes, TYPICAL_CHROMINANCE_DC_LENGTHS) &&
-                    Arrays.equals(_valueBytes, TYPICAL_CHROMINANCE_DC_VALUES);
-            } else if (_tableClass == HuffmanTableClass.AC) {
-                return
-                    Arrays.equals(_lengthBytes, TYPICAL_LUMINANCE_AC_LENGTHS) &&
-                    Arrays.equals(_valueBytes, TYPICAL_LUMINANCE_AC_VALUES) ||
-                    Arrays.equals(_lengthBytes, TYPICAL_CHROMINANCE_AC_LENGTHS) &&
-                    Arrays.equals(_valueBytes, TYPICAL_CHROMINANCE_AC_VALUES);
-            }
-            return false;
-        }
-
-        /**
-         * The opposite of {@link #isTypical()}.
-         *
-         * @return Whether or not this table is "optimized" - which means that
-         *         it isn't one of the "typical" Huffman tables.
-         */
-        public boolean isOptimized() {
-            return !isTypical();
-        }
-
-        public enum HuffmanTableClass {
-            DC,
-            AC,
-            UNKNOWN;
-
-            public static HuffmanTableClass typeOf(int value) {
-                switch (value) {
-                    case 0:
-                        return DC;
-                    case 1:
-                        return AC;
-                    default:
-                        return UNKNOWN;
-                }
-            }
-        }
-    }
-}
Index: trunk/src/com/drew/metadata/jpeg/JpegCommentDescriptor.java
===================================================================
--- trunk/src/com/drew/metadata/jpeg/JpegCommentDescriptor.java	(revision 15217)
+++ 	(revision )
@@ -1,45 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    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.metadata.jpeg;
-
-import com.drew.lang.annotations.NotNull;
-import com.drew.lang.annotations.Nullable;
-import com.drew.metadata.TagDescriptor;
-
-/**
- * Provides human-readable string representations of tag values stored in a {@link JpegCommentDirectory}.
- *
- * @author Drew Noakes https://drewnoakes.com
- */
-@SuppressWarnings("WeakerAccess")
-public class JpegCommentDescriptor extends TagDescriptor<JpegCommentDirectory>
-{
-    public JpegCommentDescriptor(@NotNull JpegCommentDirectory directory)
-    {
-        super(directory);
-    }
-
-    @Nullable
-    public String getJpegCommentDescription()
-    {
-        return _directory.getString(JpegCommentDirectory.TAG_COMMENT);
-    }
-}
Index: trunk/src/com/drew/metadata/jpeg/JpegCommentDirectory.java
===================================================================
--- trunk/src/com/drew/metadata/jpeg/JpegCommentDirectory.java	(revision 15217)
+++ 	(revision )
@@ -1,67 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    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.metadata.jpeg;
-
-import com.drew.lang.annotations.NotNull;
-import com.drew.metadata.Directory;
-
-import java.util.HashMap;
-
-/**
- * Describes tags used by a JPEG file comment.
- *
- * @author Drew Noakes https://drewnoakes.com
- */
-@SuppressWarnings("WeakerAccess")
-public class JpegCommentDirectory extends Directory
-{
-    /**
-     * This value does not apply to a particular standard. Rather, this value has been fabricated to maintain
-     * consistency with other directory types.
-     */
-    public static final int TAG_COMMENT = 0;
-
-    @NotNull
-    protected static final HashMap<Integer, String> _tagNameMap = new HashMap<Integer, String>();
-
-    static {
-        _tagNameMap.put(TAG_COMMENT, "JPEG Comment");
-    }
-
-    public JpegCommentDirectory()
-    {
-        this.setDescriptor(new JpegCommentDescriptor(this));
-    }
-
-    @Override
-    @NotNull
-    public String getName()
-    {
-        return "JpegComment";
-    }
-
-    @Override
-    @NotNull
-    protected HashMap<Integer, String> getTagNameMap()
-    {
-        return _tagNameMap;
-    }
-}
Index: trunk/src/com/drew/metadata/jpeg/JpegCommentReader.java
===================================================================
--- trunk/src/com/drew/metadata/jpeg/JpegCommentReader.java	(revision 15217)
+++ 	(revision )
@@ -1,55 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    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.metadata.jpeg;
-
-import com.drew.imaging.jpeg.JpegSegmentMetadataReader;
-import com.drew.imaging.jpeg.JpegSegmentType;
-import com.drew.lang.annotations.NotNull;
-import com.drew.metadata.Metadata;
-import com.drew.metadata.StringValue;
-
-import java.util.Collections;
-
-/**
- * Decodes the comment stored within JPEG files, populating a {@link Metadata} object with tag values in a
- * {@link JpegCommentDirectory}.
- *
- * @author Drew Noakes https://drewnoakes.com
- */
-public class JpegCommentReader implements JpegSegmentMetadataReader
-{
-    @NotNull
-    public Iterable<JpegSegmentType> getSegmentTypes()
-    {
-        return Collections.singletonList(JpegSegmentType.COM);
-    }
-
-    public void readJpegSegments(@NotNull Iterable<byte[]> segments, @NotNull Metadata metadata, @NotNull JpegSegmentType segmentType)
-    {
-        for (byte[] segmentBytes : segments) {
-            JpegCommentDirectory directory = new JpegCommentDirectory();
-            metadata.addDirectory(directory);
-
-            // The entire contents of the directory are the comment
-            directory.setStringValue(JpegCommentDirectory.TAG_COMMENT, new StringValue(segmentBytes, null));
-        }
-    }
-}
Index: trunk/src/com/drew/metadata/jpeg/JpegComponent.java
===================================================================
--- trunk/src/com/drew/metadata/jpeg/JpegComponent.java	(revision 15217)
+++ 	(revision )
@@ -1,102 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    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.metadata.jpeg;
-
-import com.drew.lang.annotations.NotNull;
-
-import java.io.Serializable;
-
-/**
- * Stores information about a JPEG image component such as the component id, horiz/vert sampling factor and
- * quantization table number.
- *
- * @author Drew Noakes https://drewnoakes.com
- */
-public class JpegComponent implements Serializable
-{
-    private static final long serialVersionUID = 61121257899091914L;
-
-    private final int _componentId;
-    private final int _samplingFactorByte;
-    private final int _quantizationTableNumber;
-
-    public JpegComponent(int componentId, int samplingFactorByte, int quantizationTableNumber)
-    {
-        _componentId = componentId;
-        _samplingFactorByte = samplingFactorByte;
-        _quantizationTableNumber = quantizationTableNumber;
-    }
-
-    public int getComponentId()
-    {
-        return _componentId;
-    }
-
-    /**
-     * Returns the component name (one of: Y, Cb, Cr, I, or Q)
-     * @return the component name
-     */
-    @NotNull
-    public String getComponentName()
-    {
-        switch (_componentId)
-        {
-            case 1:
-                return "Y";
-            case 2:
-                return "Cb";
-            case 3:
-                return "Cr";
-            case 4:
-                return "I";
-            case 5:
-                return "Q";
-            default:
-                return String.format("Unknown (%s)", _componentId);
-        }
-    }
-
-    public int getQuantizationTableNumber()
-    {
-        return _quantizationTableNumber;
-    }
-
-    public int getHorizontalSamplingFactor()
-    {
-        return (_samplingFactorByte>>4) & 0x0F;
-    }
-
-    public int getVerticalSamplingFactor()
-    {
-        return _samplingFactorByte & 0x0F;
-    }
-
-    @NotNull
-    @Override
-    public String toString() {
-        return String.format(
-            "Quantization table %d, Sampling factors %d horiz/%d vert",
-            _quantizationTableNumber,
-            getHorizontalSamplingFactor(),
-            getVerticalSamplingFactor()
-        );
-    }
-}
Index: trunk/src/com/drew/metadata/jpeg/JpegDescriptor.java
===================================================================
--- trunk/src/com/drew/metadata/jpeg/JpegDescriptor.java	(revision 15217)
+++ 	(revision )
@@ -1,129 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    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.metadata.jpeg;
-
-import com.drew.lang.annotations.NotNull;
-import com.drew.lang.annotations.Nullable;
-import com.drew.metadata.TagDescriptor;
-
-import static com.drew.metadata.jpeg.JpegDirectory.*;
-
-/**
- * Provides human-readable string versions of the tags stored in a JpegDirectory.
- * Thanks to Darrell Silver (www.darrellsilver.com) for the initial version of this class.
- *
- * @author Drew Noakes https://drewnoakes.com
- */
-@SuppressWarnings("WeakerAccess")
-public class JpegDescriptor extends TagDescriptor<JpegDirectory>
-{
-    public JpegDescriptor(@NotNull JpegDirectory directory)
-    {
-        super(directory);
-    }
-
-    @Override
-    @Nullable
-    public String getDescription(int tagType)
-    {
-        switch (tagType)
-        {
-            case TAG_COMPRESSION_TYPE:
-                return getImageCompressionTypeDescription();
-            case TAG_COMPONENT_DATA_1:
-                return getComponentDataDescription(0);
-            case TAG_COMPONENT_DATA_2:
-                return getComponentDataDescription(1);
-            case TAG_COMPONENT_DATA_3:
-                return getComponentDataDescription(2);
-            case TAG_COMPONENT_DATA_4:
-                return getComponentDataDescription(3);
-            case TAG_DATA_PRECISION:
-                return getDataPrecisionDescription();
-            case TAG_IMAGE_HEIGHT:
-                return getImageHeightDescription();
-            case TAG_IMAGE_WIDTH:
-                return getImageWidthDescription();
-            default:
-                return super.getDescription(tagType);
-        }
-    }
-
-    @Nullable
-    public String getImageCompressionTypeDescription()
-    {
-        return getIndexedDescription(TAG_COMPRESSION_TYPE,
-            "Baseline",
-            "Extended sequential, Huffman",
-            "Progressive, Huffman",
-            "Lossless, Huffman",
-            null, // no 4
-            "Differential sequential, Huffman",
-            "Differential progressive, Huffman",
-            "Differential lossless, Huffman",
-            "Reserved for JPEG extensions",
-            "Extended sequential, arithmetic",
-            "Progressive, arithmetic",
-            "Lossless, arithmetic",
-            null, // no 12
-            "Differential sequential, arithmetic",
-            "Differential progressive, arithmetic",
-            "Differential lossless, arithmetic");
-    }
-
-    @Nullable
-    public String getImageWidthDescription()
-    {
-        final String value = _directory.getString(TAG_IMAGE_WIDTH);
-        if (value==null)
-            return null;
-        return value + " pixels";
-    }
-
-    @Nullable
-    public String getImageHeightDescription()
-    {
-        final String value = _directory.getString(TAG_IMAGE_HEIGHT);
-        if (value==null)
-            return null;
-        return value + " pixels";
-    }
-
-    @Nullable
-    public String getDataPrecisionDescription()
-    {
-        final String value = _directory.getString(TAG_DATA_PRECISION);
-        if (value==null)
-            return null;
-        return value + " bits";
-    }
-
-    @Nullable
-    public String getComponentDataDescription(int componentNumber)
-    {
-        JpegComponent value = _directory.getComponent(componentNumber);
-
-        if (value==null)
-            return null;
-
-        return value.getComponentName() + " component: " + value;
-    }
-}
Index: trunk/src/com/drew/metadata/jpeg/JpegDhtReader.java
===================================================================
--- trunk/src/com/drew/metadata/jpeg/JpegDhtReader.java	(revision 15217)
+++ 	(revision )
@@ -1,101 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    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.metadata.jpeg;
-
-import com.drew.imaging.jpeg.JpegSegmentMetadataReader;
-import com.drew.imaging.jpeg.JpegSegmentType;
-import com.drew.lang.SequentialByteArrayReader;
-import com.drew.lang.SequentialReader;
-import com.drew.lang.annotations.NotNull;
-import com.drew.metadata.Metadata;
-import com.drew.metadata.jpeg.HuffmanTablesDirectory.HuffmanTable;
-import com.drew.metadata.jpeg.HuffmanTablesDirectory.HuffmanTable.HuffmanTableClass;
-import java.io.IOException;
-import java.util.Collections;
-
-/**
- * Reader for JPEG Huffman tables, found in the DHT JPEG segment.
- *
- * @author Nadahar
- */
-public class JpegDhtReader implements JpegSegmentMetadataReader
-{
-    @NotNull
-    public Iterable<JpegSegmentType> getSegmentTypes()
-    {
-        return Collections.singletonList(JpegSegmentType.DHT);
-    }
-
-    public void readJpegSegments(@NotNull Iterable<byte[]> segments, @NotNull Metadata metadata, @NotNull JpegSegmentType segmentType)
-    {
-        for (byte[] segmentBytes : segments) {
-            extract(new SequentialByteArrayReader(segmentBytes), metadata);
-        }
-    }
-
-    /**
-     * Performs the DHT tables extraction, adding found tables to the specified
-     * instance of {@link Metadata}.
-     */
-    public void extract(@NotNull final SequentialReader reader, @NotNull final Metadata metadata)
-    {
-        HuffmanTablesDirectory directory = metadata.getFirstDirectoryOfType(HuffmanTablesDirectory.class);
-        if (directory == null) {
-            directory = new HuffmanTablesDirectory();
-            metadata.addDirectory(directory);
-        }
-
-        try {
-            while (reader.available() > 0) {
-                byte header = reader.getByte();
-                HuffmanTableClass tableClass = HuffmanTableClass.typeOf((header & 0xF0) >> 4);
-                int tableDestinationId = header & 0xF;
-
-                byte[] lBytes = getBytes(reader, 16);
-                int vCount = 0;
-                for (byte b : lBytes) {
-                    vCount += (b & 0xFF);
-                }
-                byte[] vBytes = getBytes(reader, vCount);
-                directory.getTables().add(new HuffmanTable(tableClass, tableDestinationId, lBytes, vBytes));
-            }
-        } catch (IOException me) {
-            directory.addError(me.getMessage());
-        }
-
-        directory.setInt(HuffmanTablesDirectory.TAG_NUMBER_OF_TABLES, directory.getTables().size());
-    }
-
-    private byte[] getBytes(@NotNull final SequentialReader reader, int count) throws IOException {
-        byte[] bytes = new byte[count];
-        for (int i = 0; i < count; i++) {
-            byte b = reader.getByte();
-            if ((b & 0xFF) == 0xFF) {
-                byte stuffing = reader.getByte();
-                if (stuffing != 0x00) {
-                    throw new IOException("Marker " + JpegSegmentType.fromByte(stuffing) + " found inside DHT segment");
-                }
-            }
-            bytes[i] = b;
-        }
-        return bytes;
-    }
-}
Index: trunk/src/com/drew/metadata/jpeg/JpegDirectory.java
===================================================================
--- trunk/src/com/drew/metadata/jpeg/JpegDirectory.java	(revision 15217)
+++ 	(revision )
@@ -1,127 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    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.metadata.jpeg;
-
-import com.drew.lang.annotations.NotNull;
-import com.drew.lang.annotations.Nullable;
-import com.drew.metadata.Directory;
-import com.drew.metadata.MetadataException;
-
-import java.util.HashMap;
-
-/**
- * Directory of tags and values for the SOF0 JPEG segment.  This segment holds basic metadata about the image.
- *
- * @author Darrell Silver http://www.darrellsilver.com and Drew Noakes https://drewnoakes.com
- */
-@SuppressWarnings("WeakerAccess")
-public class JpegDirectory extends Directory
-{
-    public static final int TAG_COMPRESSION_TYPE = -3;
-    /** This is in bits/sample, usually 8 (12 and 16 not supported by most software). */
-    public static final int TAG_DATA_PRECISION = 0;
-    /** The image's height.  Necessary for decoding the image, so it should always be there. */
-    public static final int TAG_IMAGE_HEIGHT = 1;
-    /** The image's width.  Necessary for decoding the image, so it should always be there. */
-    public static final int TAG_IMAGE_WIDTH = 3;
-    /**
-     * Usually 1 = grey scaled, 3 = color YcbCr or YIQ, 4 = color CMYK
-     * Each component TAG_COMPONENT_DATA_[1-4], has the following meaning:
-     * component Id(1byte)(1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q),
-     * sampling factors (1byte) (bit 0-3 vertical., 4-7 horizontal.),
-     * quantization table number (1 byte).
-     * <p>
-     * This info is from http://www.funducode.com/freec/Fileformats/format3/format3b.htm
-     */
-    public static final int TAG_NUMBER_OF_COMPONENTS = 5;
-
-    // NOTE!  Component tag type int values must increment in steps of 1
-
-    /** the first of a possible 4 color components.  Number of components specified in TAG_NUMBER_OF_COMPONENTS. */
-    public static final int TAG_COMPONENT_DATA_1 = 6;
-    /** the second of a possible 4 color components.  Number of components specified in TAG_NUMBER_OF_COMPONENTS. */
-    public static final int TAG_COMPONENT_DATA_2 = 7;
-    /** the third of a possible 4 color components.  Number of components specified in TAG_NUMBER_OF_COMPONENTS. */
-    public static final int TAG_COMPONENT_DATA_3 = 8;
-    /** the fourth of a possible 4 color components.  Number of components specified in TAG_NUMBER_OF_COMPONENTS. */
-    public static final int TAG_COMPONENT_DATA_4 = 9;
-
-    @NotNull
-    protected static final HashMap<Integer, String> _tagNameMap = new HashMap<Integer, String>();
-
-    static {
-        _tagNameMap.put(TAG_COMPRESSION_TYPE, "Compression Type");
-        _tagNameMap.put(TAG_DATA_PRECISION, "Data Precision");
-        _tagNameMap.put(TAG_IMAGE_WIDTH, "Image Width");
-        _tagNameMap.put(TAG_IMAGE_HEIGHT, "Image Height");
-        _tagNameMap.put(TAG_NUMBER_OF_COMPONENTS, "Number of Components");
-        _tagNameMap.put(TAG_COMPONENT_DATA_1, "Component 1");
-        _tagNameMap.put(TAG_COMPONENT_DATA_2, "Component 2");
-        _tagNameMap.put(TAG_COMPONENT_DATA_3, "Component 3");
-        _tagNameMap.put(TAG_COMPONENT_DATA_4, "Component 4");
-    }
-
-    public JpegDirectory()
-    {
-        this.setDescriptor(new JpegDescriptor(this));
-    }
-
-    @Override
-    @NotNull
-    public String getName()
-    {
-        return "JPEG";
-    }
-
-    @Override
-    @NotNull
-    protected HashMap<Integer, String> getTagNameMap()
-    {
-        return _tagNameMap;
-    }
-
-    /**
-     * @param componentNumber The zero-based index of the component.  This number is normally between 0 and 3.
-     *                        Use getNumberOfComponents for bounds-checking.
-     * @return the JpegComponent having the specified number.
-     */
-    @Nullable
-    public JpegComponent getComponent(int componentNumber)
-    {
-        int tagType = JpegDirectory.TAG_COMPONENT_DATA_1 + componentNumber;
-        return (JpegComponent)getObject(tagType);
-    }
-
-    public int getImageWidth() throws MetadataException
-    {
-        return getInt(JpegDirectory.TAG_IMAGE_WIDTH);
-    }
-
-    public int getImageHeight() throws MetadataException
-    {
-        return getInt(JpegDirectory.TAG_IMAGE_HEIGHT);
-    }
-
-    public int getNumberOfComponents() throws MetadataException
-    {
-        return getInt(JpegDirectory.TAG_NUMBER_OF_COMPONENTS);
-    }
-}
Index: trunk/src/com/drew/metadata/jpeg/JpegDnlReader.java
===================================================================
--- trunk/src/com/drew/metadata/jpeg/JpegDnlReader.java	(revision 15217)
+++ 	(revision )
@@ -1,76 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    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.metadata.jpeg;
-
-import com.drew.imaging.jpeg.JpegSegmentMetadataReader;
-import com.drew.imaging.jpeg.JpegSegmentType;
-import com.drew.lang.SequentialByteArrayReader;
-import com.drew.lang.SequentialReader;
-import com.drew.lang.annotations.NotNull;
-import com.drew.metadata.ErrorDirectory;
-import com.drew.metadata.Metadata;
-
-import java.io.IOException;
-import java.util.Collections;
-
-/**
- * Decodes JPEG DNL data, adjusting the image height with information missing from the JPEG SOFx segment.
- *
- * @author Nadahar
- */
-public class JpegDnlReader implements JpegSegmentMetadataReader
-{
-    @NotNull
-    public Iterable<JpegSegmentType> getSegmentTypes()
-    {
-        return Collections.singletonList(JpegSegmentType.DNL);
-    }
-
-    public void readJpegSegments(@NotNull Iterable<byte[]> segments, @NotNull Metadata metadata, @NotNull JpegSegmentType segmentType)
-    {
-        for (byte[] segmentBytes : segments) {
-            extract(segmentBytes, metadata, segmentType);
-        }
-    }
-
-    public void extract(byte[] segmentBytes, Metadata metadata, JpegSegmentType segmentType)
-    {
-        JpegDirectory directory = metadata.getFirstDirectoryOfType(JpegDirectory.class);
-        if (directory == null) {
-            ErrorDirectory errorDirectory = new ErrorDirectory();
-            metadata.addDirectory(errorDirectory);
-            errorDirectory.addError("DNL segment found without SOFx - illegal JPEG format");
-            return;
-        }
-
-        SequentialReader reader = new SequentialByteArrayReader(segmentBytes);
-
-        try {
-            // Only set height from DNL if it's not already defined
-            Integer i = directory.getInteger(JpegDirectory.TAG_IMAGE_HEIGHT);
-            if (i == null || i == 0) {
-                directory.setInt(JpegDirectory.TAG_IMAGE_HEIGHT, reader.getUInt16());
-            }
-        } catch (IOException ex) {
-            directory.addError(ex.getMessage());
-        }
-    }
-}
Index: trunk/src/com/drew/metadata/jpeg/JpegReader.java
===================================================================
--- trunk/src/com/drew/metadata/jpeg/JpegReader.java	(revision 15217)
+++ 	(revision )
@@ -1,104 +1,0 @@
-/*
- * Copyright 2002-2019 Drew Noakes and contributors
- *
- *    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.metadata.jpeg;
-
-import com.drew.imaging.jpeg.JpegSegmentMetadataReader;
-import com.drew.imaging.jpeg.JpegSegmentType;
-import com.drew.lang.SequentialByteArrayReader;
-import com.drew.lang.SequentialReader;
-import com.drew.lang.annotations.NotNull;
-import com.drew.metadata.Metadata;
-
-import java.io.IOException;
-import java.util.Arrays;
-
-/**
- * Decodes JPEG SOFn data, populating a {@link Metadata} object with tag values in a {@link JpegDirectory}.
- *
- * @author Drew Noakes https://drewnoakes.com
- * @author Darrell Silver http://www.darrellsilver.com
- */
-public class JpegReader implements JpegSegmentMetadataReader
-{
-    @NotNull
-    public Iterable<JpegSegmentType> getSegmentTypes()
-    {
-        // NOTE that some SOFn values do not exist
-        return Arrays.asList(
-            JpegSegmentType.SOF0,
-            JpegSegmentType.SOF1,
-            JpegSegmentType.SOF2,
-            JpegSegmentType.SOF3,
-//            JpegSegmentType.SOF4,
-            JpegSegmentType.SOF5,
-            JpegSegmentType.SOF6,
-            JpegSegmentType.SOF7,
-//            JpegSegmentType.JPG,
-            JpegSegmentType.SOF9,
-            JpegSegmentType.SOF10,
-            JpegSegmentType.SOF11,
-//            JpegSegmentType.SOF12,
-            JpegSegmentType.SOF13,
-            JpegSegmentType.SOF14,
-            JpegSegmentType.SOF15
-        );
-    }
-
-    public void readJpegSegments(@NotNull Iterable<byte[]> segments, @NotNull Metadata metadata, @NotNull JpegSegmentType segmentType)
-    {
-        for (byte[] segmentBytes : segments) {
-            extract(segmentBytes, metadata, segmentType);
-        }
-    }
-
-    public void extract(byte[] segmentBytes, Metadata metadata, JpegSegmentType segmentType)
-    {
-        JpegDirectory directory = new JpegDirectory();
-        metadata.addDirectory(directory);
-
-        // The value of TAG_COMPRESSION_TYPE is determined by the segment type found
-        directory.setInt(JpegDirectory.TAG_COMPRESSION_TYPE, segmentType.byteValue - JpegSegmentType.SOF0.byteValue);
-
-        SequentialReader reader = new SequentialByteArrayReader(segmentBytes);
-
-        try {
-            directory.setInt(JpegDirectory.TAG_DATA_PRECISION, reader.getUInt8());
-            directory.setInt(JpegDirectory.TAG_IMAGE_HEIGHT, reader.getUInt16());
-            directory.setInt(JpegDirectory.TAG_IMAGE_WIDTH, reader.getUInt16());
-            short componentCount = reader.getUInt8();
-            directory.setInt(JpegDirectory.TAG_NUMBER_OF_COMPONENTS, componentCount);
-
-            // for each component, there are three bytes of data:
-            // 1 - Component ID: 1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q
-            // 2 - Sampling factors: bit 0-3 vertical, 4-7 horizontal
-            // 3 - Quantization table number
-            for (int i = 0; i < (int)componentCount; i++) {
-                final int componentId = reader.getUInt8();
-                final int samplingFactorByte = reader.getUInt8();
-                final int quantizationTableNumber = reader.getUInt8();
-                final JpegComponent component = new JpegComponent(componentId, samplingFactorByte, quantizationTableNumber);
-                directory.setObject(JpegDirectory.TAG_COMPONENT_DATA_1 + i, component);
-            }
-        } catch (IOException ex) {
-            directory.addError(ex.getMessage());
-        }
-    }
-}
Index: trunk/src/com/drew/metadata/jpeg/package-info.java
===================================================================
--- trunk/src/com/drew/metadata/jpeg/package-info.java	(revision 15217)
+++ 	(revision )
@@ -1,4 +1,0 @@
-/**
- * Contains classes for the extraction and modelling of JPEG file format metadata.
- */
-package com.drew.metadata.jpeg;
