Victor Stinner avatar Victor Stinner committed 6882736

fix matroska to get audio bits per sample, and WebM sample rate

Comments (0)

Files changed (2)

hachoir-metadata/ChangeLog

 hachoir-metadata 1.3.3
 ======================
 
- * fix matroska to extract webm video duration
+ * fix matroska to extract webm video duration and audio bits per sample
 
 hachoir-metadata 1.3.2 (2010-02-04)
 ===================================

hachoir-metadata/hachoir_metadata/video.py

 
     def processVideo(self, track):
         video = Metadata(self)
+        self.trackCommon(track, video)
         try:
-            self.trackCommon(track, video)
             video.compression = track["CodecID/string"].value
             if "Video" in track:
                 video.width = track["Video/PixelWidth/unsigned"].value
             pass
         self.addGroup("video[]", video, "Video stream")
 
+    def getDouble(self, field, parent):
+        float_key = '%s/float' % parent
+        if float_key in field:
+            return field[float_key].value
+        double_key = '%s/double' % parent
+        if double_key in field:
+            return field[double_key].value
+        return None
+
     def processAudio(self, track):
         audio = Metadata(self)
-        try:
-            self.trackCommon(track, audio)
-            if "Audio" in track:
-                audio.sample_rate = track["Audio/SamplingFrequency/float"].value
+        self.trackCommon(track, audio)
+        if "Audio" in track:
+            frequency = self.getDouble(track, "Audio/SamplingFrequency")
+            if frequency is not None:
+                audio.sample_rate = frequency
+            if "Audio/Channels/unsigned" in track:
                 audio.nb_channel = track["Audio/Channels/unsigned"].value
+            if "Audio/BitDepth/unsigned" in track:
+                audio.bits_per_sample = track["Audio/BitDepth/unsigned"].value
+        if "CodecID/string" in track:
             audio.compression = track["CodecID/string"].value
-        except MissingField:
-            pass
         self.addGroup("audio[]", audio, "Audio stream")
 
     def processSubtitle(self, track):
         sub = Metadata(self)
+        self.trackCommon(track, sub)
         try:
-            self.trackCommon(track, sub)
             sub.compression = track["CodecID/string"].value
         except MissingField:
             pass
         value = tag["TagString/unicode"].value
         setattr(self, key, value)
 
-    # Catch OverflowError for timedelta (long int too large to convert to int)
-    @fault_tolerant
-    def readDuration(self, duration, timecode_scale):
-        seconds = duration * timecode_scale
-        self.duration = timedelta(seconds=seconds)
-
     def processInfo(self, info):
         if "TimecodeScale/unsigned" in info:
-            timecode_scale = info["TimecodeScale/unsigned"].value * 1e-9
-            if "Duration/float" in info:
-                self.readDuration(info["Duration/float"].value, timecode_scale)
-            elif "Duration/double" in info:
-                self.readDuration(info["Duration/double"].value, timecode_scale)
+            duration = self.getDouble(info, "Duration")
+            if duration is not None:
+                try:
+                    seconds = duration * info["TimecodeScale/unsigned"].value * 1e-9
+                    self.duration = timedelta(seconds=seconds)
+                except OverflowError:
+                    # Catch OverflowError for timedelta (long int too large
+                    # to be converted to an int)
+                    pass
         if "DateUTC/date" in info:
             try:
                 self.creation_date = dateToDatetime(info["DateUTC/date"].value)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.