]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/jpeg/drew/JpegSegmentData.java
Version 10, May 2010
[GpsPrune.git] / tim / prune / jpeg / drew / JpegSegmentData.java
diff --git a/tim/prune/jpeg/drew/JpegSegmentData.java b/tim/prune/jpeg/drew/JpegSegmentData.java
new file mode 100644 (file)
index 0000000..4b56cbe
--- /dev/null
@@ -0,0 +1,106 @@
+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