FD- / RPiPlay

An open-source AirPlay mirroring server for the Raspberry Pi. Supports iOS 9 and up.
GNU General Public License v3.0
4.93k stars 353 forks source link

Video artifacts when mirroring from iOS device but not macOS device #203

Open dustinlieu opened 3 years ago

dustinlieu commented 3 years ago

I'm running RPiPlay on an Ubuntu VM. I get major video artifacts when mirroring from an iOS device but not from a macOS device. When I set displays_0_overscanned_node to 0 in lib/raop_handlers.h, it fixes the diagonal shifting effect, but there are still problems with the colors.

Default:

With overscan disabled:

dustinlieu commented 3 years ago

When I change the resolution in lib/raop_handlers.h to 1280x720 it displays perfectly. Not sure why it only messes up at 1920x1080.

guseggert commented 3 years ago

I also encountered this with Ubuntu in VirtualBox, I had to both disable overscan and set the resolution to exactly that of the iOS device:

diff --git a/lib/raop_handlers.h b/lib/raop_handlers.h
index 104b1c4..7de4806 100755
--- a/lib/raop_handlers.h
+++ b/lib/raop_handlers.h
@@ -134,13 +134,13 @@ raop_handler_info(raop_conn_t *conn,
     plist_t displays_0_uuid_node = plist_new_string("e0ff8a27-6738-3d56-8a16-cc53aacee925");
     plist_t displays_0_width_physical_node = plist_new_uint(0);
     plist_t displays_0_height_physical_node = plist_new_uint(0);
-    plist_t displays_0_width_node = plist_new_uint(1920);
-    plist_t displays_0_height_node = plist_new_uint(1080);
-    plist_t displays_0_width_pixels_node = plist_new_uint(1920);
-    plist_t displays_0_height_pixels_node = plist_new_uint(1080);
+    plist_t displays_0_width_node = plist_new_uint(2048);
+    plist_t displays_0_height_node = plist_new_uint(1536);
+    plist_t displays_0_width_pixels_node = plist_new_uint(2048);
+    plist_t displays_0_height_pixels_node = plist_new_uint(1536);
     plist_t displays_0_rotation_node = plist_new_bool(0);
     plist_t displays_0_refresh_rate_node = plist_new_real(1.0 / 60.0);
-    plist_t displays_0_overscanned_node = plist_new_bool(1);
+    plist_t displays_0_overscanned_node = plist_new_bool(0);
     plist_t displays_0_features = plist_new_uint(14);

     plist_dict_set_item(displays_0_node, "uuid", displays_0_uuid_node);