예제 #1
0
    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))
예제 #2
0
    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)
예제 #3
0
    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 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()
예제 #5
0
    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)
예제 #6
0
파일: track.py 프로젝트: dparker18/Pitivi
    def _getDefaultAudioTrackObject(self, stream):
        factory = AudioTestSourceFactory(wave='silence')
        track_object = SourceTrackObject(factory, stream)

        return track_object
예제 #7
0
    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)
예제 #8
0
    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))
예제 #9
0
    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)