Android Java到OMX 调用流程(未完待续...)

论坛 期权论坛 脚本     
匿名网站用户   2020-12-21 07:49   101   0
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流程跟下.未完待续...


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP