Android多媒体开发(3)——Video Rendering

AwesomePlayer::onVideoEvent()除了通过OMXCodec::read()取得解码后的数据外,还必须将这些数据(mVideoBuffer)传给video renderer, 以便渲染到屏幕上去。

1.要将mVideoBuffer中的数据画出来之前,必须先创建mVideoRenderer的实例。

void AwesomePlayer::onVideoEvent()
{  
    ...  
    if (mVideoRenderer == NULL)  
    {    
        initRenderer_l();  
    }  
    ...
}

void AwesomePlayer::initRenderer_l()
{  
    if (!strncmp("OMX.", component, 4))  
    {    
        mVideoRenderer = new AwesomeRemoteRenderer(
                mClient.interface()->createRenderer(
                                     mISurface, 
                                     component, 
                                     ...));  .......... (2)  
    }  
    else  
    {    
        mVideoRenderer = new AwesomeLocalRenderer(
                                     ...,
                                     component, 
                                     mISurface); ............................ (3)  
    }
}

2.如果video decoder是OMX component,则创建一个AwesomeRemoteRenderer作为mVideoRenderer。

从上面的程序来看,AwesomeRemoteRenderer的本质是由OMX::createRenderer所创建的。createRenderer会先创建一个hardware renderer -- SharedVideoRenderer (libstagefrighthw.so);若失败,则创建software renderer -- SoftwareRenderer (surface)。

sp OMX::createRenderer(...)
{  
    VideoRenderer *impl = NULL;  
    libHandle = dlopen("libstagefrighthw.so", RTLD_NOW);  
    if (libHandle)  
    {    
        CreateRendererFunc func = dlsym(libHandle, ...);    
        impl = (*func)(...); <----------------- Hardware Renderer  
    }  
    if (!impl)  
    {    
        impl = new SoftwareRenderer(...); <---- Software Renderer  
    }
}

3.如果video decoder是software component,则创建一个AwesomeLocalRenderer作为mVideoRenderer。

AwesomeLocalRenderer的constructor会调用本身的init函数,其所做的事和OMX::createRenderer一模一样。

void AwesomeLocalRenderer::init(...)
{  
    mLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW);  
    if (mLibHandle)  
    {    
        CreateRendererFunc func = dlsym(...);    
        mTarget = (*func)(...); <---------------- Hardware Renderer  
    }  
    if (mTarget == NULL)  
    {    
        mTarget = new SoftwareRenderer(...); <--- Software Renderer  
    }
}
Android多媒体开发(3)——Video Rendering_第1张图片
AwesomeRenderer

4.mVideoRenderer一旦创建就可以开始将解码后的数据传给它。

void AwesomePlayer::onVideoEvent()
{  
    if (!mVideoBuffer)  
    {    
        mVideoSource->read(&mVideoBuffer, ...);  
    }  
    [Check Timestamp]  
    if (mVideoRenderer == NULL)  
    {    
        initRenderer_l();  
    }  
    mVideoRenderer->render(mVideoBuffer); <----- Render Data
}
Android多媒体开发(3)——Video Rendering_第2张图片

Android多媒体开发(3)——Video Rendering_第3张图片
AwesomePlayer流程图

你可能感兴趣的:(Android多媒体开发(3)——Video Rendering)