]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/jpeg/drew/JpegSegmentData.java
Version 18.6, December 2016
[GpsPrune.git] / tim / prune / jpeg / drew / JpegSegmentData.java
1 package tim.prune.jpeg.drew;\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<Byte, List<byte[]>> _segmentDataMap = new HashMap<Byte, List<byte[]>>(10);\r
16 \r
17 \r
18         /**\r
19          * Add a segment to the collection\r
20          * @param inSegmentMarker marker byte\r
21          * @param inSegmentBytes data of segment\r
22          */\r
23         public void addSegment(byte inSegmentMarker, byte[] inSegmentBytes)\r
24         {\r
25                 List<byte[]> segmentList = getOrCreateSegmentList(inSegmentMarker);\r
26                 segmentList.add(inSegmentBytes);\r
27         }\r
28 \r
29 \r
30         /**\r
31          * Get the first segment with the given marker\r
32          * @param inSegmentMarker marker byte\r
33          * @return first segment with that marker\r
34          */\r
35         public byte[] getSegment(byte inSegmentMarker)\r
36         {\r
37                 return getSegment(inSegmentMarker, 0);\r
38         }\r
39 \r
40 \r
41         /**\r
42          * Get the nth segment with the given marker\r
43          * @param inSegmentMarker marker byte\r
44          * @param inOccurrence occurrence to get, starting at 0\r
45          * @return byte array from specified segment\r
46          */\r
47         public byte[] getSegment(byte inSegmentMarker, int inOccurrence)\r
48         {\r
49                 final List<byte[]> segmentList = getSegmentList(inSegmentMarker);\r
50 \r
51                 if (segmentList==null || segmentList.size()<=inOccurrence)\r
52                         return null;\r
53                 else\r
54                         return segmentList.get(inOccurrence);\r
55         }\r
56 \r
57 \r
58         /**\r
59          * Get the number of segments with the given marker\r
60          * @param inSegmentMarker marker byte\r
61          * @return number of segments\r
62          */\r
63         public int getSegmentCount(byte inSegmentMarker)\r
64         {\r
65                 final List<byte[]> segmentList = getSegmentList(inSegmentMarker);\r
66                 if (segmentList == null)\r
67                         return 0;\r
68                 else\r
69                         return segmentList.size();\r
70         }\r
71 \r
72 \r
73         /**\r
74          * Get the list of segments with the given marker\r
75          * @param inSegmentMarker marker byte\r
76          * @return list of segments\r
77          */\r
78         private List<byte[]> getSegmentList(byte inSegmentMarker)\r
79         {\r
80                 return _segmentDataMap.get(Byte.valueOf(inSegmentMarker));\r
81         }\r
82 \r
83 \r
84         /**\r
85          * Get the specified segment if it exists, otherwise create new one\r
86          * @param inSegmentMarker marker byte\r
87          * @return list of segments\r
88          */\r
89         private List<byte[]> getOrCreateSegmentList(byte inSegmentMarker)\r
90         {\r
91                 List<byte[]> segmentList = null;\r
92                 Byte key = Byte.valueOf(inSegmentMarker);\r
93                 if (_segmentDataMap.containsKey(key))\r
94                 {\r
95                         // list already exists\r
96                         segmentList = _segmentDataMap.get(key);\r
97                 }\r
98                 else\r
99                 {\r
100                         // create new list and add it\r
101                         segmentList = new ArrayList<byte[]>();\r
102                         _segmentDataMap.put(key, segmentList);\r
103                 }\r
104                 return segmentList;\r
105         }\r
106 }\r