def _maybeBuildInterpolators(self): if not self._rebuild_interpolators: return if not list(self.gnl_object.elements()): raise TrackError("makeBin hasn't been called yet") self._rebuild_interpolators = False factory_properties = self.factory.getInterpolatedProperties( self.stream) old_interpolators = self.interpolators self.interpolators = {} for gst_object, gst_object_property in \ get_controllable_properties(self.gnl_object): prop_name = gst_object_property.name if prop_name not in factory_properties: continue try: interpolator = old_interpolators[prop_name][1] except KeyError: if factory_properties[prop_name]: lower, upper, formatstr = factory_properties[prop_name] else: lower, upper, formatstr = None, None, None interpolator = Interpolator(self, gst_object, gst_object_property, lower, upper, formatstr) else: # remove and add again the keyframes so they are set on the # current controller keyframes = list(interpolator.keyframes) for keyframe in keyframes: interpolator.removeKeyframe(keyframe) interpolator.attachToElementProperty(gst_object_property, gst_object) interpolator.updateMediaStop(self.out_point) for keyframe in keyframes: interpolator.newKeyframe(keyframe) self.interpolators[gst_object_property.name] = \ (gst_object_property, interpolator)
def _maybeBuildInterpolators(self): if not self._rebuild_interpolators: return if not list(self.gnl_object.elements()): raise TrackError("makeBin hasn't been called yet") self._rebuild_interpolators = False factory_properties = self.factory.getInterpolatedProperties(self.stream) old_interpolators = self.interpolators self.interpolators = {} for gst_object, gst_object_property in \ get_controllable_properties(self.gnl_object): prop_name = gst_object_property.name if prop_name not in factory_properties: continue try: interpolator = old_interpolators[prop_name][1] except KeyError: if factory_properties[prop_name]: lower, upper, formatstr = factory_properties[prop_name] else: lower, upper, formatstr = None, None, None interpolator = Interpolator(self, gst_object, gst_object_property, lower, upper, formatstr) else: # remove and add again the keyframes so they are set on the # current controller keyframes = list(interpolator.keyframes) for keyframe in keyframes: interpolator.removeKeyframe(keyframe) interpolator.attachToElementProperty(gst_object_property, gst_object) interpolator.updateMediaStop(self.out_point) for keyframe in keyframes: interpolator.newKeyframe(keyframe) self.interpolators[gst_object_property.name] = \ (gst_object_property, interpolator)
def testSaveTrackObject(self): video_stream = VideoStream(gst.Caps("video/x-raw-yuv")) audio_stream = AudioStream(gst.Caps("audio/x-raw-int")) source1 = FileSourceFactory("file1.ogg") source1.addOutputStream(video_stream) # these two calls are needed to populate the context for the -ref # elements self.formatter._saveSource(source1) self.formatter._saveStream(video_stream) track_object = SourceTrackObject(source1, video_stream, start=10 * gst.SECOND, duration=20 * gst.SECOND, in_point=5 * gst.SECOND, media_duration=15 * gst.SECOND, priority=10) track = Track(video_stream) track.addTrackObject(track_object) # create an interpolator and insert it into the track object fakevol = gst.element_factory_make("volume") prop = get_controllable_properties(fakevol)[1][1] volcurve = Interpolator(track_object, fakevol, prop) track_object.interpolators[prop.name] = (prop, volcurve) # add some points to the interpolator value = float(0) volcurve.start.setObjectTime(0) volcurve.start.value = 0 for t in xrange(3, 15, 3): value = int(t % 2) volcurve.newKeyframe(t * gst.SECOND, value) volcurve.end.setObjectTime(15 * gst.SECOND) volcurve.end.value = 15 % 2 element = self.formatter._saveTrackObject(track_object) self.failUnlessEqual(element.tag, "track-object") self.failUnlessEqual(element.attrib["type"], qual(track_object.__class__)) self.failUnlessEqual(element.attrib["start"], ts(10 * gst.SECOND)) self.failUnlessEqual(element.attrib["duration"], ts(20 * gst.SECOND)) self.failUnlessEqual(element.attrib["in_point"], ts(5 * gst.SECOND)) self.failUnlessEqual(element.attrib["media_duration"], ts(15 * gst.SECOND)) self.failUnlessEqual(element.attrib["priority"], "(int)10") self.failIfEqual(element.find("factory-ref"), None) self.failIfEqual(element.find("stream-ref"), None) # find the interpolation keyframes curves = element.find("curves") self.failIfEqual(curves, None) curve = curves.find("curve") self.failIfEqual(curve, None) self.failUnlessEqual(curve.attrib["property"], "volume") # compute a dictionary of keyframes saved_points = dict(((obj.attrib["time"], (obj.attrib["value"], obj.attrib["mode"])) for obj in curve.getiterator("keyframe"))) # compare this with the expected values expected = dict(((str(t * gst.SECOND), ("(gdouble)%s" % (t % 2), "2")) for t in xrange(3, 15, 3))) self.failUnlessEqual(expected, saved_points)
def testSaveTrackSource(self): video_stream = VideoStream(gst.Caps("video/x-raw-yuv")) audio_stream = AudioStream(gst.Caps("audio/x-raw-int")) source1 = FileSourceFactory("file1.ogg") source1.addOutputStream(video_stream) # these two calls are needed to populate the context for the -ref # elements self.formatter._saveSource(source1) self.formatter._saveStream(video_stream) track_source = SourceTrackObject(source1, video_stream, start=10 * gst.SECOND, duration=20 * gst.SECOND, in_point=5 * gst.SECOND, media_duration=15 * gst.SECOND, priority=10) track = Track(video_stream) track.addTrackObject(track_source) # create an interpolator and insert it into the track object fakevol = gst.element_factory_make("volume") prop = get_controllable_properties(fakevol)[1][1] volcurve = Interpolator(track_source, fakevol, prop) track_source.interpolators[prop.name] = (prop, volcurve) # add some points to the interpolator value = float(0) volcurve.start.setObjectTime(0) volcurve.start.value = 0 for t in xrange(3, 15, 3): value = int(t % 2) volcurve.newKeyframe(t * gst.SECOND, value) volcurve.end.setObjectTime(15 * gst.SECOND) volcurve.end.value = 15 % 2 element = self.formatter._saveTrackObject(track_source) self.failUnlessEqual(element.tag, "track-object") self.failUnlessEqual(element.attrib["type"], qual(track_source.__class__)) self.failUnlessEqual(element.attrib["start"], ts(10 * gst.SECOND)) self.failUnlessEqual(element.attrib["duration"], ts(20 * gst.SECOND)) self.failUnlessEqual(element.attrib["in_point"], ts(5 * gst.SECOND)) self.failUnlessEqual(element.attrib["media_duration"], ts(15 * gst.SECOND)) self.failUnlessEqual(element.attrib["priority"], "(int)10") self.failIfEqual(element.find("factory-ref"), None) self.failIfEqual(element.find("stream-ref"), None) # find the interpolation keyframes curves = element.find("curves") self.failIfEqual(curves, None) curve = curves.find("curve") self.failIfEqual(curve, None) self.failUnlessEqual(curve.attrib["property"], "volume") # compute a dictionary of keyframes saved_points = dict( ((obj.attrib["time"], (obj.attrib["value"], obj.attrib["mode"])) for obj in curve.getiterator("keyframe"))) # compare this with the expected values expected = dict(((str(t * gst.SECOND), ("(gdouble)%s" % (t % 2), "2")) for t in xrange(3, 15, 3))) self.failUnlessEqual(expected, saved_points)