[transmageddon] First stab at deinterlacing support
- From: Christian Fredrik Kalager Schaller <uraeus src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [transmageddon] First stab at deinterlacing support
- Date: Tue, 12 Jan 2010 21:27:29 +0000 (UTC)
commit bc7d8ef4783f877d0747bd1962e2854def7733f2
Author: Christian Schaller <christian schaller collabora co uk>
Date: Tue Jan 12 21:26:49 2010 +0000
First stab at deinterlacing support
src/transcoder_engine.py | 56 ++++++++++++++++++++++++++++++++--------------
src/transmageddon.py | 2 +-
2 files changed, 40 insertions(+), 18 deletions(-)
---
diff --git a/src/transcoder_engine.py b/src/transcoder_engine.py
index 3066025..4842fba 100644
--- a/src/transcoder_engine.py
+++ b/src/transcoder_engine.py
@@ -40,7 +40,7 @@ class Transcoder(gobject.GObject):
'got-error' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))
}
- def __init__(self, FILECHOSEN, FILENAME, DESTDIR, CONTAINERCHOICE, AUDIOCODECVALUE, VIDEOCODECVALUE, PRESET,
+ def __init__(self, FILECHOSEN, FILENAME, DESTDIR, CONTAINERCHOICE, AUDIOCODECVALUE, VIDEOCODECVALUE, VSRCCAPS, PRESET,
OHEIGHT, OWIDTH, FRATENUM, FRATEDEN, ACHANNELS, MULTIPASS, PASSCOUNTER, OUTPUTNAME,
TIMESTAMP, ROTATIONVALUE, AUDIOPASSTOGGLE, VIDEOPASSTOGGLE):
gobject.GObject.__init__(self)
@@ -54,6 +54,7 @@ class Transcoder(gobject.GObject):
self.stoptoggle=False
self.audiocaps = AUDIOCODECVALUE
self.videocaps = VIDEOCODECVALUE
+ self.vsrccaps = VSRCCAPS
self.audiopasstoggle = AUDIOPASSTOGGLE
# print "audiopass toggle is " + str(self.audiopasstoggle)
self.videopasstoggle = VIDEOPASSTOGGLE
@@ -73,7 +74,6 @@ class Transcoder(gobject.GObject):
self.fratenum = FRATENUM
self.frateden = FRATEDEN
self.achannels = ACHANNELS
- print "transcoder_engine achannels is " + str(self.achannels)
self.blackborderflag = False
self.multipass = MULTIPASS
self.passcounter = PASSCOUNTER
@@ -320,8 +320,8 @@ class Transcoder(gobject.GObject):
return False
return True
- def OnDynamicPad(self, dbin, sink_pad):
- c = sink_pad.get_caps().to_string()
+ def OnDynamicPad(self, dbin, src_pad):
+ c = src_pad.get_caps().to_string()
if c.startswith("audio/"):
if self.stoptoggle==True:
bus = self.pipeline.get_bus()
@@ -343,7 +343,7 @@ class Transcoder(gobject.GObject):
self.audioencoder.load_preset(x)
self.audioresampler = gst.element_factory_make("audioresample")
self.pipeline.add(self.audioresampler)
- sink_pad.link(self.audioconverter.get_pad("sink"))
+ src_pad.link(self.audioconverter.get_pad("sink"))
# Check if we are using a preset
if self.preset != "nopreset":
@@ -379,8 +379,8 @@ class Transcoder(gobject.GObject):
# 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)
+ if (src_pad.get_caps().is_subset(parsedcaps)) or (src_pad.get_caps().is_subset(framedcaps)):
+ src_pad.link(self.multiqueueaudiosinkpad)
self.multiqueueaudiosrcpad.link(self.containermuxeraudiosinkpad)
self.gstmultiqueue.set_state(gst.STATE_PAUSED)
else:
@@ -410,7 +410,7 @@ class Transcoder(gobject.GObject):
self.pipeline.add(self.audioparse)
# print "audiopad " + str(self.multiqueueaudiosinkpad)
- sink_pad.link(self.audioparse.get_static_pad("sink"))
+ src_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)
@@ -422,6 +422,15 @@ class Transcoder(gobject.GObject):
bus.post(gst.message_new_application(self.pipeline, gst.Structure('STOP TRANSCODER')))
return
if self.videopasstoggle == False:
+ # check for interlaced media and create deinterlace element if needed
+ if self.vsrccaps[0]['interlaced']:
+ print "content is interlaced"
+ self.deinterlacer = gst.element_factory_make("deinterlace", "deinterlace")
+ self.pipeline.add(self.deinterlacer)
+
+ self.colorspaceconverter2 = gst.element_factory_make("ffmpegcolorspace")
+ self.pipeline.add(self.colorspaceconverter2)
+
# print "Got an video cap"
self.colorspaceconverter = gst.element_factory_make("ffmpegcolorspace")
self.pipeline.add(self.colorspaceconverter)
@@ -490,11 +499,16 @@ class Transcoder(gobject.GObject):
elif (self.multipass != False) and (self.passcounter == int(0)):
self.videoencoder.load_preset("Pass " + str(self.multipass))
self.videoencoder.set_property("multipass-cache-file", self.cachefile)
-
- # needs to be moved to before multiqueu ? if (self.multipass == False) or (self.passcounter == int(0)):
- sink_pad.link(self.colorspaceconverter.get_pad("sink"))
+
+ src_pad.link(self.colorspaceconverter.get_pad("sink"))
if self.preset != "nopreset":
- self.colorspaceconverter.link(self.videoflipper)
+ if self.vsrccaps[0]['interlaced']:
+ print "content is interlaced final"
+ self.colorspaceconverter.link(self.deinterlacer)
+ self.deinterlacer.link(self.colorspaceconverter2)
+ self.colorspaceconverter2.link(self.videoflipper)
+ else:
+ self.colorspaceconverter.link(self.videoflipper)
self.videoflipper.link(self.videorate)
self.videorate.link(self.videoscaler)
self.videoscaler.link(self.vcapsfilter)
@@ -506,7 +520,13 @@ class Transcoder(gobject.GObject):
self.vcapsfilter.link(self.colorspaceconvert2)
self.colorspaceconvert2.link(self.videoencoder)
else:
- self.colorspaceconverter.link(self.videoflipper)
+ if self.vsrccaps[0]['interlaced']:
+ print "content is interlaced final"
+ self.colorspaceconverter.link(self.deinterlacer)
+ self.deinterlacer.link(self.colorspaceconverter2)
+ self.colorspaceconverter2.link(self.videoflipper)
+ else:
+ self.colorspaceconverter.link(self.videoflipper)
self.videoflipper.link(self.videoencoder)
self.videoencoder.link(self.vcapsfilter2)
if (self.multipass == False) or (self.passcounter == int(0)):
@@ -514,7 +534,9 @@ class Transcoder(gobject.GObject):
else:
self.vcapsfilter2.link(self.multipassfakesink)
self.colorspaceconverter.set_state(gst.STATE_PAUSED)
- self.videoflipper.set_state(gst.STATE_PAUSED)
+ self.videoflipper.set_state(gst.STATE_PAUSED)
+ self.deinterlacer.set_state(gst.STATE_PAUSED)
+ self.colorspaceconverter2.set_state(gst.STATE_PAUSED)
if self.preset != "nopreset":
self.videoscaler.set_state(gst.STATE_PAUSED)
self.videorate.set_state(gst.STATE_PAUSED)
@@ -534,8 +556,8 @@ class Transcoder(gobject.GObject):
# 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)
+ if (src_pad.get_caps().is_subset(vparsedcaps)) or (src_pad.get_caps().is_subset(vframedcaps)):
+ src_pad.link(self.multiqueuevideosinkpad)
self.multiqueuevideosrcpad.link(self.containermuxervideosinkpad)
self.gstmultiqueue.set_state(gst.STATE_PAUSED)
else:
@@ -566,7 +588,7 @@ class Transcoder(gobject.GObject):
self.videoparse = gst.element_factory_make(self.vparserelement)
self.pipeline.add(self.videoparse)
- sink_pad.link(self.videoparse.get_static_pad("sink"))
+ src_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)
diff --git a/src/transmageddon.py b/src/transmageddon.py
index 59bef5b..9937573 100644
--- a/src/transmageddon.py
+++ b/src/transmageddon.py
@@ -507,7 +507,7 @@ class TransmageddonUI:
audiocodec = gst.Caps.to_string(self.asourcecaps)
container = self.builder.get_object ("containerchoice").get_active_text ()
self._transcoder = transcoder_engine.Transcoder(filechoice, self.filename, self.videodirectory, container,
- audiocodec, videocodec, self.devicename,
+ audiocodec, videocodec, self.vsourcecaps, self.devicename,
vheight, vwidth, ratenum, ratednom, achannels,
self.multipass, self.passcounter, self.outputfilename,
self.timestamp, self.rotationvalue, self.audiopasstoggle, self.videopasstoggle)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]