]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/drew/jpeg/JpegSegmentData.java
Version 4, January 2008
[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                 List segmentList = getOrCreateSegmentList(inSegmentMarker);\r
34                 segmentList.add(inSegmentBytes);\r
35         }\r
36 \r
37 \r
38         /**\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
42          */\r
43         public byte[] getSegment(byte inSegmentMarker)\r
44         {\r
45                 return getSegment(inSegmentMarker, 0);\r
46         }\r
47 \r
48 \r
49         /**\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
54          */\r
55         public byte[] getSegment(byte inSegmentMarker, int inOccurrence)\r
56         {\r
57                 final List segmentList = getSegmentList(inSegmentMarker);\r
58 \r
59                 if (segmentList==null || segmentList.size()<=inOccurrence)\r
60                         return null;\r
61                 else\r
62                         return (byte[]) segmentList.get(inOccurrence);\r
63         }\r
64 \r
65 \r
66         /**\r
67          * Get the number of segments with the given marker\r
68          * @param inSegmentMarker marker byte\r
69          * @return number of segments\r
70          */\r
71         public int getSegmentCount(byte inSegmentMarker)\r
72         {\r
73                 final List segmentList = getSegmentList(inSegmentMarker);\r
74                 if (segmentList == null)\r
75                         return 0;\r
76                 else\r
77                         return segmentList.size();\r
78         }\r
79 \r
80 \r
81         /**\r
82          * Get the list of segments with the given marker\r
83          * @param inSegmentMarker marker byte\r
84          * @return list of segments\r
85          */\r
86         private List getSegmentList(byte inSegmentMarker)\r
87         {\r
88                 return (List)_segmentDataMap.get(new Byte(inSegmentMarker));\r
89         }\r
90 \r
91 \r
92         /**\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
96          */\r
97         private List getOrCreateSegmentList(byte inSegmentMarker)\r
98         {\r
99                 List segmentList = null;\r
100                 Byte key = new Byte(inSegmentMarker);\r
101                 if (_segmentDataMap.containsKey(key))\r
102                 {\r
103                         // list already exists\r
104                         segmentList = (List)_segmentDataMap.get(key);\r
105                 }\r
106                 else\r
107                 {\r
108                         // create new list and add it\r
109                         segmentList = new ArrayList();\r
110                         _segmentDataMap.put(key, segmentList);\r
111                 }\r
112                 return segmentList;\r
113         }\r
114 }\r