引言
上一节分析了Camera2 Hal3的初始化过程。这一节来分析写预览过程,预览过程我将以Camera2Client::startPreview为入口分析这个过程。
时序图
类图
创建流,启动流
startPreview过程会先调用mStreamingProcessor->updatePreviewStream来创建Camera3OutputStream
status_t Camera2Client::startPreview() {
...
SharedParameters::Lock l(mParameters);
//上一节的分析我们知道了l.mParameters.initialize实际上就是调用Parameters::initialize,只不过给它加了一把Mutex而已
//所以这里l.mParameters的调用也是返回Parameters对象,同时给它加了一把Mutex锁
return startPreviewL(l.mParameters, false);
}
status_t Camera2Client::startPreviewL(Parameters ¶ms, bool restart) {
...
res = mStreamingProcessor->updatePreviewStream(params);
....
}
status_t StreamingProcessor::updatePreviewStream(const Parameters ¶ms) {
sp<CameraDeviceBase> device = mDevice.promote();//上一节的分析我们知道了mDevice就是指向Camera3Device
if (mPreviewStreamId == NO_STREAM) {
res = device->createStream(mPreviewWindow,
params.previewWidth, params.previewHeight,
CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, &mPreviewStreamId);
}
}
status_t Camera3Device::createStream(sp<ANativeWindow> consumer,
uint32_t width, uint32_t height, int format, int *id) {
newStream = new Camera3OutputStream(mNextStreamId, consumer,width, height, format);
mOutputStreams.add(mNextStreamId, newStream);
}
Camera3OutputStream::Camera3OutputStream(int id, sp<ANativeWindow> consumer,uint32_t width, uint32_t height, int format) :
Camera3IOStreamBase(id, CAMERA3_STREAM_OUTPUT, width, height, /*maxSize*/0, format),
mConsumer(consumer),
mTransform(0),
mTraceFirstBuffer(true) {
......
}
在创建Camera3OutputStream的过程中有一个变量要注意一下mPreviewWindow,来看看mPreviewWindow是什么东西。
在初始化camera的时候会调用Camera2Client::setPreviewTarget把绘图相关接口IGraphicBufferProducer传递过来,创建Surface,我们知道Surface相当于一块画布,不同画布的绘图最终会通过SurfaceFlinger去指导合成,最后输出在屏幕上面。
status_t Camera2Client::setPreviewTarget( const sp<IGraphicBufferProducer>& bufferProducer) {
sp<IBinder> binder;
sp<ANativeWindow> window;
if (bufferProducer != 0) {
binder = bufferProducer->asBinder();
// Using controlledByApp flag to ensure that the buffer queue remains in
// async mode for the old camera API, where many applications depend
// on that behavior.
window = new Surface(bufferProducer, /*controlledByApp*/ true);
}
return setPreviewWindowL(binder, window);
}
status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,sp<ANativeWindow> window) {
...
res = mStreamingProcessor->setPreviewWindow(window);
}
status_t StreamingProcessor::setPreviewWindow(sp<ANativeWindow> window) {
...
mPreviewWindow = window;
}
可以看出mPreviewWindow就是相当于刚才创建的Surface。
继续分析startPreviewL
status_t Camera2Client::startPreviewL(Parameters ¶ms, bool restart) {
...
res = mStreamingProcessor-