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);
     }
 }
    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);;
    }
Пример #3
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);;
    }