Android P 分析 HAL3 JpegNode 生成图片流程

主要文件:

vendor\mediatek\proprietary\hardware\mtkcam3\pipeline\hwnode\JpegNode.cpp

 

JpegNode.cpp 部分方法:

 

分析 JpegNode 中拍照流程

JpegNode.cpp 中实现了JpegNodeImp 类的声明和定义。

创建两个线程:

  • 生成图片的线程
bool
JpegNodeImp::EncodeThread::
threadLoop()
{
    sp<IPipelineFrame> pFrame;
    if  (
            !exitPending()
        &&  OK == mpNodeImp->onDequeRequest(pFrame)
        &&  pFrame != 0
        )
    {
        mpNodeImp->mThumbDoneFlag = MTRUE;
        mpNodeImp->onProcessFrame(pFrame);
        return true;
    }
 
    MY_LOGD("exit encode thread %d", mpNodeImp->mThumbDoneFlag);
    return  false;
 
}
  • 生成微缩图的线程
bool
JpegNodeImp::EncodeThumbThread::
threadLoop()
{
    mpNodeImp->encodeThumbnail(mpNodeImp->mpEncodeFrame);
    {
        Mutex::Autolock _l(mpNodeImp->mEncodeLock);
        mpNodeImp->mThumbDoneFlag = MTRUE;
        mpNodeImp->mEncodeCond.signal();
    }
    MY_LOGD_IF(mpNodeImp->mLogLevel, "exit thumb encode thread");
    return  false;
}

 

 

onProcessFrame 分析:

阅读源码可知核心函数 onProcessFrame 

我们重点关注  onProcessFrame 生成照片的函数
MVOID JpegNodeImp::onProcessFrame(android::sp<IPipelineFrame> const& pFrame);
onProcessFrame 函数中代码太长,用文字简要描述下具体功能:
传入的参数 android::sp<IPipelineFrame> const& pFrame
1. 获取输入 mpInHalMeta
2. 获取微缩图 thumbnail
3. new encode_frame(pFrame, useThumbnail); 创建帧编码
4. 获取编码 JPEG 参数
5. 获取 HAL meta 
6. 从 HAL meta 中获取 miJpegEncType 
7. 在 exif 保存图像是否旋转
8. 使用 updateStdExifParam 函数获取标准的 JPEG exif
9. 获取 encode_frame 输出的 ImgStreamBuffer
10. 使用指针保存 mainImgBuffer 和 thumbImgBuffer
11. 调用 hardwareOps_encode 方法编码 JPEG

MERROR
JpegNodeImp::hardwareOps_encode( my_encode_params& rParams )
{
...
    ret = pSImager->setTargetImgBuffer(rParams.pDst)

        && pSImager->setTransform(rParams.transform)

        && pSImager->setCropROI(rParams.crop)

        && pSImager->setEncodeParam(
                rParams.isSOI,
                rParams.quality,
                rParams.codecType,
                false
                )
        && pSImager->execute();

    pSImager->destroyInstance();
    pSImager = NULL;
    //
    if( !ret ) {
        MY_LOGE("encode failed");
        return UNKNOWN_ERROR;
    }
...
}


12. 编码下一张JPEG 或释放资源。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值