'From etoys4.0 of 9 October 2008 [latest update: #2207] on 26 March 2009 at 12:56:11 pm'! "Change Set: GStreamerBase40ForEtoys Date: 26 March 2009 Author: John McIntosh and others The diff from the code in Etoys and GStreamer-Base-JMM.40.mcz"! !GStreamer commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php The MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ! !GStreamerObject commentStamp: '' prior: 0! handle is a memory address for a GStreamer Object Register is the Weak Registery to enable our ability to deal with GCed Objects * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerBus commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerCaps commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerClock commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerElement commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerBin commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerElementFactory commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerElementForSqueakSinkAudio commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerMessage commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerPad commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerPipeline commentStamp: '' prior: 0! elementsInPipe elements in the pipe * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerPipelineSqueakSink commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerPipelineSqueakAudioSink commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerPipelineSqueakVideoSink commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerRequestPad commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GStreamerStaticPad commentStamp: '' prior: 0! * Created by John M McIntosh on 3/10/08. * Copyright 2008 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com All rights reserved. * Written for Viewpoints Research Institute http://www.vpri.org/ * http://www.opensource.org/licenses/mit-license.php! !GstElemFakeSink commentStamp: '' prior: 0! Has subclasses for audio/video. Has basically the same role as GStreamerElementForSqueakSinkAudio/Video, except: - puts semaphore management in the element instead of the pipeline - shorter name... easier to type when manually composing pipelines! !GStreamer methodsFor: 'pads' stamp: 'JMM 11/27/2008 22:27'! callbackSignalSeenForIndex: aIndex ^self primcallbacksignalseenfor: aIndex! ! !GStreamer methodsFor: 'pads' stamp: 'JMM 3/19/2008 20:26'! linkElementSrc: srcElement toDest: destElement filtered: caps "Links src to dest using the given caps as filtercaps. The link must be from source to destination; the other direction will not be tried. The function looks for existing pads that aren't linked yet. It will request new pads if necessary. If multiple links are possible, only one is established. Make sure you have added your elements to a bin or pipeline with gst_bin_add() before trying to link them." ^self primgstelementlinkfiltered: srcElement handle dest: destElement handle filtered: caps handle "Returns†: TRUE if the pads could be linked, FALSE otherwise. "! ! !GStreamer methodsFor: 'system primitives' stamp: 'JMM 11/27/2008 22:26'! primcallbacksignalseenfor: aIndex self primitiveFailed ! ! !GStreamerObject methodsFor: 'state' stamp: 'JMM 3/13/2008 01:03'! getState: aTimeOutValue "Gets the state of the element" "Returns an array which is the GstStateChangeReturn value, the state, the pending state" | results | results := self primstelementgetstate: self handle timeOut: aTimeOutValue. ^results "Gets the state of the element. For elements that performed an ASYNC state change, as reported by gst_element_set_state(), this function will block up to the specified timeout value for the state change to complete. If the element completes the state change or goes into an error, this function returns immediately with a return value of GST_STATE_CHANGE_SUCCESS or GST_STATE_CHANGE_FAILURE respectively. For elements that did not return GST_STATE_CHANGE_ASYNC, this function returns the current and pending state immediately. This function returns GST_STATE_CHANGE_NO_PREROLL if the element successfully changed its state but is not able to provide data yet. This mostly happens for live sources that only produce data in the PLAYING state. While the state change return is equivalent to GST_STATE_CHANGE_SUCCESS, it is returned to the application to signal that some sink elements might not be able to complete their state change because an element is not producing data to complete the preroll. When setting the element to playing, the preroll will complete and playback will start. element†: a GstElement to get the state of. state†: a pointer to GstState to hold the state. Can be NULL. pending†: a pointer to GstState to hold the pending state. Can be NULL. timeout†: a GstClockTime to specify the timeout for an async state change or GST_CLOCK_TIME_NONE for infinite timeout. Returns†: GST_STATE_CHANGE_SUCCESS if the element has no more pending state and the last state change succeeded, GST_STATE_CHANGE_ASYNC if the element is still performing a state change or GST_STATE_CHANGE_FAILURE if the last state change failed. MT safe. The possible return values from a state change function. Only GST_STATE_CHANGE_FAILURE is a real failure. GST_STATE_CHANGE_FAILURE the state change failed GST_STATE_CHANGE_SUCCESS the state change succeeded GST_STATE_CHANGE_ASYNC the state change will happen asynchronously GST_STATE_CHANGE_NO_PREROLL the state change succeeded but the element cannot produce data in PAUSED. This typically happens with live sources. typedef enum { GST_STATE_CHANGE_FAILURE = 0, GST_STATE_CHANGE_SUCCESS = 1, GST_STATE_CHANGE_ASYNC = 2, GST_STATE_CHANGE_NO_PREROLL = 3 } GstStateChangeReturn;" ! ! !GStreamerObject methodsFor: 'state' stamp: 'JMM 3/12/2008 11:12'! setStateTo: symbol "Sets the state of the element. This function will try to set the requested state by going through all the intermediary states and calling the class's state change function for each. This function can return GST_STATE_CHANGE_ASYNC, in which case the element will perform the remainder of the state change asynchronously in another thread. An application can use gst_element_get_state() to wait for the completion of the state change or it can wait for a state change message on the bus." | anInteger | anInteger := 1. symbol = #pending ifTrue: [anInteger := 0]. symbol = #null ifTrue: [anInteger := 1]. symbol = #ready ifTrue: [anInteger := 2]. symbol = #paused ifTrue: [anInteger := 3]. symbol = #playing ifTrue: [anInteger := 4]. ^self primgstelementsetstate: self handle to: anInteger "typedef enum { GST_STATE_VOID_PENDING = 0, GST_STATE_NULL = 1, GST_STATE_READY = 2, GST_STATE_PAUSED = 3, GST_STATE_PLAYING = 4 } GstState; GST_STATE_VOID_PENDING no pending state. GST_STATE_NULL the NULL state or initial state of an element GST_STATE_READY the element is ready to go to PAUSED GST_STATE_PAUSED the element is PAUSED GST_STATE_PLAYING the element is PLAYING ï GST_STATE_NULL: this is the default state. This state will deallocate all resources held by the element. ï GST_STATE_READY: in the ready state, an element has allocated all of its global resources, that is, resources that can be kept within streams. You can think about opening devices, allocating buffers and so on. However, the stream is not opened in this state, so the stream positions is automatically zero. If a stream was previously opened, it should be closed in this state, and position, properties and such should be reset. ï GST_STATE_PAUSED: in this state, an element has opened the stream, but is not actively processing it. An element is allowed to modify a stream's position, read and process data and such to prepare for playback as soon as state is changed to PLAYING, but it is not allowed to play the data which would make the clock run. In summary, PAUSED is the same as PLAYING but without a running clock. Elements going into the PAUSED state should prepare themselves for moving over to the PLAYING state as soon as possible. Video or audio outputs would, for example, wait for data to arrive and queue it so they can play it right after the state change. Also, video sinks can already play the first frame (since this does not affect the clock yet). Autopluggers could use this same state transition to already plug together a pipeline. Most other elements, such as codecs or filters, do not need to explicitely do anything in this state, however. ï GST_STATE_PLAYING: in the PLAYING state, an element does exactly the same as in the PAUSED state, except that the clock now runs." ! ! !GStreamerBus methodsFor: 'accessing' stamp: 'JMM 3/18/2008 21:42'! havePending "Check if there are pending messages on the bus that should be handled. bus†: a GstBus to check Returns†: TRUE if there are messages on the bus to be handled, FALSE otherwise. MT safe. " ^self primgstbushavepending: self handle.! ! !GStreamerBus methodsFor: 'accessing' stamp: 'JMM 3/18/2008 21:42'! peek "Peek the message on the top of the bus' queue. The message will remain on the bus' message queue. A reference is returned, and needs to be unreffed by the caller. bus†: a GstBus Returns†: The GstMessage that is on the bus, or NULL if the bus is empty. MT safe. " | data | data := self primgstbuspeek: self handle. data = 0 ifTrue: [^nil]. ^GStreamerMessage handle: data! ! !GStreamerBus methodsFor: 'accessing' stamp: 'JMM 3/18/2008 21:43'! pop "Get a message from the bus. bus†: a GstBus to pop Returns†: The GstMessage that is on the bus, or NULL if the bus is empty. The message is taken from the bus and needs to be unreffed with gst_message_unref() after usage. MT safe. " | data | data := self primgstbuspop: self handle. data = 0 ifTrue: [^nil]. ^GStreamerMessage handle: data! ! !GStreamerBus methodsFor: 'accessing' stamp: 'JMM 3/18/2008 21:44'! popFilter: aMessageType | data | data := self primgstbuspop: self handle filter: aMessageType. data = 0 ifTrue: [^nil]. ^GStreamerMessage handle: data "typedef enum { GST_MESSAGE_UNKNOWN = 0, GST_MESSAGE_EOS = (1 << 0), GST_MESSAGE_ERROR = (1 << 1), GST_MESSAGE_WARNING = (1 << 2), GST_MESSAGE_INFO = (1 << 3), GST_MESSAGE_TAG = (1 << 4), GST_MESSAGE_BUFFERING = (1 << 5), GST_MESSAGE_STATE_CHANGED = (1 << 6), GST_MESSAGE_STATE_DIRTY = (1 << 7), GST_MESSAGE_STEP_DONE = (1 << 8), GST_MESSAGE_CLOCK_PROVIDE = (1 << 9), GST_MESSAGE_CLOCK_LOST = (1 << 10), GST_MESSAGE_NEW_CLOCK = (1 << 11), GST_MESSAGE_STRUCTURE_CHANGE = (1 << 12), GST_MESSAGE_STREAM_STATUS = (1 << 13), GST_MESSAGE_APPLICATION = (1 << 14), GST_MESSAGE_ELEMENT = (1 << 15), GST_MESSAGE_SEGMENT_START = (1 << 16), GST_MESSAGE_SEGMENT_DONE = (1 << 17), GST_MESSAGE_DURATION = (1 << 18), GST_MESSAGE_LATENCY = (1 << 19), GST_MESSAGE_ASYNC_START = (1 << 20), GST_MESSAGE_ASYNC_DONE = (1 << 21), GST_MESSAGE_ANY = ~0 } GstMessageType; The different message types that are available. GST_MESSAGE_UNKNOWN an undefined message GST_MESSAGE_EOS end-of-stream reached in a pipeline. The application will only receive this message in the PLAYING state and every time it sets a pipeline to PLAYING that is in the EOS state. The application can perform a flushing seek in the pipeline, which will undo the EOS state again. GST_MESSAGE_ERROR an error occured. Whe the application receives an error message it should stop playback of the pipeline and not assume that more data will be played. GST_MESSAGE_WARNING a warning occured. GST_MESSAGE_INFO an info message occured GST_MESSAGE_TAG a tag was found. GST_MESSAGE_BUFFERING the pipeline is buffering. When the application receives a buffering message in the PLAYING state for a non-live pipeline it must PAUSE the pipeline until the buffering completes, when the percentage field in the message is 100%. For live pipelines, no action must be performed and the buffering percentage can be used to inform the user about the progress. GST_MESSAGE_STATE_CHANGED a state change happened GST_MESSAGE_STATE_DIRTY an element changed state in a streaming thread. This message is deprecated. GST_MESSAGE_STEP_DONE a framestep finished. This message is not yet implemented. GST_MESSAGE_CLOCK_PROVIDE an element notifies its capability of providing a clock. This message is used internally and never forwarded to the application. GST_MESSAGE_CLOCK_LOST The current clock as selected by the pipeline became unusable. The pipeline will select a new clock on the next PLAYING state change. GST_MESSAGE_NEW_CLOCK a new clock was selected in the pipeline. GST_MESSAGE_STRUCTURE_CHANGE the structure of the pipeline changed. Not implemented yet. GST_MESSAGE_STREAM_STATUS status about a stream, emitted when it starts, stops, errors, etc.. Not implemented yet. GST_MESSAGE_APPLICATION message posted by the application, possibly via an application-specific element. GST_MESSAGE_ELEMENT element-specific message, see the specific element's documentation GST_MESSAGE_SEGMENT_START pipeline started playback of a segment. This message is used internally and never forwarded to the application. GST_MESSAGE_SEGMENT_DONE pipeline completed playback of a segment. This message is forwarded to the application after all elements that posted GST_MESSAGE_SEGMENT_START posted a GST_MESSAGE_SEGMENT_DONE message. GST_MESSAGE_DURATION The duration of a pipeline changed. The application can get the new duration with a duration query. GST_MESSAGE_LATENCY Posted by elements when their latency changes. The pipeline will calculate and distribute a new latency. Since: 0.10.12 GST_MESSAGE_ASYNC_START Posted by elements when they start an ASYNC state change. This message is not forwarded to the application but is used internally. Since: 0.10.13. GST_MESSAGE_ASYNC_DONE Posted by elements when they complete an ASYNC state change. The application will only receive this message from the toplevel pipeline. Since: 0.10.13 GST_MESSAGE_ANY mask for all of the above messages. Get a message matching type from the bus. Will discard all messages on the bus that do not match type and that have been posted before the first message that does match type. If there is no message matching type on the bus, all messages will be discarded. bus†: a GstBus to pop types†: message types to take into account Returns†: The next GstMessage matching type that is on the bus, or NULL if the bus is empty or there is no message matching type. The message is taken from the bus and needs to be unreffed with gst_message_unref() after usage. MT safe. "! ! !GStreamerElement methodsFor: 'pads' stamp: 'jcg 4/21/2008 15:23'! requestPadByName: aName | pad padHandle | padHandle := self primgstelementgetrequestpad: self handle name: aName nullTerminated. padHandle = 0 ifTrue: [^nil]. pad := GStreamerRequestPad handle: padHandle. self requestPads add: pad. ^pad "Retrieves a pad from the element by name. This version only retrieves request pads. The pad should be released with gst_element_release_request_pad(). element†: a GstElement to find a request pad of. name†: the name of the request GstPad to retrieve. Returns†: requested GstPad if found, otherwise NULL. Release after usage. "! ! !GStreamerElement methodsFor: 'pads' stamp: 'JMM 3/17/2008 12:59'! requestPadThatIsCompatibleTo: aPad capsFilter: caps | pad padhandle | caps ifNil: [padhandle := self primgstelementgetcompatiblepad: self handle pad: aPad handle capsFilter: 0.] ifNotNil: [padhandle := self primgstelementgetcompatiblepad: self handle pad: aPad handle capsFilter: caps handle.]. padhandle = 0 ifTrue: [^nil]. pad := GStreamerPad handle: padhandle. self requestPads add: pad. ^pad "GstPad* gst_element_get_compatible_pad (GstElement *element, GstPad *pad, const GstCaps *caps); Looks for an unlinked pad to which the given pad can link. It is not guaranteed that linking the pads will work, though it should work in most cases. element†: a GstElement in which the pad should be found. pad†: the GstPad to find a compatible one for. caps†: the GstCaps to use as a filter. Returns†: the GstPad to which a link can be made, or NULL if one cannot be found. gst_object_unref() after usage. "! ! !GStreamerElement methodsFor: 'pads' stamp: 'jcg 4/21/2008 15:23'! requestStaticPadByName: aName | pad padHandle | padHandle := self primgstelementgetstaticpad: self handle name: aName nullTerminated. padHandle ifNil: [^nil]. pad := GStreamerStaticPad handle: padHandle. self requestPads add: pad. ^pad "Retrieves a pad from element by name. This version only retrieves already-existing (i.e. 'static') pads. element†: a GstElement to find a static pad of. name†: the name of the static GstPad to retrieve. Returns†: the requested GstPad if found, otherwise NULL. unref after usage. MT safe. "! ! !GStreamerElementForSqueakSinkVideo methodsFor: 'get value' stamp: 'JMM 11/26/2008 16:12'! frameRate ^ [(self getFrameRateNumerator) / (self getFrameRateNumerator )] ifError: [1]! ! !GStreamerElementForSqueakSinkVideo methodsFor: 'get value' stamp: 'JMM 11/26/2008 16:12'! height ^self getHeight! ! !GStreamerElementForSqueakSinkVideo methodsFor: 'get value' stamp: 'JMM 11/26/2008 15:10'! width ^self getWidth! ! !GStreamerPad methodsFor: 'caps' stamp: 'JMM 11/27/2008 15:54'! getParentPad "Gets the parent of pad, cast to a GstElement. If a pad has no parent or its parent is not an element, return NULL. The caller has a reference on the parent, so unref when you're finished with it. MT safe. " ^GStreamerPad handle: (self primgstpadgetparentelement: self handle) ! ! !GStreamerPad methodsFor: 'pads' stamp: 'jcg 4/21/2008 15:28'! ghostPadNew: aName ^GStreamerPad handle: (self primgstghostpadnew: self handle name: aName nullTerminated) "Create a new ghostpad with target as the target. The direction will be taken from the target pad. target must be unlinked. Will ref the target. name†: the name of the new pad, or NULL to assign a default name. target†: the pad to ghost. Returns†: a new GstPad, or NULL in case of an error."! ! !GStreamerPad methodsFor: 'system primitives' stamp: 'JMM 11/27/2008 18:33'! primgstpadgetparentelement: gstPadOop self primitiveFailed ! ! !GStreamerPipeline methodsFor: 'utility' stamp: 'JMM 11/27/2008 23:01'! setStateToThisValue: newState | currentState bus message | currentState := self getSimplifiedState. currentState = newState ifTrue: [^self]. self setStateTo: newState. bus := self getBus. message := bus waitUntilErrorOrMessage: {'state-changed'. 2. newState. self} uptoMilliseconds: 5000. ^message ! ! !GStreamerPipeline methodsFor: 'bus' stamp: 'JMM 3/13/2008 11:51'! getAutoFlushBus "Check if pipeline will automatically flush messages when going to the NULL state. Returns†: whether the pipeline will automatically flush its bus when going from READY to NULL state or not. MT safe." ^self primgstpipelinegetautoflushbus: self handle! ! !GStreamerPipeline methodsFor: 'clock' stamp: 'JMM 3/13/2008 11:39'! getClock "Gets the gstClock of pipeline. Returns†: a GstClock, unref after usage." | clockHandle | clockHandle := self primgstpipelinegetclock: self handle. ^GStreamerClock handle: clockHandle.! ! !GStreamerPipeline methodsFor: 'clock' stamp: 'JMM 3/13/2008 12:21'! setClock: aGStreamerClock "Set the clock for pipeline. The clock will be distributed to all the elements managed by the pipeline. Returns†: TRUE if the clock could be set on the pipeline. FALSE if some element did not accept the clock. MT safe. " ^self primgstpipelinesetclock: self handle value: aGStreamerClock handle ! !