Search code examples
javaandroidunity-game-engineandroid-mediaplayer

Can an Android (Java not C/C++) plugin alter unity textures?


I'm trying to use an Android plugin to get around the fact that Unity does not support Video Textures on mobile. I do this by getting the texture ID of the texture that will be used for video (supplied by Texture2D.GetNativeTextureID()) which i then pass into the Java Plugin.

The plugin then follows a standard MediaPlayer implementation to play the video into a Surface Texture, which has been assigned the aforementioned texture ID.

When i call the MediaPlayer.Start() method, LogCat outputs as if the media player is working normally/as hoped, however the texture never changes in the app. I'm calling the plugin (and even initializing it) from the OnPreRender() method of a monobehaviour script, along with making sure to call GL.InvalidateState() too.

Here's a look at the relevant code:

Constructor:

public VideoPlayer(String _path, Context _cont) {
    m_MediaPlayer = new MediaPlayer();
    try {
        Uri uri = Uri.parse(_path);
        m_MediaPlayer.setDataSource(_cont, uri);
        m_MediaPlayer.setOnPreparedListener(this);
    }
    catch (IOException e) {
        Log.e(TAG, "Error setting data source: " + e.getMessage());
    }
}

Surface Texture Prep:

public void PrepareVideo(int _texPtr) {
    try {
        m_SurfTex = new SurfaceTexture(_texPtr);
        m_SurfTex.setOnFrameAvailableListener(this);
        Log.i(TAG, "Surface Texture ready");
        Surface surface = new Surface(m_SurfTex);
        m_MediaPlayer.setSurface(surface);
        Log.i(TAG, "Surface Ready");
        surface.release();
        m_Ready = true;
        m_MediaPlayer.prepare();
    }
    catch (IOException | IllegalStateException e) {
        Log.e(TAG, "Error preparing player: " + e.getMessage());
        m_Ready = false;
    }
}

I'd like to know if this type of process is possible with my current setup, or will have to look into writing something using the NDK instead? Specifically, can a surface texture alter a texture produced in Unity?


Solution

  • It would appears that while i have found nothing explicitly states that this CAN be done, there is no real information or any examples of it having been done before.

    I'll be attempting a re-working of this in native C++ code.