fixed state changed exceptions on stop for audio and video.
attempting to fix the Null Pointer and Illegal State exceptions as below when the player is being paused. Issue has been fixed using an AtomicBoolean and making the video and audio Thread's global.
12-11 11:40:42.080: V/MediaMoviePlayer:MediaMoviePlayer(7398): handleStop: 12-11 11:40:42.080: V/MediaMoviePlayer:MediaMoviePlayer(7398): internal_stop_video: 12-11 11:40:42.080: V/MediaMoviePlayer:MediaMoviePlayer(7398): internal_stop_audio: 12-11 11:40:42.090: E/MediaMoviePlayer:MediaMoviePlayer(7398): VideoTask: 12-11 11:40:42.090: E/MediaMoviePlayer:MediaMoviePlayer(7398): java.lang.NullPointerException: Attempt to get length of null array 12-11 11:40:42.090: E/MediaMoviePlayer:MediaMoviePlayer(7398): at com.serenegiant.media.MediaMoviePlayer.internal_write_audio(MediaMoviePlayer.java:942) 12-11 11:40:42.090: E/MediaMoviePlayer:MediaMoviePlayer(7398): at com.serenegiant.media.MediaMoviePlayer.handleOutputAudio(MediaMoviePlayer.java:916) 12-11 11:40:42.090: E/MediaMoviePlayer:MediaMoviePlayer(7398): at com.serenegiant.media.MediaMoviePlayer.access$24(MediaMoviePlayer.java:899) 12-11 11:40:42.090: E/MediaMoviePlayer:MediaMoviePlayer(7398): at com.serenegiant.media.MediaMoviePlayer$3.run(MediaMoviePlayer.java:370) 12-11 11:40:42.090: E/MediaMoviePlayer:MediaMoviePlayer(7398): at java.lang.Thread.run(Thread.java:818) 12-11 11:40:42.090: V/MediaMoviePlayer:MediaMoviePlayer(7398): AudioTask:finished 12-11 11:40:42.097: E/MediaMoviePlayer:MediaMoviePlayer(7398): VideoTask: 12-11 11:40:42.097: E/MediaMoviePlayer:MediaMoviePlayer(7398): java.lang.IllegalStateException 12-11 11:40:42.097: E/MediaMoviePlayer:MediaMoviePlayer(7398): at android.media.MediaCodec.releaseOutputBuffer(Native Method) 12-11 11:40:42.097: E/MediaMoviePlayer:MediaMoviePlayer(7398): at android.media.MediaCodec.releaseOutputBuffer(MediaCodec.java:2424) 12-11 11:40:42.097: E/MediaMoviePlayer:MediaMoviePlayer(7398): at com.serenegiant.media.MediaMoviePlayer.handleOutputVideo(MediaMoviePlayer.java:849) 12-11 11:40:42.097: E/MediaMoviePlayer:MediaMoviePlayer(7398): at com.serenegiant.media.MediaMoviePlayer.access$18(MediaMoviePlayer.java:823) 12-11 11:40:42.097: E/MediaMoviePlayer:MediaMoviePlayer(7398): at com.serenegiant.media.MediaMoviePlayer$2.run(MediaMoviePlayer.java:341) 12-11 11:40:42.097: E/MediaMoviePlayer:MediaMoviePlayer(7398): at java.lang.Thread.run(Thread.java:818) 12-11 11:40:42.097: V/MediaMoviePlayer:MediaMoviePlayer(7398): VideoTask:finished 12-11 11:40:42.109: V/MediaMoviePlayer:MediaMoviePlayer(7398): player task finished:local_isRunning=false 12-11 11:40:42.109: V/MediaMoviePlayer:MediaMoviePlayer(7398): handleStop: 12-11 11:40:42.109: V/MediaMoviePlayer:MediaMoviePlayer(7398): internal_stop_video: 12-11 11:40:42.109: V/MediaMoviePlayer:MediaMoviePlayer(7398): internal_stop_audio:
After the fix, the new log looks as so,
12-11 11:44:59.200: V/MediaMoviePlayer:MediaMoviePlayer(8168): handleStop: 12-11 11:44:59.200: V/MediaMoviePlayer:MediaMoviePlayer(8168): internal_stop_video : 12-11 11:44:59.200: V/MediaMoviePlayer:MediaMoviePlayer(8168): internal_stop_video + 12-11 11:44:59.201: D/MediaMoviePlayer:MediaMoviePlayer(8168): VideoTask Stop Called. 12-11 11:44:59.201: V/MediaMoviePlayer:MediaMoviePlayer(8168): VideoTask:finished 12-11 11:44:59.207: D/MediaMoviePlayer:MediaMoviePlayer(8168): AudioTask Stop Called. 12-11 11:44:59.207: V/MediaMoviePlayer:MediaMoviePlayer(8168): AudioTask:finished 12-11 11:44:59.211: D/MediaMoviePlayer:MediaMoviePlayer(8168): internal_stop_video - 12-11 11:44:59.211: V/MediaMoviePlayer:MediaMoviePlayer(8168): internal_stop_audio: 12-11 11:44:59.240: V/MediaMoviePlayer:MediaMoviePlayer(8168): player task finished:local_isRunning=false 12-11 11:44:59.240: V/MediaMoviePlayer:MediaMoviePlayer(8168): handleStop: 12-11 11:44:59.240: V/MediaMoviePlayer:MediaMoviePlayer(8168): internal_stop_video : 12-11 11:44:59.240: V/MediaMoviePlayer:MediaMoviePlayer(8168): internal_stop_audio:
Thank you.
Hi, thank you for providing pull-request. I think using slower AtomicBoolean in a loop is redundant because there is no compare-and-set operation under racy condition in this case. Please use volatile boolean instead. (I checked this repository and found other issue, I will update later) saki