1 package tim.prune.jpeg.drew;
\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<Byte, List<byte[]>> _segmentDataMap = new HashMap<Byte, List<byte[]>>(10);
\r
19 * Add a segment to the collection
\r
20 * @param inSegmentMarker marker byte
\r
21 * @param inSegmentBytes data of segment
\r
23 public void addSegment(byte inSegmentMarker, byte[] inSegmentBytes)
\r
25 List<byte[]> segmentList = getOrCreateSegmentList(inSegmentMarker);
\r
26 segmentList.add(inSegmentBytes);
\r
31 * Get the first segment with the given marker
\r
32 * @param inSegmentMarker marker byte
\r
33 * @return first segment with that marker
\r
35 public byte[] getSegment(byte inSegmentMarker)
\r
37 return getSegment(inSegmentMarker, 0);
\r
42 * Get the nth segment with the given marker
\r
43 * @param inSegmentMarker marker byte
\r
44 * @param inOccurrence occurrence to get, starting at 0
\r
45 * @return byte array from specified segment
\r
47 public byte[] getSegment(byte inSegmentMarker, int inOccurrence)
\r
49 final List<byte[]> segmentList = getSegmentList(inSegmentMarker);
\r
51 if (segmentList==null || segmentList.size()<=inOccurrence)
\r
54 return segmentList.get(inOccurrence);
\r
59 * Get the number of segments with the given marker
\r
60 * @param inSegmentMarker marker byte
\r
61 * @return number of segments
\r
63 public int getSegmentCount(byte inSegmentMarker)
\r
65 final List<byte[]> segmentList = getSegmentList(inSegmentMarker);
\r
66 if (segmentList == null)
\r
69 return segmentList.size();
\r
74 * Get the list of segments with the given marker
\r
75 * @param inSegmentMarker marker byte
\r
76 * @return list of segments
\r
78 private List<byte[]> getSegmentList(byte inSegmentMarker)
\r
80 return _segmentDataMap.get(Byte.valueOf(inSegmentMarker));
\r
85 * Get the specified segment if it exists, otherwise create new one
\r
86 * @param inSegmentMarker marker byte
\r
87 * @return list of segments
\r
89 private List<byte[]> getOrCreateSegmentList(byte inSegmentMarker)
\r
91 List<byte[]> segmentList = null;
\r
92 Byte key = Byte.valueOf(inSegmentMarker);
\r
93 if (_segmentDataMap.containsKey(key))
\r
95 // list already exists
\r
96 segmentList = _segmentDataMap.get(key);
\r
100 // create new list and add it
\r
101 segmentList = new ArrayList<byte[]>();
\r
102 _segmentDataMap.put(key, segmentList);
\r
104 return segmentList;
\r