public void Close()
    {
        Pause();

        IsVisual        = false;
        Width           = Height = 0;
        PixelFormat     = AVProQuickTimePlugin.PixelFormat.Unknown;
        IsPrepared      = false;
        IsPaused        = true;
        IsPlaying       = false;
        PlayState       = PlaybackState.Unknown;
        _lastFrameDrawn = 0xffffffff;

        if (_formatConverter != null)
        {
            _formatConverter.Reset();
        }

        if (_movieMemoryHandle.IsAllocated)
        {
            _movieMemoryHandle.Free();
        }
        _movieMemoryPtr    = IntPtr.Zero;
        _movieMemoryLength = 0;

        if (_movieHandle >= 0)
        {
            AVProQuickTimePlugin.FreeInstanceHandle(_movieHandle);
            _movieHandle = -1;
        }
    }
Пример #2
0
 public Shader GetPixelConversionShader(AVProQuickTimePlugin.PixelFormat format, bool yuvHD)
 {
     Shader result = null;
     switch (format)
     {
     case AVProQuickTimePlugin.PixelFormat.RGBA32:
         result = _shaderBGRA;
         break;
     case AVProQuickTimePlugin.PixelFormat.YCbCr:
         result = _shaderYUV2;
         if (yuvHD)
             result = _shaderYUV2_709;
         break;
     case AVProQuickTimePlugin.PixelFormat.Hap_RGB:
         result = _shaderCopy;
         break;
     case AVProQuickTimePlugin.PixelFormat.Hap_RGBA:
         result = _shaderCopy;
         break;
     case AVProQuickTimePlugin.PixelFormat.Hap_RGB_HQ:
         result = _shaderHap_YCoCg;
         break;
     default:
         Debug.LogError("[AVProQuickTime] Unknown video format '" + format);
         break;
     }
     return result;
 }
Пример #3
0
    public void Deinit()
    {
        if (_updateUsingCoroutine)
        {
            StopCoroutine("FinalRenderCapture");
        }

        // Clean up any open movies
        AVProQuickTimeMovie[] movies = (AVProQuickTimeMovie[])FindObjectsOfType(typeof(AVProQuickTimeMovie));
        if (movies != null && movies.Length > 0)
        {
            for (int i = 0; i < movies.Length; i++)
            {
                movies[i].UnloadMovie();
            }
        }

        _instance      = null;
        _isInitialised = false;

#if AVPROVIDEO_ISSUEPLUGINEVENT_UNITY52
        _nativeFunction_UpdateAllTextures = System.IntPtr.Zero;
#endif

        AVProQuickTimePlugin.Deinit();
    }
 public void Resize(int width, int height)
 {
     if (width > 0 && height > 0)
     {
         AVProQuickTimePlugin.SetTexturePointer(_movieHandle, System.IntPtr.Zero);
         Build(_movieHandle, width, height, _sourceVideoFormat, true, _flipX, _flipY);
     }
 }
Пример #5
0
    public bool Update(bool force)
    {
        bool updated = false;

        if (_movieHandle >= 0)
        {
            // Check for failing of asynchronous movie loading
            if (!AVProQuickTimePlugin.IsMovieLoadable(_movieHandle))
            {
                Debug.LogWarning("[AVProQuickTime] Unable to load movie: " + Filename);
                Close();
                return(false);
            }

            if (IsPrepared)
            {
                AVProQuickTimePlugin.Update(_movieHandle);

                if (IsVisual)
                {
                    updated = true;
                    if (_formatConverter != null)
                    {
                        updated = _formatConverter.Update();
                                                #if UNITY_EDITOR
                        if (updated)
                        {
                            UpdateFPS();
                        }
                                                #endif
                    }
                }
            }
            else
            {
                if (AVProQuickTimePlugin.IsMoviePropertiesLoaded(_movieHandle))
                {
                    PrepareMovie();
                }
            }

            // If we're streaming a video, the resolution could change
            if (_movieSource == AVProQuickTimePlugin.MovieSource.URL && _formatConverter != null)
            {
                int newWidth  = AVProQuickTimePlugin.GetWidth(_movieHandle);
                int newHeight = AVProQuickTimePlugin.GetHeight(_movieHandle);
                if (Width != newWidth || Height != newHeight)
                {
                    Width  = newWidth;
                    Height = newHeight;
                    _formatConverter.Resize(newWidth, newHeight);
                }
            }
        }

        return(updated);
    }
Пример #6
0
    private bool UpdateTexture()
    {
        bool result = false;

        AVProQuickTimeManager.ConversionMethod method = AVProQuickTimeManager.Instance.TextureConversionMethod;

#if AVPRO_UNITY_4_X || UNITY_3_5
        if (method == AVProQuickTimeManager.ConversionMethod.Unity4 ||
            method == AVProQuickTimeManager.ConversionMethod.Unity35_OpenGL)
        {
            // We update all the textures from AVProQuickTimeManager.Update()
            // so just check if the update was done
            int frameUploadCount = AVProQuickTimePlugin.GetFrameUploadCount(_movieHandle);
            if (_frameUploadCount != frameUploadCount)
            {
                _lastFrameUploaded = AVProQuickTimePlugin.GetLastFrameUploaded(_movieHandle);;
                _frameUploadCount  = frameUploadCount;
                result             = true;
            }
            result = true;
            return(result);
        }
#endif

#if UNITY_3_4
        // Update the OpenGL texture directly
        if (method == AVProQuickTimeManager.ConversionMethod.Unity34_OpenGL)
        {
            result = AVProQuickTimePlugin.UpdateTextureGL(_movieHandle, _rawTexture.GetNativeTextureID());
            GL.InvalidateState();
        }
#endif

#if !AVPRO_UNITY_4_X
        // Update the texture using Unity scripting, this is the slowest method
        if (method == AVProQuickTimeManager.ConversionMethod.UnityScript)
        {
            bool formatIs422 = (_sourceVideoFormat == AVProQuickTimePlugin.PixelFormat.YCbCr);
            if (formatIs422)
            {
                result = AVProQuickTimePlugin.GetFramePixelsYUV2(_movieHandle, _frameHandle.AddrOfPinnedObject(), _rawTexture.width, _rawTexture.height, ref _lastFrameUploaded);
            }
            else
            {
                result = AVProQuickTimePlugin.GetFramePixelsRGBA32(_movieHandle, _frameHandle.AddrOfPinnedObject(), _rawTexture.width, _rawTexture.height, ref _lastFrameUploaded);
            }
            if (result)
            {
                _rawTexture.SetPixels32(_frameData);
                _rawTexture.Apply(false, false);
            }
        }
#endif

        return(result);
    }
 public void Play()
 {
     if (_movieHandle >= 0 && IsPaused)
     {
         AVProQuickTimePlugin.Play(_movieHandle);
         IsPaused  = false;
         PlayState = PlaybackState.Playing;
         IsPlaying = true;
     }
 }
    public bool SeekToPreviousFrame()
    {
        bool result = false;

        if (_movieHandle >= 0 && IsPaused)
        {
            result = AVProQuickTimePlugin.SeekToPreviousFrame(_movieHandle);
        }
        return(result);
    }
 public void Pause()
 {
     if (_movieHandle >= 0 && !IsPaused)
     {
         AVProQuickTimePlugin.Stop(_movieHandle);
         IsPaused  = true;
         PlayState = PlaybackState.Stopped;
         IsPlaying = false;
     }
 }
Пример #10
0
    private void SetUnityFeatures()
    {
        bool unitySupportsExternalTextures      = false;
        bool unitySupportsUnity35OpenGLTextures = false;

#if AVPROQUICKTIME_UNITYFEATURE_EXTERNALTEXTURES
        unitySupportsExternalTextures = true;
#endif
#if UNITY_3_5
        unitySupportsUnity35OpenGLTextures = true;
#endif
        AVProQuickTimePlugin.SetUnityFeatures(unitySupportsExternalTextures, unitySupportsUnity35OpenGLTextures);
    }
Пример #11
0
    protected bool Init()
    {
        if (_isInitialised)
        {
            return(true);
        }

        try
        {
            if (AVProQuickTimePlugin.Init())
            {
                Debug.Log("[AVProQuickTime] Initialised (plugin version " + AVProQuickTimePlugin.GetPluginVersion().ToString("F2") + ", script version " + AVProQuickTimePlugin.ScriptVersion + ")");
            }
            else
            {
                Debug.LogError("[AVProQuickTime] failed to initialise.");
                this.enabled = false;
                Deinit();
                return(false);
            }
        }
        catch (DllNotFoundException e)
        {
            Debug.LogError("[AVProQuickTime] Unity couldn't find the DLL.  Please move the 'Plugins' folder to the root of your project, and then restart Unity.");
            Debug.LogException(e);
            return(false);
        }

#if AVPROVIDEO_ISSUEPLUGINEVENT_UNITY52
        if (_nativeFunction_UpdateAllTextures == System.IntPtr.Zero)
        {
            _nativeFunction_UpdateAllTextures = AVProQuickTimePlugin.GetRenderEventFunc();
        }
#endif

        LoadShaders();
        GetConversionMethod();
        SetUnityFeatures();

        if (_updateUsingCoroutine)
        {
            StartCoroutine("FinalRenderCapture");
        }

        _isInitialised = true;

        return(_isInitialised);
    }
    private bool UpdateTexture()
    {
        bool result = false;

        // We update all the textures from AVProQuickTimeManager.Update()
        // so just check if the update was done
        int frameUploadCount = AVProQuickTimePlugin.GetFrameUploadCount(_movieHandle);

        if (_frameUploadCount != frameUploadCount)
        {
            _frameUploadCount  = frameUploadCount;
            _lastFrameUploaded = AVProQuickTimePlugin.GetLastFrameUploaded(_movieHandle);;
            result             = true;
        }

        return(result);
    }
Пример #13
0
    public void Deinit()
    {
        // Clean up any open movies
        AVProQuickTimeMovie[] movies = (AVProQuickTimeMovie[])FindObjectsOfType(typeof(AVProQuickTimeMovie));
        if (movies != null && movies.Length > 0)
        {
            for (int i = 0; i < movies.Length; i++)
            {
                movies[i].UnloadMovie();
            }
        }

        _instance      = null;
        _isInitialised = false;

        AVProQuickTimePlugin.Deinit();
    }
Пример #14
0
    protected bool Init()
    {
        try
        {
            if (AVProQuickTimePlugin.Init())
            {
                Debug.Log("[AVProQuickTime] version " + AVProQuickTimePlugin.GetPluginVersion().ToString("F2") + " initialised");
            }
            else
            {
                Debug.LogError("[AVProQuickTime] failed to initialise.");
                this.enabled = false;
                Deinit();
                return(false);
            }
        }
        catch (DllNotFoundException e)
        {
            Debug.Log("[AVProQuickTime] Unity couldn't find the DLL, did you move the 'Plugins' folder to the root of your project?");
#if UNITY_EDITOR
            AVProQuickTimeCopyPluginWizard.DisplayCopyDialog();
#endif
            throw e;
        }

        GetConversionMethod();
        SetUnityFeatures();

        Debug.Log("[AVProQuickTime] Conversion method: " + _conversionMethod);

#if AVPRO_UNITY_4_X || UNITY_3_5
        //StartCoroutine("FinalRenderCapture");
#endif

        _isInitialised = true;

        return(_isInitialised);
    }
    public bool Build(int movieHandle, int width, int height, AVProQuickTimePlugin.PixelFormat format, bool yuvHD, bool flipX, bool flipY)
    {
        Reset();

        _outputTexture = null;
        _movieHandle = movieHandle;

        _width = width;
        _height = height;
        _sourceVideoFormat = format;
        _flipX = flipX;
        _flipY = flipY;

        CreateTexture();

        if (_rawTexture != null)
        {
            _requiresConversion = false;
            _requiresTextureCrop = (_usedTextureWidth != _rawTexture.width || _usedTextureHeight != _rawTexture.height);
            if (_requiresTextureCrop)
            {
                CreateUVs(_flipX, _flipY);
                _requiresConversion = true;
            }

            AVProQuickTimePlugin.SetTexturePointer(_movieHandle, _rawTexture.GetNativeTexturePtr());

            if (!_requiresConversion)
            {
                bool isDX11 = SystemInfo.graphicsDeviceVersion.StartsWith("Direct3D 11");
                if (_flipX || _flipY)
                {
                    _requiresConversion = true;
                }
                else if (_sourceVideoFormat == AVProQuickTimePlugin.PixelFormat.RGBA32 && isDX11)
                {
        #if UNITY_5_0
                // DX11 has red and blue channels swapped around
                if (!SystemInfo.SupportsTextureFormat(TextureFormat.BGRA32))
                    _requiresConversion = true;
        #else
                _requiresConversion = true;
        #endif
                }
                else if (_sourceVideoFormat != AVProQuickTimePlugin.PixelFormat.Hap_RGB &&
                        _sourceVideoFormat != AVProQuickTimePlugin.PixelFormat.Hap_RGBA &&
                        _sourceVideoFormat != AVProQuickTimePlugin.PixelFormat.RGBA32)
                {
                    _requiresConversion = true;
                }
            }

            if (_requiresConversion)
            {
                if (CreateMaterial(yuvHD))
                {
                    CreateRenderTexture();
                    _outputTexture = _finalTexture;

                    _conversionMaterial.mainTexture = _rawTexture;
                    if (!_requiresTextureCrop)
                    {
                        if (_flipX)
                        {
                            // Flip X and offset back to get back to normalised range
                            _conversionMaterial.mainTextureScale = new Vector2(-1.0f, _conversionMaterial.mainTextureScale.y);
                            _conversionMaterial.mainTextureOffset = new Vector2(1.0f, _conversionMaterial.mainTextureOffset.y);
                        }
                        if (_flipY)
                        {
                            // Flip Y and offset back to get back to normalised range
                            _conversionMaterial.mainTextureScale = new Vector2(_conversionMaterial.mainTextureScale.x, -1.0f);
                            _conversionMaterial.mainTextureOffset = new Vector2(_conversionMaterial.mainTextureOffset.x, 1.0f);
                        }
                    }
                    bool formatIs422 = (_sourceVideoFormat == AVProQuickTimePlugin.PixelFormat.YCbCr);
                    if (formatIs422)
                    {
                        _conversionMaterial.SetFloat("_TextureWidth", _finalTexture.width);
                    }
                }
            }
            else
            {
                bool formatIs422 = (_sourceVideoFormat == AVProQuickTimePlugin.PixelFormat.YCbCr);
                if (formatIs422)
                {
                    if (CreateMaterial(yuvHD))
                    {
                        _conversionMaterial.SetFloat("_TextureWidth", _width);
                        _rawTexture.filterMode = FilterMode.Point;
                        _outputTexture = _rawTexture;
                    }
                }
                else
                {
                    _rawTexture.filterMode = FilterMode.Bilinear;
                    _outputTexture = _rawTexture;
                }
                //_rawTexture.wrapMode = TextureWrapMode.Repeat;

            }
        }

        return (_outputTexture != null); ;
    }
    private bool PrepareMovie()
    {
        if (_movieSource != AVProQuickTimePlugin.MovieSource.Memory)
        {
            if (!AVProQuickTimePlugin.LoadMovieProperties(_movieHandle))
            {
                Debug.LogWarning("[AVProQuickTime] Failed loading movie properties");
                Close();
                return(false);
            }
        }

        AVProQuickTimePlugin.SetVolume(_movieHandle, _volume);
        AVProQuickTimePlugin.SetAudioBalance(_movieHandle, _audioBalance);
        Width           = AVProQuickTimePlugin.GetWidth(_movieHandle);
        Height          = AVProQuickTimePlugin.GetHeight(_movieHandle);
        FrameCount      = (uint)(AVProQuickTimePlugin.GetFrameCount(_movieHandle));
        DurationSeconds = AVProQuickTimePlugin.GetDurationSeconds(_movieHandle);
        FrameRate       = AVProQuickTimePlugin.GetFrameRate(_movieHandle);
        PixelFormat     = (AVProQuickTimePlugin.PixelFormat)AVProQuickTimePlugin.GetFramePixelFormat(_movieHandle);

        IsPrepared = true;
        PlayState  = PlaybackState.Loaded;
        Debug.Log("[AVProQuickTime] loaded movie " + Filename + "[" + Width + "x" + Height + " @ " + FrameRate + "hz] " + PixelFormat.ToString() + " " + DurationSeconds + " sec " + FrameCount + " frames");

        // Movie may not be visual, it could be audio so check width and height
        if (Width > 0 && Height > 0)
        {
            if (Width <= 4096 && Height <= 4096)
            {
                if (PixelFormat != AVProQuickTimePlugin.PixelFormat.Unknown)
                {
                    IsVisual = true;

                    if (_formatConverter == null)
                    {
                        _formatConverter = new AVProQuickTimeFormatConverter();
                    }
                    if (!_formatConverter.Build(_movieHandle, Width, Height, PixelFormat, _yuvHD, false, true))
                    {
                        Debug.LogWarning("[AVProQuickTime] unable to convert video format");
                        Width = Height = 0;
                        if (_formatConverter != null)
                        {
                            _formatConverter.Dispose();
                            _formatConverter = null;
                        }
                    }
                }
                else
                {
                    Debug.LogWarning("[AVProQuickTime] unknown video format");
                    Width = Height = 0;
                    if (_formatConverter != null)
                    {
                        _formatConverter.Dispose();
                        _formatConverter = null;
                    }
                }
            }
            else
            {
                Debug.LogError("[AVProQuickTime] Movie resolution is too large");
                Width = Height = 0;
                if (_formatConverter != null)
                {
                    _formatConverter.Dispose();
                    _formatConverter = null;
                }
            }
        }
        else
        {
            // No video frame found, must be audio?
            Width = Height = 0;
            if (_formatConverter != null)
            {
                _formatConverter.Dispose();
                _formatConverter = null;
            }
        }

        return(true);
    }
Пример #17
0
    private void ControlWindow(int id)
    {
        if (_movie == null)
        {
            return;
        }

        GUILayout.Space(16f);

        GUILayout.BeginVertical();

        _movie._useStreamingAssetsPath = GUILayout.Toggle(_movie._useStreamingAssetsPath, "Use Streaming Assets Folder");

        GUILayout.BeginHorizontal();
        GUILayout.Label("Folder: ", GUILayout.Width(80));
        _movie._folder = GUILayout.TextField(_movie._folder, 192);
        GUILayout.EndHorizontal();

        GUILayout.BeginHorizontal();
        GUILayout.Label("File: ", GUILayout.Width(80));
        _movie._filename = GUILayout.TextField(_movie._filename, 128, GUILayout.Width(350));
        if (GUILayout.Button("Load File", GUILayout.Width(90)))
        {
            _movie._source = AVProQuickTimePlugin.MovieSource.LocalFile;
            _movie.LoadMovie();
        }
        if (GUILayout.Button("Load URL", GUILayout.Width(90)))
        {
            _movie._source = AVProQuickTimePlugin.MovieSource.URL;
            _movie.LoadMovie();
        }
#if !UNITY_WEBPLAYER
        if (GUILayout.Button("Load Memory", GUILayout.Width(110)))
        {
            _movie._source = AVProQuickTimePlugin.MovieSource.Memory;
            string fullPath = System.IO.Path.Combine(_movie._folder, _movie._filename);
            if (System.IO.File.Exists(fullPath))
            {
                _movie._movieData = System.IO.File.ReadAllBytes(fullPath);
                _movie.LoadMovie();
                _movie._movieData = null;
            }
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
            System.GC.Collect();
            Debug.Log("GC: " + System.GC.GetTotalMemory(false));
        }
#endif
        GUILayout.EndHorizontal();

        AVProQuickTime moviePlayer = _movie.MovieInstance;
        if (moviePlayer != null)
        {
            GUILayout.BeginHorizontal();
            GUILayout.Label("Loaded ", GUILayout.Width(80));
            GUILayout.HorizontalSlider(moviePlayer.LoadedSeconds, 0.0f, moviePlayer.DurationSeconds, GUILayout.Width(200));
            if (moviePlayer.DurationSeconds > 0f)
            {
                GUILayout.Label(((moviePlayer.LoadedSeconds * 100f) / moviePlayer.DurationSeconds) + "%");
            }
            else
            {
                GUILayout.Label("0%");
            }
            GUILayout.EndHorizontal();

            if (moviePlayer.LoadedSeconds > 0f || AVProQuickTimePlugin.IsMoviePlayable(moviePlayer.Handle))
            {
                GUILayout.Label("Resolution: " + moviePlayer.Width + "x" + moviePlayer.Height + " @ " + moviePlayer.FrameRate.ToString("F2") + "hz");


                GUILayout.BeginHorizontal();
                GUILayout.Label("Volume ", GUILayout.Width(80));
                float volume    = _movie._volume;
                float newVolume = GUILayout.HorizontalSlider(volume, 0.0f, 1.0f, GUILayout.Width(200));
                if (volume != newVolume)
                {
                    _movie._volume = newVolume;
                }
                GUILayout.Label(_movie._volume.ToString("F1"));
                GUILayout.EndHorizontal();


                GUILayout.BeginHorizontal();
                GUILayout.Label("Alpha", GUILayout.Width(80));
                _display._color.a = GUILayout.HorizontalSlider(_display._color.a, 0.0f, 1.0f, GUILayout.Width(200));
                GUILayout.Label(_display._color.a.ToString("F1"));
                GUILayout.EndHorizontal();


                GUILayout.BeginHorizontal();
                GUILayout.Label("Time ", GUILayout.Width(80));
                float position    = moviePlayer.PositionSeconds;
                float newPosition = GUILayout.HorizontalSlider(position, 0.0f, moviePlayer.DurationSeconds, GUILayout.Width(200));
                if (position != newPosition)
                {
                    moviePlayer.PositionSeconds = newPosition;
                    //moviePlayer.Play();
                    //moviePlayer.Update(true);
                }
                GUILayout.Label(moviePlayer.PositionSeconds.ToString("F2") + " / " + moviePlayer.DurationSeconds.ToString("F2") + "s");

                if (GUILayout.Button("Play"))
                {
                    moviePlayer.Play();
                }
                if (GUILayout.Button("Pause"))
                {
                    moviePlayer.Pause();
                }

                GUILayout.EndHorizontal();


                GUILayout.BeginHorizontal();

                GUILayout.Label("Frame " + moviePlayer.Frame.ToString() + " / " + moviePlayer.FrameCount.ToString());

                if (GUILayout.Button("<", GUILayout.Width(50)))
                {
                    AVProQuickTimePlugin.SeekToPreviousFrame(moviePlayer.Handle);
                }
                if (GUILayout.Button(">", GUILayout.Width(50)))
                {
                    AVProQuickTimePlugin.SeekToNextFrame(moviePlayer.Handle);
                }

                GUILayout.EndHorizontal();

                if (!moviePlayer.IsPaused)
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.Label("Rate: " + moviePlayer.PlaybackRate.ToString("F2") + "x");

                    if (GUILayout.Button("Reverse", GUILayout.Width(72)))
                    {
                        moviePlayer.PlaybackRate = -moviePlayer.PlaybackRate;
                    }

                    if (GUILayout.Button("-", GUILayout.Width(50)))
                    {
                        moviePlayer.PlaybackRate = moviePlayer.PlaybackRate * 0.5f;
                    }

                    if (GUILayout.Button("+", GUILayout.Width(50)))
                    {
                        moviePlayer.PlaybackRate = moviePlayer.PlaybackRate * 2.0f;
                    }

                    if (GUILayout.Button("Reset", GUILayout.Width(50)))
                    {
                        moviePlayer.PlaybackRate = 1.0f;
                    }

                    GUILayout.EndHorizontal();
                }
            }
        }

        GUILayout.EndVertical();
    }
Пример #18
0
    public bool Build(int movieHandle, int width, int height, AVProQuickTimePlugin.PixelFormat format, bool yuvHD, bool flipX, bool flipY)
    {
        Reset();

        _movieHandle = movieHandle;

        _width             = width;
        _height            = height;
        _sourceVideoFormat = format;
        _flipX             = flipX;
        _flipY             = flipY;

        if (CreateMaterial(yuvHD))
        {
#if AVPROQUICKTIME_UNITYFEATURE_EXTERNALTEXTURES
            System.IntPtr texPtr = AVProQuickTimePlugin.GetTexturePointer(_movieHandle);
            if (texPtr != System.IntPtr.Zero)
            {
                int           texWidth      = _width;
                TextureFormat textureFormat = TextureFormat.RGBA32;
                switch (format)
                {
                case AVProQuickTimePlugin.PixelFormat.YCbCr:
                    texWidth = _width / 2;
                    break;

                case AVProQuickTimePlugin.PixelFormat.Hap_RGBA:
                case AVProQuickTimePlugin.PixelFormat.Hap_RGB_HQ:
                    textureFormat = TextureFormat.DXT5;
                    break;

                case AVProQuickTimePlugin.PixelFormat.Hap_RGB:
                    textureFormat = TextureFormat.DXT1;
                    break;
                }

                _usedTextureWidth  = texWidth;
                _usedTextureHeight = _height;
                _rawTexture        = Texture2D.CreateExternalTexture(texWidth, _height, textureFormat, false, false, texPtr);
            }
#else
            CreateTexture();
#endif
            if (_rawTexture != null)
            {
                _requiresTextureCrop = (_usedTextureWidth != _rawTexture.width || _usedTextureHeight != _rawTexture.height);

                if (_requiresTextureCrop)
                {
                    CreateUVs(_flipX, _flipY);
                }

                switch (AVProQuickTimeManager.Instance.TextureConversionMethod)
                {
                case AVProQuickTimeManager.ConversionMethod.Unity4:
#if !AVPROQUICKTIME_UNITYFEATURE_EXTERNALTEXTURES
#if AVPRO_UNITY_4_X
                    AVProQuickTimePlugin.SetTexturePointer(_movieHandle, _rawTexture.GetNativeTexturePtr());
#endif
#endif
                    break;

                case AVProQuickTimeManager.ConversionMethod.Unity34_OpenGL:
                    // We set the texture per-frame
                    break;

                case AVProQuickTimeManager.ConversionMethod.Unity35_OpenGL:
#if UNITY_3_5
                    AVProQuickTimePlugin.SetTexturePointer(_movieHandle, new System.IntPtr(_rawTexture.GetNativeTextureID()));
#endif
                    break;

                case AVProQuickTimeManager.ConversionMethod.UnityScript:
#if !AVPRO_UNITY_4_X
                    CreateBuffer();
#endif
                    break;
                }

                // TODO: we don't require conversion for HAP_RGB and HAP_RGBA formats!

                CreateRenderTexture();

                _conversionMaterial.mainTexture = _rawTexture;
                if (!_requiresTextureCrop)
                {
                    if (_flipX)
                    {
                        // Flip X and offset back to get back to normalised range
                        _conversionMaterial.mainTextureScale  = new Vector2(-1.0f, _conversionMaterial.mainTextureScale.y);
                        _conversionMaterial.mainTextureOffset = new Vector2(1.0f, _conversionMaterial.mainTextureOffset.y);
                    }
                    if (_flipY)
                    {
                        // Flip Y and offset back to get back to normalised range
                        _conversionMaterial.mainTextureScale  = new Vector2(_conversionMaterial.mainTextureScale.x, -1.0f);
                        _conversionMaterial.mainTextureOffset = new Vector2(_conversionMaterial.mainTextureOffset.x, 1.0f);
                    }
                }
                bool formatIs422 = (_sourceVideoFormat == AVProQuickTimePlugin.PixelFormat.YCbCr);
                if (formatIs422)
                {
                    _conversionMaterial.SetFloat("_TextureWidth", _finalTexture.width);
                }
            }
        }

        return(_conversionMaterial != null);;
    }
Пример #19
0
 private void SetUnityFeatures()
 {
     AVProQuickTimePlugin.SetUnityFeatures(false);
 }
	public bool Build(int movieHandle, int width, int height, AVProQuickTimePlugin.PixelFormat format, bool yuvHD, bool flipX, bool flipY)
	{
		Reset();

		_movieHandle = movieHandle;
		
		_width = width;
		_height = height;
		_sourceVideoFormat = format;
		_flipX = flipX;
		_flipY = flipY;

		if (CreateMaterial(yuvHD))
		{
#if AVPROQUICKTIME_UNITYFEATURE_EXTERNALTEXTURES
			System.IntPtr texPtr = AVProQuickTimePlugin.GetTexturePointer(_movieHandle);
			if (texPtr != System.IntPtr.Zero)
			{
				int texWidth = _width;
				TextureFormat textureFormat = TextureFormat.RGBA32;
				switch (format)
				{
					case AVProQuickTimePlugin.PixelFormat.YCbCr:
						texWidth = _width / 2;
						break;
					case AVProQuickTimePlugin.PixelFormat.Hap_RGBA:
					case AVProQuickTimePlugin.PixelFormat.Hap_RGB_HQ:
						textureFormat = TextureFormat.DXT5;
						break;
					case AVProQuickTimePlugin.PixelFormat.Hap_RGB:
						textureFormat = TextureFormat.DXT1;
						break;
				}

				_usedTextureWidth = texWidth;
				_usedTextureHeight = _height;
				_rawTexture = Texture2D.CreateExternalTexture(texWidth, _height, textureFormat, false, false, texPtr);
			}
#else
			CreateTexture();
#endif
			if (_rawTexture != null)
			{
				_requiresTextureCrop = (_usedTextureWidth != _rawTexture.width || _usedTextureHeight != _rawTexture.height);

				if (_requiresTextureCrop)
				{
					CreateUVs(_flipX, _flipY);
				}

				switch (AVProQuickTimeManager.Instance.TextureConversionMethod)
				{
					case AVProQuickTimeManager.ConversionMethod.Unity4:
#if !AVPROQUICKTIME_UNITYFEATURE_EXTERNALTEXTURES
#if AVPRO_UNITY_4_X
						AVProQuickTimePlugin.SetTexturePointer(_movieHandle, _rawTexture.GetNativeTexturePtr());
#endif
#endif
						break;
					case AVProQuickTimeManager.ConversionMethod.Unity34_OpenGL:
						// We set the texture per-frame
						break;
					case AVProQuickTimeManager.ConversionMethod.Unity35_OpenGL:
#if UNITY_3_5
						AVProQuickTimePlugin.SetTexturePointer(_movieHandle, new System.IntPtr(_rawTexture.GetNativeTextureID()));
#endif
						break;
					case AVProQuickTimeManager.ConversionMethod.UnityScript:
#if !AVPRO_UNITY_4_X
						CreateBuffer();
#endif
						break;
				}

				// TODO: we don't require conversion for HAP_RGB and HAP_RGBA formats!

				CreateRenderTexture();

				_conversionMaterial.mainTexture = _rawTexture;
				if (!_requiresTextureCrop)
				{
					if (_flipX)
					{
						// Flip X and offset back to get back to normalised range
						_conversionMaterial.mainTextureScale = new Vector2(-1.0f, _conversionMaterial.mainTextureScale.y);
						_conversionMaterial.mainTextureOffset = new Vector2(1.0f, _conversionMaterial.mainTextureOffset.y);
					}
					if (_flipY)
					{
						// Flip Y and offset back to get back to normalised range
						_conversionMaterial.mainTextureScale = new Vector2(_conversionMaterial.mainTextureScale.x, -1.0f);
						_conversionMaterial.mainTextureOffset = new Vector2(_conversionMaterial.mainTextureOffset.x, 1.0f);
					}
				}
				bool formatIs422 = (_sourceVideoFormat == AVProQuickTimePlugin.PixelFormat.YCbCr);
				if (formatIs422)
				{
					_conversionMaterial.SetFloat("_TextureWidth", _finalTexture.width);
				}
			}
		}
		
		return (_conversionMaterial != null);;
	}
    private bool StartMovie(bool loop, bool allowYUV)
    {
        Loop = loop;

        if (_movieHandle < 0)
        {
            _movieHandle = AVProQuickTimePlugin.GetInstanceHandle();
        }

#if AVPRO_UNITY_4_X
        AVProQuickTimePlugin.SetActive(_movieHandle, IsActive);
#endif

        bool sourceValid = false;
        bool loadedOK    = false;
        switch (_movieSource)
        {
        case AVProQuickTimePlugin.MovieSource.LocalFile:
            if (!string.IsNullOrEmpty(Filename))
            {
                sourceValid = true;

                byte[] utf8 = Encoding.UTF8.GetBytes(Filename);

                int    size = Marshal.SizeOf(typeof(byte)) * (utf8.Length + 1);
                IntPtr ptr  = Marshal.AllocHGlobal(size);
                Marshal.Copy(utf8, 0, ptr, utf8.Length);
                Marshal.WriteByte(ptr, utf8.Length, 0);

                loadedOK = AVProQuickTimePlugin.LoadMovieFromFile(_movieHandle, ptr, Loop, allowYUV);

                Marshal.FreeHGlobal(ptr);
            }
            break;

        case AVProQuickTimePlugin.MovieSource.URL:
            if (!string.IsNullOrEmpty(Filename))
            {
                sourceValid = true;
                loadedOK    = AVProQuickTimePlugin.LoadMovieFromURL(_movieHandle, Filename, Loop, allowYUV);
            }
            break;

        case AVProQuickTimePlugin.MovieSource.Memory:
            sourceValid = true;
            loadedOK    = AVProQuickTimePlugin.LoadMovieFromMemory(_movieHandle, _movieMemoryPtr, _movieMemoryLength, Loop, allowYUV);
            break;
        }

        if (sourceValid)
        {
            if (loadedOK)
            {
                PlayState = PlaybackState.Loading;
            }
            else
            {
                Debug.LogWarning("[AVProQuickTime] Movie failed to load");
                Close();
            }
        }
        else
        {
            Debug.LogWarning("[AVProQuickTime] Invalid movie file specified");
            Close();
        }
        return(_movieHandle >= 0);
    }
    public bool Build(int movieHandle, int width, int height, AVProQuickTimePlugin.PixelFormat format, bool yuvHD, bool flipX, bool flipY)
    {
        Reset();

        _outputTexture = null;
        _movieHandle   = movieHandle;

        _width             = width;
        _height            = height;
        _sourceVideoFormat = format;
        _flipX             = flipX;
        _flipY             = flipY;

        CreateTexture();

        if (_rawTexture != null)
        {
            _requiresConversion  = false;
            _requiresTextureCrop = (_usedTextureWidth != _rawTexture.width || _usedTextureHeight != _rawTexture.height);
            if (_requiresTextureCrop)
            {
                CreateUVs(_flipX, _flipY);
                _requiresConversion = true;
            }

            AVProQuickTimePlugin.SetTexturePointer(_movieHandle, _rawTexture.GetNativeTexturePtr());

            if (!_requiresConversion)
            {
                bool isDX11 = SystemInfo.graphicsDeviceVersion.StartsWith("Direct3D 11");
                if (_flipX || _flipY)
                {
                    _requiresConversion = true;
                }
                else if (_sourceVideoFormat == AVProQuickTimePlugin.PixelFormat.RGBA32 && isDX11)
                {
#if UNITY_5
                    // DX11 has red and blue channels swapped around
                    if (!SystemInfo.SupportsTextureFormat(TextureFormat.BGRA32))
                    {
                        _requiresConversion = true;
                    }
#else
                    _requiresConversion = true;
#endif
                }
                else if (_sourceVideoFormat != AVProQuickTimePlugin.PixelFormat.Hap_RGB &&
                         _sourceVideoFormat != AVProQuickTimePlugin.PixelFormat.Hap_RGBA &&
                         _sourceVideoFormat != AVProQuickTimePlugin.PixelFormat.RGBA32)
                {
                    _requiresConversion = true;
                }
            }

            if (_requiresConversion)
            {
                if (CreateMaterial(yuvHD))
                {
                    CreateRenderTexture();
                    _outputTexture = _finalTexture;

                    _conversionMaterial.mainTexture = _rawTexture;
                    if (!_requiresTextureCrop)
                    {
                        // Flip and then offset back to get back to normalised range
                        Vector2 scale  = new Vector2(1f, 1f);
                        Vector2 offset = new Vector2(0f, 0f);
                        if (_flipX)
                        {
                            scale  = new Vector2(-1f, scale.y);
                            offset = new Vector2(1f, offset.y);
                        }
                        if (_flipY)
                        {
                            scale  = new Vector2(scale.x, -1f);
                            offset = new Vector2(offset.x, 1f);
                        }

                        _conversionMaterial.mainTextureScale  = scale;
                        _conversionMaterial.mainTextureOffset = offset;
                        // Since Unity 5.3 Graphics.Blit ignores mainTextureOffset/Scale
#if UNITY_5 && !UNITY_5_0 && !UNITY_5_1 && !UNITY_5_2
                        _conversionMaterial.SetVector("_MainTex_ST2", new Vector4(scale.x, scale.y, offset.x, offset.y));
#endif
                    }
                    bool formatIs422 = (_sourceVideoFormat == AVProQuickTimePlugin.PixelFormat.YCbCr);
                    if (formatIs422)
                    {
                        _conversionMaterial.SetFloat("_TextureWidth", _finalTexture.width);
                    }
                }
            }
            else
            {
                bool formatIs422 = (_sourceVideoFormat == AVProQuickTimePlugin.PixelFormat.YCbCr);
                if (formatIs422)
                {
                    if (CreateMaterial(yuvHD))
                    {
                        _conversionMaterial.SetFloat("_TextureWidth", _width);
                        _rawTexture.filterMode = FilterMode.Point;
                        _outputTexture         = _rawTexture;
                    }
                }
                else
                {
                    _rawTexture.filterMode = FilterMode.Bilinear;
                    _outputTexture         = _rawTexture;
                }
                //_rawTexture.wrapMode = TextureWrapMode.Repeat;
            }
        }

        return(_outputTexture != null);;
    }
    public bool Update(bool force)
    {
        bool updated = false;

        if (_movieHandle >= 0)
        {
            // Check for failing of asynchronous movie loading
            if (!AVProQuickTimePlugin.IsMovieLoadable(_movieHandle))
            {
                Debug.LogWarning("[AVProQuickTime] Unable to load movie: " + Filename);
                Close();
                return(false);
            }

            if (IsPrepared)
            {
                AVProQuickTimePlugin.Update(_movieHandle);

                //if (!IsPaused)
                {
                    bool nextFrameReady = false;

                    if (AVProQuickTimeManager.Instance.TextureConversionMethod == AVProQuickTimeManager.ConversionMethod.Unity4 ||
                        AVProQuickTimeManager.Instance.TextureConversionMethod == AVProQuickTimeManager.ConversionMethod.Unity35_OpenGL)
                    {
                        nextFrameReady = true;
                    }
                    else
                    {
                        /*if (!force && IsVisual)
                         * {
                         *      //nextFrameReady = AVProQuickTimePlugin.IsNextFrameReadyForGrab(_movieHandle);
                         * }*/

                        uint qtFrame = AVProQuickTimePlugin.GetNumFramesDrawn(_movieHandle);
                        if (_lastFrameDrawn != qtFrame)
                        {
                            nextFrameReady  = true;
                            _lastFrameDrawn = qtFrame;
                        }
                    }
                    if (nextFrameReady && IsVisual)
                    {
                        updated = true;
                        if (_formatConverter != null)
                        {
                            updated = _formatConverter.Update();
                                                        #if UNITY_EDITOR
                            if (updated)
                            {
                                UpdateFPS();
                            }
                                                        #endif
                        }
                    }
                }
            }
            else
            {
                if (AVProQuickTimePlugin.IsMoviePropertiesLoaded(_movieHandle))
                {
                    PrepareMovie();
                }
            }
        }

        return(updated);
    }