[pitivi] render: Rename cache class and clean it up



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]