@Override
            public void run() {
                try {
                    mCurrentState = STATE_PREPARING;

                    currentPlayer.setDataSource(mSource, mVideoTrackIndex, mAudioTrackIndex);

                    if (mPlayer != currentPlayer) {
                        // Player has been released or recreated while the data source was set,
                        // so we can ditch the instance and do not need to prepare it.
                        // This is a special case that can only happen because we execute
                        // setDataSource asynchronously, so the player could be released or a new
                        // source loaded and thus a new player created in the meantime.
                        // In Android's VideoView, setDataSource is executed synchronously and
                        // this case therefore cannot happen there.
                        // Just to be sure, we release the player again from within here, e.g. for
                        // the case that extractors have been created after the outer release call.
                        currentPlayer.release();
                        return;
                    }

                    // Async prepare spawns another thread inside this thread which really isn't
                    // necessary; we call this method anyway because of the events it triggers
                    // when it fails, and to stay in sync which the Android VideoView that does
                    // the same.
                    currentPlayer.prepareAsync();

                    Log.d(TAG, "video opened");
                } catch (IOException e) {
                    Log.e(TAG, "video open failed", e);

                    // Send message to the handler that an error occurred
                    // (we don't need a message id as the handler only handles this single message)
                    // We only do that for the current player, not for previous instances
                    if (mPlayer == currentPlayer) {
                        exceptionHandler.sendEmptyMessage(0);
                    }
                } catch (Exception e) {
                    Log.e(TAG, "something went wrong", e);
                }
            }
@see android.widget.VideoView#setVideoURI(android.net.Uri, Map)
@param uri
@param headers
@deprecated only for compatibility with Android API
MediaPlayer/src/main/java/net/protyposis/android/mediaplayer/VideoView.java