77范文网 - 专业文章范例文档资料分享平台

Android Camera HAL3中拍照Capture模式下多模块间的交互与帧Resu

来源:网络收集 时间:2018-12-09 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

Android Camera HAL3中拍照Capture模式下多模块间的交互与帧Result与帧数据回调

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢。

欢迎和大家交流。qq:1037701636 email:gzzaigcn2009@163.com Software:系统源码Android5.1

前沿:

之前的两篇博文算是比较详细的记录了整个Camera3 HAL3架构下完全不同于HAL1的preview预览处理过程,包括主要涉及到的控制流和视频流等。比较详细的阐述了Camera2Client下streamProcessor、CallbackProcessor、

CaptureSequencer等模块在Camera3架构下的功能。分析得出每个模块下均会在Camera3Device下以一个Stream的形式存在,而每个stream又是由多个

buffer来构成主体的。与HAL3进行数据的交互时,以Request和result来作为数据传输的载体。在这些基础上本文将描述具体拍照Capture模式下的数据流和控制流,主要会涉及到jpegprocessor、CaptureSequencer这几个模块的工作原理。鉴于Capture模式下的数据流更复杂,在这里重点会分析数据流result回传时,每个模块的响应以及处理过程,填补前一博文的空白。

1. HAL3中Camera2Client下的take picture的入口函数

作为标准的capture picture功能的入口,主要完成了以下两件事情: updateProcessorStream(mJpegProcessor, l.mParameters); mCaptureSequencer->startCapture(msgType)

对于JpegProcessor模块而言,他的stream流第一次是在preview阶段进行了create与初始化,这里之所以再次调用JpegProcessor::updateStream目的是参考原先JpegProcessor stream的width与height是否变化即是否照片要求的分辨率发生了变化,如果是的话就需要delete原先的stream,重新建立一个stream。 在JpegProcessor中重点关注CpuConsumer与Surface的生产者与消费者处理模式,官方称之为Create CPU buffer queue endpoint。

2. CaptureSequencer模块

CaptureSequencer模块是take picture下操作的重点,在Camera2Client中进行了创建,首先来看CaptureSequencer线程的threadLoop函数: [cpp] view plaincopy

1. bool CaptureSequencer::threadLoop() { 2. 3. sp client = mClient.promote(); 4. if (client == 0) return false; 1

5. 6. CaptureState currentState; 7. { 8. Mutex::Autolock l(mStateMutex); 9. currentState = mCaptureState; 10. } 11. 12. currentState = (this->*kStateManagers[currentState])(client); 13. 14. Mutex::Autolock l(mStateMutex); 15. if (currentState != mCaptureState) { 16. if (mCaptureState != IDLE) { 17. ATRACE_ASYNC_END(kStateNames[mCaptureState], mStateTransitionCount); 18. } 19. mCaptureState = currentState;//保留新的状态 20. mStateTransitionCount++; 21. if (mCaptureState != IDLE) { 22. ATRACE_ASYNC_BEGIN(kStateNames[mCaptureState], mStateTransitionCount); 23. } 24. ALOGV(\, 25. client->getCameraId(), kStateNames[mCaptureState]); 26. mStateChanged.signal(); 27. } 28. 29. if (mCaptureState == ERROR) { 30. ALOGE(%ue to error\, 31. client->getCameraId()); 32. return false; 33. } 34. 35. return true; 36. } CaptureSequencer是一个以不同的state状态机来循环工作的模块, currentState = (this->*kStateManagers[currentState])(client)函数是执行对应状态机下的执行函数,其中的state值如下: [cpp] view plaincopy

1. const CaptureSequencer::StateManager 2

2. CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = { 3. &CaptureSequencer::manageIdle, 4. &CaptureSequencer::manageStart, 5. &CaptureSequencer::manageZslStart, 6. &CaptureSequencer::manageZslWaiting, 7. &CaptureSequencer::manageZslReprocessing, 8. &CaptureSequencer::manageStandardStart, 9. &CaptureSequencer::manageStandardPrecaptureWait, 10. &CaptureSequencer::manageStandardCapture, 11. &CaptureSequencer::manageStandardCaptureWait, 12. &CaptureSequencer::manageBurstCaptureStart, 13. &CaptureSequencer::manageBurstCaptureWait, 14. &CaptureSequencer::manageDone, 15. }; 我们以一个standard capture的操作模式,来分析一次完成的take picture的过程。初始化的 mCaptureState(IDLE),进入的函数入口为manageIdle: [cpp] view plaincopy

1. CaptureSequencer::CaptureState CaptureSequencer::manageIdle( 2. sp &/*client*/) { 3. status_t res; 4. Mutex::Autolock l(mInputMutex); 5. while (!mStartCapture) { 6. res = mStartCaptureSignal.waitRelative(mInputMutex, 7. kWaitDuration); 8. if (res == TIMED_OUT) break; 9. } 10. if (mStartCapture) { 11. mStartCapture = false; 12. mBusy = true; 13. return START; 14. } 15. return IDLE; 16. } 函数主要在轮训mStartCapture的值,这个值是由CameraService端的拍照触发线程来启动的,代码如下: [cpp] view plaincopy

1. status_t CaptureSequencer::startCapture(int msgType) { 3

2. ALOGV(\, __FUNCTION__); 3. ATRACE_CALL(); 4. Mutex::Autolock l(mInputMutex); 5. if (mBusy) { 6. ALOGE(\, __FUNCTION__); 7. return INVALID_OPERATION; 8. } 9. if (!mStartCapture) { 10. mMsgType = msgType; 11. mStartCapture = true; 12. mStartCaptureSignal.signal();//启动CaptureSequencer 13. } 14. return OK; 15. } 对比CaptureSequencer Threadloop线程中,在阻塞式的等待mStartCapture = true,并在修改完mStartCapture 后向Threadloop发出signal。Threadloop线程被唤醒后,执行返回一个新的状态机mCaptureState = START:

2.1 START状态机

主要调用了updateCaptureRequest(l.mParameters, client)函数: [cpp] view plaincopy

1. status_t CaptureSequencer::updateCaptureRequest(const Parameters ?ms, 2. sp &client) { 3. ATRACE_CALL(); 4. status_t res; 5. if (mCaptureRequest.entryCount() == 0) { 6. res = client->getCameraDevice()->createDefaultRequest( 7. CAMERA2_TEMPLATE_STILL_CAPTURE, 8. &mCaptureRequest); 9. if (res != OK) { 10. ALOGE(\ault still image request:\ 11. \, __FUNCTION__, client->getCameraId(), 12. strerror(-res), res); 13. return res; 14. } 15. } 4

16. 17. res = params.updateRequest(&mCaptureRequest); 18. if (res != OK) { 19. ALOGE(\entries of capture \ 20. \, __FUNCTION__, client->getCameraId(), 21. strerror(-res), res); 22. return res; 23. } 24. 25. res = params.updateRequestJpeg(&mCaptureRequest);//更新JPEG需要的参数 26. if (res != OK) { 27. ALOGE(\tries of capture \ 28. \, __FUNCTION__, client->getCameraId(), 29. strerror(-res), res); 30. return res; 31. } 32. 33. return OK; 34. } 该函数和preview模式下的updatePreviewRequest很类似,这里首先检查mCaptureRequest是否是一个空的CameraMetadata,如果为空则由

createDefaultRequest来请求HAL3来创建一个Request,其中相应的类型为CAMERA2_TEMPLATE_STILL_CAPTURE。随后分别是使用当前模式下的配置参数来更新CameraMetadata mCaptureRequest中不同tag的参数值,便于传递给HAL3,这个过程是类似与以前Camera1中直接的setParamters操作string的过程。

2.2 STANDARD_START状态manageStandardCapture 该状态是启动整个take picture的重点所在: [cpp] view plaincopy

1. CaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture( 2. sp &client) { 3. status_t res; 4. ATRACE_CALL(); 5. SharedParameters::Lock l(client->getParameters()); 5

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Android Camera HAL3中拍照Capture模式下多模块间的交互与帧Resu在线全文阅读。

Android Camera HAL3中拍照Capture模式下多模块间的交互与帧Resu.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/354976.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: