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 2012/01/30 13:02:45 UTC

svn commit: r1237614 - /tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp4/MP4Parser.java

Author: nick
Date: Mon Jan 30 12:02:44 2012
New Revision: 1237614

URL: http://svn.apache.org/viewvc?rev=1237614&view=rev
Log:
TIKA-853 Close the stream in the MP4 Parser, and use a cleaner way to get two of the metadata boxes

Modified:
    tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp4/MP4Parser.java

Modified: tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp4/MP4Parser.java
URL: http://svn.apache.org/viewvc/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp4/MP4Parser.java?rev=1237614&r1=1237613&r2=1237614&view=diff
==============================================================================
--- tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp4/MP4Parser.java (original)
+++ tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/mp4/MP4Parser.java Mon Jan 30 12:02:44 2012
@@ -41,12 +41,14 @@ import org.xml.sax.SAXException;
 import com.coremedia.iso.IsoBufferWrapper;
 import com.coremedia.iso.IsoBufferWrapperImpl;
 import com.coremedia.iso.IsoFile;
-import com.coremedia.iso.boxes.AbstractContainerBox;
 import com.coremedia.iso.boxes.Box;
+import com.coremedia.iso.boxes.ContainerBox;
 import com.coremedia.iso.boxes.FileTypeBox;
 import com.coremedia.iso.boxes.MetaBox;
 import com.coremedia.iso.boxes.MovieBox;
 import com.coremedia.iso.boxes.MovieHeaderBox;
+import com.coremedia.iso.boxes.SampleDescriptionBox;
+import com.coremedia.iso.boxes.SampleTableBox;
 import com.coremedia.iso.boxes.TrackBox;
 import com.coremedia.iso.boxes.TrackHeaderBox;
 import com.coremedia.iso.boxes.UserDataBox;
@@ -62,6 +64,7 @@ import com.coremedia.iso.boxes.apple.App
 import com.coremedia.iso.boxes.apple.AppleTrackAuthorBox;
 import com.coremedia.iso.boxes.apple.AppleTrackNumberBox;
 import com.coremedia.iso.boxes.apple.AppleTrackTitleBox;
+import com.coremedia.iso.boxes.sampleentry.AudioSampleEntry;
 
 /**
  * Parser for the MP4 media container format, as well as the older
@@ -105,14 +108,20 @@ public class MP4Parser extends AbstractP
             InputStream stream, ContentHandler handler,
             Metadata metadata, ParseContext context)
             throws IOException, SAXException, TikaException {
+        IsoFile isoFile;
+        
         // The MP4Parser library accepts either a File, or a byte array
         // As MP4 video files are typically large, always use a file to
         //  avoid OOMs that may occur with in-memory buffering
         TikaInputStream tstream = TikaInputStream.get(stream);
-        IsoBufferWrapper isoBufferWrapper = 
-           new IsoBufferWrapperImpl(tstream.getFile());
-        IsoFile isoFile = new IsoFile(isoBufferWrapper);
-        isoFile.parse();
+        try {
+           IsoBufferWrapper isoBufferWrapper = 
+              new IsoBufferWrapperImpl(tstream.getFile());
+           isoFile = new IsoFile(isoBufferWrapper);
+           isoFile.parse();
+        } finally {
+           tstream.close();
+        }
         
         
         // Grab the file type box
@@ -175,21 +184,36 @@ public class MP4Parser extends AbstractP
         // TODO Decide how to handle multiple tracks
         List<TrackBox> tb = moov.getBoxes(TrackBox.class);
         if (tb.size() > 0) {
-           TrackHeaderBox header = getOrNull(tb.get(0), TrackHeaderBox.class);
-           if (header != null) {
-              // Get the creation and modification dates
-              metadata.set(
-                    Metadata.CREATION_DATE, 
-                    MP4TimeToDate(header.getCreationTime())
-              );
-              metadata.set(
-                    Property.externalDate(Metadata.MODIFIED), // TODO Should be a real property
-                    MP4TimeToDate(header.getModificationTime())
-              );
-              
-              // Get the video with and height
-              metadata.set(Metadata.IMAGE_WIDTH,  (int)header.getWidth());
-              metadata.set(Metadata.IMAGE_LENGTH, (int)header.getHeight());
+           TrackBox track = tb.get(0);
+           
+           TrackHeaderBox header = track.getTrackHeaderBox();
+           // Get the creation and modification dates
+           metadata.set(
+                 Metadata.CREATION_DATE, 
+                 MP4TimeToDate(header.getCreationTime())
+           );
+           metadata.set(
+                 Property.externalDate(Metadata.MODIFIED), // TODO Should be a real property
+                 MP4TimeToDate(header.getModificationTime())
+           );
+           
+           // Get the video with and height
+           metadata.set(Metadata.IMAGE_WIDTH,  (int)header.getWidth());
+           metadata.set(Metadata.IMAGE_LENGTH, (int)header.getHeight());
+           
+           // Get the sample information
+           SampleTableBox samples = track.getSampleTableBox();
+           SampleDescriptionBox sampleDesc = samples.getSampleDescriptionBox();
+           if (sampleDesc != null) {
+              // Look for the first Audio Sample, if present
+              AudioSampleEntry sample = getOrNull(sampleDesc, AudioSampleEntry.class);
+              if (sample != null) {
+                 //metadata.set(XMPDM.AUDIO_CHANNEL_TYPE, sample.getChannelCount()); // TODO Num -> Name mapping
+                 //metadata.set(XMPDM.AUDIO_SAMPLE_TYPE, sample.getSampleSize());    // TODO Num -> Type mapping
+                 metadata.set(XMPDM.AUDIO_SAMPLE_RATE, (int)sample.getSampleRate());
+                 //metadata.set(XMPDM.AUDIO_, sample.getSamplesPerPacket());
+                 //metadata.set(XMPDM.AUDIO_, sample.getBytesPerSample());
+              }
            }
         }
         
@@ -282,7 +306,7 @@ public class MP4Parser extends AbstractP
     }
     private static final long EPOC_AS_MP4_TIME = 2082844800l;
     
-    private static <T extends Box> T getOrNull(AbstractContainerBox box, Class<T> clazz) {
+    private static <T extends Box> T getOrNull(ContainerBox box, Class<T> clazz) {
        List<T> boxes = box.getBoxes(clazz);
        if (boxes.size() == 0) {
           return null;