[transmageddon] Remove all engines expect encodebin one, yay!



commit 5af591fcf8c537db06fe0315065b7019a97aeec8
Author: Christian Fredrik Kalager Schaller <christian schaller collabora co uk>
Date:   Sat Feb 26 22:43:29 2011 +0000

    Remove all engines expect encodebin one, yay!

 src/transcoder_engine.py           |  270 +++--------------
 src/transcoder_engine_audio.py     |  253 ----------------
 src/transcoder_engine_encodebin.py |  206 -------------
 src/transcoder_engine_preset.py    |  581 ------------------------------------
 src/transmageddon.py               |   22 +--
 5 files changed, 47 insertions(+), 1285 deletions(-)
---
diff --git a/src/transcoder_engine.py b/src/transcoder_engine.py
index 7757f84..36d3c10 100644
--- a/src/transcoder_engine.py
+++ b/src/transcoder_engine.py
@@ -46,8 +46,7 @@ class Transcoder(gobject.GObject):
        gobject.GObject.__init__(self)
 
        # Choose plugin based on Container name
-       containercaps = codecfinder.containermap[CONTAINERCHOICE]
-       self.ContainerFormatPlugin = codecfinder.get_muxer_element(containercaps)
+       self.containercaps = codecfinder.containermap[CONTAINERCHOICE]
 
        # Choose plugin based on Codec Name
        # or switch to remuxing mode if any of the values are set to 'pastr'
@@ -59,14 +58,9 @@ class Transcoder(gobject.GObject):
        self.videopasstoggle = VIDEOPASSTOGGLE
        self.doaudio= False
        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)
            self.VideoEncoderPlugin = codecfinder.get_video_encoder_element(self.videocaps)
-           # print "self.VideoEncoderPlugin " + str(self.VideoEncoderPlugin)
        self.preset = PRESET
        self.oheight = OHEIGHT
        self.owidth = OWIDTH
@@ -94,16 +88,24 @@ class Transcoder(gobject.GObject):
        self.uridecoder.set_property("uri", FILECHOSEN)
        self.uridecoder.connect("pad-added", self.OnDynamicPad)
 
-       self.gstmultiqueue = gst.element_factory_make("multiqueue")
-       self.multiqueueaudiosinkpad = self.gstmultiqueue.get_request_pad("sink0")
-       self.multiqueuevideosinkpad = self.gstmultiqueue.get_request_pad("sink1")
-       self.multiqueueaudiosrcpad = self.gstmultiqueue.get_pad("src0")
-       self.multiqueuevideosrcpad = self.gstmultiqueue.get_pad("src1")
+       # self.gstmultiqueue = gst.element_factory_make("multiqueue")
+       # self.multiqueueaudiosinkpad = self.gstmultiqueue.get_request_pad("sink0")
+       # self.multiqueuevideosinkpad = self.gstmultiqueue.get_request_pad("sink1")
+       # self.multiqueueaudiosrcpad = self.gstmultiqueue.get_pad("src0")
+       # self.multiqueuevideosrcpad = self.gstmultiqueue.get_pad("src1")
 
-       self.pipeline.add(self.gstmultiqueue) 
+       # self.pipeline.add(self.gstmultiqueue) 
+
+       self.encodebinprofile = gst.pbutils.EncodingContainerProfile ("ogg", None , gst.Caps(self.containercaps), None)
+       self.videoprofile = gst.pbutils.EncodingVideoProfile (gst.Caps(self.videocaps), None, gst.caps_new_any(), 0)
+       self.audioprofile = gst.pbutils.EncodingAudioProfile (gst.Caps(self.audiocaps), None, gst.caps_new_any(), 0)
+       self.encodebinprofile.add_profile(self.videoprofile)
+       self.encodebinprofile.add_profile(self.audioprofile)
+
+       self.encodebin = gst.element_factory_make ("encodebin", None)
+       self.encodebin.set_property("profile", self.encodebinprofile)
+       self.pipeline.add(self.encodebin)
 
-       # 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)
@@ -121,40 +123,29 @@ class Transcoder(gobject.GObject):
            self.uridecoder.set_property("caps", self.remuxcaps)
        self.pipeline.add(self.uridecoder)
 
-       self.containermuxer = gst.element_factory_make(self.ContainerFormatPlugin, "containermuxer")
-       videointersect = ("EMPTY")
-       audiointersect = ("EMPTY")   
-       factory = gst.registry_get_default().lookup_feature(self.ContainerFormatPlugin)
-       for x in factory.get_static_pad_templates():
-           if (x.direction == gst.PAD_SINK):
-               sourcecaps = x.get_caps()
-               if videointersect == ("EMPTY"): 
-                   videointersect = sourcecaps.intersect(gst.caps_from_string(self.videocaps))
-                   if videointersect != ("EMPTY"):
-                   # print "pad is X which is " + str(x)
-                       self.containermuxervideosinkpad = self.containermuxer.get_request_pad(x.name_template)
-               if audiointersect == ("EMPTY"):
-                   audiointersect = sourcecaps.intersect(gst.caps_from_string(self.audiocaps))
-                   if audiointersect != ("EMPTY"):
-                       self.containermuxeraudiosinkpad = self.containermuxer.get_request_pad(x.name_template)
-       self.pipeline.add(self.containermuxer)
-
-       # Add a tag setting Transmageddon as the application used for creating file if supported by format
-       GstTagSetterType = gobject.type_from_name("GstTagSetter")
-       if GstTagSetterType in gobject.type_interfaces(self.containermuxer):
-           taglist=gst.TagList()
-           taglist[gst.TAG_APPLICATION_NAME] = "Transmageddon"
-           self.containermuxer.merge_tags(taglist, gst.TAG_MERGE_APPEND)
-
        self.transcodefileoutput = gst.element_factory_make("filesink", "transcodefileoutput")
        self.transcodefileoutput.set_property("location", (DESTDIR+"/"+self.outputfilename))
        self.pipeline.add(self.transcodefileoutput)
+       self.encodebin.link(self.transcodefileoutput)
 
-       self.containermuxer.link(self.transcodefileoutput)
        # print "reached end of first pipeline bulk, next step dynamic audio/video pads"
-   
+
+       if self.rotationvalue == 1 or self.rotationvalue == 3:
+           # print "switching height and with around"
+           nwidth = height
+           nheight = width
+           height = nheight
+           width = nwidth   
+
+       #self.videoflipper = gst.element_factory_make("videoflip")
+       #self.videoflipper.set_property("method", self.rotationvalue)
+       #self.pipeline.add(self.videoflipper)
+
+       #self.fakesink = gst.element_factory_make("fakesink", "fakesink")
+       #self.pipeline.add(self.fakesink) 
 
        self.uridecoder.set_state(gst.STATE_PAUSED)
+       self.encodebin.set_state(gst.STATE_PAUSED)
        # print "setting uridcodebin to paused"
        self.BusMessages = self.BusWatcher()
 
@@ -167,12 +158,6 @@ class Transcoder(gobject.GObject):
       # if height % 2:
        #    height += 1
 
-       if self.rotationvalue == 1 or self.rotationvalue == 3:
-           # print "switching height and with around"
-           nwidth = height
-           nheight = width
-           height = nheight
-           width = nwidth
 
        # print "final height " + str(height) + " final width " + str(width)
      #  return height, width, num, denom, pixelaspectratio
@@ -180,7 +165,6 @@ class Transcoder(gobject.GObject):
    def noMorePads(self, dbin):
        if (self.multipass == False) or (self.passcounter == int(0)):
            self.transcodefileoutput.set_state(gst.STATE_PAUSED)
-           self.containermuxer.set_state(gst.STATE_PAUSED)
        glib.idle_add(self.idlePlay)
        # print "No More pads received"
 
@@ -217,184 +201,20 @@ class Transcoder(gobject.GObject):
            self.pipeline.remove(self.uridecoder)
        return True
 
-   def list_compat(self, a1, b1):
-       for x1 in a1:
-           if not x1 in b1:
-               return False
-       return True
-
-   def OnDynamicPad(self, dbin, sink_pad):
-       c = sink_pad.get_caps().to_string()
+   def OnDynamicPad(self, uridecodebin, src_pad):
+       # c = src_pad.get_caps().to_string()
+       sinkpad = self.encodebin.emit("request-pad", src_pad.get_caps())
+       c = sinkpad.get_caps().to_string()
        if c.startswith("audio/"):
-           if self.stoptoggle==True:
-               bus = self.pipeline.get_bus()
-               bus.post(gst.message_new_application(self.pipeline, gst.Structure('STOP TRANSCODER')))
-               return
-           # First check for passthough mode
-           if self.audiopasstoggle is False:
-               # Check if either we are not doing multipass or if its the final pass before enabling audio
-               if (self.multipass == False) or (self.passcounter == int(0)):
-                   self.audioconverter = gst.element_factory_make("audioconvert")
-                   self.pipeline.add(self.audioconverter)
-                   self.audioencoder = gst.element_factory_make(self.AudioEncoderPlugin)
-                   self.pipeline.add(self.audioencoder)
-           
-                   self.audioresampler = gst.element_factory_make("audioresample")
-                   self.pipeline.add(self.audioresampler)
-                   sink_pad.link(self.audioconverter.get_pad("sink"))
-
-                   self.audioconverter.link(self.audioresampler)
-                   self.audioresampler.link(self.audioencoder)
-
-                   self.audioencoder.get_static_pad("src").link(self.multiqueueaudiosinkpad)
-                   self.audioconverter.set_state(gst.STATE_PAUSED)
-                   self.audioresampler.set_state(gst.STATE_PAUSED)
-                   self.audioencoder.set_state(gst.STATE_PAUSED)
-                   self.gstmultiqueue.set_state(gst.STATE_PAUSED)
-                   self.multiqueueaudiosrcpad.link(self.containermuxeraudiosinkpad)
-
-           else:
-               # This code is for handling passthrough mode. 
-               # TODO: dynamically plug correct parser. Iterate on parsers and intersect.
-               # No parser if output is framed
-               parsedcaps = gst.caps_from_string(self.audiocaps+",parsed=true")
-               framedcaps = gst.caps_from_string(self.audiocaps+",framed=true")
-               if (sink_pad.get_caps().is_subset(parsedcaps)) or (sink_pad.get_caps().is_subset(framedcaps)):
-                   sink_pad.link(self.multiqueueaudiosinkpad)
-                   self.multiqueueaudiosrcpad.link(self.containermuxeraudiosinkpad)
-                   self.gstmultiqueue.set_state(gst.STATE_PAUSED)
-               else:
-                   flist = gst.registry_get_default().get_feature_list(gst.ElementFactory)
-                   parsers = []
-                   self.aparserelement = False
-                   for fact in flist:
-                       # print "fact is " + str(fact)
-                       if self.list_compat(["Codec", "Parser","Audio"], fact.get_klass().split('/')):
-                           parsers.append(fact.get_name())
-                           for x in parsers:
-                               parser = x
-                               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"):
-                                       parseintersect = caps.intersect(gst.caps_from_string(self.audiocaps))
-                                   if parseintersect != ("EMPTY"):
-                                       self.aparserelement = parser
-                   if self.aparserelement == False:
-                                   error_message="noaudioparser"
-                                   self.emit("got-error", error_message)
-                                   self.stoptoggle=True
-                                   return  
-                   self.audioparse = gst.element_factory_make(self.aparserelement)
-                   self.pipeline.add(self.audioparse)
-
-                   # 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)
-                   self.audioparse.set_state(gst.STATE_PAUSED)
-                   self.gstmultiqueue.set_state(gst.STATE_PAUSED)
-
+          #print "c is " + str(c)
+          src_pad.link(sinkpad)
        elif c.startswith("video/"):
-           if self.stoptoggle==True:
-               bus = self.pipeline.get_bus()
-               bus.post(gst.message_new_application(self.pipeline, gst.Structure('STOP TRANSCODER')))
-               return
-           if self.videopasstoggle == False:
-               # print "Got an video cap"
-               self.colorspaceconverter = gst.element_factory_make("ffmpegcolorspace")
-               self.pipeline.add(self.colorspaceconverter)
-               # checking for deinterlacer
-               if self.interlaced == True:
-                   self.deinterlacer = gst.element_factory_make("deinterlace", "deinterlacer")
-                   self.pipeline.add(self.deinterlacer)
-               self.videoflipper = gst.element_factory_make("videoflip")
-               self.videoflipper.set_property("method", self.rotationvalue)
-               self.pipeline.add(self.videoflipper)
-
-               self.vcaps2 = gst.Caps()
-               self.vcaps2 = gst.caps_from_string(self.videocaps)
-               if self.preset != "nopreset":
-                   height, width, num, denom, pixelaspectratio = self.provide_presets()
-                   for vcap in self.vcaps2:
-                       if pixelaspectratio != gst.Fraction(0, 0):
-                           vcap["pixel-aspect-ratio"] = pixelaspectratio
-               self.vcapsfilter2 = gst.element_factory_make("capsfilter")
-               self.vcapsfilter2.set_property("caps", self.vcaps2)
-               self.pipeline.add(self.vcapsfilter2)
-
- 
-               self.videoencoder = gst.element_factory_make(self.VideoEncoderPlugin)
-               self.pipeline.add(self.videoencoder)
-
-               # check if interlaced
-               if self.interlaced:
-                   sink_pad.link(self.deinterlacer.get_pad("sink"))
-                   self.deinterlacer.link(self.videoflipper)
-                   self.videoflipper.link(self.colorspaceconverter)
-                   self.colorspaceconverter.link(self.videoencoder)
-               else:
-                   sink_pad.link(self.colorspaceconverter.get_pad("sink"))
-                   self.colorspaceconverter.link(self.videoflipper)
-                   self.videoflipper.link(self.videoencoder)
-
-               self.videoencoder.link(self.vcapsfilter2)
-               self.vcapsfilter2.get_static_pad("src").link(self.multiqueuevideosinkpad)
-
-               self.colorspaceconverter.set_state(gst.STATE_PAUSED)
-               if self.interlaced:
-                   self.deinterlacer.set_state(gst.STATE_PAUSED)
-               self.videoflipper.set_state(gst.STATE_PAUSED)  
-
-               self.vcapsfilter2.set_state(gst.STATE_PAUSED)
-               self.videoencoder.set_state(gst.STATE_PAUSED)
-               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)
-               else:
-                   flist = gst.registry_get_default().get_feature_list(gst.ElementFactory)
-                   parsers = []
-                   self.vparserelement = False
-                   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
-                               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"):
-                                       parseintersect = caps.intersect(gst.caps_from_string(self.videocaps))
-                                   if parseintersect != ("EMPTY"):
-                                       self.vparserelement = parser                               
-                   if self.vparserelement == False:
-                                   error_message="novideoparser"
-                                   self.emit("got-error", error_message)
-                                   self.stoptoggle=True
-                                   return
-
-
-                   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)
-       else:
-           raise Exception("Got a non-A/V pad!")
-           # print "Got a non-A/V pad!"
+           self.videoflipper = gst.element_factory_make("videoflip")
+           self.videoflipper.set_property("method", self.rotationvalue)
+           self.pipeline.add(self.videoflipper)
+           src_pad.link(self.videoflipper.get_static_pad("sink"))
+           self.videoflipper.get_static_pad("src").link(sinkpad)
+           self.videoflipper.set_state(gst.STATE_PAUSED)
 
    def Pipeline (self, state):
        if state == ("playing"):
diff --git a/src/transmageddon.py b/src/transmageddon.py
index 8896856..e800988 100644
--- a/src/transmageddon.py
+++ b/src/transmageddon.py
@@ -26,9 +26,6 @@ os.putenv('GST_DEBUG_DUMP_DIR_DIR', '/tmp')
 import which
 import time
 import transcoder_engine
-import transcoder_engine_preset
-import transcoder_engine_audio
-import transcoder_engine_encodebin
 import gobject; gobject.threads_init()
 from urlparse import urlparse
 import codecfinder
@@ -611,23 +608,8 @@ class TransmageddonUI:
        else:
            audiocodec = gst.Caps.to_string(self.asourcecaps)
        container = self.builder.get_object ("containerchoice").get_active_text ()
-       if self.devicename == "nopreset":
-           if self.havevideo: 
-               # non-preset transcoding with audio and video
-               self._transcoder = transcoder_engine_encodebin.Transcoder(filechoice, self.filename, self.videodirectory, container, 
-                                                       audiocodec, videocodec, self.devicename, 
-                                                       vheight, vwidth, ratenum, ratednom, achannels, 
-                                                       self.multipass, self.passcounter, self.outputfilename,
-                                                       self.timestamp, self.rotationvalue, self.audiopasstoggle, 
-                                                       self.videopasstoggle, self.interlaced)
-           else:
-               # non-preset transcoding with audio only
-               self._transcoder = transcoder_engine_audio.Transcoder(filechoice, self.filename, self.videodirectory, container, 
-                                                       audiocodec, achannels, self.outputfilename,
-                                                       self.timestamp, self.audiopasstoggle)
-       else:
-           # transcoding with preset
-           self._transcoder = transcoder_engine_preset.Transcoder(filechoice, self.filename, self.videodirectory, container, 
+       # non-preset transcoding with audio and video
+       self._transcoder = transcoder_engine.Transcoder(filechoice, self.filename, self.videodirectory, container, 
                                                        audiocodec, videocodec, self.devicename, 
                                                        vheight, vwidth, ratenum, ratednom, achannels, 
                                                        self.multipass, self.passcounter, self.outputfilename,



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