android omx,android OMX相关4:编码输入线程和输出线程
提交数据:
GraphicBufferSource: submitBuffer_l
-> mOMXNode->emptyBuffer (这里经过一系列的封装才能到OMXNodeInstance,不用深究)
-> OMXNodeInstance::emptyBuffer // 此处有个bufferType不明确 ???
-> Rockchip_OMX_EmptyThisBuffer : Rockchip_OMX_Baseport.c
-> 存入inputBufferQueue // pRockchipPort = &pRockchipComponent->pRockchipPort[INPUT_PORT_INDEX];
-> 构建一个消息 message = Rockchip_OSAL_Malloc(sizeof(ROCKCHIP_OMX_MESSAGE));
message->messageType = ROCKCHIP_OMX_CommandEmptyBuffer;
message->messageParam = (OMX_U32) i;
message->pCmdData = (OMX_PTR)pBuffer;
-> 把消息加入队列 Rockchip_OSAL_Queue(&pRockchipPort->bufferQ, (void *)message); // 此处的bufferQ对应的InputBufferProcess
->>>> Rockchip_OMX_EmptyThisBuffer end
-> GraphicBufferSource: emptyGraphicBuffer succeeded
-> GraphicBufferSource: buffer submitted
-> OMXNodeInstance: onMessages
输入线程:
Rkvpu_OMX_Venc.c: Rkvpu_OMX_InputProcessThread
循环
Rkvpu_InputBufferGetQueue : Rkvpu_OMX_VencControl.c
->Rockchip_OSAL_SemaphoreWait
->>>Rkvpu_InputBufferGetQueue end
-> Rkvpu_SendInputData
//仅新建编码器时执行 begin
-> Rockchip_OSAL_GetInfoFromMetaData : Rockchip_OSAL_Android.cpp
-> Rockchip_OSAL_GetANBColorFormat
-> Rockchip_get_gralloc_private : gralloc_priv_omx.cpp
得到 priv_hnd.format: 0x1
-> Rockchip_OSAL_Hal2OMXPixelFormat : Rockchip_OSAL_Android.cpp
得到 ColorFormat: 0x10 这个format表示: OMX_COLOR_Format32bitARGB8888
-> Rockchip_OSAL_OMX2HalPixelFormat(omx_format)
通过上一步得到的ColorFormat,得到 halfFormat = HAL_PIXEL_FORMAT_RGBA_8888
-> 设置p_vpu_ctx 中 rc_mode = 1,设置 encType为 VPU_H264ENC_RGB888
p_vpu_ctx->control(p_vpu_ctx, VPU_API_ENC_GETCFG, (void*)&vpug);
vpug.rc_mode = 1;
p_vpu_ctx->control(p_vpu_ctx, VPU_API_ENC_SETCFG, (void*)&vpug);
H264EncPictureType encType = VPU_H264ENC_RGB888;
p_vpu_ctx->control(p_vpu_ctx, VPU_API_ENC_SETFORMAT, (void *)&encType);
//--- 仅新建编码器时执行 end
-> Rkvpu_ProcessStoreMetaData
-> Rockchip_OSAL_GetInfoRkWfdMetaData
-> Rockchip_OSAL_GetInfoFromMetaData
-> Rockchip_OSAL_GetANBColorFormat 得到 omx_format
-> Rockchip_OSAL_OMX2HalPixelFormat(omx_format) 得到 pVideoEnc->bPixel_format
-> 打开GPU节点测试,如果存在则 pVideoEnc->bRgb2yuvFlag = OMX_TRUE;
gpu_fd = open("/dev/pvrsrvkm", O_RDWR, 0); //这里打开节点接着关闭了,是测试是否可用的意思,并设置pVideoEnc->bRgb2yuvFlag,实际用的地方怀疑在libvpu.so中
close(gpu_fd);
-> Rockchip_OSAL_getANBHandle
-> rga_rgb2nv12 : Rockchip_OSAL_RGA_Process.c
-> rga_convert
-> VPUMemClean : vpu_mem.c
ioctl(vpm_vpu.fd, VPU_MEM_CACHE_CLEAN, &p->offset);
->>> rga_rgb2nv12 end 大约耗时 4ms
->>> Rkvpu_ProcessStoreMetaData end
-> p_vpu_ctx->encoder_sendframe(p_vpu_ctx, &aInput);
-> Rkvpu_InputBufferReturn
-> Rkvpu_OMX_InputBufferReturn
-> pRockchipComponent->pCallbacks->EmptyBufferDone(pOMXComponent, pRockchipComponent->callbackData, bufferHeader);
-> OMXNodeInstance::OnEmptyBufferDone
-> 构建message, type 为 omx_message::EMPTY_BUFFER_DONE,发送到消息处理线程去处理
-> bufferSource->onInputBufferEmptied
-> GraphicBufferSource::onInputBufferEmptied
->>>>> OMXNodeInstance::OnEmptyBufferDone end
->>>> Rkvpu_OMX_InputBufferReturn end
输出线程:
output线程:
Rkvpu_OMX_Venc.c: Rkvpu_OMX_OutputProcessThread
-> Rkvpu_OMX_OutputBufferProcess 消息处理循环
-> Rkvpu_OutputBufferGetQueue(ROCKCHIP_OMX_BASECOMPONENT *pRockchipComponent)
-> Rockchip_OSAL_Dequeue(&pRockchipPort->bufferQ) //从bufferQ中取出一个消息
emptyBuffer流程中queue的消息就是在这里被dequeue的
-> 将dequeue出的msg中的数据,存入Rkvpu_OutputBufferGetQueue的参数中返回
->>>> Rkvpu_OutputBufferGetQueue end
-> Rkvpu_Post_OutputStream(OMX_COMPONENTTYPE *pOMXComponent)
-> p_vpu_ctx = pVideoEnc->vpu_ctx
-> p_vpu_ctx->encoder_getstream(p_vpu_ctx, &pOutput)
该函数怀疑存在于 libvpu.so 中
-> Rkvpu_OutputBufferReturn(pOMXComponent, outputUseBuffer); // Rkvpu_OMX_VencControl.c
-> Rockchip_OMX_OutputBufferReturn(pOMXComponent, bufferHeader) //Rockchip_OMX_Baseport.c
-> pRockchipComponent->pCallbacks->FillBufferDone(pOMXComponent, pRockchipComponent->callbackData, bufferHeader);
->OMXNodeInstance::OnFillBufferDone
android omx,android OMX相关4:编码输入线程和输出线程相关推荐
- Android高德地图的使用,狠详细!手把手!(地图+定位+逆地理编码+输入提示+Poi搜索)
最近项目用到高德地图,因此来写一篇文章理一下高德的使用步骤方法,希望对大家有用! ##1.注册+配置 废话不多说,要使用高德地图首先要去高德开放平台注册成为开发者(http://lbs.amap.co ...
- Android 音视频开发相关知识
音视频开发技能 要在Android上进行音视频开发,需要掌握以下技能: Android开发:首先,您需要掌握Android应用程序的基本开发技能,包括Java或Kotlin编程语言,Android S ...
- 【Android 安装包优化】WebP 应用 ( Android 中使用 libwebp.so 库编码 WebP 图片 )
文章目录 一.Android 中使用 libwebp.so 库编码 WebP 图片 二.完整代码示例 三.参考资料 一.Android 中使用 libwebp.so 库编码 WebP 图片 libwe ...
- 模拟滑动android无障碍,Android无障碍简单开发-模拟滑动点击输入等
似乎除了input type=password的edit text 其他所有的UI都可以进行操作.直接开始. 首先配置环境. 创建一个service 清单中代码如下,就算用AS直接创建,也需要配置一些 ...
- android – 多屏幕适配相关
android – 多屏幕适配相关 作者: 曲天日期: 2011/10/27 1.基本概念 屏幕大小(screen size) – 屏幕的实际大小,用屏幕对角线长度来衡量(比如3.4寸,3.8寸).a ...
- Android实战场景 - 限制EditText仅支持输入数字、英文、汉字,禁止输入表情等特殊符号
因项目需求,需要禁止用户输入表情符号,具体如下 ~ EditText相关Blog TextView.EditText属性大全 监听 EditText 文本变化 设置 EditText 光标颜色与下划线 ...
- 英语流利说 Android 音视频处理相关实践与优化
前言: 移动互联网的火爆改变了人们一系列的生活方式,从社交.购物.教育等方方面面渗透进大众的生活,移动端的迅速崛起和高速发展离不开移动端背后的技术演进和迭代,产品更新迭代过程中如何优化它的性能?实际实 ...
- Android P应用适配相关指南
Android P应用适配相关指南 文章目录 Android P应用适配相关指南 一 Android P适配指导 二 刘海屏适配指导 三 Crypto JCA 提供程序已被移除,弃用 Bouncy C ...
- softAP配网:用Android手机为linux无屏设备输入wifi密码
softAP配网,即利用设备的无线芯片,将设备进入到softAP模式,开启一个无线局域网,手机(或其它移动设备)通过连入设备开启的无线局域网后,向设备发送路由器的ssid及password等信息,让设 ...
最新文章
- 深度学习多变量时间序列预测:Bi-LSTM算法构建时间序列多变量模型预测交通流量+代码实战
- 自己动手写一个印钞机 第四章
- python程序设计狄光智_Python程序设计
- emiya-canvas.js 解决ios下拍照倾斜与canvas高清屏下绘图模糊问题 1
- 【POJ】【2975】Nim
- Serverless 工程实践 | 自建 Apache OpenWhisk 平台
- java 学生成绩排序
- java自学 day8
- 【OpenCV 例程200篇】36. 直角坐标与极坐标的转换
- 罗永浩抖音直播带货100天,糊了?
- Laravel框架简介与环境搭建
- 关于SiamRPN代码的一些要点
- 云科技网络验证源码_酸酸云科技-网络验证界面版注册机注入工具 V3.2
- linux 进程带宽限制,Linux限制网络带宽的占用
- delphi android 升级,delphi android 自动升级
- 第一周礼拜四 神藉着祂的众仆人行事(上)
- 用例执行一半总是报错“An unknown server-side error occurred ...Original error: Error: socket hang up”
- PE工具制作(大白菜+U盘启动模式)+系统重装
- 网络优化——注册表语句分析
- 深度学习入门(六)——softmax函数的改良