收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
通过上述代码分析发现API1+HAL3
对用的client是Camera2Client
其类图如下:
从上边看Camera2Client
继承实现了ICamera
定义的camera API1接口,但是其内部的成员变量mDevice是`Camera3Device 类型,其是针对HAL3设计的,其类的备注如下:
/\*\*
\* CameraDevice for HAL devices with version CAMERA\_DEVICE\_API\_VERSION\_3\_0 or higher.
\*/
class Camera3Device :
public CameraDeviceBase,
virtual public hardware::camera::device::V3_2::ICameraDeviceCallback,
private camera3_callback_ops
Camera3Device
类图如下:
Camera3Device
内部类HalInterface
中的sp<hardware::camera::device::V3_2::ICameraDeviceSession>mHidlSession
成员变量,是在opencamera是获取的对象,之后所有的constructDefaultRequestSettings,configureStreams
等操作,都是通过该对象与HAL3进行通信完成的。
下边给出ICameraDeviceSession类图:
该类是定义在hardware\interfaces\camera\device
中,是cameraservice与cameraprovider通信的接口。
下边分析 openCamera具体流程
从流程图上看,opencamera主要完成了两件事:
- makeclient 创建camera2client对象及Camera3Device对象
- 初始化camera2client,真正完成打开相机的地方
从上述过程看,Camera2Client
实现的是Camera API1
的接口,在opencamera时,通过Camera3Device中的BpHwCameraDevice类型对象deviceInfo3->mInterface的open方法完成与HAL3通信来打开相机,并该方法返回结果为ICameraDeviceSession类型对象session,表示相机成功打开,之后所有的相机相关操作全是通过该对象完成。
2. startpreview
startPreview时序图如下:
从上述时序图看,startpreive过程主要有两个过程,
- configureStreams
- 将request插入到mRepeatingRequests队列中,并启动RequestThread,向HAL层不断发送processCaptureRequest申请
3. takepicture
开启相机后会启动一个拍照处理线程mCaptureSequencer
:
template<typename TProviderPtr>
status_t Camera2Client::initializeImpl(TProviderPtr providerPtr)
{
ATRACE\_CALL();
ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
status_t res;
res = Camera2ClientBase::initialize(providerPtr);
...
#ifdef USE_QTI_CAMERA2CLIENT
mQTICamera2Client = new QTICamera2Client(this);
#endif
mStreamingProcessor <span class="token operator">=</span> new <span class="token function">StreamingProcessor</span><span class="token punctuation">(</span>this<span class="token punctuation">)</span><span class="token punctuation">;</span>
threadName <span class="token operator">=</span> String8<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"C2-%d-StreamProc"</span><span class="token punctuation">,</span>
mCameraId<span class="token punctuation">)</span><span class="token punctuation">;</span>
mFrameProcessor <span class="token operator">=</span> new <span class="token function">FrameProcessor</span><span class="token punctuation">(</span>mDevice<span class="token punctuation">,</span> this<span class="token punctuation">)</span><span class="token punctuation">;</span>
threadName <span class="token operator">=</span> String8<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"C2-%d-FrameProc"</span><span class="token punctuation">,</span>
mCameraId<span class="token punctuation">)</span><span class="token punctuation">;</span>
mFrameProcessor<span class="token operator">-></span><span class="token function">run</span><span class="token punctuation">(</span>threadName<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//创建拍照处理线程并启动</span>
mCaptureSequencer <span class="token operator">=</span> new <span class="token function">CaptureSequencer</span><span class="token punctuation">(</span>this<span class="token punctuation">)</span><span class="token punctuation">;</span>
threadName <span class="token operator">=</span> String8<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"C2-%d-CaptureSeq"</span><span class="token punctuation">,</span>
mCameraId<span class="token punctuation">)</span><span class="token punctuation">;</span>
mCaptureSequencer<span class="token operator">-></span><span class="token function">run</span><span class="token punctuation">(</span>threadName<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
mJpegProcessor <span class="token operator">=</span> new <span class="token function">JpegProcessor</span><span class="token punctuation">(</span>this<span class="token punctuation">,</span> mCaptureSequencer<span class="token punctuation">)</span><span class="token punctuation">;</span>
threadName <span class="token operator">=</span> String8<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"C2-%d-JpegProc"</span><span class="token punctuation">,</span>
mCameraId<span class="token punctuation">)</span><span class="token punctuation">;</span>
mJpegProcessor<span class="token operator">-></span><span class="token function">run</span><span class="token punctuation">(</span>threadName<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
#ifdef USE_QTI_CAMERA2CLIENT
mRawProcessor = new RawProcessor(this, mCaptureSequencer);
threadName = String8::format(“C2-%d-RawProc”,
mCameraId);
mRawProcessor->run(threadName.string());
#endif
mZslProcessor <span class="token operator">=</span> new <span class="token function">ZslProcessor</span><span class="token punctuation">(</span>this<span class="token punctuation">,</span> mCaptureSequencer<span class="token punctuation">)</span><span class="token punctuation">;</span>
threadName <span class="token operator">=</span> String8<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"C2-%d-ZslProc"</span><span class="token punctuation">,</span>
mCameraId<span class="token punctuation">)</span><span class="token punctuation">;</span>
mZslProcessor<span class="token operator">-></span><span class="token function">run</span><span class="token punctuation">(</span>threadName<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
mCallbackProcessor <span class="token operator">=</span> new <span class="token function">CallbackProcessor</span><span class="token punctuation">(</span>this<span class="token punctuation">)</span><span class="token punctuation">;</span>
threadName <span class="token operator">=</span> String8<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"C2-%d-CallbkProc"</span><span class="token punctuation">,</span>
mCameraId<span class="token punctuation">)</span><span class="token punctuation">;</span>
mCallbackProcessor<span class="token operator">-></span><span class="token function">run</span><span class="token punctuation">(</span>threadName<span class="token punctuation">.</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token keyword">return</span> OK<span class="token punctuation">;</span>
}
线程中包含有一个状态机,不断检测是否有拍照命令下发,
状态机状态定义如下:
enum CaptureState {
IDLE,
START,
ZSL_START,
ZSL_WAITING,
ZSL_REPROCESSING,
STANDARD_START,
STANDARD_PRECAPTURE_WAIT,
STANDARD_CAPTURE,
STANDARD_CAPTURE_WAIT,
DONE,
ERROR,
NUM_CAPTURE_STATES
} mCaptureState;
对应的状态处理函数定义如下:
const CaptureSequencer::StateManager
CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = {
&CaptureSequencer::manageIdle,
&CaptureSequencer::manageStart,
&CaptureSequencer::manageZslStart,
&CaptureSequencer::manageZslWaiting,
&CaptureSequencer::manageZslReprocessing,
&CaptureSequencer::manageStandardStart,
&CaptureSequencer::manageStandardPrecaptureWait,
&CaptureSequencer::manageStandardCapture,
&CaptureSequencer::manageStandardCaptureWait,
&CaptureSequencer::manageDone,
};
在有拍照命令下发时,状态机进入下一状态START,否则一直停留在IDLE状态
bool CaptureSequencer::threadLoop() {
sp<Camera2Client> client = mClient.promote();
if (client == 0) return false;
CaptureState currentState;
{
Mutex::Autolock l(mStateMutex);
currentState = mCaptureState;
}
//状态机处理流程
currentState = (this->*kStateManagers[currentState])(client);
Mutex::Autolock l(mStateMutex);
if (currentState != mCaptureState) {
if (mCaptureState != IDLE) {
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
]
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!