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 List segmentList = getOrCreateSegmentList(inSegmentMarker);
\r
34 segmentList.add(inSegmentBytes);
\r
39 * Get the first segment with the given marker
\r
40 * @param inSegmentMarker marker byte
\r
41 * @return first segment with that marker
\r
43 public byte[] getSegment(byte inSegmentMarker)
\r
45 return getSegment(inSegmentMarker, 0);
\r
50 * Get the nth segment with the given marker
\r
51 * @param inSegmentMarker marker byte
\r
52 * @param inOccurrence occurrence to get, starting at 0
\r
53 * @return byte array from specified segment
\r
55 public byte[] getSegment(byte inSegmentMarker, int inOccurrence)
\r
57 final List segmentList = getSegmentList(inSegmentMarker);
\r
59 if (segmentList==null || segmentList.size()<=inOccurrence)
\r
62 return (byte[]) segmentList.get(inOccurrence);
\r
67 * Get the number of segments with the given marker
\r
68 * @param inSegmentMarker marker byte
\r
69 * @return number of segments
\r
71 public int getSegmentCount(byte inSegmentMarker)
\r
73 final List segmentList = getSegmentList(inSegmentMarker);
\r
74 if (segmentList == null)
\r
77 return segmentList.size();
\r
82 * Get the list of segments with the given marker
\r
83 * @param inSegmentMarker marker byte
\r
84 * @return list of segments
\r
86 private List getSegmentList(byte inSegmentMarker)
\r
88 return (List)_segmentDataMap.get(new Byte(inSegmentMarker));
\r
93 * Get the specified segment if it exists, otherwise create new one
\r
94 * @param inSegmentMarker marker byte
\r
95 * @return list of segments
\r
97 private List getOrCreateSegmentList(byte inSegmentMarker)
\r
99 List segmentList = null;
\r
100 Byte key = new Byte(inSegmentMarker);
\r
101 if (_segmentDataMap.containsKey(key))
\r
103 // list already exists
\r
104 segmentList = (List)_segmentDataMap.get(key);
\r
108 // create new list and add it
\r
109 segmentList = new ArrayList();
\r
110 _segmentDataMap.put(key, segmentList);
\r
112 return segmentList;
\r