[transmageddon] Remove all engines expect encodebin one, yay!
- From: Christian Fredrik Kalager Schaller <uraeus src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [transmageddon] Remove all engines expect encodebin one, yay!
- Date: Sun, 27 Feb 2011 15:30:13 +0000 (UTC)
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]