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