Author: dmeyer
Date: Wed Dec  6 15:03:23 2006
New Revision: 2153

Modified:
   trunk/metadata/src/mediainfo.py
   trunk/metadata/src/video/asfinfo.py
   trunk/metadata/src/video/mkvinfo.py
   trunk/metadata/src/video/movinfo.py
   trunk/metadata/src/video/mpeginfo.py
   trunk/metadata/src/video/ogminfo.py
   trunk/metadata/src/video/riffinfo.py

Log:
Update fourcc handling. The codec is now stored in is
four or two byte code and only resolved when
transforming the object to unicode or string.
This will make it possible for kaa.popcorn to access
the real fourcc id.



Modified: trunk/metadata/src/mediainfo.py
==============================================================================
--- trunk/metadata/src/mediainfo.py     (original)
+++ trunk/metadata/src/mediainfo.py     Wed Dec  6 15:03:23 2006
@@ -38,6 +38,9 @@
 # kaa imports
 from kaa.strutils import str_to_unicode, unicode_to_str
 
+# fourcc list for debugging
+import fourcc
+
 UNPRINTABLE_KEYS = [ 'thumbnail']
 
 # type definitions
@@ -262,6 +265,17 @@
             setattr(self,k,None)
             self.keys.append(k)
 
+    def __unicode__(self):
+        result = u''
+        for key in self.keys:
+            value = self[key]
+            if value == None:
+                continue
+            if key == 'codec':
+                value = fourcc.resolve(value)
+            result += u'\n        %s: %s' % (unicode(key), unicode(value))
+        return result
+
 
 class MusicInfo(AudioInfo):
     """
@@ -301,6 +315,17 @@
             self.keys.append(k)
 
 
+    def __unicode__(self):
+        result = u''
+        for key in self.keys:
+            value = self[key]
+            if value == None:
+                continue
+            if key == 'codec':
+                value = fourcc.resolve(value)
+            result += u'\n        %s: %s' % (unicode(key), unicode(value))
+        return result
+
 class ChapterInfo(MediaInfo):
     """
     Chapter in a Multiplexed Container.

Modified: trunk/metadata/src/video/asfinfo.py
==============================================================================
--- trunk/metadata/src/video/asfinfo.py (original)
+++ trunk/metadata/src/video/asfinfo.py Wed Dec  6 15:03:23 2006
@@ -37,7 +37,6 @@
 import re
 import struct
 import string
-import fourcc
 import logging
 
 # kaa imports
@@ -273,8 +272,7 @@
                 vi = mediainfo.VideoInfo()
                 vi.width, vi.height, depth, \
                           codec, = struct.unpack('<4xII2xH4s', s[89:89+20])
-                vi.codec = fourcc.RIFFCODEC[codec]
-                vi.format = codec
+                vi.codec = codec
                 vi.id = strno
                 self.video.append(vi)
             elif streamtype == GUIDS['ASF_Audio_Media']:
@@ -282,8 +280,7 @@
                 twocc, ai.channels, ai.samplerate, bitrate, block, \
                        ai.samplebits, = struct.unpack('<HHIIHH', s[78:78+16])
                 ai.bitrate = 8*bitrate  # XXX Is this right?
-                ai.codec = fourcc.RIFFWAVE[twocc]
-                ai.format = twocc
+                ai.codec = twocc
                 ai.id = strno
                 self.audio.append(ai)
             pass

Modified: trunk/metadata/src/video/mkvinfo.py
==============================================================================
--- trunk/metadata/src/video/mkvinfo.py (original)
+++ trunk/metadata/src/video/mkvinfo.py Wed Dec  6 15:03:23 2006
@@ -42,7 +42,6 @@
 # kaa imports
 from kaa.metadata import mediainfo
 from kaa.metadata import factory
-import fourcc
 
 # get logging object
 log = logging.getLogger('metadata')
@@ -106,6 +105,23 @@
 # See mkv spec for details:
 # http://www.matroska.org/technical/specs/index.html
 
+# Map to convert to well known codes
+# http://haali.cs.msu.ru/mkv/codecs.pdf
+FOURCCMap = {
+    'V_THEORA': 'THEO',
+    'V_SNOW': 'SNOW',
+    'V_MPEG4/ISO/ASP': 'MP4V',
+    'V_MPEG4/ISO/AVC': 'AVC1',
+    'A_AC3': 0x2000,
+    'A_MPEG/L3': 0x0055,
+    'A_MPEG/L2': 0x0050,
+    'A_MPEG/L1': 0x0050,
+    'A_DTS': 0x2001,
+    'A_PCM/INT/LIT': 0x0001,
+    'A_PCM/FLOAT/IEEE': 0x003,
+    'A_TTA1': 0x77a1
+}
+    
 class EbmlEntity:
     """
     This is class that is responsible to handle one Ebml entity as described in
@@ -337,20 +353,23 @@
             try:
                 elem = tabelem[MATROSKA_CODEC_ID]
                 track.codec = elem.get_str()
-                if track.codec.startswith('V_'):
-                    track.codec = track.codec[2:]
             except (ZeroDivisionError, KeyError, IndexError):
                 track.codec = u'Unknown'
 
-            if MATROSKA_CODEC_PRIVATE_ID in tabelem and \
+            # convert codec information
+            # http://haali.cs.msu.ru/mkv/codecs.pdf
+            if track.codec in FOURCCMap:
+                track.codec = FOURCCMap[track.codec]
+            elif track.codec.endswith('FOURCC') and \
+                   MATROSKA_CODEC_PRIVATE_ID in tabelem and \
                    tabelem[MATROSKA_CODEC_PRIVATE_ID].get_len() == 40:
-                # Assuming it's a alBITMAPINFOHEADER, grab fourcc
-                c = tabelem[MATROSKA_CODEC_PRIVATE_ID].get_data()[16:20]
-                if c in fourcc.RIFFWAVE:
-                    track.format = fourcc.RIFFWAVE[c]
-                if c in fourcc.RIFFCODEC:
-                    track.format = fourcc.RIFFCODEC[c]
-                        
+                track.codec = 
tabelem[MATROSKA_CODEC_PRIVATE_ID].get_data()[16:20]
+            elif track.codec.startswith('V_REAL/'):
+                track.codec = track.codec[7:]
+            elif track.codec.startswith('V_'):
+                # FIXME: add more video codecs here
+                track.codec = track.codec[2:]
+
             try:
                 elem = tabelem[MATROSKA_FRAME_DURATION_ID]
                 track.fps = 1 / (pow(10, -9) * (elem.get_value()))
@@ -382,7 +401,9 @@
             try:
                 elem = tabelem[MATROSKA_CODEC_ID]
                 track.codec = elem.get_str()
-                if track.codec.startswith('A_'):
+                if track.codec in FOURCCMap:
+                    track.codec = FOURCCMap[track.codec]
+                elif track.codec.startswith('A_'):
                     track.codec = track.codec[2:]
             except (KeyError, IndexError):
                 track.codec = u"Unknown"

Modified: trunk/metadata/src/video/movinfo.py
==============================================================================
--- trunk/metadata/src/video/movinfo.py (original)
+++ trunk/metadata/src/video/movinfo.py Wed Dec  6 15:03:23 2006
@@ -43,7 +43,6 @@
 from kaa.metadata import factory
 from kaa.metadata import mediainfo
 from movlanguages import *
-import fourcc
 
 # get logging object
 log = logging.getLogger('metadata')
@@ -211,7 +210,8 @@
                                     # jpeg is no video, remove it from the list
                                     self.video.remove(vi)
                                     info = None
-
+                                print codec
+                                
                         elif mdia[1] == 'dinf':
                             dref = unpack('>I4s', atomdata[pos+8:pos+8+8])
                             log.debug('  --> %s, %s' % mdia)

Modified: trunk/metadata/src/video/mpeginfo.py
==============================================================================
--- trunk/metadata/src/video/mpeginfo.py        (original)
+++ trunk/metadata/src/video/mpeginfo.py        Wed Dec  6 15:03:23 2006
@@ -40,7 +40,6 @@
 # kaa imports
 from kaa.metadata import mediainfo
 from kaa.metadata import factory
-import fourcc
 
 # get logging object
 log = logging.getLogger('metadata')

Modified: trunk/metadata/src/video/ogminfo.py
==============================================================================
--- trunk/metadata/src/video/ogminfo.py (original)
+++ trunk/metadata/src/video/ogminfo.py Wed Dec  6 15:03:23 2006
@@ -39,7 +39,6 @@
 # kaa imports
 from kaa.metadata import mediainfo
 from kaa.metadata import factory
-import fourcc
 
 # get logging object
 log = logging.getLogger('metadata')
@@ -289,10 +288,7 @@
                 vi.width /= 65536
                 vi.height /= 65536
                 # XXX length, bitrate are very wrong
-                try:
-                    vi.codec = fourcc.RIFFCODEC[type]
-                except (KeyError, IndexError):
-                    vi.codec = 'Unknown (%s)' % type
+                vi.codec = type
                 vi.fps = 10000000 / timeunit
                 self.video.append(vi)
                 self.all_streams.append(vi)

Modified: trunk/metadata/src/video/riffinfo.py
==============================================================================
--- trunk/metadata/src/video/riffinfo.py        (original)
+++ trunk/metadata/src/video/riffinfo.py        Wed Dec  6 15:03:23 2006
@@ -33,7 +33,6 @@
 import re
 import struct
 import string
-import fourcc
 import logging
 import time
 
@@ -205,11 +204,7 @@
             # http://www.stats.uwa.edu.au/Internal/Specs/DXALL/FileSpec/\
             #    Languages
             # ai.language = strh['wLanguage']
-            try:
-                ai.codec = fourcc.RIFFWAVE[retval['wFormatTag']]
-            except (KeyError, IndexError):
-                ai.codec = "Unknown"
-            ai.format = retval['wFormatTag']
+            ai.codec = retval['wFormatTag']
             self.audio.append(ai)
         elif fccType == 'vids':
             v = struct.unpack('<IIIHH',t[0:16])
@@ -218,7 +213,6 @@
               retval['biHeight'],
               retval['biPlanes'],
               retval['biBitCount'], ) = v
-            retval['fourcc'] = t[16:20]
             v = struct.unpack('IIIII',t[20:40])
             ( retval['biSizeImage'],
               retval['biXPelsPerMeter'],
@@ -226,16 +220,12 @@
               retval['biClrUsed'],
               retval['biClrImportant'], ) = v
             vi = mediainfo.VideoInfo()
-            try:
-                vi.codec = fourcc.RIFFCODEC[t[16:20]]
-            except (KeyError, IndexError):
-                vi.codec = "Unknown"
+            vi.codec = t[16:20]
             vi.width = retval['biWidth']
             vi.height = retval['biHeight']
             vi.bitrate = strh['dwRate']
             vi.fps = float(strh['dwRate']) / strh['dwScale']
             vi.length = strh['dwLength'] / vi.fps
-            vi.format = retval['fourcc']
             self.video.append(vi)
         return retval
 

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to