Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0a8a8f0b authored by Wei Jia's avatar Wei Jia
Browse files

add MediaPlayer2

Forked from 9070e295
Test: plays local files, callback source and streaming.
Bug: 63934228
Change-Id: I692007c07eb2819f8ad1d843e4e2b1fc96fbecca
parent df5e9283
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -661,7 +661,9 @@ java_library {
    ],

    // Loaded with System.loadLibrary by android.view.textclassifier
    required: ["libtextclassifier"],
    required: [
        "libtextclassifier",
        "libmedia2_jni",],

    javac_shard_size: 150,

+203 −0
Original line number Diff line number Diff line
@@ -22340,6 +22340,40 @@ package android.media {
    field public static final int QUALITY_MEDIUM = 1; // 0x1
  }
  public final class DataSourceDesc {
    method public long getEndPosition();
    method public java.io.FileDescriptor getFileDescriptor();
    method public long getFileDescriptorLength();
    method public long getFileDescriptorOffset();
    method public long getId();
    method public android.media.Media2DataSource getMedia2DataSource();
    method public long getStartPosition();
    method public int getType();
    method public android.net.Uri getUri();
    method public android.content.Context getUriContext();
    method public java.util.List<java.net.HttpCookie> getUriCookies();
    method public java.util.Map<java.lang.String, java.lang.String> getUriHeaders();
    field public static final long LONG_MAX = 576460752303423487L; // 0x7ffffffffffffffL
    field public static final int TYPE_CALLBACK = 1; // 0x1
    field public static final int TYPE_FD = 2; // 0x2
    field public static final int TYPE_NONE = 0; // 0x0
    field public static final int TYPE_URI = 3; // 0x3
  }
  public static class DataSourceDesc.Builder {
    ctor public DataSourceDesc.Builder();
    ctor public DataSourceDesc.Builder(android.media.DataSourceDesc);
    method public android.media.DataSourceDesc build();
    method public android.media.DataSourceDesc.Builder setDataSource(android.media.Media2DataSource);
    method public android.media.DataSourceDesc.Builder setDataSource(java.io.FileDescriptor);
    method public android.media.DataSourceDesc.Builder setDataSource(java.io.FileDescriptor, long, long);
    method public android.media.DataSourceDesc.Builder setDataSource(android.content.Context, android.net.Uri);
    method public android.media.DataSourceDesc.Builder setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>, java.util.List<java.net.HttpCookie>);
    method public android.media.DataSourceDesc.Builder setEndPosition(long);
    method public android.media.DataSourceDesc.Builder setId(long);
    method public android.media.DataSourceDesc.Builder setStartPosition(long);
  }
  public final class DeniedByServerException extends android.media.MediaDrmException {
    ctor public DeniedByServerException(java.lang.String);
  }
@@ -22616,6 +22650,12 @@ package android.media {
    method public abstract void onJetUserIdUpdate(android.media.JetPlayer, int, int);
  }
  public abstract class Media2DataSource implements java.io.Closeable {
    ctor public Media2DataSource();
    method public abstract long getSize() throws java.io.IOException;
    method public abstract int readAt(long, byte[], int, int) throws java.io.IOException;
  }
  public class MediaActionSound {
    ctor public MediaActionSound();
    method public void load(int);
@@ -23812,6 +23852,169 @@ package android.media {
    field public static final int MEDIA_TRACK_TYPE_VIDEO = 1; // 0x1
  }
  public abstract class MediaPlayer2 implements android.media.AudioRouting java.lang.AutoCloseable {
    method public abstract void addPlaylistItem(int, android.media.DataSourceDesc);
    method public abstract void attachAuxEffect(int);
    method public abstract void clearPendingCommands();
    method public abstract void close();
    method public static final android.media.MediaPlayer2 create();
    method public abstract void deselectTrack(int);
    method public abstract android.media.DataSourceDesc editPlaylistItem(int, android.media.DataSourceDesc);
    method public abstract int getAudioSessionId();
    method public abstract android.media.DataSourceDesc getCurrentDataSource();
    method public abstract int getCurrentPlaylistItemIndex();
    method public abstract int getCurrentPosition();
    method public abstract android.media.MediaPlayer2.DrmInfo getDrmInfo();
    method public abstract java.lang.String getDrmPropertyString(java.lang.String) throws android.media.MediaPlayer2.NoDrmSchemeException;
    method public abstract int getDuration();
    method public abstract android.media.MediaDrm.KeyRequest getKeyRequest(byte[], byte[], java.lang.String, int, java.util.Map<java.lang.String, java.lang.String>) throws android.media.MediaPlayer2.NoDrmSchemeException;
    method public abstract int getLoopingMode();
    method public abstract android.os.PersistableBundle getMetrics();
    method public abstract android.media.PlaybackParams getPlaybackParams();
    method public abstract java.util.List<android.media.DataSourceDesc> getPlaylist();
    method public abstract int getSelectedTrack(int);
    method public abstract android.media.SyncParams getSyncParams();
    method public abstract android.media.MediaTimestamp getTimestamp();
    method public abstract java.util.List<android.media.MediaPlayer2.TrackInfo> getTrackInfo();
    method public abstract int getVideoHeight();
    method public abstract int getVideoWidth();
    method public abstract boolean isPlaying();
    method public abstract void movePlaylistItem(int, int);
    method public abstract void pause();
    method public abstract void play();
    method public abstract void prepareAsync();
    method public abstract void prepareDrm(java.util.UUID) throws android.media.MediaPlayer2.ProvisioningNetworkErrorException, android.media.MediaPlayer2.ProvisioningServerErrorException, android.media.ResourceBusyException, android.media.UnsupportedSchemeException;
    method public abstract byte[] provideKeyResponse(byte[], byte[]) throws android.media.DeniedByServerException, android.media.MediaPlayer2.NoDrmSchemeException;
    method public abstract void registerDrmEventCallback(java.util.concurrent.Executor, android.media.MediaPlayer2.DrmEventCallback);
    method public abstract void registerEventCallback(java.util.concurrent.Executor, android.media.MediaPlayer2.EventCallback);
    method public abstract void releaseDrm() throws android.media.MediaPlayer2.NoDrmSchemeException;
    method public abstract android.media.DataSourceDesc removePlaylistItem(int);
    method public abstract void reset();
    method public abstract void restoreKeys(byte[]) throws android.media.MediaPlayer2.NoDrmSchemeException;
    method public abstract void seekTo(long, int);
    method public abstract void selectTrack(int);
    method public abstract void setAudioAttributes(android.media.AudioAttributes);
    method public abstract void setAudioSessionId(int);
    method public abstract void setAuxEffectSendLevel(float);
    method public abstract void setCurrentPlaylistItem(int);
    method public abstract void setDataSource(android.media.DataSourceDesc) throws java.io.IOException;
    method public abstract void setDrmPropertyString(java.lang.String, java.lang.String) throws android.media.MediaPlayer2.NoDrmSchemeException;
    method public abstract void setLoopingMode(int);
    method public abstract void setNextPlaylistItem(int);
    method public abstract void setOnDrmConfigHelper(android.media.MediaPlayer2.OnDrmConfigHelper);
    method public abstract void setPlaybackParams(android.media.PlaybackParams);
    method public abstract void setPlaylist(java.util.List<android.media.DataSourceDesc>, int) throws java.io.IOException;
    method public abstract void setSurface(android.view.Surface);
    method public abstract void setSyncParams(android.media.SyncParams);
    method public abstract void setVolume(float, float);
    method public abstract void unregisterDrmEventCallback(android.media.MediaPlayer2.DrmEventCallback);
    method public abstract void unregisterEventCallback(android.media.MediaPlayer2.EventCallback);
    field public static final int LOOPING_MODE_FULL = 1; // 0x1
    field public static final int LOOPING_MODE_NONE = 0; // 0x0
    field public static final int LOOPING_MODE_SHUFFLE = 3; // 0x3
    field public static final int LOOPING_MODE_SINGLE = 2; // 0x2
    field public static final int MEDIA_ERROR_IO = -1004; // 0xfffffc14
    field public static final int MEDIA_ERROR_MALFORMED = -1007; // 0xfffffc11
    field public static final int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200; // 0xc8
    field public static final int MEDIA_ERROR_TIMED_OUT = -110; // 0xffffff92
    field public static final int MEDIA_ERROR_UNKNOWN = 1; // 0x1
    field public static final int MEDIA_ERROR_UNSUPPORTED = -1010; // 0xfffffc0e
    field public static final int MEDIA_INFO_AUDIO_NOT_PLAYING = 804; // 0x324
    field public static final int MEDIA_INFO_AUDIO_RENDERING_START = 4; // 0x4
    field public static final int MEDIA_INFO_BAD_INTERLEAVING = 800; // 0x320
    field public static final int MEDIA_INFO_BUFFERING_END = 702; // 0x2be
    field public static final int MEDIA_INFO_BUFFERING_START = 701; // 0x2bd
    field public static final int MEDIA_INFO_COMPLETE_CALL_PAUSE = 102; // 0x66
    field public static final int MEDIA_INFO_COMPLETE_CALL_PLAY = 101; // 0x65
    field public static final int MEDIA_INFO_COMPLETE_CALL_SEEK = 103; // 0x67
    field public static final int MEDIA_INFO_METADATA_UPDATE = 802; // 0x322
    field public static final int MEDIA_INFO_NOT_SEEKABLE = 801; // 0x321
    field public static final int MEDIA_INFO_PLAYBACK_COMPLETE = 5; // 0x5
    field public static final int MEDIA_INFO_PLAYLIST_END = 6; // 0x6
    field public static final int MEDIA_INFO_PREPARED = 100; // 0x64
    field public static final int MEDIA_INFO_STARTED_AS_NEXT = 2; // 0x2
    field public static final int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902; // 0x386
    field public static final int MEDIA_INFO_UNKNOWN = 1; // 0x1
    field public static final int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901; // 0x385
    field public static final int MEDIA_INFO_VIDEO_NOT_PLAYING = 805; // 0x325
    field public static final int MEDIA_INFO_VIDEO_RENDERING_START = 3; // 0x3
    field public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700; // 0x2bc
    field public static final int PREPARE_DRM_STATUS_PREPARATION_ERROR = 3; // 0x3
    field public static final int PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR = 1; // 0x1
    field public static final int PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR = 2; // 0x2
    field public static final int PREPARE_DRM_STATUS_SUCCESS = 0; // 0x0
    field public static final int SEEK_CLOSEST = 3; // 0x3
    field public static final int SEEK_CLOSEST_SYNC = 2; // 0x2
    field public static final int SEEK_NEXT_SYNC = 1; // 0x1
    field public static final int SEEK_PREVIOUS_SYNC = 0; // 0x0
    field public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT = 1; // 0x1
  }
  public static abstract class MediaPlayer2.DrmEventCallback {
    ctor public MediaPlayer2.DrmEventCallback();
    method public void onDrmInfo(android.media.MediaPlayer2, android.media.MediaPlayer2.DrmInfo);
    method public void onDrmPrepared(android.media.MediaPlayer2, int);
  }
  public static abstract class MediaPlayer2.DrmInfo {
    ctor public MediaPlayer2.DrmInfo();
    method public abstract java.util.Map<java.util.UUID, byte[]> getPssh();
    method public abstract java.util.List<java.util.UUID> getSupportedSchemes();
  }
  public static abstract class MediaPlayer2.EventCallback {
    ctor public MediaPlayer2.EventCallback();
    method public void onBufferingUpdate(android.media.MediaPlayer2, long, int);
    method public void onError(android.media.MediaPlayer2, long, int, int);
    method public void onInfo(android.media.MediaPlayer2, long, int, int);
    method public void onTimedMetaDataAvailable(android.media.MediaPlayer2, long, android.media.TimedMetaData);
    method public void onVideoSizeChanged(android.media.MediaPlayer2, long, int, int);
  }
  public static final class MediaPlayer2.MetricsConstants {
    field public static final java.lang.String CODEC_AUDIO = "android.media.mediaplayer.audio.codec";
    field public static final java.lang.String CODEC_VIDEO = "android.media.mediaplayer.video.codec";
    field public static final java.lang.String DURATION = "android.media.mediaplayer.durationMs";
    field public static final java.lang.String ERRORS = "android.media.mediaplayer.err";
    field public static final java.lang.String ERROR_CODE = "android.media.mediaplayer.errcode";
    field public static final java.lang.String FRAMES = "android.media.mediaplayer.frames";
    field public static final java.lang.String FRAMES_DROPPED = "android.media.mediaplayer.dropped";
    field public static final java.lang.String HEIGHT = "android.media.mediaplayer.height";
    field public static final java.lang.String MIME_TYPE_AUDIO = "android.media.mediaplayer.audio.mime";
    field public static final java.lang.String MIME_TYPE_VIDEO = "android.media.mediaplayer.video.mime";
    field public static final java.lang.String PLAYING = "android.media.mediaplayer.playingMs";
    field public static final java.lang.String WIDTH = "android.media.mediaplayer.width";
  }
  public static abstract class MediaPlayer2.NoDrmSchemeException extends android.media.MediaDrmException {
    ctor protected MediaPlayer2.NoDrmSchemeException(java.lang.String);
  }
  public static abstract interface MediaPlayer2.OnDrmConfigHelper {
    method public abstract void onDrmConfig(android.media.MediaPlayer2);
  }
  public static abstract class MediaPlayer2.ProvisioningNetworkErrorException extends android.media.MediaDrmException {
    ctor protected MediaPlayer2.ProvisioningNetworkErrorException(java.lang.String);
  }
  public static abstract class MediaPlayer2.ProvisioningServerErrorException extends android.media.MediaDrmException {
    ctor protected MediaPlayer2.ProvisioningServerErrorException(java.lang.String);
  }
  public static abstract class MediaPlayer2.TrackInfo {
    ctor public MediaPlayer2.TrackInfo();
    method public abstract android.media.MediaFormat getFormat();
    method public abstract java.lang.String getLanguage();
    method public abstract int getTrackType();
    method public abstract java.lang.String toString();
    field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2
    field public static final int MEDIA_TRACK_TYPE_METADATA = 5; // 0x5
    field public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4; // 0x4
    field public static final int MEDIA_TRACK_TYPE_UNKNOWN = 0; // 0x0
    field public static final int MEDIA_TRACK_TYPE_VIDEO = 1; // 0x1
  }
  public class MediaRecorder implements android.media.AudioRouting {
    ctor public MediaRecorder();
    method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler);
+465 −0

File added.

Preview size limit exceeded, changes collapsed.

+62 −0
Original line number Diff line number Diff line
/*
 * Copyright 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


package android.media;

import java.io.Closeable;
import java.io.IOException;

/**
 * For supplying media data to the framework. Implement this if your app has
 * special requirements for the way media data is obtained.
 *
 * <p class="note">Methods of this interface may be called on multiple different
 * threads. There will be a thread synchronization point between each call to ensure that
 * modifications to the state of your Media2DataSource are visible to future calls. This means
 * you don't need to do your own synchronization unless you're modifying the
 * Media2DataSource from another thread while it's being used by the framework.</p>
 *
 */
public abstract class Media2DataSource implements Closeable {
    /**
     * Called to request data from the given position.
     *
     * Implementations should should write up to {@code size} bytes into
     * {@code buffer}, and return the number of bytes written.
     *
     * Return {@code 0} if size is zero (thus no bytes are read).
     *
     * Return {@code -1} to indicate that end of stream is reached.
     *
     * @param position the position in the data source to read from.
     * @param buffer the buffer to read the data into.
     * @param offset the offset within buffer to read the data into.
     * @param size the number of bytes to read.
     * @throws IOException on fatal errors.
     * @return the number of bytes read, or -1 if there was an error.
     */
    public abstract int readAt(long position, byte[] buffer, int offset, int size)
            throws IOException;

    /**
     * Called to get the size of the data source.
     *
     * @throws IOException on fatal errors
     * @return the size of data source in bytes, or -1 if the size is unknown.
     */
    public abstract long getSize() throws IOException;
}
+385 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading