Author: dmeyer
Date: Fri Dec 22 14:14:28 2006
New Revision: 2276

Added:
   trunk/popcorn/src/backends/xine/filter.py
Modified:
   trunk/popcorn/src/backends/xine/child.py
   trunk/popcorn/src/backends/xine/player.py

Log:
make filter chain more dynamic

Modified: trunk/popcorn/src/backends/xine/child.py
==============================================================================
--- trunk/popcorn/src/backends/xine/child.py    (original)
+++ trunk/popcorn/src/backends/xine/child.py    Fri Dec 22 14:14:28 2006
@@ -40,6 +40,8 @@
 from kaa.popcorn.utils import Player
 from kaa.popcorn.ptypes import *
 
+from filter import FilterChain
+
 # get and configure logging object
 log = logging.getLogger('xine')
 log.setLevel(logging.DEBUG)
@@ -211,10 +213,6 @@
             self._stream.get_audio_source().wire(self._ao)
         
     
-    def _wire_vo_driver(self, vo):
-        if self._stream:
-            
self._stream.get_video_source().wire(self._deint_post.get_default_input())
-
     # 
#############################################################################
     # Commands from parent process
     # 
#############################################################################
@@ -260,20 +258,21 @@
             self._driver_control = None
             self._vo_visible = False
 
-        self._expand_post = self._xine.post_init("expand", video_targets = 
[self._vo])
-        if aspect:
-            self._expand_post.set_parameters(aspect=aspect)
+        # setup filter chain and configure filter
+        self._vfilter = FilterChain()
 
-        self._deint_post = self._xine.post_init("tvtime", video_targets = 
[self._expand_post.get_default_input()])
-        self._deint_post.set_parameters(method = 
self.config.xine.deinterlacer.method,
-                                        chroma_filter = 
self.config.xine.deinterlacer.chroma_filter)
+        f = self._vfilter.get("tvtime")
+        f.set_parameters(method = self.config.xine.deinterlacer.method,
+                         chroma_filter = 
self.config.xine.deinterlacer.chroma_filter)
+
+        f = self._vfilter.get("expand")
+        if aspect:
+            f.set_parameters(aspect=aspect)
+        f.set_parameters(enable_automatic_shift = True)
 
-        self._expand_post.set_parameters(enable_automatic_shift = True)
         if self._driver_control:
             self._driver_control("set_passthrough", False)
 
-        self._wire_vo_driver(self._vo)
-
 
     def configure_audio(self, driver):
         """
@@ -310,7 +309,7 @@
         self._wire_ao_driver(self._ao)
 
 
-    def configure_stream(self):
+    def configure_stream(self, properties):
         """
         Basic stream setup.
         """
@@ -322,7 +321,17 @@
         # self._noise_post.set_parameters(luma_strength = 3, quality = 
"temporal")
         # 
self._stream.get_video_source().wire(self._noise_post.get_default_input())
 
-        
self._stream.get_video_source().wire(self._deint_post.get_default_input())
+        if not self._vo:
+            return
+
+        # wire video stream with needed filter
+        chain = []
+        if properties.get('deinterlace'):
+            chain.append('tvtime')
+        if properties.get('postprocessing'):
+            chain.append('pp')
+        chain.append('expand')
+        self._vfilter.wire(self._xine, self._stream.get_video_source(), chain, 
self._vo)
 
 
 
@@ -420,12 +429,13 @@
         if vo != None:
             self._driver_control("set_passthrough", vo)
         if notify != None:
+            set_parameters = self._vfilter.get('tvtime').set_parameters
             if notify:
                 log.info('deinterlace cheap mode: True')
-                self._deint_post.set_parameters(cheap_mode = True, 
framerate_mode = 'half_top')
+                set_parameters(cheap_mode = True, framerate_mode = 'half_top')
             else:
                 log.info('deinterlace cheap mode: False')
-                self._deint_post.set_parameters(cheap_mode = False, 
framerate_mode = 'full')
+                set_parameters(cheap_mode = False, framerate_mode = 'full')
 
             self._driver_control("set_notify_frame", notify)
         if size != None:
@@ -434,3 +444,10 @@
 
     def input(self, input):
         self._stream.send_event(input)
+
+
+    def set_property(self, prop, value):
+        """
+        Set a property to a new value.
+        """
+        pass

Added: trunk/popcorn/src/backends/xine/filter.py
==============================================================================
--- (empty file)
+++ trunk/popcorn/src/backends/xine/filter.py   Fri Dec 22 14:14:28 2006
@@ -0,0 +1,47 @@
+class Filter(object):
+
+    def __init__(self, name):
+        self.name = name
+        self.prop = {}
+        self._obj = None
+
+    def set_parameters(self, **kwargs):
+        self.prop.update(kwargs)
+        if self._obj:
+            self._obj.set_parameters(**kwargs)
+
+    def create(self, xine, video_targets=[], audio_targets=[]):
+        self._obj = xine.post_init(self.name, video_targets = video_targets,
+                                   audio_targets = audio_targets)
+        self._obj.set_parameters(**self.prop)
+        return self._obj
+
+
+    def get_default_input(self):
+        return self._obj.get_default_input()
+
+    
+class FilterChain(object):
+
+    def __init__(self):
+        self._filter = {}
+
+
+    def get(self, name):
+        f = self._filter.get(name)
+        if not f:
+            f = Filter(name)
+            self._filter[name] = f
+        return f
+
+
+    def wire(self, xine, src, chain, dst):
+        chain = chain[:]
+        chain.reverse()
+        for f in chain:
+            f = self.get(f)
+            f.create(xine, video_targets = [ dst ])
+            dst = f.get_default_input()
+
+        # FIXME: rewrire support
+        src.wire(dst)

Modified: trunk/popcorn/src/backends/xine/player.py
==============================================================================
--- trunk/popcorn/src/backends/xine/player.py   (original)
+++ trunk/popcorn/src/backends/xine/player.py   Fri Dec 22 14:14:28 2006
@@ -237,7 +237,7 @@
         else:
             self._xine.configure_video(None, None)
         self._xine.configure_audio(self._config.audio.driver)
-        self._xine.configure_stream()
+        self._xine.configure_stream(self._properties)
 
 
     #
@@ -361,6 +361,14 @@
         return self._is_in_menu
 
 
+    def set_property(self, prop, value):
+        """
+        Set a property to a new value.
+        """
+        super(Xine, self).set_property(prop, value)
+        if self.xine:
+            self.xine.set_property(prop, value)
+
     #
     # Methods and helper for MediaPlayer subclasses for CAP_OSD
     #

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to