You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ni...@apache.org on 2014/12/15 08:18:28 UTC

svn commit: r1645583 - /tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/image/BPGParser.java

Author: nick
Date: Mon Dec 15 07:18:28 2014
New Revision: 1645583

URL: http://svn.apache.org/r1645583
Log:
Start processing extension data for BPG files

Modified:
    tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/image/BPGParser.java

Modified: tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/image/BPGParser.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/image/BPGParser.java?rev=1645583&r1=1645582&r2=1645583&view=diff
==============================================================================
--- tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/image/BPGParser.java (original)
+++ tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/image/BPGParser.java Mon Dec 15 07:18:28 2014
@@ -36,6 +36,12 @@ import org.apache.tika.sax.XHTMLContentH
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 
+import com.drew.lang.BufferReader;
+import com.drew.lang.ByteArrayReader;
+import com.drew.metadata.MetadataException;
+import com.drew.metadata.exif.ExifReader;
+import com.drew.metadata.xmp.XmpReader;
+
 /**
  * Parser for the Better Portable Graphics )BPG) File Format.
  * 
@@ -53,10 +59,10 @@ public class BPGParser extends AbstractP
         return SUPPORTED_TYPES;
     }
     
-    protected int EXTENSION_TAG_EXIF = 1;
-    protected int EXTENSION_TAG_ICC_PROFILE = 2;
-    protected int EXTENSION_TAG_XMP = 3;
-    protected int EXTENSION_TAG_THUMBNAIL = 4;
+    protected static final int EXTENSION_TAG_EXIF = 1;
+    protected static final int EXTENSION_TAG_ICC_PROFILE = 2;
+    protected static final int EXTENSION_TAG_XMP = 3;
+    protected static final int EXTENSION_TAG_THUMBNAIL = 4;
 
     public void parse(
             InputStream stream, ContentHandler handler,
@@ -133,39 +139,69 @@ public class BPGParser extends AbstractP
             alphaDataLength = EndianUtils.readUE7(stream);
         
         // Extension Data
+        if (hasExtensions) {
+            long extensionsDataSeen = 0;
+            ImageMetadataExtractor metadataExtractor = 
+                    new ImageMetadataExtractor(metadata);
+            
+            while (extensionsDataSeen < extensionDataLength) {
+                int extensionType = (int)EndianUtils.readUE7(stream);
+                long extensionLength = EndianUtils.readUE7(stream);
+                switch (extensionType) {
+                    case EXTENSION_TAG_EXIF:
+                        handleExif(stream, extensionLength, metadataExtractor);
+                        break;
+                    case EXTENSION_TAG_XMP:
+                        handleXMP(stream, extensionLength, metadataExtractor);
+                        break;
+                    default:
+                        stream.skip(extensionLength);
+                }
+                extensionsDataSeen += extensionLength;
+            }
+        }
         
         // HEVC Header + Data
         // Alpha HEVC Header + Data
         // We can't do anything with these parts
-
-        // TODO Update from here on
-        
-        // Next is the Image Resources section
-        // Check for certain interesting keys here
-/*
-        long imageResourcesSectionSize = EndianUtils.readIntBE(stream);
-        long read = 0;
-        while(read < imageResourcesSectionSize) {
-           ResourceBlock rb = new ResourceBlock(stream);
-           read += rb.totalLength;
-           
-           // Is it one we can do something useful with?
-           if(rb.id == ResourceBlock.ID_CAPTION) {
-              metadata.add(TikaCoreProperties.DESCRIPTION, rb.getDataAsString()); 
-           } else if(rb.id == ResourceBlock.ID_EXIF_1) {
-              // TODO Parse the EXIF info
-           } else if(rb.id == ResourceBlock.ID_EXIF_3) {
-              // TODO Parse the EXIF info
-           } else if(rb.id == ResourceBlock.ID_XMP) {
-              // TODO Parse the XMP info
-           }
-        }
-*/
-        
         
         // We don't have any helpful text, sorry...
         XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
         xhtml.startDocument();
         xhtml.endDocument();
     }
+    
+    protected void handleExif(InputStream stream, long exifLength, 
+            ImageMetadataExtractor extractor) throws IOException, TikaException {
+        byte[] exif = new byte[(int)exifLength];
+        IOUtils.readFully(stream, exif);
+        BufferReader exifReader = new ByteArrayReader(exif);
+        
+        com.drew.metadata.Metadata metadata = new com.drew.metadata.Metadata();
+        ExifReader reader = new ExifReader();
+        reader.extract(exifReader, metadata);
+        
+        try {
+            extractor.handle(metadata);
+        } catch (MetadataException e) {
+            throw new TikaException("Can't read BPG EXIF Data", e);
+        }
+    }
+    
+    protected void handleXMP(InputStream stream, long xmpLength, 
+            ImageMetadataExtractor extractor) throws IOException, TikaException {
+        byte[] xmp = new byte[(int)xmpLength];
+        IOUtils.readFully(stream, xmp);
+        BufferReader xmpReader = new ByteArrayReader(xmp);
+        
+        com.drew.metadata.Metadata metadata = new com.drew.metadata.Metadata();
+        XmpReader reader = new XmpReader();
+        reader.extract(xmpReader, metadata);
+        
+        try {
+            extractor.handle(metadata);
+        } catch (MetadataException e) {
+            throw new TikaException("Can't read BPG XMP Data", e);
+        }
+    }
 }