1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2013 MediaGoblin contributors. See AUTHORS.
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 from contextlib
import contextmanager
21 gi
.require_version('Gst', '1.0')
22 from gi
.repository
import Gst
26 def create_av(make_video
=False, make_audio
=False):
27 'creates audio/video in `path`, throws AssertionError on any error'
28 media
= tempfile
.NamedTemporaryFile(suffix
='.ogg')
29 pipeline
= Gst
.Pipeline()
30 mux
= Gst
.ElementFactory
.make('oggmux', 'mux')
33 video_src
= Gst
.ElementFactory
.make('videotestsrc', 'video_src')
34 video_src
.set_property('num-buffers', 20)
35 video_enc
= Gst
.ElementFactory
.make('theoraenc', 'video_enc')
36 pipeline
.add(video_src
)
37 pipeline
.add(video_enc
)
38 assert video_src
.link(video_enc
)
39 assert video_enc
.link(mux
)
41 audio_src
= Gst
.ElementFactory
.make('audiotestsrc', 'audio_src')
42 audio_src
.set_property('num-buffers', 20)
43 audio_enc
= Gst
.ElementFactory
.make('vorbisenc', 'audio_enc')
44 pipeline
.add(audio_src
)
45 pipeline
.add(audio_enc
)
46 assert audio_src
.link(audio_enc
)
47 assert audio_enc
.link(mux
)
48 sink
= Gst
.ElementFactory
.make('filesink', 'sink')
49 sink
.set_property('location', media
.name
)
52 pipeline
.set_state(Gst
.State
.PLAYING
)
53 state
= pipeline
.get_state(Gst
.SECOND
)
54 assert state
[0] == Gst
.StateChangeReturn
.SUCCESS
55 bus
= pipeline
.get_bus()
56 message
= bus
.timed_pop_filtered(
57 Gst
.SECOND
, # one second should be more than enough for 50-buf vid
58 Gst
.MessageType
.ERROR | Gst
.MessageType
.EOS
)
59 assert message
.type == Gst
.MessageType
.EOS
60 pipeline
.set_state(Gst
.State
.NULL
)