| 87 | } |
| 88 | |
| 89 | public void parse( |
| 90 | InputStream stream, ContentHandler handler, |
| 91 | Metadata metadata, ParseContext context) |
| 92 | throws IOException, TikaException, SAXException { |
| 93 | // Process the file straight through once |
| 94 | OggFile ogg = new OggFile(stream); |
| 95 | |
| 96 | // To track the streams we find |
| 97 | Map<OggStreamType, Integer> streams = |
| 98 | new HashMap<OggStreamType, Integer>(); |
| 99 | Map<OggStreamType.Kind, Integer> streamKinds = |
| 100 | new HashMap<OggStreamType.Kind, Integer>(); |
| 101 | List<Integer> sids = new ArrayList<Integer>(); |
| 102 | int totalStreams = 0; |
| 103 | |
| 104 | // Start |
| 105 | XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata); |
| 106 | xhtml.startDocument(); |
| 107 | |
| 108 | // Check the streams in turn |
| 109 | OggPacketReader r = ogg.getPacketReader(); |
| 110 | OggPacket p; |
| 111 | while( (p = r.getNextPacket()) != null ) { |
| 112 | if (p.isBeginningOfStream()) { |
| 113 | totalStreams++; |
| 114 | sids.add(p.getSid()); |
| 115 | |
| 116 | OggStreamType type = OggStreamIdentifier.identifyType(p); |
| 117 | Integer prevValue = streams.get(type); |
| 118 | if (prevValue == null) { |
| 119 | prevValue = 0; |
| 120 | } |
| 121 | streams.put(type, (prevValue+1)); |
| 122 | |
| 123 | prevValue = streamKinds.get(type.kind); |
| 124 | if (prevValue == null) { |
| 125 | prevValue = 0; |
| 126 | } |
| 127 | streamKinds.put(type.kind, (prevValue+1)); |
| 128 | } |
| 129 | } |
| 130 | |
| 131 | // Report about the streams, which is all we really can do |
| 132 | metadata.add("streams-total", Integer.toString(totalStreams)); |
| 133 | for (OggStreamType type : streams.keySet()) { |
| 134 | String key = type.mimetype.substring(type.mimetype.indexOf('/')+1); |
| 135 | if (key.startsWith("x-")) { |
| 136 | key = key.substring(2); |
| 137 | } |
| 138 | if (type == OggStreamIdentifier.UNKNOWN) { |
| 139 | key = "unknown"; |
| 140 | } |
| 141 | metadata.add("streams-" + key, Integer.toString(streams.get(type))); |
| 142 | } |
| 143 | for (OggStreamType.Kind kind : streamKinds.keySet()) { |
| 144 | String key = kind.name().toLowerCase(); |
| 145 | metadata.add("streams-" + key, Integer.toString(streamKinds.get(kind))); |
| 146 | } |