RenderHeads / UnityPlugin-AVProVideo

AVPro Video is a multi-platform Unity plugin for advanced video playback
https://www.renderheads.com/products/avpro-video/
237 stars 29 forks source link

[Android] Noise and aliasing in flat video display #2063

Closed bentalebahmed closed 2 weeks ago

bentalebahmed commented 2 weeks ago

Unity version

2021.3.18f1

Unity editor platform

Windows

AVPro Video edition

Core

AVPro Video version

v3 Core Mobile Edition

Device hardware

PICO 4 enterprise

Which Android OS version are you using?

10

Unity Graphics API

OpenGLES 3

Video API

media3/ExoPlayer

Texture format

Y Cb Cr 420_OES

Audio output

Unity

Any other Media Player component configuration required to reproduce the issue.

No response

Which output component(s) are you using?

Apply to Mesh

Any other component configuration required to reproduce the issue.

No response

The issue

I am trying to display a flat video using Unity in a PICO 4 enterprise (Pico OS 5.9.9). I've a video player and a flat screen using apply to mesh component with OES texture format and supplied AVProVideo-Unlit-AndroidOES shader. I am using H265 4096x2160 video at 30fps. When I build and run, the video has a lot of noise and aliasing but when I play the same video using built-in video player of PICO there is no noise. Is there a way to eliminate the noise and enhance the quality?

Media information

No response

Logcat output

No response

Chris-RH commented 2 weeks ago

Ultimately, Unity is a powerful 3d engine and will therefore have added overheads, compared to a lightweight built-in player. The Pico 4 Enterprise only seems to have an Adreno 650 GPU, which is the same as the Quest 2.
I think at 4096x2160 you're probably at maximum resolution. You're already using OES rendering, which is what I would have suggested. Have you seen if it plays any better encoded as H264?

Are you using the latest version of AVPro Video? you've not stated in your answers Is it reproducible in a new project, running only the AVPro Video demo scene and your video? Are you streaming or is it local playback? Are you able to provide a sample of the video you are using?

bentalebahmed commented 2 weeks ago

I have tried H264, but the issue persists. I'm using Core Mobile Edition version 3.011. I have used the demo project and the noise persists. The video is a local playback. Here is a WeTransfer link containing sample from the video and a screen recorded (check the lower corners to see the noise)

Chris-RH commented 2 weeks ago
  1. I noticed that you said the video was 4096x2160, but the one supplied was 3840x2160. Make sure that the mesh is the right size for the video, because scaling can cause the noise issue.
  2. You could try changing from blit to point texture filter.
  3. As the issue seems to occur mostly when at an angle, you could try changing the anisotropic filter level.
bentalebahmed commented 2 weeks ago

I have tested different parameters and different video resolutions but same issue. Could you please explain more about the blit to point texture filter and blit to point texture filter

Chris-RH commented 2 weeks ago

Hmm, it was worse a shot seeing if they would make any difference. Its just a case of aliasing, probably worse in VR due to each eye getting a slightly different pixel colour in those areas.

bentalebahmed commented 2 weeks ago

I have tested the same video sing PICO G2 with the same Unity app, and the quality is perfect. When it comes to the PICO 4 enterprise, the built-in player works fine, no noise, but in Unity I get the noise. Any idea what could cause this?

Chris-RH commented 2 weeks ago

That's interesting. You'd expect better performance on a new device.

MorrisRH commented 2 weeks ago

This would appear to be an artefact of how Unity's rendering works for VR devices. The default eye resolution is ~75% of the maximum available (this is on the Quest 3 but my understanding is the same applies to the Pico 4). You can improve this by adjusting the eyeTextureResolutionScale in Unity's XRSettings.

Unfortunately there is not much we can do about this at the plugin level.