videoview 框架笔记

来源:互联网 发布:砍柴网源码下载 编辑:程序博客网 时间:2024/05/30 05:18
videoview框架笔记


大致理一下   显示选择合适的播放器 最后选择了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


av\media\libmediaplayerservice  -->status_t MediaPlayerService::Client::setDataSource 
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)



0 0