2020-02-12 10:56:34 +00:00
|
|
|
# Copyright (c) 2020, Matthew Waters <matthew@centricular.com>
|
2018-12-17 11:34:10 +00:00
|
|
|
#
|
|
|
|
# This program is free software; you can redistribute it and/or
|
|
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
|
|
# License as published by the Free Software Foundation; either
|
|
|
|
# version 2.1 of the License, or (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
# Lesser General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
|
|
# License along with this program; if not, write to the
|
|
|
|
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
|
|
# Boston, MA 02110-1301, USA.
|
|
|
|
|
|
|
|
import gi
|
|
|
|
gi.require_version("GstValidate", "1.0")
|
|
|
|
from gi.repository import GstValidate
|
|
|
|
|
|
|
|
from observer import Signal
|
2020-02-12 10:56:34 +00:00
|
|
|
from enums import Actions
|
|
|
|
|
|
|
|
import logging
|
|
|
|
|
|
|
|
l = logging.getLogger(__name__)
|
2018-12-17 11:34:10 +00:00
|
|
|
|
|
|
|
class ActionObserver(object):
|
|
|
|
def __init__(self):
|
|
|
|
def _action_continue(val):
|
|
|
|
return val not in [GstValidate.ActionReturn.ERROR, GstValidate.ActionReturn.ERROR_REPORTED]
|
|
|
|
def _action_accum(previous, val):
|
|
|
|
# we want to always keep any errors propagated
|
|
|
|
if val in [GstValidate.ActionReturn.ERROR, GstValidate.ActionReturn.ERROR_REPORTED]:
|
|
|
|
return val
|
|
|
|
if previous in [GstValidate.ActionReturn.ERROR, GstValidate.ActionReturn.ERROR_REPORTED]:
|
|
|
|
return previous
|
|
|
|
|
|
|
|
# we want to always prefer async returns
|
|
|
|
if previous in [GstValidate.ActionReturn.ASYNC, GstValidate.ActionReturn.INTERLACED]:
|
|
|
|
return previous
|
|
|
|
if val in [GstValidate.ActionReturn.ASYNC, GstValidate.ActionReturn.INTERLACED]:
|
|
|
|
return val
|
|
|
|
|
|
|
|
return val
|
|
|
|
|
2020-02-12 10:56:34 +00:00
|
|
|
self.action = Signal(_action_continue, _action_accum)
|
|
|
|
|
|
|
|
def _action(self, scenario, action):
|
|
|
|
l.debug('executing action: ' + str(action.structure))
|
|
|
|
return self.action.fire (Actions(action.structure.get_name()), action)
|
2018-12-17 11:34:10 +00:00
|
|
|
|
|
|
|
|
2020-02-12 10:56:34 +00:00
|
|
|
def register_action_types(observer):
|
|
|
|
if not isinstance(observer, ActionObserver):
|
|
|
|
raise TypeError
|
2018-12-17 11:34:10 +00:00
|
|
|
|
2020-02-12 10:56:34 +00:00
|
|
|
GstValidate.register_action_type(Actions.CREATE_OFFER.value,
|
|
|
|
"webrtc", observer._action, None,
|
|
|
|
"Instruct a create-offer to commence",
|
|
|
|
GstValidate.ActionTypeFlags.NONE)
|
|
|
|
GstValidate.register_action_type(Actions.CREATE_ANSWER.value,
|
|
|
|
"webrtc", observer._action, None,
|
|
|
|
"Create answer",
|
|
|
|
GstValidate.ActionTypeFlags.NONE)
|
|
|
|
GstValidate.register_action_type(Actions.WAIT_FOR_NEGOTIATION_STATE.value,
|
|
|
|
"webrtc", observer._action, None,
|
|
|
|
"Wait for a specific negotiation state to be reached",
|
|
|
|
GstValidate.ActionTypeFlags.NONE)
|
|
|
|
GstValidate.register_action_type(Actions.ADD_STREAM.value,
|
|
|
|
"webrtc", observer._action, None,
|
|
|
|
"Add a stream to the webrtcbin",
|
|
|
|
GstValidate.ActionTypeFlags.NONE)
|
|
|
|
GstValidate.register_action_type(Actions.ADD_DATA_CHANNEL.value,
|
|
|
|
"webrtc", observer._action, None,
|
|
|
|
"Add a data channel to the webrtcbin",
|
|
|
|
GstValidate.ActionTypeFlags.NONE)
|
|
|
|
GstValidate.register_action_type(Actions.SEND_DATA_CHANNEL_STRING.value,
|
|
|
|
"webrtc", observer._action, None,
|
|
|
|
"Send a message using a data channel",
|
|
|
|
GstValidate.ActionTypeFlags.NONE)
|
|
|
|
GstValidate.register_action_type(Actions.WAIT_FOR_DATA_CHANNEL_STATE.value,
|
|
|
|
"webrtc", observer._action, None,
|
|
|
|
"Wait for data channel to reach state",
|
|
|
|
GstValidate.ActionTypeFlags.NONE)
|
|
|
|
GstValidate.register_action_type(Actions.CLOSE_DATA_CHANNEL.value,
|
|
|
|
"webrtc", observer._action, None,
|
|
|
|
"Close a data channel",
|
|
|
|
GstValidate.ActionTypeFlags.NONE)
|
|
|
|
GstValidate.register_action_type(Actions.WAIT_FOR_DATA_CHANNEL.value,
|
|
|
|
"webrtc", observer._action, None,
|
|
|
|
"Wait for a data channel to appear",
|
|
|
|
GstValidate.ActionTypeFlags.NONE)
|
|
|
|
GstValidate.register_action_type(Actions.WAIT_FOR_DATA_CHANNEL_STRING.value,
|
|
|
|
"webrtc", observer._action, None,
|
|
|
|
"Wait for a data channel to receive a message",
|
|
|
|
GstValidate.ActionTypeFlags.NONE)
|
|
|
|
GstValidate.register_action_type(Actions.WAIT_FOR_NEGOTIATION_NEEDED.value,
|
|
|
|
"webrtc", observer._action, None,
|
|
|
|
"Wait for a the on-negotiation-needed signal to fire",
|
|
|
|
GstValidate.ActionTypeFlags.NONE)
|
|
|
|
GstValidate.register_action_type(Actions.SET_WEBRTC_OPTIONS.value,
|
|
|
|
"webrtc", observer._action, None,
|
|
|
|
"Set some webrtc options",
|
|
|
|
GstValidate.ActionTypeFlags.NONE)
|