PVPlayer(即Packet Video Player)是OpenCore经过android包装后,提供给android多媒体播放的类。PVPlayer类文实现在OpenCore目录下的android/playerdriver.cpp文件中。在PVPlayer构造函数中实例化一个PlayerDriver类,生成一个播放器主线程,线程入口是PlayerDriver::startPlayerThread()函数,该函数通过调用PlayerDriver::playerThread()进入主循环。playerThread()主要代码如下:
...
...
InitializeForThread(); 初始化Oscl,代码在android/thread_init.cpp。
...
...
OMX_MasterInit(); 初始化OMX,代码在codecs_v2/omx/omx_mastercore/src/pv_omxmastercore.cpp。
OsclScheduler::Init("AndroidPVWrapper");
mPlayer = PVPlayerFactory::CreatePlayer(this, this, this);
AddToScheduler(); 将任务放入Oscl任务调试器
PendForExec();
OsclExecScheduler *sched = OsclExecScheduler::Current();
sched->StartScheduler(mSyncSem) 进入任务主循环,直到任务结束。
在每个任务循环中,调用PlayerDriver::Run()函数,异步执行命令队列中的命令。自此,播放服务就已经建立起来,之后有什么操作,只需调用相关函数将操作命令放入队列中,命令执行完毕后(成功或失败),会通过监听接口通知监听者命令执行情况。PlayerDriver通过继承PVCommandStatusObserver,PVInformationalEventObserver和 PVErrorEventObserver接口类实现了三个监听接口,分别为CommandCompleted(),HandleInformationalEvent()和HandleErrorEvent()。这些监听接口的具体任务可参考相关代码。