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