mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-26 02:19:26 +01:00
wfd-source: Support wfd-idr-request
This commit is contained in:
parent
bfa670d4ef
commit
8016658618
@ -21,7 +21,7 @@ import gi
|
|||||||
gi.require_version('GLib', '2.0')
|
gi.require_version('GLib', '2.0')
|
||||||
gi.require_version('Gst', '1.0')
|
gi.require_version('Gst', '1.0')
|
||||||
gi.require_version('Gtk', '3.0')
|
gi.require_version('Gtk', '3.0')
|
||||||
from gi.repository import GLib, Gst, Gtk, Gdk, Pango
|
from gi.repository import GLib, Gst, Gtk, Gdk, Pango, GObject
|
||||||
|
|
||||||
class WFDRTSPServer:
|
class WFDRTSPServer:
|
||||||
class RTSPException(Exception):
|
class RTSPException(Exception):
|
||||||
@ -325,7 +325,21 @@ class WFDRTSPServer:
|
|||||||
elif method == 'TEARDOWN' and target != self.session_stream_url:
|
elif method == 'TEARDOWN' and target != self.session_stream_url:
|
||||||
self.error('Unknown target "' + target + '" in TEARDOWN request')
|
self.error('Unknown target "' + target + '" in TEARDOWN request')
|
||||||
elif method == 'SET_PARAMETER':
|
elif method == 'SET_PARAMETER':
|
||||||
pass
|
params = []
|
||||||
|
names = []
|
||||||
|
for line in content.split(b'\r\n'):
|
||||||
|
param = (line.decode('utf8').strip(), None)
|
||||||
|
if not param[0]:
|
||||||
|
continue
|
||||||
|
if ':' in param[0]:
|
||||||
|
k, v = param[0].split(':', 1)
|
||||||
|
param = (k.strip(), v.strip())
|
||||||
|
if param[0] in names:
|
||||||
|
self.error('Duplicate key "' + param[0] + '" in SET_PARAMETER response')
|
||||||
|
|
||||||
|
names.append(param[0])
|
||||||
|
params.append(param)
|
||||||
|
self.last_params = params
|
||||||
|
|
||||||
def request(self, method, target, require=[], params=[]):
|
def request(self, method, target, require=[], params=[]):
|
||||||
content = ''
|
content = ''
|
||||||
@ -437,17 +451,17 @@ class WFDRTSPServer:
|
|||||||
self.debug('Gstreamer message of type ' + str(t) + ' for ' + message.src.name + ': ' + str(message))
|
self.debug('Gstreamer message of type ' + str(t) + ' for ' + message.src.name + ': ' + str(message))
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def gst_force_keyframe(self):
|
def force_keyframe(self):
|
||||||
enc = self.rtp_pipeline.get_by_name('videnc')
|
enc = self.rtp_pipeline.get_by_name('videnc')
|
||||||
sink = enc.get_static_pad('sink')
|
sink = enc.get_static_pad('sink')
|
||||||
timestamp = Gst.CLOCK_TIME_NONE # can/should we use sink.query_position?
|
timestamp = Gst.CLOCK_TIME_NONE # can/should we use sink.query_position?
|
||||||
|
|
||||||
s = Gst.Structure('GstForceKeyUnit')
|
s = Gst.Structure('GstForceKeyUnit')
|
||||||
s.set_value('timestamp', timestamp, 'uint64')
|
s.set_value('timestamp', GObject.Value(GObject.TYPE_UINT64, timestamp))
|
||||||
s.set_value('stream-time', timestamp, 'uint64')
|
s.set_value('stream-time', GObject.Value(GObject.TYPE_UINT64, timestamp))
|
||||||
s.set_value('all-headers', True)
|
s.set_value('all-headers', GObject.Value(GObject.TYPE_BOOLEAN, True))
|
||||||
# TODO: can we also send this event directly to the element instead of the pad?
|
# TODO: can we also send this event directly to the element instead of the pad?
|
||||||
sink.send_event(Gst.event_new_custom(Gst.EVENT_CUSTOM_DOWNSTREAM, s))
|
sink.send_event(Gst.Event.new_custom(Gst.EventType.CUSTOM_DOWNSTREAM, s))
|
||||||
|
|
||||||
def rtsp_keepalive_timeout_cb(self):
|
def rtsp_keepalive_timeout_cb(self):
|
||||||
try:
|
try:
|
||||||
@ -585,9 +599,13 @@ class WFDRTSPServer:
|
|||||||
self.response()
|
self.response()
|
||||||
return
|
return
|
||||||
if method == 'SET_PARAMETER':
|
if method == 'SET_PARAMETER':
|
||||||
# TODO: parse the stuff, on 'wfd-idr-request\r\n' (no semicolon) call the following:
|
self.validate_msg(method, 'SET_PARAMETER', status, reason, headers, target, content)
|
||||||
self.gst_force_keyframe()
|
for k, v in self.last_params:
|
||||||
|
if k == 'wfd_idr_request' and v is None:
|
||||||
|
self.force_keyframe()
|
||||||
self.response()
|
self.response()
|
||||||
|
else:
|
||||||
|
self.error('Unknown request "' + k + '" with value ' + repr(v))
|
||||||
return
|
return
|
||||||
if method == 'TEARDOWN':
|
if method == 'TEARDOWN':
|
||||||
# The spec suggests a more graceful teardown but we just close the connection
|
# The spec suggests a more graceful teardown but we just close the connection
|
||||||
|
Loading…
Reference in New Issue
Block a user