主要文件:
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 或释放资源。