[transmageddon] Add video only encoding, also add a proper license header to which.py
- From: Christian Fredrik Kalager Schaller <uraeus src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [transmageddon] Add video only encoding, also add a proper license header to which.py
- Date: Tue, 31 May 2011 08:56:38 +0000 (UTC)
commit e58e86a94adc877af7a3134fc0c695c91977e1e8
Author: Christian Fredrik Kalager Schaller <christian schaller collabora co uk>
Date: Tue May 31 09:56:01 2011 +0100
Add video only encoding, also add a proper license header to which.py
NEWS | 7 ++-
TODO | 4 +-
src/transcoder_engine.py | 22 +++++------
src/transmageddon.py | 92 ++++++++++++++++++++++++++++++----------------
src/which.py | 23 +++++++++++
5 files changed, 100 insertions(+), 48 deletions(-)
---
diff --git a/NEWS b/NEWS
index 0d60fff..f61b195 100644
--- a/NEWS
+++ b/NEWS
@@ -1,9 +1,12 @@
0.17
- Port to new plugins-base discoverer
+ Port to new plugins-base discoverer and encodebin
Replace radiobutton lists with a combobox instead
add support for audio only transcoding
add support for outputting audio only from video+audio files
-
+ Add deinterlacing
+ Support container free audio formats such as FLAC, mp3 and AAC
+ Add HTML5 and Nokia 9000 profile
+ add support for video only transcoding
0.16 - 21-05-2010
Add WebM support
diff --git a/TODO b/TODO
index 57dc072..9384436 100644
--- a/TODO
+++ b/TODO
@@ -52,9 +52,9 @@ This list is completely unordered. Nothing about the ordering in this list shoul
turn up in directory
iii) start transcode once dvb-daemon says recording is done
-* Add black borders based on aspect-ratio
-
* AVC HD support.
Variation of MPEG TS with H264 and AC3 audio
* Support multiple audio tracks. Probably want to wait for new discoverer for that.
+
+* Batch transcoding - multiple files 'programmed up front'
diff --git a/src/transcoder_engine.py b/src/transcoder_engine.py
index c57e6d7..d61f0e9 100644
--- a/src/transcoder_engine.py
+++ b/src/transcoder_engine.py
@@ -47,7 +47,7 @@ class Transcoder(gobject.GObject):
# Choose plugin based on Container name
self.container = CONTAINERCHOICE
- self.audiocaps = gst.Caps(AUDIOCODECVALUE)
+ self.audiocaps = AUDIOCODECVALUE
if self.container != False:
self.containercaps = gst.Caps(codecfinder.containermap[CONTAINERCHOICE])
# special case mp3 which is a no-container format with a container (id3mux)
@@ -99,11 +99,6 @@ class Transcoder(gobject.GObject):
# gather preset data if relevant
if self.preset != "nopreset":
height, width, num, denom, pixelaspectratio = self.provide_presets()
- print "height is " + str(height)
- print "width is " + str(width)
- print "num is " + str(num)
- print "denom is " + str(denom)
- print "pixelaspect is " + str(pixelaspectratio)
for acap in self.audiocaps:
acap["channels"] = self.channels
for vcap in self.videocaps:
@@ -126,6 +121,7 @@ class Transcoder(gobject.GObject):
# first check if we have a container format, if not set up output for possible outputs
print "self.container is " + str(self.container)
+ print "self.container caps is " + str(self.containercaps)
if self.container==False:
if self.audiocaps.intersect(gst.Caps("audio/mpeg, mpegversion=4")):
self.audiocaps=gst.Caps("audio/mpeg, mpegversion=4, stream-format=adts")
@@ -134,12 +130,14 @@ class Transcoder(gobject.GObject):
else:
print "self.containercaps are " + str(self.containercaps)
self.encodebinprofile = gst.pbutils.EncodingContainerProfile ("containerformat", None , self.containercaps, None)
- if self.container==False:
- self.encodebinprofile = gst.pbutils.EncodingAudioProfile (self.audiocaps, None, gst.caps_new_any(), 0)
- else:
- print "audiocaps used to create encodebin is " + str(self.audiocaps)
- self.audioprofile = gst.pbutils.EncodingAudioProfile (self.audiocaps, None, gst.caps_new_any(), 0)
- self.encodebinprofile.add_profile(self.audioprofile)
+ print "audiocaps without audio is " + str(self.audiocaps)
+ if self.audiocaps != False:
+ if self.container==False:
+ self.encodebinprofile = gst.pbutils.EncodingAudioProfile (self.audiocaps, None, gst.caps_new_any(), 0)
+ else:
+ print "audiocaps used to create encodebin is " + str(self.audiocaps)
+ self.audioprofile = gst.pbutils.EncodingAudioProfile (self.audiocaps, None, gst.caps_new_any(), 0)
+ self.encodebinprofile.add_profile(self.audioprofile)
if self.videocaps != "novid":
if (self.videocaps != False):
print "videcaps used to create encodebin is " + str(gst.Caps(self.videocaps))
diff --git a/src/transmageddon.py b/src/transmageddon.py
index bd1ac0a..f42273e 100644
--- a/src/transmageddon.py
+++ b/src/transmageddon.py
@@ -161,6 +161,9 @@ class TransmageddonUI:
self.videorows=[]
self.audiocodecs=[] # create lists to store the ordered lists of codecs
self.videocodecs=[]
+
+
+ # these dynamic comboboxes allow us to support files with multiple streams eventually
def dynamic_comboboxes_audio(streams,extra = []):
streams=1 # this will become a variable once we support multiple streams
vbox = gtk.VBox()
@@ -533,6 +536,9 @@ class TransmageddonUI:
self.audiocodec.set_markup(''.join(('<small>','Audio codec: ', \
str(gst.pbutils.get_codec_description(inputaudiocaps)), \
'</small>')))
+ if self.haveaudio==False:
+ self.audioinformation.set_markup(''.join(('<small>', "No Audio", '</small>')))
+ self.audiocodec.set_markup(''.join(('<small>', "",'</small>')))
if isinstance(i, gst.pbutils.DiscovererVideoInfo):
self.inputvideocaps=i.get_caps()
@@ -603,10 +609,11 @@ class TransmageddonUI:
videointersect = sourcecaps.intersect(self.videodata['videotype'])
if videointersect != ("EMPTY"):
self.vsourcecaps = videointersect
- if audiointersect == ("EMPTY"):
- audiointersect = sourcecaps.intersect(self.audiodata['audiotype'])
- if audiointersect != ("EMPTY"):
- self.asourcecaps = audiointersect
+ if self.haveaudio == True:
+ if audiointersect == ("EMPTY"):
+ audiointersect = sourcecaps.intersect(self.audiodata['audiotype'])
+ if audiointersect != ("EMPTY"):
+ self.asourcecaps = audiointersect
if videointersect != ("EMPTY"):
self.videopass=True
else:
@@ -655,13 +662,16 @@ class TransmageddonUI:
vwidth=False
ratenum=False
ratednom=False
- achannels = self.audiodata['audiochannels']
- if self.audiopasstoggle == False:
-
- audiocodec = self.AudioCodec
+ if self.haveaudio:
+ achannels = self.audiodata['audiochannels']
+ if self.audiopasstoggle == False:
+ audiocodec = self.AudioCodec
+ else:
+ audiocodec = gst.Caps.to_string(self.asourcecaps)
else:
- audiocodec = gst.Caps.to_string(self.asourcecaps)
- # non-preset transcoding with audio and video
+ print "realizing there is no audio before starting transcoding"
+ audiocodec=False
+ achannels=False
self._transcoder = transcoder_engine.Transcoder(filechoice, self.filename, self.videodirectory, self.container,
audiocodec, videocodec, self.devicename,
vheight, vwidth, ratenum, ratednom, achannels,
@@ -726,9 +736,11 @@ class TransmageddonUI:
videostatus = codecfinder.get_video_encoder_element(self.VideoCodec)
else:
videostatus=True
-
- if self.audiopasstoggle != True:
- audiostatus = codecfinder.get_audio_encoder_element(self.AudioCodec)
+ if self.haveaudio:
+ if self.audiopasstoggle != True:
+ audiostatus = codecfinder.get_audio_encoder_element(self.AudioCodec)
+ else:
+ audiostatus=True
else:
audiostatus=True
if self.havevideo == False: # this flags help check if input is audio-only file
@@ -780,17 +792,30 @@ class TransmageddonUI:
self.outputfilename = str(self.nosuffix+self.timestamp+self.ContainerFormatSuffix)
context_id = self.StatusBar.get_context_id("EOS")
self.StatusBar.push(context_id, (_("Writing %(filename)s") % {'filename': self.outputfilename}))
+ print "basic setup done for transcodebutton"
if self.multipass == False:
self.ProgressBar.set_text(_("Transcoding Progress"))
else:
self.passcounter=int(1)
self.ProgressBar.set_text(_("Pass %(count)d Progress") % {'count': self.passcounter})
- if self.audiodata.has_key("samplerate"):
- self.check_for_elements()
- if self.missingtoggle==False:
- self._start_transcoding()
- else:
- self.waiting_for_signal="True"
+ print "self.haveaudio is " +str(self.haveaudio)
+ print "self.havevideo is " +str(self.havevideo)
+ if self.haveaudio:
+ if self.audiodata.has_key("samplerate"):
+ self.check_for_elements()
+ if self.missingtoggle==False:
+ print "reaching start transcoding with audio"
+ self._start_transcoding()
+ else:
+ self.waiting_for_signal="True"
+ elif self.havevideo:
+ if self.videodata.has_key("videoheight"):
+ self.check_for_elements()
+ if self.missingtoggle==False:
+ print "reaching start transcoding with video"
+ self._start_transcoding()
+ else:
+ self.waiting_for_signal="True"
def on_cancelbutton_clicked(self, widget):
self.FileChooser.set_sensitive(True)
@@ -830,21 +855,23 @@ class TransmageddonUI:
# end of housecleaning
# start filling audio
-
- if self.usingpreset==True: # First fill menu based on presetvalue
- print "adding preset value to audiomenu and setting it active"
- self.audiorows[0].append_text(str(gst.pbutils.get_codec_description(self.presetaudiocodec)))
- self.audiorows[0].set_active(0)
- self.audiocodecs.append(self.presetaudiocodec)
- else:
- audio_codecs = []
- audio_codecs = supported_audio_container_map[self.container]
- for c in audio_codecs:
- self.audiocodecs.append(gst.Caps(codecfinder.codecmap[c]))
- for c in audio_codecs:
- self.audiorows[0].append_text(c)
+ if self.haveaudio==True:
+ if self.usingpreset==True: # First fill menu based on presetvalue
+ self.audiorows[0].append_text(str(gst.pbutils.get_codec_description(self.presetaudiocodec)))
+ self.audiorows[0].set_active(0)
+ self.audiocodecs.append(self.presetaudiocodec)
+ else:
+ audio_codecs = []
+ audio_codecs = supported_audio_container_map[self.container]
+ for c in audio_codecs:
+ self.audiocodecs.append(gst.Caps(codecfinder.codecmap[c]))
+ for c in audio_codecs:
+ self.audiorows[0].append_text(c)
self.audiorows[0].set_sensitive(True)
self.audiorows[0].set_active(0)
+ else:
+ self.audiorows[0].set_sensitive(False)
+
# fill in with video
if self.havevideo==True:
if self.container != False:
@@ -890,6 +917,7 @@ class TransmageddonUI:
self.ProgressBar.set_text(_("Transcoding Progress"))
if self.builder.get_object("containerchoice").get_active()!= -1:
self.container = self.builder.get_object ("containerchoice").get_active_text ()
+ print "self.container is " + str(self.container)
if self.builder.get_object("containerchoice").get_active()!= -1:
print "checking for discover done"
print "discover done is " + str(self.discover_done)
diff --git a/src/which.py b/src/which.py
index 32b9ca7..64de60d 100644
--- a/src/which.py
+++ b/src/which.py
@@ -3,8 +3,31 @@
# See LICENSE.txt for license details.
# Author:
# Trent Mick (TrentM ActiveState com)
+#
# Home:
# http://trentm.com/projects/which/
+# http://code.google.com/p/which/
+#
+# Copyright (c) 2002-2005 ActiveState Corp.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
r"""Find the full path to commands.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]