Camera API2基础流程_createCaptureSession流程

一、前言

        createCaptureSession就是Camera配流的过程,一般配置的是outputConfigurations,output是相对于Camera hal来说。配流可以配置不同的流类型,主要包括预览流、拍照流、录像流等,不同的流配置不同的surface类型,surface就是承载流的buffer的容器。预览流的surface一般是使用surfaceview或者TextureView构造的surface;拍照流使用imageReader创建的surface;录像使用mediaRecorder创建的surface。

二、createCaptureSession流程分解       

 图 2.1 createCaptureSession

2.1 CameraDeviceImpl

        path:xref: /frameworks/base/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java

        CameraDeviceImpl是Camera API2的接口类。

        相关流程createCaptureSession

                              createCaptureSessionInternal

                                   configureStreamsChecked     

                                            mRemoteDevice.createStream

        createCaptureSession

552      @Override
553      public void createCaptureSession(List<Surface> outputs,
554              CameraCaptureSession.StateCallback callback, Handler handler)
555              throws CameraAccessException {
             //定义OutputConfiguration
556          List<OutputConfiguration> outConfigurations = new ArrayList<>(outputs.size());
             //将app配置的surface添加到OutputConfiguration
557          for (Surface surface : outputs) {
558              outConfigurations.add(new OutputConfiguration(surface));
559          }
             //调用createCaptureSessionInternal
560          createCaptureSessionInternal(null, outConfigurations, callback,
561                  checkAndWrapHandler(handler), /*operatingMode*/ICameraDeviceUser.NORMAL_MODE,
562                  /*sessionParams*/ null);
563      }

         createCaptureSessionInternal

682      private void createCaptureSessionInternal(InputConfiguration inputConfig,
683              List<OutputConfiguration> outputConfigurations,
684              CameraCaptureSession.StateCallback callback, Executor executor,
685              int operatingMode, CaptureRequest sessionParams) throws CameraAccessException {
686          long createSessionStartTime = SystemClock.uptimeMillis();
                 ......
721              try {
722                  // configure streams and then block until IDLE
723                  configureSuccess = configureStreamsChecked(inputConfig, outputConfigurations,
724                          operatingMode, sessionParams, createSessionStartTime);

        configureStreamsChecked 

432      public boolean configureStreamsChecked(InputConfiguration inputConfig,
433              List<OutputConfiguration> outputs, int operatingMode, CaptureRequest sessionParams,
434              long createSessionStartTime)
435                      throws CameraAccessException {

             ......
                 //配流前停预览
472              stopRepeating();
473  
474              try {
475                  waitUntilIdle();
476                  //开始配流标志,mRemoteDevice是ICameraDeviceUserWrapper
477                  mRemoteDevice.beginConfigure();
478  
                     ......
497                  // Delete all streams first (to free up HW resources)
498                  for (Integer streamId : deleteList) {
                         //配流前先deleteStream
499                      mRemoteDevice.deleteStream(streamId);
500                      mConfiguredOutputs.delete(streamId);
501                  }
502  
503                  // Add all new streams
504                  for (OutputConfiguration outConfig : outputs) {
505                      if (addSet.contains(outConfig)) {
                             //配置surface列表
506                          int streamId = mRemoteDevice.createStream(outConfig);
507                          mConfiguredOutputs.put(streamId, outConfig);
508                      }
509                  }
510  
511                  int offlineStreamIds[];
                     //endConfigure
512                  if (sessionParams != null) {
513                      offlineStreamIds = mRemoteDevice.endConfigure(operatingMode,
514                              sessionParams.getNativeCopy(), createSessionStartTime);
515                  } else {
516                      offlineStreamIds = mRemoteDevice.endConfigure(operatingMode, null,
517                              createSessionStartTime);
518                  }
                     ......
548  
549          return success;
550      }

        这里的mRemoteDevice = new IC

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值