https://github.com/zytc2009/BigTeam_learning
分类: Java
2010-11-19 16:33:16
Codec 集成和video overlay是现在FSL对android
多媒体修改的所有东西,codec library以.so的形式放在prebuilt目录下,没有源文件 。而video
overlay的实现主要是使用了FSL的ipu底层库,将视频数据 直接发送到硬件,由硬件进行merge。
A、Codec 集成
1、codec 集成方法
首先声明一下俺说的codec集成是指将codec集成到opencore
框架中,网上看有人直接放个库然后通过jni调用,这种的方式有点扯蛋,得自己实现控制,同步,输出等一堆东西,完全是杀鸡取卵,我们就不讨论了。要把一
个裸的codec放在opencore框架内有三种方式:
a、实现一个openmax component 注册在android已存在的omx core上,或者提供自己的omx core
b、实现一个封装了codec的PVMF 标准的 mio(media input/output)
c、 实现一个封装codec的PVMF的Node
三种方式都涉及到opencore一堆BT的术语,首先我们得来消化下这几个术语,不然很难有个直观的了解。因为opencore实在庞大得超出我的能力
之外,所以俺只是从整体结构上看了下骨架,我是这么理解的:opencore实际包含两部分:一部分就是command管道,一个就是数据管
道;command就是我们的player/author engine, 而数据的流动就是在pvmf
中进行。PVMF下面挂载的的基本组件就是Node,就是实现一个具体功能的单元,比如说file parse, codec,
sink等等。前面提到的MIO实际上也是一个特殊的Node,它的功能就是media input/output 。
engline接受上层的command,控制PVMF下的Node进行工作,而Pvplayer/author是基于engline实现的一个提供给android使用的SDK,这就是Opencore的工作原理 了。
c、omxmastercore根据应用 程序要求的role(比如mp3)及其要求的配置去注册的component中寻找满足要求的component,一旦找到就选定进行解码
因此如果你想使用自己的codec来进行解码,必须使你的配置文件名排在前面,或者如果不需要其他的omx
core的话干脆删除它的配置文件。我曾经做过一个实验,去掉fsl的codec ,
51播视频就会直接卡死,如果去掉android自带的codec视频和音频都无法播放,因为fsl现在只提供了视频的硬解码,当应用程序找不到音频的解
码的时候就会直接报错。从侧面来说fsl的 video
codec还是很牛B的,它调用了/external/fsl_imx_lib/vpu中的接口。
因此总的来说实现codec的移植应该是不难的,将来还可以使用偷懒的方法,也就是说只实现相应的component,把它注册到android已有的
omx core中,这个注册是在/external/opencore/codecs_v2/omx/omx_common/src
/pv_omxregistry.cpp中实现的。
除了omx封装外其他两种方式我没仔细看过,Node方式PV还没提供文档,而mio集成方式在doc里面有它的开发文档。
B、Video Overlay
Android原来是video
playback的输出是使用的Isurface接口,也就是说它是用surfaceflinger来实现window的合并的,SW
merge必然导致播放的效率低下,而且资源消耗很高。FSL在这里实现了硬件overlay的方式来播放视频,就是使用ipu进行硬件的merge,说
穿了就是把vpu解码后的数据直接送到ipu的overlay buffer。
这里涉及到两个底层的lib,一个就是libipu.so,还一个是libvpu.so,vpu负责解码,而ipu负责显示。在这里要改变的主要是两个地方,首先要获得vpu解码后的数据,这里主要涉及到下面目录中的文件:
/external/opencore/nodes/pvomxbasedecnode/src/pvmf_omx_basedec_node.h
/external/opencore/nodes/pvomxbasedecnode/include/pvmf_omx_basedec_node.cpp
/external/opencore/nodes/pvomxvideodecnode/src/pvmf_omx_
然后就是将数据送到overlay buffer,这部分修改的内容实际上就是实现了ipu 的一个sequence,这个sequence的内容可以参照:
/external/fsl_imx_lib/ipu/mxc_ipu_hl_lib.h
具体的修改内容在下面几个文件:
/android/android_surface_output.cpp
/android/android_surface_outpur.h