&gt; The video surface was a little more problematic. To provide smooth playback, the video frames are queued a half second ahead, tagged with a &quot;release time&quot; that the Android window compositor will use to pick the best frame each update. The SurfaceTexture interface that I could access as a normal user program only had an &quot;Update&quot; method that always returned the very latest frame submitted. This meant that the video came out a half second ahead of the audio, and stuttered a lot.<p>&gt; To fix this, I had to make a small change in the Netflix video decoding system so it would call out to my VR code right after it submitted each frame, letting me know that it had submitted something with a particular release time. I could then immediately update the surface texture and copy it out to my own frame queue, storing the release time with it. This is an unfortunate waste of memory, since I am duplicating over a dozen video frames that are also being buffered on the surface, but it gives me the timing control I need.<p>Oh, Mr. Carmack...<p><a href="http:&#x2F;&#x2F;developer.android.com&#x2F;reference&#x2F;android&#x2F;graphics&#x2F;SurfaceTexture.html#getTimestamp()" rel="nofollow">http:&#x2F;&#x2F;developer.android.com&#x2F;reference&#x2F;android&#x2F;graphics&#x2F;Surf...</a><p><a href="http:&#x2F;&#x2F;developer.android.com&#x2F;reference&#x2F;android&#x2F;graphics&#x2F;SurfaceTexture.OnFrameAvailableListener.html" rel="nofollow">http:&#x2F;&#x2F;developer.android.com&#x2F;reference&#x2F;android&#x2F;graphics&#x2F;Surf...</a><p>And I only started coding for Android last month. I guess I&#x27;m an 11x programmer. :) <i>ducks</i>