在添加了Datasink后,执行命令Prepare

Driver层:执行函数Run()

函数PlayerDriver::handlePrepare(PlayerPrepare* command)

1)调用函数PVPlayerEngine::setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP);

2)调用函数PVPlayerEngine::Prepare(const OsclAny* aContextData),进入Engine层将PVP_ENGINE_COMMAND_PREPARE类型的命令加入到命令队列中;

其参数就是command

函数PVPlayerEngine::DoPrepare(PVPlayerEngineCommand& aCmd)

执行此函数4次,

A:Engine状态在PVP_ENGINE_STATE_INITIALIZED,开始选择track,从sink Node开始;

1)确认状态是PVP_ENGINE_STATE_INITIALIZED,并设置为PVP_ENGINE_STATE_PREPARING

2)进入函数DoSinkNodeQueryInterfaceMandatory(aCmd.GetCmdId(), aCmd.GetContext())

B:在完成sink Node初始化后,Engine状态在PVP_ENGINE_STATE_TRACK_SELECTION_1_DONE,Engine开始创建Dec Node,并初始化

1)确认Engine状态在PVP_ENGINE_STATE_TRACK_SELECTION_1_DONE,并设置为PVP_ENGINE_STATE_PREPARING;

2)调用函数DoSinkNodeTrackSelection(aCmd.GetCmdId(), aCmd.GetContext());

3)调用函数DoDecNodeQueryCapConfigIF(aCmd.GetCmdId(), aCmd.GetContext());

C:完成2后,Engine处于状态PVP_ENGINE_STATE_TRACK_SELECTION_2_DONE,Engine开始选择track,选择之后重启Sink和Dec Node;

1)确认Engine状态在PVP_ENGINE_STATE_TRACK_SELECTION_2_DONE;

2)DoSourceNodeTrackSelection(aCmd.GetCmdId(), aCmd.GetContext());

3)DoSinkNodeDecNodeReset(aCmd.GetCmdId(), aCmd.GetContext());

D:重启完成后,EPVP_ENGINE_STATE_TRACK_SELECTION_3_DONEngine状态处于PVP_ENGINE_STATE_TRACK_SELECTION_3_DONE,然后删除没有使用的Dec Node;

1)确认Engine状态在PVP_ENGINE_STATE_TRACK_SELECTION_3_DONE;

2)DoSinkDecCleanupSourcePrepare(aCmd.GetCmdId(), aCmd.GetContext());

函数PVPlayerEngine::DoSinkNodeQueryInterfaceMandatory(PVCommandId aCmdId, OsclAny* aCmdContext)

1)根据指针iSourceNodeTrackSelIF,Engine的成员,在添加数据源是构建的指向MP3FFparsernode,调用函数GetMediaPresentationInfo从SourceNode获取当前文件的info,此函数的参数iSourcePresInfoList也是engine的成员量,用于保存文件的基本信息;

函数GetMediaPresentationInfo中,新建类PVMFTrackInfo,然后对其中的量进行配置,最后保存在iSourcePresInfoList(PVMFMediaPresentationInfo*)中;

2)创建track列表,iTrackSelectionList(Engine的成员)

3)设置iDatapathList[i].iSinkNode,保存iDataSink的node指针;

4)新建nodesessioninfo(PVMFNodeSessionInfo)保存PVMediaOutputNode的信息,再将此量送到iDatapathList[i].iSinkNodeSessionId保存;

5)构建两个context,cmdtype分别是PVP_CMD_SinkNodeQueryCapConfigIF,PVP_CMD_SinkNodeQuerySyncCtrlIF;

6)调用函数IssueQueryInterface,uuid分别是PVMI_CAPABILITY_AND_CONFIG_PVUUID,PvmfNodesSyncControlUuid,获取的指针分别保存在iDatapathList[i].iSinkNodePVInterfaceCapConfig和iDatapathList[i].iSinkNodePVInterfaceSyncCtrl中;

函数IssueQueryInterface:

根据node指针调用函数QueryInterface,进入NodeInterfaceImpl中的函数,构建命令加入命令对列,因为PVMediaOutputNode类也继承PVMFNodeInterfaceImpl类;返回指针类型为PvmfNodesSyncControlInterface,是PVMediaOutputNode的父类,这种情况与构建SourceNode相似;

7)函数退出;

函数PVPlayerEngine::HandleSinkNodeQueryInterfaceMandatory(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp)

在查询到相应接口后,会在Engine层调用相应的处理函数

1)此函数将查询到的两个指针分别保存在iSinkNodeCapConfigIF和iSinkNodeSyncCtrlIF(都是iDatapathList[i]的成员)

2)调用函数FindTrackForDatapathUsingMimeString,根据保存在datapath中的trakinfo来选择Track的类型,是audio还是Video还是Txet

3)如果是Audio,根据指针iSinkNodeSyncCtrlIF进入到SetMargins中等等;

4)DoSinkNodeInit,初始化SinkNode;进入Node接口实现类,构建命令加入命令队列;

函数PVPlayerEngine::DoSinkNodeTrackSelection(PVCommandId aCmdId, OsclAny* aCmdContext)

函数就是检查sink node是否支持格式类型和格式Specific info,看是否需要构建dec node,选择好的track保存在iTrackSelectionList中,是Engine的成员;

1)新建类型PvmiKvp的参数kvpFormatType,kvpFSI;其中kvpFormatType.key保存PVMF_FORMAT_TYPE_VALUE_KEY,kvpFSI.key保存PVMF_FORMAT_SPECIFIC_INFO_KEY;

函数PVPlayerEngine::DoDecNodeQueryCapConfigIF(PVCommandId aCmdId, OsclAny* aCmdContext)

1)首先获取当前track的info,trackinfo就是源文件的一些基本信息,获取文件格式为audio/MPEG;

2)根据指针iSinkNodeCapConfigIF,获取SinkNode支持的格式(可能有多种);

3)调用函数iPlayerNodeRegistry.QueryRegistry,根据格式对查询相应的UUId,调用函数iPlayerNodeRegistry.CreateNode,构建DecNode,指向类PVMFOMXAudioDecNode,并将指针保存在iTrackSelectionList[i].iTsDecNode中;

格式对audio/MPEG,audio/L16;

4)对新购建的decNode查询接口,命令类型是PVP_CMD_DecNodeQueryCapConfigIF,UUID是PVMI_CAPABILITY_AND_CONFIG_PVUUID;返回的接口指针保存在iTrackSelectionList[i].iTsDecNodePVInterfaceCapConfig中,不像是前面的surceNode sinkNode那样在Engine中有专门的成员量在保存指针了;而从前面的分析来看,这个指针用于对Node的配置

5)在DecNode创建好之后,将iDatapathList中有关sinknode相关的info保存到iTrackSelectionList对应成员中;

6)依次查看下面的track,并与当前的track进行格式比较,有相同的就会直接对其iTrackSelectionList进行设置,也就是使用相同的decNode和SinkNode

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐