Merge changes Iecf8b207,I2f2a05ef into pi-dev

* changes:
  Make MP2.prepare|play handled with task queue
  Remove unused imports in MediaPlayer2.
This commit is contained in:
TreeHugger Robot
2018-03-06 00:19:54 +00:00
committed by Android (Google) Code Review
3 changed files with 105 additions and 26 deletions

View File

@@ -22,17 +22,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.media.MediaDrm;
import android.media.MediaFormat;
import android.media.MediaPlayer2Impl;
import android.media.MediaPlayerBase;
import android.media.MediaTimeProvider;
import android.media.PlaybackParams;
import android.media.SubtitleController;
import android.media.SubtitleController.Anchor;
import android.media.SubtitleData;
import android.media.SubtitleTrack.RenderingWidget;
import android.media.SyncParams;
import android.net.Uri;
import android.os.Handler;
import android.os.Parcel;
@@ -43,14 +32,13 @@ import android.view.SurfaceHolder;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.lang.AutoCloseable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.Executor;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Executor;
/**
@@ -2019,12 +2007,12 @@ public abstract class MediaPlayer2 extends MediaPlayerBase
public static final int MEDIA_CALL_DESELECT_TRACK = 2;
/** The player just completed a call {@code loopCurrent}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback.CallComplete
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_LOOP_CURRENT = 3;
/** The player just completed a call {@code pause}.
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback.CallComplete
* @see android.media.MediaPlayer2.MediaPlayer2EventCallback#onCallComplete
*/
public static final int MEDIA_CALL_PAUSE = 4;

View File

@@ -35,16 +35,16 @@ import android.os.Message;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.PersistableBundle;
import android.os.Process;
import android.os.PowerManager;
import android.os.Process;
import android.os.SystemProperties;
import android.provider.Settings;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Pair;
import android.util.ArrayMap;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.widget.VideoView;
@@ -63,10 +63,7 @@ import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.Runnable;
import java.lang.ref.WeakReference;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.HttpCookie;
import java.net.HttpURLConnection;
import java.net.URL;
@@ -74,15 +71,15 @@ import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collections;
import java.util.concurrent.Executor;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.UUID;
import java.util.Vector;
import java.util.concurrent.Executor;
/**
@@ -135,6 +132,14 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
private ProvisioningThread mDrmProvisioningThread;
//--- guarded by |mDrmLock| end
private HandlerThread mHandlerThread;
private final Handler mTaskHandler;
private final Object mTaskLock = new Object();
@GuardedBy("mTaskLock")
private final List<Task> mPendingTasks = new LinkedList<>();
@GuardedBy("mTaskLock")
private Task mCurrentTask;
/**
* Default constructor.
* <p>When done with the MediaPlayer2Impl, you should call {@link #close()},
@@ -151,6 +156,11 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
mEventHandler = null;
}
mHandlerThread = new HandlerThread("MediaPlayer2TaskThread");
mHandlerThread.start();
looper = mHandlerThread.getLooper();
mTaskHandler = new Handler(looper);
mTimeProvider = new TimeProvider(this);
mOpenSubtitleSources = new Vector<InputStream>();
mGuard.open("close");
@@ -201,8 +211,18 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
*/
@Override
public void play() {
stayAwake(true);
_start();
synchronized (mTaskLock) {
mPendingTasks.add(new Task(MEDIA_CALL_PLAY, false) {
@Override
int process() {
stayAwake(true);
_start();
// TODO: define public constants for return value (status).
return 0;
}
});
processPendingTask_l();
}
}
private native void _start() throws IllegalStateException;
@@ -218,7 +238,21 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
* @throws IllegalStateException if it is called in an invalid state
*/
@Override
public native void prepare();
public void prepare() {
synchronized (mTaskLock) {
mPendingTasks.add(new Task(MEDIA_CALL_PREPARE, true) {
@Override
int process() {
_prepare();
// TODO: define public constants for return value (status).
return 0;
}
});
processPendingTask_l();
}
}
public native void _prepare();
/**
* Pauses playback. Call play() to resume.
@@ -695,6 +729,18 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
public void clearPendingCommands() {
}
@GuardedBy("mTaskLock")
private void processPendingTask_l() {
if (mCurrentTask != null) {
return;
}
if (!mPendingTasks.isEmpty()) {
Task task = mPendingTasks.remove(0);
mCurrentTask = task;
mTaskHandler.post(task);
}
}
private void handleDataSource(boolean isCurrent, @NonNull DataSourceDesc dsd, long srcId)
throws IOException {
Preconditions.checkNotNull(dsd, "the DataSourceDesc cannot be null");
@@ -2525,6 +2571,10 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
synchronized (mEventCbLock) {
mEventCallbackRecords.clear();
}
if (mHandlerThread != null) {
mHandlerThread.quitSafely();
mHandlerThread = null;
}
if (mTimeProvider != null) {
mTimeProvider.close();
mTimeProvider = null;
@@ -2638,6 +2688,13 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
}
}
}
synchronized (mTaskLock) {
if (mCurrentTask.mMediaCallType == MEDIA_CALL_PREPARE
&& mCurrentTask.mNeedToWaitForEventToComplete) {
mCurrentTask = null;
processPendingTask_l();
}
}
return;
}
@@ -4506,4 +4563,38 @@ public final class MediaPlayer2Impl extends MediaPlayer2 {
}
}
}
private abstract class Task implements Runnable {
private final int mMediaCallType;
private final boolean mNeedToWaitForEventToComplete;
public Task (int mediaCallType, boolean needToWaitForEventToComplete) {
mMediaCallType = mediaCallType;
mNeedToWaitForEventToComplete = needToWaitForEventToComplete;
}
abstract int process();
@Override
public void run() {
int status = process();
if (!mNeedToWaitForEventToComplete) {
final DataSourceDesc dsd;
synchronized (mSrcLock) {
dsd = mCurrentDSD;
}
synchronized (mEventCbLock) {
for (Pair<Executor, MediaPlayer2EventCallback> cb : mEventCallbackRecords) {
cb.first.execute(() -> cb.second.onCallComplete(
MediaPlayer2Impl.this, dsd, mMediaCallType, status));
}
}
synchronized (mTaskLock) {
mCurrentTask = null;
processPendingTask_l();
}
}
}
};
}

View File

@@ -1490,7 +1490,7 @@ static const JNINativeMethod gMethods[] = {
{"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaPlayer2_setVideoSurface},
{"getBufferingParams", "()Landroid/media/BufferingParams;", (void *)android_media_MediaPlayer2_getBufferingParams},
{"setBufferingParams", "(Landroid/media/BufferingParams;)V", (void *)android_media_MediaPlayer2_setBufferingParams},
{"prepare", "()V", (void *)android_media_MediaPlayer2_prepare},
{"_prepare", "()V", (void *)android_media_MediaPlayer2_prepare},
{"_start", "()V", (void *)android_media_MediaPlayer2_start},
{"_stop", "()V", (void *)android_media_MediaPlayer2_stop},
{"native_getMediaPlayer2State", "()I", (void *)android_media_MediaPlayer2_getMediaPlayer2State},