
This is an open-source VR video player I built for the Samsung Galaxy XR headset, running on Android XR / OpenXR. It plays 180° side-by-side 3D video as a panoramic skybox and lets you reposition the video in pitch independently of head tracking — something the headset’s built-in horizon lock doesn’t expose.
The Galaxy XR’s horizon-reset button only resets yaw. If you’re watching 180° immersive video while reclining on a couch, the content stays locked to the world horizon and you end up staring at the ceiling of the scene. There’s no way to tilt the video’s apparent horizon up or down to match how your head is actually oriented.
Rather than touching the headset’s pose tracking, the video is rendered as a skybox and the skybox geometry is rotated around its X axis in the vertex shader via a _PitchRotation uniform. Texcoords stay on the original unrotated positions, so the texture appears to shift up or down on the sphere without any tracking distortion or reprojection latency.
When the user presses the headset’s horizon-reset button, Android XR fires a reference-space-change event. The player catches it, reads the camera’s current world pitch, and sets _PitchRotation so the content center recenters to wherever you’re currently looking — a gaze-recenter for pitch, layered on top of the OS’s yaw reset.
adb install -r xrvideoplayer.apk
Sideload onto a Samsung Galaxy XR (or any Android XR device), drop a 180° SBS 3D .mp4 into /sdcard/Movies/, and launch.
The project is MIT-licensed. Issues, PRs, and content compatibility reports are welcome on GitHub.