-
Notifications
You must be signed in to change notification settings - Fork 413
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WIP] Streaming to Microsoft Wireless Display dongle #391
Conversation
I made a quick test to start validating Microsoft Miracast implementation: using a windows 10 machine as source to this laptop hosting Miraclecast as sink is working fine. I'll have a look at gnome-network-displays as you suggested to see if I can find something :) |
I'd check if that allows to source screen to another miraclecast or gnome-network-displays (to remove the microsoft extension part for it) |
Thanks for your input, I installed miraclecast on a second laptop (let's call it Sink) to use it as a sink, but I don't know if this is a bug or a driver issue on it, but P2P group is very hard to setup; looks like sometimes they both act as GO at same time and start both DHCP server, or the contrary, with 2 DHCP client. This does not happen with Microsoft dongle as sink, or using a samsung tablet as source. Always the two laptops. Anyway, I managed to open a gstreamer link between Sink and Source, but had to make two small changes:
I can reproduce 100% of time the bad request issue with MS dongle; I started to tweak the parameters but not luck for now. I'll try to see if I can make a wireshark capture of RTSP exchange from a Windows machine. |
I've tested your fork / PR and am really happy to see Windows 10 "connect"/screen sharing working! Working flawlessly with:
|
Still some fixed properties needs to be retrieved from handshake to merge this |
Agreed! I don't have the time for now, I'll try to resume this work when I have some free time |
Signed-off-by: Andreas K. Hüttel <[email protected]>
Signed-off-by: Andreas K. Hüttel <[email protected]>
Signed-off-by: Andreas K. Hüttel <[email protected]>
fix byte order of DHCP_SERVER_ID option If miraclecat is GO, miracle-dhcp runs as server, it send out SERVER_ID option in little endian, causes non-GO peer connect to wrong IP address, so RTSP connection can't be established. In scenario like, say Android (GO) <-> miracalcast (non-GO), the DHCP service is provided by Android, in this case, the SERVER_ID is in expected byte order (big endian). set audio=False by default since gstplayer has argument --audio to enable audio support but no way to disable it, audio=False might a better choise. If we left audio=True and incoming stream has video only, the whole pipeline will be blocked and wait for audio stream. init copy & modify calculate array size of resolutions at build time instead of tailing null element match resolution from high to low init source side implementation add option [-f|--full-screen] to switch to full screen mode at start up initial sender implementation integrate miracle-sender with miracast-srcctl stop sender when peer freed source implement + sender talk via dbus miracle-wifid: fix some leaks of wpas_message stability: increase gcc warning level miracle-sender: change bus name from org.freedesktop.miracle.Sender to org.freedesktop.miracle gstplayer: set sync=false to reduce latency miracle-wifid: fix call waitid() with NULL pointer issue reported by valgrind rename dbus name back to org.freedesktop.miracle.Sender and variety kinds of tunning encode video with x264enc temperarily to prevent decoding issue on dongle stop sender properly after session end miracle-srcctl: fix memory management issues Make miracle-wifid conexists with other network tools The new option --lazy-managed will let miracle-wifid don't managed the links automatically. Instead, the link will be managed only when the new DBus property Managed was set to true. So this will be possible that miracle-wifid could be conexists with other network tools like networkmanager. For example, unmange the device in networkmanager with setting the DBus property org.freedesktop.NetworkManager.Device.Managed to false and manage it in miracle-wifid with setting org.freedesktop.miracle.wifi.Link.Managed to true, then both them could works and don't need to kill each other. Besides, there is new command named make-managed in miracle-wifictl and miracle-sinkctla. miracle-wifid: add dbus & systemd service files to support dbus activation miracle-wifid: remove duplicated link & peer dbus nodes by checking prefix miracle-srcctl: fix some warming miracle-wifid: add MACAddress property to link miracle-wfdctl: init commit miracle-*ctl: remove some debugging log messages miracle-*ctl: resolve object parsing issue in ctl_wifi_fetch() while parsing ctl_peer and ctl_link objects, if a ctl_peer appear prior to its related ctl_link, -EINVAL is reported, and miracle-*ctl will quit immediately. miracle-*ctl: fix label leak miracle-wifid: let the format of wfd_dev_info compliant with wfd_subelems to ease parsing miracle-*ctl: remove N_ELEMENTS() and use SHL_ARRAY_LENGTH() instead miracle-*ctl: rename resolution_bitmap to wfd_resolution and add progressive field remove vim settings from files miracle-srcctl: rename ctl_src to wfd_src miracle-wfdctl: first revision which can create TCP connection of WFD session between peers, controled through DBus In this revision, the procedure of session negotiation is not yet completed but only TCP connection can be established between peers. You can try it by run script `res/miracle-wfdctl-demo` to see how it work. miracle-wfdctl-demo: wait for property chainging and object apperance by busctl instead of sleep miracle-*ctl: update links and peers when wifid up or down miracle-wfdctl-demo: cleanup before exit ignore .vimrc from being managed by git miracle-wfdctl: now we can establish WFD session multiple times in this revision, the source side RTSP protocol is not implemented completely, the focus is on stability, DBus interfaces. add debian support prepared by Guo Shuang miracle-wfdctl-demo: add an optional argument to specify link index of NetworkManager miracle-wfdctl: refactoring to remove repeated snippets and centralize the dispatching of request and reply add -fstack-protector-strong to capture more stack issues add miraclecast.links to create symlink for DBus activated systemd services miracle-wfdctl: return -EINVAL instead of being aborted by assert() when rtsp message ID is invalid miracle-*ctl: add *_from_string() and *_to_string() for wfd-video-formats and wfd-audio-codecs miracle-wfdctl: finish migration of source side rtsp protocol remove unused files fix links of services for debian package move down trap command to prevent triggered by runing with no argument remove unused #include miracle-wfdctl: add timeout value and Range header to the reply of PLAY request test compiler flag -fstack-protector-strong before set miracle-wfdctl: run gst-launch to generate video stream with hardcoded environment miracle-wfdctl: fix return uninitialized variable value issue add struct wfd_arg to generalize passing of arguments miracle-*ctl: fix and enhance wfd_subelement parser miracle-wfdctl: remove unused function and improve log message for peer new & delete rename macro arguement from v to _v to prevent name confliction add support for signed and unsigned int for wfd_arg refactoring getter/setter for dict type of wfd_arg to remove declaration of temp variable add wfd_arg_list type of wfd_arg miracle_wfdctl: control flow and passing arguments with wfd_arg instead of keep adding new structure fields miracle-wfdctl: print friendly name when peer shows up miracle-wfdctl: fix mapping from rtsp_message to rtsp_message_id miracle-wfctl: reply 'request not implemented' instead of abort by assert() check gcc version to ensure c11 generic select feature update dependencies for debian based distro miracle-wfdctl: acquire DISPLAY, XAUTHORITY and XDG_RUNTIME_DIR from environment, instead of hardcode miracle-wfdctl: fix wfd_session_end() recursive calling issue miracle-wfdctl: add handler for PAUSE, PLAY and TEARDOWN methods miracle-wfdctl: clarify teardown procedure of session miracle-wfdctl: delay for 100ms before start sending stream to sink miracle-wfdctl: compare wfd-standby and wfd-idr-request by message body miracle-wfdctl: user now can select video mode through DBus interface miracle-wfdctl: fix typo in systemd service file miracle-wfdctl: change session type from uint64_t to unsigned int miracle-wfdctl: do not launch gstreamer if DO_NOT_LAUNCH_GST environment variable is set while miracle-wfdctl running miracle-wfdctl: remove unused Range header from reply add compiler flag to do sanity check of undefined behaviours. relax permissions checking to let non-privileged use miracalcast. we will enhance this by fine grained permission conrol latter. since we relaxed the permissions to talk to wifid and wfdctl, so there is no need to run miracle-wfdctl-demo with sudo. but to kill these two privileged services, the killall still need sudo miracle-wfdctl: integrate sd_event with GMainLoop for running gstreamer in process instead of fork n exec gst-launch miracle-wfdctl: encoding video stream with gstreamer library instead of gst-launch-1.0 miracle-wfdctl-demo: run tcpdump with sudo miracle-wifid: change managed property of link by method call instead of set property due to wpa_supplicant needs time to get ready miracle-wfdctl: include header <gst/gst.h> for resolving compiler warning miracle-wfdctl: add rtcp and audio supporting to gstreamer pipeline miracle-wfdctl: fix session removal dbus notification miracle-wfdctl: fix variety kinds of dbus interface issues miracle-wfdctl: fix sink removal notifcation fix typo in miracle-wifid.service miracle-wfdctl: set XAUTHORITY and DISPLAY before create gstreamer pipeline, and now we can pass device name to pulseaudio miraclw-wfdctl: fix typo of dbus signal names miraclw-wfdctl: now you can cast only specified xid or xname to sink miracle-wfdctl: fine tune gstreamer pipeline miracle-wfdctl: fix argument passing for ximagesrc miracle-wfdctl: send video only stream if no audio device specified update dependencies of systemd services miracle-wfdctl: reply rtsp request with date header in locale en_US.UTF-8 miracle-wrdctl-demo: capture packets on p2p wnic with tshark instead of tcpdump miracle-wfdctl: set ximagesrc as live mode to prvent it preroll in pause state miracle-wfdctl: fine tune codec to compliant with WFD spec + H264 profile/level miracle-wfdctl: disable audio encoding temparary miracle-wfdctl: save captured packets to .pcap file instead of print out on console update dependency information miracle-wfdctl: remove extra NULL parameter miracle-wfdctl: do not expose rtsp_message_id_to_string() to outside world miracle-wfdctl: handle gst messages and reflect state onto session miracle-wfdctl: encode audio with voaacenc instead of avenc_aac to get closer to WFD spec rename miracle-wfdctl to miracle-dispd change argument types of wfd_sink_start_session() To workaround valac issue miracle-wfdctl: fix pointer check issue add a demostration for wifid + dispd reorganize demo, make it looks like running in sequential instead of trigger by async events miracle-dispd: fix monitor geometry calculation issue remove miracle-wfdctl-demo, replaced by demo/miracle-wfdctl demo/miracle-wfdctl: fix some build issues for GDK version older then 3.22 update dependencies in debian/ for demo/ update cmake minimum requirement from 2.8 to 3.0.2 due to usage of version comparasion of if command check valac version to decide whether or not to use new Gdk.Monitor class add install() for demo/miracle-wfdctl add mission dependencies to debian/control miracle-dispd: merge patch from Meelis acquire ownership through Link.Manage()/Link.Unmanage() instead of set Link.Managed property demo/miracle-wfdctl: better handling session tearing down move definitions related to miracle-dispd from src/ctl to src/disp demo/miracle-wfdctl: handle SIGINT to exit gracefully miracle-dispd: relax checking for peer with empty wfd_subelements miracle-dispd: fix symlink for dbus-org.freedesktop.miracle.wfd.service which is an alias of miracle-dispd.service demo/miracle-wfdctl: log message tweaks miracle-dispd: add watchdog and SIGKILL for it to prevent no reponse and unable to be terminated issue. this is a temp solution miracle-wifid: fix signal emittion of FormationFailure miracle-wfdctl: update description of DBus interfaces miracle-dispd: notify systemd about the service readiness miracle-wifid: postpone the emittion of managed signal after the status query demo/miracle-wfdctl: maintain DBus interfaces by .vala files instead of generate from .xml which have only sync methods miracle-dispd: use software codec instead of vaapi accelerated codec miracle-dispd: add error report log to handle_replay() miracle-dispd, demo/miracle-wfdctl: improve error handling and reporting miracle-dispd: fix output resolution to 1080p@30 miracle-wifid: add Link.P2PState for checking P2P supporting status demo/miracle-wfdctl: Wait for P2PState changing before do P2P scanning add missing build-time dependencies fix loop boundary checking miracle-dispd: fix some uninitialized variable accessing issues demo/miracle-wfdctl: remove unused files add meson build supporting remove install script and install scripts with install_data() handle meson optoins properly quote string entries with configuration_data.set_quoted() instead of by ourself with configureation_data.set() remove starting `/` in front of installation path of DBus policy file demo/miracle-wfdctl: rollback method definitions in dbus interfaces from async to sync demo/miracle-wfdctl: teardown session more gracefully miracle-dispd: stablizing and removing memory leak miracle-dispd: put back gstreamer in this version, the pipeline can be stopped properly, but the gst & glib allocated memory can't be release cleanly (which won't accumulate) Change-Id: I242b106158db647070e7852b84f6f90b6bbd96f4 miracle-dispd: remove some compiler warmings Change-Id: Ief2ae8e2992c2fee34fe560af73deb955a9186de demo/miracle-wfdctl: log more info about DBus operation Change-Id: Ic44a6a2ca4585e6aa1983885b4730ccee6fd3d33 remove address sanitizer flag from default options let user or packaging system to decide whether or not to use it Change-Id: I27e7f7eae3f79431a1ec7dc69d5f372677dadbad miracle-wifid: rename link_set_managed() rename to prevent confusing with managed event notification Change-Id: I0f0d01f97156044bbb225e199b2717d5ea9c1a24 miracle-wifid: remove unused function Change-Id: Ic2709a3661914fd9e0708c33649118feededa7f6 miracle-wifid: cleanup change notification of Link.Managed property Change-Id: Ia5b056151e07219f0e6cc34dbc9fc2149f929a36 miracle-wifid: minor tweaks of log messages and identation Change-Id: Id9e98583f3256c83cf48f18cf08740849ded3cca miracle-wifid: fix crashing on link removing issue wifid crashes when link removing (either unplug usb wlan dongle or unload kernel module) due to double Change-Id: I9480a095659752343e505eb41b380d1ab3cd322a miracle-wifid: fine tune P2P state notification timing Change-Id: Idb111b90109010733b96d653c2d6d7855ebc781f miracle-disp: extracting encoder, part1 Change-Id: Ic9293e9cf379d352c75701834f17fa553f0bf52d miracle-dispd: refactory session startup function Change-Id: If1940a5823171d35230d29051d79c9827efc054f use meson default build type instead of debugoptimized Change-Id: I39bdc3e9df61c681b7ec5800a9e57fc7e9971cb0 migrate more gstreamer code to res/gstencoder Change-Id: Id5098e37fb1eabb2906505f26969e6d8cedad519 miracle-dispd: add struct dispd_encoder as encoder client since wait for the availability of newly spawned process and communicate with it is a highly async task, wrapping in a isolated class is a better choise. Change-Id: I7201da49f379c65014123269ed9e0279bcb8c918 miracle-dispd: cleanup and reorganize header Change-Id: I0067d59d89f79af53ae7291894191edb33789ab2 miracle-dispd: rename field from ref_count to ref Change-Id: Ia8138c0609b0100dd2784734287a4b3964beacbd miracle-dispd: unify log message Change-Id: I17c7cb0c64ddaecd09ff59f65dcb0e745f6b7174 miracle-dispd: log if a function call returns error it is easier to trace back to the location where the error occured by logging the return code instead of simply return a error number Change-Id: Ic711af32a1e80d9da9317269521a4745099e30cc miracle-dispd: extract encoder from dispd, part 2 Change-Id: Ie61daa87a83b875013c525fe3f15222bf9057926 miracle-dispd: complete cmake build for extracted encoder Change-Id: I5635bffdb8e1a0a693893e22837de6a8a0071fbe miracle-dispd: improve encoder lifecycle management Change-Id: Ic651e4795e4c9579978fe3e3529d8d61e739ffd1 miracle-dispd: replace assert() with assert_?ret?() for capturing more information about buggy behaviours, more validations and loggings are added Change-Id: I57e11d201324ed10b2218c9e72627759aae619c9 remove valgrind checking since now it is optional Change-Id: I39dc6b3e23307fd039775983b6d68878547523ba miracle-wifid: fix the timing of notification of P2P availability Change-Id: I86c453256b614022db5d941d64984f9eecd4ef39 miracle-dispd: fix definition of wfd_session_is_established() Change-Id: I61638bcb4e17059b5b9e37252894ab35d524d7cf gstencoder: exit if pipeline encounter error, EOS or enter NULL state Change-Id: Id9934d144bf023b301d92b24cc1cafcf2bac3b8e miracle-dispd: add timer to ensure the termination of encoder process Change-Id: I282136c79392137f2501f82009154087ee9649be gstencoder: add license declaration Change-Id: Ia2d7458d028e7d0406c3eb2489211c5daa86149d gstencoder: print final pipeline description to ease debugging Change-Id: Ib5d9bfea0760f401033b7e8982a14ae23f70d601 miracle-dispd: do not link with gstreamer libraries Change-Id: Ie178235579429647de6e7e4cf738ce814e835424 miracle-dispd: minor value returning style tunning Change-Id: I608154ffcbe0f25b4bfa9f78d0f457afe1e4fb89 miracle-dispd: more logging and assertions Change-Id: I0450b9144390b12eed0646c4a4eacf6beed6ae91 miracle-dispd: improve session life cycle management Change-Id: Icb43664439002f76d7f64252f4ba79533d04ba43 miracle-dispd: run encoder with user privilege now we run encoder with unprivileged user and talk through session bus Change-Id: I09b3b8b15e5a7c7e9b883b7c9dbac601c13f458c gstencoder: fix untested execution path which has pipeline syntax issue Change-Id: I1d170666852c33e96c989468fc733d065f777bd4 miracle-wfdctl: add options -b and -r add options -b and -r to control whether or not to acquiring or releasing ownershipt of WNIC Change-Id: Iaa9fdac15a7d1e23053b57500b978e0c026fa50c miracle-dispd: fix session leaking issue Change-Id: I1ececf598fedf601edfd7c7208ffce72a750f8cd miracle-dispd: terminate with SIGTERM instead of SIGKILL Change-Id: I3b46d3d50fc11c8f3487cc241947b556196e8ba6 miracle-dispd: ignore peers which has no valid wfd_supplicant Change-Id: Ifd7225a944fb0312eb3fe0c575b82a9c95c6ab14 miracle-dispd: minor log message tweaks Change-Id: I75cf47bb2640270729d1643487ae5cc7f8617446 fix creation paths of symlinks of DBus activated systemd services prepend $ENV{DESTDIR} to the path which is abs path get from systemd.pc Change-Id: Id07801a1f513fb421f653cb4b2c943d8841a74f6 demo/miracle-wfdctl: broadcast as source only device Change-Id: Id159332fc644e09990abdebffa8fa4b9f8b2fc28 reload systemd units after installation Change-Id: I98cf764f5dbbe5fe06a136e3633a3304e8e4401e miracle-dispd: add hardware accelection video encoding back to gstencoder Change-Id: I577082a70da61b6266e67c0b8611662ae9bc316c build vala code with cmake modules instead of custom_command() Change-Id: Ib0bc561441c3664c00e73e66864597343f3f75e8 remove 'org.freedesktop.' prefix from dbus interface source files Change-Id: Ice1ef49ca1ad3b8f36c8b4a5f8f35769df262eb9 move miracle-wfdctl from demo/ to res/ Change-Id: I37df75135e4713a73d3c63353c9a17dc248e2d7e gstencoder: fallback to sw encoder if vaapi encoder not available Change-Id: I8329fc191d60188c2098434d5db8a4aa2b3fbec2 miracle-dispd: minor interface tweaks betwen wfd_session and wfd_out_session Change-Id: Ib0c65ab64d543d5fce8908f6c47dbfc2acf47763 miracle-dispd: add keep-alive messages Change-Id: Ib8fc055789a1bd0a6df3075b176385407c17a74c miracle-dispd: remove unused log messages Change-Id: I7460f6173815f054c0dc51accf96a531f6faf4b1 miracle-dispd: minor tweaks of object life cycle transfering Change-Id: Iafefe39652d9ade06c58e41f091a30df274cb091 update gstreamer1.0-vaapi version we depend on Change-Id: Iacf53af83c151c6746f778a97201ed3f7bd55504 miracle-wifid: reduce caps from .service file Change-Id: I8434fe9dfcf141156635d7a6f8a9c2aaa4469263 miracle-dispd: reduce caps from .service file Change-Id: Ibfc14aca1c03b8cd6b50a49d5128da8597acb898 miracle-dispd: set no new priviledge flag before exec encoder Change-Id: I1b7f18a704203fc60a35b67f09936095ae6398f0 miracle-dispd: rename files and class names to make naming consistent Change-Id: Id2f5a8d6bbfbbd205dbe25e8b8bc0ddd289591e5 remove tests for security related compiler flags Change-Id: Ia51167abc10c4c8bc03f58883aca06e05879c6e9 miracle-dispctl: fine tune ctrl+c handling Change-Id: Ic5752cea7b64307c3c2d8dd0a8389d3b18ab3339 miracle-wfdctl: enhance handling of user termination (ctrl+c) Change-Id: Ifa2b1ee85b2abf4cc0d9d7f40c452517cb94761d miracle-wfdctl: fix GIOChannel ref leak Change-Id: I12e647f9b4f13aaa0aedf81907aa251675d2be32 miracle-dispd: fix session life-cycle managed issue when a session is destroyed due to peer free event, dispd_out_session must detach from sink to it won't cause double free. Change-Id: I71ad7e977fa71ec84f12f5e914786aa24a650f34 miracle-sinkctl: do not quote the value of 'Public' header of OPTION method Change-Id: I1e3994517f492aa7d9996494110077c81acc41b4 miracle-dispd, gstencoder: enable audio supporting Change-Id: I4d72782516ffff487010cd94cc47ec68133ff257 relates albfan#4
Using define for boilerplate rstp option responses
Don't know if that's used anyway
with https://github.com/albfan/miraclecast/wiki/miracle-sinkctl#extend-request-protocol hardcoded parts could be removed from PR. Still #4 would be the main PR, but I will review this too to see if there's any further improvement |
Please any work on this should be done on top of #455 |
(as asked in #136 I'm creating a dedicated PR here)
Hello!
First of all, thanks for that great work!
I'm trying to make a Microsoft Wireless Display dongle work with my Linux machine (so, using miracast as a source), and I have some issues. I read most of the past issues and comments regarding MS dongle and source side implementation, and here's what I did in my fork:
Result: P2P connection is done (I can see the group, the dhcp lease...), but RTSP is not established; I made a Wireshark capture to see what's happening, and looks like the dongle closes the connection when it receives our payload:
I don't know if that project is still under active development, but if there is something I can do to help, I would be glad to do so :) Also, if you have any input on how I can try to make this works, it would be nice!
Bw