diff --git a/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/VideoPlayer.java b/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/VideoPlayer.java index b5adada15d..4733fc0f90 100644 --- a/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/VideoPlayer.java +++ b/demo_misc/vp9_opus_sw/src/main/java/com/google/android/exoplayer/demo/vp9opus/VideoPlayer.java @@ -73,7 +73,8 @@ public class VideoPlayer extends Activity implements OnClickListener, private SurfaceView surfaceView; private VpxVideoSurfaceView vpxVideoSurfaceView; private TextView debugInfoView; - private TextView playerStateView; + private String debugInfo; + private String playerState; @Override public void onCreate(Bundle savedInstanceState) { @@ -106,7 +107,10 @@ public class VideoPlayer extends Activity implements OnClickListener, surfaceView = (SurfaceView) findViewById(R.id.surface_view); vpxVideoSurfaceView = (VpxVideoSurfaceView) findViewById(R.id.vpx_surface_view); debugInfoView = (TextView) findViewById(R.id.debug_info); - playerStateView = (TextView) findViewById(R.id.player_state); + debugInfo = ""; + playerState = ""; + filename = ""; + updateDebugInfoTextView(); // Set the buttons' onclick listeners. ((Button) findViewById(R.id.choose_file)).setOnClickListener(this); @@ -115,7 +119,6 @@ public class VideoPlayer extends Activity implements OnClickListener, // In case of DASH, start playback right away. if (isDash) { findViewById(R.id.buttons).setVisibility(View.GONE); - ((TextView) findViewById(R.id.filename)).setVisibility(View.GONE); startDashPlayback(); } } @@ -146,8 +149,7 @@ public class VideoPlayer extends Activity implements OnClickListener, case FILE_PICKER_REQUEST: if (resultCode == Activity.RESULT_OK) { filename = data.getStringExtra(FilePickerActivity.FILENAME_EXTRA_ID); - ((TextView) findViewById(R.id.filename)).setText( - getString(R.string.current_path, filename)); + updateDebugInfoTextView(); } break; } @@ -186,7 +188,8 @@ public class VideoPlayer extends Activity implements OnClickListener, } private void startDashPlayback() { - playerStateView.setText("Initializing"); + playerState = "Initializing"; + updateDebugInfoTextView(); final String userAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like" + " Gecko) Chrome/38.0.2125.104 Safari/537.36"; DashRendererBuilder rendererBuilder = new DashRendererBuilder(manifestUrl, userAgent, this); @@ -213,7 +216,8 @@ public class VideoPlayer extends Activity implements OnClickListener, @Override public void onVideoSizeChanged(int width, int height) { videoFrame.setAspectRatio(height == 0 ? 1 : (width * 1.0f) / height); - debugInfoView.setText("Video: " + width + " x " + height); + debugInfo = "Video: " + width + " x " + height; + updateDebugInfoTextView(); } @Override @@ -223,12 +227,12 @@ public class VideoPlayer extends Activity implements OnClickListener, @Override public void onDecoderError(VpxDecoderException e) { - debugInfoView.setText("Libvpx decode failure. Giving up."); + debugInfo = "Libvpx decode failure. Giving up."; + updateDebugInfoTextView(); } @Override public void onPlayerStateChanged(boolean playWhenReady, int state) { - String playerState = ""; switch (player.getPlaybackState()) { case ExoPlayer.STATE_BUFFERING: playerState = "buffering"; @@ -246,12 +250,13 @@ public class VideoPlayer extends Activity implements OnClickListener, playerState = "ready"; break; } - playerStateView.setText("Player State: " + playerState); + updateDebugInfoTextView(); } @Override public void onPlayerError(ExoPlaybackException exception) { - debugInfoView.setText("Exoplayer Playback error. Giving up."); + debugInfo = "Exoplayer Playback error. Giving up."; + updateDebugInfoTextView(); // TODO: show a retry button here. } @@ -282,4 +287,20 @@ public class VideoPlayer extends Activity implements OnClickListener, } } + private void updateDebugInfoTextView() { + StringBuilder debugInfoText = new StringBuilder(); + debugInfoText.append( + getString(R.string.libvpx_version, LibvpxVideoTrackRenderer.getLibvpxVersion())); + debugInfoText.append(" "); + debugInfoText.append( + getString(R.string.libopus_version, LibopusAudioTrackRenderer.getLibopusVersion())); + debugInfoText.append("\n"); + debugInfoText.append(getString(R.string.current_path, filename)); + debugInfoText.append(" "); + debugInfoText.append(debugInfo); + debugInfoText.append(" "); + debugInfoText.append(playerState); + debugInfoView.setText(debugInfoText.toString()); + } + } diff --git a/demo_misc/vp9_opus_sw/src/main/res/layout/activity_video_player.xml b/demo_misc/vp9_opus_sw/src/main/res/layout/activity_video_player.xml index f6f841b014..c6b2aea44d 100644 --- a/demo_misc/vp9_opus_sw/src/main/res/layout/activity_video_player.xml +++ b/demo_misc/vp9_opus_sw/src/main/res/layout/activity_video_player.xml @@ -64,28 +64,10 @@ - - - - - - - - - + diff --git a/demo_misc/vp9_opus_sw/src/main/res/values/strings.xml b/demo_misc/vp9_opus_sw/src/main/res/values/strings.xml index 45c9da513c..6be85034cf 100644 --- a/demo_misc/vp9_opus_sw/src/main/res/values/strings.xml +++ b/demo_misc/vp9_opus_sw/src/main/res/values/strings.xml @@ -22,5 +22,11 @@ Path: %1$s + + Libvpx: %1$s + + + Libopus: %1$s + diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer/ext/opus/LibopusAudioTrackRenderer.java b/extensions/opus/src/main/java/com/google/android/exoplayer/ext/opus/LibopusAudioTrackRenderer.java index e8fd8c8306..5465d5e4c1 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer/ext/opus/LibopusAudioTrackRenderer.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer/ext/opus/LibopusAudioTrackRenderer.java @@ -119,6 +119,15 @@ public final class LibopusAudioTrackRenderer extends SampleSourceTrackRenderer formatHolder = new MediaFormatHolder(); } + /** + * Get the version of underlying libopus library. + * + * @return version of the underlying libopus library. + */ + public static String getLibopusVersion() { + return OpusDecoder.getLibopusVersion(); + } + @Override protected MediaClock getMediaClock() { return this; diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer/ext/opus/OpusDecoder.java b/extensions/opus/src/main/java/com/google/android/exoplayer/ext/opus/OpusDecoder.java index 6de3481c2a..7a5e2b8096 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer/ext/opus/OpusDecoder.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer/ext/opus/OpusDecoder.java @@ -81,6 +81,11 @@ import java.nio.ByteBuffer; opusReset(nativeDecoderContext); } + /** + * Returns the version string of the underlying libopus decoder. + */ + public static native String getLibopusVersion(); + private native long opusInit(int sampleRate, int channelCount, int numStreams, int numCoupled, int gain, byte[] streamMap); private native int opusDecode(long decoder, ByteBuffer inputBuffer, int inputSize, diff --git a/extensions/opus/src/main/jni/opus_jni.cc b/extensions/opus/src/main/jni/opus_jni.cc index 0259592c94..e4ee1c60e3 100644 --- a/extensions/opus/src/main/jni/opus_jni.cc +++ b/extensions/opus/src/main/jni/opus_jni.cc @@ -91,6 +91,10 @@ FUNC(void, opusReset, jlong jDecoder) { opus_multistream_decoder_ctl(decoder, OPUS_RESET_STATE); } +FUNC(jstring, getLibopusVersion) { + return env->NewStringUTF(opus_get_version_string()); +} + FUNC(jstring, opusGetErrorMessage, jint errorCode) { return env->NewStringUTF(opus_strerror(errorCode)); } diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer/ext/vp9/LibvpxVideoTrackRenderer.java b/extensions/vp9/src/main/java/com/google/android/exoplayer/ext/vp9/LibvpxVideoTrackRenderer.java index d19a0992b9..a87a5e2590 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer/ext/vp9/LibvpxVideoTrackRenderer.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer/ext/vp9/LibvpxVideoTrackRenderer.java @@ -150,6 +150,15 @@ public final class LibvpxVideoTrackRenderer extends SampleSourceTrackRenderer { formatHolder = new MediaFormatHolder(); } + /** + * Get the version of underlying libvpx library. + * + * @return version of the underlying libvpx library. + */ + public static String getLibvpxVersion() { + return VpxDecoder.getLibvpxVersion(); + } + @Override protected boolean handlesTrack(MediaFormat mediaFormat) { return MimeTypes.VIDEO_VP9.equalsIgnoreCase(mediaFormat.mimeType); diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer/ext/vp9/VpxDecoder.java b/extensions/vp9/src/main/java/com/google/android/exoplayer/ext/vp9/VpxDecoder.java index 3a65c9cf77..05cc243401 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer/ext/vp9/VpxDecoder.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer/ext/vp9/VpxDecoder.java @@ -69,6 +69,11 @@ import java.nio.ByteBuffer; vpxClose(vpxDecContext); } + /** + * Returns the version string of the underlying libvpx decoder. + */ + public static native String getLibvpxVersion(); + private native long vpxInit(); private native long vpxClose(long context); private native long vpxDecode(long context, ByteBuffer encoded, int length); diff --git a/extensions/vp9/src/main/jni/vpx_jni.cc b/extensions/vp9/src/main/jni/vpx_jni.cc index 21a845d779..edaa53383c 100644 --- a/extensions/vp9/src/main/jni/vpx_jni.cc +++ b/extensions/vp9/src/main/jni/vpx_jni.cc @@ -143,6 +143,10 @@ FUNC(jint, vpxGetFrame, jlong jContext, jobject jOutputBuffer, jboolean isRGB) { return 0; } +FUNC(jstring, getLibvpxVersion) { + return env->NewStringUTF(vpx_codec_version_str()); +} + FUNC(jstring, vpxGetErrorMessage, jlong jContext) { vpx_codec_ctx_t* const context = reinterpret_cast(jContext); return env->NewStringUTF(vpx_codec_error(context));