你是否正在寻找关于pvplayer的内容?让我把最俱价值的东西奉献给你:
PlayerDriver类里有如下成员变量的声明:PVPlayerInterface *mPlayer;它的创建是在调用函数int PlayerDriver::playerThread();的时候。由如下一行代码来完成的:OSCL_TRY(error, mPlayer = pvplayerFactory::CreatePlayer(this, this, this));
PVPlayerFactory是一个工厂类(不清楚工厂类的朋友可以去看设计模式里面的工厂模式)。最后它调用PVPlayerEngine::New(aCmdStatusObserver, aErrorEventObserver, aInfoEventObserver, aHwAccelerated);来得到PVPlayerEngine的一个实例。它在创建的时候同时PlayerDriver的this指针传给PVPlayerEngine作为参数,所以它同时也是pvplayerEngine的观察者,这样PlayerEngine里发生了什么事情,可以通过观察者的接口传递上去。
这里有个疑问,为什么不用PVPlayerEngine的构造函数来产生新的实例,而要通过PVPlayerEngine的一个static函数来完成呢?我的理解是,为了保证pvplayerEngine是封闭的,不可继承的。
在创建了pvplayerInterface的实例以后,把它缴入到Scheduler中,然后一句sched->StartScheduler(mSyncSem),就完成了它在整个生命周期中应该干的事情(又见scheduler)。
PVPlayerEngine,是由若干PVMF nodes和对nodes进行管理的功能模块组成,每个node完成独特的工作,它是一个独立的功能块,若干个node一起组成了一个node graph,这个graph是进行媒体播放的核心部分。同事pvplayerEngine还完成一些额外的工作,例如node的管理(包括搜索,注册,创建等),graph的创建。
在Opencore官方文档《pvplayer_developers_guide.pdf》中,有如下的状态转换图:

为了理解这个状态图,我们可以从一个文件播放的流程来看它每个步骤干了些什么事情:
按上图的状态转换方式,一次媒体播放过程有如下步骤组成:
AddDataSoure->Init->AddDataSink->Prepare->Start ->Pause->Resume ....... ->Stop->RemoveDataSink->RemoveDataSource
1,pvplayerEngine::AddDataSource
从名字上就能理解,它是在一开始的时候给他提供要播放的数据来源,这里的数据来源可以是本地文件,也可以是流媒体文件。PVPlayerEngine的客户端是通过给他发送命令的方式来执行的,内部执行命令的函数是:PVMFStatus PVPlayerEngine::DoAddDataSource(pvplayerEngineCommand& aCmd)。
在这个函数里面,首先进行差错检测,然后看Source的PVMFFormatType,在PlayerDriver接收到播放请求的URL以后它会判断URL是什么类型的,如果是"rtsp://"开头的,则设置类型为:PVMF_MIME_DATA_SOURCE_RTSP_URL,如果URL是以".sdp"结尾的,那么类型则被设置为:PVMF_MIME_DATA_SOURCE_SDP_FILE,如果是"http:"则这是一个无效的,其他的统一设置为:PVMF_MIME_FORMAT_UNKNOWN。
那么对于PVMF_MIME_FORMAT_UNKNOWN类型,PVPlayerEngine则要自己去判断是这个媒体文件时什么类型的,例如它是mp4文件,还是avi文件等。这些操作室通过PVPlayerEngine的子函数DoQuerySourceFormatType来执行的。这个函数很复杂,涉及到整个框架的内部子框架:FormatRecognizer。这个子模块又用到了那些耳熟能详的设计模式:工厂模式,命令模式,观察者模式,单件模式,等等等。具体怎么做我们不去暂时不是深究,因为这个内容比较庞杂。我们要记住的是,这个函数调用到了PVMFStatus PVPlayerRecognizerRegistry::QueryFormatType接口,并且把this指针传递下去作为FormatRecognizer执行文件格式检测以后的报告对象。总之,经过各种繁琐的类的构造和释放,命令的转换...最后终于识别成功了,于是,Recoginzer通知PVPlayerRecognizerRegistryObserver,格式识别出来了,由于pvplayerRecognizerRegistryObserver是一个
接口类,PVPlayerEngine类从这个类中继承而来,所以,我们看pvplayerEngine::RecognizeCompleted这个函数就行了,。
关注这一行:PVMFStatus retval = DoSetupSourceNode(cmdid, cmdcontext);在文件格式被正确识别出来以后,就需要来创建SourceNode了。
在node被创建以后,并且它的接口也被正常配置了以后,SourceNode会报告PVMFInfoDataReady事件给PVPlayerEngine。(这中间经历了若干过程,一系列的Command 和Observer,过程类似,具体的可以看代码)。一直到最后调用到函数:DoSourceNodeInit(),sourcenode会受到Init的命令,然后告诉Observer即engine,这个过程通过函数PVPlayerEngine::HandleSourceNodeInit来实现。SourceNodeInit成功后,pvplayerEngine的状态转变成PVP_ENGINE_STATE_INITIALIZED。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-17490-1.html
大东沟海战在日本围着定镇两舰打的情况下
一问怎么回事说分销商不送RIO了
加油