MediaPlayer_setDataSource流程

MediaPlayer_setDataSource流程

-----------------------------------------------------------------------------------------------------------------------------------------------------

App层:

private final MediaPlayer mMediaPlayer;

mMediaPlayer = new MediaPlayer();

mMediaPlayer.reset();

mMediaPlayer.setDataSource(path);


-----------------------------------------------------------------------------------------------------------------------------------------------------

Framework api:

android/media/MediaPlayer.java:

//加载JNI部分,libmedia,初始化

static {

       System.loadLibrary("media_jni");

       native_init();

}

//api最终调用的java函数

void setDataSource(FileDescriptor fd, longoffset, long length)

//调用native函数

native void _setDataSource(FileDescriptorfd, long offset, long length)


-----------------------------------------------------------------------------------------------------------------------------------------------------

Native层:

/frameworks/av/media/libmedia/mediaplayer.cpp:

// 创建sp<IMediaPlayer>,调用sp ->setDataSource(fd, offset, length)

MediaPlayer::setDataSource(int fd, int64_toffset, int64_t length)


调用服务端的MediaPlayerService的setDataSource函数

class MediaPlayerService : publicBnMediaPlayerService


/frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp

//获取播放器类型,并创建sp<MediaPlayerBase>,post创建结果消息

status_t MediaPlayerService::Client::setDataSource(intfd, int64_t offset, int64_t length)

spMediaPlayerService::Client::setDataSource_pre(player_type playerType)


//创建播放器

MediaPlayerFactory::createPlayer(playerType,mListener, mPid);


//创建NuPlayerDriver

/frameworks/av/media/libmediaplayerservice/MediaPlayerFactory.cpp

virtual spcreatePlayer(pid_t pid) {

          ALOGV(" createNuPlayer");

          return newNuPlayerDriver(pid);

}


/frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp

//接下来是NuPlayerDriver的构造,初始化很多变量

NuPlayerDriver::NuPlayerDriver(pid_t pid)

      : mState(STATE_IDLE),

       mIsAsyncPrepare(false),

       mAsyncResult(UNKNOWN_ERROR),

       mSetSurfaceInProgress(false),

       mDurationUs(-1),

        mPositionUs(-1),

       mSeekInProgress(false),

        mPlayingTimeUs(0),

        mRebufferingTimeUs(0),

        mRebufferingEvents(0),

       mRebufferingAtExit(false),

        mLooper(new ALooper),

        mMediaClock(newMediaClock),

        mPlayer(newNuPlayer(pid, mMediaClock)),

        mPlayerFlags(0),

        mAnalyticsItem(NULL),

       mClientUid(-1),

        mAtEOS(false),

        mLooping(false),

       mAutoLoop(false) {

     ALOGD("NuPlayerDriver(%p) created, clientPid(%d)", this, pid);

      mLooper->setName("NuPlayerDriverLooper");

      mMediaClock->init();

      // set up an analyticsrecord

      mAnalyticsItem =MediaAnalyticsItem::create(kKeyPlayer);

      mLooper->start(

              false, /*runOnCallingThread */

              true,  /* canCallJava */

              PRIORITY_AUDIO);

     mLooper->registerHandler(mPlayer);

      mPlayer->init(this);

 }


//重点注意:

mPlayer(new NuPlayer(pid, mMediaClock)),

mPlayerFlags(0),

mPlayer->init(this);

//创建了NuPlayer, 这就是实际的播放器对象,调用了NuPlayer去init


/frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayer.cpp

//创建GenericSource,完成后msg->post(),发出消息kWhatSetDataSource

void NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_tlength)

在NuPlayer::onMessageReceived(const sp<AMessage> &msg)中接受消息,调用notifySetDataSourceCompleted通知出去。

case kWhatSetDataSource:

          {

             ALOGV("kWhatSetDataSource");

              CHECK(mSource ==NULL);

              status_t err = OK;

             sp obj;

             CHECK(msg->findObject("source", &obj));

              if (obj != NULL){

                 Mutex::Autolock autoLock(mSourceLock);

                  mSource =static_cast(obj.get());

              } else {

                  err =UNKNOWN_ERROR;

              }

              CHECK(mDriver !=NULL);

             sp driver = mDriver.promote();

              if (driver !=NULL) {

                  driver->notifySetDataSourceCompleted(err);

              }

              break;

          }


/frameworks/av/media/libmediaplayerservice/nuplayer/GenericSource.cpp

//重置 resetDataSource(),设置新的fd

      mFd = dup(fd);

      mOffset = offset;

      mLength = length;


/frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp

//至此,setDataSource()的流程结束,最后的状态是:STATE_UNPREPARED

void NuPlayerDriver::notifySetDataSourceCompleted(status_t err) {

      Mutex::AutolockautoLock(mLock);

      CHECK_EQ(mState,STATE_SET_DATASOURCE_PENDING);

      mAsyncResult = err;

      mState = (err == OK) ?STATE_UNPREPARED : STATE_IDLE;

      mCondition.broadcast();

  }

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容