-package tim.prune.jpeg.drew;\r
-\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-\r
-/**\r
- * Class to hold a collection of Jpeg data segments\r
- * Each marker represents a list of multiple byte arrays\r
- * Based on Drew Noakes' Metadata extractor at http://drewnoakes.com\r
- */\r
-public class JpegSegmentData\r
-{\r
- /** A map of byte[], keyed by the segment marker */\r
- private final HashMap<Byte, List<byte[]>> _segmentDataMap = new HashMap<Byte, List<byte[]>>(10);\r
-\r
-\r
- /**\r
- * Add a segment to the collection\r
- * @param inSegmentMarker marker byte\r
- * @param inSegmentBytes data of segment\r
- */\r
- public void addSegment(byte inSegmentMarker, byte[] inSegmentBytes)\r
- {\r
- List<byte[]> segmentList = getOrCreateSegmentList(inSegmentMarker);\r
- segmentList.add(inSegmentBytes);\r
- }\r
-\r
-\r
- /**\r
- * Get the first segment with the given marker\r
- * @param inSegmentMarker marker byte\r
- * @return first segment with that marker\r
- */\r
- public byte[] getSegment(byte inSegmentMarker)\r
- {\r
- return getSegment(inSegmentMarker, 0);\r
- }\r
-\r
-\r
- /**\r
- * Get the nth segment with the given marker\r
- * @param inSegmentMarker marker byte\r
- * @param inOccurrence occurrence to get, starting at 0\r
- * @return byte array from specified segment\r
- */\r
- public byte[] getSegment(byte inSegmentMarker, int inOccurrence)\r
- {\r
- final List<byte[]> segmentList = getSegmentList(inSegmentMarker);\r
-\r
- if (segmentList==null || segmentList.size()<=inOccurrence)\r
- return null;\r
- else\r
- return segmentList.get(inOccurrence);\r
- }\r
-\r
-\r
- /**\r
- * Get the number of segments with the given marker\r
- * @param inSegmentMarker marker byte\r
- * @return number of segments\r
- */\r
- public int getSegmentCount(byte inSegmentMarker)\r
- {\r
- final List<byte[]> segmentList = getSegmentList(inSegmentMarker);\r
- if (segmentList == null)\r
- return 0;\r
- else\r
- return segmentList.size();\r
- }\r
-\r
-\r
- /**\r
- * Get the list of segments with the given marker\r
- * @param inSegmentMarker marker byte\r
- * @return list of segments\r
- */\r
- private List<byte[]> getSegmentList(byte inSegmentMarker)\r
- {\r
- return _segmentDataMap.get(Byte.valueOf(inSegmentMarker));\r
- }\r
-\r
-\r
- /**\r
- * Get the specified segment if it exists, otherwise create new one\r
- * @param inSegmentMarker marker byte\r
- * @return list of segments\r
- */\r
- private List<byte[]> getOrCreateSegmentList(byte inSegmentMarker)\r
- {\r
- List<byte[]> segmentList = null;\r
- Byte key = Byte.valueOf(inSegmentMarker);\r
- if (_segmentDataMap.containsKey(key))\r
- {\r
- // list already exists\r
- segmentList = _segmentDataMap.get(key);\r
- }\r
- else\r
- {\r
- // create new list and add it\r
- segmentList = new ArrayList<byte[]>();\r
- _segmentDataMap.put(key, segmentList);\r
- }\r
- return segmentList;\r
- }\r
-}\r