summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Saunier <tsaunier@gnome.org>2015-03-18 13:53:55 +0100
committerThibault Saunier <tsaunier@gnome.org>2015-03-19 10:27:51 +0100
commit3d19875eb7c20cedb4ab64e295c338ebd32f4b04 (patch)
treebf2a01a3216a7fffd80f375922473bd13f639b82
parent025b7cfbeaf3b28b647d54085a4bc5d50b4a196d (diff)
overrides: Try hard to make the query writable in the pad query function
Summary: We know that the bindings will get an extra ref but we know that it is not actually needed, so we are safe to decrease the refcount by one in that particular context making sure we give PyGI its ref back when we are done. Reviewers: Mathieu_Du Differential Revision: http://phabricator.freedesktop.org/D41 https://bugzilla.gnome.org/show_bug.cgi?id=746329
-rw-r--r--gi/overrides/Gst.py32
1 files changed, 29 insertions, 3 deletions
diff --git a/gi/overrides/Gst.py b/gi/overrides/Gst.py
index a181673..5041f1c 100644
--- a/gi/overrides/Gst.py
+++ b/gi/overrides/Gst.py
@@ -25,6 +25,7 @@
# any later version.
import sys
+from inspect import signature
from ..overrides import override
from ..importer import modules
@@ -99,12 +100,27 @@ class Pad(Gst.Pad):
def __init__(self):
self._real_chain_func = None
self._real_event_func = None
+ self._real_query_func = None
def _chain_override(self, pad, parent, buf):
return self._real_chain_func(pad, buf)
- def _event_override(self, pad, parent, buf):
- return self._real_event_func(pad, buf)
+ def _event_override(self, pad, parent, event):
+ return self._real_event_func(pad, event)
+
+ def _query_override(self, pad, parent, query):
+ query.mini_object.refcount -= 1
+ n_params = len(signature(self._real_query_func).parameters)
+ if n_params == 2:
+ res = self._real_query_func(pad, query)
+ elif n_params == 3:
+ res = self._real_query_func(pad, parent, query)
+ else:
+ raise TypeError("Invalid query method %s, 2 or 3 arguments requiered"
+ % self._real_query_func)
+ query.mini_object.refcount += 1
+
+ return res
def set_chain_function(self, func):
self._real_chain_func = func
@@ -114,6 +130,14 @@ class Pad(Gst.Pad):
self._real_event_func = func
self.set_event_function_full(self._event_override, None)
+ def set_query_function(self, func):
+ self._real_query_func = func
+ self.set_query_function_full(self._chain_override, None)
+
+ def set_query_function_full(self, func, udata):
+ self._real_query_func = func
+ self._real_set_query_function_full(self._query_override, None)
+
def query_caps(self, filter=None):
return Gst.Pad.query_caps(self, filter)
@@ -123,6 +147,7 @@ class Pad(Gst.Pad):
raise LinkError(ret)
return ret
+Pad._real_set_query_function_full = Gst.Pad.set_query_function_full
Pad = override(Pad)
__all__.append('Pad')
@@ -131,7 +156,7 @@ class GhostPad(Gst.GhostPad):
if direction is None:
if target is None:
raise TypeError('you must pass at least one of target'
- 'and direction')
+ 'and direction')
direction = target.props.direction
Gst.GhostPad.__init__(self, name=name, direction=direction)
@@ -199,6 +224,7 @@ __all__.append('Pipeline')
class Structure(Gst.Structure):
def __getitem__(self, key):
return self.get_value(key)
+
def __setitem__(self, key, value):
return self.set_value(key, value)