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