[pitivi] render: Rename cache class and clean it up
- From: Alexandru Băluț <alexbalut src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi] render: Rename cache class and clean it up
- Date: Mon, 1 Aug 2016 17:08:51 +0000 (UTC)
commit c961e00326ac7db63c296b647edd6385568e6b40
Author: Alexandru Băluț <alexandru balut gmail com>
Date: Thu Jul 7 20:07:59 2016 +0200
render: Rename cache class and clean it up
Remove logic which is never reached from _can_muxer_sink_caps because
the muxer sink caps are always passed.
Reviewed-by: Thibault Saunier <tsaunier gnome org>
Differential Revision: https://phabricator.freedesktop.org/D1166
pitivi/preset.py | 9 ++--
pitivi/project.py | 9 ++--
pitivi/render.py | 114 ++++++++++++++++++++++------------------------------
3 files changed, 56 insertions(+), 76 deletions(-)
---
diff --git a/pitivi/preset.py b/pitivi/preset.py
index 0485e76..71a2aff 100644
--- a/pitivi/preset.py
+++ b/pitivi/preset.py
@@ -492,13 +492,12 @@ class RenderPresetManager(PresetManager):
acodec = parser["acodec"]
vcodec = parser["vcodec"]
- from pitivi.render import CachedEncoderList
- cached_encs = CachedEncoderList()
- if acodec not in [fact.get_name() for fact in cached_encs.aencoders]:
+ from pitivi.render import Encoders
+ if acodec not in [fact.get_name() for fact in Encoders().aencoders]:
raise DeserializeException("Audio codec not available: %s" % acodec)
- if vcodec not in [fact.get_name() for fact in cached_encs.vencoders]:
+ if vcodec not in [fact.get_name() for fact in Encoders().vencoders]:
raise DeserializeException("Video codec not available: %s" % vcodec)
- if container not in [fact.get_name() for fact in cached_encs.muxers]:
+ if container not in [fact.get_name() for fact in Encoders().muxers]:
raise DeserializeException("Container not available: %s" % vcodec)
try:
diff --git a/pitivi/project.py b/pitivi/project.py
index 27afd82..4acf539 100644
--- a/pitivi/project.py
+++ b/pitivi/project.py
@@ -35,7 +35,7 @@ from gi.repository import Gtk
from pitivi.configure import get_ui_dir
from pitivi.preset import AudioPresetManager
from pitivi.preset import VideoPresetManager
-from pitivi.render import CachedEncoderList
+from pitivi.render import Encoders
from pitivi.utils.loggable import Loggable
from pitivi.utils.misc import isWritable
from pitivi.utils.misc import path_from_uri
@@ -1141,7 +1141,6 @@ class Project(Loggable, GES.Project):
if self.scenario is not None:
return
- encoders = CachedEncoderList()
# The project just loaded, we need to check the new
# encoding profiles and make use of it now.
container_profile = self.list_encoding_profiles()[0]
@@ -1150,7 +1149,7 @@ class Project(Loggable, GES.Project):
# Project file, we just take it as our
self.container_profile = container_profile
self.muxer = self._getElementFactoryName(
- encoders.muxers, container_profile)
+ Encoders().muxers, container_profile)
if self.muxer is None:
self.muxer = DEFAULT_MUXER
for profile in container_profile.get_profiles():
@@ -1162,7 +1161,7 @@ class Project(Loggable, GES.Project):
self._ensureVideoRestrictions()
self.vencoder = self._getElementFactoryName(
- encoders.vencoders, profile)
+ Encoders().vencoders, profile)
elif isinstance(profile, GstPbutils.EncodingAudioProfile):
self.audio_profile = profile
if self.audio_profile.get_restriction() is None:
@@ -1170,7 +1169,7 @@ class Project(Loggable, GES.Project):
Gst.Caps("audio/x-raw"))
self._ensureAudioRestrictions()
self.aencoder = self._getElementFactoryName(
- encoders.aencoders, profile)
+ Encoders().aencoders, profile)
else:
self.warning("We do not handle profile: %s", profile)
diff --git a/pitivi/render.py b/pitivi/render.py
index 9170915..603a731 100644
--- a/pitivi/render.py
+++ b/pitivi/render.py
@@ -44,21 +44,21 @@ from pitivi.utils.ui import set_combo_value
from pitivi.utils.widgets import GstElementSettingsDialog
-class CachedEncoderList(object):
- """Registry of avalaible Muxers, Audio encoders and Video Encoders.
+class Encoders(object):
+ """Registry of avalaible Muxers, Audio encoders and Video encoders.
Also keeps the avalaible combinations of those.
- It is a singleton.
+ It is a singleton. Use `Encoders()` to access the instance.
Attributes:
+ muxers (List[Gst.ElementFactory]): The avalaible muxers.
aencoders (List[Gst.ElementFactory]): The avalaible audio encoders.
vencoders (List[Gst.ElementFactory]): The avalaible video encoders.
- muxers (List[Gst.ElementFactory]): The avalaible muxers.
- audio_combination (dict): Maps each muxer name to a list of compatible
- audio encoders ordered by rank.
- video_combination (dict): Maps each muxer name to a list of compatible
- video encoders ordered by rank.
+ compatible_audio_encoders (dict): Maps each muxer name to a list of
+ compatible audio encoders ordered by rank.
+ compatible_video_encoders (dict): Maps each muxer name to a list of
+ compatible video encoders ordered by rank.
"""
_instance = None
@@ -66,15 +66,14 @@ class CachedEncoderList(object):
def __new__(cls, *args, **kwargs):
"""Returns the singleton instance."""
if not cls._instance:
- cls._instance = super(
- CachedEncoderList, cls).__new__(cls, *args, **kwargs)
+ cls._instance = super(Encoders, cls).__new__(cls, *args, **kwargs)
Gst.Registry.get().connect(
- "feature-added", cls._instance._registryFeatureAddedCb)
- cls._instance._buildEncoders()
- cls._instance._buildCombinations()
+ "feature-added", cls._instance._registry_feature_added_cb)
+ cls._instance._load_encoders()
+ cls._instance._load_combinations()
return cls._instance
- def _buildEncoders(self):
+ def _load_encoders(self):
self.aencoders = []
self.vencoders = []
self.muxers = Gst.ElementFactory.list_get_elements(
@@ -89,65 +88,49 @@ class CachedEncoderList(object):
elif "Audio" in klist:
self.aencoders.append(fact)
- def _buildCombinations(self):
- self.audio_combination = {}
- self.video_combination = {}
- useless_muxers = set([])
+ def _load_combinations(self):
+ self.compatible_audio_encoders = {}
+ self.compatible_video_encoders = {}
+ useless_muxers = set()
for muxer in self.muxers:
- mux = muxer.get_name()
- aencs = self._findCompatibleEncoders(self.aencoders, muxer)
- vencs = self._findCompatibleEncoders(self.vencoders, muxer)
- # only include muxers with audio and video
-
- if aencs and vencs:
- self.audio_combination[mux] = sorted(
- aencs, key=lambda x: - x.get_rank())
- self.video_combination[mux] = sorted(
- vencs, key=lambda x: - x.get_rank())
- else:
+ aencs = self._find_compatible_encoders(self.aencoders, muxer)
+ vencs = self._find_compatible_encoders(self.vencoders, muxer)
+ if not aencs or not vencs:
+ # The muxer is not compatible with no video encoder or
+ # with no audio encoder.
useless_muxers.add(muxer)
+ continue
+
+ muxer_name = muxer.get_name()
+ self.compatible_audio_encoders[muxer_name] = aencs
+ self.compatible_video_encoders[muxer_name] = vencs
for muxer in useless_muxers:
self.muxers.remove(muxer)
- def _findCompatibleEncoders(self, encoders, muxer, muxsinkcaps=[]):
+ def _find_compatible_encoders(self, encoders, muxer):
"""Returns the list of encoders compatible with the specified muxer."""
res = []
- if muxsinkcaps == []:
- muxsinkcaps = [x.get_caps() for x in muxer.get_static_pad_templates()
- if x.direction == Gst.PadDirection.SINK]
+ sink_caps = [template.get_caps()
+ for template in muxer.get_static_pad_templates()
+ if template.direction == Gst.PadDirection.SINK]
for encoder in encoders:
- for tpl in encoder.get_static_pad_templates():
- if tpl.direction == Gst.PadDirection.SRC:
- if self._canSinkCaps(muxer, tpl.get_caps(), muxsinkcaps):
- res.append(encoder)
- break
- return res
-
- def _canSinkCaps(self, muxer, ocaps, muxsinkcaps=[]):
- """Checks whether the muxer's receptors match the specified caps.
-
- Args:
- ocaps (Gst.Caps): The output caps to match.
+ for template in encoder.get_static_pad_templates():
+ if not template.direction == Gst.PadDirection.SRC:
+ continue
+ if self._can_muxer_sink_caps(template.get_caps(), sink_caps):
+ res.append(encoder)
+ break
+ return sorted(res, key=lambda encoder: - encoder.get_rank())
- Returns:
- bool: True if any of the muxer's sink pad templates's caps intersect
- the specified output caps.
- """
- # fast version
- if muxsinkcaps != []:
- for c in muxsinkcaps:
- if not c.intersect(ocaps).is_empty():
- return True
- return False
- # slower default
- for x in muxer.get_static_pad_templates():
- if x.direction == Gst.PadDirection.SINK:
- if not x.get_caps().intersect(ocaps).is_empty():
- return True
+ def _can_muxer_sink_caps(self, output_caps, sink_caps):
+ """Checks whether the specified caps match the muxer's receptors."""
+ for caps in sink_caps:
+ if not caps.intersect(output_caps).is_empty():
+ return True
return False
- def _registryFeatureAddedCb(self, registry, feature):
+ def _registry_feature_added_cb(self, registry, feature):
# TODO Check what feature has been added and update our lists
pass
@@ -528,7 +511,7 @@ class RenderDialog(Loggable):
self.frame_rate_combo.set_model(frame_rates)
self.channels_combo.set_model(audio_channels)
self.sample_rate_combo.set_model(audio_rates)
- self.muxercombobox.set_model(factorylist(CachedEncoderList().muxers))
+ self.muxercombobox.set_model(factorylist(Encoders().muxers))
def _displaySettings(self):
"""Displays the settings also in the ProjectSettingsDialog."""
@@ -607,13 +590,12 @@ class RenderDialog(Loggable):
def updateAvailableEncoders(self):
"""Updates the encoder comboboxes to show the available encoders."""
- encoders = CachedEncoderList()
vencoder_model = factorylist(
- encoders.video_combination[self.project.muxer])
+ Encoders().compatible_video_encoders[self.project.muxer])
self.video_encoder_combo.set_model(vencoder_model)
aencoder_model = factorylist(
- encoders.audio_combination[self.project.muxer])
+ Encoders().compatible_audio_encoders[self.project.muxer])
self.audio_encoder_combo.set_model(aencoder_model)
self._updateEncoderCombo(
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]