Camera2中拍照完成之后,如何实现获取数据呢?答案就是使用ImageReader间接实现,首先创建一个ImageReader,并监听它的事件
private void setupImageReader() {
//2代表ImageReader中最多可以获取两帧图像流
mImageReader = ImageReader.newInstance(mCaptureSize.getWidth(), mCaptureSize.getHeight(),
ImageFormat.JPEG, 2);
//拍照数据准备好之后会回调该函数保存图片数据
mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
//执行图像保存子线程
mCameraHandler.post(new imageSaver(reader.acquireNextImage()));
}
}, mCameraHandler);
}
返回结果阶段
Capture,preview以及autoFocus都是使用的这个回调,而Capture调用的时候,其RequestTag为CAPTURE,
而autoFocus的时候为TAP_TO_FOCUS,而preview请求时没有对RequestTag进行设置,所以回调到onCaptureStarted方法时,
不需要进行处理,但是到此时,preview已经启动成功,可以进行预览了,其数据都在buffer里。
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/device/3.x/app/AppStreamMgr.CallbackHandler.cpp
threadLoop(){
if ( ! waitUntilQueue1NotEmpty() ) {
return true;
}
mQueue2.splice(mQueue2.end(), mQueue1);
mQueue1Cond.broadcast();
performCallback();
return true;
}
performCallback(){
{
for (auto const& cbParcel : mQueue2) {
convertShutterToHidl(cbParcel, vNotifyMsg);
convertErrorToHidl(cbParcel, vErrorMsg);
convertMetaToHidl(cbParcel, vCaptureResult, vTempMetadataResult);
convertImageToHidl(cbParcel, vBufferResult);
}
if ( auto pResultMetadataQueue = mResultMetadataQueue ) {
for (auto& item : vCaptureResult) {
if ( item.v3_2.result.size() == 0 ) {
continue;
}
if ( pResultMetadataQueue->availableToWrite() > 0 ) {
if ( CC_LIKELY(pResultMetadataQueue->write(item.v3_2.result.data(), item.v3_2.result.size())) ) {
item.v3_2.fmqResultSize = item.v3_2.result.size();
item.v3_2.result = hidl_vec<uint8_t>(); //resize(0)
}
else {
item.v3_2.fmqResultSize = 0;
}
}
}
}
// send callbacks
{
if ( ! vNotifyMsg.empty() ) {
hidl_vec<NotifyMsg> vecNotifyMsg;
&