1daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang/* 2daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Copyright 2018 The Android Open Source Project 3daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 4daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Licensed under the Apache License, Version 2.0 (the "License"); 5daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * you may not use this file except in compliance with the License. 6daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * You may obtain a copy of the License at 7daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 8daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * http://www.apache.org/licenses/LICENSE-2.0 9daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 10daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Unless required by applicable law or agreed to in writing, software 11daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * distributed under the License is distributed on an "AS IS" BASIS, 12daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * See the License for the specific language governing permissions and 14daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * limitations under the License. 15daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 16daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 17daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangpackage androidx.media; 18daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 19daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP; 20daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 21daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.annotation.TargetApi; 22daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.graphics.SurfaceTexture; 23daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.media.AudioAttributes; 24daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.media.DeniedByServerException; 25daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.media.MediaDrm; 26daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.media.MediaDrmException; 27daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.media.MediaFormat; 28daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.media.MediaTimestamp; 29daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.media.PlaybackParams; 30daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.media.ResourceBusyException; 317e23d54808f79ce964686e7551765da17bc3f585Dongwon Kangimport android.media.SubtitleData; 32daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.media.SyncParams; 33daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.media.TimedMetaData; 34daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.media.UnsupportedSchemeException; 35daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.os.Build; 36daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.os.PersistableBundle; 37daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport android.view.Surface; 38daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 39daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport androidx.annotation.IntDef; 40daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport androidx.annotation.NonNull; 41daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport androidx.annotation.Nullable; 42daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport androidx.annotation.RestrictTo; 43daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 44daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport java.lang.annotation.Retention; 45daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport java.lang.annotation.RetentionPolicy; 46daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport java.util.List; 47daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport java.util.Map; 48daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport java.util.UUID; 49daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kangimport java.util.concurrent.Executor; 50daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 51daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang/** 52a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * MediaPlayer2 class can be used to control playback of audio/video files and streams. 53daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 54daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p>Topics covered here are: 55daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <ol> 56daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <li><a href="#StateDiagram">State Diagram</a> 57daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <li><a href="#Permissions">Permissions</a> 58daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <li><a href="#Callbacks">Register informational and error callbacks</a> 59daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </ol> 60daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 61daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <a name="StateDiagram"></a> 62daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <h3>State Diagram</h3> 63daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 64daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p>Playback control of audio/video files and streams is managed as a state 65daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * machine. The following diagram shows the life cycle and the states of a 66daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * MediaPlayer2 object driven by the supported playback control operations. 67daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The ovals represent the states a MediaPlayer2 object may reside 68daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * in. The arcs represent the playback control operations that drive the object 69daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * state transition. There are two types of arcs. The arcs with a single arrow 70daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * head represent synchronous method calls, while those with 71daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * a double arrow head represent asynchronous method calls.</p> 72daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 73daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p><img src="../../../images/mediaplayer_state_diagram.gif" 74daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * alt="MediaPlayer State diagram" 75daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * border="0" /></p> 76daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 77daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p>From this state diagram, one can see that a MediaPlayer2 object has the 78daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * following states:</p> 79daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <ul> 80a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>When a MediaPlayer2 object is just created using {@link #create()} or 81a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * after {@link #reset()} is called, it is in the <strong>Idle</strong> state; and Once 82a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * {@link #close()} is called, it can no longer be used and there is no way to bring it 83a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * back to any other state. 84daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <ul> 85a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>Calling {@link #setDataSource(DataSourceDesc)} and {@link #prepare()} transfers a 86a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * MediaPlayer2 object in the <strong>Idle</strong> state to the <strong>Paused</strong> 87a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * state. It is good programming practice to register a event callback for 88a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * {@link MediaPlayer2EventCallback#onCallCompleted} and 89a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * look out for {@link #CALL_STATUS_BAD_VALUE} and {@link #CALL_STATUS_ERROR_IO} that may be 90a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * caused from {@link #setDataSource}. 91a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * </li> 92daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <li>It is also recommended that once 93daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * a MediaPlayer2 object is no longer being used, call {@link #close()} immediately 94daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * so that resources used by the internal player engine associated with the 95daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * MediaPlayer2 object can be released immediately. Resource may include 96daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * singleton resources such as hardware acceleration components and 97daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * failure to call {@link #close()} may cause subsequent instances of 98daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * MediaPlayer2 objects to fallback to software implementations or fail 99a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * altogether. </li> 100daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </ul> 101daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </li> 102daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <li>In general, some playback control operation may fail due to various 103daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * reasons, such as unsupported audio/video format, poorly interleaved 104daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * audio/video, resolution too high, streaming timeout, and the like. 105daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Thus, error reporting and recovery is an important concern under 106daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * these circumstances. Sometimes, due to programming errors, invoking a playback 107daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * control operation in an invalid state may also occur. Under all these 108a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * error conditions, the player goes to <strong>Error</strong> state and invokes a user 109a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * supplied {@link MediaPlayer2EventCallback#onError}} method if an event callback has been 110a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * registered beforehand via {@link #setMediaPlayer2EventCallback}. 111daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <ul> 112daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <li>It is important to note that once an error occurs, the 113a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * MediaPlayer2 object enters the <strong>Error</strong> state (except as noted 114a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * above), even if a callback has not been registered by the application.</li> 115a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>In order to reuse a MediaPlayer2 object that is in the <strong> 116a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * Error</strong> state and recover from the error, 117a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * {@link #reset()} can be called to restore the object to its <strong>Idle</strong> 118daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * state.</li> 119daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <li>It is good programming practice to have your application 120a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * register a {@link MediaPlayer2EventCallback} to look out for error callbacks from 121daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * the internal player engine.</li> 122a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li> {@link MediaPlayer2EventCallback#onCallCompleted} is called with 123a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * {@link #CALL_STATUS_INVALID_OPERATION} on programming errors such as calling 124a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * {@link #prepare()} and {@link #setDataSource(DataSourceDesc)} methods in an invalid 125a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * state. </li> 126daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </ul> 127daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </li> 128a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>A MediaPlayer2 object must first enter the <strong>Paused</strong> state 129daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * before playback can be started. 130daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <ul> 131a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>The <strong>Paused</strong> state can be reached by calling {@link #prepare()}. Note 132a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * that {@link #prepare()} is asynchronous. When the preparation completes, 133daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * the internal player engine then calls a user supplied callback method, 134a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * {@link MediaPlayer2EventCallback#onInfo} interface with {@link #MEDIA_INFO_PREPARED}, 135a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * if a MediaPlayer2EventCallback is registered beforehand via 136daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)}.</li> 137a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>The player also goes to <strong>Paused</strong> state when {@link #pause()} is called 138a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * to pause the ongoing playback. Note that {@link #pause()} is asynchronous. Once 139a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * {@link #pause()} is processed successfully by the internal media engine, 140a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <strong>Paused</strong> state will be notified with 1414c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * {@link MediaPlayerInterface.PlayerEventCallback#onPlayerStateChanged} callback. 1424c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * In addition to the callback, {@link #getMediaPlayer2State()} can also be used to test 1434c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * whether the MediaPlayer2 object is in the <strong>Paused</strong> state. 144a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * </li> 145a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>While in the <em>Paused</em> state, properties such as audio/sound volume, looping 146a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * can be adjusted by invoking the corresponding set methods.</li> 147daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </ul> 148daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </li> 149a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>To start the playback, {@link #play()} must be called. Once {@link #play()} is processed 150a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * successfully by the internal media engine, <strong>Playing</strong> state will be 1514c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * notified with {@link MediaPlayerInterface.PlayerEventCallback#onPlayerStateChanged} 1524c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * callback. 1534c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * In addition to the callback, {@link #getMediaPlayer2State()} can be called to test 1544c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * whether the MediaPlayer2 object is in the <strong>Started</strong> state. 155daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <ul> 156a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>While in the <strong>Playing</strong> state, the internal player engine calls 157daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * a user supplied callback method MediaPlayer2EventCallback.onInfo() with 158daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #MEDIA_INFO_BUFFERING_UPDATE} if an MediaPlayer2EventCallback has been 159daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * registered beforehand via 160daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)}. 161daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * This callback allows applications to keep track of the buffering status 162daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * while streaming audio/video.</li> 163daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <li>Calling {@link #play()} has not effect 164a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * on a MediaPlayer2 object that is already in the <strong>Playing</strong> state.</li> 165daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </ul> 166daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </li> 167a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>The playback position can be adjusted with a call to {@link #seekTo}. 168daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <ul> 169a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>Although the asynchronous {@link #seekTo} call returns right away, 170a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * the actual seek operation may take a while to 171daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * finish, especially for audio/video being streamed. When the actual 172daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * seek operation completes, the internal player engine calls a user 173daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * supplied MediaPlayer2EventCallback.onCallCompleted() with 174daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #CALL_COMPLETED_SEEK_TO} 175daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * if an MediaPlayer2EventCallback has been registered beforehand via 176daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)}.</li> 177a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>Please note that {@link #seekTo(long, int)} can also be called in 178a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <strong>Paused</strong> state. When {@link #seekTo(long, int)} is called in those states, 179daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * one video frame will be displayed if the stream has video and the requested 180daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * position is valid. 181daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </li> 182daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <li>Furthermore, the actual current playback position 183daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * can be retrieved with a call to {@link #getCurrentPosition()}, which 184daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * is helpful for applications such as a Music player that need to keep 185daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * track of the playback progress.</li> 186daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </ul> 187daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </li> 188daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <li>When the playback reaches the end of stream, the playback completes. 189daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <ul> 190daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <li>If current source is set to loop by {@link #loopCurrent(boolean)}, 191a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * the MediaPlayer2 object shall remain in the <strong>Playing</strong> state.</li> 192daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <li>If the looping mode was set to <var>false 193daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </var>, the player engine calls a user supplied callback method, 194a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * {@link MediaPlayer2EventCallback#onInfo} with {@link #MEDIA_INFO_PLAYBACK_COMPLETE}, 195a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * if an MediaPlayer2EventCallback is registered beforehand via 196daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)}. 197a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * The invoke of the callback signals that the object is now in the <strong>Paused</strong> 198a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * state.</li> 199a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * <li>While in the <strong>Paused</strong> state, calling {@link #play()} can restart the 200a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * playback from the beginning of the audio/video source.</li> 201daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </ul> 202daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 203daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <a name="Permissions"></a> 204daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <h3>Permissions</h3> 205daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p>This class requires the {@link android.Manifest.permission#INTERNET} permission 206daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * when used with network-based content. 207daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 208daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <a name="Callbacks"></a> 209daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <h3>Callbacks</h3> 210daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p>Applications may want to register for informational and error 211daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * events in order to be informed of some internal state update and 212daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * possible runtime errors during playback or streaming. Registration for 213daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * these events is done by properly setting the appropriate listeners (via calls 214daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * to 215daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)}, 216daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #setDrmEventCallback(Executor, DrmEventCallback)}). 217daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * In order to receive the respective callback 218daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * associated with these listeners, applications are required to create 219daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * MediaPlayer2 objects on a thread with its own Looper running (main UI 220daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * thread by default has a Looper running). 221daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 222daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 223daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang@TargetApi(Build.VERSION_CODES.P) 2244c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kangpublic abstract class MediaPlayer2 { 225daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 226daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Create a MediaPlayer2 object. 227daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 228daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return A MediaPlayer2 object created 229daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 230daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final MediaPlayer2 create() { 231daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang return new MediaPlayer2Impl(); 232daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 233daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 234daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 235daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @hide 236daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 237daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 238daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public MediaPlayer2() { } 239daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 240daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 2414c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * Returns a {@link MediaPlayerInterface} implementation which runs based on 2424c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * this MediaPlayer2 instance. 2434c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang */ 2444c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang public abstract MediaPlayerInterface getMediaPlayerInterface(); 2454c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang 2464c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang /** 247daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Releases the resources held by this {@code MediaPlayer2} object. 248daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 249daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * It is considered good practice to call this method when you're 250daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * done using the MediaPlayer2. In particular, whenever an Activity 251daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * of an application is paused (its onPause() method is called), 252daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * or stopped (its onStop() method is called), this method should be 253daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * invoked to release the MediaPlayer2 object, unless the application 254daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * has a special need to keep the object around. In addition to 255daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * unnecessary resources (such as memory and instances of codecs) 256daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * being held, failure to call this method immediately if a 257daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * MediaPlayer2 object is no longer needed may also lead to 258daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * continuous battery consumption for mobile devices, and playback 259daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * failure for other applications if no multiple instances of the 260daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * same codec are supported on a device. Even if multiple instances 261daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * of the same codec are supported, some performance degradation 262daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * may be expected when unnecessary multiple instances are used 263daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * at the same time. 264daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 265daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is a synchronous call. 266daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void close(); 267daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 268daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 269daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Starts or resumes playback. If playback had previously been paused, 270daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * playback will continue from where it was paused. If playback had 271daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * reached end of stream and been paused, or never started before, 272daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * playback will start at the beginning. If the source had not been 273daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * prepared, the player will prepare the source and play. 274daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 275daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 276daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 277daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void play(); 278daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 279daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 280daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Prepares the player for playback, asynchronously. 281daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 282daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * After setting the datasource and the display surface, you need to 283daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * call prepare(). 284daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 285daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 286daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 287daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void prepare(); 288daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 289daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 290daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Pauses playback. Call play() to resume. 291daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 292daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 293daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void pause(); 294daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 295daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 296daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Tries to play next data source if applicable. 297daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 298daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 299daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void skipToNext(); 300daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 301daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 302daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Moves the media to specified time position. 303daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Same as {@link #seekTo(long, int)} with {@code mode = SEEK_PREVIOUS_SYNC}. 304daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 305daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param msec the offset in milliseconds from the start to seek to 306daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 307daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 308daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public void seekTo(long msec) { 309daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang seekTo(msec, SEEK_PREVIOUS_SYNC /* mode */); 310daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 311daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 312daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 313daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Gets the current playback position. 314daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 315daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return the current position in milliseconds 316daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 317daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract long getCurrentPosition(); 318daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 319daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 320daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Gets the duration of the file. 321daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 322daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return the duration in milliseconds, if no duration is available 323daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * (for example, if streaming live content), -1 is returned. 324daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 325daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract long getDuration(); 326daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 327daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 328daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Gets the current buffered media source position received through progressive downloading. 329daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The received buffering percentage indicates how much of the content has been buffered 330daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * or played. For example a buffering update of 80 percent when half the content 331daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * has already been played indicates that the next 30 percent of the 332daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * content to play has been buffered. 333daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 334daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return the current buffered media source position in milliseconds 335daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 336daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract long getBufferedPosition(); 337daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 338daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 3394c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * Gets the current MediaPlayer2 state. 340daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 3414c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * @return the current MediaPlayer2 state. 342daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 3434c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang public abstract @MediaPlayer2State int getMediaPlayer2State(); 344daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 345daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 346daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets the audio attributes for this MediaPlayer2. 347daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * See {@link AudioAttributes} for how to build and configure an instance of this class. 348daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * You must call this method before {@link #prepare()} in order 349daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * for the audio attributes to become effective thereafter. 350daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param attributes a non-null set of audio attributes 351daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 352daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 353daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setAudioAttributes(@NonNull AudioAttributesCompat attributes); 354daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 355daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 356daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Gets the audio attributes for this MediaPlayer2. 357daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return attributes a set of audio attributes 358daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 359daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract @Nullable AudioAttributesCompat getAudioAttributes(); 360daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 361daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 362daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets the data source as described by a DataSourceDesc. 363daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 364daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param dsd the descriptor of data source you want to play 365daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 366daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 367daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setDataSource(@NonNull DataSourceDesc dsd); 368daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 369daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 370daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets a single data source as described by a DataSourceDesc which will be played 371daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * after current data source is finished. 372daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 373daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param dsd the descriptor of data source you want to play after current one 374daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 375daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 376daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setNextDataSource(@NonNull DataSourceDesc dsd); 377daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 378daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 379daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets a list of data sources to be played sequentially after current data source is done. 380daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 381daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param dsds the list of data sources you want to play after current one 382daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 383daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 384daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setNextDataSources(@NonNull List<DataSourceDesc> dsds); 385daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 386daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 387daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Gets the current data source as described by a DataSourceDesc. 388daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 389daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return the current DataSourceDesc 390daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 391daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract @NonNull DataSourceDesc getCurrentDataSource(); 392daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 393daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 394daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Configures the player to loop on the current data source. 395daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param loop true if the current data source is meant to loop. 396daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 397daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 398daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void loopCurrent(boolean loop); 399daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 400daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 401daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets the playback speed. 402daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * A value of 1.0f is the default playback value. 403daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * A negative value indicates reverse playback, check {@link #isReversePlaybackSupported()} 404daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * before using negative values.<br> 405daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * After changing the playback speed, it is recommended to query the actual speed supported 406daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * by the player, see {@link #getPlaybackSpeed()}. 407daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param speed the desired playback speed 408daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 409daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 410daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setPlaybackSpeed(float speed); 411daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 412daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 413daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Returns the actual playback speed to be used by the player when playing. 414daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Note that it may differ from the speed set in {@link #setPlaybackSpeed(float)}. 415daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return the actual playback speed 416daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 417daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public float getPlaybackSpeed() { 418daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang return 1.0f; 419daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 420daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 421daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 422daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Indicates whether reverse playback is supported. 423daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Reverse playback is indicated by negative playback speeds, see 424daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #setPlaybackSpeed(float)}. 425daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return true if reverse playback is supported. 426daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 427daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public boolean isReversePlaybackSupported() { 428daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang return false; 429daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 430daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 431daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 432daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets the volume of the audio of the media to play, expressed as a linear multiplier 433daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * on the audio samples. 434daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Note that this volume is specific to the player, and is separate from stream volume 435daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * used across the platform.<br> 436daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * A value of 0.0f indicates muting, a value of 1.0f is the nominal unattenuated and unamplified 437daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * gain. See {@link #getMaxPlayerVolume()} for the volume range supported by this player. 438daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param volume a value between 0.0f and {@link #getMaxPlayerVolume()}. 439daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 440daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 441daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setPlayerVolume(float volume); 442daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 443daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 444daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Returns the current volume of this player to this player. 445daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Note that it does not take into account the associated stream volume. 446daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return the player volume. 447daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 448daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract float getPlayerVolume(); 449daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 450daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 451daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return the maximum volume that can be used in {@link #setPlayerVolume(float)}. 452daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 453daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public float getMaxPlayerVolume() { 454daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang return 1.0f; 455daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 456daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 457daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 458daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Insert a task in the command queue to help the client to identify whether a batch 459daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * of commands has been finished. When this command is processed, a notification 460daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@code MediaPlayer2EventCallback.onCommandLabelReached} will be fired with the 461daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * given {@code label}. 462daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 463daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2EventCallback#onCommandLabelReached 464daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 465daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param label An application specific Object used to help to identify the completeness 466daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * of a batch of commands. 467daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 468daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 469daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public void notifyWhenCommandLabelReached(@NonNull Object label) { } 470daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 471daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 472daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets the {@link Surface} to be used as the sink for the video portion of 473daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * the media. Setting a 474daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Surface will un-set any Surface or SurfaceHolder that was previously set. 475daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * A null surface will result in only the audio track being played. 476daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 477daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * If the Surface sends frames to a {@link SurfaceTexture}, the timestamps 478daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * returned from {@link SurfaceTexture#getTimestamp()} will have an 479daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * unspecified zero point. These timestamps cannot be directly compared 480daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * between different media sources, different instances of the same media 481daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * source, or multiple runs of the same program. The timestamp is normally 482daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * monotonically increasing and is unaffected by time-of-day adjustments, 483daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * but it is reset when the position is set. 484daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 485daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param surface The {@link Surface} to be used for the video portion of 486daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * the media. 487daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @throws IllegalStateException if the internal player engine has not been 488daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * initialized or has been released. 489daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 490daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 491daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setSurface(Surface surface); 492daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 493daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /* Do not change these video scaling mode values below without updating 494daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * their counterparts in system/window.h! Please do not forget to update 495daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #isVideoScalingModeSupported} when new video scaling modes 496daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * are added. 497daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 498daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 499daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Specifies a video scaling mode. The content is stretched to the 500daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * surface rendering area. When the surface has the same aspect ratio 501daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * as the content, the aspect ratio of the content is maintained; 502daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * otherwise, the aspect ratio of the content is not maintained when video 503daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * is being rendered. 504daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * There is no content cropping with this video scaling mode. 505daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 506daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT = 1; 507daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 508daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 509daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Discards all pending commands. 510daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 511daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is a synchronous call. 512daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void clearPendingCommands(); 513daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 514daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 515daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Returns the width of the video. 516daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 517daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return the width of the video, or 0 if there is no video, 518daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * no display surface was set, or the width has not been determined 519daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * yet. The {@code MediaPlayer2EventCallback} can be registered via 520daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)} to provide a 521daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * notification {@code MediaPlayer2EventCallback.onVideoSizeChanged} when the width 522daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * is available. 523daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 524daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract int getVideoWidth(); 525daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 526daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 527daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Returns the height of the video. 528daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 529daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return the height of the video, or 0 if there is no video, 530daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * no display surface was set, or the height has not been determined 531daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * yet. The {@code MediaPlayer2EventCallback} can be registered via 532daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #setMediaPlayer2EventCallback(Executor, MediaPlayer2EventCallback)} to provide a 533daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * notification {@code MediaPlayer2EventCallback.onVideoSizeChanged} when the height is 534daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * available. 535daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 536daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract int getVideoHeight(); 537daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 538daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 539daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Return Metrics data about the current player. 540daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 541daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return a {@link PersistableBundle} containing the set of attributes and values 542daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * available for the media being handled by this instance of MediaPlayer2 543daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The attributes are descibed in {@link MetricsConstants}. 544daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 545daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Additional vendor-specific fields may also be present in 546daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * the return value. 547daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 548daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract PersistableBundle getMetrics(); 549daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 550daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 551daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets playback rate using {@link PlaybackParams}. The object sets its internal 552daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * PlaybackParams to the input, except that the object remembers previous speed 553daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * when input speed is zero. This allows the object to resume at previous speed 554daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * when play() is called. Calling it before the object is prepared does not change 555daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * the object state. After the object is prepared, calling it with zero speed is 556daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * equivalent to calling pause(). After the object is prepared, calling it with 557daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * non-zero speed is equivalent to calling play(). 558daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 559daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param params the playback params. 560daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 561daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 562daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setPlaybackParams(@NonNull PlaybackParams params); 563daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 564daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 565daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Gets the playback params, containing the current playback rate. 566daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 567daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return the playback params. 568daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 569daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @NonNull 570daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract PlaybackParams getPlaybackParams(); 571daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 572daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 573daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets A/V sync mode. 574daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 575daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param params the A/V sync params to apply 576daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 577daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 578daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setSyncParams(@NonNull SyncParams params); 579daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 580daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 581daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Gets the A/V sync mode. 582daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 583daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return the A/V sync params 584daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 585daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @NonNull 586daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract SyncParams getSyncParams(); 587daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 588daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 589daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Seek modes used in method seekTo(long, int) to move media position 590daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * to a specified location. 591daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 592daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Do not change these mode values without updating their counterparts 593daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * in include/media/IMediaSource.h! 594daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 595daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 596daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * This mode is used with {@link #seekTo(long, int)} to move media position to 597daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * a sync (or key) frame associated with a data source that is located 598daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * right before or at the given time. 599daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 600daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see #seekTo(long, int) 601daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 602daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int SEEK_PREVIOUS_SYNC = 0x00; 603daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 604daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * This mode is used with {@link #seekTo(long, int)} to move media position to 605daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * a sync (or key) frame associated with a data source that is located 606daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * right after or at the given time. 607daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 608daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see #seekTo(long, int) 609daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 610daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int SEEK_NEXT_SYNC = 0x01; 611daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 612daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * This mode is used with {@link #seekTo(long, int)} to move media position to 613daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * a sync (or key) frame associated with a data source that is located 614daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * closest to (in time) or at the given time. 615daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 616daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see #seekTo(long, int) 617daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 618daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int SEEK_CLOSEST_SYNC = 0x02; 619daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 620daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * This mode is used with {@link #seekTo(long, int)} to move media position to 621daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * a frame (not necessarily a key frame) associated with a data source that 622daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * is located closest to or at the given time. 623daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 624daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see #seekTo(long, int) 625daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 626daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int SEEK_CLOSEST = 0x03; 627daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 628daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** @hide */ 629daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @IntDef(flag = false, /*prefix = "SEEK",*/ value = { 630daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang SEEK_PREVIOUS_SYNC, 631daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang SEEK_NEXT_SYNC, 632daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang SEEK_CLOSEST_SYNC, 633daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang SEEK_CLOSEST, 634daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang }) 635daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @Retention(RetentionPolicy.SOURCE) 636daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 637daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public @interface SeekMode {} 638daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 639daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 640daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Moves the media to specified time position by considering the given mode. 641daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 642a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * When seekTo is finished, the user will be notified via 643a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * {@link MediaPlayer2EventCallback#onInfo} with {@link #CALL_COMPLETED_SEEK_TO}. 644daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * There is at most one active seekTo processed at any time. If there is a to-be-completed 645daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * seekTo, new seekTo requests will be queued in such a way that only the last request 646daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * is kept. When current seekTo is completed, the queued request will be processed if 647daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * that request is different from just-finished seekTo operation, i.e., the requested 648daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * position or mode is different. 649daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 650daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param msec the offset in milliseconds from the start to seek to. 651daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * When seeking to the given time position, there is no guarantee that the data source 652daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * has a frame located at the position. When this happens, a frame nearby will be rendered. 653daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * If msec is negative, time position zero will be used. 654daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * If msec is larger than duration, duration will be used. 655daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mode the mode indicating where exactly to seek to. 656daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 657daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 658daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void seekTo(long msec, @SeekMode int mode); 659daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 660daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 661a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * Gets current playback position as a {@link MediaTimestamp}. 662daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 663daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The MediaTimestamp represents how the media time correlates to the system time in 664daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * a linear fashion using an anchor and a clock rate. During regular playback, the media 665daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * time moves fairly constantly (though the anchor frame may be rebased to a current 666daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * system time, the linear correlation stays steady). Therefore, this method does not 667daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * need to be called often. 668daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 669daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * To help users get current playback position, this method always anchors the timestamp 670daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * to the current {@link System#nanoTime system time}, so 671daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link MediaTimestamp#getAnchorMediaTimeUs} can be used as current playback position. 672daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 673daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return a MediaTimestamp object if a timestamp is available, or {@code null} if no timestamp 674daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * is available, e.g. because the media player has not been initialized. 675daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 676daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaTimestamp 677daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 678daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @Nullable 679daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract MediaTimestamp getTimestamp(); 680daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 681daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 682daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Resets the MediaPlayer2 to its uninitialized state. After calling 683daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * this method, you will have to initialize it again by setting the 684daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * data source and calling prepare(). 685daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 686daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is a synchronous call. 687daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void reset(); 688daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 689daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 690daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets the audio session ID. 691daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 692daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param sessionId the audio session ID. 693daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The audio session ID is a system wide unique identifier for the audio stream played by 694daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * this MediaPlayer2 instance. 695daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The primary use of the audio session ID is to associate audio effects to a particular 696daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * instance of MediaPlayer2: if an audio session ID is provided when creating an audio effect, 697daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * this effect will be applied only to the audio content of media players within the same 698daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * audio session and not to the output mix. 699daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * When created, a MediaPlayer2 instance automatically generates its own audio session ID. 700daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * However, it is possible to force this player to be part of an already existing audio session 701daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * by calling this method. 702daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * This method must be called before one of the overloaded <code> setDataSource </code> methods. 703daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 704daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 705daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setAudioSessionId(int sessionId); 706daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 707daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 708daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Returns the audio session ID. 709daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 710daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return the audio session ID. {@see #setAudioSessionId(int)} 711daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Note that the audio session ID is 0 only if a problem occured when the MediaPlayer2 was 712daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * contructed. 713daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 714daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract int getAudioSessionId(); 715daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 716daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 717daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Attaches an auxiliary effect to the player. A typical auxiliary effect is a reverberation 718daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * effect which can be applied on any sound source that directs a certain amount of its 719daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * energy to this effect. This amount is defined by setAuxEffectSendLevel(). 720daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * See {@link #setAuxEffectSendLevel(float)}. 721daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p>After creating an auxiliary effect (e.g. 722daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link android.media.audiofx.EnvironmentalReverb}), retrieve its ID with 723daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link android.media.audiofx.AudioEffect#getId()} and use it when calling this method 724daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * to attach the player to the effect. 725daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p>To detach the effect from the player, call this method with a null effect id. 726daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p>This method must be called after one of the overloaded <code> setDataSource </code> 727daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * methods. 728daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param effectId system wide unique id of the effect to attach 729daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 730daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 731daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void attachAuxEffect(int effectId); 732daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 733daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 734daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 735daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets the send level of the player to the attached auxiliary effect. 736daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * See {@link #attachAuxEffect(int)}. The level value range is 0 to 1.0. 737daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p>By default the send level is 0, so even if an effect is attached to the player 738daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * this method must be called for the effect to be applied. 739daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p>Note that the passed level value is a raw scalar. UI controls should be scaled 740daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * logarithmically: the gain applied by audio framework ranges from -72dB to 0dB, 741daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * so an appropriate conversion from linear UI input x to level is: 742daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * x == 0 -> level = 0 743daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 0 < x <= R -> level = 10^(72*(x-R)/20/R) 744daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param level send level scalar 745daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 746daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 747daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setAuxEffectSendLevel(float level); 748daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 749daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 750daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Class for MediaPlayer2 to return each audio/video/subtitle track's metadata. 751daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 752daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2#getTrackInfo 753daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 754daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract static class TrackInfo { 755daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 756daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Gets the track type. 757daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return TrackType which indicates if the track is video, audio, timed text. 758daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 759daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract int getTrackType(); 760daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 761daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 762daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Gets the language code of the track. 763daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return a language code in either way of ISO-639-1 or ISO-639-2. 764daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * When the language is unknown or could not be determined, 765daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * ISO-639-2 language code, "und", is returned. 766daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 767daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract String getLanguage(); 768daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 769daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 770daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Gets the {@link MediaFormat} of the track. If the format is 771daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * unknown or could not be determined, null is returned. 772daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 773daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract MediaFormat getFormat(); 774daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 775daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_TRACK_TYPE_UNKNOWN = 0; 776daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_TRACK_TYPE_VIDEO = 1; 777daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_TRACK_TYPE_AUDIO = 2; 778daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 779daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** @hide */ 780daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 781daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_TRACK_TYPE_TIMEDTEXT = 3; 782daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 783daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_TRACK_TYPE_SUBTITLE = 4; 784daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_TRACK_TYPE_METADATA = 5; 785daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 786daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @Override 787daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract String toString(); 788daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang }; 789daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 790daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 791daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Returns a List of track information. 792daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 793daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return List of track info. The total number of tracks is the array length. 794daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Must be called again if an external timed text source has been added after 795daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * addTimedTextSource method is called. 796daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 797daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract List<TrackInfo> getTrackInfo(); 798daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 799daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 800daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Returns the index of the audio, video, or subtitle track currently selected for playback, 801daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The return value is an index into the array returned by {@link #getTrackInfo()}, and can 802daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * be used in calls to {@link #selectTrack(int)} or {@link #deselectTrack(int)}. 803daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 804daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param trackType should be one of {@link TrackInfo#MEDIA_TRACK_TYPE_VIDEO}, 805daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link TrackInfo#MEDIA_TRACK_TYPE_AUDIO}, or 806daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link TrackInfo#MEDIA_TRACK_TYPE_SUBTITLE} 807daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @return index of the audio, video, or subtitle track currently selected for playback; 808daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * a negative integer is returned when there is no selected track for {@code trackType} or 809daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * when {@code trackType} is not one of audio, video, or subtitle. 810daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @throws IllegalStateException if called after {@link #close()} 811daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 812daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see #getTrackInfo() 813daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see #selectTrack(int) 814daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see #deselectTrack(int) 815daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 816daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract int getSelectedTrack(int trackType); 817daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 818daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 819daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Selects a track. 820daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 821a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * If a MediaPlayer2 is in invalid state, {@link #CALL_STATUS_INVALID_OPERATION} will be 822a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * reported with {@link MediaPlayer2EventCallback#onCallCompleted}. 823a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * If a MediaPlayer2 is in <em>Playing</em> state, the selected track is presented immediately. 824daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * If a MediaPlayer2 is not in Started state, it just marks the track to be played. 825daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </p> 826daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 827daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * In any valid state, if it is called multiple times on the same type of track (ie. Video, 828daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Audio, Timed Text), the most recent one will be chosen. 829daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </p> 830daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 831daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The first audio and video tracks are selected by default if available, even though 832daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * this method is not called. However, no timed text track will be selected until 833daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * this function is called. 834daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </p> 835daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 836daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Currently, only timed text tracks or audio tracks can be selected via this method. 837daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </p> 838daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param index the index of the track to be selected. The valid range of the index 839daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * is 0..total number of track - 1. The total number of tracks as well as the type of 840daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * each individual track can be found by calling {@link #getTrackInfo()} method. 841daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 842daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2#getTrackInfo 843daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 844daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 845daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void selectTrack(int index); 846daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 847daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 848a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * Deselects a track. 849daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 850daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Currently, the track must be a timed text track and no audio or video tracks can be 851daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * deselected. If the timed text track identified by index has not been 852daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * selected before, it throws an exception. 853daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * </p> 854daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param index the index of the track to be deselected. The valid range of the index 855daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * is 0..total number of tracks - 1. The total number of tracks as well as the type of 856daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * each individual track can be found by calling {@link #getTrackInfo()} method. 857daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 858daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2#getTrackInfo 859daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 860daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 861daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void deselectTrack(int index); 862daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 863daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 864daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Interface definition for callbacks to be invoked when the player has the corresponding 865daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * events. 866daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 867daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract static class MediaPlayer2EventCallback { 868daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 869daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Called to indicate the video size 870daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 871daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The video size (width and height) could be 0 if there was no video, 872daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * no display surface was set, or the value was not determined yet. 873daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 874daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mp the MediaPlayer2 associated with this callback 875daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param dsd the DataSourceDesc of this data source 876daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param width the width of the video 877daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param height the height of the video 878daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 879daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public void onVideoSizeChanged( 880daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MediaPlayer2 mp, DataSourceDesc dsd, int width, int height) { } 881daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 882daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 883daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Called to indicate available timed metadata 884daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 885daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * This method will be called as timed metadata is extracted from the media, 886daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * in the same order as it occurs in the media. The timing of this event is 887daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * not controlled by the associated timestamp. 888daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 889daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Currently only HTTP live streaming data URI's embedded with timed ID3 tags generates 890daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link TimedMetaData}. 891daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 892daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2#selectTrack(int) 893daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see TimedMetaData 894daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 895daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mp the MediaPlayer2 associated with this callback 896daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param dsd the DataSourceDesc of this data source 897daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param data the timed metadata sample associated with this event 898daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 899daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public void onTimedMetaDataAvailable( 900daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MediaPlayer2 mp, DataSourceDesc dsd, TimedMetaData data) { } 901daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 902daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 903daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Called to indicate an error. 904daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 905daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mp the MediaPlayer2 the error pertains to 906daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param dsd the DataSourceDesc of this data source 907daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param what the type of error that has occurred. 908daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param extra an extra code, specific to the error. Typically 909daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * implementation dependent. 910daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 911daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public void onError( 912daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MediaPlayer2 mp, DataSourceDesc dsd, @MediaError int what, int extra) { } 913daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 914daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 915daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Called to indicate an info or a warning. 916daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 917daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mp the MediaPlayer2 the info pertains to. 918daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param dsd the DataSourceDesc of this data source 919daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param what the type of info or warning. 920daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param extra an extra code, specific to the info. Typically 921daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * implementation dependent. 922daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 923daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public void onInfo(MediaPlayer2 mp, DataSourceDesc dsd, @MediaInfo int what, int extra) { } 924daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 925daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 926daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Called to acknowledge an API call. 927daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 928daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mp the MediaPlayer2 the call was made on. 929daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param dsd the DataSourceDesc of this data source 930daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param what the enum for the API call. 931daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param status the returned status code for the call. 932daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 933daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public void onCallCompleted( 934daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MediaPlayer2 mp, DataSourceDesc dsd, @CallCompleted int what, 935daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @CallStatus int status) { } 936daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 937daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 9387e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * Called when a discontinuity in the normal progression of the media time is detected. 9397e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * The "normal progression" of media time is defined as the expected increase of the 9407e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * playback position when playing media, relative to the playback speed (for instance every 9417e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * second, media time increases by two seconds when playing at 2x).<br> 9427e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * Discontinuities are encountered in the following cases: 9437e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * <ul> 9447e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * <li>when the player is starved for data and cannot play anymore</li> 9457e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * <li>when the player encounters a playback error</li> 9467e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * <li>when the a seek operation starts, and when it's completed</li> 9477e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * <li>when the playback speed changes</li> 9487e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * <li>when the playback state changes</li> 9497e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * <li>when the player is reset</li> 9507e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * </ul> 951daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 952daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mp the MediaPlayer2 the media time pertains to. 953daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param dsd the DataSourceDesc of this data source 9547e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * @param timestamp the timestamp that correlates media time, system time and clock rate, 9557e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * or {@link MediaTimestamp#TIMESTAMP_UNKNOWN} in an error case. 956daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 9577e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang public void onMediaTimeDiscontinuity( 958daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MediaPlayer2 mp, DataSourceDesc dsd, MediaTimestamp timestamp) { } 959daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 960daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 961daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Called to indicate {@link #notifyWhenCommandLabelReached(Object)} has been processed. 962daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 963daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mp the MediaPlayer2 {@link #notifyWhenCommandLabelReached(Object)} was called on. 964daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param label the application specific Object given by 965daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #notifyWhenCommandLabelReached(Object)}. 966daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 967daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public void onCommandLabelReached(MediaPlayer2 mp, @NonNull Object label) { } 968daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 9697e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang /** 970daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Called when when a player subtitle track has new subtitle data available. 971daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mp the player that reports the new subtitle data 9727e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang * @param dsd the DataSourceDesc of this data source 973daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param data the subtitle data 974daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 9757e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang public void onSubtitleData( 9767e23d54808f79ce964686e7551765da17bc3f585Dongwon Kang MediaPlayer2 mp, DataSourceDesc dsd, @NonNull SubtitleData data) { } 977daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 978daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 979daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 980daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets the callback to be invoked when the media source is ready for playback. 981daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 982daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param eventCallback the callback that will be run 983daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param executor the executor through which the callback should be invoked 984daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 985daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is a synchronous call. 986daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setMediaPlayer2EventCallback( 987daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @NonNull Executor executor, @NonNull MediaPlayer2EventCallback eventCallback); 988daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 989daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 990daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Clears the {@link MediaPlayer2EventCallback}. 991daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 992daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is a synchronous call. 993daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void clearMediaPlayer2EventCallback(); 994daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 9954c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang /** 9964c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * MediaPlayer2 has not been prepared or just has been reset. 9974c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * In this state, MediaPlayer2 doesn't fetch data. 9984c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang */ 9994c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang public static final int MEDIAPLAYER2_STATE_IDLE = 1001; 10004c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang 10014c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang /** 10024c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * MediaPlayer2 has been just prepared. 10034c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * In this state, MediaPlayer2 just fetches data from media source, 10044c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * but doesn't actively render data. 10054c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang */ 10064c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang public static final int MEDIAPLAYER2_STATE_PREPARED = 1002; 10074c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang 10084c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang /** 10094c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * MediaPlayer2 is paused. 10104c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * In this state, MediaPlayer2 doesn't actively render data. 10114c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang */ 10124c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang public static final int MEDIAPLAYER2_STATE_PAUSED = 1003; 10134c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang 10144c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang /** 10154c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * MediaPlayer2 is actively playing back data. 10164c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang */ 10174c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang public static final int MEDIAPLAYER2_STATE_PLAYING = 1004; 10184c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang 10194c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang /** 10204c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang * MediaPlayer2 has hit some fatal error and cannot continue playback. 10214c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang */ 10224c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang public static final int MEDIAPLAYER2_STATE_ERROR = 1005; 10234c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang 10244c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang /** @hide */ 10254c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang @IntDef(flag = false, value = { 10264c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang MEDIAPLAYER2_STATE_IDLE, 10274c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang MEDIAPLAYER2_STATE_PREPARED, 10284c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang MEDIAPLAYER2_STATE_PAUSED, 10294c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang MEDIAPLAYER2_STATE_PLAYING, 10304c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang MEDIAPLAYER2_STATE_ERROR }) 10314c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang @Retention(RetentionPolicy.SOURCE) 10324c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang @RestrictTo(LIBRARY_GROUP) 10334c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang public @interface MediaPlayer2State {} 10344c2e24f0a0e63fa260e959395d27b6e0ec95555aDongwon Kang 1035daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /* Do not change these values without updating their counterparts 1036daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * in include/media/mediaplayer2.h! 1037daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1038daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Unspecified media player error. 1039daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onError 1040daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1041daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_ERROR_UNKNOWN = 1; 1042daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1043daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The video is streamed and its container is not valid for progressive 1044daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * playback i.e the video's index (e.g moov atom) is not at the start of the 1045daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * file. 1046daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onError 1047daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1048daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200; 1049daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1050daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** File or network related operation errors. */ 1051daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_ERROR_IO = -1004; 1052daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Bitstream is not conforming to the related coding standard or file spec. */ 1053daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_ERROR_MALFORMED = -1007; 1054daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Bitstream is conforming to the related coding standard or file spec, but 1055daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * the media framework does not support the feature. */ 1056daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_ERROR_UNSUPPORTED = -1010; 1057daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Some operation takes too long to complete, usually more than 3-5 seconds. */ 1058daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_ERROR_TIMED_OUT = -110; 1059daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1060daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Unspecified low-level system error. This value originated from UNKNOWN_ERROR in 1061daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * system/core/include/utils/Errors.h 1062daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onError 1063daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @hide 1064daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1065daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 1066daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_ERROR_SYSTEM = -2147483648; 1067daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1068daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1069daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @hide 1070daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1071daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @IntDef(flag = false, /*prefix = "MEDIA_ERROR",*/ value = { 1072daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_ERROR_UNKNOWN, 1073daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK, 1074daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_ERROR_IO, 1075daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_ERROR_MALFORMED, 1076daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_ERROR_UNSUPPORTED, 1077daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_ERROR_TIMED_OUT, 1078daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_ERROR_SYSTEM 1079daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang }) 1080daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @Retention(RetentionPolicy.SOURCE) 1081daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 1082daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public @interface MediaError {} 1083daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1084daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /* Do not change these values without updating their counterparts 1085daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * in include/media/mediaplayer2.h! 1086daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1087daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Unspecified media player info. 1088daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1089daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1090daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_UNKNOWN = 1; 1091daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1092daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player switched to this datas source because it is the 1093daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * next-to-be-played in the playlist. 1094daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1095a7e187436427c4065de585b3074625b40fa04487Dongwon Kang * @hide 1096daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1097a7e187436427c4065de585b3074625b40fa04487Dongwon Kang @RestrictTo(LIBRARY_GROUP) 1098daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_STARTED_AS_NEXT = 2; 1099daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1100daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just pushed the very first video frame for rendering. 1101daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1102daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1103daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_VIDEO_RENDERING_START = 3; 1104daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1105daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just rendered the very first audio sample. 1106daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1107daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1108daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_AUDIO_RENDERING_START = 4; 1109daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1110daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed the playback of this data source. 1111daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1112daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1113daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_PLAYBACK_COMPLETE = 5; 1114daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1115daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed the playback of the full playlist. 1116daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1117daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1118daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_PLAYLIST_END = 6; 1119daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1120daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just prepared a data source. 1121daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1122daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1123daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_PREPARED = 100; 1124daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1125daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The video is too complex for the decoder: it can't decode frames fast 1126daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * enough. Possibly only the audio plays fine at this stage. 1127daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1128daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1129daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700; 1130daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1131daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** MediaPlayer2 is temporarily pausing playback internally in order to 1132daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * buffer more data. 1133daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1134daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1135daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_BUFFERING_START = 701; 1136daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1137daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** MediaPlayer2 is resuming playback after filling buffers. 1138daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1139daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1140daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_BUFFERING_END = 702; 1141daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1142daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Estimated network bandwidth information (kbps) is available; currently this event fires 1143daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * simultaneously as {@link #MEDIA_INFO_BUFFERING_START} and {@link #MEDIA_INFO_BUFFERING_END} 1144daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * when playing network files. 1145daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1146daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @hide 1147daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1148daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 1149daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_NETWORK_BANDWIDTH = 703; 1150daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1151daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1152daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Update status in buffering a media source received through progressive downloading. 1153daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The received buffering percentage indicates how much of the content has been buffered 1154daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * or played. For example a buffering update of 80 percent when half the content 1155daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * has already been played indicates that the next 30 percent of the 1156daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * content to play has been buffered. 1157daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1158daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The {@code extra} parameter in {@code MediaPlayer2EventCallback.onInfo} is the 1159daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * percentage (0-100) of the content that has been buffered or played thus far. 1160daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1161daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1162daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_BUFFERING_UPDATE = 704; 1163daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1164daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Bad interleaving means that a media has been improperly interleaved or 1165daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * not interleaved at all, e.g has all the video samples first then all the 1166daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * audio ones. Video is playing but a lot of disk seeks may be happening. 1167daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1168daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1169daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_BAD_INTERLEAVING = 800; 1170daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1171daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The media cannot be seeked (e.g live stream) 1172daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1173daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1174daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_NOT_SEEKABLE = 801; 1175daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1176daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** A new set of metadata is available. 1177daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1178daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1179daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_METADATA_UPDATE = 802; 1180daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1181daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** A new set of external-only metadata is available. Used by 1182daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * JAVA framework to avoid triggering track scanning. 1183daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @hide 1184daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1185daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 1186daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_EXTERNAL_METADATA_UPDATE = 803; 1187daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1188daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Informs that audio is not playing. Note that playback of the video 1189daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * is not interrupted. 1190daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1191daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1192daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_AUDIO_NOT_PLAYING = 804; 1193daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1194daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Informs that video is not playing. Note that playback of the audio 1195daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * is not interrupted. 1196daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1197daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1198daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_VIDEO_NOT_PLAYING = 805; 1199daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1200daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Failed to handle timed text track properly. 1201daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1202daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@hide} 1203daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1204daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 1205daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_TIMED_TEXT_ERROR = 900; 1206daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1207daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Subtitle track was not supported by the media framework. 1208daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1209daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1210daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901; 1211daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1212daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Reading the subtitle track takes too long. 1213daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onInfo 1214daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1215daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902; 1216daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1217daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1218daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @hide 1219daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1220daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @IntDef(flag = false, /*prefix = "MEDIA_INFO",*/ value = { 1221daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_UNKNOWN, 1222daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_STARTED_AS_NEXT, 1223daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_VIDEO_RENDERING_START, 1224daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_AUDIO_RENDERING_START, 1225daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_PLAYBACK_COMPLETE, 1226daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_PLAYLIST_END, 1227daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_PREPARED, 1228daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_VIDEO_TRACK_LAGGING, 1229daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_BUFFERING_START, 1230daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_BUFFERING_END, 1231daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_NETWORK_BANDWIDTH, 1232daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_BUFFERING_UPDATE, 1233daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_BAD_INTERLEAVING, 1234daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_NOT_SEEKABLE, 1235daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_METADATA_UPDATE, 1236daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_EXTERNAL_METADATA_UPDATE, 1237daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_AUDIO_NOT_PLAYING, 1238daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_VIDEO_NOT_PLAYING, 1239daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_TIMED_TEXT_ERROR, 1240daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_UNSUPPORTED_SUBTITLE, 1241daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MEDIA_INFO_SUBTITLE_TIMED_OUT 1242daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang }) 1243daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @Retention(RetentionPolicy.SOURCE) 1244daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 1245daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public @interface MediaInfo {} 1246daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1247daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang //-------------------------------------------------------------------------- 1248daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #attachAuxEffect}. 1249daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1250daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1251daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_ATTACH_AUX_EFFECT = 1; 1252daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1253daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #deselectTrack}. 1254daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1255daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1256daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_DESELECT_TRACK = 2; 1257daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1258daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #loopCurrent}. 1259daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1260daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1261daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_LOOP_CURRENT = 3; 1262daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1263daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #pause}. 1264daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1265daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1266daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_PAUSE = 4; 1267daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1268daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #play}. 1269daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1270daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1271daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_PLAY = 5; 1272daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1273daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #prepare}. 1274daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1275daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1276daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_PREPARE = 6; 1277daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1278daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #seekTo}. 1279daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1280daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1281daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SEEK_TO = 14; 1282daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1283daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #selectTrack}. 1284daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1285daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1286daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SELECT_TRACK = 15; 1287daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1288daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #setAudioAttributes}. 1289daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1290daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1291daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SET_AUDIO_ATTRIBUTES = 16; 1292daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1293daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #setAudioSessionId}. 1294daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1295daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1296daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SET_AUDIO_SESSION_ID = 17; 1297daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1298daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #setAuxEffectSendLevel}. 1299daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1300daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1301daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SET_AUX_EFFECT_SEND_LEVEL = 18; 1302daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1303daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #setDataSource}. 1304daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1305daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1306daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SET_DATA_SOURCE = 19; 1307daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1308daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #setNextDataSource}. 1309daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1310daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1311daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SET_NEXT_DATA_SOURCE = 22; 1312daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1313daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #setNextDataSources}. 1314daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1315daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1316daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SET_NEXT_DATA_SOURCES = 23; 1317daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1318daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #setPlaybackParams}. 1319daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1320daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1321daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SET_PLAYBACK_PARAMS = 24; 1322daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1323daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #setPlaybackSpeed}. 1324daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1325daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1326daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SET_PLAYBACK_SPEED = 25; 1327daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1328daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #setPlayerVolume}. 1329daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1330daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1331daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SET_PLAYER_VOLUME = 26; 1332daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1333daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #setSurface}. 1334daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1335daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1336daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SET_SURFACE = 27; 1337daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1338daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #setSyncParams}. 1339daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1340daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1341daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SET_SYNC_PARAMS = 28; 1342daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1343daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@link #skipToNext}. 1344daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1345daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1346daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_SKIP_TO_NEXT = 29; 1347daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1348daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** The player just completed a call {@code notifyWhenCommandLabelReached}. 1349daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCommandLabelReached 1350daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @hide 1351daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1352daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 1353daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_COMPLETED_NOTIFY_WHEN_COMMAND_LABEL_REACHED = 1003; 1354daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1355daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1356daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @hide 1357daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1358daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @IntDef(flag = false, /*prefix = "CALL_COMPLETED",*/ value = { 1359daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_ATTACH_AUX_EFFECT, 1360daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_DESELECT_TRACK, 1361daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_LOOP_CURRENT, 1362daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_PAUSE, 1363daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_PLAY, 1364daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_PREPARE, 1365daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SEEK_TO, 1366daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SELECT_TRACK, 1367daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SET_AUDIO_ATTRIBUTES, 1368daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SET_AUDIO_SESSION_ID, 1369daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SET_AUX_EFFECT_SEND_LEVEL, 1370daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SET_DATA_SOURCE, 1371daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SET_NEXT_DATA_SOURCE, 1372daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SET_NEXT_DATA_SOURCES, 1373daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SET_PLAYBACK_PARAMS, 1374daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SET_PLAYBACK_SPEED, 1375daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SET_PLAYER_VOLUME, 1376daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SET_SURFACE, 1377daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SET_SYNC_PARAMS, 1378daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_SKIP_TO_NEXT, 1379daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_COMPLETED_NOTIFY_WHEN_COMMAND_LABEL_REACHED 1380daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang }) 1381daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @Retention(RetentionPolicy.SOURCE) 1382daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 1383daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public @interface CallCompleted {} 1384daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1385daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Status code represents that call is completed without an error. 1386daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1387daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1388daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_STATUS_NO_ERROR = 0; 1389daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1390daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Status code represents that call is ended with an unknown error. 1391daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1392daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1393daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_STATUS_ERROR_UNKNOWN = Integer.MIN_VALUE; 1394daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1395daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Status code represents that the player is not in valid state for the operation. 1396daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1397daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1398daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_STATUS_INVALID_OPERATION = 1; 1399daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1400daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Status code represents that the argument is illegal. 1401daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1402daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1403daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_STATUS_BAD_VALUE = 2; 1404daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1405daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Status code represents that the operation is not allowed. 1406daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1407daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1408daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_STATUS_PERMISSION_DENIED = 3; 1409daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1410daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** Status code represents a file or network related operation error. 1411daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @see MediaPlayer2.MediaPlayer2EventCallback#onCallCompleted 1412daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1413daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int CALL_STATUS_ERROR_IO = 4; 1414daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1415daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1416daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @hide 1417daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1418daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @IntDef(flag = false, /*prefix = "CALL_STATUS",*/ value = { 1419daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_STATUS_NO_ERROR, 1420daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_STATUS_ERROR_UNKNOWN, 1421daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_STATUS_INVALID_OPERATION, 1422daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_STATUS_BAD_VALUE, 1423daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang CALL_STATUS_PERMISSION_DENIED, 14248300cfae0b87ee2a8114c7363c8269fc50d6475cWei Jia CALL_STATUS_ERROR_IO}) 1425daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @Retention(RetentionPolicy.SOURCE) 1426daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 1427daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public @interface CallStatus {} 1428daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1429daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // Modular DRM begin 1430daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1431daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1432daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Interface definition of a callback to be invoked when the app 1433daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * can do DRM configuration (get/set properties) before the session 1434daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * is opened. This facilitates configuration of the properties, like 1435daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 'securityLevel', which has to be set after DRM scheme creation but 1436daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * before the DRM session is opened. 1437daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1438daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The only allowed DRM calls in this listener are {@link #getDrmPropertyString} 1439daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * and {@link #setDrmPropertyString}. 1440daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1441daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public interface OnDrmConfigHelper { 1442daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1443daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Called to give the app the opportunity to configure DRM before the session is created 1444daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1445daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mp the {@code MediaPlayer2} associated with this callback 1446daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param dsd the DataSourceDesc of this data source 1447daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1448daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang void onDrmConfig(MediaPlayer2 mp, DataSourceDesc dsd); 1449daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 1450daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1451daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1452daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Register a callback to be invoked for configuration of the DRM object before 1453daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * the session is created. 1454daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The callback will be invoked synchronously during the execution 1455daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * of {@link #prepareDrm(UUID uuid)}. 1456daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1457daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param listener the callback that will be run 1458daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1459daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is a synchronous call. 1460daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setOnDrmConfigHelper(OnDrmConfigHelper listener); 1461daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1462daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1463daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Interface definition for callbacks to be invoked when the player has the corresponding 1464daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * DRM events. 1465daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1466daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract static class DrmEventCallback { 1467daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1468daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Called to indicate DRM info is available 1469daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1470daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mp the {@code MediaPlayer2} associated with this callback 1471daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param dsd the DataSourceDesc of this data source 1472daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param drmInfo DRM info of the source including PSSH, and subset 1473daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * of crypto schemes supported by this device 1474daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1475daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public void onDrmInfo(MediaPlayer2 mp, DataSourceDesc dsd, DrmInfo drmInfo) { } 1476daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1477daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1478daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Called to notify the client that {@link #prepareDrm} is finished and ready for 1479daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * key request/response. 1480daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1481daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mp the {@code MediaPlayer2} associated with this callback 1482daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param dsd the DataSourceDesc of this data source 1483daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param status the result of DRM preparation. 1484daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1485daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public void onDrmPrepared( 1486daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang MediaPlayer2 mp, DataSourceDesc dsd, @PrepareDrmStatusCode int status) { } 1487daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 1488daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1489daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1490daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Sets the callback to be invoked when the media source is ready for playback. 1491daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1492daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param eventCallback the callback that will be run 1493daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param executor the executor through which the callback should be invoked 1494daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1495daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is a synchronous call. 1496daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setDrmEventCallback(@NonNull Executor executor, 1497daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @NonNull DrmEventCallback eventCallback); 1498daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1499daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1500daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Clears the {@link DrmEventCallback}. 1501daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1502daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is a synchronous call. 1503daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void clearDrmEventCallback(); 1504daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1505daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1506daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The status codes for {@link DrmEventCallback#onDrmPrepared} listener. 1507daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 1508daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1509daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * DRM preparation has succeeded. 1510daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1511daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int PREPARE_DRM_STATUS_SUCCESS = 0; 1512daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1513daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1514daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The device required DRM provisioning but couldn't reach the provisioning server. 1515daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1516daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR = 1; 1517daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1518daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1519daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The device required DRM provisioning but the provisioning server denied the request. 1520daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1521daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR = 2; 1522daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1523daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1524daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The DRM preparation has failed . 1525daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1526daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static final int PREPARE_DRM_STATUS_PREPARATION_ERROR = 3; 1527daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1528daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1529daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** @hide */ 1530daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @IntDef(flag = false, /*prefix = "PREPARE_DRM_STATUS",*/ value = { 1531daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang PREPARE_DRM_STATUS_SUCCESS, 1532daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR, 1533daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR, 1534daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang PREPARE_DRM_STATUS_PREPARATION_ERROR, 1535daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang }) 1536daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @Retention(RetentionPolicy.SOURCE) 1537daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @RestrictTo(LIBRARY_GROUP) 1538daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public @interface PrepareDrmStatusCode {} 1539daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1540daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1541daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Retrieves the DRM Info associated with the current source 1542daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1543daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @throws IllegalStateException if called before being prepared 1544daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1545daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract DrmInfo getDrmInfo(); 1546daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1547daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1548daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Prepares the DRM for the current source 1549daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 1550daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * If {@link OnDrmConfigHelper} is registered, it will be called during 1551daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * preparation to allow configuration of the DRM properties before opening the 1552daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * DRM session. Note that the callback is called synchronously in the thread that called 1553daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #prepareDrm}. It should be used only for a series of {@code getDrmPropertyString} 1554daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * and {@code setDrmPropertyString} calls and refrain from any lengthy operation. 1555daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 1556daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * If the device has not been provisioned before, this call also provisions the device 1557daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * which involves accessing the provisioning server and can take a variable time to 1558daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * complete depending on the network connectivity. 1559daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * If {@code OnDrmPreparedListener} is registered, prepareDrm() runs in non-blocking 1560daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * mode by launching the provisioning in the background and returning. The listener 1561daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * will be called when provisioning and preparation has finished. If a 1562daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@code OnDrmPreparedListener} is not registered, prepareDrm() waits till provisioning 1563daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * and preparation has finished, i.e., runs in blocking mode. 1564daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 1565daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * If {@code OnDrmPreparedListener} is registered, it is called to indicate the DRM 1566daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * session being ready. The application should not make any assumption about its call 1567daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * sequence (e.g., before or after prepareDrm returns), or the thread context that will 1568daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * execute the listener (unless the listener is registered with a handler thread). 1569daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 1570daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1571daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param uuid The UUID of the crypto scheme. If not known beforehand, it can be retrieved 1572daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * from the source through {@code getDrmInfo} or registering a {@code onDrmInfoListener}. 1573daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1574daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @throws IllegalStateException if called before being prepared or the DRM was 1575daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * prepared already 1576daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @throws UnsupportedSchemeException if the crypto scheme is not supported 1577daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @throws ResourceBusyException if required DRM resources are in use 1578daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @throws ProvisioningNetworkErrorException if provisioning is required but failed due to a 1579daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * network error 1580daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @throws ProvisioningServerErrorException if provisioning is required but failed due to 1581daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * the request denied by the provisioning server 1582daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1583daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is a synchronous call. 1584daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void prepareDrm(@NonNull UUID uuid) 1585daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang throws UnsupportedSchemeException, ResourceBusyException, 1586daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang ProvisioningNetworkErrorException, ProvisioningServerErrorException; 1587daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1588daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1589daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Releases the DRM session 1590daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 1591daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * The player has to have an active DRM session and be in stopped, or prepared 1592daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * state before this call is made. 1593daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * A {@code reset()} call will release the DRM session implicitly. 1594daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1595daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @throws NoDrmSchemeException if there is no active DRM session to release 1596daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1597daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 1598daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void releaseDrm() throws NoDrmSchemeException; 1599daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1600daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1601daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * A key request/response exchange occurs between the app and a license server 1602daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * to obtain or release keys used to decrypt encrypted content. 1603daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 1604daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * getDrmKeyRequest() is used to obtain an opaque key request byte array that is 1605daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * delivered to the license server. The opaque key request byte array is returned 1606daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * in KeyRequest.data. The recommended URL to deliver the key request to is 1607daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * returned in KeyRequest.defaultUrl. 1608daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 1609daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * After the app has received the key request response from the server, 1610daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * it should deliver to the response to the DRM engine plugin using the method 1611daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link #provideDrmKeyResponse}. 1612daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1613daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param keySetId is the key-set identifier of the offline keys being released when keyType is 1614daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link MediaDrm#KEY_TYPE_RELEASE}. It should be set to null for other key requests, when 1615daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * keyType is {@link MediaDrm#KEY_TYPE_STREAMING} or {@link MediaDrm#KEY_TYPE_OFFLINE}. 1616daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1617daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param initData is the container-specific initialization data when the keyType is 1618daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link MediaDrm#KEY_TYPE_STREAMING} or {@link MediaDrm#KEY_TYPE_OFFLINE}. Its meaning is 1619daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * interpreted based on the mime type provided in the mimeType parameter. It could 1620daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * contain, for example, the content ID, key ID or other data obtained from the content 1621daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * metadata that is required in generating the key request. 1622daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * When the keyType is {@link MediaDrm#KEY_TYPE_RELEASE}, it should be set to null. 1623daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1624daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param mimeType identifies the mime type of the content 1625daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1626daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param keyType specifies the type of the request. The request may be to acquire 1627daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * keys for streaming, {@link MediaDrm#KEY_TYPE_STREAMING}, or for offline content 1628daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link MediaDrm#KEY_TYPE_OFFLINE}, or to release previously acquired 1629daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * keys ({@link MediaDrm#KEY_TYPE_RELEASE}), which are identified by a keySetId. 1630daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1631daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param optionalParameters are included in the key request message to 1632daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * allow a client application to provide additional message parameters to the server. 1633daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * This may be {@code null} if no additional parameters are to be sent. 1634daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1635daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @throws NoDrmSchemeException if there is no active DRM session 1636daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1637daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @NonNull 1638daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract MediaDrm.KeyRequest getDrmKeyRequest( 1639daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @Nullable byte[] keySetId, @Nullable byte[] initData, 1640daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @Nullable String mimeType, int keyType, 1641daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @Nullable Map<String, String> optionalParameters) 1642daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang throws NoDrmSchemeException; 1643daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1644daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1645daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * A key response is received from the license server by the app, then it is 1646daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * provided to the DRM engine plugin using provideDrmKeyResponse. When the 1647daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * response is for an offline key request, a key-set identifier is returned that 1648daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * can be used to later restore the keys to a new session with the method 1649daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@ link # restoreDrmKeys}. 1650daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * When the response is for a streaming or release request, null is returned. 1651daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1652daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param keySetId When the response is for a release request, keySetId identifies 1653daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * the saved key associated with the release request (i.e., the same keySetId 1654daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * passed to the earlier {@ link # getDrmKeyRequest} call. It MUST be null when the 1655daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * response is for either streaming or offline key requests. 1656daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1657daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param response the byte array response from the server 1658daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1659daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @throws NoDrmSchemeException if there is no active DRM session 1660daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @throws DeniedByServerException if the response indicates that the 1661daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * server rejected the request 1662daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1663daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is a synchronous call. 1664daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract byte[] provideDrmKeyResponse( 1665daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @Nullable byte[] keySetId, @NonNull byte[] response) 1666daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang throws NoDrmSchemeException, DeniedByServerException; 1667daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1668daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1669daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Restore persisted offline keys into a new session. keySetId identifies the 1670daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * keys to load, obtained from a prior call to {@link #provideDrmKeyResponse}. 1671daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1672daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param keySetId identifies the saved key set to restore 1673daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1674daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is an asynchronous call. 1675daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void restoreDrmKeys(@NonNull byte[] keySetId) 1676daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang throws NoDrmSchemeException; 1677daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1678daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1679daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Read a DRM engine plugin String property value, given the property name string. 1680daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 1681daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param propertyName the property name 1682daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1683daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Standard fields names are: 1684daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link MediaDrm#PROPERTY_VENDOR}, {@link MediaDrm#PROPERTY_VERSION}, 1685daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link MediaDrm#PROPERTY_DESCRIPTION}, {@link MediaDrm#PROPERTY_ALGORITHMS} 1686daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1687daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @NonNull 1688daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract String getDrmPropertyString( 1689daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @NonNull String propertyName) 1690daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang throws NoDrmSchemeException; 1691daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1692daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1693daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Set a DRM engine plugin String property value. 1694daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * <p> 1695daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param propertyName the property name 1696daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * @param value the property value 1697daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * 1698daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Standard fields names are: 1699daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link MediaDrm#PROPERTY_VENDOR}, {@link MediaDrm#PROPERTY_VERSION}, 1700daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * {@link MediaDrm#PROPERTY_DESCRIPTION}, {@link MediaDrm#PROPERTY_ALGORITHMS} 1701daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1702daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang // This is a synchronous call. 1703daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract void setDrmPropertyString( 1704daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang @NonNull String propertyName, @NonNull String value) 1705daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang throws NoDrmSchemeException; 1706daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1707daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1708daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Encapsulates the DRM properties of the source. 1709daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1710daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract static class DrmInfo { 1711daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1712daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Returns the PSSH info of the data source for each supported DRM scheme. 1713daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1714daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract Map<UUID, byte[]> getPssh(); 1715daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1716daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1717daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Returns the intersection of the data source and the device DRM schemes. 1718daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * It effectively identifies the subset of the source's DRM schemes which 1719daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * are supported by the device too. 1720daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1721daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public abstract List<UUID> getSupportedSchemes(); 1722daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang }; // DrmInfo 1723daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1724daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1725daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Thrown when a DRM method is called before preparing a DRM scheme through prepareDrm(). 1726daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Extends MediaDrm.MediaDrmException 1727daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1728daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static class NoDrmSchemeException extends MediaDrmException { 1729daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public NoDrmSchemeException(String detailMessage) { 1730daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang super(detailMessage); 1731daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 1732daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 1733daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1734daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1735daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Thrown when the device requires DRM provisioning but the provisioning attempt has 1736daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * failed due to a network error (Internet reachability, timeout, etc.). 1737daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Extends MediaDrm.MediaDrmException 1738daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1739daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static class ProvisioningNetworkErrorException extends MediaDrmException { 1740daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public ProvisioningNetworkErrorException(String detailMessage) { 1741daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang super(detailMessage); 1742daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 1743daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 1744daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang 1745daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang /** 1746daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Thrown when the device requires DRM provisioning but the provisioning attempt has 1747daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * failed due to the provisioning server denying the request. 1748daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang * Extends MediaDrm.MediaDrmException 1749daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang */ 1750daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public static class ProvisioningServerErrorException extends MediaDrmException { 1751daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang public ProvisioningServerErrorException(String detailMessage) { 1752daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang super(detailMessage); 1753daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 1754daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang } 1755f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1756f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1757f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Definitions for the metrics that are reported via the {@link #getMetrics} call. 1758f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1759f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final class MetricsConstants { 1760f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang private MetricsConstants() {} 1761f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1762f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1763f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Key to extract the MIME type of the video track 1764f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * from the {@link MediaPlayer2#getMetrics} return value. 1765f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * The value is a String. 1766f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1767f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final String MIME_TYPE_VIDEO = "android.media.mediaplayer.video.mime"; 1768f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1769f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1770f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Key to extract the codec being used to decode the video track 1771f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * from the {@link MediaPlayer2#getMetrics} return value. 1772f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * The value is a String. 1773f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1774f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final String CODEC_VIDEO = "android.media.mediaplayer.video.codec"; 1775f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1776f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1777f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Key to extract the width (in pixels) of the video track 1778f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * from the {@link MediaPlayer2#getMetrics} return value. 1779f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * The value is an integer. 1780f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1781f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final String WIDTH = "android.media.mediaplayer.width"; 1782f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1783f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1784f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Key to extract the height (in pixels) of the video track 1785f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * from the {@link MediaPlayer2#getMetrics} return value. 1786f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * The value is an integer. 1787f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1788f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final String HEIGHT = "android.media.mediaplayer.height"; 1789f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1790f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1791f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Key to extract the count of video frames played 1792f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * from the {@link MediaPlayer2#getMetrics} return value. 1793f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * The value is an integer. 1794f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1795f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final String FRAMES = "android.media.mediaplayer.frames"; 1796f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1797f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1798f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Key to extract the count of video frames dropped 1799f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * from the {@link MediaPlayer2#getMetrics} return value. 1800f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * The value is an integer. 1801f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1802f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final String FRAMES_DROPPED = "android.media.mediaplayer.dropped"; 1803f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1804f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1805f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Key to extract the MIME type of the audio track 1806f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * from the {@link MediaPlayer2#getMetrics} return value. 1807f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * The value is a String. 1808f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1809f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final String MIME_TYPE_AUDIO = "android.media.mediaplayer.audio.mime"; 1810f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1811f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1812f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Key to extract the codec being used to decode the audio track 1813f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * from the {@link MediaPlayer2#getMetrics} return value. 1814f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * The value is a String. 1815f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1816f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final String CODEC_AUDIO = "android.media.mediaplayer.audio.codec"; 1817f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1818f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1819f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Key to extract the duration (in milliseconds) of the 1820f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * media being played 1821f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * from the {@link MediaPlayer2#getMetrics} return value. 1822f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * The value is a long. 1823f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1824f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final String DURATION = "android.media.mediaplayer.durationMs"; 1825f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1826f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1827f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Key to extract the playing time (in milliseconds) of the 1828f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * media being played 1829f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * from the {@link MediaPlayer2#getMetrics} return value. 1830f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * The value is a long. 1831f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1832f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final String PLAYING = "android.media.mediaplayer.playingMs"; 1833f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1834f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1835f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Key to extract the count of errors encountered while 1836f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * playing the media 1837f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * from the {@link MediaPlayer2#getMetrics} return value. 1838f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * The value is an integer. 1839f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1840f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final String ERRORS = "android.media.mediaplayer.err"; 1841f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1842f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang /** 1843f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * Key to extract an (optional) error code detected while 1844f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * playing the media 1845f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * from the {@link MediaPlayer2#getMetrics} return value. 1846f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang * The value is an integer. 1847f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang */ 1848f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang public static final String ERROR_CODE = "android.media.mediaplayer.errcode"; 1849f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang 1850f8e9b4bae277e10d25fed1a67bcb8155e31cfd48Dongwon Kang } 1851daf546359fe5d718ee3e736bf09feeba69ed9db5Insun Kang} 1852