@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