def testLoadInterpolatorV0(self): # create fake document tree element = Element("track-object", type="pitivi.timeline.track.SourceTrackObject", start=ts(1 * gst.SECOND), duration=ts(15 * gst.SECOND), in_point=ts(5 * gst.SECOND), media_duration=ts(15 * gst.SECOND), priority=ts(5), id="1") factory_ref = SubElement(element, "factory-ref", id="1") stream_ref = SubElement(element, "stream-ref", id="1") # insert our fake factory into the context factory = AudioTestSourceFactory() factory.duration = 20 * gst.SECOND self.formatter._context.factories["1"] = factory # insert fake stream into the context stream = AudioStream(gst.Caps("audio/x-raw-int")) self.formatter._context.streams["1"] = stream # add a volume curve curves = SubElement(element, "curves") curve = SubElement(curves, "curve", property="volume") expected = dict((long(t * gst.SECOND), (float(t % 2), gst.INTERPOLATE_LINEAR)) for t in xrange(6, 15)) start = SubElement(curve, "start", value="1.0", mode="2") for time, (value, mode) in expected.iteritems(): SubElement(curve, "keyframe", time=str(time), value=str(value), mode=str(mode)) end = SubElement(curve, "end", value="1.0", mode="2") track = Track(stream) # point gun at foot; pull trigger track_object = self.formatter._loadTrackObject(track, element) self.failIfEqual(track_object.interpolators, None) interpolator = track_object.getInterpolator("volume") self.failIfEqual(interpolator, None) curve = dict(((kf.time, (kf.value, kf.mode)) for kf in interpolator.getInteriorKeyframes())) self.failUnlessEqual(curve, expected) # check that start keyframe value has been properly adjusted so as not # to change the shape of the curve. rounding is applied here because # the controller seems to round to a different precision # than python. we just want to check that the value is "in the # ballpark", indicating the keyframes have been updated. If you do the # math you'll see that both start and end keyframe values should be # about 1/6 self.failUnlessEqual( round(interpolator.start.value, 6), round((-5.0 / 6) + 1, 6)) self.failUnlessEqual(interpolator.start.time, 5 * gst.SECOND) # check that end keyrame value has been properly adjusted so as not to # change the shape of the curve self.failUnlessEqual(interpolator.end.time, 15 * gst.SECOND) self.failUnlessEqual( round(interpolator.end.value, 6), round((15.0 / 6) - (7.0/3), 6))
def testLoadTrackObject(self): # create fake document tree element = Element("track-object", type="pitivi.timeline.track.SourceTrackObject", start=ts(1 * gst.SECOND), duration=ts(10 * gst.SECOND), in_point=ts(5 * gst.SECOND), media_duration=ts(15 * gst.SECOND), priority=ts(5), id="1") factory_ref = SubElement(element, "factory-ref", id="1") stream_ref = SubElement(element, "stream-ref", id="1") # insert our fake factory into the context factory = AudioTestSourceFactory() factory.duration = 10 * gst.SECOND self.formatter._context.factories["1"] = factory # insert fake stream into the context stream = AudioStream(gst.Caps("audio/x-raw-int")) self.formatter._context.streams["1"] = stream # add a volume curve curves = SubElement(element, "curves") curve = SubElement(curves, "curve", property="volume", version="1") expected = dict((long(t * gst.SECOND), (float(t % 2), gst.INTERPOLATE_LINEAR)) for t in xrange(1, 10)) start = SubElement(curve, "start", value="0.0", mode="2") for time, (value, mode) in expected.iteritems(): SubElement(curve, "keyframe", time=str(time), value=str(value), mode=str(mode)) end = SubElement(curve, "end", value=str(10 % 2), mode="2") track = Track(stream) # point gun at foot; pull trigger track_object = self.formatter._loadTrackObject(track, element) self.failUnless(isinstance(track_object, SourceTrackObject)) self.failUnlessEqual(track_object.factory, factory) self.failUnlessEqual(track_object.stream, stream) self.failUnlessEqual(track_object.start, 1 * gst.SECOND) self.failUnlessEqual(track_object.duration, 10 * gst.SECOND) self.failUnlessEqual(track_object.in_point, 5 * gst.SECOND) self.failUnlessEqual(track_object.media_duration, 15 * gst.SECOND) self.failUnlessEqual(track_object.priority, 5) self.failIfEqual(track_object.interpolators, None) interpolator = track_object.getInterpolator("volume") self.failIfEqual(interpolator, None) curve = dict(((kf.time, (kf.value, kf.mode)) for kf in interpolator.getInteriorKeyframes())) self.failUnlessEqual(curve, expected) self.failUnlessEqual(interpolator.start.value, 0.0) self.failUnlessEqual(interpolator.start.time, 5 * gst.SECOND) self.failUnlessEqual(interpolator.end.value, 0.0) self.failUnlessEqual(interpolator.end.time, 15 * gst.SECOND)
def testAudioOnly(self): audio_factory1 = AudioTestSourceFactory(3) audio_factory1.duration = 10 * gst.SECOND stream = AudioStream(gst.Caps('audio/x-raw-int'), 'src0') audio_factory1.addOutputStream(stream) timeline = Timeline() track = Track(stream) track_object1 = SourceTrackObject(audio_factory1, stream) track_object1.start = 2 * gst.SECOND track.addTrackObject(track_object1) timeline.addTrack(track) factory = TimelineSourceFactory(timeline) bin = factory.makeBin() self.failUnlessEqual(len(list(bin)), 1) self.failUnlessEqual(factory.duration, 12 * gst.SECOND) fakesink = gst.element_factory_make('fakesink') def bin_pad_added_cb(bin, pad): pad.link(fakesink.get_pad('sink')) bin.connect('pad-added', bin_pad_added_cb) def error_cb(bus, message): gerror, debug = message.parse_error() self.fail('%s: %s' % (gerror.message, debug)) def eos_cb(bus, message): self.loop.quit() pipeline = gst.Pipeline() bus = pipeline.get_bus() bus.add_signal_watch() bus.connect('message::error', error_cb) bus.connect('message::eos', eos_cb) pipeline.add(bin) pipeline.add(fakesink) pipeline.set_state(gst.STATE_PLAYING) self.loop.run() pipeline.set_state(gst.STATE_NULL) factory.clean()
def testSplitObjectKeyframes(self): DURATION = 10 * gst.SECOND factory = AudioTestSourceFactory() factory.duration = DURATION stream_ = AudioStream(gst.Caps("audio/x-raw-int")) obj = SourceTrackObject(factory, stream_) track = Track(stream_) track.addTrackObject(obj) obj.start = 3 * gst.SECOND obj.duration = DURATION # create a three keyframes at: 3, 6 and 9 seconds interpolator = obj.getInterpolator("volume") keyframes = dict(((t * gst.SECOND, (t % 2, gst.INTERPOLATE_LINEAR)) for t in xrange(3, 10, 3))) expected = [] expected2 = [] for time, (value, mode) in keyframes.iteritems(): kf = interpolator.newKeyframe(time, value, mode) if time < (5 * gst.SECOND): expected.append(kf) else: expected2.append(kf) def getKeyframes(obj): keyframes = obj.getInterpolator("volume").getInteriorKeyframes() return list(keyframes) obj2 = obj.splitObject(8 * gst.SECOND) keyframes = getKeyframes(obj) keyframes2 = getKeyframes(obj2) self.failUnlessEqual(keyframes, expected) self.failUnlessEqual(keyframes2, expected2)
def _getDefaultAudioTrackObject(self, stream): factory = AudioTestSourceFactory(wave='silence') track_object = SourceTrackObject(factory, stream) return track_object
def testSplitObject(self): DURATION = 10 * gst.SECOND factory = AudioTestSourceFactory() factory.duration = DURATION stream_ = AudioStream(gst.Caps("audio/x-raw-int")) obj = SourceTrackObject(factory, stream_) track = Track(stream_) track.addTrackObject(obj) obj.start = 3 * gst.SECOND obj.duration = DURATION # create a zig-zag volume curve interpolator = obj.getInterpolator("volume") expected = dict(((t * gst.SECOND, (t % 2, gst.INTERPOLATE_LINEAR)) for t in xrange(3, 10, 3))) for time, (value, mode) in expected.iteritems(): interpolator.newKeyframe(time, value, mode) def getKeyframes(obj): keyframes = obj.getInterpolator("volume").getInteriorKeyframes() return dict(((kf.time, (kf.value, kf.mode)) for kf in keyframes)) monitor = TrackSignalMonitor(obj) self.failUnlessRaises(TrackError, obj.splitObject, 2 * gst.SECOND) self.failUnlessRaises(TrackError, obj.splitObject, 14 * gst.SECOND) # should these be possible (ie create empty objects) ? self.failUnlessRaises(TrackError, obj.splitObject, 3 * gst.SECOND) self.failUnlessRaises(TrackError, obj.splitObject, 13 * gst.SECOND) # splitObject at 4s should result in: # obj (start 3, end 4) other1 (start 4, end 13) other1 = obj.splitObject(4 * gst.SECOND) self.failUnlessEqual(expected, getKeyframes(other1)) self.failUnlessEqual(obj.start, 3 * gst.SECOND) self.failUnlessEqual(obj.in_point, 0 * gst.SECOND) self.failUnlessEqual(obj.duration, 1 * gst.SECOND) self.failUnlessEqual(obj.rate, 1) self.failUnlessEqual(other1.start, 4 * gst.SECOND) self.failUnlessEqual(other1.in_point, 1 * gst.SECOND) self.failUnlessEqual(other1.duration, 9 * gst.SECOND) self.failUnlessEqual(other1.rate, 1) self.failUnlessEqual(monitor.start_changed_count, 0) self.failUnlessEqual(monitor.duration_changed_count, 1) # move other1 back to start = 1 other1.start = 1 * gst.SECOND # splitObject again other1 monitor = TrackSignalMonitor(other1) other2 = other1.splitObject(6 * gst.SECOND) self.failUnlessEqual(other1.start, 1 * gst.SECOND) self.failUnlessEqual(other1.in_point, 1 * gst.SECOND) self.failUnlessEqual(other1.duration, 5 * gst.SECOND) self.failUnlessEqual(other1.rate, 1) self.failUnlessEqual(other2.start, 6 * gst.SECOND) self.failUnlessEqual(other2.in_point, 6 * gst.SECOND) self.failUnlessEqual(other2.duration, 4 * gst.SECOND) self.failUnlessEqual(other2.rate, 1) self.failUnlessEqual(monitor.start_changed_count, 0) self.failUnlessEqual(monitor.duration_changed_count, 1)
def testLoadInterpolatorV0(self): # create fake document tree element = Element("track-object", type="pitivi.timeline.track.SourceTrackObject", start=ts(1 * gst.SECOND), duration=ts(15 * gst.SECOND), in_point=ts(5 * gst.SECOND), media_duration=ts(15 * gst.SECOND), priority=ts(5), id="1") factory_ref = SubElement(element, "factory-ref", id="1") stream_ref = SubElement(element, "stream-ref", id="1") # insert our fake factory into the context factory = AudioTestSourceFactory() factory.duration = 20 * gst.SECOND self.formatter._context.factories["1"] = factory # insert fake stream into the context stream = AudioStream(gst.Caps("audio/x-raw-int")) self.formatter._context.streams["1"] = stream # add a volume curve curves = SubElement(element, "curves") curve = SubElement(curves, "curve", property="volume") expected = dict( (long(t * gst.SECOND), (float(t % 2), gst.INTERPOLATE_LINEAR)) for t in xrange(6, 15)) start = SubElement(curve, "start", value="1.0", mode="2") for time, (value, mode) in expected.iteritems(): SubElement(curve, "keyframe", time=str(time), value=str(value), mode=str(mode)) end = SubElement(curve, "end", value="1.0", mode="2") track = Track(stream) # point gun at foot; pull trigger track_object = self.formatter._loadTrackObject(track, element) self.failIfEqual(track_object.interpolators, None) interpolator = track_object.getInterpolator("volume") self.failIfEqual(interpolator, None) curve = dict(((kf.time, (kf.value, kf.mode)) for kf in interpolator.getInteriorKeyframes())) self.failUnlessEqual(curve, expected) # check that start keyframe value has been properly adjusted so as not # to change the shape of the curve. rounding is applied here because # the controller seems to round to a different precision # than python. we just want to check that the value is "in the # ballpark", indicating the keyframes have been updated. If you do the # math you'll see that both start and end keyframe values should be # about 1/6 self.failUnlessEqual(round(interpolator.start.value, 6), round((-5.0 / 6) + 1, 6)) self.failUnlessEqual(interpolator.start.time, 5 * gst.SECOND) # check that end keyrame value has been properly adjusted so as not to # change the shape of the curve self.failUnlessEqual(interpolator.end.time, 15 * gst.SECOND) self.failUnlessEqual(round(interpolator.end.value, 6), round((15.0 / 6) - (7.0 / 3), 6))
def testLoadTrackSource(self): # create fake document tree element = Element("track-object", type="pitivi.timeline.track.SourceTrackObject", start=ts(1 * gst.SECOND), duration=ts(10 * gst.SECOND), in_point=ts(5 * gst.SECOND), media_duration=ts(15 * gst.SECOND), priority=ts(5), id="1") factory_ref = SubElement(element, "factory-ref", id="1") stream_ref = SubElement(element, "stream-ref", id="1") # insert our fake factory into the context factory = AudioTestSourceFactory() factory.duration = 10 * gst.SECOND self.formatter._context.factories["1"] = factory # insert fake stream into the context stream = AudioStream(gst.Caps("audio/x-raw-int")) self.formatter._context.streams["1"] = stream # add a volume curve curves = SubElement(element, "curves") curve = SubElement(curves, "curve", property="volume", version="1") expected = dict( (long(t * gst.SECOND), (float(t % 2), gst.INTERPOLATE_LINEAR)) for t in xrange(1, 10)) start = SubElement(curve, "start", value="0.0", mode="2") for time, (value, mode) in expected.iteritems(): SubElement(curve, "keyframe", time=str(time), value=str(value), mode=str(mode)) end = SubElement(curve, "end", value=str(10 % 2), mode="2") track = Track(stream) # point gun at foot; pull trigger track_object = self.formatter._loadTrackObject(track, element) self.failUnless(isinstance(track_object, SourceTrackObject)) self.failUnlessEqual(track_object.factory, factory) self.failUnlessEqual(track_object.stream, stream) self.failUnlessEqual(track_object.start, 1 * gst.SECOND) self.failUnlessEqual(track_object.duration, 10 * gst.SECOND) self.failUnlessEqual(track_object.in_point, 5 * gst.SECOND) self.failUnlessEqual(track_object.media_duration, 15 * gst.SECOND) self.failUnlessEqual(track_object.priority, 5) self.failIfEqual(track_object.interpolators, None) interpolator = track_object.getInterpolator("volume") self.failIfEqual(interpolator, None) curve = dict(((kf.time, (kf.value, kf.mode)) for kf in interpolator.getInteriorKeyframes())) self.failUnlessEqual(curve, expected) self.failUnlessEqual(interpolator.start.value, 0.0) self.failUnlessEqual(interpolator.start.time, 5 * gst.SECOND) self.failUnlessEqual(interpolator.end.value, 0.0) self.failUnlessEqual(interpolator.end.time, 15 * gst.SECOND)