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