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);; }