[Android] libmedia-libmediaplayerservice 框架

@startuml

package libmedia{
    class MediaPlayer{
        1   status_t        setListener(const sp& listener);
        2   status_t        getVideoWidth(int *w);
        3   status_t        getVideoHeight(int *h);
        1~42   wrapper_IMediaPlayer();
        1~7   wrapper_IMediaPlayerService();
    }

    class JAVAMediaPlayer{
        1  void setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 
        2  void setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) 
        3  void setOnErrorListener(MediaPlayer.OnErrorListener listener) 
        4  void setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener) 
        5  void setOnPreparedListener(MediaPlayer.OnPreparedListener listener) 
        6  void setDataSource(String path) 
        7  void setDataSource(Context context, Uri uri, Map headers) 
        8  void prepareAsync() 
        9  void setSurface(Surface surface) 
        10  void setDisplay(SurfaceHolder sh) 
        11  void start() 
        12  void pause() 
        13  boolean isPlaying() 
        14  void stop() 
        15  void reset() 
        16  void release() 
        17  int getCurrentPosition() 
        18  int getDuration() 
        19  int getVideoHeight() 
        20  int getVideoWidth() 
        21  void seekTo(int msec) 
        22  void setOnInfoListener(MediaPlayer.OnInfoListener listener) 
        23  void setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) 
        24  void setPlaybackParams(PlaybackParams params) 
        25  void setAudioStreamType(int streamtype) 
        26  void setScreenOnWhilePlaying(boolean screenOn) 
        27  void setVolume(float leftVolume, float rightVolume) 
        28  void setLooping(boolean looping) 
    }

    class JNIMediaPlayer {
        6,7 void android_media_MediaPlayer_setDataSourceAndHeaders(JNIEnv *env, jobject thiz, jobject httpServiceBinderObj, jstring path,jobjectArray keys, jobjectArray values)  2
        8 void android_media_MediaPlayer_prepareAsync(JNIEnv *env, jobject thiz)  6,9
        9,10 void android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)  6
        11 void android_media_MediaPlayer_start(JNIEnv *env, jobject thiz)  10
        12 void android_media_MediaPlayer_pause(JNIEnv *env, jobject thiz)  12
        13 jboolean android_media_MediaPlayer_isPlaying(JNIEnv *env, jobject thiz)  13
        14 void android_media_MediaPlayer_stop(JNIEnv *env, jobject thiz)  11
        15 void android_media_MediaPlayer_reset(JNIEnv *env, jobject thiz)  22
        16 void android_media_MediaPlayer_release(JNIEnv *env, jobject thiz)  1,1
        17 void jint android_media_MediaPlayer_getCurrentPosition(JNIEnv *env, jobject thiz)(JNIEnv *env, jobject thiz)  19
        18 jint android_media_MediaPlayer_getDuration(JNIEnv *env, jobject thiz)  20
        19 jint android_media_MediaPlayer_getVideoHeight(JNIEnv *env, jobject thiz)(JNIEnv *env, jobject thiz)  2
        20 jint android_media_MediaPlayer_getVideoWidth(JNIEnv *env, jobject thiz)(JNIEnv *env, jobject thiz)  3
        21 void android_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, jlong msec, jint mode)  18
        24 void android_media_MediaPlayer_setPlaybackParams(JNIEnv *env, jobject thiz, jobject params)  14
        25 void android_media_MediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, jint streamtype)  23
        27 void android_media_MediaPlayer_setVolume(JNIEnv *env, jobject thiz, jfloat leftVolume, jfloat rightVolume)  25
        28 void android_media_MediaPlayer_setLooping(JNIEnv *env, jobject thiz, jboolean looping)  24
    }

    JAVAMediaPlayer ...> JNIMediaPlayer
    JNIMediaPlayer ...> MediaPlayer
}

package libmediaplayerservice{
    class MediaPlayerService{

    }

    class Client{

    }

    class AudioOutput{

    }

    class MediaPlayerBase{

    }

    class NuPlayerDriver{
        wrapper of NuPlayer
    }

    class NuPlayer{
        Audio 喂给 AudioTrack ,  Video 喂给其他模块
    }

    class Source{
        demux
    }

    class PlusPlayerDriver{

    }

    class PlusPlayer{

    }

    MediaPlayerService "n" --> Client
    Client --> AudioOutput
    Client --> MediaPlayerBase
    MediaPlayerBase <|-- NuPlayerDriver
    NuPlayerDriver --> NuPlayer
    NuPlayer --> Source
    MediaPlayerBase <|-- PlusPlayerDriver
    PlusPlayerDriver --> PlusPlayer

}

package libaudioclient{

}

package Interface{
    abstract class IMediaPlayer{

        1 {abstract}  void            disconnect() = 0;
        2 {abstract}  status_t        setDataSource(const sp &httpService,const char *url,const KeyedVector* headers) = 0; 
        3 {abstract}  status_t        setDataSource(int fd, int64_t offset, int64_t length) = 0;
        4 {abstract}  status_t        setDataSource(const sp& source) = 0;
        5 {abstract}  status_t        setDataSource(const sp& source) = 0;
        6 {abstract}  status_t        setVideoSurfaceTexture(const sp& bufferProducer) = 0;
        7 {abstract}  status_t        getBufferingSettings(BufferingSettings* buffering /* nonnull */) = 0;
        8 {abstract}  status_t        setBufferingSettings(const BufferingSettings& buffering) = 0;
        9 {abstract}  status_t        prepareAsync() = 0;
        10 {abstract}  status_t        start() = 0;
        11 {abstract}  status_t        stop() = 0;
        12 {abstract}  status_t        pause() = 0;
        13 {abstract}  status_t        isPlaying(bool* state) = 0;
        14 {abstract}  status_t        setPlaybackSettings(const AudioPlaybackRate& rate) = 0;
        15 {abstract}  status_t        getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */) = 0;
        16 {abstract}  status_t        setSyncSettings(const AVSyncSettings& sync, float videoFpsHint) = 0;
        17 {abstract}  status_t        getSyncSettings(AVSyncSettings* sync /* nonnull */,float* videoFps /* nonnull */) = 0;
        18 {abstract}  status_t        seekTo(int msec,MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) = 0;
        19 {abstract}  status_t        getCurrentPosition(int* msec) = 0;
        20 {abstract}  status_t        getDuration(int* msec) = 0;
        21 {abstract}  status_t        notifyAt(int64_t mediaTimeUs) = 0;
        22 {abstract}  status_t        reset() = 0;
        23 {abstract}  status_t        setAudioStreamType(audio_stream_type_t type) = 0;
        24 {abstract}  status_t        setLooping(int loop) = 0;
        25 {abstract}  status_t        setVolume(float leftVolume, float rightVolume) = 0;
        26 {abstract}  status_t        setAuxEffectSendLevel(float level) = 0;
        27 {abstract}  status_t        attachAuxEffect(int effectId) = 0;
        28 {abstract}  status_t        setParameter(int key, const Parcel& request) = 0;
        29 {abstract}  status_t        getParameter(int key, Parcel* reply) = 0;
        30 {abstract}  status_t        setRetransmitEndpoint(const struct sockaddr_in* endpoint) = 0;
        31 {abstract}  status_t        getRetransmitEndpoint(struct sockaddr_in* endpoint) = 0;
        32 {abstract}  status_t        setNextPlayer(const sp& next) = 0;
        33 {abstract}  media::VolumeShaper::Status applyVolumeShaper(const sp& configuration,const sp& operation) = 0;
        34 {abstract}  sp getVolumeShaperState(int id) = 0;
        'Modular DRM'
        35 {abstract}  status_t        prepareDrm(const uint8_t uuid[16],const Vector& drmSessionId) = 0;
        36 {abstract}  status_t        releaseDrm() = 0;
        37 {abstract}  status_t        invoke(const Parcel& request, Parcel *reply) = 0;
        38 {abstract}  status_t        setMetadataFilter(const Parcel& filter) = 0;
        39 {abstract}  status_t        getMetadata(bool update_only,bool apply_filter,Parcel *metadata) = 0;
        'AudioRouting'
        40 {abstract}  status_t        setOutputDevice(audio_port_handle_t deviceId) = 0;
        41 {abstract}  status_t        getRoutedDeviceId(audio_port_handle_t *deviceId) = 0;
        42 {abstract}  status_t        enableAudioDeviceCallback(bool enabled) = 0;
    }
    abstract class IMediaPlayerClient{
        处理来自Client的回调
        {abstract}  void notify(int msg, int ext1, int ext2, const Parcel *obj) = 0;
    }
    class IMediaDeathNotifier{
        提供接口给MediaPlayer获取 mediaplayserservice 服务, 目前是 "media.player"
        getMediaPlayerService();
    }
    abstract class IMediaPlayerService{
        创建一个 IMediaPlayer 给MediaPlayer
        IMediaPlayerService.h

        1 {abstract}  sp createMediaRecorder(const String16 &opPackageName) = 0;
        2 {abstract}  sp createMetadataRetriever() = 0;
        3 {abstract}  sp create(const sp& client,audio_session_t audioSessionId = AUDIO_SESSION_ALLOCATE) = 0;
        4 {abstract}  sp getCodecList() const = 0;
        5 {abstract}  sp listenForRemoteDisplay(const String16 &opPackageName,const sp& client, const String8& iface) = 0;
        6 {abstract}  void addBatteryData(uint32_t params) = 0;
        7 {abstract}  status_t pullBatteryData(Parcel* reply) = 0;
    }
}

MediaPlayer ...> IMediaDeathNotifier
IMediaDeathNotifier ...> libmediaplayerservice
MediaPlayer ...> IMediaPlayerService
IMediaPlayerService ...> MediaPlayerService
MediaPlayer ...> IMediaPlayer
IMediaPlayer "RPC"...> Client
MediaPlayer <... IMediaPlayerClient
IMediaPlayerClient <..."RPC" Client
'IMediaDeathNotifier ...> libmediaplayerservice'
'libmedia ...> IMediaDeathNotifier'
AudioOutput --> libaudioclient


@enduml

你可能感兴趣的:(Android,framework,android)