diff options
Diffstat (limited to 'media/java/android')
-rw-r--r-- | media/java/android/media/AudioAttributes.java | 5 | ||||
-rw-r--r-- | media/java/android/media/AudioManager.java | 43 | ||||
-rw-r--r-- | media/java/android/media/CamcorderProfile.java | 9 | ||||
-rw-r--r-- | media/java/android/media/MediaCodec.java | 25 | ||||
-rw-r--r-- | media/java/android/media/MediaCodecList.java | 1 | ||||
-rw-r--r-- | media/java/android/media/MediaDrm.java | 19 | ||||
-rw-r--r-- | media/java/android/media/MediaPlayer.java | 45 | ||||
-rw-r--r-- | media/java/android/media/SubtitleController.java | 2 | ||||
-rw-r--r-- | media/java/android/media/session/MediaSession.java | 7 | ||||
-rw-r--r-- | media/java/android/media/session/MediaSessionLegacyHelper.java | 5 | ||||
-rw-r--r-- | media/java/android/media/tv/TvContentRating.java | 21 |
11 files changed, 148 insertions, 34 deletions
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java index 9b644f4..d7ede34 100644 --- a/media/java/android/media/AudioAttributes.java +++ b/media/java/android/media/AudioAttributes.java @@ -162,16 +162,13 @@ public final class AudioAttributes implements Parcelable { public final static int FLAG_BEACON = 0x1 << 3; /** - * @hide - * CANDIDATE FOR PUBLIC API * Flag requesting the use of an output stream supporting hardware A/V synchronization. */ - // TODO add in FLAG_ALL_PUBLIC when in public API public final static int FLAG_HW_AV_SYNC = 0x1 << 4; private final static int FLAG_ALL = FLAG_AUDIBILITY_ENFORCED | FLAG_SECURE | FLAG_SCO | FLAG_BEACON | FLAG_HW_AV_SYNC; - private final static int FLAG_ALL_PUBLIC = FLAG_AUDIBILITY_ENFORCED; + private final static int FLAG_ALL_PUBLIC = FLAG_AUDIBILITY_ENFORCED | FLAG_HW_AV_SYNC; private int mUsage = USAGE_UNKNOWN; private int mContentType = CONTENT_TYPE_UNKNOWN; diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index e3b8985..6da3c0b 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -36,6 +36,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; +import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.os.ServiceManager; @@ -1959,7 +1960,42 @@ public class AudioManager { return; } - if (!querySoundEffectsEnabled()) { + if (!querySoundEffectsEnabled(Process.myUserHandle().getIdentifier())) { + return; + } + + IAudioService service = getService(); + try { + service.playSoundEffect(effectType); + } catch (RemoteException e) { + Log.e(TAG, "Dead object in playSoundEffect"+e); + } + } + + /** + * Plays a sound effect (Key clicks, lid open/close...) + * @param effectType The type of sound effect. One of + * {@link #FX_KEY_CLICK}, + * {@link #FX_FOCUS_NAVIGATION_UP}, + * {@link #FX_FOCUS_NAVIGATION_DOWN}, + * {@link #FX_FOCUS_NAVIGATION_LEFT}, + * {@link #FX_FOCUS_NAVIGATION_RIGHT}, + * {@link #FX_KEYPRESS_STANDARD}, + * {@link #FX_KEYPRESS_SPACEBAR}, + * {@link #FX_KEYPRESS_DELETE}, + * {@link #FX_KEYPRESS_RETURN}, + * {@link #FX_KEYPRESS_INVALID}, + * @param userId The current user to pull sound settings from + * NOTE: This version uses the UI settings to determine + * whether sounds are heard or not. + * @hide + */ + public void playSoundEffect(int effectType, int userId) { + if (effectType < 0 || effectType >= NUM_SOUND_EFFECTS) { + return; + } + + if (!querySoundEffectsEnabled(userId)) { return; } @@ -2006,8 +2042,9 @@ public class AudioManager { /** * Settings has an in memory cache, so this is fast. */ - private boolean querySoundEffectsEnabled() { - return Settings.System.getInt(mContext.getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED, 0) != 0; + private boolean querySoundEffectsEnabled(int user) { + return Settings.System.getIntForUser(mContext.getContentResolver(), + Settings.System.SOUND_EFFECTS_ENABLED, 0, user) != 0; } diff --git a/media/java/android/media/CamcorderProfile.java b/media/java/android/media/CamcorderProfile.java index 8883d28..5651fc9 100644 --- a/media/java/android/media/CamcorderProfile.java +++ b/media/java/android/media/CamcorderProfile.java @@ -177,9 +177,15 @@ public class CamcorderProfile */ public static final int QUALITY_HIGH_SPEED_1080P = 2004; + /** + * High speed ( >= 100fps) quality level corresponding to the 2160p (3840 x 2160) + * resolution. + */ + public static final int QUALITY_HIGH_SPEED_2160P = 2005; + // Start and end of high speed quality list private static final int QUALITY_HIGH_SPEED_LIST_START = QUALITY_HIGH_SPEED_LOW; - private static final int QUALITY_HIGH_SPEED_LIST_END = QUALITY_HIGH_SPEED_1080P; + private static final int QUALITY_HIGH_SPEED_LIST_END = QUALITY_HIGH_SPEED_2160P; /** * Default recording duration in seconds before the session is terminated. @@ -313,6 +319,7 @@ public class CamcorderProfile * @see #QUALITY_HIGH_SPEED_480P * @see #QUALITY_HIGH_SPEED_720P * @see #QUALITY_HIGH_SPEED_1080P + * @see #QUALITY_HIGH_SPEED_2160P */ public static CamcorderProfile get(int cameraId, int quality) { if (!((quality >= QUALITY_LIST_START && diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 675916b..1c7c9ea 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -672,6 +672,11 @@ final public class MediaCodec { super(detailMessage); mErrorCode = errorCode; mActionCode = actionCode; + + // TODO get this from codec + final String sign = errorCode < 0 ? "neg_" : ""; + mDiagnosticInfo = + "android.media.MediaCodec.error_" + sign + Math.abs(errorCode); } /** @@ -696,15 +701,28 @@ final public class MediaCodec { * Retrieve the error code associated with a CodecException. * This is opaque diagnostic information and may depend on * hardware or API level. + * + * @hide */ public int getErrorCode() { return mErrorCode; } + /** + * Retrieve a human readable diagnostic information string + * associated with the exception. DO NOT SHOW THIS TO END-USERS! + * This string will not be localized or generally comprehensible + * to end-users. + */ + public String getDiagnosticInfo() { + return mDiagnosticInfo; + } + /* Must be in sync with android_media_MediaCodec.cpp */ private final static int ACTION_TRANSIENT = 1; private final static int ACTION_RECOVERABLE = 2; + private final String mDiagnosticInfo; private final int mErrorCode; private final int mActionCode; } @@ -737,6 +755,13 @@ final public class MediaCodec { public static final int ERROR_RESOURCE_BUSY = 3; /** + * This indicates that the output protection levels supported by the + * device are not sufficient to meet the requirements set by the + * content owner in the license policy. + */ + public static final int ERROR_INSUFFICIENT_OUTPUT_PROTECTION = 4; + + /** * Retrieve the error code associated with a CryptoException */ public int getErrorCode() { diff --git a/media/java/android/media/MediaCodecList.java b/media/java/android/media/MediaCodecList.java index 85e9b16..0dcbd65 100644 --- a/media/java/android/media/MediaCodecList.java +++ b/media/java/android/media/MediaCodecList.java @@ -118,6 +118,7 @@ final public class MediaCodecList { /** @hide */ public static MediaCodecInfo getInfoFor(String codec) { + initCodecList(); return sAllCodecInfos[findCodecByName(codec)]; } diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java index ca707d8..1490732 100644 --- a/media/java/android/media/MediaDrm.java +++ b/media/java/android/media/MediaDrm.java @@ -188,18 +188,37 @@ public final class MediaDrm { */ public static final class MediaDrmStateException extends java.lang.IllegalStateException { private final int mErrorCode; + private final String mDiagnosticInfo; public MediaDrmStateException(int errorCode, String detailMessage) { super(detailMessage); mErrorCode = errorCode; + + // TODO get this from DRM session + final String sign = errorCode < 0 ? "neg_" : ""; + mDiagnosticInfo = + "android.media.MediaDrm.error_" + sign + Math.abs(errorCode); + } /** * Retrieve the associated error code + * + * @hide */ public int getErrorCode() { return mErrorCode; } + + /** + * Retrieve a human readable diagnostic information string + * associated with the exception. DO NOT SHOW THIS TO END-USERS! + * This string will not be localized or generally comprehensible + * to end-users. + */ + public String getDiagnosticInfo() { + return mDiagnosticInfo; + } } /** diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 9343aa4..afa0b6e 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -1929,6 +1929,7 @@ public class MediaPlayer implements SubtitleController.Listener mSubtitleController.setAnchor(anchor); } + private final Object mInbandSubtitleLock = new Object(); private SubtitleTrack[] mInbandSubtitleTracks; private int mSelectedSubtitleTrackIndex = -1; private Vector<SubtitleTrack> mOutOfBandSubtitleTracks; @@ -2036,19 +2037,21 @@ public class MediaPlayer implements SubtitleController.Listener } TrackInfo[] tracks = getInbandTrackInfo(); - SubtitleTrack[] inbandTracks = new SubtitleTrack[tracks.length]; - for (int i=0; i < tracks.length; i++) { - if (tracks[i].getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) { - if (i < mInbandSubtitleTracks.length) { - inbandTracks[i] = mInbandSubtitleTracks[i]; - } else { - SubtitleTrack track = mSubtitleController.addTrack( - tracks[i].getFormat()); - inbandTracks[i] = track; + synchronized (mInbandSubtitleLock) { + SubtitleTrack[] inbandTracks = new SubtitleTrack[tracks.length]; + for (int i=0; i < tracks.length; i++) { + if (tracks[i].getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) { + if (i < mInbandSubtitleTracks.length) { + inbandTracks[i] = mInbandSubtitleTracks[i]; + } else { + SubtitleTrack track = mSubtitleController.addTrack( + tracks[i].getFormat()); + inbandTracks[i] = track; + } } } + mInbandSubtitleTracks = inbandTracks; } - mInbandSubtitleTracks = inbandTracks; mSubtitleController.selectDefaultTrack(); } @@ -2224,9 +2227,9 @@ public class MediaPlayer implements SubtitleController.Listener try { Libcore.os.lseek(fd3, offset2, OsConstants.SEEK_SET); byte[] buffer = new byte[4096]; - for (int total = 0; total < length2;) { - int remain = (int)length2 - total; - int bytes = IoBridge.read(fd3, buffer, 0, Math.min(buffer.length, remain)); + for (long total = 0; total < length2;) { + int bytesToRead = (int) Math.min(buffer.length, length2 - total); + int bytes = IoBridge.read(fd3, buffer, 0, bytesToRead); if (bytes < 0) { break; } else { @@ -2358,6 +2361,18 @@ public class MediaPlayer implements SubtitleController.Listener throws IllegalStateException { // handle subtitle track through subtitle controller SubtitleTrack track = null; + synchronized (mInbandSubtitleLock) { + if (mInbandSubtitleTracks.length == 0) { + TrackInfo[] tracks = getInbandTrackInfo(); + mInbandSubtitleTracks = new SubtitleTrack[tracks.length]; + for (int i=0; i < tracks.length; i++) { + if (tracks[i].getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) { + mInbandSubtitleTracks[i] = mSubtitleController.addTrack(tracks[i].getFormat()); + } + } + } + } + if (index < mInbandSubtitleTracks.length) { track = mInbandSubtitleTracks[index]; } else if (index < mInbandSubtitleTracks.length + mOutOfBandSubtitleTracks.size()) { @@ -3256,9 +3271,7 @@ public class MediaPlayer implements SubtitleController.Listener if (DEBUG) Log.d(TAG, "scheduleUpdate"); int i = registerListener(listener); - if (mStopped) { - scheduleNotification(NOTIFY_STOP, 0 /* delay */); - } else { + if (!mStopped) { mTimes[i] = 0; scheduleNotification(NOTIFY_TIME, 0 /* delay */); } diff --git a/media/java/android/media/SubtitleController.java b/media/java/android/media/SubtitleController.java index 37adb8c..f82dbe0 100644 --- a/media/java/android/media/SubtitleController.java +++ b/media/java/android/media/SubtitleController.java @@ -275,7 +275,7 @@ public class SubtitleController { mSelectedTrack.getFormat().getInteger( MediaFormat.KEY_IS_FORCED_SUBTITLE, 0) != 0)) { show(); - } else { + } else if (mSelectedTrack != null && !mSelectedTrack.isTimedText()) { hide(); } mVisibilityIsExplicit = false; diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java index 8cb039a..2c38697 100644 --- a/media/java/android/media/session/MediaSession.java +++ b/media/java/android/media/session/MediaSession.java @@ -191,11 +191,8 @@ public final class MediaSession { return; } if (mCallback != null) { - if (mCallback.mCallback == callback) { - Log.w(TAG, "Tried to set same callback, ignoring"); - return; - } - // We're changing callbacks, clear the session from the old one. + // We're updating the callback, clear the session from the old + // one. mCallback.mCallback.mSession = null; } if (handler == null) { diff --git a/media/java/android/media/session/MediaSessionLegacyHelper.java b/media/java/android/media/session/MediaSessionLegacyHelper.java index aa196a9..06e40c5 100644 --- a/media/java/android/media/session/MediaSessionLegacyHelper.java +++ b/media/java/android/media/session/MediaSessionLegacyHelper.java @@ -467,10 +467,7 @@ public class MediaSessionLegacyHelper { mSessions.remove(mPi); } else if (mCb == null) { mCb = new SessionCallback(); - Handler handler = null; - if (Looper.myLooper() == null) { - handler = new Handler(Looper.getMainLooper()); - } + Handler handler = new Handler(Looper.getMainLooper()); mSession.setCallback(mCb, handler); } } diff --git a/media/java/android/media/tv/TvContentRating.java b/media/java/android/media/tv/TvContentRating.java index 7d1c7c6..b4ec2b3 100644 --- a/media/java/android/media/tv/TvContentRating.java +++ b/media/java/android/media/tv/TvContentRating.java @@ -247,6 +247,10 @@ import java.util.Objects; * <td>TV content rating system for Iceland</td> * </tr> * <tr> + * <td>JP_TV</td> + * <td>TV content rating system for Japan</td> + * </tr> + * <tr> * <td>KR_TV</td> * <td>TV content rating system for South Korea</td> * </tr> @@ -912,6 +916,23 @@ import java.util.Objects; * <td>Programs suitable for ages 18 and older</td> * </tr> * <tr> + * <td valign="top" rowspan="4">JP_TV</td> + * <td>JP_TV_G</td> + * <td>General, suitable for all ages</td> + * </tr> + * <tr> + * <td>JP_TV_PG12</td> + * <td>Parental guidance requested for young people under 12 years</td> + * </tr> + * <tr> + * <td>JP_TV_R15</td> + * <td>For persons aged 15 and above only</td> + * </tr> + * <tr> + * <td>JP_TV_R18</td> + * <td>For persons aged 18 and above only</td> + * </tr> + * <tr> * <td valign="top" rowspan="5">KR_TV</td> * <td>KR_TV_ALL</td> * <td>Appropriate for all ages</td> |