Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Android] VideoTexture dispose cause crash #2835

Closed
itlancer opened this issue Sep 19, 2023 · 1 comment
Closed

[Android] VideoTexture dispose cause crash #2835

itlancer opened this issue Sep 19, 2023 · 1 comment

Comments

@itlancer
Copy link

Problem Description

VideoTexture dispose cause crash for Android devices.
Its hard to 100% reproduce it with pure Stage3D. But it 100% reproducible with video playback in loop simple case using Starling.

Tested with latest AIR 50.2.3.5 with different AIR applications and different Android devices, versions with different architectures.
Same problem in all cases.
There is no such crash with Windows.

May be related to #2825
Sometimes earlier AIR had similar crash issue: #1952

Related issues:
#2825
#2296
#2268
#2125
#1174
#1159
#587
#554
#139
#92
#81
#16

Steps to Reproduce

Launch application with code below with any Android device. It just play video by VideoTexture in a loop.

Application example with sources, full log and video attached.
android_videotexture_argumenterror_3672.zip

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.NetStatusEvent;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	import starling.core.Starling;
	import starling.display.Image;
	import starling.textures.Texture;
	
	public class AndroidVideoTextureArgumentError3672 extends Sprite {
		private var _netConnection:NetConnection;
		private var _netStream:NetStream;
		
		private var _videoImage:Image;
		private var _videoTexture:Texture;
		
		public function AndroidVideoTextureArgumentError3672() {
			addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
			
			StarlingManager.instance.addEventListener(Event.COMPLETE, starling_complete);
			StarlingManager.instance.init(stage);
		}
		
		private function starling_complete(e:Event):void {
			playVideo();
		}
		
		private function playVideo():void {
			_netConnection = new NetConnection();
			_netConnection.addEventListener(NetStatusEvent.NET_STATUS, netConnection_netStatus);
			_netConnection.connect(null);
		}
		
		private function netConnection_netStatus(e:NetStatusEvent):void {
			if (e.info.code == "NetConnection.Connect.Success"){
				_netStream = new NetStream(_netConnection);
				_netStream.client = {onMetaData:getMeta};
				_netStream.addEventListener(NetStatusEvent.NET_STATUS, netStream_netStatus);
				
				attachNetStream(_netStream);
				_netStream.play("video.mp4");
			}
		}
		
		private function attachNetStream(netStream:NetStream):void {
			if (netStream != null){
				try {
					_videoTexture = Texture.fromNetStream(netStream, Starling.current.contentScaleFactor, onTextureComplete);
				} catch (e:Error) {
					trace("video texture creating error", e.message, e.errorID);
				}
			}
		}
		
		private function disposeData():void {
			if (_videoImage != null) {
				if (_videoImage.parent) {
					_videoImage.parent.removeChild(_videoImage);
				}
				_videoImage.dispose();
				_videoImage = null;
			}
			if (_videoTexture != null) {
				_videoTexture.dispose();//This ilne cause crash
				_videoTexture = null;
			}
			if (_netStream != null) {
				_netStream.removeEventListener(NetStatusEvent.NET_STATUS, netStream_netStatus);
				_netStream.close();
				_netStream = null;
			}
			if (_netConnection != null) {
				_netConnection.removeEventListener(NetStatusEvent.NET_STATUS, netConnection_netStatus);
				_netConnection.close();
				_netConnection = null;
			}
		}

		/**
		 * On Starling Texture complete
		 */
		private function onTextureComplete(t: Texture):void {
			_videoImage = new Image(_videoTexture);
			_videoImage.width = 640;
			_videoImage.height = 480;

			StarlingManager.instance.root.addChild(_videoImage);
		}
		
		private function netStream_netStatus(e:NetStatusEvent):void {
			trace(e.info.code);
			if (e.info.code == "NetStream.Play.Stop"){
				disposeData();
				playVideo();
			}
		}

		private function getMeta(mdata:Object):void { }
		
	}
}
package {
	import flash.display.Stage;
	import flash.display.Stage3D;
	import flash.display3D.Context3DProfile;
	import flash.display3D.Context3DRenderMode;
	import flash.events.ErrorEvent;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.geom.Rectangle;

	import starling.core.Starling;
	import starling.display.Sprite;
	import starling.events.Event;
	
	public class StarlingManager extends EventDispatcher {

		private static const MAX_VIEW_PORT_SIZE:Number = 16384;
		private static const MIN_VIEW_PORT_SIZE:Number = 32;

		private static var _instance:StarlingManager;

		public static function get instance():StarlingManager {
			if (_instance == null) {
				_instance = new StarlingManager();
			}
			return _instance;
		}

		private var _waiting:Boolean;
		private var _inited:Boolean;
		private var _stage:Stage;
		private var _starling:Starling;

		public function StarlingManager() {}

		/**
		 * Initialization
		 *
		 * @param	stage
		 */
		public function init(stage:Stage):void {
			if (!_inited && !_waiting) {
				_waiting = true;
				_stage = stage;
				Starling.multitouchEnabled = true;

				stage3DReady(stage.stage3Ds[0]);
			}
		}

		private function stage3DReady(stage3D:Stage3D):void {
			var contextProfiles:Array = [
				Context3DProfile.BASELINE,
				Context3DProfile.BASELINE_EXTENDED,
				Context3DProfile.STANDARD,
				Context3DProfile.STANDARD_CONSTRAINED,
				Context3DProfile.STANDARD_EXTENDED
			];

			_starling = new Starling(Sprite, _stage, null, stage3D, Context3DRenderMode.AUTO, contextProfiles);
			_starling.enableErrorChecking = true;

			_starling.addEventListener(starling.events.Event.ROOT_CREATED, starling_rootCreated);
			_starling.supportHighResolutions = true;
			_starling.start();

			_stage.addEventListener(flash.events.Event.RESIZE, stage_resizeHandler, false, int.MAX_VALUE);
		}

		private function stage3D_error(e:flash.events.ErrorEvent):void {
			trace("stage3D_error", e.errorID, e.text);
		}

		private function starling_rootCreated(e:starling.events.Event):void {
			_inited = true;
			_waiting = false;
			invalidate();
			dispatchEvent(new flash.events.Event(flash.events.Event.COMPLETE));
		}

		/**
		 * Update on resize
		 * @param	event
		 */
		private function stage_resizeHandler(event:flash.events.Event):void {
			invalidate();
		}

		private function invalidate():void {
			const width:Number = _stage.stageWidth;
			const height:Number = _stage.stageHeight;

			_starling.stage.stageWidth = width;
			_starling.stage.stageHeight = height;

			const viewPort:Rectangle = _starling.viewPort;
			viewPort.width = width;
			viewPort.height = height;

			if (viewPort.width < MIN_VIEW_PORT_SIZE) {
				viewPort.width = MIN_VIEW_PORT_SIZE;
			} else if (viewPort.width > MAX_VIEW_PORT_SIZE) {
				viewPort.width = MAX_VIEW_PORT_SIZE;
			}
			if (viewPort.height < MIN_VIEW_PORT_SIZE) {
				viewPort.height = MIN_VIEW_PORT_SIZE;
			} else if (viewPort.height > MAX_VIEW_PORT_SIZE) {
				viewPort.height = MAX_VIEW_PORT_SIZE;
			}

			_starling.viewPort = viewPort;
		}
	
		public function get root():Sprite { return _starling.root as Sprite; }

	}
}

Actual Result:
Application crash after video will be played once. When just played VideoTexture tried to be disposed.:

pid: 10937, tid: 10968, name: Thread-3  >>> android.videotexture.argumenterror3672 <<<
uid: 10481
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x00000014
Cause: null pointer dereference
    r0  cd3166be  r1  defc050c  r2  00000000  r3  df431da9
    r4  00000000  r5  00000000  r6  00000000  r7  defc04e8
    r8  07ffffff  r9  ddd94ec0  r10 e53824d0  r11 e47d77d0
    ip  e00b6f00  sp  defc04b0  lr  df431f99  pc  df3ccd22
backtrace:
      #00 pc 00108d22  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #01 pc 0016df95  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #02 pc 00164851  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #03 pc 0011b585  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #04 pc 00124047  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #05 pc 003acca3  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #06 pc 004cb0ff  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #07 pc 004cb8a1  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #08 pc 004dfb73  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #09 pc 004dfb73  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #10 pc 004dfb73  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #11 pc 004637c3  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #12 pc 003440f3  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #13 pc 0034397f  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #14 pc 00346cbf  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #15 pc 0033c63b  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #16 pc 00430edd  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #17 pc 001ee3f5  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #18 pc 001eeaf7  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #19 pc 002d7109  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #20 pc 002a7427  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #21 pc 002aa02f  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #22 pc 000e8dbf  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #23 pc 000eb685  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #24 pc 000edc5d  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/lib/arm/libCore.so (BuildId: fcaa98c9abc3284b9a5d8feb7d1bd60aa2a7a088)
      #25 pc 002c7b1d  /apex/com.android.art/lib/libart.so (art_quick_generic_jni_trampoline+44) (BuildId: 0c120073b1ca00a2f04958628420a048)
      #26 pc 003441ec  /apex/com.android.art/lib/libart.so (nterp_helper+2908) (BuildId: 0c120073b1ca00a2f04958628420a048)
      #27 pc 000340f6  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/oat/arm/base.vdex (com.adobe.air.Entrypoints$1.handleMessage+146)
      #28 pc 008e7569  /data/misc/apexdata/com.android.art/dalvik-cache/arm/boot.oat (android.os.Handler.dispatchMessage+144)
      #29 pc 008ea639  /data/misc/apexdata/com.android.art/dalvik-cache/arm/boot.oat (android.os.Looper.loopOnce+928)
      #30 pc 008ea215  /data/misc/apexdata/com.android.art/dalvik-cache/arm/boot.oat (android.os.Looper.loop+1028)
      #31 pc 0034373c  /apex/com.android.art/lib/libart.so (nterp_helper+172) (BuildId: 0c120073b1ca00a2f04958628420a048)
      #32 pc 000346e8  /data/app/~~yFT8ugwOQnnodRdXhOUWkw==/android.videotexture.argumenterror3672-infZaQ4nQX0CCgRpob2rZA==/oat/arm/base.vdex (com.adobe.air.Entrypoints.run+92)
      #33 pc 003bc0cf  /data/misc/apexdata/com.android.art/dalvik-cache/arm/boot.oat (java.lang.Thread.run+70)
      #34 pc 002c05d5  /apex/com.android.art/lib/libart.so (art_quick_invoke_stub_internal+68) (BuildId: 0c120073b1ca00a2f04958628420a048)
      #35 pc 005c48ad  /apex/com.android.art/lib/libart.so (art_quick_invoke_stub+260) (BuildId: 0c120073b1ca00a2f04958628420a048)
      #36 pc 00176f35  /apex/com.android.art/lib/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+124) (BuildId: 0c120073b1ca00a2f04958628420a048)
      #37 pc 0024207d  /apex/com.android.art/lib/libart.so (art::Thread::CreateCallback(void*)+2448) (BuildId: 0c120073b1ca00a2f04958628420a048)
      #38 pc 00083ccf  /apex/com.android.runtime/lib/bionic/libc.so (__pthread_start(void*)+40) (BuildId: 3b88306c48e5e9406a3c511942480bcc)
      #39 pc 0003ab4d  /apex/com.android.runtime/lib/bionic/libc.so (__start_thread+30) (BuildId: 3b88306c48e5e9406a3c511942480bcc)

Expected Result:
Application playback video in a loop.

Known Workarounds

none
Do not use VideoTexture.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants