NativeMedia.java revision 68686bd0cb31f99f07ebc176176f8b51adf8d1d5
1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/* 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Copyright (C) 2010 The Android Open Source Project 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Licensed under the Apache License, Version 2.0 (the "License"); 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * you may not use this file except in compliance with the License. 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * You may obtain a copy of the License at 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * http://www.apache.org/licenses/LICENSE-2.0 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Unless required by applicable law or agreed to in writing, software 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * distributed under the License is distributed on an "AS IS" BASIS, 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * See the License for the specific language governing permissions and 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * limitations under the License. 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenpackage com.example.nativemedia; 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.app.Activity; 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.graphics.SurfaceTexture; 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.media.MediaPlayer; 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.os.Bundle; 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.util.Log; 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.view.Surface; 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.view.SurfaceHolder; 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.view.SurfaceView; 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.view.View; 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.widget.AdapterView; 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.widget.ArrayAdapter; 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.widget.Button; 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.widget.Spinner; 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport java.io.IOException; 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenimport android.content.Context; 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 36e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharmaimport android.graphics.SurfaceTexture; 37e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma 38e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharmaimport android.media.MediaPlayer.OnPreparedListener; 39e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharmaimport android.media.MediaPlayer; 40e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenpublic class NativeMedia extends Activity { 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static final String TAG = "NativeMedia"; 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen String mSourceString = null; 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen String mSinkString = null; 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // member variables for Java media player 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MediaPlayer mMediaPlayer; 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen boolean mMediaPlayerIsPrepared = false; 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SurfaceView mSurfaceView1; 51e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma SurfaceHolder mSurfaceHolder1; 52e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma 53e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma // member variables for native media player 54e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma boolean mIsPlayingStreaming = false; 55e14dcc5a172cad1c4716af7ab94121a73c0c698eAshish Sharma SurfaceView mSurfaceView2; 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SurfaceHolder mSurfaceHolder2; 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VideoSink mSelectedVideoSink; 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VideoSink mJavaMediaPlayerVideoSink; 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen VideoSink mNativeMediaPlayerVideoSink; 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SurfaceHolderVideoSink mSurfaceHolder1VideoSink, mSurfaceHolder2VideoSink; 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GLViewVideoSink mGLView1VideoSink, mGLView2VideoSink; 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** Called when the activity is first created. */ 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen @Override 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void onCreate(Bundle icicle) { 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen super.onCreate(icicle); 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen setContentView(R.layout.main); 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mGLView1 = (MyGLSurfaceView) findViewById(R.id.glsurfaceview1); 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mGLView2 = (MyGLSurfaceView) findViewById(R.id.glsurfaceview2); 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen //setContentView(mGLView); 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen //setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // initialize native media system 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen createEngine(); 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // set up the Surface 1 video sink 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSurfaceView1 = (SurfaceView) findViewById(R.id.surfaceview1); 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSurfaceHolder1 = mSurfaceView1.getHolder(); 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSurfaceHolder1.addCallback(new SurfaceHolder.Callback() { 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.v(TAG, "surfaceChanged format=" + format + ", width=" + width + ", height=" + 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen height); 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void surfaceCreated(SurfaceHolder holder) { 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.v(TAG, "surfaceCreated"); 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen setSurface(holder.getSurface()); 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void surfaceDestroyed(SurfaceHolder holder) { 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.v(TAG, "surfaceDestroyed"); 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }); 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // set up the Surface 2 video sink 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSurfaceView2 = (SurfaceView) findViewById(R.id.surfaceview2); 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSurfaceHolder2 = mSurfaceView2.getHolder(); 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSurfaceHolder2.addCallback(new SurfaceHolder.Callback() { 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.v(TAG, "surfaceChanged format=" + format + ", width=" + width + ", height=" + 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen height); 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void surfaceCreated(SurfaceHolder holder) { 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.v(TAG, "surfaceCreated"); 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen setSurface(holder.getSurface()); 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void surfaceDestroyed(SurfaceHolder holder) { 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.v(TAG, "surfaceDestroyed"); 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }); 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // create Java media player 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mMediaPlayer = new MediaPlayer(); 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // set up Java media player listeners 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void onPrepared(MediaPlayer mediaPlayer) { 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int width = mediaPlayer.getVideoWidth(); 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int height = mediaPlayer.getVideoHeight(); 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.v(TAG, "onPrepared width=" + width + ", height=" + height); 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (width != 0 && height != 0 && mJavaMediaPlayerVideoSink != null) { 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mJavaMediaPlayerVideoSink.setFixedSize(width, height); 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mMediaPlayerIsPrepared = true; 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mediaPlayer.start(); 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }); 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mMediaPlayer.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() { 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void onVideoSizeChanged(MediaPlayer mediaPlayer, int width, int height) { 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.v(TAG, "onVideoSizeChanged width=" + width + ", height=" + height); 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (width != 0 && height != 0 && mJavaMediaPlayerVideoSink != null) { 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mJavaMediaPlayerVideoSink.setFixedSize(width, height); 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }); 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // initialize content source spinner 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Spinner sourceSpinner = (Spinner) findViewById(R.id.source_spinner); 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ArrayAdapter<CharSequence> sourceAdapter = ArrayAdapter.createFromResource( 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this, R.array.source_array, android.R.layout.simple_spinner_item); 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sourceAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sourceSpinner.setAdapter(sourceAdapter); 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sourceSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSourceString = parent.getItemAtPosition(pos).toString(); 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.v(TAG, "onItemSelected " + mSourceString); 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void onNothingSelected(AdapterView parent) { 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.v(TAG, "onNothingSelected"); 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSourceString = null; 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }); 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // initialize video sink spinner 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Spinner sinkSpinner = (Spinner) findViewById(R.id.sink_spinner); 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ArrayAdapter<CharSequence> sinkAdapter = ArrayAdapter.createFromResource( 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this, R.array.sink_array, android.R.layout.simple_spinner_item); 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sinkAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sinkSpinner.setAdapter(sinkAdapter); 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sinkSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSinkString = parent.getItemAtPosition(pos).toString(); 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.v(TAG, "onItemSelected " + mSinkString); 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if ("Surface 1".equals(mSinkString)) { 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mSurfaceHolder1VideoSink == null) { 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSurfaceHolder1VideoSink = new SurfaceHolderVideoSink(mSurfaceHolder1); 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSelectedVideoSink = mSurfaceHolder1VideoSink; 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else if ("Surface 2".equals(mSinkString)) { 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mSurfaceHolder2VideoSink == null) { 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSurfaceHolder2VideoSink = new SurfaceHolderVideoSink(mSurfaceHolder2); 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSelectedVideoSink = mSurfaceHolder2VideoSink; 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else if ("SurfaceTexture 1".equals(mSinkString)) { 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mGLView1VideoSink == null) { 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mGLView1VideoSink = new GLViewVideoSink(mGLView1); 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSelectedVideoSink = mGLView1VideoSink; 200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else if ("SurfaceTexture 2".equals(mSinkString)) { 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mGLView2VideoSink == null) { 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mGLView2VideoSink = new GLViewVideoSink(mGLView2); 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSelectedVideoSink = mGLView2VideoSink; 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void onNothingSelected(AdapterView parent) { 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.v(TAG, "onNothingSelected"); 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSinkString = null; 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSelectedVideoSink = null; 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }); 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // initialize button click handlers 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Java MediaPlayer start/pause 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ((Button) findViewById(R.id.start_java)).setOnClickListener(new View.OnClickListener() { 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public void onClick(View view) { 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mJavaMediaPlayerVideoSink == null) { 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mSelectedVideoSink == null) { 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mSelectedVideoSink.useAsSinkForJava(mMediaPlayer); 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mJavaMediaPlayerVideoSink = mSelectedVideoSink; 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!mMediaPlayerIsPrepared) { 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (mSourceString != null) { 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen try { 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen mMediaPlayer.setDataSource(mSourceString); 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } catch (IOException e) { 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Log.e(TAG, "IOException " + e); 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 237 mMediaPlayer.prepareAsync(); 238 } 239 } else if (mMediaPlayer.isPlaying()) { 240 mMediaPlayer.pause(); 241 } else { 242 mMediaPlayer.start(); 243 } 244 } 245 246 }); 247 248 // native MediaPlayer start/pause 249 250 ((Button) findViewById(R.id.start_native)).setOnClickListener(new View.OnClickListener() { 251 252 boolean created = false; 253 public void onClick(View view) { 254 if (!created) { 255 if (mNativeMediaPlayerVideoSink == null) { 256 if (mSelectedVideoSink == null) { 257 return; 258 } 259 mSelectedVideoSink.useAsSinkForNative(); 260 mNativeMediaPlayerVideoSink = mSelectedVideoSink; 261 } 262 if (mSourceString != null) { 263 created = createStreamingMediaPlayer(mSourceString); 264 } 265 } 266 if (created) { 267 mIsPlayingStreaming = !mIsPlayingStreaming; 268 setPlayingStreamingMediaPlayer(mIsPlayingStreaming); 269 } 270 } 271 272 }); 273 274 // Java MediaPlayer rewind 275 276 ((Button) findViewById(R.id.rewind_java)).setOnClickListener(new View.OnClickListener() { 277 278 public void onClick(View view) { 279 if (mMediaPlayerIsPrepared) { 280 mMediaPlayer.seekTo(0); 281 } 282 } 283 284 }); 285 286 // native MediaPlayer rewind 287 288 ((Button) findViewById(R.id.rewind_native)).setOnClickListener(new View.OnClickListener() { 289 290 public void onClick(View view) { 291 if (mNativeMediaPlayerVideoSink != null) { 292 rewindStreamingMediaPlayer(); 293 } 294 } 295 296 }); 297 298 } 299 300 /** Called when the activity is about to be paused. */ 301 @Override 302 protected void onPause() 303 { 304 mIsPlayingStreaming = false; 305 setPlayingStreamingMediaPlayer(false); 306 mGLView1.onPause(); 307 mGLView2.onPause(); 308 super.onPause(); 309 } 310 311 @Override 312 protected void onResume() { 313 super.onResume(); 314 mGLView1.onResume(); 315 mGLView2.onResume(); 316 } 317 318 /** Called when the activity is about to be destroyed. */ 319 @Override 320 protected void onDestroy() 321 { 322 shutdown(); 323 super.onDestroy(); 324 } 325 326 private MyGLSurfaceView mGLView1, mGLView2; 327 328 /** Native methods, implemented in jni folder */ 329 public static native void createEngine(); 330 public static native boolean createStreamingMediaPlayer(String filename); 331 public static native void setPlayingStreamingMediaPlayer(boolean isPlaying); 332 public static native void shutdown(); 333 public static native void setSurface(Surface surface); 334 public static native void setSurfaceTexture(SurfaceTexture surfaceTexture); 335 public static native void rewindStreamingMediaPlayer(); 336 337 /** Load jni .so on initialization */ 338 static { 339 System.loadLibrary("native-media-jni"); 340 } 341 342 // VideoSink abstracts out the difference between Surface and SurfaceTexture 343 // aka SurfaceHolder and GLSurfaceView 344 static abstract class VideoSink { 345 346 abstract void setFixedSize(int width, int height); 347 abstract void useAsSinkForJava(MediaPlayer mediaPlayer); 348 abstract void useAsSinkForNative(); 349 350 } 351 352 static class SurfaceHolderVideoSink extends VideoSink { 353 354 private final SurfaceHolder mSurfaceHolder; 355 356 SurfaceHolderVideoSink(SurfaceHolder surfaceHolder) { 357 mSurfaceHolder = surfaceHolder; 358 } 359 360 void setFixedSize(int width, int height) { 361 mSurfaceHolder.setFixedSize(width, height); 362 } 363 364 void useAsSinkForJava(MediaPlayer mediaPlayer) { 365 mediaPlayer.setDisplay(mSurfaceHolder); 366 } 367 368 void useAsSinkForNative() { 369 setSurface(mSurfaceHolder.getSurface()); 370 } 371 372 } 373 374 static class GLViewVideoSink extends VideoSink { 375 376 private final MyGLSurfaceView mMyGLSurfaceView; 377 378 GLViewVideoSink(MyGLSurfaceView myGLSurfaceView) { 379 mMyGLSurfaceView = myGLSurfaceView; 380 } 381 382 void setFixedSize(int width, int height) { 383 } 384 385 void useAsSinkForJava(MediaPlayer mediaPlayer) { 386 SurfaceTexture st = mMyGLSurfaceView.getSurfaceTexture(); 387 Surface s = new Surface(st); 388 mediaPlayer.setSurface(s); 389 s.release(); 390 } 391 392 void useAsSinkForNative() { 393 setSurfaceTexture(mMyGLSurfaceView.getSurfaceTexture()); 394 } 395 396 } 397 398} 399