opencore的pvomx与bellagio_omx同样遵循openmax IL层标准,不过PV中是用c++写的,而bellagio使用c实现的,组件的API都是omx IL标准,但是组件的加载方式是不一样的,opencore中是根据配置直接调用针对各种格式的注册函数,不需要依次打开针对各个格式的so库,而在bellagio中却是要依次打开每个so库调用一个接口函数来完成注册。
1 注册方式的更改
@@在bellagio中编译后会生成一个可执行程序(omxregister-bellagio),要单独执行这个可执行程序,会在root目录下生成一个文件.omxregister,文件中包含了已安装的所有组件以及对应的so库:
/usr/local/lib/bellagio/libomxaudio_effects.so
==> OMX.st.volume.component ==> OMX.st.volume.component: ==> 2 1,65536 1,32768
==> OMX.st.audio.mixer ==> OMX.st.audio.mixer: ==> 1 50,60000
/usr/local/lib/bellagio/libomxvideosched.so
==> OMX.st.video.scheduler ==> OMX.st.video.scheduler: ==> 2 1,456192 1,304128
/usr/local/lib/bellagio/libomxclocksrc.so
==> OMX.st.clocksrc ==> OMX.st.clocksrc:
然后再去读取这个文件,一行行获取库的名字,打开库,查询库的入口函数omx_component_library_Setup,完成组件的注册。
@@而在opencore中却是在函数OMX_Init中会根据配置调用相应的注册函数完成注册,不会去打开组件对应的库;
@@注册流程比较如下图:
@@函数BOSA_ST_InitComponentLoader(BOSA_COMPONENTLOADER *loader)
将原先读取文件.omxregistry这部分去掉,而是直接依次对libname赋值,
for(i = 0;i {
if(i == 0)
{
*libname = "/路径/libomxvideosched.so";
}
else if(i == 1)
{
*libname = "/路径/libomxclocksrc.so";
}
else if(i == 2)
{
*libname = "/路径/libomxaudio_effects.so";
}
else if(i == 3)
{
*libname = "/路径/libomxmad.so";
}
…………………
}
2 so库的封装
opencore中有个mastercore,用于管理对个core的存在,因为openmax中是通过core来管理组件的;android中是将其编译为so库,而且要为每个库添加一个封装,并将mastercore的API与core中的对应,具体代码在omx_sharedlibrary中,
3 参照opencore中的格局,将bellagio分为以下部分:
bellagio_base,bellagio_common,bellagio_sharedlibrary,组件,参照写android.mk