Home | History | Annotate | Download | only in media
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_MEDIAPLAYER_H
     18 #define ANDROID_MEDIAPLAYER_H
     19 
     20 #include <arpa/inet.h>
     21 
     22 #include <binder/IMemory.h>
     23 
     24 #include <media/AudioResamplerPublic.h>
     25 #include <media/BufferingSettings.h>
     26 #include <media/IMediaPlayerClient.h>
     27 #include <media/IMediaPlayer.h>
     28 #include <media/IMediaDeathNotifier.h>
     29 #include <media/IStreamSource.h>
     30 
     31 #include <utils/KeyedVector.h>
     32 #include <utils/String8.h>
     33 
     34 struct ANativeWindow;
     35 
     36 namespace android {
     37 
     38 struct AVSyncSettings;
     39 class IGraphicBufferProducer;
     40 class Surface;
     41 
     42 enum media_event_type {
     43     MEDIA_NOP               = 0, // interface test message
     44     MEDIA_PREPARED          = 1,
     45     MEDIA_PLAYBACK_COMPLETE = 2,
     46     MEDIA_BUFFERING_UPDATE  = 3,
     47     MEDIA_SEEK_COMPLETE     = 4,
     48     MEDIA_SET_VIDEO_SIZE    = 5,
     49     MEDIA_STARTED           = 6,
     50     MEDIA_PAUSED            = 7,
     51     MEDIA_STOPPED           = 8,
     52     MEDIA_SKIPPED           = 9,
     53     MEDIA_TIMED_TEXT        = 99,
     54     MEDIA_ERROR             = 100,
     55     MEDIA_INFO              = 200,
     56     MEDIA_SUBTITLE_DATA     = 201,
     57     MEDIA_META_DATA         = 202,
     58     MEDIA_DRM_INFO          = 210,
     59 };
     60 
     61 // Generic error codes for the media player framework.  Errors are fatal, the
     62 // playback must abort.
     63 //
     64 // Errors are communicated back to the client using the
     65 // MediaPlayerListener::notify method defined below.
     66 // In this situation, 'notify' is invoked with the following:
     67 //   'msg' is set to MEDIA_ERROR.
     68 //   'ext1' should be a value from the enum media_error_type.
     69 //   'ext2' contains an implementation dependant error code to provide
     70 //          more details. Should default to 0 when not used.
     71 //
     72 // The codes are distributed as follow:
     73 //   0xx: Reserved
     74 //   1xx: Android Player errors. Something went wrong inside the MediaPlayer.
     75 //   2xx: Media errors (e.g Codec not supported). There is a problem with the
     76 //        media itself.
     77 //   3xx: Runtime errors. Some extraordinary condition arose making the playback
     78 //        impossible.
     79 //
     80 enum media_error_type {
     81     // 0xx
     82     MEDIA_ERROR_UNKNOWN = 1,
     83     // 1xx
     84     MEDIA_ERROR_SERVER_DIED = 100,
     85     // 2xx
     86     MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200,
     87     // 3xx
     88 };
     89 
     90 
     91 // Info and warning codes for the media player framework.  These are non fatal,
     92 // the playback is going on but there might be some user visible issues.
     93 //
     94 // Info and warning messages are communicated back to the client using the
     95 // MediaPlayerListener::notify method defined below.  In this situation,
     96 // 'notify' is invoked with the following:
     97 //   'msg' is set to MEDIA_INFO.
     98 //   'ext1' should be a value from the enum media_info_type.
     99 //   'ext2' contains an implementation dependant info code to provide
    100 //          more details. Should default to 0 when not used.
    101 //
    102 // The codes are distributed as follow:
    103 //   0xx: Reserved
    104 //   7xx: Android Player info/warning (e.g player lagging behind.)
    105 //   8xx: Media info/warning (e.g media badly interleaved.)
    106 //
    107 enum media_info_type {
    108     // 0xx
    109     MEDIA_INFO_UNKNOWN = 1,
    110     // The player was started because it was used as the next player for another
    111     // player, which just completed playback
    112     MEDIA_INFO_STARTED_AS_NEXT = 2,
    113     // The player just pushed the very first video frame for rendering
    114     MEDIA_INFO_RENDERING_START = 3,
    115     // 7xx
    116     // The video is too complex for the decoder: it can't decode frames fast
    117     // enough. Possibly only the audio plays fine at this stage.
    118     MEDIA_INFO_VIDEO_TRACK_LAGGING = 700,
    119     // MediaPlayer is temporarily pausing playback internally in order to
    120     // buffer more data.
    121     MEDIA_INFO_BUFFERING_START = 701,
    122     // MediaPlayer is resuming playback after filling buffers.
    123     MEDIA_INFO_BUFFERING_END = 702,
    124     // Bandwidth in recent past
    125     MEDIA_INFO_NETWORK_BANDWIDTH = 703,
    126 
    127     // 8xx
    128     // Bad interleaving means that a media has been improperly interleaved or not
    129     // interleaved at all, e.g has all the video samples first then all the audio
    130     // ones. Video is playing but a lot of disk seek may be happening.
    131     MEDIA_INFO_BAD_INTERLEAVING = 800,
    132     // The media is not seekable (e.g live stream).
    133     MEDIA_INFO_NOT_SEEKABLE = 801,
    134     // New media metadata is available.
    135     MEDIA_INFO_METADATA_UPDATE = 802,
    136     // Audio can not be played.
    137     MEDIA_INFO_PLAY_AUDIO_ERROR = 804,
    138     // Video can not be played.
    139     MEDIA_INFO_PLAY_VIDEO_ERROR = 805,
    140 
    141     //9xx
    142     MEDIA_INFO_TIMED_TEXT_ERROR = 900,
    143 };
    144 
    145 
    146 
    147 enum media_player_states {
    148     MEDIA_PLAYER_STATE_ERROR        = 0,
    149     MEDIA_PLAYER_IDLE               = 1 << 0,
    150     MEDIA_PLAYER_INITIALIZED        = 1 << 1,
    151     MEDIA_PLAYER_PREPARING          = 1 << 2,
    152     MEDIA_PLAYER_PREPARED           = 1 << 3,
    153     MEDIA_PLAYER_STARTED            = 1 << 4,
    154     MEDIA_PLAYER_PAUSED             = 1 << 5,
    155     MEDIA_PLAYER_STOPPED            = 1 << 6,
    156     MEDIA_PLAYER_PLAYBACK_COMPLETE  = 1 << 7
    157 };
    158 
    159 // Keep KEY_PARAMETER_* in sync with MediaPlayer.java.
    160 // The same enum space is used for both set and get, in case there are future keys that
    161 // can be both set and get.  But as of now, all parameters are either set only or get only.
    162 enum media_parameter_keys {
    163     // Streaming/buffering parameters
    164     KEY_PARAMETER_CACHE_STAT_COLLECT_FREQ_MS = 1100,            // set only
    165 
    166     // Return a Parcel containing a single int, which is the channel count of the
    167     // audio track, or zero for error (e.g. no audio track) or unknown.
    168     KEY_PARAMETER_AUDIO_CHANNEL_COUNT = 1200,                   // get only
    169 
    170     // Playback rate expressed in permille (1000 is normal speed), saved as int32_t, with negative
    171     // values used for rewinding or reverse playback.
    172     KEY_PARAMETER_PLAYBACK_RATE_PERMILLE = 1300,                // set only
    173 
    174     // Set a Parcel containing the value of a parcelled Java AudioAttribute instance
    175     KEY_PARAMETER_AUDIO_ATTRIBUTES = 1400                       // set only
    176 };
    177 
    178 // Keep INVOKE_ID_* in sync with MediaPlayer.java.
    179 enum media_player_invoke_ids {
    180     INVOKE_ID_GET_TRACK_INFO = 1,
    181     INVOKE_ID_ADD_EXTERNAL_SOURCE = 2,
    182     INVOKE_ID_ADD_EXTERNAL_SOURCE_FD = 3,
    183     INVOKE_ID_SELECT_TRACK = 4,
    184     INVOKE_ID_UNSELECT_TRACK = 5,
    185     INVOKE_ID_SET_VIDEO_SCALING_MODE = 6,
    186     INVOKE_ID_GET_SELECTED_TRACK = 7
    187 };
    188 
    189 // Keep MEDIA_TRACK_TYPE_* in sync with MediaPlayer.java.
    190 enum media_track_type {
    191     MEDIA_TRACK_TYPE_UNKNOWN = 0,
    192     MEDIA_TRACK_TYPE_VIDEO = 1,
    193     MEDIA_TRACK_TYPE_AUDIO = 2,
    194     MEDIA_TRACK_TYPE_TIMEDTEXT = 3,
    195     MEDIA_TRACK_TYPE_SUBTITLE = 4,
    196     MEDIA_TRACK_TYPE_METADATA = 5,
    197 };
    198 
    199 // ----------------------------------------------------------------------------
    200 // ref-counted object for callbacks
    201 class MediaPlayerListener: virtual public RefBase
    202 {
    203 public:
    204     virtual void notify(int msg, int ext1, int ext2, const Parcel *obj) = 0;
    205 };
    206 
    207 struct IMediaHTTPService;
    208 
    209 class MediaPlayer : public BnMediaPlayerClient,
    210                     public virtual IMediaDeathNotifier
    211 {
    212 public:
    213     MediaPlayer();
    214     ~MediaPlayer();
    215             void            died();
    216             void            disconnect();
    217 
    218             status_t        setDataSource(
    219                     const sp<IMediaHTTPService> &httpService,
    220                     const char *url,
    221                     const KeyedVector<String8, String8> *headers);
    222 
    223             status_t        setDataSource(int fd, int64_t offset, int64_t length);
    224             status_t        setDataSource(const sp<IDataSource> &source);
    225             status_t        setVideoSurfaceTexture(
    226                                     const sp<IGraphicBufferProducer>& bufferProducer);
    227             status_t        setListener(const sp<MediaPlayerListener>& listener);
    228             status_t        getDefaultBufferingSettings(BufferingSettings* buffering /* nonnull */);
    229             status_t        getBufferingSettings(BufferingSettings* buffering /* nonnull */);
    230             status_t        setBufferingSettings(const BufferingSettings& buffering);
    231             status_t        prepare();
    232             status_t        prepareAsync();
    233             status_t        start();
    234             status_t        stop();
    235             status_t        pause();
    236             bool            isPlaying();
    237             status_t        setPlaybackSettings(const AudioPlaybackRate& rate);
    238             status_t        getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */);
    239             status_t        setSyncSettings(const AVSyncSettings& sync, float videoFpsHint);
    240             status_t        getSyncSettings(
    241                                     AVSyncSettings* sync /* nonnull */,
    242                                     float* videoFps /* nonnull */);
    243             status_t        getVideoWidth(int *w);
    244             status_t        getVideoHeight(int *h);
    245             status_t        seekTo(
    246                     int msec,
    247                     MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC);
    248             status_t        getCurrentPosition(int *msec);
    249             status_t        getDuration(int *msec);
    250             status_t        reset();
    251             status_t        setAudioStreamType(audio_stream_type_t type);
    252             status_t        getAudioStreamType(audio_stream_type_t *type);
    253             status_t        setLooping(int loop);
    254             bool            isLooping();
    255             status_t        setVolume(float leftVolume, float rightVolume);
    256             void            notify(int msg, int ext1, int ext2, const Parcel *obj = NULL);
    257             status_t        invoke(const Parcel& request, Parcel *reply);
    258             status_t        setMetadataFilter(const Parcel& filter);
    259             status_t        getMetadata(bool update_only, bool apply_filter, Parcel *metadata);
    260             status_t        setAudioSessionId(audio_session_t sessionId);
    261             audio_session_t getAudioSessionId();
    262             status_t        setAuxEffectSendLevel(float level);
    263             status_t        attachAuxEffect(int effectId);
    264             status_t        setParameter(int key, const Parcel& request);
    265             status_t        getParameter(int key, Parcel* reply);
    266             status_t        setRetransmitEndpoint(const char* addrString, uint16_t port);
    267             status_t        setNextMediaPlayer(const sp<MediaPlayer>& player);
    268 
    269             VolumeShaper::Status applyVolumeShaper(
    270                                     const sp<VolumeShaper::Configuration>& configuration,
    271                                     const sp<VolumeShaper::Operation>& operation);
    272             sp<VolumeShaper::State> getVolumeShaperState(int id);
    273             // Modular DRM
    274             status_t        prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId);
    275             status_t        releaseDrm();
    276 
    277 private:
    278             void            clear_l();
    279             status_t        seekTo_l(int msec, MediaPlayerSeekMode mode);
    280             status_t        prepareAsync_l();
    281             status_t        getDuration_l(int *msec);
    282             status_t        attachNewPlayer(const sp<IMediaPlayer>& player);
    283             status_t        reset_l();
    284             status_t        doSetRetransmitEndpoint(const sp<IMediaPlayer>& player);
    285             status_t        checkStateForKeySet_l(int key);
    286 
    287     sp<IMediaPlayer>            mPlayer;
    288     thread_id_t                 mLockThreadId;
    289     Mutex                       mLock;
    290     Mutex                       mNotifyLock;
    291     Condition                   mSignal;
    292     sp<MediaPlayerListener>     mListener;
    293     void*                       mCookie;
    294     media_player_states         mCurrentState;
    295     int                         mCurrentPosition;
    296     MediaPlayerSeekMode         mCurrentSeekMode;
    297     int                         mSeekPosition;
    298     MediaPlayerSeekMode         mSeekMode;
    299     bool                        mPrepareSync;
    300     status_t                    mPrepareStatus;
    301     audio_stream_type_t         mStreamType;
    302     Parcel*                     mAudioAttributesParcel;
    303     bool                        mLoop;
    304     float                       mLeftVolume;
    305     float                       mRightVolume;
    306     int                         mVideoWidth;
    307     int                         mVideoHeight;
    308     audio_session_t             mAudioSessionId;
    309     float                       mSendLevel;
    310     struct sockaddr_in          mRetransmitEndpoint;
    311     bool                        mRetransmitEndpointValid;
    312     BufferingSettings           mCurrentBufferingSettings;
    313 };
    314 
    315 }; // namespace android
    316 
    317 #endif // ANDROID_MEDIAPLAYER_H
    318