基于android_4.0_Stagefright中的OpenMax原理解析,以及h264视频硬编码实现方案在全志A10上的实现代码流程.
smOpen M AX component statas
oX Staleloaded
Final
OMX GetHar de
OMX FreeHanded)
oMX Statewaitfuires
∠9agy
/amx Slaewaiforresauices
OMX SthteLoaded OR
oVX_RehaNdle()
OMX_Steidle
available>
or
OMX Stateldle
OMX State nya id
oMX Statelnyalid
OMX Stat=Executing
OMX S:ate dle OR
MXE
OMX Slate Executing
OMX_S:atpAse
OMX State ldle OR
OMX StatePause
OMX StatE/Executing
oMX State pause
Figure 3-2. Open AX Component State Transitions
oMX的创建
1MX创建示意图
Obtain caom of th =ompsGnt roles
Figure 1: OMX Core Initialization
2.实际创建过程
z: \mydroid-cleaning\ frameworks\base media \ libmediaplayerservice\ StagefrightRecorder. cpp
在函数 status t stagefrightRecorder: setupVideoEncoder中
OMXClient client
//通过 MediaPlayer Service binder获取 omX binder
CHECK EQ(client connect(, OK
\ frameworks base\medialibstagefrightOMXClient cpp
tatus t OMXClient: connect o
sp sm= default ServiceManager()
binder=sm->getService(String16("media player))
sp service= intertace cast< I Medial layerService>(binder)
CHECK(service. getO
L L)
mOMX servicc->gctOMX O
CLECK(mOMX getO! =NULL
return ok
\frameworks base\media libmediaplayerservice\MediaPlayer Service. cpp
Sp MediaPlayerService: ge O
if (mOMX getO== NULL)
noMX= new OMX
return mOm
OMX:: OMXO
mMaster(new OMXMaster)
In\ Counter(O)
OMXMaster:: OMXMastero
mVendorLibHandle ( null)
addVendorPluginO
addPlugin(new SoftOMXPlugin)
a void OMXMaster : add Plugin (const char *libname)
1.从 libstagefrighthw.o中动态装载 createOMXPlugin,这里也就是找到neW
TIOMXPlugin的函数
OMXP| agin Base* Ti_ plugin=(* createOMXPlugin);/创建 TIPlugln对象
3.再次调用 addPlugIn2 add Plugin(° createomXP|ugin))
MXMaster
OMXMasterD
addPlugin 'libname
addPlugin("plugin)
oad libstagefrighthwso
TIOMXPlugin
omx proxy component
omx core
Ducati binary
OMX BuildComponent Table,根据 tComponentName初始化全局变量 Conptab
typedef struct ComponentTable
OMX STRING name;// Compone t名称,无准
OMXU16 nRoles;//( opponet屮 Roles的数量,标准
//Role名称指针数值
OMX STRING pRoleArray [MAX ROLES
J Component Table
//对 VenderPlugIn和 softPlugIn都调用该函数
void OMXMastor: addPlugin(OMXPluginBasc *plugin)
pLugins. push back(plugin)
char name[28]
while ((err- plugin->enumerateComponents (name, sizeof (name), index++))-OMX ErrorNone
String name(name)
mPluginBy Name add (name8, plugin):
OMXCadec
OMX
OMXNodeInstance
OMXMaster
SoftoMXPir
PLUgin
Other OMXPlugir
SimplesoftoMX
Other OMX Components
SoftAyC
Component的创建
1.创建流程
sd 3NX component initial zation
r「sme副
口!xC3re
Orx Com pcn ent
出Hd|el
口 I GetParaeter (hCoap,0 ndep“ ndiolnit,0■PI〕壘 Contert-) sPortpara[0]
EEl
porb
put port index <= oMx GetPalametemoMx ndexPala TPortDetin ition)
This call may ba
b ased on port dired
aut port in
tP arametenoM>
all may bs
rep d multiEle
times
1u中utP
2.具体实现
sp OMXCodec: Create(
const sp&omx
const sp&meta, bool create Encoder,
const sp &source
const char *matchComponentName
uint32 t flags
const sp &native Window)
const char *mime
∥/获取之前设定了编码算法
//enc meta->setCString(kEy MIMEType, MEDiA MIMETYPE VIDEO AVC);
bool success meta->find CString(kEy MIMEType, &mime);
CHECk(success)
Vector matching Codecs
/1.查找有哪些 Component支持MEDA_ MIMETYPE VIDEO_AVC
冰米米米米米米米米米米米*米米米米米*米求米末米米k米米求*米案米米米米米米求米米米米米米米米米*求米米*米米求米米
査找结果如下,fag可以指定选用软编码或者硬编码
IMEDIA MIMETYPE VIDEO AVC, " OMX. Tl. DUCATI1 VIDEO H264E
IMEDIA MIMETYPE VIDEO AVC, OMX gcom7x30 video encoder. avc"]
I MEDIA MIMETYPE VIDEO_ AVC," OMX qcom video encoder. avc"b
I MEDIA MIMETYPE VIDEO_ AVC, "OMX. TL Video encoder"b,
f MEDIA MIMETYPE VIDEO AVC, "OMX. Nvidia h264 encoder]
I MEDIA MIMETYPE VIDEO AVC, OMX. SEC. AVC Encoder"),
MEDIA MIMETYPE VIDEO AVO," AVCEncoder"}软编码
∥/ OMx. google前缀,没有前缀的也是为soft
∥/OMX前缀的为硬编码
半半半零**米求冰半米半零*半半半求半半半半零半半半半零半零半半半*半
find Matching Codecs(mime, create Encoder, match ComponentName, flags,
&matching Codecs);
(matching Codecs. isEmpty()
return null
∥/2.创建 OMXCodecobserver
sp observer =new OMXCodecobserver;
lOMX node id node=0
for (size ti=0; i< matching Codecs. size ++i)
const char *componentName Base-matching Codecs[i]. string;
const char *componentName
componentNameBase
AString tmp;
if (flags kUseSecureInputBuffers)
tmp componentName base
tmp append( secure;
componentName=tmp c str(
if (create Encoder)
/3.创建 software encoder,该部分 encoder为静态库,非oMX接口,实现 MediaSource
接口即可
sp software Codec
Instantiate Software Encoder Name, source, meta);
..:.:.:::
/14创建依据 componentWare的值,依次创建Node,第一个创建成功的就返回
status t err =omx->allocateNode(componentName, observer, &node
status t OMX: allocateNode const char*name, const sp &observer, node id
node
Mutex: Autolock autoLock( mLock)
*node =0
71. new OMXNodelnstance
OMXNodelnstance *instance new OMXNodelnstance(this, observer)
OMX COMPONENTTYPE *handle
OMX ERRORTYPE err=m Master->make componentlnstance name
&OMXNodelnstance: k Callbacks, instance, &handle
*node make NodelD(instance)
mDispatchers. add( node, new Callback Dispatcher(instance))
nstance->setHandle node, handle
mLive Nodes add(observer->asBinder(, instance);
observer->as Binder(-> ToDeath(this)
return oK.
mMaster->make Componentlnstance
TIOMXPlugin. make Componentlnstance
I SoftOMXPlugin: make ComponentInstance
TIOMX GetHandleo
I void *libHandle dlopen(libName. c stro,)
OMX GetHandleo
===========
============-====
pCom= dlsym(pModules[], "OMX ComponentInit")1(createSoftOMXComponent)(name)
Proxy Common
RPC Stub
RPC Skel
DOMX
A9
OMX
slink
Ducati
Callbacks
RoC Skel
PC Stub
OMX Core
OMX Components
out/target/product/panda board/obj/lib/
libstagefrighthw.so
libstagefright. so
Otherlib.so
Soft decoder libraries
libstagefright soft h264decso
libstagefright soft mp3decso
Hardware decoder
libraries
libstagefright
Other libraries
ight soft mpeg4decs
Dtherdec.s
yout/target/product/pandaboard obj/lib/
libstagefright.so
libstagefrighthw.so
therlib. so
Hardware decoder libraries
libOMX, TI. DUCATI1, VIDEO, DECODER.so
Soft decod
arles
liboMX, TI. DUCATI1 VIDEO. MPEG4E So
Other libraries
bOMXTL DUCATI1, VIDEO. H264E So