美文网首页
android OMX相关4:编码输入线程和输出线程

android OMX相关4:编码输入线程和输出线程

作者: 土贝口小土孩 | 来源:发表于2020-03-14 20:15 被阅读0次

提交数据:

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

    提交数据: 输入线程: 输出线程:

  • 笔记:Android线程和线程池

    Android线程和线程池 Android中的线程操作相关的类有 AsyncTask IntentService ...

  • 多线程2

    线程之间的通信:---打印机 分析:两个线程:输入线程和输出线程两个任务:输入任务和输出任务一个数据:要被两个线程...

  • Android线程

    Android线程概述 线程分为主线程和子线程,主线程主要处理和界面相关的事情,子线程则往往用于处理耗时操作。线程...

  • Android多线程

    Android 多线程 本篇博客将涉及以下内容: 多线程概述 Thread类和Runnable接口 线程相关(线程...

  • Android下多线程的实现

    Android下多线程相关 线程安全相关问题参考:java内存模型与线程 android下与多线程有关的主要有以下...

  • 一个多线程题目的讨论

    题目:使用四个线程实现输出ABCD,其中线程1输出A,线程2输出B,线程3输出C,线程4输出D,且要求线程1控制所...

  • Android 多线程(一)

    简介 1. 线程分类 主线程(UI线程) : 处理和界面相关的事情. 子线程 : 处理耗时操作. Android中...

  • Android的线程和线程池

    Android中线程分为主线程和子线程,主线程主要处理和界面相关的事情,子线程则往往用于执行耗时操作。 1.1、A...

  • (十一)Android的线程和线程池

    11.1 主线程和子线程 Android主线程(UI线程)主要处理和界面相关得事情。主要运行四大组件以及处理它们和...

网友评论

      本文标题:android OMX相关4:编码输入线程和输出线程

      本文链接:https://www.haomeiwen.com/subject/xcinshtx.html