[transmageddon] Much improved codecfinder, no more string comparisons
- From: Christian Fredrik Kalager Schaller <uraeus src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [transmageddon] Much improved codecfinder, no more string comparisons
- Date: Sat, 12 Sep 2009 16:56:33 +0000 (UTC)
commit e71a66ff0f80453f30952878acdeb69e7e9b8bae
Author: Christian Schaller <christian schaller collabora co uk>
Date: Sat Sep 12 17:57:33 2009 +0100
Much improved codecfinder, no more string comparisons
src/codecfinder.py | 106 ++++++++++++++++++----------------------------------
1 files changed, 36 insertions(+), 70 deletions(-)
---
diff --git a/src/codecfinder.py b/src/codecfinder.py
index 3deb15e..2ea472b 100644
--- a/src/codecfinder.py
+++ b/src/codecfinder.py
@@ -63,40 +63,32 @@ def get_muxer_element(containercaps):
to element names. Then return elementname
"""
- muxerchoice = {}
- blacklist = ['rate','packetsize','systemstream','parsed']
flist = gst.registry_get_default().get_feature_list(gst.ElementFactory)
muxers = []
features = []
+ elementname = False
for fact in flist:
- # FIXME: the and not part of this line should be removed, but it has to stay in until Ranks have
+ # FIXME: the 'and not' part of this line should be removed, but it has to stay in until Ranks have
# been set on most muxers in GStreamer. If removed now we get lots of failures due to ending up
# with broken muxers
if list_compat(["Codec", "Muxer"], fact.get_klass().split('/')) and not fact.get_name().startswith('ffmux'):
muxers.append(fact.get_name())
features.append(fact)
muxerfeature = dict(zip(muxers, features))
+ incomingcaps = gst.caps_from_string(containercaps)
for x in muxers:
- muxer=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]
- for caps in sinkcaps:
- result = caps[0].get_name()
- for attr in caps[0].keys():
- if attr not in blacklist:
- result += ","+attr+"="+str(caps[0][attr])
- if muxerchoice.has_key(result):
- mostrecent = gst.PluginFeature.get_rank(muxerfeature[muxer])
- original = gst.PluginFeature.get_rank(muxerfeature[muxerchoice[result]])
- if mostrecent >= original:
- muxerchoice[result] = muxer
- else:
- muxerchoice[result] = muxer
- if muxerchoice.has_key(containercaps):
- elementname = muxerchoice[containercaps]
- else:
- print "failed to find muxer element"
- elementname = False
+ element = 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]
+ for caps in sinkcaps:
+ if caps.intersect(incomingcaps):
+ if elementname == False:
+ elementname = element
+ else:
+ mostrecent = gst.PluginFeature.get_rank(muxerfeature[element])
+ original = gst.PluginFeature.get_rank(muxerfeature[elementname])
+ if mostrecent >= original:
+ elementname = element
return elementname
######
@@ -113,13 +105,10 @@ def get_audio_encoder_element(audioencodercaps):
will return False.
"""
- audiocoderchoice = {}
- # blacklist all caps information we do not need to create a unique identifier
- blacklist = ['rate','channels','bitrate','block_align','mode','subbands'
- ,'allocation','framed','bitpool','blocks','width']
flist = gst.registry_get_default().get_feature_list(gst.ElementFactory)
encoders = []
features = []
+ elementname = False
for fact in flist:
if list_compat(["Codec", "Encoder", "Audio"], fact.get_klass().split('/')):
# excluding wavpackenc as the fact that it got two SRC pads mess up the logic of this code
@@ -127,30 +116,20 @@ def get_audio_encoder_element(audioencodercaps):
encoders.append(fact.get_name())
features.append(fact)
encoderfeature = dict(zip(encoders, features))
+ incomingcaps = gst.caps_from_string(audioencodercaps)
for x in encoders:
- codec = x
+ element = 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]
- result = ""
for caps in sinkcaps:
- structure = gst.Structure(caps[0].get_name())
- for k in caps[0].keys():
- if k not in blacklist:
- structure[k] = caps[0][k]
- result += structure.to_string()[:-1]
- # print "audio result is " + str(result)
- if audiocoderchoice.has_key(result):
- mostrecent = gst.PluginFeature.get_rank(encoderfeature[codec])
- original = gst.PluginFeature.get_rank(encoderfeature[audiocoderchoice[result]])
- if mostrecent >= original:
- audiocoderchoice[result] = codec
- else:
- audiocoderchoice[result] = codec
-
- if audiocoderchoice.has_key(audioencodercaps):
- elementname = audiocoderchoice[audioencodercaps]
- else:
- elementname = False
+ if caps.intersect(incomingcaps):
+ if elementname == False:
+ elementname = element
+ else:
+ mostrecent = gst.PluginFeature.get_rank(encoderfeature[element])
+ original = gst.PluginFeature.get_rank(encoderfeature[elementname])
+ if mostrecent >= original:
+ elementname = element
return elementname
#######
@@ -168,14 +147,11 @@ def get_video_encoder_element(videoencodercaps):
will return False.
"""
- videocoderchoice = {}
- # blacklist all caps information we do not need to create a unique identifier
- blacklist = ['height','width','framerate','systemstream','depth']
flist = gst.registry_get_default().get_feature_list(gst.ElementFactory)
encoders = []
features = []
+ elementname = False
for fact in flist:
- # print "fact is " + str(fact)
if list_compat(["Codec", "Encoder", "Video"], fact.get_klass().split('/')):
encoders.append(fact.get_name())
features.append(fact)
@@ -183,29 +159,19 @@ def get_video_encoder_element(videoencodercaps):
encoders.append(fact.get_name())
features.append(fact)
encoderfeature = dict(zip(encoders, features))
- # print encoderfeature
+ incomingcaps = gst.caps_from_string(videoencodercaps)
for x in encoders:
element = 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]
for caps in sinkcaps:
- result = caps[0].get_name();
- for attr in caps[0].keys():
- if attr not in blacklist:
- result += ","+attr+"="+str(caps[0][attr])
- if videocoderchoice.has_key(result):
- mostrecent = gst.PluginFeature.get_rank(encoderfeature[element])
- original = gst.PluginFeature.get_rank(encoderfeature[videocoderchoice[result]])
- if mostrecent >= original:
- videocoderchoice[result] = element
- else:
- videocoderchoice[result] = element
-
- videocoderchoice["video/x-divx,divxversion=5"] = "ffenc_mpeg4"
- if videocoderchoice.has_key(videoencodercaps):
- elementname = videocoderchoice[videoencodercaps]
- else:
- print "Failed to find video encoder element"
- elementname = False
+ if caps.intersect(incomingcaps):
+ if elementname == False:
+ elementname = element
+ else:
+ mostrecent = gst.PluginFeature.get_rank(encoderfeature[element])
+ original = gst.PluginFeature.get_rank(encoderfeature[elementname])
+ if mostrecent >= original:
+ elementname = element
return elementname
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]