1 package tim.prune.drew.jpeg;
\r
3 import java.util.ArrayList;
\r
4 import java.util.HashMap;
\r
5 import java.util.List;
\r
8 * Class to hold a collection of Jpeg data segments
\r
9 * Each marker represents a list of multiple byte arrays
\r
10 * Based on Drew Noakes' Metadata extractor at http://drewnoakes.com
\r
12 public class JpegSegmentData
\r
14 /** A map of byte[], keyed by the segment marker */
\r
15 private final HashMap _segmentDataMap;
\r
19 * Constructor for an empty collection
\r
21 public JpegSegmentData()
\r
23 _segmentDataMap = new HashMap(10);
\r
27 * Add a segment to the collection
\r
28 * @param inSegmentMarker marker byte
\r
29 * @param inSegmentBytes data of segment
\r
31 public void addSegment(byte inSegmentMarker, byte[] inSegmentBytes)
\r
33 // System.out.println("Adding segment: " + inSegmentMarker);
\r
34 List segmentList = getOrCreateSegmentList(inSegmentMarker);
\r
35 segmentList.add(inSegmentBytes);
\r
40 * Get the first segment with the given marker
\r
41 * @param inSegmentMarker marker byte
\r
42 * @return first segment with that marker
\r
44 public byte[] getSegment(byte inSegmentMarker)
\r
46 return getSegment(inSegmentMarker, 0);
\r
51 * Get the nth segment with the given marker
\r
52 * @param inSegmentMarker marker byte
\r
53 * @param inOccurrence occurrence to get, starting at 0
\r
54 * @return byte array from specified segment
\r
56 public byte[] getSegment(byte inSegmentMarker, int inOccurrence)
\r
58 final List segmentList = getSegmentList(inSegmentMarker);
\r
60 if (segmentList==null || segmentList.size()<=inOccurrence)
\r
63 return (byte[]) segmentList.get(inOccurrence);
\r
68 * Get the number of segments with the given marker
\r
69 * @param inSegmentMarker marker byte
\r
70 * @return number of segments
\r
72 public int getSegmentCount(byte inSegmentMarker)
\r
74 final List segmentList = getSegmentList(inSegmentMarker);
\r
75 if (segmentList == null)
\r
78 return segmentList.size();
\r
83 * Get the list of segments with the given marker
\r
84 * @param inSegmentMarker marker byte
\r
85 * @return list of segments
\r
87 private List getSegmentList(byte inSegmentMarker)
\r
89 return (List)_segmentDataMap.get(new Byte(inSegmentMarker));
\r
94 * Get the specified segment if it exists, otherwise create new one
\r
95 * @param inSegmentMarker marker byte
\r
96 * @return list of segments
\r
98 private List getOrCreateSegmentList(byte inSegmentMarker)
\r
100 List segmentList = null;
\r
101 Byte key = new Byte(inSegmentMarker);
\r
102 if (_segmentDataMap.containsKey(key))
\r
104 // list already exists
\r
105 segmentList = (List)_segmentDataMap.get(key);
\r
109 // create new list and add it
\r
110 segmentList = new ArrayList();
\r
111 _segmentDataMap.put(key, segmentList);
\r
113 return segmentList;
\r