录像过程中拍照的流程 从framework到hal

本文详细介绍了在录像过程中拍照的流程,从Android应用层的VideoMode.java开始,经由Camera2CaptureSessionProxy、CameraDeviceImpl到HAL层的CameraDeviceSession.cpp,分析了拍照请求如何层层传递,最终触发hal层的process_capture_request。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 由 178903294创建, 最后修改于1月 20, 2020

在VideoMode.java中 当拍照键按下

VideoMode.java

private View.OnClickListener mVssListener = new View.OnClickListener() {

          public void onClick(View view) {

~             LogHelper.i(TAG, "[mVssListener] bjq click video state = "

                                  + mVideoState + "mCanTakePicture = " + mCanTakePicture);

              if ((getVideoState() == VideoState.STATE_PAUSED ||

                      getVideoState() == VideoState.STATE_RECORDING) && mCanTakePicture) {

                  mAppUi.animationStart(IAppUi.AnimationType.TYPE_CAPTURE, null);

                  mCameraDevice.updateGSensorOrientation(mApp.getGSensorOrientation());

                  mCameraDevice.takePicture(mJpegCallback);

                  mCanTakePicture = false;

              }

          }

      };

调用mCameraDevice.takePicture(mJpegCallback);          这里面的mJpegCallback  是处理数据回调保存的函数

VideoDevice2Controller.java

    @Override

      public void takePicture(@Nonnull JpegCallback callback) {

~         LogHelper.e(TAG, "[takePicture] bjq +");

          mJpegCallback = callback;

          CaptureRequest.Builder builder;

          try {

              builder = mCamera2Proxy.createCaptureRequest(Camera2Proxy.TEMPLATE_VIDEO_SNAPSHOT);

              configureQuickPreview(builder);

              builder.addTarget(mPreviewSurface);

              builder.addTarget(mRecordSurface);

              builder.addTarget(mCaptureSurface.getSurface());

+             builder.set(CaptureRequest.CONTROL_AE_MODE,   //加入这个自动白平衡 暗光条件下录像过程中拍照一片黑暗的问题就临时解决了

+                     CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

              int rotation = CameraUtil.getJpegRotation(Integer.parseInt(mCameraId),

                      mJpegRotation, mActivity);

              builder.set(CaptureRequest.JPEG_ORIENTATION, rotation);

              mSettingDevice2Configurator.configCaptureRequest(builder);

              mSession.capture(builder.build(), mCaptureCallback, mModeHandler);

          catch (CameraAccessException e) {

              e.printStackTrace();

          }

~         LogHelper.e(TAG, "[takePicture] bjq -");

      }

mCamera2Proxy.createCaptureRequest(Camera2Proxy.TEMPLATE_VIDEO_SNAPSHOT)   这里定义了拍照的模式:TEMPLATE_VIDEO_SNAPSHOT   视频快门模式

 

接着调用 mSession.capture(builder.build(), mCaptureCallback, mModeHandler);    注意这里传入了一个Handler 以后会用到

 

Camera2CaptureSessionProxy.java

public int capture(@Nonnull CaptureRequest request, @Nullable CaptureCallback listener,

                   @Nullable Handler handler) throws CameraAccessException {

       int[] captureNum = new int[1];

       List<CaptureRequest> requestList = new ArrayList<>();

       requestList.add(request);

       SessionOperatorInfo info = new SessionOperatorInfo(requestList, listener, handler,

                       captureNum);

       Message msg = mRequestHandler.obtainMessage(Camera2Actions.CAPTURE, info);

       mAtomAccessor.sendAtomMessageAndWait(mRequestHandler, msg);

       return captureNum[0];

   }

调用mAtomAccessor.sendAtomMessageAndWait(mRequestHandler, msg);

AtomAccessor.java

public void sendAtomMessageAtFrontOfQueue(Handler handler, Message msg) {

          if (handler == null || msg == null) {

              return;

          }

          acquireResource();

+         LogHelper.i(TAG, "bjq sendAtomMessageAtFrontOfQueue");

          handler.sendMessageAtFrontOfQueue(msg);

          releaseResource();

      }

接着调用Handler.java的sendMessageAtFrontOfQueue 加入消息队列并处理对应的handel

 

Handler.java

public final boolean sendMessageAtFrontOfQueue(Message msg) {

       MessageQueue queue = mQueue;

       if (queue == null) {

           RuntimeException e = new RuntimeException(

               this " sendMessageAtTime() called with no mQueue");

           Log.w("Looper", e.getMessage(), e);

           return false;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值