大致理一下 显示选择合适的播放器 最后选择了OXMPlayer
=================================================================base\core\java\android\widget\videoview
openvideo(){
//这里发送广播暂停music;
Intent i = new Intent("com.android.music.musicservicecommand");
i.putExtra("command", "pause");
mContext.sendBroadcast(i);
mMediaPlayer = new Mediaplayer();
}
base\media\java\android\media\mediaplayer.java
base\media\jni\android_media_mediaplayer.cpp
av\media\libmedia\mediaplayer.cpp
checkPermission("android.permission.INTERNET")
av\media\libmediaplayerservice\MediaPlayerFactory.h
略多= =!
enum player_type {
PV_PLAYER = 1,
SONIVOX_PLAYER = 2,
STAGEFRIGHT_PLAYER = 3,
NU_PLAYER = 4,
// Test players are available only in the 'test' and 'eng' builds.
// The shared library with the test player is passed passed as an
// argument to the 'test:' url in the setDataSource call.
TEST_PLAYER = 5,
OMX_PLAYER = 6,
};
virtual sp<MediaPlayerBase> createPlayer() {
ALOGV(" create OMXPlayer");
==================================================================================
关于omxplayer的创建过程
============================================================
OMXPLayer
OMXPlayer --> OMX_GraphManagerCreate()
OMXCoreMgr --> OMX_ERRORTYPE OMXCoreMgr::OMX_Init()
GMPlayer --> GMPlayer::init()
-->SysEventThreadFunc() 线程
-->SysEventHandler中处理Event
-->Event类型 OMX_Core.h
typedef enum OMX_EVENTTYPE 略多= =!
{
OMX_EventCmdComplete, /**< component has sucessfully completed a command */
OMX_EventError, /**< component has detected an error condition */
OMX_EventMark, /**< component has detected a buffer mark */
OMX_EventPortSettingsChanged, /**< component is reported a port settings change */
OMX_EventBufferFlag, /**< component has detected an EOS */
OMX_EventResourcesAcquired, /**< component has been granted resources and is
automatically starting the state change from
OMX_StateWaitForResources to OMX_StateIdle. */
OMX_EventComponentResumed, /**< Component resumed due to reacquisition of resources */
OMX_EventDynamicResourcesAvailable, /**< Component has acquired previously unavailable dynamic resources */
OMX_EventPortFormatDetected, /**< Component has detected a supported format. */
OMX_EventKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */
OMX_EventVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
OMX_EventMax = 0x7FFFFFFF
} OMX_EVENTTYPE;
OMX_GraphManager --> GMPlayerWrapper 建立方法映射 返回gm
omxplayer创建线程 fsl_osal_thread_create(&pPCmdThread, NULL, ProcessAsyncCmdThreadFunc, (fsl_osal_ptr)this);
ProcessAsyncCmd
================================================================================================
OMXPlayer转载GMPlayer
OMX_ERRORTYPE GMPlayer::Load(OMX_STRING contentURI)
ret = LoadParser(role);
-- ret = LoadComponent(role, &Parser);
-->componentBase::ConstructComponent
virtual OMX_ERRORTYPE Parser::SetParameter(OMX_INDEXTYPE, OMX_PTR)
在此传入strcpy((char *)pMediaName, (const char *)&(pContentURI->contentURI));
if(E_FSL_OSAL_SUCCESS != fsl_osal_thread_create(&pThreadId, NULL, DoThread, this)) {
这个线程将处理OMX_StateExecuting 发送的CMD
ret = OMX_SetParameter(Parser->hComponent, OMX_IndexParamContentURI, Content);
ret = GetContentPipe(&hPipe, (OMX_STRING)&Content->contentURI);
ret = OMX_GetParameter(Parser->hComponent, OMX_IndexParamAudioPortFormat, &sAudioPortFmt);
ret = OMX_SetParameter(Parser->hComponent, OMX_IndexParamAudioPortFormat, &sAudioPortFmt);
ret = OMX_GetParameter(Parser->hComponent, OMX_IndexParamVideoPortFormat, &sVideoPortFmt);
ret = OMX_SetParameter(Parser->hComponent, OMX_IndexParamVideoPortFormat, &sVideoPortFmt);
ret = Parser->StateTransUpWard(OMX_StateIdle);
ret = Parser->StateTransUpWard(OMX_StateExecuting);
K_______________Loading component parser.rtsp ...
OMX_ERRORTYPE ComponentBase::ConstructComponent(OMX_HANDLETYPE pHandle)
C_LOG("%s__%x",__func__,this);41eb9710 添加指针LOG
在dothread中打印对应指针
void *DoThread(void *arg)
{
C_LOG("%s",__func__);
ComponentBase *base = (ComponentBase*)arg;
OMX_ERRORTYPE ret1, ret2;
while(1) {
base->Down();
C_LOG("WHILE DOTHREAD_%x",arg);
--> DoThread -->
OMX_ERRORTYPE State::ProcessCmd()
IdleState::ToExecuting() -->
virtual OMX_ERRORTYPE StreamingParser::InstanceInit()
-->启动组件奔跑吧兄弟
base->CurState->ProcessBuffer();
处理数据 <--
- ->寻找omx_component
--> 根据role 找寻GMcomponent
LoadParser(role);
SetupPipeline();
ret = LoadComponent(role, &AudioDecoder);
K_______________Loading component audio_decoder.aac ... 41ec78d8
K_______________Loading component audio_render.android ... 41686220
K_______________Loading component video_decoder.avc ... 40eee008
K_______________Loading component video_render.surface ... 40064770
LoadClock();
K_______________Loading component clocksrc ... 40132bc8
AttachClock(PARSER_CLOCK_PORT, Parser, 2);
StartPipeline();
传说集齐了以下八颗龙珠就可以召唤神龙
GMComponent *Parser;
GMComponent *AudioDecoder;
GMComponent *VideoDecoder;
GMComponent *AudioPostProcess;
GMComponent *VideoPostProcess;
GMComponent *AudioRender;
GMComponent *VideoRender;
GMComponent *Clock;
==================================================================================
OMX_ERRORTYPE IdleState::ToExecuting()
{
C_LOG("%s",__func__);
OMX_ERRORTYPE ret = OMX_ErrorNone;
ret = base->InstanceInit();
if(ret != OMX_ErrorNone)
base->InstanceDeInit();
return ret;
}
base -->ComponentBase
在StreamingParserInit()中 已经将base指定为StreamingParser
->read_head
->rtsp_read_header
B ff_rtsp_connect
ff_rtsp_send_cmd
ff_rtsp_setup_input_streams
===============================================================================
=============================================================
source 线程入口 fsl_osal_thread_create
加载模式
GMPlayer::loadcomponet
--> GMComponent->load(role)
-->OMX_GetHandle(&hComponent, (OMX_STRING)compNames[i], (OMX_PTR)this, &GMCallBacks)
-->pComponentInfoPtr = SearchComponent(cComponentName);
-->ConstructComponent(pHandleInfo, hHandle, pComponentInfoPtr);
-->pHandleInfo->hlib = LibMgr->load((fsl_osal_char *)pComponentInfoPtr->LibName);
-->ComponentEntry = (OMX_ERRORTYPE (*)(void*))LibMgr->getSymbol(pHandleInfo->hlib, \(fsl_osal_char *)pComponentInfoPtr->EntryFunction);
-->ComponentEntry(hHandle); =: OMX_ERRORTYPE StreamingParserInit(OMX_HANDLETYPE)
最终调用到组件的Init方法
启用线程
==========================================================================================================
DoThread -->
OMX_ERRORTYPE State::ProcessCmd()
IdleState::ToExecuting() -->
virtual OMX_ERRORTYPE StreamingParser::InstanceInit()
-->启动组件奔跑吧兄弟
base->CurState->ProcessBuffer();
ret = base->ProcessClkBuffer();
if(ret == OMX_ErrorNoMore) {
ret = base->ProcessDataBuffer();
}
处理数据
=======================================================================
ret = Parser->StateTransUpWard(OMX_StateIdle);
ret = Parser->StateTransUpWard(OMX_StateExecuting);
=====================================================================================\
结构
StreamingParser 的类中有这几个重要成员
List<AVPacket> AssemblePktList
AVFormatContext *ic
AVFormatParameters params
RTSPStream
{
PayloadContext
{
AVIOContext
{
PayDynamicProtocolHandler
}
AVStream
{
AVCodecContext
AVCodec
}
=============================================
算法
Parser::ProcessDataBuffer()
-->
GetandSendOneVideoBuf
GetandSendOneAudioBuf
-->
StreamIngParser::getnextSample中启动线程
--> 以为是音视频线程分开 但是调试发现只有一个线程
DoReadPacket
OMX_ERRORTYPE StreamingParser::ReadPacketFromStream()
数据来源入口
-->err = ic->iformat->read_packet(ic, pkt);
-->AVPacket *StreamingParser::AssemblePacket(AVPacket *pkt)
list-->add(pkt)