Exemplo n.º 1
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);;
    }