blob: 86426ff98a1335b1380816ed9f36fd2cfb78eca0 [file] [log] [blame]
// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.media;
import android.media.MediaPlayer;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
// This class implements all the listener interface for android mediaplayer.
// Callbacks will be sent to the native class for processing.
@JNINamespace("media")
class MediaPlayerListener implements MediaPlayer.OnPreparedListener,
MediaPlayer.OnCompletionListener,
MediaPlayer.OnVideoSizeChangedListener,
MediaPlayer.OnErrorListener {
// These values are mirrored as enums in media/base/android/media_player_android.h.
// Please ensure they stay in sync.
private static final int MEDIA_ERROR_FORMAT = 0;
private static final int MEDIA_ERROR_DECODE = 1;
private static final int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 2;
private static final int MEDIA_ERROR_INVALID_CODE = 3;
private static final int MEDIA_ERROR_SERVER_DIED = 4;
// These values are copied from android media player.
public static final int MEDIA_ERROR_MALFORMED = -1007;
public static final int MEDIA_ERROR_TIMED_OUT = -110;
// Used to determine the class instance to dispatch the native call to.
private long mNativeMediaPlayerListener;
private MediaPlayerListener(long nativeMediaPlayerListener) {
mNativeMediaPlayerListener = nativeMediaPlayerListener;
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
int errorType;
switch (what) {
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
switch (extra) {
case MEDIA_ERROR_MALFORMED:
errorType = MEDIA_ERROR_DECODE;
break;
case MEDIA_ERROR_TIMED_OUT:
errorType = MEDIA_ERROR_INVALID_CODE;
break;
default:
errorType = MEDIA_ERROR_FORMAT;
break;
}
break;
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
errorType = MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK;
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
errorType = MEDIA_ERROR_SERVER_DIED;
break;
default:
// There are some undocumented error codes for android media player.
// For example, when surfaceTexture got deleted before we setVideoSuface
// to NULL, mediaplayer will report error -38. These errors should be ignored
// and not be treated as an error to webkit.
errorType = MEDIA_ERROR_INVALID_CODE;
break;
}
MediaPlayerListenerJni.get().onMediaError(
mNativeMediaPlayerListener, MediaPlayerListener.this, errorType);
return true;
}
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
MediaPlayerListenerJni.get().onVideoSizeChanged(
mNativeMediaPlayerListener, MediaPlayerListener.this, width, height);
}
@Override
public void onCompletion(MediaPlayer mp) {
MediaPlayerListenerJni.get().onPlaybackComplete(
mNativeMediaPlayerListener, MediaPlayerListener.this);
}
@Override
public void onPrepared(MediaPlayer mp) {
MediaPlayerListenerJni.get().onMediaPrepared(
mNativeMediaPlayerListener, MediaPlayerListener.this);
}
@CalledByNative
private static MediaPlayerListener create(
long nativeMediaPlayerListener, MediaPlayerBridge mediaPlayerBridge) {
final MediaPlayerListener listener = new MediaPlayerListener(nativeMediaPlayerListener);
if (mediaPlayerBridge != null) {
mediaPlayerBridge.setOnCompletionListener(listener);
mediaPlayerBridge.setOnErrorListener(listener);
mediaPlayerBridge.setOnPreparedListener(listener);
mediaPlayerBridge.setOnVideoSizeChangedListener(listener);
}
return listener;
}
/**
* See media/base/android/media_player_listener.cc for all the following functions.
*/
@NativeMethods
interface Natives {
void onMediaError(
long nativeMediaPlayerListener, MediaPlayerListener caller, int errorType);
void onVideoSizeChanged(
long nativeMediaPlayerListener, MediaPlayerListener caller, int width, int height);
void onMediaPrepared(long nativeMediaPlayerListener, MediaPlayerListener caller);
void onPlaybackComplete(long nativeMediaPlayerListener, MediaPlayerListener caller);
}
}