欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-22 23:43:34
...

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<IOMXRenderer> 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
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
Android多媒体开发(3)——Video Rendering