mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
Subclass Exception for mapping and unmapping errors
And minor cleanup in the way errors are handled
This commit is contained in:
parent
6d53d0ae0e
commit
d365954fc0
3 changed files with 45 additions and 25 deletions
|
@ -38,12 +38,16 @@ class ExampleTransform(GstBase.BaseTransform):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def do_transform_ip(self, buf):
|
def do_transform_ip(self, buf):
|
||||||
with buf.map(Gst.MapFlags.READ | Gst.MapFlags.WRITE) as info:
|
try:
|
||||||
# Create a NumPy ndarray from the memoryview and modify it in place:
|
with buf.map(Gst.MapFlags.READ | Gst.MapFlags.WRITE) as info:
|
||||||
A = np.ndarray(shape = (self.height, self.width), dtype = np.uint8, buffer = info.data)
|
# Create a NumPy ndarray from the memoryview and modify it in place:
|
||||||
A[:] = np.invert(A)
|
A = np.ndarray(shape = (self.height, self.width), dtype = np.uint8, buffer = info.data)
|
||||||
|
A[:] = np.invert(A)
|
||||||
|
|
||||||
return Gst.FlowReturn.OK
|
return Gst.FlowReturn.OK
|
||||||
|
except Gst.MapError as e:
|
||||||
|
Gst.error("Mapping error: %s" % e)
|
||||||
|
return Gst.FlowReturn.ERROR
|
||||||
|
|
||||||
GObject.type_register(ExampleTransform)
|
GObject.type_register(ExampleTransform)
|
||||||
__gstelementfactory__ = ("ExampleTransform", Gst.Rank.NONE, ExampleTransform)
|
__gstelementfactory__ = ("ExampleTransform", Gst.Rank.NONE, ExampleTransform)
|
||||||
|
|
|
@ -225,6 +225,11 @@ class LinkError(Exception):
|
||||||
pass
|
pass
|
||||||
__all__.append('LinkError')
|
__all__.append('LinkError')
|
||||||
|
|
||||||
|
class MapError(Exception):
|
||||||
|
pass
|
||||||
|
__all__.append('MapError')
|
||||||
|
|
||||||
|
|
||||||
class Iterator(Gst.Iterator):
|
class Iterator(Gst.Iterator):
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
while True:
|
while True:
|
||||||
|
@ -616,19 +621,18 @@ class Buffer(Gst.Buffer):
|
||||||
if (_gi_gst.buffer_override_map_range(self, mapinfo, idx, length, int(flags))):
|
if (_gi_gst.buffer_override_map_range(self, mapinfo, idx, length, int(flags))):
|
||||||
mapinfo.__parent__ = self
|
mapinfo.__parent__ = self
|
||||||
return (mapinfo)
|
return (mapinfo)
|
||||||
raise Exception('MappingError','Buffer mapping was not successfull')
|
raise MapError('MappingError','Buffer mapping was not successfull')
|
||||||
return None
|
|
||||||
|
|
||||||
def map(self, flags):
|
def map(self, flags):
|
||||||
mapinfo = MapInfo()
|
mapinfo = MapInfo()
|
||||||
if (_gi_gst.buffer_override_map(self, mapinfo, int(flags))):
|
if _gi_gst.buffer_override_map(self, mapinfo, int(flags)):
|
||||||
mapinfo.__parent__ = self
|
mapinfo.__parent__ = self
|
||||||
return (mapinfo)
|
return mapinfo
|
||||||
raise Exception('MappingError','Buffer mapping was not successfull')
|
raise MapError('MappingError','Buffer mapping was not successfull')
|
||||||
return None
|
|
||||||
|
|
||||||
def unmap(self, mapinfo):
|
def unmap(self, mapinfo):
|
||||||
_gi_gst.buffer_override_unmap(self, mapinfo)
|
if _gi_gst.buffer_override_unmap(self, mapinfo) is not True:
|
||||||
|
raise MapError('UnmappingError','Buffer unmapping was not successfull')
|
||||||
|
|
||||||
Buffer = override(Buffer)
|
Buffer = override(Buffer)
|
||||||
__all__.append('Buffer')
|
__all__.append('Buffer')
|
||||||
|
@ -640,11 +644,10 @@ class Memory(Gst.Memory):
|
||||||
if (_gi_gst.memory_override_map(self, mapinfo, int(flags))):
|
if (_gi_gst.memory_override_map(self, mapinfo, int(flags))):
|
||||||
mapinfo.__parent__ = self
|
mapinfo.__parent__ = self
|
||||||
return (mapinfo)
|
return (mapinfo)
|
||||||
raise Exception('MappingError','Memory mapping was not successfull')
|
raise MapError('MappingError','Memory mapping was not successfull')
|
||||||
return None
|
|
||||||
|
|
||||||
def unmap(self, mapinfo):
|
def unmap(self, mapinfo):
|
||||||
_gi_gst.memory_override_unmap(self, mapinfo)
|
return _gi_gst.memory_override_unmap(self, mapinfo)
|
||||||
|
|
||||||
Memory = override(Memory)
|
Memory = override(Memory)
|
||||||
__all__.append('Memory')
|
__all__.append('Memory')
|
||||||
|
|
|
@ -805,14 +805,18 @@ _gst_memory_override_unmap (PyObject * self, PyObject * args)
|
||||||
|
|
||||||
/* Look up Gst.Buffer and Gst.Mapinfo parameters */
|
/* Look up Gst.Buffer and Gst.Mapinfo parameters */
|
||||||
gst_memory_type = pygobject_lookup_class (_gst_memory_type);
|
gst_memory_type = pygobject_lookup_class (_gst_memory_type);
|
||||||
if (!PyArg_ParseTuple (args, "O!O", gst_memory_type, &py_memory, &py_mapinfo))
|
if (!PyArg_ParseTuple (args, "O!O", gst_memory_type, &py_memory, &py_mapinfo)) {
|
||||||
|
PyErr_BadArgument ();
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Extract attributes from Gst.MapInfo */
|
/* Extract attributes from Gst.MapInfo */
|
||||||
if (!(mview = PyObject_GetAttrString (py_mapinfo, "data")))
|
if (!(mview = PyObject_GetAttrString (py_mapinfo, "data")))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (!PyObject_HasAttrString (py_mapinfo, "__cmapinfo"))
|
if (!PyObject_HasAttrString (py_mapinfo, "__cmapinfo"))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
if (!(py_cmapinfo = PyObject_GetAttrString (py_mapinfo, "__cmapinfo")))
|
if (!(py_cmapinfo = PyObject_GetAttrString (py_mapinfo, "__cmapinfo")))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
@ -835,10 +839,10 @@ _gst_memory_override_unmap (PyObject * self, PyObject * args)
|
||||||
g_free (mapinfo);
|
g_free (mapinfo);
|
||||||
end:
|
end:
|
||||||
Py_DECREF (mview);
|
Py_DECREF (mview);
|
||||||
Py_RETURN_NONE;
|
return Py_True;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
return NULL;
|
return Py_False;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -856,7 +860,7 @@ _gst_buffer_override_map_range (PyObject * self, PyObject * args)
|
||||||
gst_buffer_type = pygobject_lookup_class (_gst_buffer_type);
|
gst_buffer_type = pygobject_lookup_class (_gst_buffer_type);
|
||||||
if (!PyArg_ParseTuple (args, "O!OIii", gst_buffer_type, &py_buffer,
|
if (!PyArg_ParseTuple (args, "O!OIii", gst_buffer_type, &py_buffer,
|
||||||
&py_mapinfo, &idx, &range, &flags))
|
&py_mapinfo, &idx, &range, &flags))
|
||||||
return NULL;
|
return Py_False;
|
||||||
|
|
||||||
/* Since Python does only support r/o or r/w it has to be changed to either */
|
/* Since Python does only support r/o or r/w it has to be changed to either */
|
||||||
flags = (flags & GST_MAP_WRITE) ? GST_MAP_READWRITE : GST_MAP_READ;
|
flags = (flags & GST_MAP_WRITE) ? GST_MAP_READWRITE : GST_MAP_READ;
|
||||||
|
@ -893,8 +897,10 @@ _gst_buffer_override_map (PyObject * self, PyObject * args)
|
||||||
/* Look up Gst.Buffer, Gst.MapInfo, and Gst.MapFlags parameters */
|
/* Look up Gst.Buffer, Gst.MapInfo, and Gst.MapFlags parameters */
|
||||||
gst_buffer_type = pygobject_lookup_class (_gst_buffer_type);
|
gst_buffer_type = pygobject_lookup_class (_gst_buffer_type);
|
||||||
if (!PyArg_ParseTuple (args, "O!Oi", gst_buffer_type, &py_buffer, &py_mapinfo,
|
if (!PyArg_ParseTuple (args, "O!Oi", gst_buffer_type, &py_buffer, &py_mapinfo,
|
||||||
&flags))
|
&flags)) {
|
||||||
|
PyErr_BadArgument ();
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Since Python does only support r/o or r/w it has to be changed to either */
|
/* Since Python does only support r/o or r/w it has to be changed to either */
|
||||||
flags = (flags & GST_MAP_WRITE) ? GST_MAP_READWRITE : GST_MAP_READ;
|
flags = (flags & GST_MAP_WRITE) ? GST_MAP_READWRITE : GST_MAP_READ;
|
||||||
|
@ -928,14 +934,18 @@ _gst_buffer_override_unmap (PyObject * self, PyObject * args)
|
||||||
|
|
||||||
/* Look up Gst.Buffer and Gst.Mapinfo parameters */
|
/* Look up Gst.Buffer and Gst.Mapinfo parameters */
|
||||||
gst_buf_type = pygobject_lookup_class (_gst_buffer_type);
|
gst_buf_type = pygobject_lookup_class (_gst_buffer_type);
|
||||||
if (!PyArg_ParseTuple (args, "O!O", gst_buf_type, &py_buffer, &py_mapinfo))
|
if (!PyArg_ParseTuple (args, "O!O", gst_buf_type, &py_buffer, &py_mapinfo)) {
|
||||||
|
PyErr_BadArgument ();
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Extract attributes from Gst.MapInfo */
|
/* Extract attributes from Gst.MapInfo */
|
||||||
if (!(mview = PyObject_GetAttrString (py_mapinfo, "data")))
|
if (!(mview = PyObject_GetAttrString (py_mapinfo, "data")))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (!PyObject_HasAttrString (py_mapinfo, "__cmapinfo"))
|
if (!PyObject_HasAttrString (py_mapinfo, "__cmapinfo"))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
if (!(py_cmapinfo = PyObject_GetAttrString (py_mapinfo, "__cmapinfo")))
|
if (!(py_cmapinfo = PyObject_GetAttrString (py_mapinfo, "__cmapinfo")))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
@ -946,8 +956,11 @@ _gst_buffer_override_unmap (PyObject * self, PyObject * args)
|
||||||
|
|
||||||
/* Call the memoryview.release() Python method, there is no C API */
|
/* Call the memoryview.release() Python method, there is no C API */
|
||||||
PyObject *ret = PyObject_CallMethod (mview, "release", NULL);
|
PyObject *ret = PyObject_CallMethod (mview, "release", NULL);
|
||||||
if (!ret)
|
if (!ret) {
|
||||||
|
GST_ERROR ("Could not call `.release()` on the memoryview.");
|
||||||
|
|
||||||
goto err;
|
goto err;
|
||||||
|
}
|
||||||
Py_DECREF (ret);
|
Py_DECREF (ret);
|
||||||
Py_DECREF (py_cmapinfo);
|
Py_DECREF (py_cmapinfo);
|
||||||
PyObject_SetAttrString (py_mapinfo, "__cmapinfo", NULL);
|
PyObject_SetAttrString (py_mapinfo, "__cmapinfo", NULL);
|
||||||
|
@ -957,10 +970,10 @@ _gst_buffer_override_unmap (PyObject * self, PyObject * args)
|
||||||
g_free (mapinfo);
|
g_free (mapinfo);
|
||||||
end:
|
end:
|
||||||
Py_DECREF (mview);
|
Py_DECREF (mview);
|
||||||
Py_RETURN_NONE;
|
return Py_True;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
return NULL;
|
return Py_False;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyMethodDef _gi_gst_functions[] = {
|
static PyMethodDef _gi_gst_functions[] = {
|
||||||
|
|
Loading…
Reference in a new issue