[transmageddon] various fixes to make aac work



commit 62168a7b59ee632a9405bce83fe68463b989071e
Author: Christian Schaller <christian schaller collabora co uk>
Date:   Wed Jul 22 17:16:51 2009 +0100

    various fixes to make aac work

 src/codecfinder.py       |   11 +++++--
 src/transcoder_engine.py |   66 ++++++++++++++++++++++++---------------------
 2 files changed, 43 insertions(+), 34 deletions(-)
---
diff --git a/src/codecfinder.py b/src/codecfinder.py
index 892ec37..94a30df 100644
--- a/src/codecfinder.py
+++ b/src/codecfinder.py
@@ -41,7 +41,7 @@ csuffixmap =   { 'Ogg' : ".ogg", 'Matroska' : ".mkv", 'MXF' : ".mxf", 'AVI' : ".
                         'MPEG4' : ".mp4", 'MPEG PS' : ".mpg", 'MPEG TS' : ".ts", 'FLV' : ".flv", '3GPP' : ".3gp" }
 
 codecmap = {     'vorbis' : "audio/x-vorbis", 'flac' : "audio/x-flac", 'mp3' : "audio/mpeg,mpegversion=1,layer=3", 
-                        'aac' : "audio/mpeg,mpegversion=[4, 2]", 'ac3' : "audio/x-ac3", 'speex' : "audio/x-speex", 
+                        'aac' : "audio/mpeg,mpegversion=4", 'ac3' : "audio/x-ac3", 'speex' : "audio/x-speex", 
                         'celt' : "audio/x-celt", 'alac' : "audio/x-alac", 'wma2' : "audio/x-wma,wmaversion=2", 
                         'theora' : "video/x-theora", 'dirac' : "video/x-dirac", 'h264' : "video/x-h264", 
                         'mpeg2' : "video/mpeg,mpegversion=2,systemstream=false", 'mpeg4' : "video/mpeg,mpegversion=4",
@@ -79,7 +79,6 @@ def get_muxer_element(containercaps):
        factory = gst.registry_get_default().lookup_feature(str(x))
        sinkcaps = [x.get_caps() for x in factory.get_static_pad_templates() if x.direction == gst.PAD_SRC]
        for caps in sinkcaps:
-
            result = caps[0].get_name()
            for attr in caps[0].keys():
                if attr not in blacklist:
@@ -133,9 +132,14 @@ def get_audio_encoder_element(audioencodercaps):
            sinkcaps = [x.get_caps() for x in factory.get_static_pad_templates() if x.direction == gst.PAD_SRC]
            for caps in sinkcaps:
                result = caps[0].get_name();
+               # print "result before attributes " + str(result)
                for attr in caps[0].keys():
                    if attr not in blacklist:
-                       result += ","+attr+"="+str(caps[0][attr])
+                       if codec == "faac":
+                           result = "audio/mpeg,mpegversion=4" 
+                       #ugly workaround for Caps.from_string not handling mpegversion =[2,4]
+                       else:
+                           result += ","+attr+"="+str(caps[0][attr])
            if audiocoderchoice.has_key(result):
                    mostrecent = gst.PluginFeature.get_rank(encoderfeature[codec])
                    original = gst.PluginFeature.get_rank(encoderfeature[audiocoderchoice[result]])
@@ -144,6 +148,7 @@ def get_audio_encoder_element(audioencodercaps):
            else:
                    audiocoderchoice[result] = codec
 
+   # print "*** printing audiocodecchoice ***"
    # print audiocoderchoice
    if audiocoderchoice.has_key(audioencodercaps):
        elementname = audiocoderchoice[audioencodercaps]
diff --git a/src/transcoder_engine.py b/src/transcoder_engine.py
index 273c38f..f0d14a2 100644
--- a/src/transcoder_engine.py
+++ b/src/transcoder_engine.py
@@ -52,15 +52,18 @@ class Transcoder(gobject.GObject):
        self.audiocaps = AUDIOCODECVALUE
        self.videocaps = VIDEOCODECVALUE
        self.audiopasstoggle = AUDIOPASSTOGGLE
+       # print "audiopass toggle is " + str(self.audiopasstoggle)
        self.videopasstoggle = VIDEOPASSTOGGLE
        
        if self.audiopasstoggle == False:
+           # print "audiopasstoggle is false, setting AudioEncoderPlugin"
+           # print "self.audiocaps IS **** " + str(self.audiocaps)
            self.AudioEncoderPlugin = codecfinder.get_audio_encoder_element(self.audiocaps)
        if self.videopasstoggle == False:
-           print "self.videopasstoggle is false so setting self.VideoEncoderPlugin"
-           print "look at incoming videocaps " + str(self.videocaps)
+           # print "self.videopasstoggle is false so setting self.VideoEncoderPlugin"
+           # print "look at incoming videocaps " + str(self.videocaps)
            self.VideoEncoderPlugin = codecfinder.get_video_encoder_element(self.videocaps)
-           print "self.VideoEncoderPlugin " + str(self.VideoEncoderPlugin)
+           # print "self.VideoEncoderPlugin " + str(self.VideoEncoderPlugin)
        self.preset = PRESET
        self.oheight = OHEIGHT
        self.owidth = OWIDTH
@@ -89,17 +92,17 @@ class Transcoder(gobject.GObject):
 
        self.gstmultiqueue = gst.element_factory_make("multiqueue")
        self.multiqueueaudiosinkpad = self.gstmultiqueue.get_request_pad("sink0")
-       print "self.multiqueueaudiosinkpad " + str(self.multiqueueaudiosinkpad)
+       # print "self.multiqueueaudiosinkpad " + str(self.multiqueueaudiosinkpad)
        self.multiqueuevideosinkpad = self.gstmultiqueue.get_request_pad("sink1")
-       print "self.multiqueuevideosinkpad " + str(self.multiqueuevideosinkpad)
+       # print "self.multiqueuevideosinkpad " + str(self.multiqueuevideosinkpad)
        self.multiqueueaudiosrcpad = self.gstmultiqueue.get_pad("src0")
-       print "self.multiqueueaudiosrcpad " + str(self.multiqueueaudiosrcpad)
+       # print "self.multiqueueaudiosrcpad " + str(self.multiqueueaudiosrcpad)
        self.multiqueuevideosrcpad = self.gstmultiqueue.get_pad("src1")
-       print "self.multiqueuevideosrcpad " + str(self.multiqueuevideosrcpad)
+       # print "self.multiqueuevideosrcpad " + str(self.multiqueuevideosrcpad)
        self.pipeline.add(self.gstmultiqueue) 
 
-       print "audiopass toggle is " + str(self.audiopasstoggle)
-       print "videopass toggle is " + str(self.videopasstoggle)
+       # print "audiopass toggle is " + str(self.audiopasstoggle)
+       # print "videopass toggle is " + str(self.videopasstoggle)
        self.remuxcaps = gst.Caps()
        if self.audiopasstoggle:
           self.remuxcaps.append(self.audiocaps)
@@ -113,7 +116,7 @@ class Transcoder(gobject.GObject):
           self.remuxcaps.append_structure(gst.Structure("audio/x-raw-int"))  
 
        if (self.audiopasstoggle) or (self.videopasstoggle):
-           print "remuxcaps is " + str(self.remuxcaps)
+           # print "remuxcaps is " + str(self.remuxcaps)
            self.uridecoder.set_property("caps", self.remuxcaps)
        self.pipeline.add(self.uridecoder)
        
@@ -127,20 +130,21 @@ class Transcoder(gobject.GObject):
                    sourcecaps = x.get_caps()
                    if videointersect == ("EMPTY"): 
                        videointersect = sourcecaps.intersect(gst.caps_from_string(self.videocaps))
-                       print "muxer video intersect is " + str(videointersect)
+                       # print "muxer video intersect is " + str(videointersect)
                        if videointersect != ("EMPTY"):
-                           print "pad is X which is " + str(x)
+                           # print "pad is X which is " + str(x)
                            self.containermuxervideosinkpad = self.containermuxer.get_request_pad(x.name_template)
-                           print "self.containermuxervideosinkpad " + str(self.containermuxervideosinkpad)
+                           # print "self.containermuxervideosinkpad " + str(self.containermuxervideosinkpad)
                    if audiointersect == ("EMPTY"):
-                       print "self.audiocaps is " + str(self.audiocaps)
+                       # print "self.audiocaps is " + str(self.audiocaps)
+                       # print "caps converted audio caps is " + str(gst.caps_from_string(self.audiocaps))
                        audiointersect = sourcecaps.intersect(gst.caps_from_string(self.audiocaps))
-                       print "muxer audio intersect is " + str(audiointersect)
+                       # print "muxer audio intersect is " + str(audiointersect)
                        if audiointersect != ("EMPTY"):
                            self.containermuxeraudiosinkpad = self.containermuxer.get_request_pad(x.name_template)
-                           print "self.containermuxeraudiosinkpad " + str(self.containermuxeraudiosinkpad)
-                       else:
-                           print "audiointersect is EMPTY and thus no self.containermuxeraudiosinkpad gets created"
+                           # print "self.containermuxeraudiosinkpad " + str(self.containermuxeraudiosinkpad)
+                       # else:
+                           # print "audiointersect is EMPTY and thus no self.containermuxeraudiosinkpad gets created"
            self.pipeline.add(self.containermuxer)
 
 
@@ -149,17 +153,17 @@ class Transcoder(gobject.GObject):
            self.pipeline.add(self.transcodefileoutput)
 
            self.containermuxer.link(self.transcodefileoutput)
-           print "reached end of first pipeline bulk, next step dynamic audio/video pads"
+           # print "reached end of first pipeline bulk, next step dynamic audio/video pads"
        else:
            self.multipassfakesink = gst.element_factory_make("fakesink", "multipassfakesink")
            self.pipeline.add(self.multipassfakesink)    
 
        self.uridecoder.set_state(gst.STATE_PAUSED)
-       print "setting uridcodebin to paused"
+       # print "setting uridcodebin to paused"
        self.BusMessages = self.BusWatcher()
 
        self.uridecoder.connect("no-more-pads", self.noMorePads) # we need to wait on this one before going further
-       print "connecting to no-more-pads"
+       # print "connecting to no-more-pads"
        # Get hold of all needed data from the XML profile files. 
    def provide_presets(self):
        devices = presets.get()
@@ -279,7 +283,7 @@ class Transcoder(gobject.GObject):
            self.transcodefileoutput.set_state(gst.STATE_PAUSED)
            self.containermuxer.set_state(gst.STATE_PAUSED)
        glib.idle_add(self.idlePlay)
-       print "No More pads received"
+       # print "No More pads received"
 
    def idlePlay(self):
         self.Pipeline("playing")
@@ -322,7 +326,7 @@ class Transcoder(gobject.GObject):
                if (self.multipass == False) or (self.passcounter == int(0)):
                    self.audioconverter = gst.element_factory_make("audioconvert")
                    self.pipeline.add(self.audioconverter)
-
+                   print "self.AudioEncoderPlugin is " + str(self.AudioEncoderPlugin)
                    self.audioencoder = gst.element_factory_make(self.AudioEncoderPlugin)
                    self.pipeline.add(self.audioencoder)
                    if self.preset != "nopreset":
@@ -360,8 +364,8 @@ class Transcoder(gobject.GObject):
                    self.acapsfilter.set_state(gst.STATE_PAUSED)
                self.audioencoder.set_state(gst.STATE_PAUSED)
                self.gstmultiqueue.set_state(gst.STATE_PAUSED)
-               print "containermuxer audio sinkpad  is " + str(self.containermuxeraudiosinkpad)
                self.multiqueueaudiosrcpad.link(self.containermuxeraudiosinkpad)
+               print "containermuxer audio sinkpad  is " + str(self.containermuxeraudiosinkpad)
 
            else:
                # TODO: dynamically plug correct parser. Iterate on parsers and intersect.
@@ -394,7 +398,7 @@ class Transcoder(gobject.GObject):
                    self.audioparse = gst.element_factory_make(self.aparserelement)
                    self.pipeline.add(self.audioparse)
 
-                   print "audiopad " + str(self.multiqueueaudiosinkpad)
+                   # print "audiopad " + str(self.multiqueueaudiosinkpad)
                    sink_pad.link(self.audioparse.get_static_pad("sink"))
                    self.audioparse.get_static_pad("src").link(self.multiqueueaudiosinkpad)                    
                    self.multiqueueaudiosrcpad.link(self.containermuxeraudiosinkpad)
@@ -403,7 +407,7 @@ class Transcoder(gobject.GObject):
 
        elif c.startswith("video/"):
            if self.videopasstoggle == False:
-               print "Got an video cap"
+               # print "Got an video cap"
                self.colorspaceconverter = gst.element_factory_make("ffmpegcolorspace")
                self.pipeline.add(self.colorspaceconverter)
 
@@ -460,7 +464,7 @@ class Transcoder(gobject.GObject):
 
                        self.colorspaceconvert3 = gst.element_factory_make("ffmpegcolorspace")
                        self.pipeline.add(self.colorspaceconvert3)
-               print "self.VideoEncoderPlugin is " + str(self.VideoEncoderPlugin)
+               # print "self.VideoEncoderPlugin is " + str(self.VideoEncoderPlugin)
                self.videoencoder = gst.element_factory_make(self.VideoEncoderPlugin)
                self.pipeline.add(self.videoencoder)
                if self.preset != "nopreset":
@@ -521,15 +525,15 @@ class Transcoder(gobject.GObject):
                self.videoencoder.set_state(gst.STATE_PAUSED)
                if self.multipass == False or (self.passcounter == int(0)):
                    self.gstmultiqueue.set_state(gst.STATE_PAUSED)
-                   print "self.multiqueuevideosrcpad is hopefully " + str(self.multiqueuevideosrcpad)
+                   # print "self.multiqueuevideosrcpad is hopefully " + str(self.multiqueuevideosrcpad)
 
                    self.multiqueuevideosrcpad.link(self.containermuxervideosinkpad)
            else:
-               print "videopasstoggle True, remuxing" + str(self.videopasstoggle)
+               # print "videopasstoggle True, remuxing" + str(self.videopasstoggle)
                vparsedcaps = gst.caps_from_string(self.videocaps+",parsed=true")
                vframedcaps = gst.caps_from_string(self.videocaps+",framed=true")
                if (sink_pad.get_caps().is_subset(vparsedcaps)) or (sink_pad.get_caps().is_subset(vframedcaps)):
-                   print "is framedcaps subset? Yes"
+                   # print "is framedcaps subset? Yes"
                    sink_pad.link(self.multiqueuevideosinkpad)
                    self.multiqueuevideosrcpad.link(self.containermuxervideosinkpad)
                    self.gstmultiqueue.set_state(gst.STATE_PAUSED)
@@ -552,7 +556,7 @@ class Transcoder(gobject.GObject):
                    self.videoparse = gst.element_factory_make(self.vparserelement)
                    self.pipeline.add(self.videoparse)
 
-                   print "videopad " + str(self.multiqueuevideosinkpad)
+                   # print "videopad " + str(self.multiqueuevideosinkpad)
                    sink_pad.link(self.videoparse.get_static_pad("sink"))
                    self.videoparse.get_static_pad("src").link(self.multiqueuevideosinkpad)                    
                    self.multiqueuevideosrcpad.link(self.containermuxervideosinkpad)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]