1.frameworks/base/media/java/android/media/MediaPlayer.java
public void start() throws IllegalStateException {
_start();
}
private native void _start() throws IllegalStateException; //jni声明
2.frameworks/base/media/jni/android_media_MediaPlayer.cpp
{"_start", "()V", (void *)android_media_MediaPlayer_start},
static void android_media_MediaPlayer_start(JNIEnv *env, jobject thiz)
{
sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
process_media_player_call( env, thiz, mp->start(), NULL, NULL );
}
3.frameworks/av/media/libmedia/mediaplayer.cpp
status_t MediaPlayer::start()
{
status_t ret = mPlayer->start();
}
4.frameworks/av/media/libmedia/IMediaPlayer.cpp
status_t start()
{
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
remote()->transact(START, data, &reply);//remote()就是IBinder
return reply.readInt32();
}
5.搜索IBinder //remote()就是IBinder
frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
status_t MediaPlayerService::Client::start()
{
ALOGV("[%d] start", mConnId);
sp<MediaPlayerBase> p = getPlayer();
if (p == 0) return UNKNOWN_ERROR;
p->setLooping(mLoop);
return p->start();
}
6.frameworks/av/media/libmedia/IMediaPlayerClient.cpp
class BpMediaPlayerClient: public BpInterface<IMediaPlayerClient>
{
public:
BpMediaPlayerClient(const sp<IBinder>& impl)
: BpInterface<IMediaPlayerClient>(impl){}
virtual void notify(int msg, int ext1, int ext2, const Parcel *obj)
{
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayerClient::getInterfaceDescriptor());
data.writeInt32(msg);
data.writeInt32(ext1);
data.writeInt32(ext2);
if (obj && obj->dataSize() > 0) {
data.appendFrom(const_cast<Parcel *>(obj), 0, obj->dataSize());
}
remote()->transact(NOTIFY, data, &reply, IBinder::FLAG_ONEWAY);
}
}
7.framework/av/media/libmediaplayerservice/MediaPlayerService.cpp
status_t MediaPlayerService::Client::start()
{
ALOGV("[%d] start", mConnId);
sp<MediaPlayerBase> p = getPlayer();
if (p == 0) return UNKNOWN_ERROR;
p->setLooping(mLoop);
return p->start();
}
8.framework/av/media/libmediaplayerservice/StagefrightPlayer.cpp
status_t StagefrightPlayer::start() {
ALOGV("start");
return mPlayer->play();
}
9.frameworks/av/media/libstagefright/AwesomePlayer.cpp
<1>status_t AwesomePlayer::initVideoDecoder(uint32_t flags) {
mVideoSource = OMXCodec::Create(
mClient.interface(), mVideoTrack->getFormat(),
false, // createEncoder
mVideoTrack,
NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);
}
<2>status_t AwesomePlayer::play() {
return play_l();
}
10.frameworks/av/media/libstagefright/OMXCodec.cpp
sp<MediaSource> OMXCodec::Create(
const sp<IOMX> &omx,
const sp<MetaData> &meta, bool createEncoder,
const sp<MediaSource> &source,
const char *matchComponentName,
uint32_t flags,
const sp<ANativeWindow> &nativeWindow) {
}
因为时间原因,有时间把OMX流程跟下.未完待续...
|