Testing pipeline completed.
[libre-streamer.git] / stream_2016 / gstconf.py
index fa9a63f64ebd366885503d078cfb72869e8d18dc..5d016d1a56dd31b4463105cafcc70f300982304c 100755 (executable)
@@ -1,6 +1,8 @@
 #!/usr/bin/env python3.4
+# -*- coding: utf-8 -*-
 
 # This file is part of ABYSS.
+# ABYSS Broadcast Your Streaming Successfully 
 #
 # ABYSS is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -41,19 +43,22 @@ INFO = '[INFO] '
 WARN = '[WARN] '
 
 AUDIO_INPUT = 'alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00-CODEC.analog-stereo'
+AUDIO_OUTPUT = 'alsa_output.pci-0000_00_1b.0.analog-stereo'
 
 
 class New_user_pipeline():
 
     
-    def __init__(self, feed='main'):
+    def __init__(self, rtsp_address, feed='main'):
+        self.rtsp_address = 'rtsp://' + rtsp_address
         self.feed = feed
         self.user_pipeline = self.create_gstreamer_pipeline()
             
     def create_video_sources(self):
         """Create video inputs from various sources."""
         self.videosrc = Gst.ElementFactory.make('rtspsrc', 'videosrc')
-        self.videosrc.set_property('location', 'rtsp://192.168.48.2:554')
+        self.videosrc.set_property('location', self.rtsp_address)
+##        self.videosrc.set_property('location', 'rtsp://192.168.48.2:554')
         self.videosrc.set_property('latency', 0)
 ##        self.videosrc.set_property('debug', True)
         if self.feed == 'backup':
@@ -120,6 +125,10 @@ class New_user_pipeline():
         # To local screen:
         self.screensink = Gst.ElementFactory.make('xvimagesink', 'screensink')
         self.screensink.set_property('sync', False)
+        # To local audio output (headphones):
+        self.audiosink = Gst.ElementFactory.make('pulsesink', 'audiosink')
+        self.audiosink.set_property('device', AUDIO_OUTPUT)
+        self.audiosink.set_property('sync', False)
         # To icecast server:
         self.icecastsink_audio = Gst.ElementFactory.make('shout2send', 'icecastsink_audio')
         self.icecastsink_audio.set_property('sync', False)
@@ -245,6 +254,8 @@ class New_user_pipeline():
         # Output elements:
         self.create_filesink()
         self.create_streamsink()
+        if self.feed == 'test':
+            print('TEST OK...', end='')
         print('created')
         if self.feed == 'backup':
             print (INFO,
@@ -255,38 +266,45 @@ class New_user_pipeline():
 
     def add_elements_to_pipeline(self):
         print(INFO, gettime(), 'Pipeline creation state: adding elements... ', end='')        
+        cond = self.feed != 'test'
+
         # Inputs elements:
         self.streampipe.add(self.audiosrc)
         # Middle elements:
         self.streampipe.add(self.audiolevel)
-        self.streampipe.add(self.vorbisenc)
-        self.streampipe.add(self.vp8enc)
-        self.streampipe.add(self.mkvmux)
-        self.streampipe.add(self.oggmux)
-        self.streampipe.add(self.webmmux)
-        self.streampipe.add(self.tee_rawaudio)
-        self.streampipe.add(self.tee_rawvideo)
-        self.streampipe.add(self.tee_streamaudio)
-        self.streampipe.add(self.tee_streamfull)
-        self.streampipe.add(self.queuev_2)
-        self.streampipe.add(self.queuev_3)
-        self.streampipe.add(self.queuev_4)
-        self.streampipe.add(self.queuev_5)
         self.streampipe.add(self.queuea_1)
-        self.streampipe.add(self.queuea_2)
-        self.streampipe.add(self.queuea_3)
-        self.streampipe.add(self.queuea_4)
-        self.streampipe.add(self.queuea_5)
-        self.streampipe.add(self.queuem_1)
-        self.streampipe.add(self.queuem_2)
+        self.streampipe.add(self.queuev_3)
+        if cond: 
+            self.streampipe.add(self.vorbisenc)
+            self.streampipe.add(self.oggmux)
+            self.streampipe.add(self.queuea_2)
+            self.streampipe.add(self.queuea_3)
+            self.streampipe.add(self.vp8enc)
+            self.streampipe.add(self.mkvmux)
+            self.streampipe.add(self.webmmux)
+            self.streampipe.add(self.tee_rawaudio)
+            self.streampipe.add(self.tee_rawvideo)
+            self.streampipe.add(self.tee_streamaudio)
+            self.streampipe.add(self.tee_streamfull)
+            self.streampipe.add(self.queuev_2)
+            self.streampipe.add(self.queuev_4)
+            self.streampipe.add(self.queuev_5)
+            self.streampipe.add(self.queuea_4)
+            self.streampipe.add(self.queuea_5)
+            self.streampipe.add(self.queuem_1)
+            self.streampipe.add(self.queuem_2)
         # Outputs elements:
         self.streampipe.add(self.screensink)
-        self.streampipe.add(self.disksink_rawvideo)
-        self.streampipe.add(self.disksink_audio)
-        self.streampipe.add(self.disksink_stream)
-        self.streampipe.add(self.icecastsink_audio)
-        self.streampipe.add(self.icecastsink_stream)
-        if self.feed == 'main':
+        if cond:
+            self.streampipe.add(self.disksink_rawvideo)
+            self.streampipe.add(self.disksink_audio)
+            self.streampipe.add(self.disksink_stream)
+            self.streampipe.add(self.icecastsink_audio)
+            self.streampipe.add(self.icecastsink_stream)
+        else:
+            self.streampipe.add(self.audiosink)
+
+        if self.feed == 'main' or self.feed == 'test':
             # Inputs elements:
             self.streampipe.add(self.videosrc)
             # Middle elements:
@@ -296,6 +314,8 @@ class New_user_pipeline():
             self.streampipe.add(self.capsfilter)
             self.streampipe.add(self.tee_videodecoded)
             self.streampipe.add(self.queuev_1)
+            if self.feed == 'test':
+                print ('TEST OK...', end='')
         elif self.feed == 'backup':
             # Inputs elements:
             self.streampipe.add(self.videosrc_backup)
@@ -307,62 +327,75 @@ class New_user_pipeline():
     def link_pipeline_elements(self):
         """Link all elements with static pads."""
         print(INFO, gettime(), 'Pipeline creation state: linking elements... ', end='')
+        cond = self.feed != 'test'
+        
         # Audio feed:
         self.audiosrc.link(self.audiolevel)
         self.audiolevel.link(self.queuea_1)
-        self.queuea_1.link(self.vorbisenc)
-        self.connect_tee(self.tee_rawaudio,
-                         self.vorbisenc,
-                         self.queuea_2,
-                         self.queuea_5,)
-        self.queuea_2.link(self.oggmux)
-        self.connect_tee(self.tee_streamaudio,
-                         self.oggmux,
-                         self.queuea_3,
-                         self.queuea_4,)
-        self.queuea_3.link(self.disksink_audio)
-        self.queuea_4.link(self.icecastsink_audio)
-        self.queuea_5.link(self.webmmux)
+        if cond:
+            self.queuea_1.link(self.vorbisenc)
+            self.connect_tee(self.tee_rawaudio,
+                             self.vorbisenc,
+                             self.queuea_2,
+                             self.queuea_5,)
+            self.queuea_2.link(self.oggmux)
+            self.connect_tee(self.tee_streamaudio,
+                             self.oggmux,
+                             self.queuea_3,
+                             self.queuea_4,)
+            self.queuea_3.link(self.disksink_audio)
+            self.queuea_4.link(self.icecastsink_audio)
+            self.queuea_5.link(self.webmmux)
+        else:
+            self.queuea_1.link(self.audiosink)
+            
         # Video feed:
-        self.queuev_2.link(self.mkvmux)
-        self.mkvmux.link(self.queuev_4)
-        self.queuev_4.link(self.disksink_rawvideo)
+        if cond:
+            self.queuev_2.link(self.mkvmux)
+            self.mkvmux.link(self.queuev_4)
+            self.queuev_4.link(self.disksink_rawvideo)
+        else:
+            self.queuev_1.link(self.rtpjpegdepay)
+            self.rtpjpegdepay.link(self.jpegdec)
+            self.jpegdec.link(self.queuev_3)
         self.queuev_3.link(self.screensink)
+
         # Stream (audio+video) feed:
-        self.vp8enc.link(self.queuev_5)
-        self.queuev_5.link(self.webmmux)
-        self.connect_tee(self.tee_streamfull,
-                         self.webmmux,
-                         self.queuem_1,
-                         self.queuem_2,)
-        self.queuem_1.link(self.disksink_stream)
-        self.queuem_2.link(self.icecastsink_stream)
-        if self.feed == 'main':
-            # linking here RTSP feed
-            self.queuev_1.link(self.rtpjpegdepay)
-            self.connect_tee(self.tee_rawvideo,
-                             self.rtpjpegdepay,
-                             self.queuev_2,
-                             self.jpegdec,)
-            self.connect_tee(self.tee_videodecoded,
-                             self.jpegdec,
-                             self.queuev_3,
-                             self.scaling,)
-            # Stream (video) feed:
-            self.scaling.link(self.capsfilter)
-            self.capsfilter.link(self.vp8enc)
-            
-        elif self.feed == 'backup':
-            # linking here backup feed (WEBCAM)
-            self.videosrc_backup.link(self.capsfilter_backup)
-            self.connect_tee(self.tee_rawvideo,
-                             self.capsfilter_backup,
-                             self.queuev_2,
-                             self.queuev_3,
-                             output_element_3=self.vp8enc)
+        if cond:
+            self.vp8enc.link(self.queuev_5)
+            self.queuev_5.link(self.webmmux)
+            self.connect_tee(self.tee_streamfull,
+                             self.webmmux,
+                             self.queuem_1,
+                             self.queuem_2,)
+            self.queuem_1.link(self.disksink_stream)
+            self.queuem_2.link(self.icecastsink_stream)
+            if self.feed == 'main':
+                # linking here RTSP feed
+                self.queuev_1.link(self.rtpjpegdepay)
+                self.connect_tee(self.tee_rawvideo,
+                                 self.rtpjpegdepay,
+                                 self.queuev_2,
+                                 self.jpegdec,)
+                self.connect_tee(self.tee_videodecoded,
+                                 self.jpegdec,
+                                 self.queuev_3,
+                                 self.scaling,)
+                # Stream (video) feed:
+                self.scaling.link(self.capsfilter)
+                self.capsfilter.link(self.vp8enc)            
+            elif self.feed == 'backup':
+                # linking here backup feed (WEBCAM)
+                self.videosrc_backup.link(self.capsfilter_backup)
+                self.connect_tee(self.tee_rawvideo,
+                                 self.capsfilter_backup,
+                                 self.queuev_2,
+                                 self.queuev_3,
+                                 output_element_3=self.vp8enc)
 ##            self.capsfilter_backup.link(self.queuev_3)
-            # Stream (video) feed:
-            print('BACKUP OK...', end='')
+                print('BACKUP OK...', end='')
+        if not cond:
+            print('TEST OK...', end='')
         print('linked')
 
     def create_gstreamer_pipeline(self):
@@ -372,7 +405,7 @@ class New_user_pipeline():
         # Setting-up:
         self.add_elements_to_pipeline()
         self.link_pipeline_elements()
-        if self.feed == 'main':
+        if self.feed == 'main' or self.feed == 'test':
             self.create_pipeline_callbacks()
 
         global bus
@@ -386,16 +419,12 @@ class New_user_pipeline():
         return self.streampipe
 
     def on_message(self, bus, message):
-        #
-##        print("[MESSAGE]", message.get_structure().get_name()) # [DEBUG]
-        #
         t = message.type
         if t == Gst.MessageType.EOS:
             self.streampipe.set_state(Gst.State.NULL)
         elif t == Gst.MessageType.ERROR:
             err, debug = message.parse_error()
             print (ERROR, '%s' % err, debug)
-#            self.streampipe.set_state(Gst.State.NULL)
             
     def stream_play(self):
         self.streampipe.set_state(Gst.State.PLAYING)