]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/drew/jpeg/JpegSegmentData.java
Version 2, March 2007
[GpsPrune.git] / tim / prune / drew / jpeg / JpegSegmentData.java
1 package tim.prune.drew.jpeg;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.HashMap;\r
5 import java.util.List;\r
6 \r
7 /**\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
11  */\r
12 public class JpegSegmentData\r
13 {\r
14         /** A map of byte[], keyed by the segment marker */\r
15         private final HashMap _segmentDataMap;\r
16 \r
17 \r
18         /**\r
19          * Constructor for an empty collection\r
20          */\r
21         public JpegSegmentData()\r
22         {\r
23                 _segmentDataMap = new HashMap(10);\r
24         }\r
25 \r
26         /**\r
27          * Add a segment to the collection\r
28          * @param inSegmentMarker marker byte\r
29          * @param inSegmentBytes data of segment\r
30          */\r
31         public void addSegment(byte inSegmentMarker, byte[] inSegmentBytes)\r
32         {\r
33                 // System.out.println("Adding segment: " + inSegmentMarker);\r
34                 List segmentList = getOrCreateSegmentList(inSegmentMarker);\r
35                 segmentList.add(inSegmentBytes);\r
36         }\r
37 \r
38 \r
39         /**\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
43          */\r
44         public byte[] getSegment(byte inSegmentMarker)\r
45         {\r
46                 return getSegment(inSegmentMarker, 0);\r
47         }\r
48 \r
49 \r
50         /**\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
55          */\r
56         public byte[] getSegment(byte inSegmentMarker, int inOccurrence)\r
57         {\r
58                 final List segmentList = getSegmentList(inSegmentMarker);\r
59 \r
60                 if (segmentList==null || segmentList.size()<=inOccurrence)\r
61                         return null;\r
62                 else\r
63                         return (byte[]) segmentList.get(inOccurrence);\r
64         }\r
65 \r
66 \r
67         /**\r
68          * Get the number of segments with the given marker\r
69          * @param inSegmentMarker marker byte\r
70          * @return number of segments\r
71          */\r
72         public int getSegmentCount(byte inSegmentMarker)\r
73         {\r
74                 final List segmentList = getSegmentList(inSegmentMarker);\r
75                 if (segmentList == null)\r
76                         return 0;\r
77                 else\r
78                         return segmentList.size();\r
79         }\r
80 \r
81 \r
82         /**\r
83          * Get the list of segments with the given marker\r
84          * @param inSegmentMarker marker byte\r
85          * @return list of segments\r
86          */\r
87         private List getSegmentList(byte inSegmentMarker)\r
88         {\r
89                 return (List)_segmentDataMap.get(new Byte(inSegmentMarker));\r
90         }\r
91 \r
92 \r
93         /**\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
97          */\r
98         private List getOrCreateSegmentList(byte inSegmentMarker)\r
99         {\r
100                 List segmentList = null;\r
101                 Byte key = new Byte(inSegmentMarker);\r
102                 if (_segmentDataMap.containsKey(key))\r
103                 {\r
104                         // list already exists\r
105                         segmentList = (List)_segmentDataMap.get(key);\r
106                 }\r
107                 else\r
108                 {\r
109                         // create new list and add it\r
110                         segmentList = new ArrayList();\r
111                         _segmentDataMap.put(key, segmentList);\r
112                 }\r
113                 return segmentList;\r
114         }\r
115 }\r