Android Camera2 Hal3(二)startPreview预览过程

引言

上一节分析了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 &params, bool restart) {
   
	...
	res = mStreamingProcessor->updatePreviewStream(params);
	....
}
status_t StreamingProcessor::updatePreviewStream(const Parameters &params) {
   
	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 &params, bool restart) {
   
	...
	res = mStreamingProcessor-
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值