001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.imaging.formats.jpeg.segments;
018
019import java.io.PrintWriter;
020
021import org.apache.commons.imaging.common.BinaryFileParser;
022
023/**
024 * Abstracts segment implementations.
025 */
026public abstract class AbstractSegment extends BinaryFileParser {
027
028    /** Segment marker. */
029    public final int marker;
030
031    /** Segment length. */
032    public final int length;
033
034    /**
035     * Constructs a new instance.
036     *
037     * @param marker segment marker.
038     * @param length segment length.
039     */
040    public AbstractSegment(final int marker, final int length) {
041        this.marker = marker;
042        this.length = length;
043    }
044
045    public void dump(final PrintWriter pw) {
046        // empty
047    }
048
049    /**
050     * Gets the description.
051     *
052     * @return the description.
053     */
054    public abstract String getDescription();
055
056    /**
057     * Gets the type.
058     *
059     * @return the type.
060     */
061    public String getSegmentType() {
062        switch (marker) {
063        case 0xffc0:
064            return "Start Of Frame, Baseline Dct, Huffman coding";
065        case 0xffc1:
066            return "Start Of Frame, Extended sequential Dct, Huffman coding";
067        case 0xffc2:
068            return "Start Of Frame, Progressive Dct, Huffman coding";
069        case 0xffc3:
070            return "Start Of Frame, Lossless (sequential), Huffman coding";
071        case 0xffc5:
072            return "Start Of Frame, Differential sequential Dct, Huffman coding";
073        case 0xffc6:
074            return "Start Of Frame, Differential progressive Dct, Huffman coding";
075        case 0xffc7:
076            return "Start Of Frame, Differential lossless (sequential), Huffman coding";
077        case 0xffc8:
078            return "Start Of Frame, Reserved for JPEG extensions, arithmetic coding";
079        case 0xffc9:
080            return "Start Of Frame, Extended sequential Dct, arithmetic coding";
081        case 0xffca:
082            return "Start Of Frame, Progressive Dct, arithmetic coding";
083        case 0xffcb:
084            return "Start Of Frame, Lossless (sequential), arithmetic coding";
085        case 0xffcd:
086            return "Start Of Frame, Differential sequential Dct, arithmetic coding";
087        case 0xffce:
088            return "Start Of Frame, Differential progressive Dct, arithmetic coding";
089        case 0xffcf:
090            return "Start Of Frame, Differential lossless (sequential), arithmetic coding";
091        case 0xffc4:
092            return "Define Huffman table(s)";
093        case 0xffcc:
094            return "Define arithmetic coding conditioning(s)";
095        case 0xffd0:
096            return "Restart with modulo 8 count 0";
097        case 0xffd1:
098            return "Restart with modulo 8 count 1";
099        case 0xffd2:
100            return "Restart with modulo 8 count 2";
101        case 0xffd3:
102            return "Restart with modulo 8 count 3";
103        case 0xffd4:
104            return "Restart with modulo 8 count 4";
105        case 0xffd5:
106            return "Restart with modulo 8 count 5";
107        case 0xffd6:
108            return "Restart with modulo 8 count 6";
109        case 0xffd7:
110            return "Restart with modulo 8 count 7";
111        case 0xffd8:
112            return "Start of image";
113        case 0xffd9:
114            return "End of image";
115        case 0xffda:
116            return "Start of scan";
117        case 0xffdb:
118            return "Define quantization table(s)";
119        case 0xffdc:
120            return "Define number of lines";
121        case 0xffdd:
122            return "Define restart interval";
123        case 0xffde:
124            return "Define hierarchical progression";
125        case 0xffdf:
126            return "Expand reference component(s)";
127        // case 0xffd8 :
128        // return "Reserved for application segments";
129        // case 0xffd8 :
130        // return "Reserved for JPEG extensions";
131        case 0xfffe:
132            return "Comment";
133        case 0xff01:
134            return "For temporary private use in arithmetic coding";
135        // case 0xffd8 :
136        // return "Reserved";
137        default:
138        }
139        if (marker >= 0xff02 && marker <= 0xffbf) {
140            return "Reserved";
141        }
142        if (marker >= 0xffe0 && marker <= 0xffef) {
143            return "APP" + (marker - 0xffe0);
144        }
145        if (marker >= 0xfff0 && marker <= 0xfffd) {
146            return "JPG" + (marker - 0xffe0);
147        }
148        return "Unknown";
149    }
150
151    @Override
152    public String toString() {
153        return "[Segment: " + getDescription() + "]";
154    }
155
156}