[gst-devel] source-filter link problem with python

Carlos Niharra cniharral at yahoo.com
Tue Feb 20 15:42:40 CET 2007


Hi,

  I'm a newbie in this list, so sorry if I'm not
pointing my question in the right place.

  My problem is that I'm trying to link a source and a
filter in a pipeline through python without any
success. I could link them with version 0.8.x of
gstreamer, but the change of version from 0.8.x to
0.10.x took some changes in the python bindings API,
and the function set_get_function of gst.Pad has been
removed, so I don't know how to link the stages.

  The code of my source (FileSource.py) stage (based
on the filesrc.py example) is:

import sys
import gobject
import gst
import pickle

class FileSource(gst.Element):

        blocksize = 4096
        fd = None
        file = ""
        data = ""
        hash = False
        ohash = {}
        #srcpad = None

        def __init__(self, name):

                self.__gobject_init__()
                self.curoffset = 0
                self.set_name(name)
                
        def set_property(self, name, value):

                if name == 'location':
                        self.file = value
                        self.fd = open(self.file, 'r')
                        self.ohash['file'] = self.file
                        #self.curoffset +=
len(self.ohash)
                elif name == 'blocksize':
                        self.blocksize = value
                elif name == 'hash':
                        if value.lower() == "true":
                                self.hash = True

        def do_create(self, offset, size):

                #if offset != self.curoffset:
                #       self.fd.seek(offset, 0)

                if self.blocksize == 0:
                        data = self.fd.read()
                else:
                        data =
self.fd.read(self.blocksize)
                if data:
                        self.ohash['data'] = data
                        self.curoffset += len(data)
                        return gst.FLOW_OK,
gst.Buffer(self.ohash)
                else:
                        return gst.FLOW_UNEXPECTED,
None

gobject.type_register(FileSource)

  The code of my filter stage is:

import sys
import gobject
import gst
import pickle

class DataFilter( gst.Element ):

        callbackfunc = None
        n_buffer = 0
        data = None

        def __init__( self, name ):

                self.__gobject_init__()
                gst.Element.__init__( self )

                self.set_name( name )

                sinkpadtempl = gst.PadTemplate(
                        "sinkpadtemplate",
                        gst.PAD_SINK,
                        gst.PAD_ALWAYS,
                        gst.caps_new_any() )
                self.snkpad = gst.Pad( sinkpadtempl,
"snk" )
                self.snkpad.set_chain_function(
self.chainfunc )
                self.add_pad( self.snkpad )

                srcpadtempl = gst.PadTemplate(
                        "srcpadtemplate",
                        gst.PAD_SRC,
                        gst.PAD_ALWAYS,
                        gst.caps_new_any() )

                self.srcpad = gst.Pad( srcpadtempl,
"src" )
                self.srcpad.set_event_function(
self.eventfunc )
                self.add_pad( self.srcpad )

                #self.connect( 'eos', self.eosfunc )

                self.callbackfunc = lambda x: x

        def chainfunc( self, pad, buffer ):

                data = buffer.get_data()
                #print "data (%s): %s" %
(str(type(data)), str(data))
                #print "self.data (%s): %s" %
(str(type(self.data)), str(self.data))
                if data:
                        self.data = data
                        self.srcpad.send_event(
gst.Event(gst.EVENT_EOS) )

                return gst.FLOW_OK

        def eventfunc(self, pad, event):

                if pad == self.srcpad:
                        if event.type ==
gst.EVENT_EOS:
                                self.n_buffer += 1
                        elif event.type ==
gst.EVENT_FLUSH:
                                result =
self.callbackfunc( self.data )
                                self.srcpad.push(
gst.Buffer( result ) )
                #print "Event ...: %s event:%r" %
(pad, event.type)
                self.info("%s event:%r" % (pad,
event.type))
                return True

        def set_property (self, name, value):

                if name == "callback":
                        self.callbackfunc = value

gobject.type_register( DataFilter )


Before the change of version from 0.8.x to 0.10.x, my
source code was:

import sys
import gobject
import gst
import pickle

class FileSource(gst.Element):

        blocksize = 4096
        fd = None
        file = ""
        data = ""
        hash = False
        ohash = {}
        #srcpad = None

        def __init__(self, name):

                self.__gobject_init__()
                self.curoffset = 0
                self.set_name(name)
                self.srcpad = gst.Pad('src',
gst.PAD_SRC)
               
self.srcpad.set_get_function(self.srcpad_get)
                self.add_pad(self.srcpad)
                
        def set_property(self, name, value):

                if name == 'location':
                        self.file = value
                        self.fd = open(self.file, 'r')
                        self.ohash['file'] = self.file
                        #self.curoffset +=
len(self.ohash)
                elif name == 'blocksize':
                        self.blocksize = value
                elif name == 'hash':
                        if value.lower() == "true":
                                self.hash = True

        def srcpad_get(self, pad):

                data = self.fd.read(self.blocksize)

                if data:
                        buffer =
gst.Buffer(pickle.dumps(data))
                        return buffer
                else:
                        self.set_eos()
                        return
gst.Event(gst.EVENT_EOS)

gobject.type_register(FileSource)

To link the stages, of course I'm doing:

    pipeline = gst.Pipeline('pipeline')
    filesrc = FileSource("FileSource")
    filter = DataFilter("datafilter")
    gst.element_link_many(filesrc, filter)
    pipeline.set_state(gst.STATE_PLAYING)
    while self.pipeline.iterate(): pass
    pipeline.set_state(gst.STATE_NULL)

Can anyone tell me what's wrong with my new source
stage?i How could I replace the set_get_function with
any other doing the same tasks?

Regards.

   Carlos Niharra López


		
______________________________________________ 
LLama Gratis a cualquier PC del Mundo. 
Llamadas a fijos y móviles desde 1 céntimo por minuto. 
http://es.voice.yahoo.com




More information about the gstreamer-devel mailing list