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

https://blog.51cto.com/u_14344871/3369907 51cto音频技术博客

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  
    }
}

在这里插入图片描述
4.mVideoRenderer一旦创建就可以开始将解码后的数据传给它。

void AwesomePlayer::onVideoEvent()
{  
    if (!mVideoBuffer)  
    {    
        mVideoSource->read(&mVideoBuffer, ...);  
    }  
    [Check Timestamp]  
    if (mVideoRenderer == NULL)  
    {    
        initRenderer_l();  
    }  
    mVideoRenderer->render(mVideoBuffer); <----- Render Data
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值