提交数据:

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:编码输入线程和输出线程相关推荐

  1. Android高德地图的使用,狠详细!手把手!(地图+定位+逆地理编码+输入提示+Poi搜索)

    最近项目用到高德地图,因此来写一篇文章理一下高德的使用步骤方法,希望对大家有用! ##1.注册+配置 废话不多说,要使用高德地图首先要去高德开放平台注册成为开发者(http://lbs.amap.co ...

  2. Android 音视频开发相关知识

    音视频开发技能 要在Android上进行音视频开发,需要掌握以下技能: Android开发:首先,您需要掌握Android应用程序的基本开发技能,包括Java或Kotlin编程语言,Android S ...

  3. 【Android 安装包优化】WebP 应用 ( Android 中使用 libwebp.so 库编码 WebP 图片 )

    文章目录 一.Android 中使用 libwebp.so 库编码 WebP 图片 二.完整代码示例 三.参考资料 一.Android 中使用 libwebp.so 库编码 WebP 图片 libwe ...

  4. 模拟滑动android无障碍,Android无障碍简单开发-模拟滑动点击输入等

    似乎除了input type=password的edit text 其他所有的UI都可以进行操作.直接开始. 首先配置环境. 创建一个service 清单中代码如下,就算用AS直接创建,也需要配置一些 ...

  5. android – 多屏幕适配相关

    android – 多屏幕适配相关 作者: 曲天日期: 2011/10/27 1.基本概念 屏幕大小(screen size) – 屏幕的实际大小,用屏幕对角线长度来衡量(比如3.4寸,3.8寸).a ...

  6. Android实战场景 - 限制EditText仅支持输入数字、英文、汉字,禁止输入表情等特殊符号

    因项目需求,需要禁止用户输入表情符号,具体如下 ~ EditText相关Blog TextView.EditText属性大全 监听 EditText 文本变化 设置 EditText 光标颜色与下划线 ...

  7. 英语流利说 Android 音视频处理相关实践与优化

    前言: 移动互联网的火爆改变了人们一系列的生活方式,从社交.购物.教育等方方面面渗透进大众的生活,移动端的迅速崛起和高速发展离不开移动端背后的技术演进和迭代,产品更新迭代过程中如何优化它的性能?实际实 ...

  8. Android P应用适配相关指南

    Android P应用适配相关指南 文章目录 Android P应用适配相关指南 一 Android P适配指导 二 刘海屏适配指导 三 Crypto JCA 提供程序已被移除,弃用 Bouncy C ...

  9. softAP配网:用Android手机为linux无屏设备输入wifi密码

    softAP配网,即利用设备的无线芯片,将设备进入到softAP模式,开启一个无线局域网,手机(或其它移动设备)通过连入设备开启的无线局域网后,向设备发送路由器的ssid及password等信息,让设 ...

最新文章

  1. 深度学习多变量时间序列预测:Bi-LSTM算法构建时间序列多变量模型预测交通流量+代码实战
  2. 自己动手写一个印钞机 第四章
  3. python程序设计狄光智_Python程序设计
  4. emiya-canvas.js 解决ios下拍照倾斜与canvas高清屏下绘图模糊问题 1
  5. 【POJ】【2975】Nim
  6. Serverless 工程实践 | 自建 Apache OpenWhisk 平台
  7. java 学生成绩排序
  8. java自学 day8
  9. 【OpenCV 例程200篇】36. 直角坐标与极坐标的转换
  10. 罗永浩抖音直播带货100天,糊了?
  11. Laravel框架简介与环境搭建
  12. 关于SiamRPN代码的一些要点
  13. 云科技网络验证源码_酸酸云科技-网络验证界面版注册机注入工具 V3.2
  14. linux 进程带宽限制,Linux限制网络带宽的占用
  15. delphi android 升级,delphi android 自动升级
  16. 第一周礼拜四 神藉着祂的众仆人行事(上)
  17. 用例执行一半总是报错“An unknown server-side error occurred ...Original error: Error: socket hang up”
  18. PE工具制作(大白菜+U盘启动模式)+系统重装
  19. 网络优化——注册表语句分析
  20. 深度学习入门(六)——softmax函数的改良

热门文章

  1. 思科路由器DHCP基础配置
  2. 深入了解Oracle前滚恢复rolling forward(一)
  3. 支持比特币支付的商家中有90%接受了BCH
  4. 比特币现金(BCH)是5月的货币之王
  5. netfilter的笔记3--那些内置的表
  6. CentOS_7 MongoDb安装使用
  7. 大尺寸3D打印机:不再是“围城”!工业级3D打印的瞬发时代已来!
  8. mongodb自动关闭:页面太小,无法完成操作
  9. package extends 解析
  10. 解决app频繁更新方案