ug05x10android,android 视频软硬编解码实现方案_androi libomp.so,android "libomp.so-Android代码类资源...

本文详细解析了基于Android 4.0 Stagefright框架下的OpenMAX核心原理,并介绍了在全志A10平台上H264视频硬编码的具体实现步骤,包括OMX组件状态转换、动态加载硬件库和组件创建过程。涉及动态链接、编码器选择和OMXMaster组件的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值