&node)。最后,把IOMX封装进一个OMXCodec:
sp<OMXCodec> codec = new OMXCodec(
omx, node, quirks,
createEncoder, mime, componentName,
source);
这样就得到了OMXCodec。
AwesomePlayer中得到这个OMXCodec后,首先调用mVideoSource->start()进行初始化。 OMXCodec初始化主要是做两件事:
向OpenMAX发送开始命令。mOMX->sendCommand(mNode, OMX_CommandStateSet, OMX_StateIdle)
调用allocateBuffers()分配两个缓冲区,存放在Vector<BufferInfo> mPortBuffers[2]中,分别用于输入和输出。
AwesomePlayer开始播放后,通过mVideoSource->read(&mVideoBuffer,
&options)读取数据。mVideoSource->read(&mVideoBuffer,
&options)具体是调用OMXCodec.read来读取数据。而OMXCodec.read主要分两步来实现数据的读取:
通过调用drainInputBuffers()对mPortBuffers[kPortIndexInput]进行填充,这一步完成 parse。由OpenMAX从数据源把demux后的数据读取到输入缓冲区,作为OpenMAX的输入。
通过fillOutputBuffers()对mPortBuffers[kPortIndexOutput]进行填充,这一步完成 decode。由OpenMAX对输入缓冲区中的数据进行解码,然后把解码后可以显示的视频数据输出到输出缓冲区。
AwesomePlayer通过mVideoRenderer->render(mVideoBuffer)对经过parse和decode
处理的数据进行渲染。一个mVideoRenderer其实就是一个包装了IOMXRenderer的AwesomeRemoteRenderer:
mVideoRenderer = new AwesomeRemoteRenderer(
mClient.intece()->createRenderer(
mISuce, component,
(OMX_COLOR_FORMATTYPE)format,
decodedWidth, decodedHeight,
mVideoWidth, mVideoHeight,
rotationDegrees));
4、 StageFright处理流程
Audioplayer
为AwesomePlayer的成员,audioplayer通过callback来驱动数据的获取,awesomeplayer则是通过
videoevent来驱动。二者有个共性,就是数据的获取都抽象成mSource->Read()来完成,且read内部把parser和dec
绑在一起。Stagefright
同步部分,audio完全是callback驱动数据流,video部分在onVideoEvent里会获取audio的时间戳,是传统的时间戳
做同步。
4.1》AwesomePlayer的Video主要有以下几个成员:
mVideoSource(解码视频)
mVideoTrack(从多媒体文件中读取视频数据)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-50196-3.html
我们才知道美舰闯哪个礁