[transmageddon] Fix video remuxing code, add workaround for h264parse



commit d5826bd110cf2ac9c17a5bdbb5f76b8580e072c3
Author: Christian Schaller <christian schaller collabora co uk>
Date:   Sat Sep 12 18:55:33 2009 +0100

    Fix video remuxing code, add workaround for h264parse

 src/transcoder_engine.py |   23 +++++++++++++++++------
 src/transmageddon.py     |    8 +++++++-
 2 files changed, 24 insertions(+), 7 deletions(-)
---
diff --git a/src/transcoder_engine.py b/src/transcoder_engine.py
index ab8aecc..071a216 100644
--- a/src/transcoder_engine.py
+++ b/src/transcoder_engine.py
@@ -384,7 +384,7 @@ class Transcoder(gobject.GObject):
                                        parseintersect = caps.intersect(gst.caps_from_string(self.audiocaps))
                                    if parseintersect != ("EMPTY"):
                                        self.aparserelement = parser
-                                       print "parser " + str(parser)
+                                       print "audio parser " + str(parser)
                    # TODO: Need to handle the case when no parser is found
             
                    self.audioparse = gst.element_factory_make(self.aparserelement)
@@ -508,33 +508,44 @@ class Transcoder(gobject.GObject):
                    self.gstmultiqueue.set_state(gst.STATE_PAUSED)
                    self.multiqueuevideosrcpad.link(self.containermuxervideosinkpad)
            else:
+               # Code for passthrough mode
                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)):
                    sink_pad.link(self.multiqueuevideosinkpad)
                    self.multiqueuevideosrcpad.link(self.containermuxervideosinkpad)
                    self.gstmultiqueue.set_state(gst.STATE_PAUSED)
+                   print "video pad is subset"
                else:
+                   print "video pad is not subset"
                    flist = gst.registry_get_default().get_feature_list(gst.ElementFactory)
                    parsers = []
                    for fact in flist:
                        if self.list_compat(["Codec", "Parser","Video"], fact.get_klass().split('/')):
                            parsers.append(fact.get_name())
+                       elif self.list_compat(["Codec", "Parser"], fact.get_klass().split('/')):
+                           parsers.append(fact.get_name())
                            for x in parsers:
                                parser = x
+                               print parser
                                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]
                                parseintersect = ("EMPTY")   
                                for caps in sinkcaps:
                                    if parseintersect == ("EMPTY"):
+                                       print "trying to intersect videoparser"
+                                       print "parser caps are   " + gst.Caps.to_string(caps)
+                                       print "incomign caps are " + self.videocaps
                                        parseintersect = caps.intersect(gst.caps_from_string(self.videocaps))
                                    if parseintersect != ("EMPTY"):
                                        self.vparserelement = parser
-                                       self.videoparse = gst.element_factory_make(self.vparserelement)
-                                       self.pipeline.add(self.videoparse)
-                                       sink_pad.link(self.videoparse.get_static_pad("sink"))
-                                       self.videoparse.get_static_pad("src").link(self.multiqueuevideosinkpad)
-                                       self.videoparse.set_state(gst.STATE_PAUSED)                    
+                                       print "video parser " + str(parser)
+
+                   self.videoparse = gst.element_factory_make(self.vparserelement)
+                   self.pipeline.add(self.videoparse)
+                   sink_pad.link(self.videoparse.get_static_pad("sink"))
+                   self.videoparse.get_static_pad("src").link(self.multiqueuevideosinkpad)
+                   self.videoparse.set_state(gst.STATE_PAUSED)                    
                    self.multiqueuevideosrcpad.link(self.containermuxervideosinkpad)
                    self.gstmultiqueue.set_state(gst.STATE_PAUSED)
 
diff --git a/src/transmageddon.py b/src/transmageddon.py
index 7a8a8ae..4dfe6bf 100644
--- a/src/transmageddon.py
+++ b/src/transmageddon.py
@@ -53,7 +53,7 @@ if (major == 2) and (minor < 18):
    sys.exit(1)
 
 os.environ["GST_DEBUG_DUMP_DOT_DIR"] = "/tmp"
-# os.putenv('GST_DEBUG_DUMP_DIR_DIR', '/tmp')
+os.putenv('GST_DEBUG_DUMP_DIR_DIR', '/tmp')
 
 supported_containers = [
         "Ogg",
@@ -665,6 +665,12 @@ class TransmageddonUI (gtk.glade.XML):
        about.AboutDialog()
 
    def on_debug_activate(self, widget):
+       dotfile = "/tmp/transmageddon-debug-graph.dot"
+       pngfile = "/tmp/transmageddon-pipeline.png"
+       if os.access(dotfile, os.F_OK):
+           os.remove(dotfile)
+       if os.access(pngfile, os.F_OK):
+           os.remove(pngfile)
        gst.DEBUG_BIN_TO_DOT_FILE (self._transcoder.pipeline, gst.DEBUG_GRAPH_SHOW_ALL, 'transmageddon-debug-graph')
        print "The debug feature requiers Eye of GNOME (eog) and graphviz (dot) to be installed"
        os.system("dot -Tpng -o /tmp/transmageddon-pipeline.png /tmp/transmageddon-debug-graph.dot")



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