Android系统中视频电话中camera部分数据流分析

本文深入探讨了Android系统在视频电话中camera部分的数据流处理,包括回调函数传递、数据buffer分配、视频录制调用和Preview数据显示。在回调函数传递中,详细解释了如何将客户端的回调函数注册到HAL层。数据buffer在启动preview和record时的管理,以及通过Overlay和Surface显示Preview数据的过程。
摘要由CSDN通过智能技术生成

最近在研究如何移植Androidcamera系统,对camera的应用场景做了一些分析。Camera一般用于图像浏览、拍照和视频录制。图像浏览和拍照的数据流是比较清晰的,这里就不做赘述了。视频录制应用于视频电话中。拨打视频电话时,既可以看见对方的图像,又可以看见自己的图像;当然,对方也是如此。从camera获取的图像数据,既需要在本地浏览,还需要video encoder编码后传输到对方手机。这样的场景中,图像数据要同时做previewrecord两种操作。

一、回调函数传递

首先需要将客户端的回调函数传递到底层,当底层获取完图像数据后,回调该函数,通知上层,做相应的处理。

AndroidCameraInput作为客户端,它有两个成员,分别为:

sp<android::Camera> mCamera;

sp<AndroidCameraInputListener> mListener;

AndroidCameraInput就可以通过mCamera访问camera系统的对外接口。

AndroidCameraInputListener继承于类CameraListener,它有三个成员函数,分别为:

virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2){}

virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr);

virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);

这里需要说明的是postDataTimestamp(),它是客户端实现的回调函数,其定义为:

void AndroidCameraInputListener:: postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr){}

camera HAL层捕获到一帧数据后,就会调用该回调函数,告诉客户端。客户端在这个回调函数里先判断参数msgType是不是CAMERA_MSG_VIDEO_FRAME,如果是,即表示要对该帧数据进行编码处理,编码结束后会调用mCamera的函数releaseRecordingFrame(),其对应的HAL层的定义为:

void QualcommCameraHardware::releaseRecordingFrame(const sp<IMemory>& mem_attibute_((unused))){}

在这个函数里,会调用函数LINK_camera_release_frame()告诉camera硬件,存放当前帧的buffer可以被释放,用于下一帧使用。

回调函数postDataTimestamp()如何注册到HAL层,这里需要详细说明。

在客户端中,是通过mCamerasetListener()函数将mListener注册到mCamera中的,既将几个回调函数注册给mCamera

mCamera->setListener(mListener);

mCamera继承于类BnCameraClient,而BnCameraClient继承于类ICameraClient。类ICameraClient有纯虚函数:

virtual void dataCallbackTimstamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& data) = 0;

Camera中定义了虚函数dataCallbackTimstamp()并做了实现:

virtual void dataCallbackTimstamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& data)

dataCallbackTimstamp()实现中,调用了类Camera的成员mListener的成员函数postDataTimestamp()

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值