android (10)
来源:互联网 发布:随身携带淘宝去异界 编辑:程序博客网 时间:2024/05/16 19:26
android (10)
OMX_ERRORTYPE OMX::OnEvent(
node_id node,
OMX_IN OMX_EVENTTYPE eEvent,
OMX_IN OMX_U32 nData1,
OMX_IN OMX_U32 nData2,
OMX_IN OMX_PTR pEventData) {
LOGV("OnEvent(%d, %ld, %ld)", eEvent, nData1, nData2);
omx_message msg;
msg.type = omx_message::EVENT;
msg.node = node;
msg.u.event_data.event = eEvent;
msg.u.event_data.data1 = nData1;
msg.u.event_data.data2 = nData2;
findDispatcher(node)->post(msg);
return OMX_ErrorNone;
}
事件处理还是抛到对应的线程来处理
OMX的节点实例有下面的成员
static OMX_CALLBACKTYPE kCallbacks;
OMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
&OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
};
OMX_ERRORTYPE OMXNodeInstance::OnEvent(
OMX_IN OMX_HANDLETYPE hComponent,
OMX_IN OMX_PTR pAppData,
OMX_IN OMX_EVENTTYPE eEvent,
OMX_IN OMX_U32 nData1,
OMX_IN OMX_U32 nData2,
OMX_IN OMX_PTR pEventData) {
OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData);
if (instance->mDying) {
return OMX_ErrorNone;
}
return instance->owner()->OnEvent(
instance->nodeID(), eEvent, nData1, nData2, pEventData);
}
最终还是调用owner的方法
再看一下分配节点的方法
OMX_COMPONENTTYPE *handle;
OMX_ERRORTYPE err = mMaster->makeComponentInstance(
name, &OMXNodeInstance::kCallbacks,
instance, &handle);
将节点实例的时间处理设置进组件了
最终还是调用的OMX的OnEvent方法
OMX_ERRORTYPE OMX::OnEvent(
node_id node,
OMX_IN OMX_EVENTTYPE eEvent,
OMX_IN OMX_U32 nData1,
OMX_IN OMX_U32 nData2,
OMX_IN OMX_PTR pEventData) {
LOGV("OnEvent(%d, %ld, %ld)", eEvent, nData1, nData2);
omx_message msg;
msg.type = omx_message::EVENT;
msg.node = node;
msg.u.event_data.event = eEvent;
msg.u.event_data.data1 = nData1;
msg.u.event_data.data2 = nData2;
findDispatcher(node)->post(msg);
return OMX_ErrorNone;
}
抛到对应的消息处理线程中处理了
是谁处理的?
void OMXNodeInstance::onMessage(const omx_message &msg) {
if (msg.type == omx_message::FILL_BUFFER_DONE) {
OMX_BUFFERHEADERTYPE *buffer =
static_cast<OMX_BUFFERHEADERTYPE *>(
msg.u.extended_buffer_data.buffer);
BufferMeta *buffer_meta =
static_cast<BufferMeta *>(buffer->pAppPrivate);
buffer_meta->CopyFromOMX(buffer);
}
mObserver->onMessage(msg);
}
mObserver。。。。
节点实例的mObserver是从哪来的?
传进来的
OMXClient
申请connect OMX
服务端如果没有OMX就创建一个
OMXMaster
添加插件
void OMXMaster::addVendorPlugin() {
mVendorLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW);
if (mVendorLibHandle == NULL) {
return;
}
typedef OMXPluginBase *(*CreateOMXPluginFunc)();
CreateOMXPluginFunc createOMXPlugin =
(CreateOMXPluginFunc)dlsym(
mVendorLibHandle, "_ZN7android15createOMXPluginEv");
if (createOMXPlugin) {
addPlugin((*createOMXPlugin)());
}
}
加载共享库 libstagefrighthw.so,获取_ZN7android15createOMXPluginEv 方法
注意这个函数没有参数
void OMXMaster::addPlugin(OMXPluginBase *plugin) {
Mutex::Autolock autoLock(mLock);
mPlugins.push_back(plugin);
OMX_U32 index = 0;
char name[128];
OMX_ERRORTYPE err;
while ((err = plugin->enumerateComponents(
name, sizeof(name), index++)) == OMX_ErrorNone) {
String8 name8(name);
if (mPluginByComponentName.indexOfKey(name8) >= 0) {
LOGE("A component of name '%s' already exists, ignoring this one.",
name8.string());
continue;
}
mPluginByComponentName.add(name8, plugin);
}
CHECK_EQ(err, OMX_ErrorNoMore);
}
将插件中所有的组件都记录下来
还需要注意组件实例化
- android (10)
- android:Unable to resolve target 'android-10'
- Android开发10:SharedPreferences
- Android培训班(10)
- 10 Android NDK Tips
- Android---10大开源项目
- android学习笔记10
- 10大开源Android项目
- android控件10 SeekBar
- Android学习10--菜单
- Android学习笔记10
- Android 10经典应用
- android+mtk6573+unbuntu11.10
- Android自测题10
- 10大开源Android项目
- 10个Android项目
- android api分析10
- Android-10-拨号器
- UART的RTS和CTS
- MMX-SSE
- 打开Activity方法
- BufferedReader 、 InputStreamReader 、 InputStream的一般讲解(一)
- All About JAVA 关于数据库ORACLE驱动包中OracleConnectionPoolDataSource连接池的使用方法
- android (10)
- MPlayer视频输出框架分析
- OpenCV学习 网址和网站
- Android 应用程序中使用 Internet 数据(XML、JSON 和 protocol buffers)
- 从Android浏览器(并不是Appliaction里面的webkit)打开应用程序/应用商店
- oracle自动备份方法
- OpenCV结构
- 如果你使用BitBle复制位图,结果显示出来是黑色的...
- 用SchemaSpy制作数据库结构文档