Esempio n. 1
0
File: bus.py Progetto: mdegans/mce
def on_message(bus: Gst.Bus,
               message: Gst.Message,
               app,
               ) -> bool:
    """Callback for handling bus messages"""
    # TAG and DURATION_CHANGED seem to be the most common
    if message.type == Gst.MessageType.TAG:
        pass
    elif message.type == Gst.MessageType.DURATION_CHANGED:
        pass
    elif message.type == Gst.MessageType.STREAM_STATUS:
        status, owner = message.parse_stream_status()  # type: Gst.StreamStatusType, Gst.Element
        logger.debug(f"{owner.name}:status:{status.value_name}")
    elif message.type == Gst.MessageType.STATE_CHANGED:
        old, new, pending = message.parse_state_changed()  # type: Gst.State, Gst.State, Gst.State
        logger.debug(
            f"{message.src.name}:state-change:"
            f"{old.value_name}->{new.value_name}")
    elif message.type == Gst.MessageType.EOS:
        logger.debug(f"Got EOS")
        app.quit()
    elif message.type == Gst.MessageType.ERROR:
        err, errmsg = message.parse_error()  # type: GLib.Error, str
        logger.error(f'{err}: {errmsg}')
        app.quit()
    elif message.type == Gst.MessageType.WARNING:
        err, errmsg = message.parse_warning()  # type: GLib.Error, str
        logger.warning(f'{err}: {errmsg}')
    else:
        if mce.DEBUG:
            logger.debug(
                f"{message.src.name}:{Gst.MessageType.get_name(message.type)}")
    return True
Esempio n. 2
0
 def on_message(self, _, message: Gst.Message):
     """Handles messages from the stream"""
     if message.type == Gst.MessageType.EOS:
         # Handle End of Stream
         self.quit()
     elif message.type == Gst.MessageType.ERROR:
         err, debug = message.parse_error()
         logging.error(err, debug)
     elif message.type == Gst.MessageType.WARNING:
         err, debug = message.parse_warning()
         logging.warning(err, debug)
     return True
Esempio n. 3
0
 def on_message(self, bus: Gst.Bus, message: Gst.Message):
     """Handles messages from the stream"""
     if message.type == Gst.MessageType.EOS:
         # Handle End of Stream
         self.EOS.set()
         self.quit()
     elif message.type == Gst.MessageType.ERROR:
         err, debug = message.parse_error()
         print(err, debug)
     elif message.type == Gst.MessageType.WARNING:
         err, debug = message.parse_warning()
         print(err, debug)
     return True
def bus_call(bus: Gst.Bus, message: Gst.Message, loop: GLib.MainLoop):
    t = message.type
    if t == Gst.MessageType.EOS:
        sys.stdout.write("End-of-stream\n")
        loop.quit()
    elif t == Gst.MessageType.ERROR:
        err, debug = message.parse_error()
        sys.stderr.write("Error: %s: %s\n" % (err, debug))
        loop.quit()
    elif t == Gst.MessageType.WARNING:
        # Handle warnings
        err, debug = message.parse_warning()
        sys.stderr.write("Warning: %s: %s\n" % (err, debug))
    return True
Esempio n. 5
0
def on_message(bus: Gst.Bus, message:Gst.Message, loop: GLib.MainLoop):
    mtype = message.type
    if mtype == Gst.MessageType.EOS:
        print('End Of Stream')
        loop.quit()
    elif mtype == Gst.MessageType.ERROR:
        err, debug = message.parse_error()
        print(err, debug)
        loop.quit()
    elif mtype == Gst.MessageType.WARNING:
        err, debug = message.parse_warning()
        print(err, debug)
    
    return True
Esempio n. 6
0
 def _on_async_done(self, bus: Gst.Bus, message: Gst.Message) -> None:
     """
     Handler for `async_done` messages
     By default, it will pop any futures available in `self.futures`
     and call their result.
     """
     msg = message.parse_async_done()
     logger.debug("Unhandled ASYNC_DONE message: %s on %s", msg, bus)
def on_message(bus: Gst.Bus, message: Gst.Message, loop: GObject.MainLoop):
    mtype = message.type
    """
        Gstreamer Message Types and how to parse
        https://lazka.github.io/pgi-docs/Gst-1.0/flags.html#Gst.MessageType
    """
    if mtype == Gst.MessageType.EOS:
        print("End of stream")
        loop.quit()

    elif mtype == Gst.MessageType.ERROR:
        err, debug = message.parse_error()
        print(err, debug)
        loop.quit()
    elif mtype == Gst.MessageType.WARNING:
        err, debug = message.parse_warning()
        print(err, debug)

    return True
Esempio n. 8
0
 def on_qos(self, bus: Gst.Bus, message: Gst.Message) -> None:
     """
     Handler for `qos` messages
     By default it will parse the error message,
     log to `error` and append to `self.errors`
     """
     live, running_time, stream_time, timestamp, duration = message.parse_qos(
     )
     logger.warning(
         "Qos message: live:%s - running:%s - stream:%s - timestamp:%s - duration:%s received from %s on %s",
         live, running_time, stream_time, timestamp, duration,
         message.src.get_name(), bus)
Esempio n. 9
0
def on_message(_: Gst.Bus, message: Gst.Message, loop: GObject.MainLoop):
    message_type = message.type
    if message_type == Gst.MessageType.EOS:
        print("End of stream")
        loop.quit()

    elif message_type == Gst.MessageType.ERROR:
        err, debug = message.parse_error()
        print(err, debug)
        loop.quit()

    return True
Esempio n. 10
0
    def msg_handler(self, _bus: Gst.Bus, msg: Gst.Message) -> None:
        """Handle pipeline messages"""

        if msg.type == Gst.MessageType.EOS:
            print('End of stream, exiting', file=sys.stderr)
            self.quit()
        elif msg.type == Gst.MessageType.ERROR:
            print('Fatal error:', msg.parse_error(), file=sys.stderr)
            self.quit()
        elif msg.type == Gst.MessageType.CLOCK_LOST:
            print('Clock lost, resetting', file=sys.stderr)
            self._element.set_state(Gst.State.PAUSED)
            self._element.set_state(Gst.State.PLAYING)
Esempio n. 11
0
def __on_gst_message(bus, message: Gst.Message):
    """
    Handle messages from gst.
    """
    global __speed
    global __set_speed

    t = message.type
    if t == Gst.MessageType.BUFFERING:
        if (message.percentage < 100):
            __player.set_state(Gst.State.PAUSED)
            log.info("Buffering…")
        else:
            __player.set_state(Gst.State.PLAYING)
            log.info("Buffering finished.")
    elif t == Gst.MessageType.EOS:
        next_track()
    elif t == Gst.MessageType.ERROR:
        error, debug_msg = message.parse_error()

        if error.code == Gst.ResourceError.NOT_FOUND:
            stop()
            unload()
            emit_event("stop")

            log.warning("gst: Resource not found. Stopping player.")
            reporter.warning("player",
                             "gst: Resource not found. Stopping player.")
            return

        err, debug = message.parse_error()
        log.error(err)
        log.debug(debug)
        reporter.error("player", err)
        emit_event("error", err)
    elif t == Gst.MessageType.STATE_CHANGED:
        state = get_gst_player_state()
        if state == Gst.State.PLAYING or state == Gst.State.PAUSED:
            auto_jump()
Esempio n. 12
0
 def on_device_monitor_message(self, bus: Gst.Bus, message: Gst.Message,
                               user_data):
     logger.debug('Message: {}', message)
     # A private GstV4l2Device or GstPipeWireDevice type
     if message.type == Gst.MessageType.DEVICE_ADDED:
         added_dev: Optional[Gst.Device] = message.parse_device_added()
         if not added_dev:
             return True
         logger.debug('Added: {}', added_dev)
         cam_path = get_device_path(added_dev)
         cam_name = added_dev.get_display_name()
         # Check if this cam already in the list, add to list if not.
         for row in self.webcam_store:
             if row[0] == cam_path:
                 break
         else:
             self.webcam_store.append((cam_path, cam_name))
         return True
     elif message.type == Gst.MessageType.DEVICE_REMOVED:
         removed_dev: Optional[Gst.Device] = message.parse_device_removed()
         if not removed_dev:
             return True
         logger.debug('Removed: {}', removed_dev)
         cam_path = get_device_path(removed_dev)
         ppl_source = self.gst_pipeline.get_by_name(self.GST_SOURCE_NAME)
         if cam_path == ppl_source.get_property('device'):
             self.gst_pipeline.set_state(Gst.State.NULL)
         # Find the entry of just-removed in the list and remove it.
         itr: Optional[Gtk.TreeIter] = None
         for row in self.webcam_store:
             logger.debug('Row: {}', row)
             if row[0] == cam_path:
                 itr = row.iter
                 break
         if itr:
             logger.debug('To remove {} from list', cam_path)
             self.webcam_store.remove(itr)
     return True
Esempio n. 13
0
    def on_error(self, bus: Gst.Bus, message: Gst.Message) -> None:
        """
        Handler for `error` messages
        By default it will parse the error message,
        log to `error` and append to `self.errors`
        """
        err, debug = message.parse_error()
        logger.error("Error received from element %s:%s on %s",
                     message.src.get_name(), err.message, bus)
        if debug is not None:
            logger.error("Debugging information: %s", debug)

        self.teardown()
        self.events.error.set()
Esempio n. 14
0
    def _on_state_changed(self, bus: Gst.Bus, message: Gst.Message) -> None:  # pylint: disable=unused-argument
        """
        Handler for `state_changed` messages
        By default will only log to `debug`
        """
        old, new, _ = message.parse_state_changed()

        if message.src != self.pipeline:
            return
        logger.info(
            "State changed from %s to %s",
            Gst.Element.state_get_name(old),
            Gst.Element.state_get_name(new),
        )

        self.events.pick_state(new)
def bus_call(bus: Gst.Bus, message: Gst.Message, loop: GLib.MainLoop):
    # https://stackoverflow.com/questions/49858346/how-te-retrieve-stream-statistics-in-gstreamer
    t = message.type
    sys.stdout.write("Received message from -> %s \n" % (message.src.name))
    if t == Gst.MessageType.EOS:
        sys.stdout.write("End-of-stream\n")
    elif t == Gst.MessageType.ERROR:
        err, debug = message.parse_error()
        sys.stderr.write("Error: %s: %s\n" % (err, debug))
    elif t == Gst.MessageType.WARNING:
        # Handle warnings
        err, debug = message.parse_warning()
        sys.stderr.write("Warning: %s: %s\n" % (err, debug))
    # https://git.smart-cactus.org/ben/cam-stream/blob/0483fa5d3bb82e8a4212d7190d4541ed4d0653d5/stream.py
    elif t == Gst.MessageType.STATE_CHANGED:
        sys.stderr.write('state changed: %s\n' %
                         (message.parse_state_changed(), ))
    elif t == Gst.MessageType.STREAM_STATUS:
        sys.stderr.write('stream status: %s\n' %
                         (message.parse_stream_status(), ))
    elif t == Gst.MessageType.QOS:
        # Handle Qus
        live, running_time, stream_time, timestamp, duration = message.parse_qos(
        )
        #sys.stderr.write("Qos Message: live %r, running_time %i, stream_time %i, timestamp: %i, duration: %i \n" % (live, running_time, stream_time, timestamp, duration))
        #sys.stderr.write('qos: %s' % (message.parse_qos(),))
    elif t == Gst.MessageType.ELEMENT:
        sys.stderr.write('Element message: %s\n' %
                         (message.get_structure().to_string(), ))
    elif t == Gst.MessageType.BUFFERING:
        sys.stderr.write('Buffering message: %s\n' %
                         (message.get_structure().to_string(), ))
    elif t == Gst.MessageType.PROGRESS:
        sys.stderr.write('Progress message: %s\n' %
                         (message.get_structure().to_string(), ))
    else:
        sys.stderr.write('Bus message: %s: %s \n' % (message.timestamp, t))
        pprint(message)
    return True
Esempio n. 16
0
 def on_warning(self, bus: Gst.Bus, message: Gst.Message):
     warn, debug = message.parse_warning()
     self.log.warning("Gstreamer.%s: %s. %s", self, warn, debug)
Esempio n. 17
0
 def on_error(self, bus: Gst.Bus, message: Gst.Message):
     err, debug = message.parse_error()
     self.log.error("Gstreamer.%s: Error %s: %s. ", self, err, debug)
     self._shutdown_pipeline()